xmpp.chapril.org-conversejs/src/headless/i18n.js

113 lines
3.7 KiB
JavaScript
Raw Normal View History

// Converse.js (A browser based XMPP chat client)
// https://conversejs.org
//
// This is the internationalization module.
//
2018-09-06 16:03:22 +02:00
// Copyright (c) 2013-2017, Jan-Carel Brand <jc@opkode.com>
// Licensed under the Mozilla Public License (MPLv2)
//
2018-11-15 11:51:43 +01:00
import Jed from "jed";
2019-05-06 11:16:56 +02:00
import dayjs from "dayjs";
2018-11-15 11:51:43 +01:00
function detectLocale (library_check) {
/* Determine which locale is supported by the user's system as well
2019-05-06 11:16:56 +02:00
* as by the relevant library (e.g. converse.js or dayjs).
* @param { Function } library_check - Returns a boolean indicating whether
* the locale is supported.
2018-11-15 11:51:43 +01:00
*/
var locale, i;
if (window.navigator.userLanguage) {
locale = isLocaleAvailable(window.navigator.userLanguage, library_check);
}
if (window.navigator.languages && !locale) {
for (i=0; i<window.navigator.languages.length && !locale; i++) {
locale = isLocaleAvailable(window.navigator.languages[i], library_check);
}
}
2018-11-15 11:51:43 +01:00
if (window.navigator.browserLanguage && !locale) {
locale = isLocaleAvailable(window.navigator.browserLanguage, library_check);
}
2018-11-15 11:51:43 +01:00
if (window.navigator.language && !locale) {
locale = isLocaleAvailable(window.navigator.language, library_check);
}
2018-11-15 11:51:43 +01:00
if (window.navigator.systemLanguage && !locale) {
locale = isLocaleAvailable(window.navigator.systemLanguage, library_check);
}
return locale || 'en';
}
2018-11-15 11:51:43 +01:00
function isConverseLocale (locale, supported_locales) {
return typeof locale === 'string' && supported_locales.includes(locale);
2018-11-15 11:51:43 +01:00
}
function getLocale (preferred_locale, isSupportedByLibrary) {
if (typeof preferred_locale === 'string') {
2018-11-15 11:51:43 +01:00
if (preferred_locale === 'en' || isSupportedByLibrary(preferred_locale)) {
return preferred_locale;
}
}
2018-11-15 11:51:43 +01:00
return detectLocale(isSupportedByLibrary) || 'en';
}
/* Check whether the locale or sub locale (e.g. en-US, en) is supported.
* @param { String } locale - The locale to check for
* @param { Function } available - Returns a boolean indicating whether the locale is supported
*/
2018-11-15 11:51:43 +01:00
function isLocaleAvailable (locale, available) {
if (available(locale)) {
return locale;
} else {
var sublocale = locale.split("-")[0];
if (sublocale !== locale && available(sublocale)) {
return sublocale;
}
}
2018-11-15 11:51:43 +01:00
}
2018-11-15 11:51:43 +01:00
let jed_instance;
/**
* @namespace i18n
*/
export const i18n = {
getLocale (preferred_locale, available_locales) {
return getLocale(preferred_locale, preferred => isConverseLocale(preferred, available_locales));
2018-11-15 11:51:43 +01:00
},
2018-11-15 11:51:43 +01:00
translate (str) {
if (!jed_instance) {
2018-11-15 11:51:43 +01:00
return Jed.sprintf.apply(Jed, arguments);
}
const t = jed_instance.translate(str);
if (arguments.length > 1) {
2018-11-15 11:51:43 +01:00
return t.fetch.apply(t, [].slice.call(arguments, 1));
} else {
return t.fetch();
}
},
/**
* Fetch the translations for the given local at the given URL.
* @private
* @method i18n#fetchTranslations
* @param { _converse }
*/
async fetchTranslations (_converse) {
const locale = _converse.locale;
if (!isConverseLocale(locale, _converse.locales) || locale === 'en') {
return;
}
const { default: data } = await import(/*webpackChunkName: "locales/[request]" */ `../../locale/${locale}/LC_MESSAGES/converse.po`);
await import(/*webpackChunkName: "locales/dayjs/[request]" */ `dayjs/locale/${locale.toLowerCase().replace('_', '-')}`);
dayjs.locale(getLocale(_converse.locale, l => dayjs.locale(l)));
jed_instance = new Jed(data);
2018-11-15 11:51:43 +01:00
}
};
export const __ = function () {
return i18n.translate.apply(i18n, arguments);
}