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

use shared globalize

This commit is contained in:
Luke Pulverenti 2016-03-05 13:51:19 -05:00
parent 3aefabc66b
commit ec65069323
29 changed files with 390 additions and 274 deletions

View file

@ -1,181 +0,0 @@
(function () {
var dictionaries = {};
function getUrl(culture) {
var parts = culture.split('-');
if (parts.length == 2) {
parts[1] = parts[1].toUpperCase();
culture = parts.join('-');
}
return 'strings/' + culture + '.json';
}
function getDictionary(culture) {
return dictionaries[getUrl(culture)];
}
function loadDictionary(culture) {
return new Promise(function (resolve, reject) {
if (getDictionary(culture)) {
console.log('Globalize loadDictionary resolved.');
resolve();
return;
}
var url = getUrl(culture);
var requestUrl = url + "?v=" + AppInfo.appVersion;
console.log('Requesting ' + requestUrl);
var xhr = new XMLHttpRequest();
xhr.open('GET', requestUrl, true);
var onError = function () {
console.log('Dictionary not found. Reverting to english');
// Grab the english version
var xhr2 = new XMLHttpRequest();
xhr2.open('GET', getUrl('en-US'), true);
xhr2.onload = function (e) {
dictionaries[url] = JSON.parse(this.response);
console.log('Globalize loadDictionary resolved.');
resolve();
};
xhr2.send();
};
xhr.onload = function (e) {
console.log('Globalize response status: ' + this.status);
if (this.status < 400) {
dictionaries[url] = JSON.parse(this.response);
console.log('Globalize loadDictionary resolved.');
resolve();
} else {
onError();
}
};
xhr.onerror = onError;
xhr.send();
});
}
var currentCulture = 'en-US';
function setCulture(value) {
console.log('Setting culture to ' + value);
currentCulture = value;
return loadDictionary(value);
}
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;
}
function getDeviceCulture() {
return new Promise(function (resolve, reject) {
if (Dashboard.isConnectMode()) {
resolve(navigator.language || navigator.userLanguage);
} else {
console.log('Getting culture from document');
resolve(document.documentElement.getAttribute('data-culture'));
}
});
}
function ensure() {
console.log('Entering Globalize.ensure');
return getDeviceCulture().then(function (culture) {
culture = normalizeLocaleName(culture || 'en-US');
return setCulture(culture);
});
}
function translateDocument(html) {
var glossary = getDictionary(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(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
};
})();

View file

@ -22,7 +22,7 @@
var html = this.response;
var elem = page.querySelector('.providerTemplate');
elem.innerHTML = Globalize.translateDocument(html);
elem.innerHTML = Globalize.translateHtml(html);
$(elem).trigger('create');
init(page, type, providerId);

View file

@ -1729,7 +1729,9 @@ define(['appSettings', 'userSettings'], function (appSettings, userSettings) {
window.MediaPlayer = new mediaPlayer();
window.MediaController.registerPlayer(window.MediaPlayer);
window.MediaController.setActivePlayer(window.MediaPlayer, window.MediaPlayer.getTargetsInternal()[0]);
window.MediaPlayer.init = function() {
window.MediaController.registerPlayer(window.MediaPlayer);
window.MediaController.setActivePlayer(window.MediaPlayer, window.MediaPlayer.getTargetsInternal()[0]);
};
});

View file

@ -33,7 +33,7 @@ var Dashboard = {
html = html.substring(0, lastIndex) + html.substring(lastIndex + 3);
}
return Globalize.translateDocument(html, 'html');
return Globalize.translateHtml(html, 'core');
},
isConnectMode: function () {
@ -1740,6 +1740,7 @@ var AppInfo = {};
hammer: bowerPath + "/hammerjs/hammer.min",
layoutManager: embyWebComponentsBowerPath + "/layoutmanager",
focusManager: embyWebComponentsBowerPath + "/focusmanager",
globalize: embyWebComponentsBowerPath + "/globalize",
imageLoader: embyWebComponentsBowerPath + "/images/imagehelper"
};
@ -1933,10 +1934,6 @@ var AppInfo = {};
return ConnectionManager;
});
define("globalize", [], function () {
return Globalize;
});
define('apiClientResolver', [], function () {
return function () {
return window.ApiClient;
@ -2047,7 +2044,6 @@ var AppInfo = {};
}
deps.push('scripts/mediacontroller');
deps.push('scripts/globalize');
deps.push('paper-drawer-panel');
@ -2103,7 +2099,6 @@ var AppInfo = {};
var promises = [];
deps = [];
deps.push('scripts/mediaplayer');
deps.push('emby-icons');
deps.push('paper-icon-button');
deps.push('paper-button');
@ -2111,7 +2106,6 @@ var AppInfo = {};
promises.push(getRequirePromise(deps));
promises.push(Globalize.ensure());
promises.push(createConnectionManager(credentialProviderFactory, Dashboard.capabilities()));
Promise.all(promises).then(function () {
@ -2119,60 +2113,82 @@ var AppInfo = {};
console.log('initAfterDependencies promises resolved');
MediaController.init();
document.title = Globalize.translateDocument(document.title, 'html');
require(['globalize'], function (globalize) {
var mainDrawerPanelContent = document.querySelector('.mainDrawerPanelContent');
window.Globalize = globalize;
if (mainDrawerPanelContent) {
var newHtml = mainDrawerPanelContent.innerHTML.substring(4);
newHtml = newHtml.substring(0, newHtml.length - 3);
var srch = 'data-require=';
var index = newHtml.indexOf(srch);
var depends;
if (index != -1) {
var requireAttribute = newHtml.substring(index + srch.length + 1);
requireAttribute = requireAttribute.substring(0, requireAttribute.indexOf('"'));
depends = requireAttribute.split(',');
}
depends = depends || [];
if (newHtml.indexOf('type-interior') != -1) {
addLegacyDependencies(depends, window.location.href);
}
require(depends, function () {
// TODO: This needs to be deprecated, but it's used heavily
$.fn.checked = function (value) {
if (value === true || value === false) {
// Set the value of the checkbox
return $(this).each(function () {
this.checked = value;
});
} else {
// Return check state
return this.length && this[0].checked;
}
};
// Don't like having to use jQuery here, but it takes care of making sure that embedded script executes
$(mainDrawerPanelContent).html(Globalize.translateDocument(newHtml, 'html'));
onAppReady();
});
return;
}
onAppReady();
loadCoreDictionary(globalize).then(onGlobalizeInit);
});
});
});
}
function loadCoreDictionary(globalize) {
var baseUrl = 'strings/';
var languages = ['ar', 'bg-BG', 'ca', 'cs', 'da', 'de', 'el', 'en-GB', 'en-US', 'en-AR', 'en-MX', 'es', 'fi', 'fr', 'gsw', 'he', 'hr', 'hu', 'id', 'it', 'kk', 'ko', 'ms', 'nb', 'nl', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sl-SI', 'sv', 'tr', 'uk', 'vi', 'zh-CN', 'zh-HK', 'zh-TW'];
var translations = languages.map(function (i) {
return {
lang: i,
path: baseUrl + i + '.json'
};
});
globalize.defaultModule('core');
return globalize.loadStrings({
name: 'core',
translations: translations
});
}
function onGlobalizeInit() {
document.title = Globalize.translateHtml(document.title, 'core');
var mainDrawerPanelContent = document.querySelector('.mainDrawerPanelContent');
if (mainDrawerPanelContent) {
var newHtml = mainDrawerPanelContent.innerHTML.substring(4);
newHtml = newHtml.substring(0, newHtml.length - 3);
var srch = 'data-require=';
var index = newHtml.indexOf(srch);
var depends;
if (index != -1) {
var requireAttribute = newHtml.substring(index + srch.length + 1);
requireAttribute = requireAttribute.substring(0, requireAttribute.indexOf('"'));
depends = requireAttribute.split(',');
}
depends = depends || [];
depends.push('scripts/mediaplayer');
depends.push('legacy/fnchecked');
if (newHtml.indexOf('type-interior') != -1) {
addLegacyDependencies(depends, window.location.href);
}
require(depends, function () {
MediaPlayer.init();
// Don't like having to use jQuery here, but it takes care of making sure that embedded script executes
$(mainDrawerPanelContent).html(Globalize.translateHtml(newHtml, 'core'));
onAppReady();
});
return;
}
onAppReady();
}
function onAppReady() {
console.log('Begin onAppReady');

View file

@ -49,7 +49,7 @@
}).then(function (html) {
var elem = page.querySelector('.providerTemplate');
elem.innerHTML = Globalize.translateDocument(html);
elem.innerHTML = Globalize.translateHtml(html);
init(page, type);
});