スポンサーリンク
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でメッセージの取り扱いに困っている人は参考にしてみてください(*´ω`*)
コメントを残す