123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /**
- * @license Licensed under the Apache License, Version 2.0 (the "License"):
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * @fileoverview Functions related to language and localisation.
- */
- 'use strict';
- /** Create a namespace for the application. */
- var Ardublockly = Ardublockly || {};
- /** Lookup for names of supported languages. Keys in ISO 639 format. */
- Ardublockly.LANGUAGE_NAME = {
- 'en': 'English',
- 'zh-hant': '繁体中文',
- 'zh-hans': '简体中文'
- };
- /**
- * Selected language, default English.
- * @type {string}
- */
- Ardublockly.LANG = 'en';
- /**
- * We keep a local copy of the default language in case translations cannot
- * be found in the injected language file.
- * @type {Object}
- */
- Ardublockly.DEFAULT_LANG_TEXT = {};
- /** Initialize the page language. */
- Ardublockly.initLanguage = function () {
- // Save the current default language ID to check if it has been changed
- var defaultLang = Ardublockly.LANG;
- // Check server settings and url language, url gets priority
- Ardublockly.LANG = Ardublockly.getUrlLanguage() ||
- Ardublockly.getLanguageSetting() || Ardublockly.LANG;
- //if (defaultLang !== Ardublockly.LANG) {
- Ardublockly.injectLanguageJsSources(Ardublockly.LANG);
- Ardublockly.duplicateDefaultLang();
- Ardublockly.updateLanguageText();
- //}
- };
- /**
- * Get the language previously set by the user from the server settings.
- * @return {string} Language saved in the server settings.
- */
- Ardublockly.getLanguageSetting = function () {
- //TODO: Server feature still to be implemented, for now return default
- return null;
- };
- /**
- * Get the language selected from the URL, format '?lang=en'.
- * @return {string} Selected language.
- */
- Ardublockly.getUrlLanguage = function () {
- var langKey = 'lang';
- var val = location.search.match(new RegExp('[?&]' + langKey + '=([^&]+)'));
- var language = val ? decodeURIComponent(val[1].replace(/\+/g, '%20')) : '';
- if (Ardublockly.LANGUAGE_NAME[language] == null) { language = 'en'; }
- return language;
- };
- /**
- * Because new languages are injected by overwriting Ardublockly.LOCALISED_TEXT
- * we keep a local copy of the default language (included in the html header) so
- * that we can still retrieve these strings if the translation cannot be found.
- */
- Ardublockly.duplicateDefaultLang = function () {
- for (var textId in Ardublockly.LOCALISED_TEXT) {
- Ardublockly.DEFAULT_LANG_TEXT[textId] = Ardublockly.LOCALISED_TEXT[textId];
- }
- };
- /** Updates the page text strings with the new language. */
- Ardublockly.updateLanguageText = function () {
- for (var textId in Ardublockly.LOCALISED_TEXT) {
- var textStrings = document.getElementsByClassName('translatable_' + textId);
- for (var i = 0; i < textStrings.length; i++) {
- textStrings[i].innerHTML = Ardublockly.getLocalStr(textId);
- }
- }
- };
- /**
- * Injects the language JavaScript files into the html head element.
- * @param {string} langKey Dictionary key for the language to inject, must also
- * be JS file name.
- */
- Ardublockly.injectLanguageJsSources = function (langKey) {
- var head = document.getElementsByTagName('head')[0];
- // Retrieve and inject Ardublockly translations synchronously
- var appLangJsLoad = document.createElement('script');
- var request = ArdublocklyServer.createAjaxRequest();
- var appLangJdPath = 'msg/' + langKey + '.js';
- try {
- request.open('GET', appLangJdPath, false);
- request.send('');
- appLangJsLoad.text = request.responseText;
- } catch (e) {
- // Display an alert to indicate we cannot load languages
- Ardublockly.alertMessage(
- Ardublockly.getLocalStr('noServerTitle'),
- Ardublockly.getLocalStr('noServerNoLangBody'),
- false);
- // But still asynchronous lazy load so at least some text gets translated
- appLangJsLoad.src = appLangJdPath;
- }
- head.appendChild(appLangJsLoad);
- // Retrieve and inject Blockly translations asynchronously
- var blocklyLangJsLoad = document.createElement('script');
- blocklyLangJsLoad.src = 'blockly/msg/js/' + langKey + '.js';
- head.appendChild(blocklyLangJsLoad);
- };
- /** Saves the blocks and reloads with a different language. */
- Ardublockly.changeLanguage = function () {
- // Store the blocks for the duration of the reload only
- // Ardublockly.saveSessionStorageBlocks();
- var languageMenu = document.getElementById('language');
- var newLang = encodeURIComponent(
- languageMenu.options[languageMenu.selectedIndex].value);
- var search = window.location.search;
- if (search.length <= 1) {
- search = '?lang=' + newLang;
- } else if (search.match(/[?&]lang=[^&]*/)) {
- search = search.replace(/([?&]lang=)[^&]*/, '$1' + newLang);
- } else {
- search = search.replace(/\?/, '?lang=' + newLang + '&');
- }
- window.location = window.location.protocol + '//' +
- window.location.host + window.location.pathname + search;
- };
- /**
- * Finds and returns the requests string in the localised language.
- * If the translation is not returned, it fetches the original language string.
- * @param {string} stringId
- * @return {!string} The localised, original, or an empty string.
- */
- Ardublockly.getLocalStr = function (stringId) {
- var text = Ardublockly.LOCALISED_TEXT[stringId];
- if (!text) {
- console.log('Localised text string ID "' + stringId + '" does not exists!');
- }
- return text || Ardublockly.DEFAULT_LANG_TEXT[stringId] || '';
- };
|