Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

go-i18n

概述

✅ 推荐库:go-i18n

以下是整理好的 Golang 项目实现多语言(i18n)支持 的 Markdown 格式文档,结构清晰、可直接作为博客或技术分享发布:

🌍 Golang 实现多语言支持(i18n)最佳实践 — 以 Telegram Bot 为例

在开发国际化应用时,多语言(i18n)支持是一个不可忽视的需求。本文将介绍如何在 Golang 项目中优雅地实现多语言支持,特别适用于如 Telegram Bot 等多语言交互系统。

📦 使用 go-i18n 实现多语言

go-i18n 是 Golang 最成熟、最广泛使用的国际化库,支持 YAML/JSON 格式的翻译文件。

🧱 项目结构设计

1
2
3
4
5
6
7
8
9
10
mybot/
├── main.go
├── i18n/
│ └── i18n.go # 初始化和翻译调用逻辑
├── locales/ # 翻译文件
│ ├── active.zh.yaml # 中文
│ ├── active.en.yaml # 英文
│ ├── active.ja.yaml # 日语
│ ├── active.ru.yaml # 俄语
│ └── active.uk.yaml # 乌克兰语

🚀 使用步骤

  1. 安装 go-i18n
1
go get github.com/nicksnyder/go-i18n/v2/goi18n

  1. 编写语言文件

示例:locales/active.zh.yaml

1
2
3
4
- id: welcome
translation: "欢迎你,{{.Name}}!"
- id: choose_language
translation: "请选择你的语言:"

示例:locales/active.en.yaml

1
2
3
4
- id: welcome
translation: "Welcome, {{.Name}}!"
- id: choose_language
translation: "Please choose your language:"

(其他语言同理)

  1. 初始化多语言系统

i18n/i18n.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package i18n

import (
"embed"
"github.com/nicksnyder/go-i18n/v2/i18n"
"golang.org/x/text/language"
"gopkg.in/yaml.v2"
)

//go:embed ../locales/*.yaml
var localeFS embed.FS

var bundle *i18n.Bundle

func InitI18n() {
bundle = i18n.NewBundle(language.English)
bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal)

entries, _ := localeFS.ReadDir("locales")
for _, e := range entries {
data, _ := localeFS.ReadFile("locales/" + e.Name())
bundle.ParseMessageFileBytes(data, e.Name())
}
}

func GetMessage(lang, msgID string, data map[string]interface{}) string {
localizer := i18n.NewLocalizer(bundle, lang)
msg, err := localizer.Localize(&i18n.LocalizeConfig{
MessageID: msgID,
TemplateData: data,
})
if err != nil {
return msgID // fallback
}
return msg
}

  1. 使用翻译内容

在业务逻辑中使用:

1
2
3
4
5
6
7
i18n.InitI18n()

func HandleStart(lang string, name string) string {
return i18n.GetMessage(lang, "welcome", map[string]interface{}{
"Name": name,
})
}

🔄 自动翻译建议

建议仅手动维护中文文件 active.zh.yaml,然后通过脚本或翻译服务生成其他语言:

推荐自动翻译工具:
• 🧠 ChatGPT API
• 🌐 Google Translate API
• 🛠️ 自定义 Golang/YAML 脚本解析与写入

这样可以避免重复劳动,提升翻译一致性与效率。

🌐 Telegram 中的语言码

语言 语言码
英语 en
中文 zh
日语 ja
俄语 ru
乌克兰语 uk

可通过 update.Message.From.LanguageCode 获取 Telegram 用户的语言。

✅ 总结
• 使用 go-i18n 实现多语言是 Golang 项目中最推荐的方式;
• 只需维护主语言(如中文)翻译文件,其他语言通过脚本生成;
• 代码中统一通过 MessageID 和模板数据使用文本,避免硬编码;
• 项目结构清晰,易于扩展和维护。

📘 推荐参考
go-i18n GitHub
golang.org/x/text

如需我进一步提供:自动翻译脚本(中文 → 多语言),欢迎继续留言。

是否还需要我为这个项目生成一个可运行的 Demo 项目?