// 本示例演示 langx 的典型用法: 用 embed 装载资源、按语言取值、从 context 协商语言。 // // 运行: go run ./example package main import ( "context" "embed" "fmt" "github.com/yuninks/langx" ) //go:embed langs var langFS embed.FS func main() { // 1. 配置(可选): 默认语言、未知 key 的响应码、漏翻回调 if err := langx.InitLangx( langx.SetDefaultLanguage("zh"), langx.SetDefaultCode(500), // code 会被当作 HTTP 状态码时, 建议让缺失的 key 以失败收场 langx.SetMissingHandler(func(lang, key string) { fmt.Printf("[warn] 缺少译文: lang=%s key=%s\n", lang, key) }), ); err != nil { panic(err) } // 2. 装载资源, 四选一: // langx.RegisterEmbed(langFS) // embed.FS(推荐, 单文件部署) // langx.RegisterDir("langs") // 磁盘目录 // langx.RegisterFS(os.DirFS("langs")) // 任意 fs.FS // langx.RegisterTrans("zh", map[string]string{"hello": "你好"}) // 直接给 map if err := langx.RegisterEmbed(langFS); err != nil { panic(err) } // 3. 按语言直接取值 code, msg := langx.GetTrans("zh", "login_success") fmt.Printf("zh login_success => code=%d msg=%s\n", code, msg) code, msg = langx.GetTransFormat("en", "welcome", map[string]string{"name": "Tom"}) fmt.Printf("en welcome => code=%d msg=%s\n", code, msg) // 4. 从请求 context 取语言: 显式设置 > Accept-Language 协商 > 默认语言 // 实际项目中可把 http.Request.Header.Get("Accept-Language") 放进 context ctx := context.WithValue(context.Background(), "Accept-Language", "en-US,en;q=0.9") fmt.Printf("请求头 en-US => 协商语言=%s, welcome=%s\n", langx.GetCtxLang(ctx), langx.GetFormatCtx(ctx, "welcome", map[string]string{"name": "Tom"})) ctx = langx.SetCtxLang(context.Background(), "zh") fmt.Printf("显式指定 zh => welcome=%s\n", langx.GetFormatCtx(ctx, "welcome", map[string]string{"name": "张三"})) // 5. 其它 fmt.Println("已注册语言:", langx.Langs()) fmt.Println("未知 key 的 code:", langx.GetCode("not_exists")) }