Fusic Tech Blog

Fusion of Society, IT and Culture

golang.org/x/text/message でi18n対応を行う
2019/12/22

golang.org/x/text/message でi18n対応を行う

本記事はGo2 Advent Calendar 2019の22日目の記事 およびFusic Advent Calendarの22日目の記事です。

今回はずっと放置していたs3ryのi18n対応を実際に行なってみようと思います

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 i18n
var 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 Bucket
func 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さんです。ご期待ください!

参考文献

Shiro Seike

Shiro Seike

Company:Fusic CO., LTD. Slides:slide.seike460.com blog:blog.seike460.com Program Language:PHP , Go Interest:Full Serverless Architecture