2021-02-23 07:02:15 +00:00
|
|
|
|
import { fetchAccount } from './../../redux/clientSlice';
|
|
|
|
|
import 'dayjs/locale/fr';
|
|
|
|
|
import 'dayjs/locale/en';
|
|
|
|
|
import 'dayjs/locale/es';
|
2022-03-14 00:17:41 -03:00
|
|
|
|
import 'dayjs/locale/de';
|
2022-02-24 16:42:55 -08:00
|
|
|
|
import 'dayjs/locale/ru';
|
2022-03-14 00:17:41 -03:00
|
|
|
|
import 'dayjs/locale/zh';
|
2021-02-14 17:53:37 -08:00
|
|
|
|
|
2021-02-13 10:10:02 -08:00
|
|
|
|
export class Locale {
|
2021-02-23 07:02:15 +00:00
|
|
|
|
code: LocaleCode;
|
|
|
|
|
label: string;
|
|
|
|
|
message: Record<string, string>;
|
2021-02-13 10:10:02 -08:00
|
|
|
|
|
2021-02-16 21:51:59 -08:00
|
|
|
|
constructor(code: LocaleCode, label: string, message: unknown) {
|
2021-02-23 07:02:15 +00:00
|
|
|
|
this.code = code;
|
|
|
|
|
this.label = label;
|
|
|
|
|
this.message = message as Record<string, string>;
|
2021-02-13 10:10:02 -08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-09 16:36:31 -08:00
|
|
|
|
export default abstract class AppI18n {
|
2022-03-14 23:17:28 -03:00
|
|
|
|
private static LOCAL_STORAGE_KEY = 'user.locale';
|
|
|
|
|
|
2022-02-09 16:36:31 -08:00
|
|
|
|
public static getUserLocale(): Locale {
|
2022-02-23 16:28:47 -08:00
|
|
|
|
// @Todo Hack: Try page must not account info. Add this to avoid 403 errors.
|
|
|
|
|
const isTryPage = window.location.href.endsWith('/try');
|
|
|
|
|
let result: Locale;
|
|
|
|
|
if (!isTryPage) {
|
|
|
|
|
const account = fetchAccount();
|
2022-03-14 23:17:28 -03:00
|
|
|
|
result = account?.locale ? account.locale : this.getDefaultLocale();
|
|
|
|
|
|
|
|
|
|
// If the local storage value is different, update ...
|
|
|
|
|
if (account?.locale && result.code !== localStorage.getItem(AppI18n.LOCAL_STORAGE_KEY)) {
|
|
|
|
|
localStorage.setItem(AppI18n.LOCAL_STORAGE_KEY, result.code);
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-23 16:28:47 -08:00
|
|
|
|
} else {
|
2022-03-14 23:20:58 -03:00
|
|
|
|
result = this.getDefaultLocale();
|
2022-02-23 16:28:47 -08:00
|
|
|
|
}
|
|
|
|
|
return result;
|
2021-02-13 10:10:02 -08:00
|
|
|
|
}
|
|
|
|
|
|
2022-02-09 16:36:31 -08:00
|
|
|
|
public static getBrowserLocale(): Locale {
|
2021-02-23 07:02:15 +00:00
|
|
|
|
let localeCode = (navigator.languages && navigator.languages[0]) || navigator.language;
|
2021-02-13 10:10:02 -08:00
|
|
|
|
|
|
|
|
|
// Just remove the variant ...
|
2021-02-23 07:02:15 +00:00
|
|
|
|
localeCode = localeCode.split('-')[0];
|
2021-02-13 10:10:02 -08:00
|
|
|
|
|
2021-02-23 07:02:15 +00:00
|
|
|
|
let result = Locales.EN;
|
2021-02-13 10:10:02 -08:00
|
|
|
|
try {
|
2021-02-23 07:02:15 +00:00
|
|
|
|
result = localeFromStr(localeCode);
|
2021-02-13 10:10:02 -08:00
|
|
|
|
} catch {
|
2021-02-23 07:02:15 +00:00
|
|
|
|
console.warn(`Unsupported languange code ${localeCode}`);
|
2021-02-13 10:10:02 -08:00
|
|
|
|
}
|
|
|
|
|
|
2021-02-23 07:02:15 +00:00
|
|
|
|
return result;
|
2021-02-13 10:10:02 -08:00
|
|
|
|
}
|
2022-03-14 23:17:28 -03:00
|
|
|
|
|
|
|
|
|
public static getDefaultLocale(): Locale {
|
|
|
|
|
// Fetch local from local storage ...
|
|
|
|
|
let result: Locale;
|
|
|
|
|
const userLocaleCode: string = localStorage.getItem(AppI18n.LOCAL_STORAGE_KEY);
|
|
|
|
|
if (userLocaleCode) {
|
|
|
|
|
result = localeFromStr(userLocaleCode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Ok, use browser default ...
|
|
|
|
|
if (!result) {
|
|
|
|
|
result = this.getBrowserLocale();
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
2021-02-13 10:10:02 -08:00
|
|
|
|
}
|
|
|
|
|
|
2022-03-13 23:26:24 -03:00
|
|
|
|
export type LocaleCode = 'en' | 'es' | 'fr' | 'de' | 'ru' | 'zh';
|
2021-02-13 10:10:02 -08:00
|
|
|
|
|
2021-02-22 22:37:29 -08:00
|
|
|
|
export const Locales = {
|
2021-10-02 16:27:13 -07:00
|
|
|
|
EN: new Locale('en', 'English', require('./../../compiled-lang/en.json')), // eslint-disable-line
|
|
|
|
|
ES: new Locale('es', 'Español', require('./../../compiled-lang/es.json')), // eslint-disable-line
|
|
|
|
|
DE: new Locale('fr', 'Français', require('./../../compiled-lang/fr.json')), // eslint-disable-line
|
|
|
|
|
FR: new Locale('de', 'Deutsch', require('./../../compiled-lang/de.json')), // eslint-disable-line
|
2022-02-24 16:42:55 -08:00
|
|
|
|
RU: new Locale('ru', 'Pусский', require('./../../compiled-lang/ru.json')), // eslint-disable-line
|
2022-03-14 14:37:45 -03:00
|
|
|
|
ZH: new Locale('zh', '中文 (简体)', require('./../../compiled-lang/zh.json')), // eslint-disable-line
|
2021-10-02 16:27:13 -07:00
|
|
|
|
|
2022-03-13 23:26:24 -03:00
|
|
|
|
};
|
2022-02-24 16:42:55 -08:00
|
|
|
|
|
2021-02-13 10:10:02 -08:00
|
|
|
|
export const localeFromStr = (code: string): Locale => {
|
2021-02-23 07:02:15 +00:00
|
|
|
|
const locales: Locale[] = Object.values(Locales);
|
2021-02-13 10:10:02 -08:00
|
|
|
|
|
2021-02-23 07:02:15 +00:00
|
|
|
|
const result = locales.find((l) => l.code == code);
|
2021-02-13 10:10:02 -08:00
|
|
|
|
|
|
|
|
|
if (!result) {
|
2021-02-23 07:02:15 +00:00
|
|
|
|
throw `Language code could not be found in list of default supported: + ${code}`;
|
2021-02-13 10:10:02 -08:00
|
|
|
|
}
|
|
|
|
|
|
2021-02-23 07:02:15 +00:00
|
|
|
|
return result;
|
|
|
|
|
};
|