语言本地化
本地化
翻译您的应用程序是一个有效的方式,使其理解的许多人在世界各地! Buffalo
使用go-i18n
项目提供应用程序的i18n
(调整软件使其可翻译而不需要更改代码)和 l10n
(提供翻译字符串和特定格式)。
标记可翻译字符串
可翻译字符串必须使用特定的标记,以允许 l10n
引擎获取翻译。
在一个plush
模板中,你可以使用t()
助手函数
<%= t("greetings") %>
从 v0.10.2开始
你可以使用一个上下文和t() helper
一起,为转换字符串提供变量:
<%= t("name-format", {name: "Mark"}) %>
多次处理
从 v0.10.2开始
你可以使用这个辅助器和一个数字形式的第二个参数来处理单数 / 复数的情况:
<%= t("messages-notification", notificationsLen) %>
使用第三个参数提供上下文:
<%= t("messages-notification", notificationsLen, ctx) %>
提供翻译
翻译存储在 locales 文件夹中。 默认情况下,它们存储在 all.en-us 中。 美国英语字符串的 yaml 文件。
您可以通过提供一个新文件 all.my-language-code.yaml
一种语言的翻译 如果您希望将字符串拆分为逻辑模块,甚至可以创建多个文件,例如 users.en-us,.yaml
跟用户相关的的东西.
Go-i18n 使用的本地化格式如下:
- id: greetings
translation: "Welcome to Buffalo (EN)"
- id: messages-notification
translation:
one: "You have {{.Count}} notification"
other: "You have {{.Count}} notifications"
定义默认语言
要定义应用程序的默认语言,你需要编辑 actions 文件夹中的 app.go 文件:
// Setup and use translations:
var err error
if T, err = i18n.New(packr.NewBox("../locales"), "en-US"); err != nil {
app.Stop(err)
}
app.Use(T.Middleware())
将en-US
更改为另一种语言代码将更改默认语言。
本地化视图
从 v0.10.2开始
有时候,你必须翻译整个页面,标记页面的每个部分需要花费大量的时间。 在其他一些情况下,您可能希望针对特定的区域设置以不同的方式本地化页面。 本地化视图是处理翻译的补充方法。
本地化的视图包含在 i18n 中间件中,因此您不需要设置任何其他内容来使用它们。
创建模板的后缀版本
首先,为默认语言环境创建一个没有语言后缀的版本
page.html
页面:
<p>This is my default language page.</p>
然后,为你想支持的每种语言创建一个新的后缀版本:
page.en-us.html
<p>This is my en-US version.</p>
page.fr-fr.html
<p>This is my fr-FR version.</p>
中间件将检测用户语言,并为您选择正确的模板! 它还使用 acept-Language
HTTP标头与访问用户进行协作
在ACTION
中使用 i18n
例如,您需要在操作中使用 i18n
特性来翻译 flash
消息。 下面是使用它的方法:
func Login(c buffalo.Context) error {
// [...]
// Set a translated flash message
c.Flash().Add("success", T.Translate(c, "users.login-success"))
return c.Redirect(303, "/users/signin")
}
T.Translate
将 buffalo.Content
作为第一个参数,那么下面的参数与 t()
的参数相同
刷新翻译上下文
从 v0.12.0开始
如果你提供翻译版本的应用程序,你可能会有一个语言切换功能。 这样,用户就可以选择正确的语言。 布法罗不能检测您何时在一个动作中更改语言,因为它将在每个请求中提取一次用户语言。 然后,您必须重定向到另一个页面以查看更改。 但是即使使用这个技巧,如果你在动作中使用 flash
消息,使用的语言仍然是旧的。
要解决这个问题,您可以使用 T.Refresh
方法并在操作中刷新用于翻译的语言。
func SwitchLanguage(c buffalo.Context) error {
f := struct {
Language string `form:"lang"`
URL string `form:"url"`
}{}
if err := c.Bind(&f); err != nil {
return errors.WithStack(err)
}
// Set new current language using a cookie, for instance
cookie := http.Cookie{
Name: "lang",
Value: f.Language,
MaxAge: int((time.Hour * 24 * 265).Seconds()),
Path: "/",
}
http.SetCookie(c.Response(), &cookie)
// Update language for the flash message
T.Refresh(c, f.Language)
c.Flash().Add("success", T.Translate(c, "users.language-changed", f))
return c.Redirect(302, f.URL)
}
本作品采用《CC 协议》,转载必须注明作者和本文链接