gettext-go
gettext-go copied to clipboard
v1.0计划
- 目前的API还是从 google code 网址时代继承来的, 需要重新设计简化API和包路径
- gettext是上个世纪的产物, 全局只有一个选择, 改进支持多局部多语言共存
- 目前的context有缺陷, 内部闭包的路径解析不够稳定, 需要重新设计
- 命令行工具, 可以自动从代码提取要翻译的文字, 同时对有问题的用法提供告警(比如传入的是变量字符串)
- v0.1到v1.0的API变化, 尽量保证gofmt命令行替换可以完成升级
- domain绑定到对象, 不同的pkg可以选择不同的domain, context是domain内部的区别, caller不再自动填充
- 自动生成多国文本(调用翻译服务的API/插件模式)
- 增加map类型的翻译文件, 可以作为po文件替代
- 支持单个po/mo文件,和map类型,对于一个具体的翻译
FileSystem.LoadMessagesMap(domain, lang string) (map[string][]string, error)/map[domain][lang][msgid][]string/gettext/mapfs.NewXXX()/jsonString/map[string]interface{}/LoadJsonFile(domain, lang) ([]byte, error) - json:
LoadMessagesFile("hello", "zh_CN", "json"), Json(s) FileSystem - 支持walk/playground等格式的json翻译
- 其它
https://pkg.go.dev/github.com/chai2010/gettext-go
在一个并发的api环境中,setlocale方法,切换了语言,如果保证当前请求的context上下文不会被其他的干扰呢? setlocale以后,再gettext调用,这时候很可能别的协程就把语言切换了,最后得到的不是想要的。
多语言支持:
func Example_multiLang() {
zh := gettext.New("hello", "./examples/locale").SetLanguage("zh_CN")
tw := gettext.New("hello", "./examples/locale").SetLanguage("zh_TW")
fmt.Println(zh.PGettext(
"code.google.com/p/gettext-go/examples/hi.SayHi",
"pkg hi: Hello, world!",
))
fmt.Println(tw.PGettext(
"code.google.com/p/gettext-go/examples/hi.SayHi",
"pkg hi: Hello, world!",
))
// Output:
// 来自"Hi"包的问候: 你好, 世界!(ctx:code.google.com/p/gettext-go/examples/hi.SayHi)
// 來自"Hi"包的問候: 你好, 世界!(ctx:code.google.com/p/gettext-go/examples/hi.SayHi)
}
- https://github.com/chai2010/gettext-go/blob/master/example_test.go#L54
- https://pkg.go.dev/github.com/chai2010/gettext-go
好的,谢谢,清楚了。