Closed1

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

yagi_engyagi_eng

使用ライブラリ

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

このスクラップは2024/04/14にクローズされました