Source: language.js

/**
 * Многоязычность
 *
 * Основная задача класса - перевод интерфейса на различные языки.
 * Большая часть переводов происходит на стороне сервера, для этого служит
 * класс Language на PHP.
 * Класс T работает полностью аналогичным образом, но занимается переводами 
 * только тех элементов интерфейса, которые динамически создаются именно 
 * на стороне клиента.
 * С помощью этого класса также склонять слова в различных падежах.
 * Переводы хранятся в каталоге language. Основной язык системы - русский, 
 * поэтому файл language/ru/ru.php почти пуст, а language/ru/ru.js и вовсе
 * отсутствует.
 *
 * Файлы с переводами вызывают метод {@link setLanguage} и передают в него 
 * объект, ключами которого являются фразы для перевода, а значениями - 
 * переводы этих фраз на нужный язвк. Ключи сгруппированы в логические группы.
 * Описание групп ключей полностью аналогично описанию в классе Language.
 *
 * Для примера см. файл language/en/en.js.
 */
var T = Object.extend({
  language: null,

  /**
   * Сменить язык
   *
   * При смене языка интерфейс не перерисовывается. Этот метод используется 
   * ядром для выбора языка сразу после входа в систему.
   *
   * @param {Object} language Объект с переводами
   */
  setLanguage: function(language)
  {
    this.language = language;
  },

  /**
   * Выполнить перевод фразы на текущий язык
   *
   * @param {string} message Сообщение, которое необходимо перевести
   *
   * @param {string} [section=null] Код раздела 
   * или справочника, в котором необходмио выполнить перевод. 
   * Если перевод для этого раздела не найден,
   * то будет выполнен поиск фразы среди общих переводов. Регистр важен.
   *     Примеры: 'Account', 'Contact', 'Task'
   *
   * @param {string} [type=null] Уточнение, где именно искать перевод.
   * Регистр важен.
   * Примеры: 'Card', 'Filter', 'Domain'
   *
   * @param {int} [section_type=1] Куда указывает section
   * * 1 - искать перевод для раздела. 
   * * 2 - для справочника.
   *
   * @return {string} Переведенная строка. Если перевод не был найден, то 
   * возвращается исходная строка.
   *
   * @example <caption>Примеры выполнения перевода</caption>
   * var message = T.t('Текст сообщения');
   * var caption = T.t('Название') + '&hellip;';
   */
  t: function (message, section, type, section_type) {
    if (this.language == null) {
      return message;
    }
    
    if (typeof(section) == 'undefined') {
      section = null;
    }
    if (typeof(type) == 'undefined') {
      type = null;
    }
    if (typeof(section_type) == 'undefined') {
      section_type = 1;
    }

    var translate = message;

    var where = section ? section : 'common';
    where += type ? '&'+type : '';
    // Если раздел
    if (section && section_type == 1 
    && typeof(this.language['sections']) != 'undefined'
    && typeof(this.language['sections'][where]) != 'undefined'
    && this.language['sections'][where][message]) {
      translate = this.language['sections'][where][message];
    }
    // Если справочник (с типом - карточка, грид и т.д.)
    else if (section && section_type == 2 
    && typeof(this.language['dictionaries']) != 'undefined'
    && typeof(this.language['dictionaries'][where]) != 'undefined'
    && this.language['dictionaries'][where][message]) {
      translate = this.language['dictionaries'][where][message];
    }
    // Если справочник (без указания типа)
    else if (section && section_type == 2 
    && typeof(this.language['dictionaries']) != 'undefined'
    && typeof(this.language['dictionaries'][section]) != 'undefined'
    && this.language['dictionaries'][section][message]) {
      translate = this.language['dictionaries'][section][message];
    }
    // В общих справочниках
    else if (section_type == 2 
    && typeof(this.language['common&Dictionary']) != 'undefined'
    && this.language['common&Dictionary'][message]) {
      translate = this.language['common&Dictionary'][message];
    }
    // Общее - с типом
    else if (typeof(this.language[where]) != 'undefined'
    && this.language[where][message]) {
      translate = this.language[where][message];
    }
    // Общее (кроме справочников)
    else if (section_type != 2 
    && typeof(this.language['common']) != 'undefined'
    && this.language['common'][message]) {
      translate = this.language['common'][message];
    }
    return translate;
  }
});