/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
 *
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
 * Other names may be trademarks of their respective owners.
 *
 * The contents of this file are subject to the terms of either the GNU General
 * Public License Version 2 only ("GPL") or the Common Development and Distribution
 * License("CDDL") (collectively, the "License"). You may not use this file except in
 * compliance with the License. You can obtain a copy of the License at
 * http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
 * License for the specific language governing permissions and limitations under the
 * License.  When distributing the software, include this License Header Notice in
 * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
 * designates this particular file as subject to the "Classpath" exception as
 * provided by Oracle in the GPL Version 2 section of the License file that
 * accompanied this code. If applicable, add the following below the License Header,
 * with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions Copyrighted [year] [name of copyright owner]"
 * 
 * Contributor(s):
 * 
 * The Original Software is NetBeans. The Initial Developer of the Original Software
 * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
 * Rights Reserved.
 * 
 * If you wish your version of this file to be governed by only the CDDL or only the
 * GPL Version 2, indicate your decision by adding "[Contributor] elects to include
 * this software in this distribution under the [CDDL or GPL Version 2] license." If
 * you do not indicate a single choice of license, a recipient has the option to
 * distribute your version of this file under either the CDDL, the GPL Version 2 or
 * to extend the choice of license to its licensees as provided above. However, if
 * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then
 * the option applies only if the new code is made subject to such option by the
 * copyright holder.
 */

var AUTOMATIC_DOWNLOAD_MESSAGE  = "La vostra desc\u00E0rrega s'iniciar\u00E0 autom\u00E0ticament. <br>Si no \u00E9s aix\u00ED, <a href='{0}' class='download_link'>descarregar-lo aqu\u00ED</a>.<br>";

var PRODUCT_NAME      = "NetBeans {0}";
var INSTALLER_MESSAGE = "Instal\u00B7lador per {0}";
var NOFILE_MESSAGE    = "Cap fitxer sol\u00B7licitat";

var NETBEANS_DOWNLOAD_STARTED_PAGE_TITLE       = "Desc\u00E0rrega del IDE NetBeans iniciada";
var NETBEANS_DOWNLOAD_STARTED_PAGE_DESCRIPTION = "Desc\u00E0rrega del IDE NetBeans iniciada";

var NETBEANS_DOWNLOAD_STARTED_HEADER = "Desc\u00E0rrega iniciada del NetBeans IDE {0}";
var RELEASE_NOTES_LABEL = "Notes de la versi\u00F3";
var INSTALL_NOTES_LABEL = "Instruccions d'instal\u00B7laci\u00F3";
var FIND_OUT_MORE_LABEL = "Descobreix m\u00E9s";
var PLUGINS_LABEL       = "Complements";
var PLUGINS_DESCRIPTION = "Contribuci\u00F3 de la comunitat NetBeans i d'altres prove\u00EFdors.";
var TUTORIALS_LABEL     = "Guies d'aprenentatge";
var TUTORIALS_DESCRIPTION = "Escrit i enregistrat per la comunitat NetBeans i professionals.";
var TRAINING_LABEL = "Formaci\u00F3";
var TRAINING_DESCRIPTION = "Cursos per a ajudar-vos a millorar les vostres habilitats.";
var SUPPORT_LABEL        = "Suport";
var SUPPORT_DESCRIPTION  = "Opcions de suport flexibles que us ajudaran a estar enfocats cap a la innovaci\u00F3.";

// $PRODUCT_NAME $TYPE (Installer for $PLATFORM/Zip)/$Language ($Language_ID) $filename ($SIZE) MD5: $MD5
var INFO_MESSAGE = "{0}{1} {2}/{3} ({4})<br>{5} ({6} MB)<br>MD5: {7}";
var INFO_MESSAGE_OTHER = "{0} ({1} MB)<br>MD5: {2}";

//DO NOT TRANSLATE
var SUBSCRIPTION_PHP_URL = "http://services.netbeans.org/sub.php";
