mirror of
https://github.com/IT4Change/Ocelot-Social.git
synced 2026-04-03 16:15:36 +00:00
67 lines
1.7 KiB
Vue
67 lines
1.7 KiB
Vue
<template>
|
|
<VDropdown :distance="8" placement="bottom-start">
|
|
<OsButton
|
|
variant="primary"
|
|
appearance="ghost"
|
|
circle
|
|
:aria-label="t('localeSwitch.tooltip')"
|
|
:title="t('localeSwitch.tooltip')"
|
|
>
|
|
<template #icon>
|
|
<OsIcon :icon="languageIcon" />
|
|
</template>
|
|
</OsButton>
|
|
|
|
<template #popper="{ hide }">
|
|
<OsMenu
|
|
dropdown
|
|
link-tag="button"
|
|
:routes="sortedLocales"
|
|
:name-parser="(r: Record<string, unknown>) => r.name as string"
|
|
:matcher="
|
|
(_url: string, r: Record<string, unknown>) => r.code === locale
|
|
"
|
|
>
|
|
<template #menuitem="{ route, parents }">
|
|
<OsMenuItem
|
|
:route="route"
|
|
:parents="parents"
|
|
@click="
|
|
(_e: Event, r: Record<string, unknown>) =>
|
|
switchLocale(r.code as LocaleCode, hide)
|
|
"
|
|
/>
|
|
</template>
|
|
</OsMenu>
|
|
</template>
|
|
</VDropdown>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { OsButton, OsIcon, OsMenu, OsMenuItem } from "@ocelot-social/ui";
|
|
import { ocelotIcons } from "@ocelot-social/ui/ocelot";
|
|
|
|
import type { GeneratedTypeConfig } from "@intlify/core-base";
|
|
|
|
type LocaleCode = GeneratedTypeConfig["locale"];
|
|
|
|
const { locale, locales, setLocale, t } = useI18n();
|
|
|
|
const languageIcon = ocelotIcons.language;
|
|
|
|
const sortedLocales = computed(() =>
|
|
locales.value
|
|
.filter((l) => typeof l !== "string" && l.name)
|
|
.map((l) => ({
|
|
code: (l as { code: LocaleCode }).code,
|
|
name: (l as { name: string }).name,
|
|
}))
|
|
.sort((a, b) => a.name.localeCompare(b.name)),
|
|
);
|
|
|
|
async function switchLocale(code: LocaleCode, hide: () => void) {
|
|
await setLocale(code);
|
|
hide();
|
|
}
|
|
</script>
|