opencode-provider-switch/frontend/assets.go
apale7 8fc72e87e4 fix(desktop): finish Windows shell polish
Stabilize the tray icon and locale handling on Windows while aligning provider and alias management panels with the refreshed desktop branding.
2026-04-20 02:36:54 +08:00

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
}