var yaml = require('js-yaml'); vnLocaleStrings = {}; /** * Class to manage the internationalization. **/ module.exports = { language: null ,defaultLang: 'en' ,init: function () { if (this.language) return; var language = this.defaultLang; var languages = navigator.languages; if (languages && languages.length > 0) language = languages[0]; else if (navigator.language) language = navigator.language; this.language = language.substr (0, 2); } ,load: function (path, callback) { this.init (); var data = { path: path, callback: callback, defOk: false, orgOk: this.defaultLang === this.language }; data.def = this.createRequest (data, true, this.defaultLang); if (!data.orgOk) data.org = this.createRequest (data, false, this.language); } ,createRequest: function (data, isDef, lang) { var langFile = data.path +'/locale/'+ lang +'.yml'+ Vn.getVersion (); var request = new XMLHttpRequest (); request.open ('get', langFile, true); request.onreadystatechange = this.onRequestReady.bind (this, request, data, isDef); request.send (); return request; } ,onRequestReady: function (request, data, isDef) { if (request.readyState != 4) return; if (isDef) { this.loadFromRequest (request); data.defOk = true; } else data.orgOk = true; if (data.orgOk && data.defOk) { if (data.org != null) this.loadFromRequest (data.org) if (data.callback) data.callback (); } } ,loadFromRequest: function (request) { if (request.status !== 200) return false; try { this.add (yaml.safeLoad (request.responseText)); return true; } catch (e) { console.error (e); } return false } ,loadScript: function (path, callback) { this.init (); Vn.includeJs (path +'/locale/'+ this.language, callback); } ,add: function (translations) { for (var str in translations) vnLocaleStrings[str] = translations[str]; } } window._ = function (stringId) { var string = vnLocaleStrings[stringId]; return string ? string : stringId; }