Files
ezbookkeeping/src/lib/i18n.js
T
2020-11-22 13:48:59 +08:00

251 lines
6.5 KiB
JavaScript

import { defaultLanguage, allLanguages } from '../locales/index.js';
const apiNotFoundErrorCode = 100001;
const specifiedApiNotFoundErrors = {
'/api/register.json': {
message: 'User registration is disabled'
}
};
const validatorErrorCode = 200000;
const parameterizedErrors = [
{
localeKey: 'parameter invalid',
regex: /^parameter "(\w+)" is invalid$/,
parameters: [{
field: 'parameter',
localized: true
}]
},
{
localeKey: 'parameter required',
regex: /^parameter "(\w+)" is required$/,
parameters: [{
field: 'parameter',
localized: true
}]
},
{
localeKey: 'parameter too long',
regex: /^parameter "(\w+)" must be less than (\d+)$/,
parameters: [{
field: 'parameter',
localized: true
}, {
field: 'length',
localized: false
}]
},
{
localeKey: 'parameter too short',
regex: /^parameter "(\w+)" must be more than (\d+)$/,
parameters: [{
field: 'parameter',
localized: true
}, {
field: 'length',
localized: false
}]
},
{
localeKey: 'parameter length not equal',
regex: /^parameter "(\w+)" length is not equal to (\d+)$/,
parameters: [{
field: 'parameter',
localized: true
}, {
field: 'length',
localized: false
}]
},
{
localeKey: 'parameter cannot be blank',
regex: /^parameter "(\w+)" cannot be blank$/,
parameters: [{
field: 'parameter',
localized: true
}]
},
{
localeKey: 'parameter invalid username format',
regex: /^parameter "(\w+)" is invalid username format$/,
parameters: [{
field: 'parameter',
localized: true
}]
},
{
localeKey: 'parameter invalid email format',
regex: /^parameter "(\w+)" is invalid email format$/,
parameters: [{
field: 'parameter',
localized: true
}]
},
{
localeKey: 'parameter invalid currency',
regex: /^parameter "(\w+)" is invalid currency$/,
parameters: [{
field: 'parameter',
localized: true
}]
},
{
localeKey: 'parameter invalid color',
regex: /^parameter "(\w+)" is invalid color$/,
parameters: [{
field: 'parameter',
localized: true
}]
}
];
export function getAllLanguages() {
return allLanguages;
}
export function getLanguage(locale) {
return allLanguages[locale];
}
export function getDefaultLanguage() {
if (!window || !window.navigator) {
return defaultLanguage;
}
let browserLocale = window.navigator.browserLanguage || window.navigator.language;
if (!browserLocale) {
return defaultLanguage;
}
if (!allLanguages[browserLocale]) {
const locale = getLocaleFromLanguageAlias(browserLocale);
if (locale) {
browserLocale = locale;
}
}
if (!allLanguages[browserLocale] && browserLocale.split('-').length > 1) { // maybe language-script-region
const localeParts = browserLocale.split('-');
browserLocale = localeParts[0] + '-' + localeParts[1];
if (!allLanguages[browserLocale]) {
const locale = getLocaleFromLanguageAlias(browserLocale);
if (locale) {
browserLocale = locale;
}
}
}
if (!allLanguages[browserLocale]) {
return defaultLanguage;
}
return browserLocale;
}
export function getI18nOptions() {
return {
locale: defaultLanguage,
fallbackLocale: defaultLanguage,
formatFallbackMessages: true,
messages: (function () {
const messages = {};
for (let locale in allLanguages) {
if (!Object.prototype.hasOwnProperty.call(allLanguages, locale)) {
continue;
}
const lang = allLanguages[locale];
messages[locale] = lang.content;
}
return messages;
})()
};
}
export function getLocalizedError(error) {
if (error.errorCode === apiNotFoundErrorCode && specifiedApiNotFoundErrors[error.path]) {
return {
message: `${specifiedApiNotFoundErrors[error.path].message}`
};
}
if (error.errorCode !== validatorErrorCode) {
return {
message: `error.${error.errorMessage}`
};
}
for (let i = 0; i < parameterizedErrors.length; i++) {
const errorInfo = parameterizedErrors[i];
const matches = error.errorMessage.match(errorInfo.regex);
if (matches && matches.length === errorInfo.parameters.length + 1) {
return {
message: `parameterizedError.${errorInfo.localeKey}`,
parameters: errorInfo.parameters.map((param, index) => {
return {
key: param.field,
localized: param.localized,
value: matches[index + 1]
}
})
};
}
}
return {
message: `error.${error.errorMessage}`
};
}
export function getLocalizedErrorParameters(parameters, i18nFunc) {
let localizedParameters = {};
if (parameters) {
for (let i = 0; i < parameters.length; i++) {
const parameter = parameters[i];
if (parameter.localized) {
localizedParameters[parameter.key] = i18nFunc(`parameter.${parameter.value}`);
} else {
localizedParameters[parameter.key] = parameter.value;
}
}
}
return localizedParameters;
}
function getLocaleFromLanguageAlias(alias) {
for (let locale in allLanguages) {
if (!Object.prototype.hasOwnProperty.call(allLanguages, locale)) {
continue;
}
if (locale.toLowerCase() === alias.toLowerCase()) {
return locale;
}
const lang = allLanguages[locale];
const aliases = lang.aliases;
if (!aliases || aliases.length < 1) {
continue;
}
for (let i = 0; i < aliases.length; i++) {
if (aliases[i].toLowerCase() === alias.toLowerCase()) {
return locale;
}
}
}
return null;
}