Files
2026-09-20 22:20:16 +08:00

59 lines
2.1 KiB
Go

// 本示例演示 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"))
}