📖

Golangで多言語対応ライブラリのようなものを作ってみた

2022/09/06に公開

背景

  • Golangを学習中で、実践的なコードを書きたかった
  • JSONファイルでエラーメッセージなどを管理できると良さそうと考えた

作ったもの

作ったものは至ってシンプルで、JSONファイルを読み込み、キーを指定することで定義したメッセージを取得できる。 Githubのリンクはこちら。

en.json
{
    "errors": {
        "validate": {
            "null": "column.a cannot be null",
            "invalid-value": "Column {{0}} must be {{1}}"
        },
				"login": {
					"fail": "Login fail"
				}
    },
    "info": {
        "login": {
            "success": "Login success!!"
        }
    }
}
ja.json
{
    "errors": {
        "validate": {
            "null": "column.aはnullにできません",
            "invalid-value": "項目 {{0}} に入力できる値は {{1}} のいずれかです"
        },
				"login": {
					"fail": "ログイン失敗"
				}
    },
    "info": {
        "login": {
            "success": "ログイン成功!!"
        }
    }
}
main.go
package main

import (
	"fmt"
	"log"

	"github.com/capybara-alt/msgutil"
)

func main() {
	if err := msgutil.Init("./sample/*.json"); err != nil {
		log.Fatal(err)
	}

	msg, err := msgutil.GetMassage("ja", "errors", "login", "fail")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(msg)
}

実行結果

~$ go run main.go
ログイン失敗

また、引数を指定して、動的にメッセージを作成することも可能。

main.go
package main

import (
	"fmt"
	"log"
	"strings"

	"github.com/capybara-alt/msgutil"
)

func main() {
	if err := msgutil.Init("./sample/*.json"); err != nil {
		log.Fatal(err)
	}

	msg, err := msgutil.GetMessageArgs([]string{"ja", "errors", "validate", "invalid-value"}, "テスト", strings.Join([]string{"\"テ\"", "\"ス\"", "\"ト\""}, " もしくは "))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(msg)
}

実行結果

~$ go run main.go
項目 テスト に入力できる値は "テ" もしくは "ス" もしくは "ト" のいずれかです

Discussion