Stabilize the tray icon and locale handling on Windows while aligning provider and alias management panels with the refreshed desktop branding.
67 lines
1.2 KiB
Go
67 lines
1.2 KiB
Go
package frontend
|
|
|
|
import (
|
|
"embed"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/fs"
|
|
"sync"
|
|
)
|
|
|
|
//go:embed dist/*
|
|
var assets embed.FS
|
|
|
|
//go:embed src/i18n/locales/*.json
|
|
var localeAssets embed.FS
|
|
|
|
var (
|
|
localeCache = map[string]map[string]any{}
|
|
localeCacheMu sync.RWMutex
|
|
)
|
|
|
|
func DistFS() (fs.FS, error) {
|
|
return fs.Sub(assets, "dist")
|
|
}
|
|
|
|
func LocaleValue(language string, path ...string) (string, bool, error) {
|
|
locale, err := loadLocale(language)
|
|
if err != nil {
|
|
return "", false, err
|
|
}
|
|
var current any = locale
|
|
for _, key := range path {
|
|
next, ok := current.(map[string]any)
|
|
if !ok {
|
|
return "", false, nil
|
|
}
|
|
current, ok = next[key]
|
|
if !ok {
|
|
return "", false, nil
|
|
}
|
|
}
|
|
value, ok := current.(string)
|
|
return value, ok, nil
|
|
}
|
|
|
|
func loadLocale(language string) (map[string]any, error) {
|
|
localeCacheMu.RLock()
|
|
if locale, ok := localeCache[language]; ok {
|
|
localeCacheMu.RUnlock()
|
|
return locale, nil
|
|
}
|
|
localeCacheMu.RUnlock()
|
|
|
|
data, err := localeAssets.ReadFile(fmt.Sprintf("src/i18n/locales/%s.json", language))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var locale map[string]any
|
|
if err := json.Unmarshal(data, &locale); err != nil {
|
|
return nil, err
|
|
}
|
|
localeCacheMu.Lock()
|
|
localeCache[language] = locale
|
|
localeCacheMu.Unlock()
|
|
return locale, nil
|
|
}
|