/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * 
 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
 * 
 * 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
 * https://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.  Sun
 * designates this particular file as subject to the "Classpath" exception as
 * provided by Sun 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 BUNDLED_SERVERS_GROUP_NAME = "Servidores&nbsp;embutidos";
                                              
var NETBEANS_DOWNLOAD_BUNDLES_MSG = "Distribui\u00e7\u00f5es para baixar do NetBeans IDE";
var NETBEANS_DOWNLOAD_BUNDLES_COMMUNITY_MSG = "NetBeans IDE Download Bundles in community contributed languages";
var NETBEANS_PACKS_MSG = "Tecnologias&nbsp;suportadas\n";

var JDK_DOWNLOAD_LINK = "http://java.sun.com/javase/downloads/index.jsp";
var NBJDK_DOWNLOAD_LINK = "http://java.sun.com/javase/downloads/netbeans.html";

var JAVA_COM_LINK = "http://java.com";

var JDK_NOTE_ALL = "JDK 6 ou JDK 5.0 \u00e9 necess\u00e1rio para instalar e executar o PHP, Ruby e C/C++ NetBeans embutido. Voc\u00ea pode baixar a <a href=\"{0}\">\u00faltima vers\u00e3o do Java em java.com</a>.<br><br>O JDK 6 ou JDK 5 \u00e9 necess\u00e1rio para instalar e executar o Java SE, Java e todos os componentes do Netbeans. Voc\u00ea pode baixar o <a href=\"{1}\">JDK independente</a> ou a \u00faltima vers\u00e3o do <a href=\"{2}\">JDK com o NetBeans IDE Java SE embutido</a>.<br><br>";
//var JDK_NOTE_MACOSX   = "JDK 5.0 is required for installing and running the NetBeans IDE.";
var JDK_NOTE_MACOSX = "";

var FREE_SIZE_MESSAGE = "{0}&nbsp;MB&nbsp;livre(s)";
var NOT_AVAILABLE_SIZE = "--";

var NOTE_PREFIX = "Nota:  ";
var NOTE_AND_SEP = "{0} e {1}";
var NOTE_COMMA_SEP = "{0}, {1}";

var SINGLE_NOT_AVAILABLE_ZIP = "{0} n\u00e3o est\u00e1 dispon\u00edvel em {1}";
var SINGLE_NOT_AVAILABLE_BUNDLE = "{0} n\u00e3o est\u00e1 dispon\u00edvel para {1}";
var MULTIPLE_NOT_AVAILABLE_ZIP = "{0} n\u00e3o est\u00e3o dispon\u00edveis em {1}";
var MULTIPLE_NOT_AVAILABLE_BUNDLE = "{0} n\u00e3o est\u00e3o dispon\u00edveis para {1}";

var ZIP_FILES_LIST_NAME             = "Arquivos Zip";
var MODULE_CLUSTERS_FILES_LIST_NAME = "Clusters de M\u00f3dulo";

var NOTE_SOLARIS = "Nota: Java ME est\u00e1 dispon\u00edvel apenas para Windows e Linux. <br>O  pacote UML est\u00e1 dispon\u00edvel na Central de atualiza\u00e7\u00f5es.";
var NOTE_MACOSX = "Nota: JavaME est\u00e1 dispon\u00edvel apenas para Windows e Linux. ";
var NOTE_ZIP = "Nota: GlassFish e Apache Tomcat est\u00e3o dispon\u00edveis apenas nos instaladores para plataformas espec\u00edficas. O  pacote UML est\u00e1 dispon\u00edvel na Central de atualiza\u00e7\u00f5es.";
var NOTE_OTHER = "Nota: O  pacote UML est\u00e1 dispon\u00edvel na Central de atualiza\u00e7\u00f5es.";
var NOTE_JAVAFX  = "Dispon\u00edvel somente com o <a href=\"{0}\">NetBeans&nbsp;6.5.1</a>";

var MORE_LANGUAGES    = "Mais Linguagens...";
var COMMUNITY_MESSAGE = "Download do NetBeans em outros idiomas (contribui\u00e7\u00f5es da comunidade)";
var COMMUNITY_CONTRIBUTED_SEP    = " -- Contribu\u00eddo pela Comunidade -- " ;
var SUN_SUPPORTED_SEP            = " -- Suportado pela Sun -- " ;

