golang.org/x/text/message でi18n対応を行う
2 min read
本記事はGo2 Advent Calendar 2019の22日目の記事 およびFusic Advent Calendarの22日目の記事です。
今回はずっと放置していたs3ryのi18n対応を実際に行なってみようと思います
この記事はFusic Tech Blogに投稿したものと同じものです
s3ry
s3ryについては次の記事をご覧ください。
Go製S3クライアントS3ry
要はちょっと便利なS3の操作クライアントです
golang.org/x/text/message
Go準標準パッケージ内にある、国際化のためのパッケージです。
こちらを利用した実際のi18n対応を行なっていきたいと思います
message.NewPrinter を利用して、出力を調整していきます 環境変数 LANGを読み取って、“ja_JP.UTF-8”が指定されている場合は日本語 それ以外が指定されている場合は英語で出力する事にします
i18n.goを利用して、こちらに多言語メッセージを作成していきます
package s3ry
import ( "os"
"golang.org/x/text/language" "golang.org/x/text/message")
// i18nPrinter i18nvar i18nPrinter = message.NewPrinter(language.English)
func init() {
if os.Getenv("LANG") != "ja_JP.UTF-8" { return }
i18nPrinter = message.NewPrinter(language.Japanese)
message.SetString(language.Japanese, "Which bucket do you use?", "どのbucketを利用しますか?")
~ 省略 ~
}メッセージを出力する側はメッセージをi18nPrinter.Sprintfに変更していきます
// SelectBucketAndRegion get Region and Bucketfunc SelectBucketAndRegion() (string, string) {
// for Bucket Search s3ry := NewS3ry(ApNortheastOne) // show Bucket List & select buckets := s3ry.ListBuckets() selectBucket := s3ry.SelectItem(i18nPrinter.Sprintf("Which bucket do you use?"), buckets) ctx := context.Background() // Get bucket's region region, err := s3manager.GetBucketRegion(ctx, s3ry.Sess, selectBucket, ApNortheastOne) if err != nil { awsErrorPrint(err) } return region, selectBucket}これで ja_JP.UTF-8 がLANGに設定されている場合は、日本語のメッセージに
それ以外は英語で出力される様になりました
実際の修正のPull Requestはこちらです
まとめ
Goでi18n対応行なってみました。
少し煩雑さを感じたので、golang.org/x/text/messageを利用した別の方法や
golang.org/x/text/messageを利用した他の方法を模索してみようと思います
明日のGo2 Advent Calendar 2019は@gureguさんです。ご期待ください!