1- import type { SortType , ThemeType , LayoutsType , AppConfigType } from "~/types" ;
1+ import type { SortType , ThemeType , LayoutsType , AppConfigType , LangType } from "~/types" ;
22import { useSettingStorage , type UserSettingPersistedState } from "~/composables/useSettingStorage" ;
33
4- let managerSingleton : ReturnType < typeof createSettingManager > | null = null ;
5-
6- const createSettingManager = ( ) => {
4+ export const useSettingManager = ( ) => {
75 const storage = useSettingStorage ( ) ;
86
97 const isHydrated = ref ( false ) ;
@@ -61,16 +59,16 @@ const createSettingManager = () => {
6159 } ) ;
6260 } ;
6361
64- const setLang = ( lang : string ) => {
62+ const setLang = ( lang : LangType ) => {
6563 state . language = lang ;
6664 persist ( { language : lang } ) ;
6765 } ;
6866
69- const setLangGlobal = ( lang : string ) => {
67+ const setLangGlobal = ( lang : LangType ) => {
7068 state . language = lang ;
7169
7270 // 覆盖所有站点:以存储中的 siteLanguages 为准,避免仅依据当前窗口内存键集合
73- void ensureHydration ( )
71+ ensureHydration ( )
7472 . then ( async ( ) => {
7573 try {
7674 const saved = await storage . load ( ) ;
@@ -81,14 +79,28 @@ const createSettingManager = () => {
8179 ...Object . keys ( state . siteLanguages || { } )
8280 ] ) ;
8381
84- const updated : Record < string , string > = { } ;
82+ // 如果持久化与内存的联合集合中全部已是目标语言,则直接跳过,避免重复应用与重复日志
83+ const allAlreadyTarget = [ ...unionSites ] . every ( ( site ) => {
84+ const current =
85+ ( state . siteLanguages && state . siteLanguages [ site ] ) ??
86+ ( saved . siteLanguages && saved . siteLanguages [ site ] ) ??
87+ saved . language ??
88+ state . language ;
89+ return current === lang ;
90+ } ) ;
91+
92+ if ( ( saved . language ?? state . language ) === lang && allAlreadyTarget ) {
93+ return ;
94+ }
95+
96+ const updated : Record < string , LangType > = { } ;
8597 unionSites . forEach ( ( site ) => ( updated [ site ] = lang ) ) ;
8698
8799 state . siteLanguages = updated ;
88100 persist ( { language : lang , siteLanguages : updated } ) ;
89101 } catch ( err ) {
90102 console . error ( "setLangGlobal load failed, fallback to memory keys" , err ) ;
91- const fallback : Record < string , string > = { ...state . siteLanguages } ;
103+ const fallback : Record < string , LangType > = { ...state . siteLanguages } ;
92104 Object . keys ( fallback ) . forEach ( ( site ) => ( fallback [ site ] = lang ) ) ;
93105 state . siteLanguages = fallback ;
94106 persist ( { language : lang , siteLanguages : fallback } ) ;
@@ -148,25 +160,27 @@ const createSettingManager = () => {
148160 persist ( { appConfig : state . appConfig } ) ;
149161 } ;
150162
151- void ensureHydration ( ) ;
163+ ensureHydration ( ) ;
152164
153165 const hasSiteLanguage = ( site : string ) => site in state . siteLanguages ;
154166
155- const setSiteLanguage = ( site : string , lang : string ) => {
167+ const setSiteLanguage = ( site : string , lang : LangType ) => {
156168 if ( state . siteLanguages [ site ] === lang ) return ;
169+
157170 state . siteLanguages = { ...state . siteLanguages , [ site ] : lang } ;
158171 persist ( { siteLanguages : state . siteLanguages } ) ;
159172 } ;
160173
161174 const removeSiteLanguage = ( site : string ) => {
162175 if ( ! ( site in state . siteLanguages ) ) return ;
176+
163177 const updated = { ...state . siteLanguages } ;
164178 delete updated [ site ] ;
165179 state . siteLanguages = updated ;
166180 persist ( { siteLanguages : updated } ) ;
167181 } ;
168182
169- const getSiteLanguage = ( site : string ) => state . siteLanguages [ site ] || state . language ;
183+ const getSiteLanguage = ( site : string ) : LangType => state . siteLanguages [ site ] || state . language ;
170184 const getDefaultLanguage = ( ) => state . language ;
171185
172186 return {
@@ -193,11 +207,3 @@ const createSettingManager = () => {
193207 setPrimaryColorLight
194208 } ;
195209} ;
196-
197- export const useSettingManager = ( ) => {
198- if ( ! managerSingleton ) {
199- managerSingleton = createSettingManager ( ) ;
200- }
201-
202- return managerSingleton ;
203- } ;
0 commit comments