Internationalisation en javascript

Un petit utilitaire que j'utilise depuis près d'un an dans ma bibliothèque javascript et qui permet d'assurer une pseudo-internationalisation des messages d'objets.

/**
 * Objet de gestion d'une pseudo-internationalisation des messages 
 * d'un composant.
 * @class rnb.I18n
 * @constructor
 * @param {String} defaultLang La langue par défaut
 * @param {Object} datas La liste des messages par défaut.
 */
rnb.I18n = function (defaultLang, datas) {
    /**
     * Liste des messages
     * @type {Object}
     * @private
     */
    this.msg = {};
    /**
     * Langue par défaut
     * @type String
     * @private
     */
    this.defaultLang = defaultLang;
    this.set(defaultLang, datas);
    if (!this.msg[rnb.env.LANG]) {
        this.set(rnb.env.LANG, datas);
    }
};
rnb.I18n.prototype = {
    /**
     * Récupérer la traduction d'un message pour la langue courante
     * @param {String} msgName Le nom du message.
     * @param {String} [lang] Langue pour laquelle on veut récupérer le message.
     *      La méthode renvoie sinon le message dans la langue par défaut définie
     *      lors de la construction de l'objet
     * @return {String} La valeur du message
     */
    get : function (msgName, lang) {
        if (lang && this.msg[lang]) {
            return this.msg[lang][msgName];
        }
        return this.msg[rnb.env.LANG][msgName];
    },
    /**
     * Ajouter une traduction des messages en une langue donnée.
     * @param {String} lang Nom de la langue
     * @param {Object} datas Messages traduits.
     */
    set : function (lang, datas) {
        this.msg[lang] = datas;
    },
    /**
     * Récupérer les messages pour une langue donnée
     * @param {String} lang Nom de la langue
     * @return {Object|null} Objet contenant la liste des messages ou null si
     *      la traduction n'existe pas.
     */
    getLang : function (lang) {
        if (this.msg[lang]) {
            return this.msg[lang];
        }
        return null;
    }
};

Pour définir la langue par défaut, j'utilise une variable, rnb.env.LANG, qui récupère la langue par défaut du navigateur web. Elle peut être définie de la manière suivante :

rnb.env.LANG = (navigator.language ? navigator.language : navigator.userLanguage);

Pour utiliser cet objet d'internationalisation (et le mettre à disposition), il est possible - par exemple - d'en faire un membre statique de l'objet considéré.

Contenu indisponible.

Une évolution possible de ce type d'objet pourrait être la possibilité de définir les messages dans des fichiers textes extérieurs, écrits au format JSON par exemple, et de rappatrier leur contenu via une requête asynchrone.