@@ -17,16 +17,22 @@ withDefaults(defineProps<Props>(), {
17
17
display: ' dropdown' ,
18
18
});
19
19
20
- const { locale, t } = useI18n ();
20
+ const { t, locale } = useI18n ();
21
21
const page = usePage ();
22
22
const { initializeLocale } = useLocale ();
23
23
24
- const languages = [
25
- { code: ' en' , name: ' English' , flag: ' 🇺🇸' },
26
- { code: ' fr' , name: ' Français' , flag: ' 🇫🇷' },
27
- ];
24
+ const availableLocales = page .props .locale .available ;
28
25
29
- const currentLanguage = computed (() => languages .find ((lang ) => lang .code === locale .value ) || languages [0 ]);
26
+ const capitalize = (s : string ) => (s ? s .charAt (0 ).toUpperCase () + s .slice (1 ) : s );
27
+
28
+ const languages = availableLocales .map ((code : string ) => {
29
+ const name = new Intl .DisplayNames ([code ], { type: ' language' }).of (code );
30
+ return { code , name: capitalize (name || code ) };
31
+ });
32
+
33
+ const currentLanguage = computed (() => {
34
+ return languages .find ((lang ) => lang .code === locale .value ) || languages [0 ];
35
+ });
30
36
31
37
watch (locale , async (newLocale , oldLocale ) => {
32
38
if (newLocale !== oldLocale && oldLocale ) {
@@ -77,7 +83,6 @@ const switchLanguage = async (langCode: string) => {
77
83
@click =" switchLanguage(language.code)"
78
84
:class =" { 'bg-accent': language.code === currentLanguage.code }"
79
85
>
80
- <span class =" mr-2" >{{ language.flag }}</span >
81
86
{{ language.name }}
82
87
</DropdownMenuItem >
83
88
</DropdownMenuContent >
@@ -88,15 +93,13 @@ const switchLanguage = async (langCode: string) => {
88
93
<SelectTrigger class =" w-[180px]" >
89
94
<SelectValue class =" text-foreground" >
90
95
<span class =" flex items-center gap-2" >
91
- <span >{{ currentLanguage.flag }}</span >
92
96
<span class =" text-foreground" >{{ currentLanguage.name }}</span >
93
97
</span >
94
98
</SelectValue >
95
99
</SelectTrigger >
96
100
<SelectContent >
97
101
<SelectItem v-for =" language in languages" :key =" language.code" :value =" language.code" >
98
102
<span class =" flex items-center gap-2" >
99
- <span >{{ language.flag }}</span >
100
103
<span >{{ language.name }}</span >
101
104
</span >
102
105
</SelectItem >
@@ -123,7 +126,6 @@ const switchLanguage = async (langCode: string) => {
123
126
variant =" outline"
124
127
:class =" ['justify-start', language.code === currentLanguage.code ? 'border-primary bg-primary/5' : 'hover:bg-muted']"
125
128
>
126
- <span class =" mr-3 text-lg" >{{ language.flag }}</span >
127
129
<div class =" flex w-full items-center justify-between" >
128
130
<span class =" font-medium" >{{ language.name }}</span >
129
131
<span v-if =" language.code === currentLanguage.code" class =" text-xs text-muted-foreground" >
0 commit comments