102 lines
3.8 KiB
Go
102 lines
3.8 KiB
Go
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 方法会自动识别消息代码并返回国际化消息和消息代码")
|
||
}
|