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