(function () { var dicts = {}, translateElement = function (jqElt, lang) { var dictionaryKey = jqElt.data('dict'), translationKey = jqElt.data('tkey'), dict = dicts[dictionaryKey], translations, html, key; if (dict === codeq.tr.emptyDictionary) return; // silent ignore if (!dict) { codeq.log.error('Cannot find translation dictionary ' + dictionaryKey); return; } if (!(typeof translationKey === 'number' || typeof translationKey === 'string')) { codeq.log.error('Cannot find the element\'s translation key, dictionary: ' + dictionaryKey); return; } translations = dict[translationKey]; if (!translations) { codeq.log.error('Translation key ' + translationKey + ' is missing from dictionary ' + dictionaryKey); return; } html = translations[lang]; if (!html) { html = translations['en']; if (html) { codeq.log.info('There is no translation in language ' + lang + ' for key ' + translationKey + ' in dictionary ' + dictionaryKey + ', defaulting to language en'); } else { for (key in translations) { if (!translations.hasOwnProperty(key)) continue; html = translations[key]; if (!html) continue; codeq.log.info('There is no translation in languages ' + lang + ' and en for key ' + translationKey + ' in dictionary ' + dictionaryKey + ', defaulting to language ' + key); break; } if (!html) { codeq.log.warn('There is no translation in any language for key ' + translationKey + ' in dictionary ' + dictionaryKey + ', leaving empty'); return; } } } jqElt.html(html); }, translateDocument = function (lang) { $('.translatable').each(function () { translateElement($(this), lang); }); }; // Translate the whole document when the user switches the display language codeq.on('langchange', function (args) { translateDocument(args.lang); }); // ================================================================================ // The module API // ================================================================================ codeq.tr = { 'registerDictionary': function (name, dict) { dicts[name] = dict; }, 'unregisterDictionary': function (name) { delete dicts[name]; }, 'emptyDictionary': {}, // use this with registerDictionary when you don't want any translations 'translateDom': function (jqTopElt) { var lang = codeq.getLang(); jqTopElt.find('.translatable').each(function () { translateElement($(this), lang); }); } }; })();