Added basic i18n
This commit is contained in:
66
i18n/functions.go
Normal file
66
i18n/functions.go
Normal file
@@ -0,0 +1,66 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user