@gip-recia/extended-uportal-header
Version:
a component to deport the uPortal menu
95 lines (79 loc) • 2.19 kB
text/typescript
import get from 'lodash/get';
export interface LangRef {
locales: string[];
messages: {
message: {
[section: string]: {
[translation: string]: string;
};
};
};
}
export default class langHelper {
private static locale = 'en';
private static reference: LangRef[];
static setLocale(lang: string): void {
this.locale = lang;
}
static setReference(ref: LangRef[]): void {
this.reference = ref;
}
static getBrowserLocales(options = {}): string[] {
const defaultOptions = {
languageCodeOnly: true,
defaultLanguage: 'en',
};
const opt = {
...defaultOptions,
...options,
};
const browserLocales =
navigator.languages === undefined
? [navigator.language]
: navigator.languages;
if (!browserLocales) {
return [opt.defaultLanguage];
}
return browserLocales.map((locale) => {
const trimmedLocale = locale.trim();
return opt.languageCodeOnly
? trimmedLocale.split(/-|_/)[0]
: trimmedLocale;
});
}
static getPageLang(options = {}): string {
const defaultOptions = {
languageCodeOnly: true,
availableLanguages: ['en'],
defaultLanguage: 'en',
};
const opt = {
...defaultOptions,
...options,
};
const pageLang = document.documentElement.lang;
let allLangs: string[] = [];
if (pageLang) {
allLangs = opt.languageCodeOnly ? [pageLang.split(/-|_/)[0]] : [pageLang];
} else {
const fOpts = {
anguageCodeOnly: opt.languageCodeOnly,
defaultLanguage: opt.defaultLanguage,
};
allLangs = this.getBrowserLocales(fOpts);
}
const detectedLocale = allLangs.find((x) =>
opt.availableLanguages.includes(x)
);
return detectedLocale || opt.defaultLanguage;
}
static localTranslation(stringId: string, defaultString: string): string {
const currentRef = this.reference?.find((ref) =>
ref.locales.includes(this.locale)
);
const currentMessages = currentRef?.messages;
return currentMessages
? get(currentMessages as unknown, stringId, defaultString)
: defaultString;
}
}