98 lines
3.2 KiB
TypeScript
Raw Normal View History

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 {
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) {
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 {
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();
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 {
let localeCode = (navigator.languages && navigator.languages[0]) || navigator.language;
2021-02-13 10:10:02 -08:00
// Just remove the variant ...
localeCode = localeCode.split('-')[0];
2021-02-13 10:10:02 -08:00
let result = Locales.EN;
2021-02-13 10:10:02 -08:00
try {
result = localeFromStr(localeCode);
2021-02-13 10:10:02 -08:00
} catch {
console.warn(`Unsupported languange code ${localeCode}`);
2021-02-13 10:10:02 -08:00
}
return result;
2021-02-13 10:10:02 -08: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 => {
const locales: Locale[] = Object.values(Locales);
2021-02-13 10:10:02 -08:00
const result = locales.find((l) => l.code == code);
2021-02-13 10:10:02 -08:00
if (!result) {
throw `Language code could not be found in list of default supported: + ${code}`;
2021-02-13 10:10:02 -08:00
}
return result;
};