🌏
【Go】i18n対応【そのまま使える】
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]
的なの渡してもいいかも
参考
さいごに
Twitterの方でも、モダンな技術習得やサービス開発の様子を発信したりしているので良かったらチェックしてみてください!
Discussion