語言本地化

曹阿宇發表於2020-05-30

翻譯您的應用程式是一個有效的方式,使其理解的許多人在世界各地! 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 協議》,轉載必須註明作者和本文連結

曹阿宇

相關文章