语言本地化

本地化

翻译您的应用程序是一个有效的方式,使其理解的许多人在世界各地! 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-LanguageHTTP标头与访问用户进行协作

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.Translatebuffalo.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 协议》,转载必须注明作者和本文链接
caoayu
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!