jellyfin-web/dashboard-ui/scripts/globalize.js

187 lines
4.6 KiB
JavaScript
Raw Normal View History

2015-07-27 11:18:10 -07:00
(function () {
var dictionaries = {};
function getUrl(name, culture) {
2015-07-27 12:16:30 -07:00
var parts = culture.split('-');
if (parts.length == 2) {
parts[1] = parts[1].toUpperCase();
culture = parts.join('-');
}
2015-07-27 11:18:10 -07:00
return 'strings/' + name + '/' + culture + '.json';
}
function getDictionary(name, culture) {
return dictionaries[getUrl(name, culture)];
}
2015-07-28 14:48:52 -07:00
function loadDictionary(name, culture) {
2015-07-27 11:18:10 -07:00
var deferred = DeferredBuilder.Deferred();
if (getDictionary(name, culture)) {
deferred.resolve();
} else {
2015-07-28 14:48:52 -07:00
var url = getUrl(name, culture);
$.getJSON(url).done(function (dictionary) {
dictionaries[url] = dictionary;
2015-07-27 11:18:10 -07:00
deferred.resolve();
2015-07-28 14:48:52 -07:00
}).fail(function () {
// If there's no dictionary for that language, grab English
$.getJSON(getUrl(name, 'en-US')).done(function (dictionary) {
dictionaries[url] = dictionary;
deferred.resolve();
});
2015-07-27 11:18:10 -07:00
});
}
return deferred.promise();
}
var currentCulture = 'en-US';
function setCulture(value) {
2015-08-05 18:21:18 -07:00
Logger.log('Setting culture to ' + value);
2015-07-27 11:18:10 -07:00
currentCulture = value;
2015-07-28 14:48:52 -07:00
return $.when(loadDictionary('html', value), loadDictionary('javascript', value));
}
2015-08-05 18:21:18 -07: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 14:48:52 -07:00
function getDeviceCulture() {
var deferred = DeferredBuilder.Deferred();
var culture;
if (navigator.globalization && navigator.globalization.getLocaleName) {
2015-08-05 18:21:18 -07:00
Logger.log('Calling navigator.globalization.getLocaleName');
2015-07-28 14:48:52 -07:00
navigator.globalization.getLocaleName(function (locale) {
2015-08-05 18:21:18 -07:00
culture = normalizeLocaleName(locale.value || '');
2015-07-28 14:48:52 -07:00
Logger.log('Device culture is ' + culture);
deferred.resolveWith(null, [culture]);
}, function () {
2015-08-02 16:47:31 -07:00
Logger.log('navigator.globalization.getLocaleName failed');
2015-07-28 14:48:52 -07:00
deferred.resolveWith(null, [null]);
});
2015-07-28 12:42:24 -07:00
2015-08-04 11:14:16 -07:00
} else if (AppInfo.supportsUserDisplayLanguageSetting) {
Logger.log('AppInfo.supportsUserDisplayLanguageSetting is true');
2015-08-05 18:21:18 -07:00
culture = AppSettings.displayLanguage();
2015-08-04 11:14:16 -07:00
deferred.resolveWith(null, [culture]);
2015-07-28 14:48:52 -07:00
} else {
2015-07-28 12:42:24 -07:00
2015-08-05 18:21:18 -07:00
Logger.log('Getting culture from document');
2015-08-02 16:47:31 -07:00
2015-07-28 14:48:52 -07:00
culture = document.documentElement.getAttribute('data-culture');
deferred.resolveWith(null, [culture]);
}
2015-07-28 12:42:24 -07:00
2015-07-28 14:48:52 -07:00
return deferred.promise();
2015-07-27 11:18:10 -07:00
}
2015-07-28 14:48:52 -07:00
2015-07-27 11:18:10 -07:00
function ensure() {
2015-08-05 18:21:18 -07:00
Logger.log('Entering Globalize.ensure');
2015-07-28 14:48:52 -07:00
var deferred = DeferredBuilder.Deferred();
2015-07-27 11:18:10 -07:00
2015-07-28 14:48:52 -07:00
getDeviceCulture().done(function (culture) {
if (!culture) {
culture = 'en-US';
}
setCulture(culture).done(function () {
deferred.resolve();
});
});
2015-07-27 11:18:10 -07:00
2015-07-28 14:48:52 -07:00
return deferred.promise();
2015-07-27 11:18:10 -07:00
}
function translateDocument(html, dictionaryName) {
var glossary = getDictionary(dictionaryName, currentCulture) || {};
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) {
var glossary = getDictionary('javascript', currentCulture) || {};
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
};
})();