Multi Language
1. Add content
// ----------------------------------------------------
// File: src/utils/locales/ar.json
// ----------------------------------------------------
{
"Modern": "عصري",
"Contacts":"جهات الاتصال",
"Chats":"الدردشات"
}
// ----------------------------------------------------
// File: src/utils/locales/en.json
// ----------------------------------------------------
{
"Modern": "Modern",
"Contacts":"Contacts",
"Chats":"Chats"
}
// ----------------------------------------------------
// File: src/utils/locales/zh.json
// ----------------------------------------------------
{
"Modern": "現代的",
"Contacts":"聯繫人",
"Chats":"聊天記錄"
}
// ----------------------------------------------------
// File: src/utils/locales/fr.json
// ----------------------------------------------------
{
"Modern": "Moderne",
"Contacts":"Les contacts",
"Chats":"Chattes"
}
2. Usage
// --------------------------------------------------------------------
// File: package/main/src/layouts/full/vertical-header/languageDD.vue
// --------------------------------------------------------------------
<script setup lang="ts">
import { computed } from "vue";
import { languageDD } from "@/_mockApis/headerData";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/shadcn/ui/dropdown-menu";
import { useI18n } from "vue-i18n";
const { locale } = useI18n();
const currentLang = computed(() => {
languageDD.find((lang) => lang.value === locale.value) ?? languageDD[0];
});
</script>
<template>
<DropdownMenu>
<DropdownMenuTrigger as-child>
<Button
variant="ghost"
size="icon"
class="h-10 w-10 text-muted hover:bg-lightprimary hover:text-primary dark:hover:bg-lightprimary dark:hover:text-primary rounded-full transition"
>
<img
:src="currentLang?.avatar"
:alt="locale"
class="w-6 h-6 object-cover rounded-full"
/>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent class="w-52 p-4 shadow-md rounded-md bg-card border-0">
<DropdownMenuItem
v-for="(item, index) in languageDD"
:key="index"
@click="locale = item.value"
class="flex items-center gap-3 px-2 py-2 rounded-md cursor-pointer hover:bg-muted transition rtl:flex-row-reverse rtl:text-end"
>
<img
:src="item.avatar"
alt="flag"
class="w-5 h-5 object-cover rounded-full"
/>
<span
>
class="text-sm text-muted dark:text-darklink group-hover:!text-primary dark:group-hover:!text-primary font-medium leading-[25px]"
{{ item.title }} ({{ item.subtext }})
</span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</template>
1. Add content
// ----------------------------------------------------
// File: src/utils/locales/ar.json
// ----------------------------------------------------
{
"Modern": "عصري",
"Contacts":"جهات الاتصال",
"Chats":"الدردشات"
}
// ----------------------------------------------------
// File: src/utils/locales/en.json
// ----------------------------------------------------
{
"Modern": "Modern",
"Contacts":"Contacts",
"Chats":"Chats"
}
// ----------------------------------------------------
// File: src/utils/locales/zh.json
// ----------------------------------------------------
{
"Modern": "現代的",
"Contacts":"聯繫人",
"Chats":"聊天記錄"
}
// ----------------------------------------------------
// File: src/utils/locales/fr.json
// ----------------------------------------------------
{
"Modern": "Moderne",
"Contacts":"Les contacts",
"Chats":"Chattes"
}
2. Usage
// --------------------------------------------------------------------
// File: package/main/src/layouts/full/vertical-header/languageDD.vue
// --------------------------------------------------------------------
<script setup lang="ts">
import { computed } from "vue";
import { languageDD } from "@/_mockApis/headerData";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/shadcn/ui/dropdown-menu";
import { useI18n } from "vue-i18n";
const { locale } = useI18n();
const currentLang = computed(() => {
languageDD.find((lang) => lang.value === locale.value) ?? languageDD[0];
});
</script>
<template>
<DropdownMenu>
<DropdownMenuTrigger as-child>
<Button
variant="ghost"
size="icon"
class="h-10 w-10 text-muted hover:bg-lightprimary hover:text-primary dark:hover:bg-lightprimary dark:hover:text-primary rounded-full transition"
>
<img
:src="currentLang?.avatar"
:alt="locale"
class="w-6 h-6 object-cover rounded-full"
/>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent class="w-52 p-4 shadow-md rounded-md bg-card border-0">
<DropdownMenuItem
v-for="(item, index) in languageDD"
:key="index"
@click="locale = item.value"
class="flex items-center gap-3 px-2 py-2 rounded-md cursor-pointer hover:bg-muted transition rtl:flex-row-reverse rtl:text-end"
>
<img
:src="item.avatar"
alt="flag"
class="w-5 h-5 object-cover rounded-full"
/>
<span
>
class="text-sm text-muted dark:text-darklink group-hover:!text-primary dark:group-hover:!text-primary font-medium leading-[25px]"
{{ item.title }} ({{ item.subtext }})
</span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</template>