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 }