[golang] 常見的多語系翻譯方案

 1. 使用 go-playground/locales + universal-translator ✅(適用於表單驗證和錯誤訊息)

如果你已經使用了 go-playground/validator/v10,那麼可以搭配 go-playground/locales 和 universal-translator 來進行錯誤訊息翻譯。


安裝

go get github.com/go-playground/locales
go get github.com/go-playground/universal-translator
go get github.com/go-playground/validator/v10


使用範例

package main
import (
    "fmt""github.com/go-playground/locales/zh"
    "github.com/go-playground/universal-translator"
    "github.com/go-playground/validator/v10"
    zh_translations "github.com/go-playground/validator/v10/translations/zh"
)

var (
    uni      *ut.UniversalTranslator
    validate *validator.Validate
    trans    ut.Translator
)

type User struct {
    Name  string`validate:"required"`
    Email string`validate:"required,email"`
}

func main() {
    // 設定語系
    zhT := zh.New()
    uni = ut.New(zhT, zhT)
    trans, _ = uni.GetTranslator("zh")


    validate = validator.New()
    _ = zh_translations.RegisterDefaultTranslations(validate, trans)


    // 測試資料
    user := User{Name: "", Email: "not_a_valid_email"}


    err := validate.Struct(user)
    if err != nil {
        // 轉換驗證錯誤
        for _, e := range err.(validator.ValidationErrors) {
            fmt.Println(e.Translate(trans))
        }
    }
}


💡 優點

  • 易於整合 validator 的錯誤訊息
  • 提供多種語言(如 zhenja 等)
  • 自動翻譯驗證錯誤訊息


2. 使用 nicksnyder/go-i18n/v2 ✅(適用於一般應用程式)

go-i18n 是一個完整的國際化解決方案,支援 .json 或 .toml 格式來管理翻譯內容。


安裝

go get github.com/nicksnyder/go-i18n/v2/goi18n
go get github.com/nicksnyder/go-i18n/v2/i18n


建立翻譯文件

建立 active.zh.json(繁體中文):

{
    "HelloWorld":"你好,世界!","Greeting":"你好,{name}!"
}

建立 active.en.json(英文):
{
    "HelloWorld":"Hello, World!","Greeting":"Hello, {name}!"
}


使用範例

package main

import (
    "fmt"
    "github.com/nicksnyder/go-i18n/v2/i18n"
    "golang.org/x/text/language"
)

funcmain() {
    bundle := i18n.NewBundle(language.English)
    bundle.LoadMessageFile("active.en.json")
    bundle.LoadMessageFile("active.zh.json")

    // 選擇語言
    localizer := i18n.NewLocalizer(bundle, "zh")

    // 取得翻譯內容
    hello := localizer.MustLocalize(&i18n.LocalizeConfig{
        MessageID: "HelloWorld",
    })
    fmt.Println(hello) // 你好,世界!

    greeting := localizer.MustLocalize(&i18n.LocalizeConfig{
        MessageID: "Greeting",
        TemplateData: map[string]string{
            "name": "小明",
        },
    })
    fmt.Println(greeting) // 你好,小明!
}


💡 優點

  • 支援 .json 和 .toml 文件,適合管理大量翻譯
  • 可根據 Accept-Language 自動切換語言
  • 模板變數({name})支援



3. 使用 vktec/l10n-go ✅(輕量級)

l10n-go 是一個 超輕量級 的 i18n 方案,適合小型應用。


安裝

go get github.com/vktec/l10n-go


使用範例

package main
import (
    "fmt""github.com/vktec/l10n-go"
)

funcmain() {
    l10n.Set("zh", map[string]string{
        "hello":   "你好",
        "goodbye": "再見",
    })

    l10n.Set("en", map[string]string{
        "hello":   "Hello",
        "goodbye": "Goodbye",
    })

    lang := "zh"// 選擇語言
    fmt.Println(l10n.Get(lang, "hello"))   // 你好
    fmt.Println(l10n.Get(lang, "goodbye")) // 再見
}

優點

  • 極度輕量
  • 簡單易用



4. 其他方案

  • golang.org/x/text/language:Google 官方 text 包,支援語言偵測與轉換(較底層)
  • Smartling/Smartling-CLI:適用於雲端翻譯(企業級)


總結

解決方案適用場景特色
go-playground/locales + universal-translator表單驗證易與 validator 搭配,支援多語系
nicksnyder/go-i18n一般應用程式JSON/TOML 格式管理翻譯,可根據 Accept-Language 切換
vktec/l10n-go小型專案極簡單,適合靜態翻譯
golang.org/x/text/language進階應用Google 官方語言處理



如果你是處理 表單驗證錯誤推薦 go-playground/universal-translator
如果你要 管理大量翻譯推薦 go-i18n

留言

這個網誌中的熱門文章

[Kotlin]如何學習Kotlin

[golang]如何使用 gorm 高效執行批量插入 (可以透過 Create()、CreateInBatches(),或者 原生 SQL 語句 來提升效率)

[Kotlin]Kotlin Multiplatform (KMP) 如何安裝使用和部署