go的国际化还挺麻烦的,一些框架本身就不提供的国际化,为了不重复造轮子,针对 go-i18n 进行了二次封装,该组件默认支持中文Bundle,调用翻译函数的时候,会实时从context中去获取locale, 如果context中未设置locale,则默认翻译信息为中文。
目前配置文件格式支持 json
对外暴漏的一些结构体和常量
// 常量定义区域,用于指定配置文件的类型
const (
// Json 代表JSON格式的配置文件
Json = "json"
)
// LocaleKey 是一个结构体,用于标识上下文中存储的语言标签键
type LocaleKey struct{}
// 语言常量定义
var (
und = Tag{}
Und Tag = Tag{}
Afrikaans Tag = Tag(compact.Afrikaans)
Amharic Tag = Tag(compact.Amharic)
Arabic Tag = Tag(compact.Arabic)
ModernStandardArabic Tag = Tag(compact.ModernStandardArabic)
Azerbaijani Tag = Tag(compact.Azerbaijani)
Bulgarian Tag = Tag(compact.Bulgarian)
Bengali Tag = Tag(compact.Bengali)
Catalan Tag = Tag(compact.Catalan)
Czech Tag = Tag(compact.Czech)
Danish Tag = Tag(compact.Danish)
German Tag = Tag(compact.German)
Greek Tag = Tag(compact.Greek)
English Tag = Tag(compact.English)
AmericanEnglish Tag = Tag(compact.AmericanEnglish)
BritishEnglish Tag = Tag(compact.BritishEnglish)
Spanish Tag = Tag(compact.Spanish)
EuropeanSpanish Tag = Tag(compact.EuropeanSpanish)
LatinAmericanSpanish Tag = Tag(compact.LatinAmericanSpanish)
Estonian Tag = Tag(compact.Estonian)
Persian Tag = Tag(compact.Persian)
Finnish Tag = Tag(compact.Finnish)
Filipino Tag = Tag(compact.Filipino)
French Tag = Tag(compact.French)
CanadianFrench Tag = Tag(compact.CanadianFrench)
Gujarati Tag = Tag(compact.Gujarati)
Hebrew Tag = Tag(compact.Hebrew)
Hindi Tag = Tag(compact.Hindi)
Croatian Tag = Tag(compact.Croatian)
Hungarian Tag = Tag(compact.Hungarian)
Armenian Tag = Tag(compact.Armenian)
Indonesian Tag = Tag(compact.Indonesian)
Icelandic Tag = Tag(compact.Icelandic)
Italian Tag = Tag(compact.Italian)
Japanese Tag = Tag(compact.Japanese)
Georgian Tag = Tag(compact.Georgian)
Kazakh Tag = Tag(compact.Kazakh)
Khmer Tag = Tag(compact.Khmer)
Kannada Tag = Tag(compact.Kannada)
Korean Tag = Tag(compact.Korean)
Kirghiz Tag = Tag(compact.Kirghiz)
Lao Tag = Tag(compact.Lao)
Lithuanian Tag = Tag(compact.Lithuanian)
Latvian Tag = Tag(compact.Latvian)
Macedonian Tag = Tag(compact.Macedonian)
Malayalam Tag = Tag(compact.Malayalam)
Mongolian Tag = Tag(compact.Mongolian)
Marathi Tag = Tag(compact.Marathi)
Malay Tag = Tag(compact.Malay)
Burmese Tag = Tag(compact.Burmese)
Nepali Tag = Tag(compact.Nepali)
Dutch Tag = Tag(compact.Dutch)
Norwegian Tag = Tag(compact.Norwegian)
Punjabi Tag = Tag(compact.Punjabi)
Polish Tag = Tag(compact.Polish)
Portuguese Tag = Tag(compact.Portuguese)
BrazilianPortuguese Tag = Tag(compact.BrazilianPortuguese)
EuropeanPortuguese Tag = Tag(compact.EuropeanPortuguese)
Romanian Tag = Tag(compact.Romanian)
Russian Tag = Tag(compact.Russian)
Sinhala Tag = Tag(compact.Sinhala)
Slovak Tag = Tag(compact.Slovak)
Slovenian Tag = Tag(compact.Slovenian)
Albanian Tag = Tag(compact.Albanian)
Serbian Tag = Tag(compact.Serbian)
SerbianLatin Tag = Tag(compact.SerbianLatin)
Swedish Tag = Tag(compact.Swedish)
Swahili Tag = Tag(compact.Swahili)
Tamil Tag = Tag(compact.Tamil)
Telugu Tag = Tag(compact.Telugu)
Thai Tag = Tag(compact.Thai)
Turkish Tag = Tag(compact.Turkish)
Ukrainian Tag = Tag(compact.Ukrainian)
Urdu Tag = Tag(compact.Urdu)
Uzbek Tag = Tag(compact.Uzbek)
Vietnamese Tag = Tag(compact.Vietnamese)
Chinese Tag = Tag(compact.Chinese)
SimplifiedChinese Tag = Tag(compact.SimplifiedChinese)
TraditionalChinese Tag = Tag(compact.TraditionalChinese)
Zulu Tag = Tag(compact.Zulu)
)
功能函数
需要使用context中获取语言标签
- Tran(ctx context.Context, msgId string) 翻译函数
- TranWithTemplate(ctx context.Context, msgId string, template map[string]any) 翻译函数,支持模板变量替换
直接传递Locale值
- Translate(locale *language.Tag, msgId string)
- TranslateWithTemplate(locale *language.Tag, msgId string, template map[string]any)
使用步骤
- 安装依赖
go get github.com/lastares/localei18n- 配置翻译文件,文件目录会在初始化国际化组件( LocaleI18N )对象的时候当做参数传递,最好为绝对路径,个人自测的配置文件示例
localei18n
├── README.md
├── go.mod
├── go.sum
├── i18n.go
├── i18n_test.go
└── resources
└── lang
├── en.json
└── zh.json
那在我本机的translateDir(翻译资源文件目录地址)就是 /Users/ares/GolandProjects/localei18n/resources/lang
json 格式的配置文件内容示例
{
"app.version": "版本",
"hello": "你好 {{.name}}"
}带花括号内的字符串会被替换成对应的变量,比如 {{.name}} 会被替换成 ares
如果需要自定义变量占位符,可按照上面内容进行配置
-
初始化国际化组件( LocaleI18N ) 对象
type LocaleI18N struct { bd *i18n.Bundle // Bundle 用于管理消息文件 i18n *i18n.Localizer // Localizer 用于本地化消息 }- 直接调用 NewLocaleI18N(translateDir string) 方法即可,当然你自己要套一层,将项目内配置的语言翻译文件的目录地址配置传进来
func NewLocaleI18N(translateDir string) *LocaleI18N {}为了保证国际化组件项目内全局可用,有几种方式,可自行选择
- 可以在项目入口文件 main.go 中初始化国际化组件,然后通过全局变量的方式获取国际化组件对象
- 如果项目内使用wire依赖注入,可以在 wire.go 文件中初始化国际化组件,然后通过 wire.go 文件中定义的函数获取国际化组件对象,伪代码示例
func NewGlobalLocaleI18N(conf *data.conf) *localei18n.LocaleI18N { return localei18n.NewLocaleI18N(conf.TranslateDir) }
依赖初始化
var DataProviderSet = wire.NewSet( 自定义的包名.NewGlobalLocaleI18N, )
- 或者使用单例模式自己封装一个全局翻译组件变量
-
注入,可以在服务层,可以在控制器层等,在需要的地方都可以进行注入
type UserService struct {
// 这里省略其他注入对象
i18n *localei18n.LocaleI18N,
}
func NewUserService(i18n *localei18n.LocaleI18N) *UserService {
return &UserService{
// 这里省略其他注入对象
i18n: i18n,
}
}- 调用翻译函数,具体根据实际业务逻辑进行处理
func (u *UserService) Store(ctx context.Context, media *model.user) (*service.User, error) {
// 其他逻辑,伪代码
// 翻译
msg := u.i18n.Tran(ctx, "user not found")
// 带变量模板的翻译
msg = u.i18n.TranWithTemplate(ctx, "user not found", map[string]any{"name": "ares"})
}如果有问题可以查看单元测试使用示例