Jonathan Chan指出Samuel Stauffer 的 go-gettext似乎可以解决问题。给定目录:
~appname/
|~app/
| `-app.go
|+github.com/
`-app.yaml
从(假设 *nix)开始:
$ cd appname
$ git clone git://github.com/samuel/go-gettext.git github.com/samuel/go-gettext
由于下划线在 Go 中的特殊特性,源准备不能使用 _("String to be translate") 短格式。您可以使用 -k 标志告诉 xgettext 查找驼峰式函数名称“GetText”。
最小的工作示例:
package app
import (
"fmt"
"log"
"net/http"
"github.com/samuel/go-gettext"
)
func init () {
http.HandleFunc("/", home)
}
func home(w http.ResponseWriter, r *http.Request) {
d, err := gettext.NewDomain("appname", "locale")
if err != nil {
log.Fatal("Failed at NewDomain.")
}
cat := d.GetCatalog("fr_FR")
if cat == gettext.NullCatalog {
log.Fatal("Failed at GetCatalog.")
}
fmt.Fprintf(w, cat.GetText("Yes."))
}
使用以下命令创建模板:
$ xgettext -d appname -kGetText -s -o appname.pot app/app.go
注意 -k,没有它就没有输出,因为 xgettext 不会识别对 GetText 的调用。在 appname.pot 中编辑相关字符串、电子邮件等。假设我们正在本地化法语:
$ mkdir -p locale/fr_FR/LC_MESSAGES
$ msginit -l fr_FR -o french.po -i appname.pot
编辑法语.po:
# Appname l10n
# Copyright (C) 2013 Wombat Inc
# This file is distributed under the same license as the appname package.
# Wombat <wombat@example.com>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: appname v0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-01-13 11:03+1300\n"
"PO-Revision-Date: 2013-01-13 11:10+1300\n"
"Last-Translator: Rich <rich@example.com>\n"
"Language-Team: French\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: app/app.go:15
msgid "Yes."
msgstr "Oui."
生成二进制文件(将实际与应用程序一起部署的文件):
$ msgfmt -c -v -o locale/fr_FR/LC_MESSAGES/appname.mo french.po
最终目录结构:
~appname/
|~app/
| `-app.go
|~github.com/
| `~samuel/
| `~go-gettext/
| +locale/
| |-catalog.go
| |-domain.go
| `-mo.go
|~locale/
| `~fr_FR/
| `LC_MESSAGES/
| `-appname.mo
`-app.yaml
(go-gettext 下的 locale 目录包含测试数据,可以删除以进行部署。)
如果一切顺利,访问 appname 应该会显示“Oui”。