59 lines
2.1 KiB
Go
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"))
|
||
|
|
}
|