Просмотр исходного кода

fix: persist UI language preference across sessions

Align detect() with get() so the UI locale, the language switch
button, and API lang requests all read from the same source, and
persist the choice to localStorage plus a long-lived cookie.

- detect() now falls back to DEFAULT instead of hardcoded en-US
- set() writes both localStorage and a 365-day cookie
- fix env var name REACT_APP_DEFAULT_LOCALE -> VITE_APP_DEFAULT_LOCALE
- apply dayjs locale on initial load as well as on switch
visuddhinanda 5 дней назад
Родитель
Сommit
d83b0829c1
1 измененных файлов с 13 добавлено и 5 удалено
  1. 13 5
      dashboard-v6/src/locales/index.ts

+ 13 - 5
dashboard-v6/src/locales/index.ts

@@ -21,15 +21,15 @@ import zhHant from "./zh-Hant";
 const KEY = "locale";
 const KEY = "locale";
 
 
 export const DEFAULT: string =
 export const DEFAULT: string =
-  import.meta.env.REACT_APP_DEFAULT_LOCALE || "zh-Hans";
-
-export const detect = (): string => Cookies.get(KEY) || "en-US";
+  import.meta.env.VITE_APP_DEFAULT_LOCALE || "zh-Hans";
 
 
 export const get = (): string => {
 export const get = (): string => {
   return localStorage.getItem(KEY) || Cookies.get(KEY) || DEFAULT;
   return localStorage.getItem(KEY) || Cookies.get(KEY) || DEFAULT;
 };
 };
 
 
-export const set = (locale: string) => {
+export const detect = (): string => get();
+
+const applyDayjsLocale = (locale: string) => {
   switch (locale) {
   switch (locale) {
     case "zh-Hans":
     case "zh-Hans":
       dayjs.locale("zh-cn");
       dayjs.locale("zh-cn");
@@ -41,9 +41,17 @@ export const set = (locale: string) => {
       dayjs.locale("en-us");
       dayjs.locale("en-us");
       break;
       break;
   }
   }
-  Cookies.set(KEY, locale);
 };
 };
 
 
+export const set = (locale: string) => {
+  applyDayjsLocale(locale);
+  localStorage.setItem(KEY, locale);
+  Cookies.set(KEY, locale, { expires: 365, path: "/" });
+};
+
+// 首次加载时同步 dayjs 语言,避免刷新后时间等格式化仍为英文
+applyDayjsLocale(get());
+
 export const messages = (
 export const messages = (
   locale: string
   locale: string
 ): Record<string, string> | Record<string, MessageFormatElement[]> => {
 ): Record<string, string> | Record<string, MessageFormatElement[]> => {