增加多语言支持
This commit is contained in:
101
examples/i18n_example.go
Normal file
101
examples/i18n_example.go
Normal 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 方法会自动识别消息代码并返回国际化消息和消息代码")
|
||||
}
|
||||
38
examples/locales/en-US.json
Normal file
38
examples/locales/en-US.json
Normal file
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"user.not_found": {
|
||||
"code": 100002,
|
||||
"message": "User not found"
|
||||
},
|
||||
"user.login_success": {
|
||||
"code": 0,
|
||||
"message": "Login successful"
|
||||
},
|
||||
"user.welcome": {
|
||||
"code": 0,
|
||||
"message": "Welcome, %s"
|
||||
},
|
||||
"user.logout": {
|
||||
"code": 0,
|
||||
"message": "Logout"
|
||||
},
|
||||
"error.invalid_params": {
|
||||
"code": 100001,
|
||||
"message": "Invalid parameters"
|
||||
},
|
||||
"error.server_error": {
|
||||
"code": 100003,
|
||||
"message": "Server error"
|
||||
},
|
||||
"order.created": {
|
||||
"code": 0,
|
||||
"message": "Order created successfully"
|
||||
},
|
||||
"order.paid": {
|
||||
"code": 0,
|
||||
"message": "Order paid successfully"
|
||||
},
|
||||
"message.count": {
|
||||
"code": 0,
|
||||
"message": "You have %d new messages"
|
||||
}
|
||||
}
|
||||
38
examples/locales/zh-CN.json
Normal file
38
examples/locales/zh-CN.json
Normal file
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"user.not_found": {
|
||||
"code": 100002,
|
||||
"message": "用户不存在"
|
||||
},
|
||||
"user.login_success": {
|
||||
"code": 0,
|
||||
"message": "登录成功"
|
||||
},
|
||||
"user.welcome": {
|
||||
"code": 0,
|
||||
"message": "欢迎,%s"
|
||||
},
|
||||
"user.logout": {
|
||||
"code": 0,
|
||||
"message": "退出登录"
|
||||
},
|
||||
"error.invalid_params": {
|
||||
"code": 100001,
|
||||
"message": "参数无效"
|
||||
},
|
||||
"error.server_error": {
|
||||
"code": 100003,
|
||||
"message": "服务器错误"
|
||||
},
|
||||
"order.created": {
|
||||
"code": 0,
|
||||
"message": "订单创建成功"
|
||||
},
|
||||
"order.paid": {
|
||||
"code": 0,
|
||||
"message": "订单支付成功"
|
||||
},
|
||||
"message.count": {
|
||||
"code": 0,
|
||||
"message": "您有 %d 条新消息"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user