/* This file is to maintain text information that can be used on the download webpage via JavaScript when
 * including this file.
 *
 * Instead of hard coded text in the green box please use these variables and translate it to your favorite language.
 *
 * Wrong:	"Download Apache OpenOffice"
 * Correct:	l10n.index_redirect_text
 */



// Object that contains all following properties (variables).
var l10n = new Object();

// The following variables are used in the "index.html" file:

// Graphic, text and links to show inside the event box.
										// "true" = Show the box, "false" = Do not show.
l10n.index_event_box_show				= false;
										// Logo graphic.
l10n.index_event_box_graphic_src		= "https://blogs.apache.org/foundation/mediaresource/81eec8fa-2848-4405-9ce2-40c16a9f7170";
										// Alternative text for the graphic.
l10n.index_event_box_graphic_alt		= "The Apache® Software Foundation Celebrates 20 Years of Community-led Development 'The Apache Way'";
										// Make the graphic clickable with a link.
l10n.index_event_box_graphic_href		= "https://blogs.apache.org/foundation/entry/the-apache-software-foundation-celebrates1";
										// The height in pixel of the graphic. Leave empty to use the height of the original graphic.
l10n.index_event_box_graphic_height		= "175";
										// The width in pixel of the graphic. Leave empty to use the width of the original graphic.
l10n.index_event_box_graphic_width		= "375";
										// Mouse over text for the graphic.
l10n.index_event_box_graphic_title		= "";
										// Make the whole box clickable with a link.
l10n.index_event_box_text_href			= "https://blogs.apache.org/foundation/entry/the-apache-software-foundation-celebrates1";
										// Maximum 630 characters.
l10n.index_event_box_text_text			= "<b>The Apache® Software Foundation Celebrates 20 Years of Community-led Development 'The Apache Way'</b><br /><br />World's largest Open Source foundation provides $20B+ worth of software for the public good at 100% no cost; Apache software used in every Internet-connected country on the planet.<br /><br /><b>Wakefield, MA —26 March 2019— </b> The Apache Software Foundation (ASF), the all-volunteer developers, stewards, and incubators of more than 350 Open Source projects and initiatives, announced today its 20th Anniversary, celebrating 'The Apache Way' of community-driven development as the key to its success.<br /><b><i> Click here for details ...</i></b>";
										// Mouse over text for the text.
l10n.index_event_box_text_title			= "The Apache® Software Foundation Celebrates 20 Years of Community-led Development 'The Apache Way'";

// Text and link to show inside the alert box.
										// "true" = Show the box, "false" = Do not show.
l10n.index_alert_box_show				= false;
										// Make the whole box clickable with a link.
l10n.index_alert_box_href				= "https://www.google.com";
										// Maximum 49 characters.
l10n.index_alert_box_headline_text		= "Headline text with max. 49 characters";
										// Mover over text for the headline.
l10n.index_alert_box_headline_title		= "Mover over title text for the headline.";
										// Maximum 630 characters.
l10n.index_alert_box_text_text			= "Text with max. 630 characters. <br /><br /> Use this alert box to announce any important messages or problems. <br /><br /> This whole alert box can be linked with an URL to point the user to more information or to a solution. But the link can also be left out. Then the box is not clickable.";
										// Mouse over text for the text.
l10n.index_alert_box_text_title			= "Mouse over title text for the text.";

