code: function (text) {
          var langData = data[code] || {};
  
          /**
           * number - string
           * null, undefined and empty string - empty string
           * array - comma-delimited string
           * object - in [object Object]
           * function - in [object Function]
           *
           * @param obj
           * @returns {string}
           */
          function toString(obj) {
            if (Tools.is(obj, 'function')) {
              return Object.prototype.toString.call(obj);
            }
            return !isEmpty(obj) ? '' + obj : '';
          }
  
          function isEmpty(text) {
            return text === '' || text === null || Tools.is(text, 'undefined');
          }
  
          function getLangData(text) {
            // make sure we work on a string and return a string
            text = toString(text);
            return Tools.hasOwn(langData, text) ? toString(langData[text]) : text;
          }
  
  
          if (isEmpty(text)) {
            return '';
          }
  
          if (Tools.is(text, 'object') && Tools.hasOwn(text, 'raw')) {
            return toString(text.raw);
          }
  
          if (Tools.is(text, 'array')) {
            var values = text.slice(1);
            text = getLangData(text[0]).replace(/\{([0-9]+)\}/g, function ($1, $2) {
              return Tools.hasOwn(values, $2) ? toString(values[$2]) : $1;
            });
          }
  
          return getLangData(text).replace(/{context:\w+}$/, '');
        }
docs: Translates the specified text.
  
  It has a few formats:
  I18n.translate("Text");
  I18n.translate(["Text {0}/{1}", 0, 1]);
  I18n.translate({raw: "Raw string"});
  
  @method translate
  @param {String/Object/Array} text Text to translate.
  @return {String} String that got translated.