1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/dashboard-ui/scripts/globalize.js

187 lines
4.5 KiB
JavaScript
Raw Normal View History

2015-07-27 14:18:10 -04:00
(function () {
var dictionaries = {};
2016-02-27 13:49:31 -05:00
function getUrl(culture) {
2015-07-27 14:18:10 -04:00
2015-07-27 15:16:30 -04:00
var parts = culture.split('-');
if (parts.length == 2) {
parts[1] = parts[1].toUpperCase();
culture = parts.join('-');
}
2016-02-27 13:49:31 -05:00
return 'strings/' + culture + '.json';
2015-07-27 14:18:10 -04:00
}
2016-02-27 13:49:31 -05:00
function getDictionary(culture) {
2015-07-27 14:18:10 -04:00
2016-02-27 13:49:31 -05:00
return dictionaries[getUrl(culture)];
2015-07-27 14:18:10 -04:00
}
2016-02-27 13:49:31 -05:00
function loadDictionary(culture) {
2015-07-27 14:18:10 -04:00
2015-12-14 10:43:03 -05:00
return new Promise(function (resolve, reject) {
2015-07-27 14:18:10 -04:00
2016-02-27 13:49:31 -05:00
if (getDictionary(culture)) {
console.log('Globalize loadDictionary resolved.');
2015-12-14 10:43:03 -05:00
resolve();
return;
}
2015-07-27 14:18:10 -04:00
2016-02-27 13:49:31 -05:00
var url = getUrl(culture);
2015-07-28 17:48:52 -04:00
2015-12-14 10:43:03 -05:00
var requestUrl = url + "?v=" + AppInfo.appVersion;
2015-07-28 17:48:52 -04:00
2015-12-23 12:46:01 -05:00
console.log('Requesting ' + requestUrl);
2015-07-28 17:48:52 -04:00
2015-12-14 10:43:03 -05:00
var xhr = new XMLHttpRequest();
xhr.open('GET', requestUrl, true);
2015-07-28 17:48:52 -04:00
2015-12-14 10:43:03 -05:00
var onError = function () {
2015-07-28 17:48:52 -04:00
2015-12-23 12:46:01 -05:00
console.log('Dictionary not found. Reverting to english');
2015-07-28 17:48:52 -04:00
2015-12-14 10:43:03 -05:00
// Grab the english version
var xhr2 = new XMLHttpRequest();
2016-02-27 13:49:31 -05:00
xhr2.open('GET', getUrl('en-US'), true);
2015-12-14 10:43:03 -05:00
xhr2.onload = function (e) {
dictionaries[url] = JSON.parse(this.response);
2016-02-27 13:49:31 -05:00
console.log('Globalize loadDictionary resolved.');
2015-12-14 10:43:03 -05:00
resolve();
};
xhr2.send();
};
xhr.onload = function (e) {
2015-12-23 12:46:01 -05:00
console.log('Globalize response status: ' + this.status);
2015-12-14 10:43:03 -05:00
if (this.status < 400) {
2015-07-27 14:18:10 -04:00
2015-12-14 10:43:03 -05:00
dictionaries[url] = JSON.parse(this.response);
2016-02-27 13:49:31 -05:00
console.log('Globalize loadDictionary resolved.');
2015-12-14 10:43:03 -05:00
resolve();
} else {
onError();
}
};
xhr.onerror = onError;
xhr.send();
});
2015-07-27 14:18:10 -04:00
}
var currentCulture = 'en-US';
function setCulture(value) {
2015-12-23 12:46:01 -05:00
console.log('Setting culture to ' + value);
2015-07-27 14:18:10 -04:00
currentCulture = value;
2016-02-27 13:49:31 -05:00
return loadDictionary(value);
2015-07-28 17:48:52 -04:00
}
2015-08-05 21:21:18 -04:00
function normalizeLocaleName(culture) {
culture = culture.replace('_', '-');
// If it's de-DE, convert to just de
var parts = culture.split('-');
if (parts.length == 2) {
if (parts[0].toLowerCase() == parts[1].toLowerCase()) {
culture = parts[0].toLowerCase();
}
}
return culture;
}
2015-07-28 17:48:52 -04:00
function getDeviceCulture() {
2015-12-14 10:43:03 -05:00
return new Promise(function (resolve, reject) {
2015-07-28 17:48:52 -04:00
2015-12-14 10:43:03 -05:00
if (AppInfo.isNativeApp) {
2015-08-05 21:21:18 -04:00
2015-12-14 10:43:03 -05:00
resolve(navigator.language || navigator.userLanguage);
2015-07-28 17:48:52 -04:00
2015-12-14 10:43:03 -05:00
} else if (AppInfo.supportsUserDisplayLanguageSetting) {
2015-07-28 17:48:52 -04:00
2015-12-23 12:46:01 -05:00
console.log('AppInfo.supportsUserDisplayLanguageSetting is true');
2015-08-02 19:47:31 -04:00
2015-12-14 10:43:03 -05:00
resolve(AppSettings.displayLanguage());
2015-08-02 19:47:31 -04:00
2015-12-14 10:43:03 -05:00
} else {
2015-07-28 15:42:24 -04:00
2015-12-23 12:46:01 -05:00
console.log('Getting culture from document');
2015-12-14 10:43:03 -05:00
resolve(document.documentElement.getAttribute('data-culture'));
}
});
2015-07-27 14:18:10 -04:00
}
2015-07-28 17:48:52 -04:00
2015-07-27 14:18:10 -04:00
function ensure() {
2015-12-23 12:46:01 -05:00
console.log('Entering Globalize.ensure');
2015-08-05 21:21:18 -04:00
2015-12-14 10:43:03 -05:00
return getDeviceCulture().then(function (culture) {
2015-07-27 14:18:10 -04:00
2015-12-14 10:43:03 -05:00
culture = normalizeLocaleName(culture || 'en-US');
2015-07-28 17:48:52 -04:00
2015-12-14 10:43:03 -05:00
return setCulture(culture);
2015-07-28 17:48:52 -04:00
});
2015-07-27 14:18:10 -04:00
}
2016-02-27 13:49:31 -05:00
function translateDocument(html) {
2015-07-27 14:18:10 -04:00
2016-02-27 13:49:31 -05:00
var glossary = getDictionary(currentCulture) || {};
2015-07-27 14:18:10 -04:00
return translateHtml(html, glossary);
}
function translateHtml(html, dictionary) {
var startIndex = html.indexOf('${');
if (startIndex == -1) {
return html;
}
startIndex += 2;
var endIndex = html.indexOf('}', startIndex);
if (endIndex == -1) {
return html;
}
var key = html.substring(startIndex, endIndex);
var val = dictionary[key] || key;
html = html.replace('${' + key + '}', val);
return translateHtml(html, dictionary);
}
// Mimic Globalize api
// https://github.com/jquery/globalize
// Maybe later switch to it
window.Globalize = {
translate: function (key) {
2016-02-27 13:49:31 -05:00
var glossary = getDictionary(currentCulture) || {};
2015-07-27 14:18:10 -04:00
var val = glossary[key] || key;
for (var i = 1; i < arguments.length; i++) {
val = val.replace('{' + (i - 1) + '}', arguments[i]);
}
return val;
},
ensure: ensure,
translateDocument: translateDocument
};
})();