"use strict"; import {Common} from "../Utils/Common.ecma.js"; import {Check} from "../Utils/Checks.ecma.js"; /** * @typedef {import("../Application/AnP.ecma.js").AnP} AnP */ /** * @class I18NManager * @constructor * @param {!AnP} anp * @returns {void} * @access private * @static */ export const I18NManager = (function(){ /** * @callback simple_callback * @returns {void} */ /** * @callback continue_callback * @param {!boolean} ok * @return {boolean} */ /** * @constructs I18NManager * @param {!AnP} anp * @returns {void} * @access private * @static */ const I18NManager = function(anp){ /** @type {!AnP} */ const self = this, /** @type {Object.>>} */ sentences = {}; /** @type {boolean} */ let started = false, /** @type {string} */ language = "english", /** @type {string} */ default_language = "english"; /** * @returns {void} * @access private */ const constructor = () => {}; /** * @param {?continue_callback} callback * @returns {boolean} * @access public */ this.update = (callback = null) => { Common.execute_array(["default_i18n_files", "i18n_files", "default_i18n", "i18n"], (key, next) => { self.add(anp.settings.get(key), true, next); }, callback, true); }; /** * @param {?continue_callback} callback * @returns {boolean} * @access public */ this.reset = (callback = null) => { Common.clear_dictionary(sentences); self.update(callback); }; /** * @param {?continue_callback} callback * @returns {boolean} * @access public */ this.start = (callback = null) => { /** @type {continue_callback} */ const end = ok => Common.execute(callback, ok); if(started){ end(false); return false; }; started = true; self.update(() => end(true)); return true; }; /** * @param {?continue_callback} callback * @returns {boolean} * @access public */ this.close = (callback = null) => { /** @type {continue_callback} */ const end = ok => Common.execute(callback, ok); if(!started){ end(false); return false; }; started = false; end(true); return true; }; /** * @param {!(string|Array.)} texts * @param {?(string|Array.)} languages * @returns {string|Array.|null} * @access private */ const get_sentence = (texts, languages) => { /** @type {Array.} */ const keys = Common.get_keys(texts); if(keys.length){ /** @type {Array.} */ const languages_done = []; for(let language_key of Common.get_keys(languages).concat( [language, default_language], Object.keys(sentences) )){ if(languages_done.includes(language_key)) continue; languages_done.push(language_key); if(!sentences[language_key]) continue; for(let key of keys) if(sentences[language_key][key] !== undefined) return sentences[language_key][key]; }; }; return Common.get_texts(texts) }; /** * @param {!(string|Array.)} texts * @param {?(Object.|Array)} [subinputs = null] * @param {?(string|Array.)} [languages = null] * @returns {any|null} * @access public */ this.get = (texts, inputs = null, languages = null) => { /** @type {string|Array.|null} */ const sentence = get_sentence(texts, languages); return Common.string_variables(( Check.is_array(sentence) ? sentence.join("") : sentence), inputs); }; /** * @param {?any} inputs * @param {!boolean} [overwrite = false] * @param {?simple_callback} [callback = null] * @return {void} * @access public */ this.add = (inputs, overwrite = false, callback = null) => { anp.files.load_json(inputs, data => { for(let subinputs of data) Object.entries(subinputs).forEach(([new_language, new_sentences]) => { sentences[new_language] || (sentences[new_language] = {}); Check.is_dictionary(new_sentences) && Object.entries(new_sentences).filter(([key, _]) => !Check.is_mark_key(key)).forEach(([key, sentence]) => { sentences[new_language][key] = sentence; }); }); Common.execute(callback); }, true); }; /** * @param {!string} new_language * @return {boolean} * @access public */ this.change = new_language => { if(sentences[new_language] && new_language != language){ language = new_language; return true; }; return false; }; /** * @param {!string} check_language * @returns {boolean} * @access public */ this.is_language_selected = check_language => language == check_language; constructor(); }; /** @type {Object.} */ I18NManager.DEFAULT_SETTINGS = {}; return I18NManager; })();