MediaWiki:Gadget-ImprovedUploadForm-LanguageHandler.js

MediaWiki系统消息页面
/* global LanguageHandler */
'use strict';

/* <nowiki> */
/**
 * SPDX-License-Identifier: CC-BY-SA-4.0
 * _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}'
 *
 * @source <commons.wikimedia.org/wiki/MediaWiki:LanguageHandler.js>
 */
/**
 * Some basic language support, used by the upload form rewrite.
 * Author: Lupo, January 2008
 * License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0; http://creativecommons.org/licenses/by/3.0)
 * Choose whichever license of these you like best :-)
 */
window.LanguageHandler = {
  languages: [
  // Sorted by language name, not language code! Except for strange scripts...
  {
    text: 'English',
    lang: 'en'
  }, {
    text: '中文',
    lang: 'zh'
  }],
  getSelect: function getSelect(id, preSelect, unknownLabel) {
    var select = document.createElement('select');
    if (id) {
      select.setAttribute('id', id);
      select.setAttribute('name', id);
    }
    // Must have a text node. IE6 doesn't know Node.TEXT_NODE...
    while (unknownLabel && unknownLabel.nodeType !== 3) {
      unknownLabel = unknownLabel.firstChild;
    }
    if (unknownLabel) {
      var unknownOption = document.createElement('option');
      unknownOption.setAttribute('value', 'unknown');
      unknownOption.appendChild(document.createTextNode(unknownLabel.data.replace(/^\s+/, '').replace(/\s+$/, '')));
      if (!preSelect) {
        unknownOption.setAttribute('selected', 'selected');
      }
      select.appendChild(unknownOption);
    }
    for (var i = 0; i < LanguageHandler.languages.length; i++) {
      var option = document.createElement('option');
      option.setAttribute('value', LanguageHandler.languages[i].lang);
      if (LanguageHandler.languages[i].lang === preSelect) {
        option.setAttribute('selected', 'selected');
      }
      option.appendChild(document.createTextNode(LanguageHandler.languages[i].text));
      select.appendChild(option);
    }
    return select;
  },
  closestIndex: function closestIndex(langCode) {
    if (typeof langCode !== 'string' || !langCode || !langCode.length) {
      return -1;
    }
    // Check if we have it.
    if (langCode === 'nan' || langCode === 'minnan') {
      langCode = 'zh-min-nan';
    }
    for (var i = 0; i < LanguageHandler.languages.length; i++) {
      if (LanguageHandler.languages[i].lang === langCode) {
        return i;
      }
    }

    // Check for prefix
    var dash = langCode.indexOf('-');
    if (dash >= 0) {
      return LanguageHandler.closestIndex(langCode.substring(0, dash));
    }
    return -1;
  },
  closestLanguage: function closestLanguage(langCode) {
    var idx = LanguageHandler.closestIndex(langCode);
    if (idx < 0) {
      return null;
    }
    return LanguageHandler.languages[idx].lang;
  },
  getPrefix: function getPrefix(langStr) {
    // Given a string, check if any prefix substring matches one of the language codes. If so, return
    // the length of the longest matching language code, otherwise, return zero.
    // Note: if languageHandler.languages were sorted by length of language code, this could be sped up
    // by stopping on the first match. But the benefits of human-readability of the list in alphabetical
    // order outweigh this performance consideration.
    var matchLength = 0;
    for (var i = 0; i < LanguageHandler.languages.length; i++) {
      var l = LanguageHandler.languages[i].lang.length;
      if (l <= langStr.length && l > matchLength && langStr.substr(0, l) === LanguageHandler.languages[i].lang) {
        matchLength = l;
      }
    }
    return matchLength;
  }
};
// end LanguageHandler

/* </nowiki> */