Add translation module with language support and localization functionality.

This commit is contained in:
2025-09-16 00:23:41 +05:00
parent 483d608e57
commit 0e5997c066
5 changed files with 106 additions and 0 deletions
+9
View File
@@ -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
)
+10
View File
@@ -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 @@
{
}
+81
View File
@@ -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
}