Closed1
【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]
的なの渡してもいいかも
参考
このスクラップは2024/04/14にクローズされました