revel多语言需创建/messages目录、按iso 639-1命名文件(如home.en)、启用i18nfilter并确保其位置正确,模板用{{t "key"}}调用,多模块文件需保证key全局唯一,修改后热重载生效。

要在Revel框架中让网页根据用户语言环境自动显示对应翻译,并支持后台按需调用多语言字符串,必须正确组织messages目录结构、命名消息文件、设置语言标识符,并确保i18n filter启用。
创建messages目录与基础文件结构
在Revel应用根目录下手动创建/messages子目录,该路径是Revel硬编码识别的国际化资源根路径,不可更改;若目录不存在,i18n filter启动时不会报错但会静默跳过加载,导致所有revel.Message()调用返回原始key而非翻译值。
进入/messages目录,新建至少一个语言文件,例如home.en(表示home模块的英语翻译),文件必须为UTF-8无BOM编码;文件名后缀必须是ISO 639-1标准语言码(如en、zh、fr),不能写成en-US或zh-CN——Revel在运行时只截取短码部分匹配。
在home.en中写入标准goconfig格式的键值对:
greeting=Hello
submit.button=Submit
error.required=This field is required
配置语言环境与请求识别逻辑
Revel默认通过HTTP请求头Accept-Language自动推断语言,但仅当i18n filter已启用且未被其他filter提前终止时才生效;检查app/init.go中是否保留了revel.I18nFilter在Filters列表内——它必须位于ParamsFilter之后、ActionInvoker之前。
若需强制指定语言(如从URL参数或Cookie读取),需在自定义filter中调用c.Request.Locale = "zh"并赋值给Controller.Request.Locale字段,Revel后续所有Message()调用将以此为准;注意:该赋值必须在I18nFilter执行前完成,否则会被覆盖。
【Locale赋值必须在I18nFilter之前完成】
在模板中使用翻译字符串
方法一:直接调用Message函数
在任何.gohtml模板中插入{{ revel.Message("greeting", .) }},其中第二个参数为可选参数数组,用于替换消息中的占位符(如greeting.name={{.Name}})。
方法二:使用预绑定的T函数(推荐)
在Controller中先执行c.RenderArgs["T"] = c.Message,然后模板中直接写{{ T "submit.button" }},语法更简洁,且避免重复传参。
方法三:带参数的嵌套翻译
若消息定义为welcome.user=Welcome, {{.Name}}!,则模板中写{{ T "welcome.user" .User }},此时.User需是包含Name字段的结构体实例;若传参类型不匹配,Revel不会报错,而是原样输出key。
加载多个模块消息文件
第一步:按功能拆分文件
在/messages目录下创建labels.en、errors.en、labels.zh等独立文件,每个文件专注一类语义(按钮文本/错误提示/标签说明),避免单文件过大难以维护。
第二步:确保key全局唯一
Revel在启动时会将同一语言的所有文件合并进一个config.Config对象,若labels.en和errors.en都定义了submit=Submit,后者将覆盖前者——这种覆盖不可预测,调试困难。
第三步:验证合并结果
启动应用后访问/app/{your-app-name}/tmp/i18n(仅开发模式启用),页面列出当前加载的所有语言及其完整key列表,可人工核对是否存在遗漏或意外覆盖。
第四步:动态切换语言时不重启服务
修改任意.en文件内容并保存,Revel热重载机制会触发messages目录重新扫描并重建内部映射,新请求立即生效;但已建立的长连接(如WebSocket)不会自动刷新语言,需客户端主动重连或刷新页面。











