stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
420 lines • 15 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.defaultTranslatorFunction = exports.Streami18n = void 0;
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _dayjs = _interopRequireDefault(require("dayjs"));
var _calendar = _interopRequireDefault(require("dayjs/plugin/calendar"));
var _duration = _interopRequireDefault(require("dayjs/plugin/duration"));
var _localeData = _interopRequireDefault(require("dayjs/plugin/localeData"));
var _localizedFormat = _interopRequireDefault(require("dayjs/plugin/localizedFormat"));
var _relativeTime = _interopRequireDefault(require("dayjs/plugin/relativeTime"));
var _updateLocale = _interopRequireDefault(require("dayjs/plugin/updateLocale"));
var _utc = _interopRequireDefault(require("dayjs/plugin/utc"));
var _i18next = _interopRequireDefault(require("i18next"));
var _calendarFormats = require("./calendarFormats");
var _predefinedFormatters = require("./predefinedFormatters");
var _ar = _interopRequireDefault(require("../../i18n/ar.json"));
var _en = _interopRequireDefault(require("../../i18n/en.json"));
var _es = _interopRequireDefault(require("../../i18n/es.json"));
var _fr = _interopRequireDefault(require("../../i18n/fr.json"));
var _he = _interopRequireDefault(require("../../i18n/he.json"));
var _hi = _interopRequireDefault(require("../../i18n/hi.json"));
var _it = _interopRequireDefault(require("../../i18n/it.json"));
var _ja = _interopRequireDefault(require("../../i18n/ja.json"));
var _ko = _interopRequireDefault(require("../../i18n/ko.json"));
var _nl = _interopRequireDefault(require("../../i18n/nl.json"));
var _ptBr = _interopRequireDefault(require("../../i18n/pt-br.json"));
var _ru = _interopRequireDefault(require("../../i18n/ru.json"));
var _tr = _interopRequireDefault(require("../../i18n/tr.json"));
require("dayjs/locale/ar");
require("dayjs/locale/es");
require("dayjs/locale/fr");
require("dayjs/locale/he");
require("dayjs/locale/hi");
require("dayjs/locale/it");
require("dayjs/locale/ja");
require("dayjs/locale/ko");
require("dayjs/locale/nl");
require("dayjs/locale/pt-br");
require("dayjs/locale/ru");
require("dayjs/locale/tr");
require("dayjs/locale/en");
var defaultNS = 'translation';
var defaultLng = 'en';
_dayjs.default.extend(_updateLocale.default);
_dayjs.default.extend(_utc.default);
_dayjs.default.updateLocale('en', {
calendar: _calendarFormats.calendarFormats.en,
format: {
L: 'DD/MM/YYYY',
LL: 'D MMMM YYYY',
LLL: 'D MMMM YYYY HH:mm',
LLLL: 'dddd, D MMMM YYYY HH:mm',
LT: 'hh:mmA',
LTS: 'HH:mm:ss'
}
});
_dayjs.default.updateLocale('ar', {
calendar: _calendarFormats.calendarFormats.ar
});
_dayjs.default.updateLocale('es', {
calendar: _calendarFormats.calendarFormats.es
});
_dayjs.default.updateLocale('fr', {
calendar: _calendarFormats.calendarFormats.fr
});
_dayjs.default.updateLocale('he', {
calendar: _calendarFormats.calendarFormats.he
});
_dayjs.default.updateLocale('hi', {
calendar: _calendarFormats.calendarFormats.hi,
meridiem(hour) {
if (hour < 4) {
return 'रात';
}
if (hour < 10) {
return 'सुबह';
}
if (hour < 17) {
return 'दोपहर';
}
if (hour < 20) {
return 'शाम';
}
return 'रात';
},
meridiemHour(hour, meridiem) {
if (hour === 12) {
hour = 0;
}
if (meridiem === 'रात') {
return hour < 4 ? hour : hour + 12;
}
if (meridiem === 'सुबह') {
return hour;
}
if (meridiem === 'दोपहर') {
return hour >= 10 ? hour : hour + 12;
}
if (meridiem === 'शाम') {
return hour + 12;
}
return hour;
},
meridiemParse: /रात|सुबह|दोपहर|शाम/
});
_dayjs.default.updateLocale('it', {
calendar: _calendarFormats.calendarFormats.it
});
_dayjs.default.updateLocale('ja', {
calendar: _calendarFormats.calendarFormats.ja
});
_dayjs.default.updateLocale('ko', {
calendar: _calendarFormats.calendarFormats.ko
});
_dayjs.default.updateLocale('nl', {
calendar: _calendarFormats.calendarFormats.nl
});
_dayjs.default.updateLocale('pt-br', {
calendar: _calendarFormats.calendarFormats['pt-br']
});
_dayjs.default.updateLocale('ru', {
calendar: _calendarFormats.calendarFormats.ru
});
_dayjs.default.updateLocale('tr', {
calendar: _calendarFormats.calendarFormats.tr
});
var en_locale = {
formats: {},
months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
relativeTime: {},
weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
};
var isDayJs = dateTimeParser => dateTimeParser.extend !== undefined;
var supportsTz = dateTimeParser => dateTimeParser.tz !== undefined;
var defaultStreami18nOptions = {
DateTimeParser: _dayjs.default,
dayjsLocaleConfigForLanguage: null,
debug: false,
disableDateTimeTranslations: false,
language: 'en',
logger: msg => console.warn(msg)
};
var defaultTranslatorFunction = key => key;
exports.defaultTranslatorFunction = defaultTranslatorFunction;
class Streami18n {
i18nInstance = _i18next.default.createInstance();
Dayjs = null;
initialized = false;
onLanguageChangeListeners = [];
onTFunctionOverrideListeners = [];
t = defaultTranslatorFunction;
translations = {
ar: {
[defaultNS]: _ar.default
},
en: {
[defaultNS]: _en.default
},
es: {
[defaultNS]: _es.default
},
fr: {
[defaultNS]: _fr.default
},
he: {
[defaultNS]: _he.default
},
hi: {
[defaultNS]: _hi.default
},
it: {
[defaultNS]: _it.default
},
ja: {
[defaultNS]: _ja.default
},
ko: {
[defaultNS]: _ko.default
},
nl: {
[defaultNS]: _nl.default
},
'pt-BR': {
[defaultNS]: _ptBr.default
},
ru: {
[defaultNS]: _ru.default
},
tr: {
[defaultNS]: _tr.default
}
};
dayjsLocales = {};
formatters = _predefinedFormatters.predefinedFormatters;
constructor(options = {}, i18nextConfig = {}) {
var finalOptions = {
...defaultStreami18nOptions,
...options
};
this.logger = finalOptions.logger;
this.currentLanguage = finalOptions.language;
this.DateTimeParser = finalOptions.DateTimeParser;
this.timezone = finalOptions.timezone;
this.formatters = {
..._predefinedFormatters.predefinedFormatters,
...(options == null ? void 0 : options.formatters)
};
try {
if (this.DateTimeParser && isDayJs(this.DateTimeParser)) {
this.DateTimeParser.extend(_duration.default);
this.DateTimeParser.extend(_localizedFormat.default);
this.DateTimeParser.extend(_calendar.default);
this.DateTimeParser.extend(_localeData.default);
this.DateTimeParser.extend(_relativeTime.default);
}
} catch (error) {
throw new Error(`Streami18n: Looks like you wanted to provide a Dayjs instance but something went wrong while adding plugins ${JSON.stringify(error)}`);
}
this.isCustomDateTimeParser = !!options.DateTimeParser;
var translationsForLanguage = finalOptions.translationsForLanguage;
if (translationsForLanguage) {
this.translations[this.currentLanguage] = {
[defaultNS]: this.translations[this.currentLanguage] && this.translations[this.currentLanguage][defaultNS] ? {
...this.translations[this.currentLanguage][defaultNS],
...translationsForLanguage
} : translationsForLanguage
};
}
if (!this.translations[this.currentLanguage]) {
this.translations[this.currentLanguage] = {
[defaultNS]: {}
};
}
this.i18nextConfig = {
debug: finalOptions.debug,
fallbackLng: false,
interpolation: {
escapeValue: false,
formatSeparator: '|'
},
keySeparator: false,
lng: this.currentLanguage,
nsSeparator: false,
parseMissingKeyHandler: key => {
this.logger(`Streami18n: Missing translation for key: ${key}`);
return key;
},
...i18nextConfig
};
this.validateCurrentLanguage();
var dayjsLocaleConfigForLanguage = finalOptions.dayjsLocaleConfigForLanguage;
if (dayjsLocaleConfigForLanguage) {
this.addOrUpdateLocale(this.currentLanguage, {
...dayjsLocaleConfigForLanguage
});
} else if (!this.localeExists(this.currentLanguage)) {
this.logger(`Streami18n: Streami18n(...) - Locale config for ${this.currentLanguage} does not exist in momentjs.` + `Please import the locale file using "import 'moment/locale/${this.currentLanguage}';" in your app or ` + 'register the locale config with Streami18n using registerTranslation(language, translation, customDayjsLocale)');
}
this.tDateTimeParser = timestamp => {
var language = finalOptions.disableDateTimeTranslations || !this.localeExists(this.currentLanguage) ? defaultLng : this.currentLanguage;
if (!isDayJs(this.DateTimeParser)) {
return supportsTz(this.DateTimeParser) && this.timezone ? this.DateTimeParser(timestamp).tz(this.timezone).locale(language) : this.DateTimeParser(timestamp).locale(language);
}
return this.DateTimeParser(timestamp).locale(language);
};
}
init() {
var _this = this;
return (0, _asyncToGenerator2.default)(function* () {
_this.validateCurrentLanguage();
try {
_this.t = yield _this.i18nInstance.init({
..._this.i18nextConfig,
lng: _this.currentLanguage,
resources: _this.translations
});
if (_this.queuedTFunctionOverride) {
_this.t = _this.queuedTFunctionOverride;
_this.queuedTFunctionOverride = undefined;
_this.onTFunctionOverrideListeners.forEach(listener => listener(_this.t));
}
_this.initialized = true;
if (_this.formatters) {
Object.entries(_this.formatters).forEach(([name, formatterFactory]) => {
var _this$i18nInstance$se;
if (!formatterFactory) {
return;
}
(_this$i18nInstance$se = _this.i18nInstance.services.formatter) == null || _this$i18nInstance$se.add(name, formatterFactory(_this));
});
}
} catch (error) {
_this.logger(`Something went wrong with init: ${JSON.stringify(error)}`);
}
_this.waitForInitializing = undefined;
})();
}
localeExists = language => {
if (this.isCustomDateTimeParser) {
return true;
}
return Object.keys(_dayjs.default.Ls).indexOf(language) > -1;
};
validateCurrentLanguage = () => {
var availableLanguages = Object.keys(this.translations);
if (availableLanguages.indexOf(this.currentLanguage) === -1) {
this.logger(`Streami18n: '${this.currentLanguage}' language is not registered.` + ` Please make sure to call streami18n.registerTranslation('${this.currentLanguage}', {...}) or ` + `use one the built-in supported languages - ${this.getAvailableLanguages()}`);
this.currentLanguage = defaultLng;
}
};
geti18Instance = () => this.i18nInstance;
getAvailableLanguages = () => Object.keys(this.translations);
getTranslations = () => this.translations;
getTranslators() {
var _this2 = this;
return (0, _asyncToGenerator2.default)(function* () {
if (!_this2.initialized) {
if (_this2.waitForInitializing) {
yield _this2.waitForInitializing;
} else {
if (_this2.dayjsLocales[_this2.currentLanguage]) {
_this2.addOrUpdateLocale(_this2.currentLanguage, _this2.dayjsLocales[_this2.currentLanguage]);
}
var initPromise = _this2.init();
_this2.waitForInitializing = initPromise;
yield initPromise;
}
}
return {
t: _this2.t,
tDateTimeParser: _this2.tDateTimeParser
};
})();
}
registerTranslation(language, translation, customDayjsLocale) {
if (!translation) {
this.logger('Streami18n: registerTranslation(language, translation, customDayjsLocale) called without translation');
return;
}
if (!this.translations[language]) {
this.translations[language] = {
[defaultNS]: translation
};
} else {
this.translations[language][defaultNS] = translation;
}
if (customDayjsLocale) {
this.dayjsLocales[language] = {
...customDayjsLocale
};
} else if (!this.localeExists(language)) {
this.logger('Streami18n: registerTranslation(language, translation, customDayjsLocale) - ' + `Locale config for ${language} does not exist in Dayjs.` + `Please import the locale file using "import 'dayjs/locale/${language}';" in your app or ` + 'register the locale config with Streami18n using registerTranslation(language, translation, customDayjsLocale)');
}
if (this.initialized) {
this.i18nInstance.addResources(language, defaultNS, translation);
}
}
addOrUpdateLocale(key, config) {
if (this.localeExists(key)) {
_dayjs.default.updateLocale(key, {
...config
});
} else {
_dayjs.default.locale({
name: key,
...en_locale,
...config
}, undefined, true);
}
}
setLanguage(language) {
var _this3 = this;
return (0, _asyncToGenerator2.default)(function* () {
_this3.currentLanguage = language;
if (!_this3.initialized) {
return;
}
try {
var t = yield _this3.i18nInstance.changeLanguage(language);
if (_this3.dayjsLocales[language]) {
_this3.addOrUpdateLocale(_this3.currentLanguage, _this3.dayjsLocales[_this3.currentLanguage]);
}
_this3.t = t;
_this3.onLanguageChangeListeners.forEach(listener => listener(t));
return t;
} catch (error) {
_this3.logger(`Failed to set language: ${JSON.stringify(error)}`);
return _this3.t;
}
})();
}
addOnLanguageChangeListener(callback) {
this.onLanguageChangeListeners.push(callback);
return {
unsubscribe: () => {
this.onLanguageChangeListeners = this.onLanguageChangeListeners.filter(listener => listener !== callback);
}
};
}
addOnTFunctionOverrideListener(callback) {
this.onTFunctionOverrideListeners.push(callback);
return {
unsubscribe: () => {
this.onTFunctionOverrideListeners = this.onTFunctionOverrideListeners.filter(listener => listener !== callback);
}
};
}
overrideTFunction(tFunction) {
if (!this.initialized) {
this.queuedTFunctionOverride = tFunction;
} else {
this.t = tFunction;
this.onTFunctionOverrideListeners.forEach(listener => listener(tFunction));
}
}
}
exports.Streami18n = Streami18n;
//# sourceMappingURL=Streami18n.js.map