TypeScriptでメッセージ用クラス「MessageSource」もどきを作ってみた

スポンサーリンク

JavaのSpringBootではいつもお世話になっている「MessageSource」。

メッセージを外部ファイル化したり、プレースホルダーにメッセージを埋め込んでくれたりと便利なんですよね~

TypeScriptでも同じようなものを探していたのですが、なかったので作ってみました(‘ω’)

準備

必要なライブラリを導入します。

format-messageというライブラリをありがたく利用させてもらいます。
https://www.npmjs.com/package/format-message

こちらのライブラリはプレースホルダーに値を埋め込んでメッセージを作ってくれる優れものです。

npm install format-message
スポンサーリンク

クラス作成

以下のようなソースをMessageSource.tsという名称で作成します。

メッセージファイル読み込みを1回だけにしたいので、シングルトンクラスとして作成してみました。

import * as fs from 'fs';
import formatMessage  from 'format-message';

export class MessageSource {
    private messageDictionary: {[key:string]: string};

    private static instance:MessageSource;

    private constructor() {
        this.messageDictionary = JSON.parse(fs.readFileSync('messages/messages.json', 'utf-8'));
        formatMessage.setup({
            locale: 'ja-JP',
            missingTranslation: 'ignore',
        });
    }

    static getInstance(): MessageSource {
        if (!MessageSource.instance) {
            MessageSource.instance = new MessageSource();
        }
        return MessageSource.instance;
    }

    public getMessage(messageKey:string, ...params: string[]): string | null {
        if (!(messageKey in this.messageDictionary)) {
            return null;
        }

        if (params == null) {
            return this.messageDictionary[messageKey];
        }

        const resultMessage:string = formatMessage(this.messageDictionary[messageKey], params);
        return resultMessage;
    }
}
スポンサーリンク

使い方

まずはメッセージを定義するファイルをmessages/message.jsonに作成します。

中身はこんな感じです。

{
    "MESSAGE01": "hello",
    "MESSAGE02": "my name is {0}"
}

次にMessageSourceを呼び出します。簡単ですね(^^)v

import { MessageSource } from "./message/MessageSource";

const message01 :String = MessageSource.getInstance().getMessage('MESSAGE01') as String; // hello
const message02 :String = MessageSource.getInstance().getMessage('MESSAGE02', 'hoge') as String; // my name is hoge

TypeScriptでメッセージの取り扱いに困っている人は参考にしてみてください(*´ω`*)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です