Parcourir la source

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 il y a 5 jours
Parent
commit
d83b0829c1
1 fichiers modifiés avec 13 ajouts et 5 suppressions
  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";
 
 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 => {
   return localStorage.getItem(KEY) || Cookies.get(KEY) || DEFAULT;
 };
 
-export const set = (locale: string) => {
+export const detect = (): string => get();
+
+const applyDayjsLocale = (locale: string) => {
   switch (locale) {
     case "zh-Hans":
       dayjs.locale("zh-cn");
@@ -41,9 +41,17 @@ export const set = (locale: string) => {
       dayjs.locale("en-us");
       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 = (
   locale: string
 ): Record<string, string> | Record<string, MessageFormatElement[]> => {