jodit
Version:
Jodit is awesome and usefully wysiwyg editor with filebrowser
154 lines (127 loc) • 3.35 kB
text/typescript
/*!
* Jodit Editor (https://xdsoft.net/jodit/)
* Released under MIT see LICENSE.txt in the project root for license information.
* Copyright (c) 2013-2020 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
*/
import { IDictionary, ILanguageOptions } from '../../../types';
import { Config } from '../../../config';
import { defaultLanguage as defineLanguage } from '../default-language';
import { ucfirst, isString, error } from '../index';
import { lang } from '../../global';
/**
* Simple variant sprintf function
*
* @param str
* @param args
*/
export const sprintf = (str: string, args?: Array<string | number>): string => {
if (!args || !args.length) {
return str;
}
const reg = /%([sd])/g;
let fnd = reg.exec(str);
let res = str,
i = 0;
while (fnd && args[i] !== undefined) {
res = res.replace(fnd[0], args[i].toString());
i += 1;
fnd = reg.exec(str);
}
return res;
};
/**
* Internationalization method. Uses Jodit.lang object
*
* @param {string} key Some text
* @param {string[]} params Some text
* @return {string}
* @example
* ```javascript
* var editor = new Jodit("#redactor", {
* langusage: 'ru'
* });
* console.log(editor.i18n('Cancel')) //Отмена;
*
* Jodit.defaultOptions.language = 'ru';
* console.log(Jodit.prototype.i18n('Cancel')) //Отмена
*
* Jodit.lang.cs = {
* Cancel: 'Zrušit'
* };
* Jodit.defaultOptions.language = 'cs';
* console.log(Jodit.prototype.i18n('Cancel')) //Zrušit
*
* Jodit.lang.cs = {
* 'Hello world': 'Hello \s Good \s'
* };
* Jodit.defaultOptions.language = 'cs';
* console.log(Jodit.prototype.i18n('Hello world', 'mr.Perkins', 'day')) //Hello mr.Perkins Good day
* ```
*/
export const i18n = (
key: string,
params?: Array<string | number>,
options?: ILanguageOptions
): string => {
if (!isString(key)) {
throw error('i18n: Need string in first argument');
}
const debug: boolean = Boolean(
options !== undefined && options.debugLanguage
);
let store: IDictionary;
const parse = (value: string): string =>
params && params.length ? sprintf(value, params) : value,
defaultLanguage = defineLanguage(
Config.defaultOptions.language,
Config.defaultOptions.language
),
language = defineLanguage(options?.language, defaultLanguage),
tryGet = (store: IDictionary): string | undefined => {
if (!store) {
return;
}
if (isString(store[key])) {
return parse(store[key]);
}
const lcKey = key.toLowerCase();
if (isString(store[lcKey])) {
return parse(store[lcKey]);
}
const ucfKey = ucfirst(key);
if (isString(store[ucfKey])) {
return parse(store[ucfKey]);
}
return;
};
if (lang[language] !== undefined) {
store = lang[language];
} else {
if (lang[defaultLanguage] !== undefined) {
store = lang[defaultLanguage];
} else {
store = lang.en;
}
}
const i18nOvr = options?.i18n;
if (i18nOvr && i18nOvr[language]) {
const result = tryGet(i18nOvr[language]);
if (result) {
return result;
}
}
const result = tryGet(store);
if (result) {
return result;
}
if (lang.en && isString(lang.en[key]) && lang.en[key]) {
return parse(lang.en[key]);
}
if (debug) {
return '{' + key + '}';
}
if (!isProd && language !== 'en') {
console.warn(`i18n need "${key}" in "${language}"`);
}
return parse(key);
};