@@ -17,16 +17,22 @@ withDefaults(defineProps<Props>(), {
1717 display: ' dropdown' ,
1818});
1919
20- const { locale, t } = useI18n ();
20+ const { t, locale } = useI18n ();
2121const page = usePage ();
2222const { initializeLocale } = useLocale ();
2323
24- const languages = [
25- { code: ' en' , name: ' English' , flag: ' 🇺🇸' },
26- { code: ' fr' , name: ' Français' , flag: ' 🇫🇷' },
27- ];
24+ const availableLocales = page .props .locale .available ;
2825
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+ });
3036
3137watch (locale , async (newLocale , oldLocale ) => {
3238 if (newLocale !== oldLocale && oldLocale ) {
@@ -77,7 +83,6 @@ const switchLanguage = async (langCode: string) => {
7783 @click =" switchLanguage(language.code)"
7884 :class =" { 'bg-accent': language.code === currentLanguage.code }"
7985 >
80- <span class =" mr-2" >{{ language.flag }}</span >
8186 {{ language.name }}
8287 </DropdownMenuItem >
8388 </DropdownMenuContent >
@@ -88,15 +93,13 @@ const switchLanguage = async (langCode: string) => {
8893 <SelectTrigger class =" w-[180px]" >
8994 <SelectValue class =" text-foreground" >
9095 <span class =" flex items-center gap-2" >
91- <span >{{ currentLanguage.flag }}</span >
9296 <span class =" text-foreground" >{{ currentLanguage.name }}</span >
9397 </span >
9498 </SelectValue >
9599 </SelectTrigger >
96100 <SelectContent >
97101 <SelectItem v-for =" language in languages" :key =" language.code" :value =" language.code" >
98102 <span class =" flex items-center gap-2" >
99- <span >{{ language.flag }}</span >
100103 <span >{{ language.name }}</span >
101104 </span >
102105 </SelectItem >
@@ -123,7 +126,6 @@ const switchLanguage = async (langCode: string) => {
123126 variant =" outline"
124127 :class =" ['justify-start', language.code === currentLanguage.code ? 'border-primary bg-primary/5' : 'hover:bg-muted']"
125128 >
126- <span class =" mr-3 text-lg" >{{ language.flag }}</span >
127129 <div class =" flex w-full items-center justify-between" >
128130 <span class =" font-medium" >{{ language.name }}</span >
129131 <span v-if =" language.code === currentLanguage.code" class =" text-xs text-muted-foreground" >
0 commit comments