mirror of
https://github.com/zulip/zulip.git
synced 2025-11-15 19:31:58 +00:00
Previously we used to mark a key as unstranlated if its value was equal to it in translations.json. This had an issue because it didn't allow otherwise valid cases where key was equal to the value. This commit solves the problem by disallowing an empty string as a valid translation and then using the empty string as the value for all the unstranslated keys. Fixes #5261
81 lines
2.1 KiB
JavaScript
81 lines
2.1 KiB
JavaScript
// 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';
|
|
|
|
window.i18n = i18next;
|
|
|
|
var backendOptions = {
|
|
loadPath: '/static/locale/__lng__/translations.json',
|
|
};
|
|
var callbacks = [];
|
|
var initialized = false;
|
|
|
|
var detectionOptions = {
|
|
order: ['htmlTag'],
|
|
htmlTag: document.documentElement,
|
|
};
|
|
|
|
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) {
|
|
if (translation_key.indexOf(current_generation_key) !== 0) {
|
|
localStorage.removeItem(translation_key);
|
|
}
|
|
});
|
|
return this;
|
|
});
|