123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- // Converse.js (A browser based XMPP chat client)
- // http://conversejs.org
- //
- // This is the internationalization module.
- //
- // Copyright (c) 2013-2017, Jan-Carel Brand <jc@opkode.com>
- // Licensed under the Mozilla Public License (MPLv2)
- //
- /*global define */
- (function (root, factory) {
- define([
- "es6-promise",
- "jed",
- "lodash.noconflict",
- "moment",
- 'moment/locale/af',
- 'moment/locale/ar',
- 'moment/locale/bg',
- 'moment/locale/ca',
- 'moment/locale/cs',
- 'moment/locale/de',
- 'moment/locale/es',
- 'moment/locale/eu',
- 'moment/locale/fr',
- 'moment/locale/he',
- 'moment/locale/hi',
- 'moment/locale/hu',
- 'moment/locale/id',
- 'moment/locale/it',
- 'moment/locale/ja',
- 'moment/locale/nb',
- 'moment/locale/nl',
- 'moment/locale/pl',
- 'moment/locale/pt-br',
- 'moment/locale/ro',
- 'moment/locale/ru',
- 'moment/locale/tr',
- 'moment/locale/uk',
- 'moment/locale/zh-cn',
- 'moment/locale/zh-tw'
- ], factory);
- }(this, function (Promise, Jed, _, moment) {
- 'use strict';
- function detectLocale (library_check) {
- /* Determine which locale is supported by the user's system as well
- * as by the relevant library (e.g. converse.js or moment.js).
- *
- * Parameters:
- * (Function) library_check - Returns a boolean indicating whether
- * the locale is supported.
- */
- 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);
- }
- }
- if (window.navigator.browserLanguage && !locale) {
- locale = isLocaleAvailable(window.navigator.browserLanguage, library_check);
- }
- if (window.navigator.language && !locale) {
- locale = isLocaleAvailable(window.navigator.language, library_check);
- }
- if (window.navigator.systemLanguage && !locale) {
- locale = isLocaleAvailable(window.navigator.systemLanguage, library_check);
- }
- return locale || 'en';
- }
- function isMomentLocale (locale) {
- return _.includes(moment.locales(), locale);
- }
- function isConverseLocale (locale, supported_locales) {
- return _.isString(locale) && _.includes(supported_locales, locale);
- }
- function getLocale (preferred_locale, isSupportedByLibrary) {
- if (_.isString(preferred_locale)) {
- if (preferred_locale === 'en' || isSupportedByLibrary(preferred_locale)) {
- return preferred_locale;
- }
- }
- return detectLocale(isSupportedByLibrary) || 'en';
- }
- function isLocaleAvailable (locale, available) {
- /* Check whether the locale or sub locale (e.g. en-US, en) is supported.
- *
- * Parameters:
- * (String) locale - The locale to check for
- * (Function) available - returns a boolean indicating whether the locale is supported
- */
- if (available(locale)) {
- return locale;
- } else {
- var sublocale = locale.split("-")[0];
- if (sublocale !== locale && available(sublocale)) {
- return sublocale;
- }
- }
- }
- let jed_instance;
- return {
- setLocales (preferred_locale, _converse) {
- _converse.locale = getLocale(
- preferred_locale,
- _.partial(isConverseLocale, _, _converse.locales)
- );
- moment.locale(getLocale(preferred_locale, isMomentLocale));
- },
- translate (str) {
- if (_.isNil(jed_instance)) {
- return Jed.sprintf.apply(Jed, arguments);
- }
- var t = jed_instance.translate(str);
- if (arguments.length>1) {
- return t.fetch.apply(t, [].slice.call(arguments, 1));
- } else {
- return t.fetch();
- }
- },
- fetchTranslations (locale, supported_locales, locale_url) {
- /* Fetch the translations for the given local at the given URL.
- *
- * Parameters:
- * (String) locale: The given i18n locale
- * (Array) supported_locales: List of locales supported
- * (String) locale_url: The URL from which the translations
- * should be fetched.
- */
- return new Promise((resolve, reject) => {
- if (!isConverseLocale(locale, supported_locales) || locale === 'en') {
- return resolve();
- }
- const xhr = new XMLHttpRequest();
- xhr.open('GET', locale_url, true);
- xhr.setRequestHeader(
- 'Accept',
- "application/json, text/javascript"
- );
- xhr.onload = function () {
- if (xhr.status >= 200 && xhr.status < 400) {
- try {
- const data = window.JSON.parse(xhr.responseText);
- jed_instance = new Jed(data);
- resolve();
- } catch (e) {
- xhr.onerror(e);
- }
- } else {
- xhr.onerror();
- }
- };
- xhr.onerror = (e) => {
- const err_message = e ? ` Error: ${e.message}` : '';
- reject(new Error(`Could not fetch translations. Status: ${xhr.statusText}. ${err_message}`));
- }
- xhr.send();
- });
- }
- };
- }));
|