1- import { useState , useEffect } from 'react'
1+ import { useState } from 'react'
22import { query } from '@/data'
33
4- type MapData = Map < string , Map < string | number , string > >
4+ const i18n = new Map ( )
5+ for ( const { id : key , lang : langs } of query ( 'i18n' ) ) {
6+ for ( const [ lang , value ] of Object . entries ( langs ) ) {
7+ if ( ! i18n . has ( lang ) ) i18n . set ( lang , new Map ( ) )
8+ i18n . get ( lang ) ?. set ( key , value )
9+ }
10+ }
11+
12+ export const languages = Array . from ( i18n . keys ( ) )
513export interface FormatData {
614 [ key : string ] : string | number
715}
@@ -12,40 +20,23 @@ function format(template: string, formatData: FormatData) {
1220}
1321
1422function getLanguageFallback ( ) {
15- const fallback = [ ]
16- const userSettings = localStorage . getItem ( 'language' )
17- if ( userSettings ) fallback . push ( userSettings )
23+ const setting = localStorage . getItem ( 'language' )
24+ if ( setting && i18n . has ( setting ) ) return setting
1825 const nav = navigator . language
1926 if ( nav ) {
20- fallback . push ( nav )
21- fallback . push ( nav . split ( '-' ) [ 0 ] )
27+ if ( i18n . has ( nav ) ) return nav
28+ const lang = nav . split ( '-' ) [ 0 ]
29+ if ( i18n . has ( lang ) ) return lang
2230 }
23- fallback . push ( 'en' )
24- return fallback
31+ return 'en'
32+ }
33+ function saveLanguage ( language : string ) {
34+ localStorage . setItem ( 'language' , language )
35+ return language
2536}
2637
2738export function useLanguage ( ) {
28- const [ language , setLanguage ] = useState ( '' )
29- const [ i18n , setI18n ] = useState < MapData | null > ( null )
30- const [ languages , setLanguages ] = useState < string [ ] > ( [ ] )
31- useEffect ( ( ) => {
32- const i18n = new Map ( )
33- for ( const { id : key , lang : langs } of query ( 'i18n' ) ) {
34- for ( const [ lang , value ] of Object . entries ( langs ) ) {
35- if ( ! i18n . has ( lang ) ) i18n . set ( lang , new Map ( ) )
36- i18n . get ( lang ) ?. set ( key , value )
37- }
38- }
39- setI18n ( i18n )
40- setLanguages ( Array . from ( i18n . keys ( ) ) )
41- const fallback = getLanguageFallback ( )
42- for ( const lang of fallback ) {
43- if ( i18n . has ( lang ) ) {
44- setLanguage ( lang )
45- return
46- }
47- }
48- } , [ ] )
39+ const [ language , setLanguage ] = useState ( getLanguageFallback ( ) )
4940 return {
5041 t : ( key : string | number , formatData ?: FormatData ) => {
5142 const template = i18n ?. get ( language ) ?. get ( key ) || key
@@ -55,10 +46,8 @@ export function useLanguage() {
5546 return format ( template , formatData )
5647 } ,
5748 setLanguage : ( lang : string ) => {
58- localStorage . setItem ( 'language' , lang )
59- setLanguage ( lang )
49+ setLanguage ( saveLanguage ( lang ) )
6050 } ,
61- languages,
6251 }
6352}
6453
0 commit comments