@@ -4,6 +4,8 @@ import { processLanguages } from "@/lib/dataProcessor";
44import type {
55 DisplayMode ,
66 廣韻字段 ,
7+ 中原音韻字段 ,
8+ 東干甘肅話字段 ,
79 Language ,
810 LanguageInfo ,
911 ProcessedLanguage ,
@@ -29,6 +31,8 @@ interface AppContextValue {
2931 selectAllLanguages : ( ) => void ;
3032 deselectAllLanguages : ( ) => void ;
3133 toggle廣韻字段 : ( field : 廣韻字段 ) => void ;
34+ toggle中原音韻字段 : ( field : 中原音韻字段 ) => void ;
35+ toggle東干甘肅話字段 : ( field : 東干甘肅話字段 ) => void ;
3236 updateTheme : ( theme : Theme ) => void ;
3337
3438 // Current page
@@ -37,7 +41,7 @@ interface AppContextValue {
3741
3842 // UI language
3943 language : Language ;
40- updateLanguage : ( lang : Language ) => void ;
44+ setDisplayLanguage : ( lang : Language ) => void ;
4145
4246 // Query state
4347 queryInput : string ;
@@ -48,34 +52,51 @@ interface AppContextValue {
4852
4953const AppContext = createContext < AppContextValue | undefined > ( undefined ) ;
5054
55+ const detectSystemTheme = ( ) : Theme => {
56+ try {
57+ const prefersDark = window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches ;
58+ return prefersDark ? "dark" : "light" ;
59+ } catch {
60+ return "light" ;
61+ }
62+ } ;
63+
64+ // https://github.com/osfans/MCPDict/blob/aee3606025410afc1be5c6f5bf1bd95ae8f237bf/app/src/main/res/values/strings.xml#L204-L206
65+ const DEFAULT_中原音韻字段 : 中原音韻字段 [ ] = [ "unt" ] ;
66+ // https://github.com/osfans/MCPDict/blob/aee3606025410afc1be5c6f5bf1bd95ae8f237bf/app/src/main/res/values/strings.xml#L218-L221
67+ const DEFAULT_東干甘肅話字段 : 東干甘肅話字段 [ ] = [ "音標" , "西里爾字母" ] ;
68+
5169const DEFAULT_SETTINGS : UserSettings = {
5270 displayMode : "地圖集二" ,
5371 selectedLanguages : new Set < number > ( ) ,
54- 廣韻字段 : new Set < 廣韻字段 > ( [ "切韻拼音" , "切韻音系描述" , "unt(2022)擬音" , "反切" ] ) , // Default fields
55- theme : "light" , // Default theme
72+ 廣韻字段 : new Set < 廣韻字段 > ( [ "切韻拼音" , "切韻音系描述" , "unt(2022)擬音" ] ) , // Default fields
73+ 中原音韻字段 : new Set < 中原音韻字段 > ( DEFAULT_中原音韻字段 ) ,
74+ 東干甘肅話字段 : new Set < 東干甘肅話字段 > ( DEFAULT_東干甘肅話字段 ) ,
75+ theme : detectSystemTheme ( ) , // Default theme based on system preference
5676} ;
5777
5878const DEFAULT_LANGUAGE : Language = "zh_HK" ;
5979
80+ const DISPLAY_LANGUAGE_KEY = "yindian-language" ;
81+
82+ export const getCachedDisplayLanguage = ( ) : Language | null => {
83+ try {
84+ const cached = localStorage . getItem ( DISPLAY_LANGUAGE_KEY ) ;
85+ if ( ! cached ) return null ;
86+ return cached as Language ;
87+ } catch {
88+ return null ;
89+ }
90+ } ;
91+
6092export function AppProvider ( { children } : { children : ReactNode } ) {
6193 const [ rawLanguages , setRawLanguages ] = useState < LanguageInfo [ ] > ( [ ] ) ;
6294 const [ isLoadingLanguages , setIsLoadingLanguages ] = useState ( true ) ;
6395 const [ languagesError , setLanguagesError ] = useState < Error | null > ( null ) ;
6496 const [ queryInput , setQueryInput ] = useState < string > ( "" ) ;
6597 const [ queryResults , setQueryResults ] = useState < CharacterResult [ ] | null > ( null ) ;
6698 const [ page , setPage ] = useState < Pages > ( "query" ) ;
67- const [ language , setLanguageState ] = useState < Language > ( ( ) => {
68- // Try to load language from localStorage
69- try {
70- const saved = localStorage . getItem ( "yindian-language" ) ;
71- if ( saved ) {
72- return saved as Language ;
73- }
74- } catch ( e ) {
75- console . error ( "Failed to load language:" , e ) ;
76- }
77- return DEFAULT_LANGUAGE ;
78- } ) ;
99+ const [ language , setLanguageState ] = useState < Language > ( getCachedDisplayLanguage ( ) || DEFAULT_LANGUAGE ) ;
79100 const [ settings , setSettings ] = useState < UserSettings > ( ( ) => {
80101 // Try to load settings from localStorage
81102 try {
@@ -85,8 +106,10 @@ export function AppProvider({ children }: { children: ReactNode }) {
85106 return {
86107 displayMode : parsed . displayMode as DisplayMode ,
87108 selectedLanguages : new Set ( parsed . selectedLanguages || [ ] ) ,
88- 廣韻字段 : new Set < 廣韻字段 > ( parsed . 廣韻字段 || [ "切韻拼音" , "切韻音系描述" ] ) ,
89- theme : parsed . theme || "light" ,
109+ 廣韻字段 : new Set < 廣韻字段 > ( parsed . 廣韻字段 || [ "切韻拼音" , "切韻音系描述" , "unt(2022)擬音" ] ) ,
110+ 中原音韻字段 : new Set < 中原音韻字段 > ( parsed . 中原音韻字段 || DEFAULT_中原音韻字段 ) ,
111+ 東干甘肅話字段 : new Set < 東干甘肅話字段 > ( parsed . 東干甘肅話字段 || DEFAULT_東干甘肅話字段 ) ,
112+ theme : parsed . theme || detectSystemTheme ( ) ,
90113 } ;
91114 }
92115 } catch ( e ) {
@@ -104,6 +127,8 @@ export function AppProvider({ children }: { children: ReactNode }) {
104127 displayMode : settings . displayMode ,
105128 selectedLanguages : Array . from ( settings . selectedLanguages ) ,
106129 廣韻字段 : Array . from ( settings . 廣韻字段 ) ,
130+ 中原音韻字段 : Array . from ( settings . 中原音韻字段 ) ,
131+ 東干甘肅話字段 : Array . from ( settings . 東干甘肅話字段 ) ,
107132 theme : settings . theme ,
108133 } ) ,
109134 ) ;
@@ -179,14 +204,38 @@ export function AppProvider({ children }: { children: ReactNode }) {
179204 } ) ;
180205 } ;
181206
207+ const toggle中原音韻字段 = ( field : 中原音韻字段 ) => {
208+ setSettings ( prev => {
209+ const newFields = new Set ( prev . 中原音韻字段 ) ;
210+ if ( newFields . has ( field ) ) {
211+ newFields . delete ( field ) ;
212+ } else {
213+ newFields . add ( field ) ;
214+ }
215+ return { ...prev , 中原音韻字段 : newFields } ;
216+ } ) ;
217+ } ;
218+
219+ const toggle東干甘肅話字段 = ( field : 東干甘肅話字段 ) => {
220+ setSettings ( prev => {
221+ const newFields = new Set ( prev . 東干甘肅話字段 ) ;
222+ if ( newFields . has ( field ) ) {
223+ newFields . delete ( field ) ;
224+ } else {
225+ newFields . add ( field ) ;
226+ }
227+ return { ...prev , 東干甘肅話字段 : newFields } ;
228+ } ) ;
229+ } ;
230+
182231 const updateTheme = ( theme : Theme ) => {
183232 setSettings ( prev => ( { ...prev , theme } ) ) ;
184233 } ;
185234
186- const setLanguage = ( lang : Language ) => {
235+ const setDisplayLanguage = ( lang : Language ) => {
187236 setLanguageState ( lang ) ;
188237 try {
189- localStorage . setItem ( "yindian-language" , lang ) ;
238+ localStorage . setItem ( DISPLAY_LANGUAGE_KEY , lang ) ;
190239 } catch ( e ) {
191240 console . error ( "Failed to save language:" , e ) ;
192241 }
@@ -205,9 +254,11 @@ export function AppProvider({ children }: { children: ReactNode }) {
205254 selectAllLanguages,
206255 deselectAllLanguages,
207256 toggle廣韻字段,
257+ toggle中原音韻字段,
258+ toggle東干甘肅話字段,
208259 updateTheme,
209260 language,
210- updateLanguage : setLanguage ,
261+ setDisplayLanguage ,
211262 queryInput,
212263 setQueryInput,
213264 queryResults,
0 commit comments