@@ -15,6 +15,7 @@ const I18nContext = createContext<I18nContextValue | null>(null);
1515
1616// Base English messages (scaffold). Keys are dot-notation strings.
1717let enMessages : Record < string , string > = { } ;
18+ let esMessages : Record < string , string > = { } ;
1819
1920async function loadEnMessages ( ) : Promise < Record < string , string > > {
2021 try {
@@ -26,6 +27,16 @@ async function loadEnMessages(): Promise<Record<string, string>> {
2627 }
2728}
2829
30+ async function loadEsMessages ( ) : Promise < Record < string , string > > {
31+ try {
32+ const res = await fetch ( '/locales/es.json' , { cache : 'no-store' } ) ;
33+ if ( ! res . ok ) return { } ;
34+ return ( await res . json ( ) ) as Record < string , string > ;
35+ } catch {
36+ return { } ;
37+ }
38+ }
39+
2940function format ( template : string , vars ?: Vars ) : string {
3041 if ( ! vars ) return template ;
3142 return template . replace ( / \{ ( \w + ) \} / g, ( _m , k : string ) => ( vars [ k ] !== undefined ? String ( vars [ k ] ) : `{${ k } }` ) ) ;
@@ -47,14 +58,18 @@ export function I18nProvider({ children }: { children: React.ReactNode }) {
4758 ( async ( ) => {
4859 if ( locale === 'en' ) {
4960 enMessages = await loadEnMessages ( ) ;
50- setLoaded ( ( v ) => ! v ) ; // trigger rerender
61+ setLoaded ( ( v ) => ! v ) ;
62+ } else if ( locale === 'es' ) {
63+ esMessages = await loadEsMessages ( ) ;
64+ setLoaded ( ( v ) => ! v ) ;
5165 }
5266 } ) ( ) ;
5367 } , [ locale ] ) ;
5468
5569 const t = useCallback ( ( key : string , vars ?: Vars ) => {
5670 // Only 'en' for now; scaffold for future locales
57- const message = ( locale === 'en' ? enMessages [ key ] : undefined ) || key ;
71+ const dict = locale === 'en' ? enMessages : locale === 'es' ? esMessages : enMessages ;
72+ const message = dict [ key ] || key ;
5873 return format ( message , vars ) ;
5974 } , [ locale ] ) ;
6075
0 commit comments