feat(i18n): Add more supported languages.

This commit is contained in:
LinkinStar 2022-12-19 17:07:34 +08:00
parent 2b83f21584
commit e395de3099
5 changed files with 88 additions and 32 deletions

6
go.mod
View File

@ -27,10 +27,10 @@ require (
github.com/mojocn/base64Captcha v1.3.5
github.com/ory/dockertest/v3 v3.9.1
github.com/robfig/cron/v3 v3.0.1
github.com/segmentfault/pacman v1.0.1
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20221018072427-a15dd1434e05
github.com/segmentfault/pacman v1.0.2
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20221219081300-f734f4a16aa0
github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20221018072427-a15dd1434e05
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20221207032920-3662d1e32068
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20221219081300-f734f4a16aa0
github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20221018072427-a15dd1434e05
github.com/segmentfault/pacman/contrib/server/http v0.0.0-20221018072427-a15dd1434e05
github.com/spf13/cobra v1.6.1

12
go.sum
View File

@ -599,14 +599,14 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
github.com/segmentfault/pacman v1.0.1 h1:GFdvPtNxvVVjnDM4ty02D/+4unHwG9PmjcOZSc2wRXE=
github.com/segmentfault/pacman v1.0.1/go.mod h1:5lNp5REd8QMThmBUvR3Fi9Y3AsOB4GRq7soCB4QLqOs=
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20221018072427-a15dd1434e05 h1:rXsXgC/HR7m4V425l9pDBW/qxJv6zCh6pEvvO1ZCNsI=
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20221018072427-a15dd1434e05/go.mod h1:rmf1TCwz67dyM+AmTwSd1BxTo2AOYHj262lP93bOZbs=
github.com/segmentfault/pacman v1.0.2 h1:tXWkEzePiSVQXYwFH3tOuxC1/DJ5ISi35F93lKNGs3o=
github.com/segmentfault/pacman v1.0.2/go.mod h1:5lNp5REd8QMThmBUvR3Fi9Y3AsOB4GRq7soCB4QLqOs=
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20221219081300-f734f4a16aa0 h1:4x0qG7H2M3qH7Yo2BhGrVlji1iTmRAWgINY/JyENeHs=
github.com/segmentfault/pacman/contrib/cache/memory v0.0.0-20221219081300-f734f4a16aa0/go.mod h1:rmf1TCwz67dyM+AmTwSd1BxTo2AOYHj262lP93bOZbs=
github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20221018072427-a15dd1434e05 h1:BlqTgc3/MYKG6vMI2MI+6o+7P4Gy5PXlawu185wPXAk=
github.com/segmentfault/pacman/contrib/conf/viper v0.0.0-20221018072427-a15dd1434e05/go.mod h1:prPjFam7MyZ5b3S9dcDOt2tMPz6kf7C9c243s9zSwPY=
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20221207032920-3662d1e32068 h1:ln/qgrC62e7/XHGPiikWFV4dyYgCaWeZYkmSGqrHZp4=
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20221207032920-3662d1e32068/go.mod h1:7QcRmnV7OYq4hNOOCWXT5HXnN/u756JUsqIW0Bw8n9E=
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20221219081300-f734f4a16aa0 h1:zaAwBSpwUVrV2BBs1f1hfkv0rY/KdZLyKK8U9NKiurI=
github.com/segmentfault/pacman/contrib/i18n v0.0.0-20221219081300-f734f4a16aa0/go.mod h1:7QcRmnV7OYq4hNOOCWXT5HXnN/u756JUsqIW0Bw8n9E=
github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20221018072427-a15dd1434e05 h1:jcGZU2juv0L3eFEkuZYV14ESLUlWfGMWnP0mjOfrSZc=
github.com/segmentfault/pacman/contrib/log/zap v0.0.0-20221018072427-a15dd1434e05/go.mod h1:L4GqtXLoR73obTYqUQIzfkm8NG8pvZafxFb6KZFSSHk=
github.com/segmentfault/pacman/contrib/server/http v0.0.0-20221018072427-a15dd1434e05 h1:91is1nKNbfTOl8CvMYiFgg4c5Vmol+5mVmMV/jDXD+A=

View File

@ -2,5 +2,25 @@
language_options:
- label: "简体中文(CN)"
value: "zh_CN"
- label: "繁體中文(CN)"
value: "zh_TW"
- label: "English(US)"
value: "en_US"
- label: "Deutsch(DE)"
value: "de_DE"
- label: "Español(ES)"
value: "es_ES"
- label: "Français(FR)"
value: "fr_FR"
- label: "Italiano(IT)"
value: "it_IT"
- label: "日本語(JA)"
value: "ja_JP"
- label: "한국어(KO)"
value: "ko_KR"
- label: "Português(PT)"
value: "pt_PT"
- label: "Русский(RU)"
value: "ru_RU"
- label: "Tiếng Việt(VI)"
value: "vi_VN"

View File

@ -11,14 +11,10 @@ import (
// GetLang get language from header
func GetLang(ctx *gin.Context) i18n.Language {
acceptLanguage := ctx.GetHeader(constant.AcceptLanguageFlag)
switch i18n.Language(acceptLanguage) {
case i18n.LanguageChinese:
return i18n.LanguageChinese
case i18n.LanguageEnglish:
return i18n.LanguageEnglish
default:
return i18n.DefaultLang
if len(acceptLanguage) == 0 {
return i18n.DefaultLanguage
}
return i18n.Language(acceptLanguage)
}
// GetLangByCtx get language from header
@ -27,5 +23,5 @@ func GetLangByCtx(ctx context.Context) i18n.Language {
if ok {
return acceptLanguage
}
return i18n.DefaultLang
return i18n.DefaultLanguage
}

View File

@ -2,23 +2,65 @@ package validator
import (
"errors"
"fmt"
"reflect"
"strings"
"github.com/answerdev/answer/internal/base/reason"
"github.com/answerdev/answer/internal/base/translator"
"github.com/go-playground/locales"
german "github.com/go-playground/locales/de"
english "github.com/go-playground/locales/en"
zhongwen "github.com/go-playground/locales/zh"
spanish "github.com/go-playground/locales/es"
french "github.com/go-playground/locales/fr"
italian "github.com/go-playground/locales/it"
japanese "github.com/go-playground/locales/ja"
korean "github.com/go-playground/locales/ko"
portuguese "github.com/go-playground/locales/pt"
russian "github.com/go-playground/locales/ru"
vietnamese "github.com/go-playground/locales/vi"
chinese "github.com/go-playground/locales/zh"
chineseTraditional "github.com/go-playground/locales/zh_Hant_TW"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
"github.com/go-playground/validator/v10/translations/en"
"github.com/go-playground/validator/v10/translations/es"
"github.com/go-playground/validator/v10/translations/fr"
"github.com/go-playground/validator/v10/translations/it"
"github.com/go-playground/validator/v10/translations/ja"
"github.com/go-playground/validator/v10/translations/pt"
"github.com/go-playground/validator/v10/translations/ru"
"github.com/go-playground/validator/v10/translations/vi"
"github.com/go-playground/validator/v10/translations/zh"
"github.com/go-playground/validator/v10/translations/zh_tw"
myErrors "github.com/segmentfault/pacman/errors"
"github.com/segmentfault/pacman/i18n"
"github.com/segmentfault/pacman/log"
)
type TranslatorLocal struct {
La i18n.Language
Lo locales.Translator
RegisterFunc func(v *validator.Validate, trans ut.Translator) (err error)
}
var (
allLanguageTranslators = []*TranslatorLocal{
{La: i18n.LanguageChinese, Lo: chinese.New(), RegisterFunc: zh.RegisterDefaultTranslations},
{La: i18n.LanguageChineseTraditional, Lo: chineseTraditional.New(), RegisterFunc: zh_tw.RegisterDefaultTranslations},
{La: i18n.LanguageEnglish, Lo: english.New(), RegisterFunc: en.RegisterDefaultTranslations},
{La: i18n.LanguageGerman, Lo: german.New(), RegisterFunc: nil},
{La: i18n.LanguageSpanish, Lo: spanish.New(), RegisterFunc: es.RegisterDefaultTranslations},
{La: i18n.LanguageFrench, Lo: french.New(), RegisterFunc: fr.RegisterDefaultTranslations},
{La: i18n.LanguageItalian, Lo: italian.New(), RegisterFunc: it.RegisterDefaultTranslations},
{La: i18n.LanguageJapanese, Lo: japanese.New(), RegisterFunc: ja.RegisterDefaultTranslations},
{La: i18n.LanguageKorean, Lo: korean.New(), RegisterFunc: nil},
{La: i18n.LanguagePortuguese, Lo: portuguese.New(), RegisterFunc: pt.RegisterDefaultTranslations},
{La: i18n.LanguageRussian, Lo: russian.New(), RegisterFunc: ru.RegisterDefaultTranslations},
{La: i18n.LanguageVietnamese, Lo: vietnamese.New(), RegisterFunc: vi.RegisterDefaultTranslations},
}
)
// MyValidator my validator
type MyValidator struct {
Validate *validator.Validate
@ -36,23 +78,21 @@ type FormErrorField struct {
var GlobalValidatorMapping = make(map[string]*MyValidator, 0)
func init() {
zhTran, zhVal := getTran(zhongwen.New(), i18n.LanguageChinese.Abbr()), createDefaultValidator(i18n.LanguageChinese)
if err := zh.RegisterDefaultTranslations(zhVal, zhTran); err != nil {
panic(err)
for _, t := range allLanguageTranslators {
tran, val := getTran(t.Lo), createDefaultValidator(t.La)
if t.RegisterFunc != nil {
if err := t.RegisterFunc(val, tran); err != nil {
panic(err)
}
}
GlobalValidatorMapping[t.La.Abbr()] = &MyValidator{Validate: val, Tran: tran, Lang: t.La}
}
GlobalValidatorMapping[i18n.LanguageChinese.Abbr()] = &MyValidator{Validate: zhVal, Tran: zhTran, Lang: i18n.LanguageChinese}
enTran, enVal := getTran(english.New(), i18n.LanguageEnglish.Abbr()), createDefaultValidator(i18n.LanguageEnglish)
if err := en.RegisterDefaultTranslations(enVal, enTran); err != nil {
panic(err)
}
GlobalValidatorMapping[i18n.LanguageEnglish.Abbr()] = &MyValidator{Validate: enVal, Tran: enTran, Lang: i18n.LanguageEnglish}
}
func getTran(lo locales.Translator, la string) ut.Translator {
tran, ok := ut.New(lo, lo).GetTranslator(la)
func getTran(lo locales.Translator) ut.Translator {
tran, ok := ut.New(lo, lo).GetTranslator(lo.Locale())
if !ok {
panic(ok)
panic(fmt.Sprintf("not found translator %s", lo.Locale()))
}
return tran
}
@ -83,7 +123,7 @@ func GetValidatorByLang(la string) *MyValidator {
if GlobalValidatorMapping[la] != nil {
return GlobalValidatorMapping[la]
}
return GlobalValidatorMapping[i18n.DefaultLang.Abbr()]
return GlobalValidatorMapping[i18n.DefaultLanguage.Abbr()]
}
// Check /