@@ -8,8 +8,17 @@ import ru from '@/messages/ru.json'
88import zh from '@/messages/zh.json'
99import ja from '@/messages/ja.json'
1010import ko from '@/messages/ko.json'
11-
12- export type Locale = 'en' | 'es' | 'fr' | 'de' | 'ru' | 'zh' | 'ja' | 'ko'
11+ import ca from '@/messages/ca.json'
12+ import hi from '@/messages/hi.json'
13+ import ar from '@/messages/ar.json'
14+ import bn from '@/messages/bn.json'
15+ import pt from '@/messages/pt.json'
16+ import id from '@/messages/id.json'
17+ import ur from '@/messages/ur.json'
18+ import tr from '@/messages/tr.json'
19+ import vi from '@/messages/vi.json'
20+
21+ export type Locale = 'en' | 'es' | 'fr' | 'de' | 'ru' | 'zh' | 'ja' | 'ko' | 'ca' | 'hi' | 'ar' | 'bn' | 'pt' | 'id' | 'ur' | 'tr' | 'vi'
1322
1423export interface LocaleConfig {
1524 code : Locale
@@ -26,6 +35,15 @@ export const SUPPORTED_LOCALES: LocaleConfig[] = [
2635 { code : 'zh' , name : 'Chinese' , nativeName : '中文' } ,
2736 { code : 'ja' , name : 'Japanese' , nativeName : '日本語' } ,
2837 { code : 'ko' , name : 'Korean' , nativeName : '한국어' } ,
38+ { code : 'ca' , name : 'Catalan' , nativeName : 'Català' } ,
39+ { code : 'hi' , name : 'Hindi' , nativeName : 'हिन्दी' } ,
40+ { code : 'ar' , name : 'Arabic' , nativeName : 'العربية' } ,
41+ { code : 'bn' , name : 'Bengali' , nativeName : 'বাংলা' } ,
42+ { code : 'pt' , name : 'Portuguese' , nativeName : 'Português' } ,
43+ { code : 'id' , name : 'Indonesian' , nativeName : 'Bahasa Indonesia' } ,
44+ { code : 'ur' , name : 'Urdu' , nativeName : 'اردو' } ,
45+ { code : 'tr' , name : 'Turkish' , nativeName : 'Türkçe' } ,
46+ { code : 'vi' , name : 'Vietnamese' , nativeName : 'Tiếng Việt' } ,
2947]
3048
3149const STORAGE_KEY = 'faircoin-locale'
@@ -42,6 +60,22 @@ const messagesByLocale: Record<Locale, Messages> = {
4260 zh : zh as Messages ,
4361 ja : ja as Messages ,
4462 ko : ko as Messages ,
63+ ca : ca as Messages ,
64+ hi : hi as Messages ,
65+ ar : ar as Messages ,
66+ bn : bn as Messages ,
67+ pt : pt as Messages ,
68+ id : id as Messages ,
69+ ur : ur as Messages ,
70+ tr : tr as Messages ,
71+ vi : vi as Messages ,
72+ }
73+
74+ const RTL_LOCALES = new Set < Locale > ( [ 'ar' , 'ur' ] )
75+
76+ function syncDocumentLanguage ( locale : Locale ) : void {
77+ document . documentElement . lang = locale
78+ document . documentElement . dir = RTL_LOCALES . has ( locale ) ? 'rtl' : 'ltr'
4579}
4680
4781// ── External store for locale (allows all components to react to changes) ──
@@ -55,7 +89,7 @@ let currentLocale: Locale = (() => {
5589
5690// Keep <html lang> in sync with the active locale (a11y + SEO).
5791if ( typeof document !== 'undefined' ) {
58- document . documentElement . lang = currentLocale
92+ syncDocumentLanguage ( currentLocale )
5993}
6094
6195const listeners = new Set < ( ) => void > ( )
@@ -79,7 +113,7 @@ export function setLocale(locale: Locale): void {
79113 if ( locale === currentLocale ) return
80114 currentLocale = locale
81115 localStorage . setItem ( STORAGE_KEY , locale )
82- document . documentElement . lang = locale
116+ syncDocumentLanguage ( locale )
83117 emitChange ( )
84118}
85119
0 commit comments