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