/*
 * 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
 * https://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 = "A transfer\u00eancia deve iniciar automaticamente.<br>Caso contr\u00e1rio, <a href=\"{0}\" class=\"download_link\">baixe ele aqui</a>.<br>";

var PRODUCT_NAME = "NetBeans {0}";
var INSTALLER_MESSAGE = "Instalador para {0}";
var NOFILE_MESSAGE = "Nenhum arquivo foi requisitado";

var NETBEANS_DOWNLOAD_STARTED_PAGE_TITLE       = "O download do NetBeans foi iniciado";
var NETBEANS_DOWNLOAD_STARTED_PAGE_DESCRIPTION = "O download do NetBeans foi iniciado";

var NETBEANS_DOWNLOAD_STARTED_HEADER = "A transfer\u00eancia do IDE NetBeans {0} foi iniciada";
var RELEASE_NOTES_LABEL = "Notas da vers\u00e3o";
var INSTALL_NOTES_LABEL = "Instru\u00e7\u00f5es de instala\u00e7\u00e3o";
var FIND_OUT_MORE_LABEL = "Localizar mais";
var PLUGINS_LABEL = "Plugins";
var PLUGINS_DESCRIPTION = "Contribui\u00e7\u00e3o da comunidade NetBeans e terceiros.";
var TUTORIALS_LABEL = "Tutorials";
var TUTORIALS_DESCRIPTION = "Escrito e gravado pela comunidade NetBeans e profissionais.";
var TRAINING_LABEL = "Treinamento";
var TRAINING_DESCRIPTION = "Cursos para ajud\u00e1-lo a melhorar suas habilidades.";
var SUPPORT_LABEL = "Suporte";
var SUPPORT_DESCRIPTION = "Op\u00e7\u00f5es de suporte flex\u00edveis para ajud\u00e1-lo a ficar focado em inova\u00e7\u00f5es.";

// $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";
