diff --git a/app/composables/useSettings.ts b/app/composables/useSettings.ts
index 5ea3e87dd0..beeb75514d 100644
--- a/app/composables/useSettings.ts
+++ b/app/composables/useSettings.ts
@@ -1,6 +1,7 @@
import type { RemovableRef } from '@vueuse/core'
import { useLocalStorage } from '@vueuse/core'
import { ACCENT_COLORS } from '#shared/utils/constants'
+import type { LocaleObject } from '@nuxtjs/i18n'
type AccentColorId = keyof typeof ACCENT_COLORS
@@ -16,6 +17,8 @@ export interface AppSettings {
accentColorId: AccentColorId | null
/** Hide platform-specific packages (e.g., @scope/pkg-linux-x64) from search results */
hidePlatformPackages: boolean
+ /** User-selected locale */
+ selectedLocale: LocaleObject['code'] | null
sidebar: {
collapsed: string[]
}
@@ -26,6 +29,7 @@ const DEFAULT_SETTINGS: AppSettings = {
includeTypesInInstall: true,
accentColorId: null,
hidePlatformPackages: true,
+ selectedLocale: null,
sidebar: {
collapsed: [],
},
diff --git a/app/pages/settings.vue b/app/pages/settings.vue
index 14b379c886..200171da92 100644
--- a/app/pages/settings.vue
+++ b/app/pages/settings.vue
@@ -1,7 +1,7 @@
diff --git a/app/plugins/i18n-loader.client.ts b/app/plugins/i18n-loader.client.ts
new file mode 100644
index 0000000000..b34894396f
--- /dev/null
+++ b/app/plugins/i18n-loader.client.ts
@@ -0,0 +1,20 @@
+export default defineNuxtPlugin({
+ enforce: 'post',
+ env: { islands: false },
+ setup() {
+ const { $i18n } = useNuxtApp()
+ const { locale, locales, setLocale } = $i18n
+ const { settings } = useSettings()
+ const settingsLocale = settings.value.selectedLocale
+
+ if (
+ settingsLocale &&
+ // Check if the value is a supported locale
+ locales.value.map(l => l.code).includes(settingsLocale) &&
+ // Check if the value is not a current locale
+ settingsLocale !== locale.value
+ ) {
+ setLocale(settingsLocale)
+ }
+ },
+})