i18n

i18n 中间件为 Flame 实例提供应用本地化服务。

你可以在 GitHubi18n - 图1在新窗口打开 上阅读该中间件的源码或通过 pkg.go.devi18n - 图2在新窗口打开 查看 API 文档。

下载安装

Go 语言的最低版本要求为 1.16

  1. go get github.com/flamego/i18n

用法示例

i18n.I18ni18n - 图3在新窗口打开 需要配合 i18n.Optionsi18n - 图4在新窗口打开 来初始化基于 go-i18n/i18ni18n - 图5在新窗口打开 实现的应用本地化引擎。

默认情况下,本地化文件都需要被存放在 “locales” 目录内,并以 locale_%s.ini 的格式对每个文件命名,其中 %s 代指 IETF BCP 47i18n - 图6在新窗口打开 规范所定义的语言标签,例如 “en-US”、”zh-CN”。

使用本地文件

  • 目录
  • main.go
  • locale_en-US.ini
  • locale_zh-CN.ini
  1. $ tree .
  2. .
  3. ├── locales
  4. ├── locale_en-US.ini
  5. └── locale_zh-CN.ini
  6. ├── go.mod
  7. ├── go.sum
  8. └── main.go
  1. package main
  2. import (
  3. "github.com/flamego/flamego"
  4. "github.com/flamego/i18n"
  5. )
  6. func main() {
  7. f := flamego.Classic()
  8. f.Use(i18n.I18n(
  9. i18n.Options{
  10. Languages: []i18n.Language{
  11. {Name: "en-US", Description: "English"},
  12. {Name: "zh-CN", Description: "简体中文"},
  13. },
  14. },
  15. ))
  16. f.Get("/", func(l i18n.Locale) string {
  17. return l.Translate("greeting")
  18. })
  19. f.Run()
  20. }
  1. greeting = How are you?
  1. greeting = 你好吗?

使用 embed.FS

  • 目录
  • main.go
  • embed.go
  • locale_en-US.ini
  • locale_zh-CN.ini
  1. $ tree .
  2. .
  3. ├── locales
  4. ├── embed.go
  5. ├── locale_en-US.ini
  6. └── locale_zh-CN.ini
  7. ├── go.mod
  8. ├── go.sum
  9. └── main.go
  1. package main
  2. import (
  3. "net/http"
  4. "github.com/flamego/flamego"
  5. "github.com/flamego/i18n"
  6. "main/locales"
  7. )
  8. func main() {
  9. f := flamego.Classic()
  10. f.Use(i18n.I18n(
  11. i18n.Options{
  12. FileSystem: http.FS(locales.Locales),
  13. Languages: []i18n.Language{
  14. {Name: "en-US", Description: "English"},
  15. {Name: "zh-CN", Description: "简体中文"},
  16. },
  17. },
  18. ))
  19. f.Get("/", func(l i18n.Locale) string {
  20. return l.Translate("greeting")
  21. })
  22. f.Run()
  23. }
  1. package locales
  2. import "embed"
  3. //go:embed *.ini
  4. var Locales embed.FS
  1. greeting = How are you?
  1. greeting = 你好吗?

注意

由于 Go embed 功能会编码文件的完整路径,因此需要将嵌入的代码放置于与本地化文件的相同目录下。

确定本地化语言

i18n 基于如下顺序决定展现的本地化语言:

  1. 根据 URL 查询参数,默认为 lang,如 lang=en-US 表示使用 “英文(美国)”
  2. 根据 Cookie,默认为 lang
  3. 根据 Accept-Language 请求头
  4. 如仍旧无法确定,则使用默认语言,默认配置下为 i18n.Options.Languages 的第一个元素。

无论本地化语言是通过何种方式确定的,该语言都会当作用户偏好被保存在 Cookie 中。