67 lines
1.3 KiB
Go
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
|
|
}
|