modulejs.define('ext/l10n', ['_', '$', 'core/settings', 'core/langs', 'core/format', 'core/store', 'core/event'], function (_, $, allsettings, langs, format, store, event) { var settings = _.extend({ enabled: false, lang: 'en', useBrowserLang: true }, allsettings.l10n), defaultTranslations = { isoCode: 'en', lang: 'english', details: 'details', list: "list", grid: "grid", icons: 'icons', name: 'Name', lastModified: 'Last modified', size: 'Size', parentDirectory: 'Parent Directory', empty: 'empty', folders: 'folders', files: 'files', download: 'download', noMatch: 'no match', dateFormat: 'YYYY-MM-DD HH:mm', filter: 'filter', 'delete': 'delete' }, template = '' + ' - ' + '
    ' + '', langOptionTemplate = '
  • ', storekey = 'h5ai.language', loaded = { en: _.extend({}, defaultTranslations) }, currentLang = loaded.en, update = function (lang) { if (lang) { currentLang = lang; } $.each(currentLang, function (key, value) { $('.l10n-' + key).text(value); }); $('.langOption').removeClass('current'); $('.langOption.' + currentLang.isoCode).addClass('current'); format.setDefaultDateFormat(currentLang.dateFormat); $('#extended .entry .date').each(function () { var $this = $(this); $this.text(format.formatDate($this.data('time'))); }); $('#filter input').attr('placeholder', currentLang.filter); }, loadLanguage = function (isoCode, callback) { if (loaded[isoCode]) { callback(loaded[isoCode]); } else { $.ajax({ url: allsettings.h5aiAbsHref + 'conf/l10n/' + isoCode + '.json', dataType: 'json', success: function (json) { loaded[isoCode] = _.extend({}, defaultTranslations, json, {isoCode: isoCode}); callback(loaded[isoCode]); }, error: function () { loaded[isoCode] = _.extend({}, defaultTranslations, {isoCode: isoCode}); callback(loaded[isoCode]); } }); } }, localize = function (langs, isoCode, useBrowserLang) { var storedIsoCode = store.get(storekey); if (langs[storedIsoCode]) { isoCode = storedIsoCode; } else if (useBrowserLang) { var browserLang = navigator.language || navigator.browserLanguage; if (browserLang) { if (langs[browserLang]) { isoCode = browserLang; } else if (browserLang.length > 2 && langs[browserLang.substr(0, 2)]) { isoCode = browserLang.substr(0, 2); } } } if (!langs[isoCode]) { isoCode = 'en'; } loadLanguage(isoCode, update); }, initLangSelector = function (langs) { var $langSelector = $(template).appendTo('#bottombar .right'), $langOptions = $langSelector.find('.langOptions'), $ul = $langOptions.find('ul'), isoCodes = []; $.each(langs, function (isoCode) { isoCodes.push(isoCode); }); isoCodes.sort(); $.each(isoCodes, function (idx, isoCode) { $(langOptionTemplate) .addClass(isoCode) .text(isoCode + ' - ' + (_.isString(langs[isoCode]) ? langs[isoCode] : langs[isoCode].lang)) .appendTo($ul) .click(function () { store.put(storekey, isoCode); localize(langs, isoCode, false); }); }); $langOptions .append($ul) .scrollpanel(); $langSelector.hover( function () { $langOptions .css('top', '-' + $langOptions.outerHeight() + 'px') .stop(true, true) .fadeIn(); // needs to be updated twice for initial fade in rendering :/ $langOptions.scrollpanel('update').scrollpanel('update'); }, function () { $langOptions .stop(true, true) .fadeOut(); } ); }, init = function () { if (!settings.enabled) { event.sub('ready', function () { update(); }); return; } initLangSelector(langs); event.sub('ready', function () { localize(langs, settings.lang, settings.useBrowserLang); }); }; init(); });