includes/clientside/static/l10n.js
author Dan
Sun, 21 Dec 2008 16:54:04 -0500
changeset 780 f65e35566b63
parent 588 20484deb89cd
child 1196 704ba4b9819b
permissions -rw-r--r--
A few fixes to the most recently added feature: more efficiency tweaks, tweaked l10n to have beetter fetch-on-demand support to ensure that stubs are never returned

/*
 * Enano client-side localization library
 */

var Language = function(lang_id)
{
  var have_lang = false;
  
  if ( typeof(enano_lang) == 'object' )
  {
    if ( typeof(enano_lang[lang_id]) == 'object' )
    {
      have_lang = true;
    }
  }
  if ( !have_lang )
  {
    // load the language file
    load_show_win('strings');
    console.info('Loading language ' + lang_id + ' via AJAX synchronous request');
    var ajax = ajaxMakeXHR();
    var uri = makeUrlNS('Special', 'LangExportJSON/' + lang_id);
    ajax.open('GET', uri, false);
    ajax.send(null);
    if ( ajax.readyState == 4 && ajax.status == 200 )
    {
      eval_global(ajax.responseText);
    }
    load_hide_win();
  }
  
  if ( typeof(enano_lang) != 'object' )
    return false;
  if ( typeof(enano_lang[lang_id]) != 'object' )
    return false;
  this.strings = enano_lang[lang_id];
  this.lang_id = lang_id;
  this.placeholder = false;
  
  this.get = function(string_id, subst)
  {
    var catname = string_id.substr(0, string_id.indexOf('_'));
    var string_name = string_id.substr(string_id.indexOf('_') + 1);
    if ( typeof(this.strings[catname]) != 'object' )
      return string_id;
    if ( typeof(this.strings[catname][string_name]) != 'string' )
      return string_id;
    return this.perform_subst(this.strings[catname][string_name], subst);
  }
  
  this.perform_subst = function(str, subst)
  {
    var this_regex = /%this\.([a-z0-9_]+)%/;
    var match;
    while ( str.match(this_regex) )
    {
      match = str.match(this_regex);
      str = str.replace(match[0], this.get(match[1]));
    }
    // hackish workaround for %config.*%
    str = str.replace(/%config\.([a-z0-9_]+)%/g, '%$1%');
    if ( typeof(subst) == 'object' )
    {
      for ( var i in subst )
      {
        if ( !i.match(/^([a-z0-9_]+)$/) )
          continue;
        var regex = new RegExp('%' + i + '%', 'g');
        str = str.replace(regex, subst[i]);
      }
    }
    return str;
  }
  
}

var language_onload = function()
{
  $lang = new Language(ENANO_LANG_ID);
}

var $lang = {
  get: function(t, s) {
    language_onload();
    return $lang.get(t, s);
  },
  placeholder: true
};