Go语言的国际化支持(基于gettext-go)
本文在 Golang中国博客 的地址: http://blog.go-china.org/07-gettext hello,world!假设有以下的程序,输出: "Hello,world!". package main import ( "fmt" ) func main() { fmt.Println("Hello,world!") } 现在要让改程序支持不同语言的用户,然后以本地语言输出相同意思的信息. 这就是很多程序面临的国际化问题. Go语言的国际化思路程序的国际化一般涉及到编码和翻译两个概念. 其中编码一般采用UTF8编码标准,Go语言已经完美支持. 而目前常见翻译技术是Qt的 Go语言目前还没有标准的多国语言翻译方式. 不过笔者已经初步将 Go语言版的 gettext-go 同时也借鉴了 Qt 的翻译上下文特性. 在 GNU gettext 的 可以去 godoc.org 或 gowalker.org 查看 gettext-go 的文档. Go语言的多国语言支持基于 gettext-go,我们可以很容易给Go程序增加多国语言的支持: package main import ( "fmt" "code.google.com/p/gettext-go/gettext" ) func main() { gettext.BindTextdomain("hello","local",nil) gettext.Textdomain("hello") fmt.Println(gettext.Gettext("Hello,world!")) } 其中 按照 GNU gettext 的习惯,简体中文对应的翻译文件为
这里我们使用 运行新的程序程序,发现输出还是: "Hello,world!". 这是因为缺少翻译文件... 生成翻译文件未来,gettext-go 会开发一个 GNU gettext 工具集 中 的 不过目前,我们只能手工支持翻译文件了(还好这个例子只有一个字符串需要翻译). 创建 msgid "" msgstr "" msgctxt "main.main" msgid "Hello,world!" msgstr "你好,世界!" 保存为UTF8编码格式. 然后用 GNU gettext 工具集中的 msgfmt -o hello.mo hello.po 如果是Windows用户,可以下载 poedit 翻译工具. 然后用 poedit 打开 重新运行新的程序程序,还是输出: "Hello,world!" ? 本地的语言环境在上一节,我们已经制作了简体中文的翻译文件 这是因为 gettext-go 翻译时不仅要依赖对应语言的翻译文件,还需要知道要范围为哪种语言(和网上翻译类似,需要知道翻译的目标语言). 如果没有指定翻译语言,gettext-go 会尝试获取本地的默认语言环境,主要是通过检查 我们设置环境变量后重新运行程序(Windows): set LANG=zh_CN go run hello.go 这里时候应该可以输出中文了. 动态切换语言如果不想使用默认的本地语言环境,也可以用 func main() { gettext.BindTextdomain("hello",nil) gettext.Textdomain("hello") // 切换到简体中文 gettext.SetLocale("zh_CN") fmt.Println(gettext.Gettext("Hello,world!")) // 切换到繁体中文 gettext.SetLocale("zh_TW") fmt.Println(gettext.Gettext("Hello,world!")) } 这样可以根据需要采用合适的语言翻译文件. 翻译的上下文Go语言版的 gettext-go 的每个 默认的上下文为包含
上下文对应Go的运行时调用者名称,具体实现在这里: caller.go . 练习题
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- golang学习的点点滴滴:struct匿名字段
- perl – 使用Win32 :: API调用OpenComPort
- Delphi DataSet和JSON互转函数
- [VB.NET]如何判断两个picturebox里的图片相同
- Groovy I / O性能问题
- 将mm / dd / yyyy转换为yyyymmdd(VB.NET)
- Debugging Multithreaded Applications with Delphi
- [LeetCode] 1123. Lowest Common Ancestor of Deepest Leav
- delphi – 为什么精简字体在FireMonkey中无法正确显示?
- php – 如何在Laravel中调用attach或detach时获取`pivot ta