var NETBEANS_DOWNLOAD_PAGE_TITLE       = "Download o NetBeans IDE {0}";
var NETBEANS_DOWNLOAD_PAGE_DESCRIPTION = "Download o NetBeans IDE {0}";


var NETBEANS_DOWNLOAD_HEADER	= "Download o NetBeans IDE {0}";
var DEVELOPMENT_TITLE		= "Desenvolvimento";
var ARCHIVE_TITLE		= "Arquivo";
var PYTHON_TITLE                = "Python&nbsp;EA";
var EMAIL_LABEL			= "Endere\u00e7o&nbsp;de&nbsp;email&nbsp;(opcional):&nbsp;";
var SUBSCRIBE_LABEL		= "Inscrever-se&nbsp;na&nbsp;newsletter:";
var MONTHLY_LABEL		= "Mensal&nbsp;&nbsp;&nbsp;&nbsp;";
var WEEKLY_LABEL		= "Semanal";
var CONTACT_LABEL		= "Permito&nbsp;me&nbsp;contatar&nbsp;neste&nbsp;email";
var LANGUAGE_LABEL		= "Idioma do IDE:";
var PLATFORM_LABEL		= "Plataforma:";
var PLUGIN_MANAGER_LABEL	= "Voc\u00ea pode adicionar ou remover pacotes depois utilizando o Gerenciador de Plugins do IDE (Ferramentas | Plugins).<br><br>";
var JAVATOOLSBUNDLE_LABEL	= "Voc\u00ea tamb\u00e9m pode baixar o NetBeans IDE como parte de <a href=\"http://java.sun.com/javaee/downloads/index.jsp\">Java EE 5 Ferramentas embutidas</a> ou <a href=\"http://download.netbeans.org/netbeans/6.1/mysql_bundle/\">MySQL GlassFish Embutidos</a>.";
var SOURCE_BINARY_LABEL		= "O c\u00f3digo-fonte e os bin\u00e1rios do NetBeans sem os servidores embutidos tamb\u00e9m est\u00e3o dispon\u00edveis em <a id=\"zip_link\" href=\"{0}\">formato de arquivo zip</a>.";
var BUILD_WIKI_LABEL		= "Veja tamb\u00e9m <a href=\"http://wiki.netbeans.org/wiki/view/WorkingWithNetBeansSources\">instru\u00e7\u00f5es de como construir o IDE a partir do c\u00f3digo-fonte</a> ou <a href=\"{0}\">instru\u00e7\u00f5es de instala\u00e7\u00e3o</a>.";

var LICENSE_NOTES_LINK = "https://netbeans.org/about/legal/product-licences.html";

var ARCHIVE_BUILDS_LINK = "http://services.netbeans.org/downloads/dev.php";
var DEVELOPMENT_BUILDS_LINK = "http://bits.netbeans.org/download/trunk/nightly/latest/";
var PYTHON_LINK             = "http://download.netbeans.org/netbeans/6.5/python/ea/";

// TRANSLATE NOTE: change download*.gif to download*_<locale>.gif
var DOWNLOAD_BUTTON_NORMAL    = "download.gif";
var DOWNLOAD_BUTTON_DISABLED  = "download_d.gif";
var DOWNLOAD_BUTTON_HIGHLIGHT = "download_h.gif";

// DO NOT TRANSLATE
var START_PAGE = "start.html";
var ZIP_PAGE   = "zip.html";

var LEGAL_INFO_HEADER = "Important Legal Information:";

var CDDL_GPLV2_LINK = "https://netbeans.org/cddl-gplv2.html";
var LICENSE_DETAILS_LINK = "https://netbeans.org/about/legal/code_dependency_matrix.html";

var LEGAL_INFO_MESSAGE = "NetBeans Community Distributions are available under a Dual License consisting of the <a href=\"https://netbeans.org/cddl-gplv2.html\">Common Development and Distribution License (CDDL) v1.0 and GNU General Public License (GPL) v2</a>. Such distributions include additional components under separate licenses identified in the <a href=\"https://netbeans.org/about/legal/product-licences.html\">License file</a>. See the <a href=\"https://netbeans.org/about/legal/product-licences.html\">Third Party License</a> for external components included in NetBeans and their associated licenses.";
