Files
golifehk/i18n/functions.go
2026-03-10 15:18:34 +08:00

67 lines
1.3 KiB
Go

package i18n
import (
"encoding/json"
"fmt"
"log"
"sync"
langRes "github.com/tgckpg/golifehk/resources/langpacks"
)
type LangPack map[string]string
var (
LangPacks = map[string]LangPack{}
defaultLang = "en"
langMu sync.RWMutex
)
func LoadKeys(lang string) (LangPack, error) {
langMu.RLock()
langPack, ok := LangPacks[lang]
langMu.RUnlock()
if ok {
return langPack, nil
}
langMu.Lock()
defer langMu.Unlock()
// check again after obtaining write lock
if langPack, ok := LangPacks[lang]; ok {
return langPack, nil
}
data, err := langRes.FS.ReadFile(lang + "/messages.json")
if err == nil {
var parsed LangPack
if err := json.Unmarshal(data, &parsed); err != nil {
log.Fatal(err)
}
LangPacks[lang] = parsed
return parsed, nil
}
if lang == defaultLang {
return nil, fmt.Errorf("No language packs available: %s", lang)
}
// avoid recursive locking mess; explicit fallback is cleaner
if fallback, ok := LangPacks[defaultLang]; ok {
return fallback, nil
}
data, err = langRes.FS.ReadFile("langpacks/" + defaultLang + "/messages.json")
if err != nil {
return nil, fmt.Errorf("No language packs available: %s", lang)
}
var fallback LangPack
if err := json.Unmarshal(data, &fallback); err != nil {
return nil, err
}
LangPacks[defaultLang] = fallback
return fallback, nil
}