@@ -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-
2215export 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- */
2820export 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