🌏

【Go】i18n対応【そのまま使える】

2024/04/14に公開

Goやi18n対応(国際化対応)の知識は前提として、コードスニペットをサクッと公開!

使用ライブラリ

https://github.com/nicksnyder/go-i18n

コード

i18n.go
package i18n

import (
	"embed"
	"log"
	"os"

	"github.com/nicksnyder/go-i18n/v2/i18n"
	"golang.org/x/text/language"
	"gopkg.in/yaml.v3"
)

type Language string

const (
	JPN Language = "JPN"
	ENG Language = "ENG"
)

func GetLanguage() Language {
	lang := Language(os.Getenv("LANGUAGE"))
	if lang == "" {
		return JPN
	}
	return lang
}

//go:embed *
var files embed.FS

var loc *i18n.Localizer

func Init() {
	lang := GetLanguage()

	tag := language.Japanese
	if lang == ENG {
		tag = language.English
	}

	bundle := i18n.NewBundle(tag)
	bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal)
	if _, err := bundle.LoadMessageFileFS(files, string(lang)+".yaml"); err != nil {
		log.Fatalf("Cannot load message file: %v", err)
	}
	loc = i18n.NewLocalizer(bundle)
}

// ${key}: "MSG001", ...
func GetText(key string) string {
	if loc == nil {
		return ""
	}
	return loc.MustLocalize(&i18n.LocalizeConfig{MessageID: key})
}
JPN.yaml
MSG001: "こんにちは"
ENG.yaml
MSG001: "Hello"

ディレクトリ構造

i18n
| - i18n.go
| - JPN.yaml
| - ENG.yaml

ポイント

  • embedを使って、言語ファイルを実行バイナリに埋め込んでる
  • 環境変数で言語切り替え
    • サーバは言語別想定
    • APIのリクエストでlang=[JPN|ENG]的なの渡してもいいかも

参考

https://qiita.com/KEINOS/items/450a24abf15857a9c828

さいごに

Twitterの方でも、モダンな技術習得やサービス開発の様子を発信したりしているので良かったらチェックしてみてください!

https://twitter.com/yagi_eng/status/1577976208926515200

Discussion