Add translation module with language support and localization functionality.
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
module kor-elf-shield
|
||||
|
||||
go 1.25
|
||||
|
||||
require (
|
||||
github.com/nicksnyder/go-i18n/v2 v2.6.0
|
||||
golang.org/x/sys v0.36.0
|
||||
golang.org/x/text v0.29.0
|
||||
)
|
||||
@@ -0,0 +1,10 @@
|
||||
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||
github.com/nicksnyder/go-i18n/v2 v2.6.0 h1:C/m2NNWNiTB6SK4Ao8df5EWm3JETSTIGNXBpMJTxzxQ=
|
||||
github.com/nicksnyder/go-i18n/v2 v2.6.0/go.mod h1:88sRqr0C6OPyJn0/KRNaEz1uWorjxIKP7rUUcvycecE=
|
||||
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
|
||||
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
|
||||
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package translation
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||
"golang.org/x/text/language"
|
||||
)
|
||||
|
||||
var (
|
||||
Lang LangContract
|
||||
|
||||
//go:embed locales/*.json
|
||||
localeFiles embed.FS
|
||||
)
|
||||
|
||||
type LangContract interface {
|
||||
T(messageID string, data ...map[string]interface{}) string
|
||||
ChangeLang(lang string)
|
||||
}
|
||||
|
||||
type lang struct {
|
||||
bundler *i18n.Bundle
|
||||
localizer *i18n.Localizer
|
||||
fallbackLocalizer *i18n.Localizer
|
||||
|
||||
fallbackLang string
|
||||
currentLang string
|
||||
}
|
||||
|
||||
func InitLang(fallbackLang string) {
|
||||
bundle := i18n.NewBundle(language.Make(fallbackLang))
|
||||
bundle.RegisterUnmarshalFunc("json", json.Unmarshal)
|
||||
_, _ = bundle.LoadMessageFileFS(localeFiles, "locales/locale.ru.json")
|
||||
_, _ = bundle.LoadMessageFileFS(localeFiles, "locales/locale.en.json")
|
||||
|
||||
Lang = &lang{
|
||||
bundler: bundle,
|
||||
localizer: i18n.NewLocalizer(bundle, fallbackLang),
|
||||
fallbackLocalizer: i18n.NewLocalizer(bundle, fallbackLang),
|
||||
|
||||
fallbackLang: fallbackLang,
|
||||
currentLang: fallbackLang,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *lang) T(messageID string, data ...map[string]interface{}) string {
|
||||
cfg := &i18n.LocalizeConfig{
|
||||
MessageID: messageID,
|
||||
}
|
||||
if len(data) > 0 {
|
||||
cfg.TemplateData = data[0]
|
||||
}
|
||||
|
||||
msg, err := l.localizer.Localize(cfg)
|
||||
if err != nil {
|
||||
return l.fallbackT(messageID, data...)
|
||||
}
|
||||
return msg
|
||||
}
|
||||
|
||||
func (l *lang) ChangeLang(lang string) {
|
||||
l.localizer = i18n.NewLocalizer(l.bundler, lang)
|
||||
l.currentLang = lang
|
||||
}
|
||||
|
||||
func (l *lang) fallbackT(messageID string, data ...map[string]interface{}) string {
|
||||
cfg := &i18n.LocalizeConfig{
|
||||
MessageID: messageID,
|
||||
}
|
||||
if len(data) > 0 {
|
||||
cfg.TemplateData = data[0]
|
||||
}
|
||||
|
||||
msg, err := l.fallbackLocalizer.Localize(cfg)
|
||||
if err != nil {
|
||||
return messageID
|
||||
}
|
||||
return msg
|
||||
}
|
||||
Reference in New Issue
Block a user