2023-10-20 22:35:26 +08:00
|
|
|
// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
|
2017-02-21 01:29:06 +08:00
|
|
|
(function () {
|
|
|
|
// add your module to this map so it gets used
|
|
|
|
var map = {
|
2019-06-03 17:31:12 +08:00
|
|
|
'ca': 'Català',
|
2022-01-03 16:09:44 +08:00
|
|
|
'cs': 'Čeština',
|
2019-03-13 22:48:36 +08:00
|
|
|
'de': 'Deutsch',
|
|
|
|
'el': 'Ελληνικά',
|
2019-06-20 16:57:56 +08:00
|
|
|
'es': 'Español',
|
2022-01-05 18:05:26 +08:00
|
|
|
'eu': 'Euskara',
|
2020-09-17 02:08:23 +08:00
|
|
|
'fi': 'Suomi',
|
2019-03-13 22:48:36 +08:00
|
|
|
'fr': 'Français',
|
2020-03-26 18:10:44 +08:00
|
|
|
//'hi': 'हिन्दी',
|
2024-07-02 16:51:38 +08:00
|
|
|
'id': 'Bahasa Indonesia',
|
2019-04-26 21:22:29 +08:00
|
|
|
'it': 'Italiano',
|
2021-06-29 16:26:50 +08:00
|
|
|
'ja': '日本語',
|
2019-04-17 17:14:18 +08:00
|
|
|
'nb': 'Norwegian Bokmål',
|
2022-04-13 16:37:45 +08:00
|
|
|
//'nl': 'Nederlands'
|
2022-04-13 20:28:39 +08:00
|
|
|
'pl': 'Polski',
|
2017-05-16 20:32:54 +08:00
|
|
|
'pt-br': 'Português do Brasil',
|
2022-09-01 16:22:41 +08:00
|
|
|
'pt-pt': 'Português do Portugal',
|
2017-05-16 20:32:54 +08:00
|
|
|
'ro': 'Română',
|
2019-03-13 22:48:36 +08:00
|
|
|
'ru': 'Русский',
|
2020-03-21 21:57:49 +08:00
|
|
|
//'sv': 'Svenska',
|
2019-06-20 16:57:56 +08:00
|
|
|
//'te': 'తెలుగు',
|
2022-04-19 17:03:48 +08:00
|
|
|
'uk': 'Українська',
|
2023-11-23 11:43:21 +08:00
|
|
|
'zh': '中文(簡體)',
|
2017-02-21 01:29:06 +08:00
|
|
|
};
|
|
|
|
|
2024-03-26 00:52:03 +08:00
|
|
|
var Messages = {};
|
2017-11-09 21:23:40 +08:00
|
|
|
var LS_LANG = "CRYPTPAD_LANG";
|
2017-12-01 21:49:21 +08:00
|
|
|
var getStoredLanguage = function () { return localStorage && localStorage.getItem(LS_LANG); };
|
2017-11-09 21:23:40 +08:00
|
|
|
var getBrowserLanguage = function () { return navigator.language || navigator.userLanguage || ''; };
|
2024-03-26 00:52:03 +08:00
|
|
|
var getLanguage = Messages._getLanguage = function () {
|
2017-09-18 20:26:54 +08:00
|
|
|
if (window.cryptpadLanguage) { return window.cryptpadLanguage; }
|
2020-11-04 18:22:31 +08:00
|
|
|
try {
|
|
|
|
if (getStoredLanguage()) { return getStoredLanguage(); }
|
|
|
|
} catch (e) { console.log(e); }
|
2017-11-09 21:23:40 +08:00
|
|
|
var l = getBrowserLanguage();
|
2017-03-11 00:03:30 +08:00
|
|
|
// Edge returns 'fr-FR' --> transform it to 'fr' and check again
|
2017-11-09 21:23:40 +08:00
|
|
|
return map[l] ? l :
|
2019-08-23 22:19:45 +08:00
|
|
|
(map[l.split('-')[0]] ? l.split('-')[0] :
|
|
|
|
(map[l.split('_')[0]] ? l.split('_')[0] : 'en'));
|
2017-03-11 00:03:30 +08:00
|
|
|
};
|
|
|
|
var language = getLanguage();
|
2024-05-07 22:52:01 +08:00
|
|
|
window.cryptpadLanguage = language;
|
2017-03-11 00:03:30 +08:00
|
|
|
|
2019-01-30 21:38:21 +08:00
|
|
|
// Translations files were migrated from requirejs modules to json.
|
|
|
|
// To avoid asking every administrator to update their customized translation files,
|
|
|
|
// we use a requirejs map to redirect the old path to the new one and to use the
|
|
|
|
// requirejs json plugin
|
|
|
|
var reqPaths = {
|
|
|
|
"/common/translations/messages.js":"json!/common/translations/messages.json"
|
|
|
|
};
|
|
|
|
Object.keys(map).forEach(function (k) {
|
|
|
|
reqPaths["/common/translations/messages."+k+".js"] = "json!/common/translations/messages."+k+".json";
|
|
|
|
});
|
|
|
|
require.config({
|
|
|
|
map: {
|
|
|
|
"*": reqPaths
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2019-04-17 20:54:01 +08:00
|
|
|
var req = [
|
|
|
|
'/customize/application_config.js',
|
|
|
|
'/customize/translations/messages.js'
|
|
|
|
];
|
2017-02-21 01:29:06 +08:00
|
|
|
if (language && map[language]) { req.push('/customize/translations/messages.' + language + '.js'); }
|
|
|
|
|
2020-10-14 21:20:56 +08:00
|
|
|
define(req, function(AppConfig, Default, Language) {
|
2017-02-21 01:29:06 +08:00
|
|
|
map.en = 'English';
|
2016-09-15 00:08:52 +08:00
|
|
|
var defaultLanguage = 'en';
|
2014-11-03 23:07:39 +08:00
|
|
|
|
2019-04-17 20:54:01 +08:00
|
|
|
if (AppConfig.availableLanguages) {
|
|
|
|
if (AppConfig.availableLanguages.indexOf(language) === -1) {
|
|
|
|
language = defaultLanguage;
|
|
|
|
Language = Default;
|
2020-11-04 18:22:31 +08:00
|
|
|
try {
|
|
|
|
localStorage.setItem(LS_LANG, language);
|
|
|
|
} catch (e) { console.log(e); }
|
2019-04-17 20:54:01 +08:00
|
|
|
}
|
|
|
|
Object.keys(map).forEach(function (l) {
|
|
|
|
if (l === defaultLanguage) { return; }
|
|
|
|
if (AppConfig.availableLanguages.indexOf(l) === -1) {
|
|
|
|
delete map[l];
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2024-04-09 19:59:13 +08:00
|
|
|
let html = typeof(document) !== "undefined" && document.documentElement;
|
|
|
|
if (html) { html.setAttribute('lang', language); }
|
|
|
|
|
2019-05-28 20:28:51 +08:00
|
|
|
var extend = function (a, b) {
|
|
|
|
for (var k in b) {
|
|
|
|
if (Array.isArray(b[k])) {
|
|
|
|
a[k] = b[k].slice();
|
|
|
|
continue;
|
|
|
|
}
|
2020-10-14 21:20:56 +08:00
|
|
|
if (b[k] && typeof(b[k]) === "object") {
|
|
|
|
a[k] = (a[k] && typeof(a[k]) === "object" && !Array.isArray(a[k])) ? a[k] : {};
|
|
|
|
extend(a[k], b[k]);
|
|
|
|
continue;
|
|
|
|
}
|
2019-05-28 20:28:51 +08:00
|
|
|
a[k] = b[k] || a[k];
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2024-03-26 00:52:03 +08:00
|
|
|
extend(Messages, Default);
|
2017-12-01 21:49:21 +08:00
|
|
|
if (Language && language !== defaultLanguage) {
|
2016-09-16 00:35:09 +08:00
|
|
|
// Add the translated keys to the returned object
|
2024-03-26 00:52:03 +08:00
|
|
|
extend(Messages, Language);
|
2016-09-16 00:35:09 +08:00
|
|
|
}
|
2016-07-11 23:36:53 +08:00
|
|
|
|
2024-03-26 00:52:03 +08:00
|
|
|
Messages._languages = map;
|
|
|
|
Messages._languageUsed = language;
|
2016-10-25 21:22:35 +08:00
|
|
|
|
2016-09-16 00:35:09 +08:00
|
|
|
// Get keys with parameters
|
2024-03-26 00:52:03 +08:00
|
|
|
Messages._getKey = function (key, argArray) {
|
|
|
|
if (!Messages[key]) { return '?'; }
|
|
|
|
var text = Messages[key];
|
2017-02-21 19:29:47 +08:00
|
|
|
if (typeof(text) === 'string') {
|
|
|
|
return text.replace(/\{(\d+)\}/g, function (str, p1) {
|
2018-01-02 19:13:43 +08:00
|
|
|
if (typeof(argArray[p1]) === 'string' || typeof(argArray[p1]) === "number") {
|
|
|
|
return argArray[p1];
|
|
|
|
}
|
|
|
|
console.error("Only strings and numbers can be used in _getKey params!");
|
|
|
|
return '';
|
2017-02-21 19:29:47 +08:00
|
|
|
});
|
|
|
|
} else {
|
|
|
|
return text;
|
|
|
|
}
|
2016-09-15 00:08:52 +08:00
|
|
|
};
|
2016-07-11 23:36:53 +08:00
|
|
|
|
2024-03-26 00:52:03 +08:00
|
|
|
return Messages;
|
2017-02-21 01:29:06 +08:00
|
|
|
|
2014-11-03 23:07:39 +08:00
|
|
|
});
|
2017-02-21 01:29:06 +08:00
|
|
|
}());
|