224 lines
6.1 KiB
JavaScript
224 lines
6.1 KiB
JavaScript
"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.<string, Object.<string, string|Array.<string>>>} */
|
|
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.<string>)} texts
|
|
* @param {?(string|Array.<string>)} languages
|
|
* @returns {string|Array.<string>|null}
|
|
* @access private
|
|
*/
|
|
const get_sentence = (texts, languages) => {
|
|
|
|
/** @type {Array.<string>} */
|
|
const keys = Common.get_keys(texts);
|
|
|
|
if(keys.length){
|
|
|
|
/** @type {Array.<string>} */
|
|
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.<string>)} texts
|
|
* @param {?(Object.<string, any|null>|Array<any|null>)} [subinputs = null]
|
|
* @param {?(string|Array.<string>)} [languages = null]
|
|
* @returns {any|null}
|
|
* @access public
|
|
*/
|
|
this.get = (texts, inputs = null, languages = null) => {
|
|
|
|
/** @type {string|Array.<string>|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.<string, any|null>} */
|
|
I18NManager.DEFAULT_SETTINGS = {};
|
|
|
|
return I18NManager;
|
|
})(); |