1
+ import { createContext , useContext } from "react" ;
2
+
1
3
export type LocaleId =
2
4
| "cs"
3
5
| "da"
@@ -20,12 +22,14 @@ export type LocaleId =
20
22
| "uk"
21
23
| "zh-hans" ;
22
24
25
+ export const defaultLocale : LocaleId = "en" ;
26
+
23
27
export const allLocales : readonly LocaleId [ ] = [
28
+ defaultLocale ,
24
29
"cs" ,
25
30
"da" ,
26
31
"de" ,
27
32
"el" ,
28
- "en" ,
29
33
"es" ,
30
34
"et" ,
31
35
"fr" ,
@@ -43,9 +47,40 @@ export const allLocales: readonly LocaleId[] = [
43
47
"zh-hans" ,
44
48
] ;
45
49
46
- export const defaultLocale : LocaleId = "en" ;
50
+ export function getDir ( locale : LocaleId ) : "rtl" | "ltr" {
51
+ return locale === "he" ? "rtl" : "ltr" ;
52
+ }
53
+
54
+ export const PreferredLocaleContext = createContext < LocaleId > ( defaultLocale ) ;
55
+
56
+ export function usePreferredLocale ( ) : LocaleId {
57
+ return useContext ( PreferredLocaleContext ) ;
58
+ }
59
+
60
+ const map = ( ( ) => {
61
+ const map = new Map < string , LocaleId > ( ) ;
62
+
63
+ // Append the default region to a language.
64
+ // This will add "en" as "en-US", "pt-BR" as "pt-BR",
65
+ // "zh-Hans" as "zh-CN", "zh-Hant" as "zh-TW", etc.
66
+ for ( const id of allLocales ) {
67
+ const locale = new Intl . Locale ( id ) . maximize ( ) ;
68
+ map . set ( locale . language + "-" + locale . region , id ) ;
69
+ }
70
+
71
+ // Append languages only.
72
+ for ( const id of allLocales ) {
73
+ const locale = new Intl . Locale ( id ) ;
74
+ if ( locale . region == null ) {
75
+ map . set ( locale . language , id ) ;
76
+ }
77
+ }
47
78
48
- export const isRtl = ( locale : LocaleId ) : boolean => locale === "he" ;
79
+ return map ;
80
+ } ) ( ) ;
49
81
50
- export const getDir = ( locale : LocaleId ) : string =>
51
- isRtl ( locale ) ? "rtl" : "ltr" ;
82
+ export function selectLocale (
83
+ filter : ( ...locales : readonly string [ ] ) => string | null ,
84
+ ) : LocaleId {
85
+ return map . get ( filter ( ...map . keys ( ) ) ?? "" ) ?? defaultLocale ;
86
+ }
0 commit comments