Skip to content

Commit 1e9c26c

Browse files
committed
fix duplicate in language
1 parent 1bda25a commit 1e9c26c

File tree

1 file changed

+18
-39
lines changed

1 file changed

+18
-39
lines changed

src/i18n/language.ts

Lines changed: 18 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,11 @@ const languages = {
1212
fr_FR: frFR,
1313
} as const;
1414

15-
export type MessageFormat = (...args: any[]) => string;
16-
export type Message = string | MessageFormat;
17-
18-
export type Language = {
19-
[key: string]: Message | Language;
20-
};
21-
2215
export type LanguageCode = keyof typeof languages;
23-
export const DefaultLanguage = Object.keys(languages)[0] as LanguageCode;
16+
export const DefaultLanguage: LanguageCode = Object.keys(
17+
languages
18+
)[0] as LanguageCode;
2419

25-
/**
26-
* Get all available language codes
27-
*/
2820
export function getAvailableLanguages(): LanguageCode[] {
2921
return Object.keys(languages) as LanguageCode[];
3022
}
@@ -42,18 +34,15 @@ export class Translator {
4234
DefaultLanguage
4335
).replace("-", "_");
4436

45-
const normalizedLang = (Object.keys(languages) as LanguageCode[]).find(
46-
(key) => key.toLowerCase() === rawLang.toLowerCase()
47-
);
48-
49-
this._languageCode = normalizedLang ?? DefaultLanguage;
37+
this._languageCode =
38+
(Object.keys(languages).find(
39+
(key) => key.toLowerCase() === rawLang.toLowerCase()
40+
) as LanguageCode) ?? DefaultLanguage;
5041
}
5142
}
5243

5344
setLanguage(code: LanguageCode) {
54-
if (languages[code]) {
55-
this._languageCode = code;
56-
}
45+
if (languages[code]) this._languageCode = code;
5746
}
5847

5948
getLanguage(): LanguageCode {
@@ -64,31 +53,21 @@ export class Translator {
6453
return languages[this._languageCode];
6554
}
6655

67-
private getString(
68-
message: string,
69-
langObj: Language = this.messages
70-
): MessageFormat | null {
71-
if (!langObj || !message) return null;
56+
private getString(key: string, obj = this.messages): string | undefined {
57+
const parts = key.split(".");
58+
let current = obj;
7259

73-
const splitted = message.split(".");
74-
const key = splitted[0];
60+
for (const part of parts) {
61+
if (typeof current === "string") return undefined;
62+
if (!(part in current)) return undefined;
7563

76-
if (langObj[key]) {
77-
const val = langObj[key];
78-
if (typeof val === "string") {
79-
return (): string => val;
80-
} else if (typeof val === "function") {
81-
return val;
82-
} else {
83-
return this.getString(splitted.slice(1).join("."), val);
84-
}
64+
current = (current as Record<string, any>)[part];
8565
}
8666

87-
return null;
67+
return typeof current === "string" ? current : undefined;
8868
}
8969

90-
translate(message: string, ...args: any[]): string {
91-
const translated = this.getString(message);
92-
return translated ? translated(...args) : message;
70+
translate(key: string, fallback?: string): string {
71+
return this.getString(key) ?? fallback ?? key;
9372
}
9473
}

0 commit comments

Comments
 (0)