"use strict"; import {Utils} from "../Utils/Utils.ecma.js"; import {Check} from "../Utils/Check.ecma.js"; /** * @typedef {import("../Application/AnP.ecma.js").AnP} AnP */ /** * @callback anp_i18n_settings_default_callback * @returns {void} */ /** * @class * @constructor * @param {!AnP} anp * @param {?(Object.|Array.)} inputs * @returns {void} * @access public */ export const I18NManager = (function(){ /** * @constructs I18NManager * @param {!AnP} anp * @returns {void} * @access private */ const I18NManager = function(anp){ /** @type {I18NManager} */ const self = this, /** @type {Object.} */ sentences = {}; /** @type {boolean} */ let started = false, /** @type {string} */ default_language = "english", /** @type {string} */ selected_language = "english"; /** * @returns {void} * @access private */ const constructor = () => {}; /** * @param {?anp_start_callback} callback * @returns {boolean} * @access public */ this.start = (callback = null) => { /** @type {!anp_start_callback} */ const end = ok => { Utils.execute(callback, ok); return ok; }; if(started) return end(false); started = true; Utils.execute_items([ "default_i18n_files", "default_i18n", "i18n_files", "i18n" ], (key, next) => { self.add(anp.settings.get(key), next, true); }, () => { end(true); }); return true; }; /** * @param {!(string|Object.|Array.)} inputs * @param {?anp_i18n_settings_default_callback} [callback = null] * @param {!boolean} [overwrite = false] * @returns {void} * @access public */ this.add = (inputs, callback = null, overwrite = false) => { anp.request.load_json(inputs, (data, subcallback) => { for(const language in data) if(Check.is_dictionary(data[language])){ sentences[language] || (sentences[language] = {}); for(const key in data[language]) !Check.is_key_mark(key) && (overwrite || sentences[language][key] === undefined) && (sentences[language][key] = data[language][key]); }; Utils.execute(subcallback); }, callback); }; /** * @param {!(string|Array.)} texts * @param {?(string|Array.)} languages * @returns {string|Array.|null} * @access private */ const get_sentence = (texts, languages) => { /** @type {Array.} */ const keys = Utils.get_keys(texts); if(keys.length){ /** @type {number} */ const l = (languages = Utils.get_keys(Utils.get_keys(languages).concat( [selected_language, default_language], Object.keys(sentences) ))).length; for(let i = 0; i < l; i ++) if(sentences[languages[i]]) for(let j = 0, m = keys.length; j < m; j ++) if(sentences[languages[i]][keys[j]] !== undefined) return sentences[languages[i]][keys[j]]; }; return Utils.get_strings(texts)[0]; }; /** * @param {!(string|Array.)} texts * @param {?(Object.|Array.)} [inputs = null] * @param {?(string|Array.)} [languages = null] * @returns {string|null} * @access public */ this.get = (texts, inputs = null, languages = null) => { /** @type {string|Array.|null} */ const fragments = get_sentence(texts, languages), /** @type {string|null} */ sentence = Check.is_array(fragments) ? fragments.join("") : fragments; return inputs ? Utils.string_variables(sentence, inputs) : sentence; }; constructor(); }; /** @type {Object.} */ I18NManager.DEFAULT_SETTINGS = {}; return I18NManager; })()