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 }
}
© 2003-2020 lithium.io7.org
Erre a weblapra a Creative Commons Nevezd meg! - Így add tovább! 3.0 Unported Licensz vonatkozik.