增加多语言支持

This commit is contained in:
2025-12-07 10:32:36 +08:00
parent 684923f9cb
commit f8f4df4073
9 changed files with 1287 additions and 5 deletions

101
examples/i18n_example.go Normal file
View File

@@ -0,0 +1,101 @@
package main
import (
"fmt"
"log"
"git.toowon.com/jimmy/go-common/factory"
)
func main() {
// 创建工厂实例
fac, err := factory.NewFactoryFromFile("config.json")
if err != nil {
log.Fatal(err)
}
// ====== 方式1从目录加载多个语言文件推荐 ======
// 目录结构:
// locales/
// zh-CN.json
// en-US.json
// ja-JP.json
fac.InitI18n("zh-CN") // 设置默认语言为中文
if err := fac.LoadI18nFromDir("locales"); err != nil {
log.Fatal(err)
}
// 使用示例
fmt.Println("=== 示例1简单消息 ===")
msg1 := fac.GetMessage("zh-CN", "user.not_found")
fmt.Printf("中文: %s\n", msg1)
msg2 := fac.GetMessage("en-US", "user.not_found")
fmt.Printf("英文: %s\n", msg2)
// ====== 方式2从单个文件加载 ======
fmt.Println("\n=== 示例2从单个文件加载 ===")
fac2, _ := factory.NewFactoryFromFile("config.json")
fac2.InitI18n("zh-CN")
fac2.LoadI18nFromFile("locales/zh-CN.json", "zh-CN")
fac2.LoadI18nFromFile("locales/en-US.json", "en-US")
msg3 := fac2.GetMessage("zh-CN", "user.login_success")
fmt.Printf("中文: %s\n", msg3)
// ====== 示例3带参数的消息 ======
fmt.Println("\n=== 示例3带参数的消息 ===")
// 如果消息内容是 "欢迎,%s",可以使用参数
msg4 := fac.GetMessage("zh-CN", "user.welcome", "Alice")
fmt.Printf("中文: %s\n", msg4)
msg5 := fac.GetMessage("en-US", "user.welcome", "Alice")
fmt.Printf("英文: %s\n", msg5)
// ====== 示例4语言回退机制 ======
fmt.Println("\n=== 示例4语言回退机制 ===")
// 如果请求的语言不存在,会使用默认语言
msg6 := fac.GetMessage("fr-FR", "user.not_found") // fr-FR 不存在,使用默认语言 zh-CN
fmt.Printf("法语(不存在,回退到默认语言): %s\n", msg6)
// ====== 示例5高级功能 ======
fmt.Println("\n=== 示例5高级功能 ===")
i18n, _ := fac.GetI18n()
langs := i18n.GetSupportedLangs()
fmt.Printf("支持的语言: %v\n", langs)
hasLang := i18n.HasLang("en-US")
fmt.Printf("是否支持英文: %v\n", hasLang)
// ====== 示例6在HTTP处理中使用 ======
fmt.Println("\n=== 示例6在HTTP处理中使用 ===")
// 在实际HTTP处理中可以从请求头获取语言
// lang := r.Header.Get("Accept-Language") // 例如: "zh-CN,en-US;q=0.9"
// 简化示例,假设从请求中获取到语言代码
userLang := "zh-CN"
errorMsg := fac.GetMessage(userLang, "user.not_found")
fmt.Printf("错误消息: %s\n", errorMsg)
successMsg := fac.GetMessage(userLang, "user.login_success")
fmt.Printf("成功消息: %s\n", successMsg)
// ====== 示例7通过错误码直接返回国际化消息推荐 ======
fmt.Println("\n=== 示例7通过错误码直接返回国际化消息 ===")
// 在实际HTTP处理中Error 方法会自动识别消息代码并返回国际化消息
// 需要确保使用了 middleware.Language 中间件factory.GetMiddlewareChain() 已包含)
//
// 示例代码在HTTP handler中
// func handleGetUser(w http.ResponseWriter, r *http.Request) {
// fac, _ := factory.NewFactoryFromFile("config.json")
//
// // 如果用户不存在,直接传入消息代码,会自动获取国际化消息
// fac.Error(w, r, 404, "user.not_found")
// // 自动从context获取语言由middleware.Language设置返回对应语言的错误消息
// // 返回: {"code": 404, "message": "用户不存在", "message_code": "user.not_found"}
// }
//
// 如果请求头是 Accept-Language: zh-CN返回: {"code": 404, "message": "用户不存在", "message_code": "user.not_found"}
// 如果请求头是 Accept-Language: en-US返回: {"code": 404, "message": "User not found", "message_code": "user.not_found"}
fmt.Println("Error 方法会自动识别消息代码并返回国际化消息和消息代码")
}