请注意:更新本页面后,您可能需要清除浏览器缓存才能看到所作变更的影响。
Google Chrome、Microsoft Edge、Mozilla Firefox、Safari:按住⇧ Shift,同时单击“刷新”。
Google Chrome、Microsoft Edge、Mozilla Firefox、Safari:按住⇧ Shift,同时单击“刷新”。
本文件采用知识共享署名-相同方式共享 4.0 国际(CC BY-SA 4.0)许可协议授权。
- 您可以自由地:
- 分享 – 在任何媒介以任何形式复制、发行本作品
- 演绎 – 修改、转换或以本作品为基础进行创作
- 惟须遵守下列条件:
- 署名 – 您必须给出适当的署名(标明原作者),提供指向本许可协议的链接,同时标明是否(对原始作品)作了修改。您可以用任何合理的方式来署名,但是不得以任何方式暗示许可人为您或您的使用背书(即诱导原作者在不了解协议情况下给你授权)。
- 相同方式共享 – 如果您再混合、转换或者基于本作品进行创作,您必须基于与原先许可协议相同或相兼容的许可协议分发您贡献的作品。
/* 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> */