/*
 * 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 AUTOMATIC_DOWNLOAD_MESSAGE  = "\u4e0b\u8f7d\u5e94\u8be5\u81ea\u52a8\u5f00\u59cb\u3002<br>\u5982\u679c\u6ca1\u6709\uff0c<a href=\"{0}\" class=\"download_link\">\u8bf7\u70b9\u51fb\u8fd9\u91cc\u4e0b\u8f7d</a>\u3002<br>";

var PRODUCT_NAME      = "NetBeans {0}";
var INSTALLER_MESSAGE = "\u7528\u4e8e {0} \u4e0a\u7684\u5b89\u88c5\u7a0b\u5e8f";
var NOFILE_MESSAGE    = "\u6ca1\u6709\u4efb\u4f55\u6587\u4ef6\u8bf7\u6c42" ;

var NETBEANS_DOWNLOAD_STARTED_PAGE_TITLE       = "NetBeans IDE \u4e0b\u8f7d\u5f00\u59cb";
var NETBEANS_DOWNLOAD_STARTED_PAGE_DESCRIPTION = "NetBeans IDE \u4e0b\u8f7d\u5f00\u59cb";

var NETBEANS_DOWNLOAD_STARTED_HEADER = "NetBeans IDE {0} \u4e0b\u8f7d\u5f00\u59cb";
var RELEASE_NOTES_LABEL = "\u53d1\u884c\u8bf4\u660e";
var INSTALL_NOTES_LABEL = "\u5b89\u88c5\u6307\u5bfc";
var FIND_OUT_MORE_LABEL = "\u4e86\u89e3\u66f4\u591a";
var PLUGINS_LABEL       = "\u63d2\u4ef6";
var PLUGINS_DESCRIPTION = "\u6765\u81ea NetBeans \u793e\u533a\u53ca\u7b2c\u4e09\u65b9\u4f9b\u5e94\u5546\u7684\u8d21\u732e\u3002";
var TUTORIALS_LABEL     = "\u6559\u7a0b";
var TUTORIALS_DESCRIPTION = "\u7531 NetBeans \u793e\u533a\u53ca\u4e13\u5bb6\u64b0\u5199\u6216\u5f55\u5236\u3002";
var TRAINING_LABEL = "\u57f9\u8bad";
var TRAINING_DESCRIPTION = "\u5e2e\u52a9\u60a8\u63d0\u9ad8\u6280\u5de7\u7684\u8bfe\u7a0b\u3002";
var SUPPORT_LABEL        = "\u652f\u6301";
var SUPPORT_DESCRIPTION  = "\u7075\u6d3b\u7684\u652f\u6301\u65b9\u6848\u9009\u62e9\u8ba9\u60a8\u80fd\u591f\u59cb\u7ec8\u4e13\u6ce8\u4e8e\u521b\u65b0\u3002";

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