// Flag how to redirect and if text should be displayed.
// Entries for new languages have to be done in /assets/msg_prop_l10n.js + /assets/download/globalvars.js + /assets/download/languages.js
// Usage: "none" = no text shown, no redirect - "soft" = text shown, redirect by click on text - "hard" = no text shown, immediate redirect.
// All data is used in /content/index.html (see function "setRedirect()")
l10n.index_redirect_text			= [ /* hy */	"soft", "Այս կայքը հասանելի է նաև <b> Հայերեն (hy) </b> - ով. Ուղղակի կտտացրեք այս տեքստին ՝ վերահղման համար.",
										/* ast */	"none", "This site is also available in <b>Asturianu (ast)</b>. Just click this text to get redirected.",
										/* eu */	"none", "This site is also available in <b>Euskara (eu)</b>. Just click this text to get redirected.",
										/* bg */	"none", "This site is also available in <b>български език (bg)</b>. Just click this text to get redirected.",
										/* ca */	"none", "This site is also available in <b>Català (ca)</b>. Just click this text to get redirected.",
										/* ca-XV */	"none", "This site is also available in <b>Català (Valencià RACV) (ca-XV)</b>. Just click this text to get redirected.",
										/* ca-XR */	"none", "This site is also available in <b>Català (Valencià AVL) (ca-XR)</b>. Just click this text to get redirected.",
										/* zh-CN */	"none", "This site is also available in <b>简体中文 (zh-CN)</b>. Just click this text to get redirected.",
										/* zh-TW */	"none", "This site is also available in <b>正體中文 (zh-TW)</b>. Just click this text to get redirected.",
										/* cs */	"none", "This site is also available in <b>Čeština (cs)</b>. Just click this text to get redirected.",
										/* da */	"soft", "Denne side er også tilgængelig på <b>Dansk (da)</b>. Bare klik på teksten for at blive omdirigeret.",
										/* nl */	"none", "This site is also available in <b>Nederlands (nl)</b>. Just click this text to get redirected.",
										/* en-GB */	"none", "This site is also available in <b>English (en-GB)</b>. Just click this text to get redirected.",
										/* en-US */	"none", "This site is also available in <b>English (en-US)</b>. Just click this text to get redirected.",
										/* eo */	"soft", "Ĉi tiu retejo ankaŭ haveblas en <b> Esperanto (eo) </b>. Simple alklaku ĉi tiun tekston por esti redirektita.",
										/* et */	"soft", "See lehekülg on saadaval ka <b>eesti keeles (et)</b>. Lihtsalt kliki sellel tekstil ja sind suunatakse ümber.",
										/* fi */	"soft", "Sivusto on saatavilla myös <b>suomeksi (fi)</b>. Napauta tästä suomenkieliseen versioon.",
										/* fr */	"none", "This site is also available in <b>Français (fr)</b>. Just click this text to get redirected.",
										/* gl */	"none", "This site is also available in <b>Galego (gl)</b>. Just click this text to get redirected.",
										/* de */	"soft", "Diese Webseite gibt es auch in <b>Deutsch (de)</b>. Einfach auf diesen Text klicken, um weitergeleitet zu werden.",
										/* el */	"none", "This site is also available in <b>ελληνικά (el)</b>. Just click this text to get redirected.",
										/* he */	"soft", "This site is also available in <b>עברית (he)</b>. Just click this text to get redirected.",
										/* hi */	"none", "This site is also available in <b>हिन्दी (hi)</b>. Just click this text to get redirected.",
										/* hu */	"none", "This site is also available in <b>Magyar (hu)</b>. Just click this text to get redirected.",
										/* it */	"soft", "Questo sito è disponibile anche in <b>Italiano (it)</b>. Fare clic qui per visualizzare la versione italiana.",
										/* ja */	"none", "This site is also available in <b>日本語 (ja)</b>. Just click this text to get redirected.",
										/* km */	"none", "This site is also available in <b>ភាសាខ្មែរ (km)</b>. Just click this text to get redirected.",
										/* ko */	"soft", "이 웹사이트는 <b>한국어(ko)</b>로도 이용할 수 있습니다. 여기를 클릭하면 한국어 웹사이트로 이동합니다.",
										/* lt */	"hard", "Spustelėjus laukelį, tinklalapį galima skaityti <b>lietuviškai (lt)</b>.",
										/* no */	"soft", "Dette nettstedet er også tilgjengelig på <b>norsk (no)</b>. Klikk denne teksten for å bli videresendt.",
										/* om */	"none", "This site is also available in <b>Oromo (om)</b>. Just click this text to get redirected.",
										/* pl */	"soft", "Ta strona jest dostępna po <b>Polsku (pl)</b>. Po prostu kliknij ten tekst aby tam przejść.",
										/* pt-BR */	"none", "Este site também está disponível em <b>Português [do Brasil] (pt-BR)</b>. Clique neste texto para ser redirecionado.",
										/* pt */	"soft", "Este site também está disponível em <b>Português [Europeu] (pt)</b>. Clique neste texto para ser redirecionado.",
										/* ro */	"soft", "Acest site este disponibil și în <b> Română (ro) </b>. Doar faceți clic pe acest text pentru a fi redirecționat.",
										/* ru */	"none", "This site is also available in <b>Русский (ru)</b>. Just click this text to get redirected.",
										/* gd */	"none", "This site is also available in <b>Gàidhlig (gd)</b>. Just click this text to get redirected.",
										/* sr */	"none", "This site is also available in <b>Cрпски [ћирилицом] (sr)</b>. Just click this text to get redirected.",
										/* sk */	"none", "This site is also available in <b>Slovenský jazyk [slovenčina] (sk)</b>. Just click this text to get redirected.",
										/* sl */	"none", "This site is also available in <b>Slovenski jezik [slovenščina] (sl)</b>. Just click this text to get redirected.",
										/* es */	"none", "This site is also available in <b>Español (es)</b>. Just click this text to get redirected.",
										/* sv */	"soft", "Denna webbplats finns också på <b>Svenska (sv)</b>. Klicka bara på den här texten för att bli omdirigerad.",
										/* ta */	"none", "This site is also available in <b>தமிழ் (ta)</b>. Just click this text to get redirected.",
										/* th */	"none", "This site is also available in <b>ภาษาไทย (th)</b>. Just click this text to get redirected.",
										/* tr */	"soft", "Bu site ayrıca <b>Türkçe (tr)</b> olarak mevcuttur. Yeniden yönlendirilmek için sadece bu metine tıklayın.",
										/* uk */	"soft", "Сайт також доступний <b>Українською (uk)</b>. Натисніть, щоб перейти.",
										/* vi */	"none", "This site is also available in <b>Tiếng Việt (vi)</b>. Just click this text to get redirected." ];

