76 lines
1.4 KiB
TypeScript
76 lines
1.4 KiB
TypeScript
import Immerable from '@Models/GeneralImmer';
|
|
import tw from '@Langs/data/tw';
|
|
import en from '@Langs/data/en';
|
|
import { LangObject, LangList } from './types';
|
|
|
|
const LANGUAGE_BASE_LIST = [
|
|
{
|
|
lang: 'frontend.global.language.en',
|
|
value: 'en',
|
|
},
|
|
{
|
|
lang: 'frontend.global.language.tw',
|
|
value: 'tw',
|
|
},
|
|
];
|
|
|
|
class I18n extends Immerable {
|
|
public lang: string;
|
|
|
|
public langDefault: LangObject;
|
|
|
|
public langList: LangList;
|
|
|
|
public langBase: LangObject;
|
|
|
|
constructor(lang: string) {
|
|
super();
|
|
this.lang = lang;
|
|
this.langDefault = en;
|
|
this.langList = LANGUAGE_BASE_LIST;
|
|
this.langBase = en;
|
|
this.switchLanguage(this.lang);
|
|
}
|
|
|
|
t(key: string): string {
|
|
let text = this.langBase[key];
|
|
if (!text) {
|
|
text = this.langDefault[key] || '';
|
|
}
|
|
return text;
|
|
}
|
|
|
|
switchLanguage(language: string): void {
|
|
switch (language) {
|
|
case 'en':
|
|
this.langBase = en;
|
|
break;
|
|
case 'tw':
|
|
this.langBase = tw;
|
|
break;
|
|
default:
|
|
this.langBase = en;
|
|
break;
|
|
}
|
|
}
|
|
|
|
getSystemLang = (): string => {
|
|
const lang = navigator.language.toLowerCase();
|
|
switch (lang) {
|
|
case 'en':
|
|
return 'en';
|
|
case 'tw':
|
|
case 'zh-tw':
|
|
return 'tw';
|
|
default:
|
|
return 'en';
|
|
}
|
|
};
|
|
|
|
get languages(): LangList {
|
|
return this.langList;
|
|
}
|
|
}
|
|
|
|
export default I18n;
|