mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-14 23:17:33 +08:00
251 lines
6.5 KiB
JavaScript
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;
|
|
}
|