From 0b7aa8a9e03647a622b0de064c61e9634c20a958 Mon Sep 17 00:00:00 2001 From: Hamidreza Ghavami <70919649+hamid-gh98@users.noreply.github.com> Date: Sat, 20 May 2023 19:41:08 +0430 Subject: Refactor i18n localizer --- web/locale/locale.go | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 web/locale/locale.go (limited to 'web/locale') diff --git a/web/locale/locale.go b/web/locale/locale.go new file mode 100644 index 00000000..ba7a30e5 --- /dev/null +++ b/web/locale/locale.go @@ -0,0 +1,110 @@ +package locale + +import ( + "embed" + "io/fs" + "strings" + "x-ui/logger" + + "github.com/nicksnyder/go-i18n/v2/i18n" + "github.com/pelletier/go-toml/v2" + "golang.org/x/text/language" +) + +var i18nBundle *i18n.Bundle +var LocalizerWeb *i18n.Localizer +var LocalizerBot *i18n.Localizer + +type I18nType string + +const ( + Bot I18nType = "bot" + Web I18nType = "web" +) + +type SettingService interface { + GetTgLang() (string, error) +} + +func InitLocalizer(i18nFS embed.FS, settingService SettingService) error { + // set default bundle to english + i18nBundle = i18n.NewBundle(language.English) + i18nBundle.RegisterUnmarshalFunc("toml", toml.Unmarshal) + + // parse files + if err := parseTranslationFiles(i18nFS, i18nBundle); err != nil { + return err + } + + return nil +} + +func createTemplateData(params []string, seperator ...string) map[string]interface{} { + var sep string = "==" + if len(seperator) > 0 { + sep = seperator[0] + } + + templateData := make(map[string]interface{}) + for _, param := range params { + parts := strings.SplitN(param, sep, 2) + templateData[parts[0]] = parts[1] + } + + return templateData +} + +func I18n(i18nType I18nType, key string, params ...string) string { + var localizer *i18n.Localizer + + switch i18nType { + case "bot": + localizer = LocalizerBot + case "web": + localizer = LocalizerWeb + default: + logger.Errorf("Invalid type for I18n: %s", i18nType) + return "" + } + + templateData := createTemplateData(params) + + msg, err := localizer.Localize(&i18n.LocalizeConfig{ + MessageID: key, + TemplateData: templateData, + }) + + if err != nil { + logger.Errorf("Failed to localize message: %v", err) + return "" + } + + return msg +} + +func parseTranslationFiles(i18nFS embed.FS, i18nBundle *i18n.Bundle) error { + err := fs.WalkDir(i18nFS, "translation", + func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + if d.IsDir() { + return nil + } + + data, err := i18nFS.ReadFile(path) + if err != nil { + return err + } + + _, err = i18nBundle.ParseMessageFileBytes(data, path) + return err + }) + + if err != nil { + return err + } + + return nil +} -- cgit v1.2.3 From 95e0d9a468dbf569daf65abc01c18f8f0f020dc1 Mon Sep 17 00:00:00 2001 From: Hamidreza Ghavami <70919649+hamid-gh98@users.noreply.github.com> Date: Sat, 20 May 2023 19:46:34 +0430 Subject: create LocalizerMiddleware func --- web/locale/locale.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'web/locale') diff --git a/web/locale/locale.go b/web/locale/locale.go index ba7a30e5..8b32d04d 100644 --- a/web/locale/locale.go +++ b/web/locale/locale.go @@ -6,6 +6,7 @@ import ( "strings" "x-ui/logger" + "github.com/gin-gonic/gin" "github.com/nicksnyder/go-i18n/v2/i18n" "github.com/pelletier/go-toml/v2" "golang.org/x/text/language" @@ -82,6 +83,24 @@ func I18n(i18nType I18nType, key string, params ...string) string { return msg } +func LocalizerMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + var lang string + + if cookie, err := c.Request.Cookie("lang"); err == nil { + lang = cookie.Value + } else { + lang = c.GetHeader("Accept-Language") + } + + LocalizerWeb = i18n.NewLocalizer(i18nBundle, lang) + + c.Set("localizer", LocalizerWeb) + c.Set("I18n", I18n) + c.Next() + } +} + func parseTranslationFiles(i18nFS embed.FS, i18nBundle *i18n.Bundle) error { err := fs.WalkDir(i18nFS, "translation", func(path string, d fs.DirEntry, err error) error { -- cgit v1.2.3 From 980ebd99ca2b7d9d319ba982dc0c1271328832cb Mon Sep 17 00:00:00 2001 From: Hamidreza Ghavami <70919649+hamid-gh98@users.noreply.github.com> Date: Sat, 20 May 2023 19:59:04 +0430 Subject: add tgBot localizer --- web/locale/locale.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'web/locale') diff --git a/web/locale/locale.go b/web/locale/locale.go index 8b32d04d..9a4357c3 100644 --- a/web/locale/locale.go +++ b/web/locale/locale.go @@ -37,6 +37,11 @@ func InitLocalizer(i18nFS embed.FS, settingService SettingService) error { return err } + // setup bot locale + if err := initTGBotLocalizer(settingService); err != nil { + return err + } + return nil } @@ -83,6 +88,16 @@ func I18n(i18nType I18nType, key string, params ...string) string { return msg } +func initTGBotLocalizer(settingService SettingService) error { + botLang, err := settingService.GetTgLang() + if err != nil { + return err + } + + LocalizerBot = i18n.NewLocalizer(i18nBundle, botLang) + return nil +} + func LocalizerMiddleware() gin.HandlerFunc { return func(c *gin.Context) { var lang string -- cgit v1.2.3