
  jQuery.getScript('includes/languages/sprintf.js');

  var lang = new function Language() {

    /**
    * ISO language code
    *
    * @var string
    */
    var language;

    /**
    * Array of language translations for
    * given language
    *
    * @var array
    */
    var translations = new Array();

    var that = this;

    /**
    * Faux constructor
    */
    this.init = function()
    {
      $.ajax({
        url: 'includes/languages/translations.json.php',
        success: handleAjaxLoad,
        dataType: 'json'
      });
    }

    function handleAjaxLoad(data)
    {
      translations = data;
    }

    /**
    * Gets the translation if found otherwise
    * returns the orignal input string unmodified and
    * adds it to the translation table.
    *
    * @param string string
    * @param mixed ...
    * @param mixed ...
    * ...
    */
    this.get = function(string)
    {
      var args = jQuery.makeArray(arguments);
      args.shift();

      var result = search(string);
      if(result !== false) {
        var string = result;
      }

      // Get formatted string
      if(args.length > 0) {
        var argsString = "'" + args.join("', '") + "'";
        var string = eval("sprintf(string, " + argsString + ")");
      }

      return string;
    }

    /**
    * Returns the plural translation if $num
    * is greater than 1 otherwise returns the
    * singular version.
    *
    * @param integer num
    * @param string singular
    * @param string plural
    * @return string
    */
    this.getPlural = function(num, singular, plural)
    {
      if(num == 1)
        var string = singular;
      else
        var string = plural;

      return this.get(string, num);
    }

    /**
    * Searches the translations array for a matching
    * english string and returns the translation.
    *
    * @param string needle
    */
    function search(needle)
    {
      for(key in translations) {
        if(translations[key].orignal == needle) {
          return translations[key].translated;
        }
      }

      return false;
    }
  }

  $(lang.init);