penguin/golifehk

@golifehk bot in Telegram

i18n/functions.go

raw ยท 1340 bytes

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
}