Source: l10n.js

if (typeof yasp == 'undefined') yasp = { };

(function() {
  if (!yasp.l10n) {
    /** Additional documentation can be found in the {@link https://github.com/yasp/yasp/blob/master/doc/l10n.md|GitHub repository}.
     * @class
     */
    yasp.l10n = {};
  }

  /** returns the name of the currently selected language
   */
  yasp.l10n.getLangName = function () {
    var name = (yasp.Storage["language"] || "").toLowerCase();
    if(!yasp.l10n.lang[name])
      name = "en";
    return name;
  };

  /** translates a single key and replaces placeholders (`{0}`) with values given in the params-parameter.
   * @param key {String} the key to translate
   * @param params {String[]} the parameters to put in the translated string
   */
  yasp.l10n.getTranslation = function (key, params) {
    params = params || [];

    var lang = yasp.l10n.getLangName();
    var str = yasp.l10n.lang[lang][key];
    if(!str) {
      console.log("l10n: could not find string for " + key);
      str = key;
    }
    for (var i = 0; i < params.length; i++) {
      str = str.replace("{" + i + "}", params[i]);
    }
    return str;
  };

  /** translates the whole DOM recursively
   * @see yasp.l10n#translateSingleDomElement
   */
  yasp.l10n.translateDocument = function () {
    var $elements = $('[data-l10n]');
    for (var i = 0; i < $elements.length; i++) {
      var $element = $elements[i];
      yasp.l10n.translateSingleDomElement($element);
    }
  };

  /** translates a DOM-Element using the key given in its data-l10n attribute.
   * @param element {object} the DOM-Element to translate
   * @see yasp.l10n#translateDocument
   */
  yasp.l10n.translateSingleDomElement = function (element) {
    var $element = $(element);
    var key = $element.attr('data-l10n');
    if(key) {
      var params = [];

      for (var i = 0;; i++) {
        var par = $element.attr('data-l10n-p' + i);
        if(!par)
          break;
        params.push(par);
      }

      var str = yasp.l10n.getTranslation(key, params);
      if($element.attr('data-l10n-html') === "true")
        $element.html(str);
      else
        $element.text(str);
    }
  };
})();