Beego i18n需手动注册语言文件、解析请求语言并显式调用T()函数;必须用绝对路径加载locale文件,语言标识严格匹配文件名,且在beego.Run()前完成SetMessage;Prepase()中解析lang并赋值c.Locale;模板中需将c.T注入c.Data["T"]才能使用{{.T "key"}}。

Beego 的 i18n 模块不是开箱即用的中间件,必须手动注册语言文件、解析请求头或参数、并在控制器中显式调用翻译函数——漏掉任一环节都会导致 T("key") 返回空字符串或原 key。
如何正确加载 locale 文件(i18n.SetMessage)
加载失败是多语言失效的最常见原因。关键点在于路径、命名和调用时机:
-
i18n.SetMessage(lang, "conf/locale_" + lang + ".ini")中的路径是相对于**当前工作目录**(非main.go所在目录),建议用绝对路径或filepath.Join(beego.AppConfig.String("apppath"), "conf", ...) - 语言标识符(如
"en-US")必须与文件名中的后缀严格一致,locale_en-us.ini会加载失败 - 必须在
beego.Run()之前完成所有i18n.SetMessage调用,放在init()或main()开头最稳妥 - 若使用
beego.AppConfig.String("lang::types")动态读取支持语言,确保配置项存在于conf/app.conf中,例如:lang::types = en-US|zh-CN
怎么从请求中识别用户语言(Accept-Language 或参数)
Beego 不自动解析语言偏好,需在 BaseController.Prepare() 中手动处理:
- 优先检查 URL 参数(如
?lang=zh-CN),再 fallback 到r.Header.Get("Accept-Language") - 注意
Accept-Language值格式为en-US,en;q=0.9,zh-CN;q=0.8,需按q值加权排序并匹配已注册语言,不能直接取第一个子串 - 匹配不到时必须设置默认语言(如
"en-US"),否则后续T()调用会 panic 或静默失败 - 推荐将解析结果存入
self.Data["Lang"]和self.Ctx.Input.SetData("lang", lang),便于模板和日志使用
控制器里怎么安全调用翻译(T() 函数)
T() 是绑定到当前请求上下文的实例方法,不是全局函数,直接写 i18n.T("hi") 会编译报错:
- 必须先在 controller struct 中嵌入
i18n.Locale:type BaseController struct { beego.Controller i18n.Locale } - 在
Prepare()中初始化:func (c *BaseController) Prepare() { c.BaseController.Prepare() lang := c.getLangFromRequest() // 自定义方法 c.Locale = *i18n.GetLocale(lang) } - 模板中使用
{{.T "hi"}};Go 代码中用c.T("hi");传参用c.T("welcome", "Alice")(对应welcome = Welcome, %s) - 若
T()返回原 key(如"hi"),说明该 key 在当前语言文件中不存在,或Locale未正确赋值
为什么模板里 {{.T}} 不生效或报错
模板中 .T 是函数类型,但 Beego 默认不向模板注入 FuncMap,需手动注册:
- 在
main()中添加:beego.AddFuncMap("T", func(key string, args ...interface{}) string { return i18n.Tr("en-US", key, args...) })——但这绕过了当前请求语言 - 更可靠的做法:在
BaseController.Render()前,把c.T注入c.Data:c.Data["T"] = c.T,然后模板才能用{{.T "hi"}} - 注意:模板中不能直接调用带 receiver 的方法,所以
{{.T}}实际是func(string, ...interface{}) string类型,必须提前绑定好语言上下文 - 若用
beego.BConfig.WebConfig.AutoRender = false关闭自动渲染,需自行调用c.TplName并确保Data已注入T
最容易被忽略的是:每次请求的 i18n.Locale 实例必须是独立的,不能复用全局变量或缓存未绑定语言的 *i18n.Locale——goroutine 安全性在此处是硬性要求,错用会导致不同用户的响应混用语言。


















