JavaScript MessageFormat - java.text.MessageFormat-szerűség "kliens oldalra"
A probléma: Webes alkalmazásoknál kliens oldalon, nyelv-független módon kezelni a szövegkonstansokat és a konkatenált üzeneteket.
Szükségem volt egy ilyesmire... Negyed óra volt megírni, szerintem rövid és elegáns lett (annak aki értékeli a lambda calculust). IE6 és FF alatt teszteltem, és keresztülhajtottam a jslinten - amit egyébként mindenkinek ajánlok.
/*jslint browser: true, white: true, undef: true, nomen: true */
/*global packages */
packages.nls = {};
packages.nls.MessageFormat = function (pattern) {
this.pattern = pattern;
};
packages.nls.MessageFormat.prototype.format = function (data) {
var v = typeof data === "object" ? data : [data];
return this.pattern.replace(/\{([^{}]*)\}/g, function (a, b) {
var r = v[b];
return typeof r === "undefined" ? a : r;
});
};
Koncepció röviden: példányosítod egy olyan karaterlánccal, ami hullámos/bajszos zárójelek között címkéket tartalmaz. A címkék egész számok vagy szavak lehetnek. A 'format' metódus a paraméterként kapott objektum mezői között keres a címkékkel egyező nevűt, majd ennek értékét behelyettesíti a címke helyére. Tömb esetében az elemek pozíciója értendő a mező neve alatt. Ha a paraméter nem tömb és nem is objektum, akkor becsomagolódik egy tömbbe. Ez egy kis szintaktikai édesítőszer az egyszeri behellyetesítésekre. Egy példán keresztül:
function mftest() {
var div = document.getElementById("mftest");
var mf = new packages.nls.MessageFormat("nulla {0} egy {1} ketto {2} harom {3} bla");
div.appendChild(document.createTextNode(mf));
div.appendChild(document.createTextNode(mf.format(["nulla","egy","ketto","harom"]))); // nulla nulla egy egy ketto ketto harom harom bla
div.appendChild(document.createElement("br"));
div.appendChild(document.createTextNode(mf.format(["nulla","egy","ketto"]))); // nulla nulla egy egy ketto ketto harom {3} bla
div.appendChild(document.createElement("br"));
div.appendChild(document.createTextNode(mf.format(["nulla", 1.0, 3, false]))); // nulla nulla egy 1 ketto 3 harom false bla
div.appendChild(document.createElement("br"));
div.appendChild(document.createTextNode(mf.format("majom"))); // nulla majom egy {1} ketto {2} harom {3} bla
// az ordog nem alszik...
var mf2 = new packages.nls.MessageFormat(" {{a}{b}c}");
var gonosz = {"a":1,"b":2,"c":3,"d":4, "{a}{b}c":666, "a}{b":999 };
for (var i in gonosz) {
alert(i);
}
alert("res:" + mf2.format(gonosz)); // { 1 2 c }
}