zulip/static/js/translations.js

98 lines
2.7 KiB
JavaScript
Raw Normal View History

2015-10-26 17:11:44 +01:00
// commonjs code goes here
import i18next from 'i18next';
import XHR from 'i18next-xhr-backend';
import LngDetector from 'i18next-browser-languagedetector';
import Cache from 'i18next-localstorage-cache';
import localstorage from './localstorage';
2016-07-05 13:05:51 +02:00
window.i18n = i18next;
// Add those keys in this list which are received from the backend
// and are translated by calling i18n.t function on variables. For example,
// i18n.t(receivedFromBackend);
var toBeTranslated = [ // eslint-disable-line no-unused-vars
// The Emoji type name for the "text" emojiset choice
i18n.t('Plain text'),
];
function loadPath(languages) {
var language = languages[0];
if (language.indexOf('-') >= 0) {
language = language.replace('-', '_'); // Change zh-Hans to zh_Hans.
}
return '/static/locale/' + language + '/translations.json';
}
var backendOptions = {
loadPath: loadPath,
};
var callbacks = [];
var initialized = false;
var detectionOptions = {
order: ['htmlTag'],
htmlTag: document.documentElement,
};
2016-07-05 13:05:51 +02:00
var cacheOptions = {
enabled: !page_params.development,
prefix: 'i18next:' + page_params.server_generation + ':',
expirationTime: 2*24*60*60*1000, // 2 days
};
i18next.use(XHR)
.use(LngDetector)
.use(Cache)
.init({
nsSeparator: false,
keySeparator: false,
interpolation: {
prefix: "__",
suffix: "__",
},
backend: backendOptions,
detection: detectionOptions,
cache: cacheOptions,
fallbackLng: 'en',
returnEmptyString: false, // Empty string is not a valid translation.
}, function () {
var i;
initialized = true;
for (i=0; i<callbacks.length; i += 1) {
callbacks[i]();
}
});
i18next.ensure_i18n = function (callback) {
if (initialized) {
callback();
} else {
callbacks.push(callback);
}
};
// garbage collect all old i18n translation maps in localStorage.
$(function () {
if (!localstorage.supported()) {
return;
}
// this collects all localStorage keys that match the format of:
// i18next:dddddddddd:w+ => 1484902202:en
// these are all language translation strings.
var translations = Object.keys(localStorage).filter(function (key) {
return /^i18next:\d{10}:\w+$/.test(key);
});
var current_generation_key = 'i18next:' + page_params.server_generation;
// remove cached translations of older versions.
translations.forEach(function (translation_key) {
2017-08-22 16:25:03 +02:00
if (translation_key.indexOf(current_generation_key) !== 0) {
localStorage.removeItem(translation_key);
}
});
return this;
});