注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
// [[w:en:User:PleaseStand/userinfo.js]] 的移植版  function UserinfoJsFormatQty(qty, singular, plural) {     return String(qty).replace(/\d{1,3}(?=(\d{3})+(?!\d))/g, "$&,") + "\u00a0" + (qty == 1 ? singular : plural); }  function UserinfoJsFormatDateRel(old) { // The code below requires the computer's clock to be set correctly.             var age = new Date().getTime() - old.getTime();             var ageNumber, ageRemainder, ageWords;             if(age < 60000) {                 // less than one minute old                 ageNumber = Math.floor(age / 1000);                 ageWords = UserinfoJsFormatQty(ageNumber, "秒", "秒");             } else if(age < 3600000) {                 // less than one hour old                 ageNumber = Math.floor(age / 60000);                 ageWords = UserinfoJsFormatQty(ageNumber, "分钟", "分钟");             } else if(age < 86400000) {                 // less than one day old                 ageNumber = Math.floor(age / 3600000);                 ageWords = UserinfoJsFormatQty(ageNumber, "小时", "小时");                 ageRemainder = Math.floor((age - ageNumber * 3600000) / 60000);             } else if(age < 604800000) {                 // less than one week old                 ageNumber = Math.floor(age / 86400000);                 ageWords = UserinfoJsFormatQty(ageNumber, "天", "天");             } else if(age < 2592000000) {                 // less than one month old                 ageNumber = Math.floor(age / 604800000);                 ageWords = UserinfoJsFormatQty(ageNumber, "周", "周");             } else if(age < 31536000000) {                 // less than one year old                 ageNumber = Math.floor(age / 2592000000);                 ageWords = UserinfoJsFormatQty(ageNumber, "月", "月");             } else {                 // one year or older                 ageNumber = Math.floor(age / 31536000000);                 ageWords = UserinfoJsFormatQty(ageNumber, "年", "年");                 ageRemainder =                     Math.floor((age - ageNumber * 31536000000) / 2592000000);                 if(ageRemainder) {                     ageWords += " " +                         UserinfoJsFormatQty(ageRemainder, "月", "月");                 }            }            return ageWords; }  // If on a user or user talk page, and not a subpage... if((mw.config.get("wgNamespaceNumber") == 2 || mw.config.get("wgNamespaceNumber") == 3) && !(/\//.test(mw.config.get("wgTitle")))) {        // add a hook to...     mw.loader.using( ['mediawiki.util'], function() { $(function(){         // Request the user's information from the API.         // Note that this is allowed to be up to 5 minutes old.         var et = encodeURIComponent(mw.config.get("wgTitle"));                  $.getJSON(mw.config.get("wgScriptPath") + "/api.php?format=json&action=query&list=users|usercontribs&usprop=blockinfo|editcount|gender|registration|groups&uclimit=1&ucprop=timestamp&ususers=" + et + "&ucuser=" + et + "&meta=allmessages&amprefix=grouppage-&amincludelocal=1")         .done(function(query) {             // When response arrives extract the information we need.             if(!query.query) { return; } // Suggested by Gary King to avoid JS errors --PS 2010-08-25             query = query.query;             var user, invalid, missing, groups, groupPages={}, editcount, registration, blocked, gender, lastEdited;             try {                 user = query.users[0];                 invalid = typeof user.invalid != "undefined";                 missing = typeof user.missing != "undefined";                 groups = (typeof user.groups == "object") ? user.groups : [];                 editcount = (typeof user.editcount == "number") ? user.editcount : null;                 registration = (typeof user.registration == "string") ?                     new Date(user.registration) : null;                 blocked = typeof user.blockedby != "undefined";                 gender = (typeof user.gender == "string") ? user.gender : null;                 lastEdited = (typeof query.usercontribs[0] == "object") &&                     (typeof query.usercontribs[0].timestamp == "string") ?                     new Date(query.usercontribs[0].timestamp) : null;                 for (var am=0; am<query.allmessages.length; am++) {                 	groupPages[query.allmessages[am]["name"].replace("grouppage-","")] = query.allmessages[am]["*"].replace("{{ns:project}}:","Project:");                 }             } catch(e) {                 return; // Not much to do if the server is returning an error (e.g. if the username is malformed).             }              // Format the information for on-screen display                          var statusText = "";             var ipUser = false;             var ipv4User = false;             var ipv6User = false;              // User status             if(blocked) {                 statusText += "<a href=\"" + mw.config.get("wgScriptPath") +                     "/index.php?title=Special:Log&amp;page=" +                      encodeURIComponent(mw.config.get("wgFormattedNamespaces")[2] + ":" + user.name) +                     "&amp;type=block\">blocked</a> ";             }             if (missing) {                 statusText += "username not registered";             } else if (invalid) {                 ipv4User = mw.util.isIPv4Address(user.name);                 ipv6User = mw.util.isIPv6Address(user.name);                 ipUser = ipv4User || ipv6User;                 if (ipv4User) {                     statusText += "匿名 IPv4 用户";                 } else if (ipv6User) {                     statusText += "匿名 IPv6 用户";                 } else {                     statusText += "无效用户名";                 }             } else {                 // User is registered and may be in a privileged group. Below we have a list of user groups.                 // Only need the ones different from the software's name (or ones to exclude), though.                 var friendlyGroupNames = {                     // Exclude implicit user group information provided by MW 1.17 --PS 2010-02-17                     '*': false,                     'user': false,                     'autoconfirmed': false,                     sysop: "管理员",                     accountcreator: "账号创建者",                     'import': "导入者",                     transwiki: "跨维基导入者",                     'ipblock-exempt': "IP 封禁免除",                     confirmed: "确认用户",                     abusefilter: "过滤器管理员",                     'abusefilter-helper': "过滤器帮手",                     autoreviewer: "自动巡查者",                     filemover: "文件移动着",                     'massmessage-sender': "大批消息发送者",                     templateeditor: "模板编辑者",                     extendedconfirmed: "延长确认用户",                     extendedmover: "界面移动者",                     reviewer: "待编辑审查者",                     suppress: "安全者",                     patroller: "新界面巡查者",                     copyviobot: "版权侵犯机器人",                     eventcoordinator: "活动组织者",                     'interface-admin': "系统管理员",                     temp: "临时用户"                 };                                  var friendlyGroups = [];                 for(var i = 0; i < groups.length; ++i) { 					var s = groups[i];                     var t = friendlyGroupNames.hasOwnProperty(s) ? friendlyGroupNames[s] : s;                     if (t) {                     	if (groupPages.hasOwnProperty(s)) {                     		friendlyGroups.push("<a href=\"/wiki/" + encodeURIComponent( groupPages[s] ) + "\">" + t + "</a>");                     	} else {                     		friendlyGroups.push(t);                     	}                     }                 }                 switch(friendlyGroups.length) {                     case 0:                         // User not in a privileged group                         // Changed to "registered user" by request of [[User:Svanslyck]]                         // --PS 2010-05-16                                                  // statusText += "user";                         if(blocked) {                             statusText += "用户";                         } else {                             statusText += "注册用户";                         }                         break;                     case 1:                         statusText += friendlyGroups[0];                         break;                     case 2:                         statusText += friendlyGroups[0] + " and " + friendlyGroups[1];                         break;                     default:                         statusText += friendlyGroups.slice(0, -1).join(", ") +                             ", and " + friendlyGroups[friendlyGroups.length - 1];                         break;                 }             }                              // Registration date             if(registration) {             	var firstLoggedUser = new Date("22:16, 7 September 2005"); // When the [[Special:Log/newusers]] was first activated             	if(registration >= firstLoggedUser) {             		statusText += ", <a href='" + mw.config.get("wgScriptPath") +                     "/index.php?title=Special:Log&amp;type=newusers&amp;dir=prev&amp;limit=1&amp;user=" +                     et + "'>" + UserinfoJsFormatDateRel(registration) + "</a> old";             	} else {             		statusText += ", <a href='" + mw.config.get("wgScriptPath") +                     "/index.php?title=Special:ListUsers&amp;limit=1&amp;username=" +                     et + "'>" + "已注册" + UserinfoJsFormatDateRel(registration) + "</a>";             	}             }                          // Edit count             if(editcount !== null) {                 statusText += ", with " +                     "<a href=\"//tools.wmflabs.org/xtools-ec/?user=" +                     encodeURIComponent(user.name) +                     "&amp;project=en.wikipedia.org&amp;uselang=en\">" +                     UserinfoJsFormatQty(editcount, "编辑", "编辑") + "</a>";             }                          // Prefix status text with correct article             if("AEIOaeio".indexOf(statusText.charAt(statusText.indexOf('>')+1)) >= 0) {                 statusText = "一位" + statusText;             } else {                 statusText = "一位" + statusText;             }              // Add full stop to status text             statusText += ".";              // Last edited --PS 2010-06-27             // Added link to contributions page --PS 2010-07-03             if(lastEdited) {                 statusText += "上次编辑 <a href=\"" + mw.config.get("wgArticlePath").replace("$1", "Special:Contributions/" + encodeURIComponent(user.name)) + "\">" + UserinfoJsFormatDateRel(lastEdited) + " 前</a>.";             }              // Show the correct gender symbol             var fh = document.getElementById("firstHeading") ||                 document.getElementById("section-0");             if(!fh) return; // e.g. Minerva user talk pages             // Add classes for blocked, registered, and anonymous users             var newClasses = [];             if(blocked) {                 newClasses.push("ps-blocked");             }             if(ipUser) {                 newClasses.push("ps-anonymous");             } else if(invalid) {                 newClasses.push("ps-invalid");             } else {                 newClasses.push("ps-registered");             }             fh.className += (fh.className.length ? " " : "") + groups.map(function(s) {                 return "ps-group-" + s;             }).concat(newClasses).join(" ");             var genderSpan = document.createElement("span");             genderSpan.id = "ps-gender-" + (gender || "unknown");             genderSpan.style.paddingLeft = "0.25em";             genderSpan.style.fontFamily = '"Lucida Grande", "Lucida Sans Unicode", "sans-serif"';             genderSpan.style.fontSize = "75%";             var genderSymbol;             switch(gender) {                 case "male": genderSymbol = "\u2642"; break;                 case "female": genderSymbol = "\u2640"; break;                 default: genderSymbol = ""; break;             }             genderSpan.appendChild(document.createTextNode(genderSymbol));             fh.appendChild(genderSpan);              // Now show the other information. Non-standard? Yes, but it gets the job done.             // Add a period after the tagline when doing so. --PS 2010-07-03              var ss = document.getElementById("siteSub");             if(!ss) {                 ss = document.createElement("div");                 ss.id = "siteSub";                 ss.innerHTML = "From Wikipedia, the free encyclopedia";                 var bc = document.getElementById("bodyContent");                 bc.insertBefore(ss, bc.firstChild);             }             ss.innerHTML = '<span id="ps-userinfo">' + statusText + '</span> ' + ss.innerHTML + '.';             ss.style.display = "block";             });     }); }); }