JavaScriptでjavaのMessageFormatを使う
はじめに
javaのMessageFormatって便利ですよね。
この記事では、 javaのMessageFormatと同様のことをnode.jsでやるならどういった方法があるのか調べたので紹介していきます。
JavaScriptでやりたいこと
例えば、処理失敗時の表示。
「エラーコード{0}エラー内容{1}」のように、
定数化された文字列内にパラメータを与えることで、汎用的に共通関数化するのが目的です。
JavaScriptで疑似MessageFormatを作るために試した3つの方法
javaのMessageFormatを再現するために、まずは以下の3をやってみました
① Template literalを使った方法
② npmのパッケージを使った方法
③ 自作関数での方法
それぞれ紹介していきます。
① Template literalを使った方法
function template(strings, ...keys) {
return (function(...values) {
var result = [strings[0]];
keys.forEach(function(key, i) {
var value = values[key];
result.push(value, strings[i + 1]);
});
return result.join('');
});
}
message = template`こんにちわ${0}。今日の天気は${1}ですね`
var genarateMessage = message;
console.log(genarateMessage('あなた', '晴れ'))
こんな感じでやるとできました。
ただ、例えlogだとしても処理中に文字列を書きたくなくて、定型文はjsonファイルに定義してそれを読み込むようにしたかったので、完全ではないです。
② npmのパッケージを使った方法
※これはうまくいかなかったです。
npmにmessage-formatというのがあったので、これを使えばサクッとできるのではと思いましたが、結果うまくいかず。一応記録として。
まずは以下コマンドでプロジェクトにパッケージをインストール
npm i -s message-format
message-format@6.2.3(バージョンは執筆辞典)と返ってくればインストール完了。
使い方
使いたいjsファイルの先頭でmessage-formatを読み込みます。
var MessageFormat = require('message-format');
メッセージを表示させたい箇所で以下のように記述します。
var message = new MessageFormat('en', 'Hello {0}!');
var formatted = message.format({ 0:'World' });
console.log(formatted)
手順としてはこれだけ。
ドキュメントにはいろいろ書いてありますがどうやらフォーマットが欠落しているのが原因のエラーのよう。これに時間を使うより他の方法を試したので、こちらの成功例はありません。
もし上手く行った方で便利だよーという意見があればぜひ教えてください。
③ 自作関数での方法
この程度のやりたいことなら最初からこれで良かったかもしれません。
function generateMessage(mes,param){
let result
for(i=0; i < param.length; i++){
let index = "{" + i + "}"
result = mes.replace(index,param[i])
}
return result
}
let mes = "これはテスト{0}です{1}"
let param = ["123","456"]
let result = generateMessage(mes,param)
console.log(result)
これでgenerateMessageをどこか共通関数として外出ししておけばいつでも呼び出せますね。
さいごに
今回はJavaScriptでMessageFormatのように文字列の置換をする方法を書いてみました。結果的には関数作っておくというのが一番手っ取り早かったですね。
ちなみにJAVAなら以下のようにして簡単に読み込むことができます。
Test.java
import java.text.MessageFormat;
~~
public static String generateMessage(String message, String[] params) {
MessageFormat mf = new MessageFormat(message);
return mf.format(params);
}
~~
Main.java
String[] param = {hoge, fuga}
Test.generateMessage(Message.testmessage,param)