@@ -2,30 +2,67 @@ package main
22
33import (
44 "encoding/json"
5+ "golang.org/x/sys/windows"
6+ "golang.org/x/text/language"
7+ "golang.org/x/text/language/display"
58 "os"
69 "path/filepath"
10+ "syscall"
11+ "unsafe"
712)
813
14+ type Config struct {
15+ CustomDirs []CustomDir `json:"customDirs"`
16+ Language string `json:"language"`
17+ }
18+
19+ var config Config
20+
921func LoadConfig () {
1022 configPath := filepath .Join (getUserHome (), ".hidell" , "config.json" )
1123 data , err := os .ReadFile (configPath )
1224 if err != nil {
1325 if os .IsNotExist (err ) {
14- customDirs = []CustomDir {}
26+ config = Config {
27+ CustomDirs : []CustomDir {},
28+ Language : getDefaultLanguage (),
29+ }
30+ saveConfig ()
1531 return
1632 }
1733 panic (err )
1834 }
1935
20- err = json .Unmarshal (data , & customDirs )
21- if err != nil {
22- panic (err )
36+ // 首先尝试解析完整的新配置
37+ err = json .Unmarshal (data , & config )
38+ if err == nil {
39+ // 成功解析新配置
40+ if config .Language == "" {
41+ config .Language = getDefaultLanguage ()
42+ saveConfig ()
43+ }
44+ } else {
45+ // 如果解析失败,尝试解析旧版本的配置文件
46+ var oldConfig []CustomDir
47+ err = json .Unmarshal (data , & oldConfig )
48+ if err != nil {
49+ panic (err )
50+ }
51+ // 使用旧配置并创建新的配置结构
52+ config = Config {
53+ CustomDirs : oldConfig ,
54+ Language : getDefaultLanguage (),
55+ }
56+ // 保存更新后的配置
57+ saveConfig ()
2358 }
59+
60+ customDirs = config .CustomDirs
2461}
2562
2663func saveConfig () {
2764 configPath := filepath .Join (getUserHome (), ".hidell" , "config.json" )
28- data , err := json .MarshalIndent (customDirs , "" , " " )
65+ data , err := json .MarshalIndent (config , "" , " " )
2966 if err != nil {
3067 panic (err )
3168 }
@@ -40,3 +77,68 @@ func saveConfig() {
4077 panic (err )
4178 }
4279}
80+
81+ func getDefaultLanguage () string {
82+ // 获取用户界面语言
83+ k32 := windows .NewLazySystemDLL ("kernel32.dll" )
84+ getUserDefaultUILanguage := k32 .NewProc ("GetUserDefaultUILanguage" )
85+ if getUserDefaultUILanguage .Find () == nil {
86+ ret , _ , _ := getUserDefaultUILanguage .Call ()
87+ langID := uint16 (ret )
88+ userLang := windowsLangIDToISO639 (langID )
89+ if userLang != "" {
90+ return mapLanguage (userLang )
91+ }
92+ }
93+
94+ // 如果无法获取用户界面语言,尝试获取系统区域设置
95+ systemLang := getSystemLocale ()
96+ return mapLanguage (systemLang )
97+ }
98+
99+ func windowsLangIDToISO639 (langID uint16 ) string {
100+ // 这里只处理了英语和中文,您可以根据需要添加更多语言
101+ switch langID {
102+ case 0x0409 : // English (United States)
103+ return "en"
104+ case 0x0804 : // Chinese (Simplified, PRC)
105+ return "zh"
106+ case 0x0C04 : // Chinese (Traditional, Hong Kong S.A.R.)
107+ return "zh"
108+ case 0x1004 : // Chinese (Simplified, Singapore)
109+ return "zh"
110+ case 0x0404 : // Chinese (Traditional, Taiwan)
111+ return "zh"
112+ default :
113+ return ""
114+ }
115+ }
116+
117+ func getSystemLocale () string {
118+ kernel32 := syscall .NewLazyDLL ("kernel32.dll" )
119+ getSystemDefaultLocaleName := kernel32 .NewProc ("GetSystemDefaultLocaleName" )
120+
121+ buf := make ([]uint16 , 85 ) // LOCALE_NAME_MAX_LENGTH = 85
122+ r , _ , _ := getSystemDefaultLocaleName .Call (uintptr (unsafe .Pointer (& buf [0 ])), uintptr (len (buf )))
123+ if r == 0 {
124+ return "en" // 默认返回英语
125+ }
126+
127+ return syscall .UTF16ToString (buf )
128+ }
129+
130+ func mapLanguage (lang string ) string {
131+ tag := language .Make (lang )
132+ base , _ := tag .Base ()
133+ langName := display .English .Languages ().Name (base )
134+
135+ switch langName {
136+ case "English" :
137+ return "en"
138+ case "Chinese" :
139+ return "zh"
140+ // 添加其他支持的语言
141+ default :
142+ return "en"
143+ }
144+ }
0 commit comments