Skip to content

Commit 700cf22

Browse files
authored
fix: persist user's locale (#527)
1 parent 2f74680 commit 700cf22

3 files changed

Lines changed: 30 additions & 1 deletion

File tree

app/composables/useSettings.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { RemovableRef } from '@vueuse/core'
22
import { useLocalStorage } from '@vueuse/core'
33
import { ACCENT_COLORS } from '#shared/utils/constants'
4+
import type { LocaleObject } from '@nuxtjs/i18n'
45

56
type AccentColorId = keyof typeof ACCENT_COLORS
67

@@ -16,6 +17,8 @@ export interface AppSettings {
1617
accentColorId: AccentColorId | null
1718
/** Hide platform-specific packages (e.g., @scope/pkg-linux-x64) from search results */
1819
hidePlatformPackages: boolean
20+
/** User-selected locale */
21+
selectedLocale: LocaleObject['code'] | null
1922
sidebar: {
2023
collapsed: string[]
2124
}
@@ -26,6 +29,7 @@ const DEFAULT_SETTINGS: AppSettings = {
2629
includeTypesInInstall: true,
2730
accentColorId: null,
2831
hidePlatformPackages: true,
32+
selectedLocale: null,
2933
sidebar: {
3034
collapsed: [],
3135
},

app/pages/settings.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script setup lang="ts">
22
const router = useRouter()
33
const { settings } = useSettings()
4-
const { locale, locales, setLocale } = useI18n()
4+
const { locale, locales, setLocale: setNuxti18nLocale } = useI18n()
55
const colorMode = useColorMode()
66
const { currentLocaleStatus, isSourceLocale } = useI18nStatus()
77
@@ -28,6 +28,11 @@ defineOgImageComponent('Default', {
2828
description: () => $t('settings.tagline'),
2929
primaryColor: '#60a5fa',
3030
})
31+
32+
const setLocale: typeof setNuxti18nLocale = locale => {
33+
settings.value.selectedLocale = locale
34+
return setNuxti18nLocale(locale)
35+
}
3136
</script>
3237

3338
<template>

app/plugins/i18n-loader.client.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
export default defineNuxtPlugin({
2+
enforce: 'post',
3+
env: { islands: false },
4+
setup() {
5+
const { $i18n } = useNuxtApp()
6+
const { locale, locales, setLocale } = $i18n
7+
const { settings } = useSettings()
8+
const settingsLocale = settings.value.selectedLocale
9+
10+
if (
11+
settingsLocale &&
12+
// Check if the value is a supported locale
13+
locales.value.map(l => l.code).includes(settingsLocale) &&
14+
// Check if the value is not a current locale
15+
settingsLocale !== locale.value
16+
) {
17+
setLocale(settingsLocale)
18+
}
19+
},
20+
})

0 commit comments

Comments
 (0)