i18n/i18n.go
Maarten Heremans ee85294b7b Initial Commit
2024-03-30 16:51:30 +01:00

140 lines
2.6 KiB
Go

package i18n
import (
"embed"
"fmt"
"log"
"os"
"strings"
"github.com/cloudfoundry-attic/jibber_jabber"
goi18n "github.com/nicksnyder/go-i18n/v2/i18n"
"golang.org/x/text/language"
"gopkg.in/yaml.v2"
)
var bundle *goi18n.Bundle
func InitI18n(fsys embed.FS, folder string) error {
bundle = goi18n.NewBundle(language.English)
bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal)
languages := []string{}
files, err := fsys.ReadDir(folder)
if err != nil {
err = fmt.Errorf("unable to read i18n data: %w", err)
return err
}
for _, file := range files {
if file.IsDir() {
continue
}
fname := file.Name()
lc := strings.Split(fname, ".")[0]
lt, err := language.Parse(lc)
if err != nil {
log.Printf(
"Unable to parse language code '%s': %v", lc, err,
)
continue
}
if _, err := bundle.LoadMessageFileFS(
fsys, folder+"/"+file.Name(),
); err != nil {
err = fmt.Errorf("unable to load i18n data '%s': %w", file.Name(), err)
return err
}
languages = append(languages, lt.String())
}
goi18n.NewLocalizer(bundle, languages...)
return nil
}
func GetOsLocalizer() *goi18n.Localizer {
langs := []string{}
if l := os.Getenv("VSCORE_LANGUAGE"); l != "" {
langs = append(langs, l)
}
if l, err := jibber_jabber.DetectLanguage(); err == nil {
langs = append(langs, l)
}
langs = append(langs, "en")
localizer := GetLocalizer(langs...)
return localizer
}
func GetLocalizer(langs ...string) *goi18n.Localizer {
if bundle == nil {
return nil
}
return goi18n.NewLocalizer(bundle, langs...)
}
func T(
localizer *goi18n.Localizer,
key string,
) string {
return TF(localizer, key, nil)
}
func TF(
localizer *goi18n.Localizer,
key string,
data map[string]interface{},
pluralCount ...int,
) string {
if localizer == nil {
return key
}
var pc interface{}
if len(pluralCount) > 0 {
pc = pluralCount[0]
}
cfg := goi18n.LocalizeConfig{
MessageID: key,
TemplateData: data,
PluralCount: pc,
}
msg, err := localizer.Localize(&cfg)
if err != nil {
log.Printf("Failed to localize message with key: '%s': %s", key, err)
if msg != "" {
return msg
}
return key
}
return msg
}
func Tx(
condition bool,
localizer *goi18n.Localizer,
key string,
) string {
if !condition {
l := goi18n.NewLocalizer(bundle, "en")
return T(l, key)
}
return T(localizer, key)
}
func TFx(
condition bool,
localizer *goi18n.Localizer,
key string,
data map[string]interface{},
pluralCount ...int,
) string {
if !condition {
l := goi18n.NewLocalizer(bundle, "en")
return TF(l, key, data, pluralCount...)
}
return TF(localizer, key, data, pluralCount...)
}