Gebruiker:Michielderoo/interwiki-tools.js
Uiterlijk
Opmerking: na het publiceren is het wellicht nodig uw browsercache te legen om de veranderingen te zien.
- Firefox / Safari: houd Shift ingedrukt terwijl u:je op Vernieuwen klikt of druk op Ctrl-F5 of Ctrl-R (⌘-Shift-R op een Mac)
- Google Chrome: druk op Ctrl-Shift-R (⌘-Shift-R op een Mac)
- Edge: houd Ctrl ingedrukt terwijl u:je op Vernieuwen klikt of druk op Ctrl-F5.
/*
Author: Michiel de Roo
released under cc-by-sa 3.0, 2012
==Example configuration==
var interwikiTools = {};
interwikiTools.auto = true;
interwikiTools.sort = true;
interwikiTools.toplinks = ["en", "de", "fr"];
interwikiTools.translateLink = true;
interwikiTools.userConfig = true;
// load language file
mw.loader.load('//nl.chped.com/w/index.php?title=Gebruiker:Michielderoo/interwiki-translation-nl.js&action=raw&ctype=text/javascript');
*/
// initialize default configuration if none
if(typeof interwikiTools=='undefined') {
// init object
var interwikiTools = {};
}
if(!interwikiTools.userConfig) {
interwikiTools.auto = true;
interwikiTools.sort = true;
interwikiTools.translateLink = true;
}
// these interwiki's are put on top of the list
if(!interwikiTools.toplinks) interwikiTools.toplinks = [];
// set default language to english, if no language is set.
if(!interwikiTools.translation) { mw.loader.load('//nl.chped.com/w/index.php?title=Gebruiker:Michielderoo/interwiki-translation-nl.js&action=raw&ctype=text/javascript'); }
// some private variables, don't touch these
interwikiTools.original = [];
interwikiTools.originalTitle = [];
interwikiTools.originalLang = [];
interwikiTools.translated = false;
addLoadEvent(initInterwikiTools);
getWPLanguageCode();
/* Function to translate the interwiki links in the sidebar to another language.
*/
function startInterwikiTools() {
// switch used to create a toggle effect
if(interwikiTools.translated) return resetInterwikiTools();
// initalize the array to order the items
var ordered = [];
var toplinks = [];
var bottomlinks = [];
// create a list of interwikilink classes with their corresponding translation
var translation = [];
for(var key in interwikiTools.translation) {
translation["interwiki-" + key] = interwikiTools.translation[key];
}
// index the toplinks by their short language code (e.g. en, de ,fr)
var toplinksIndex = [];
for(var key in interwikiTools.toplinks) {
toplinksIndex[interwikiTools.toplinks[key]] = 1;
}
// get the main container from sidebar
var container = document.getElementById("p-lang");
if (!container) return;
// get the childs from the container and start to loop
var childs = container.getElementsByTagName("li");
var cnt = 0; var start = interwikiTools.translateLink?1:0; var cnt_bottom = 0;
for (i=start;i<childs.length;i++) {
// get the first class of the element
var matches = childs[i].getAttribute('class').match(/interwiki-[a-z\-]*/);
if(matches && matches.length>0) iwclass = matches[0];
else iwclass="";
// get the anchor element
var anchor = childs[i].getElementsByTagName("a").item(0);
if(iwclass.substring(0,10)=='interwiki-') {
if(translation[iwclass]) {
// swap link title with the translation
anchor.innerHTML = translation[iwclass];
anchor.lang = "en";
// store the element in either the toplinks array or the array to be ordered
if(toplinksIndex[anchor.hreflang]) {
toplinks[anchor.hreflang] = {title: translation[iwclass], content: childs[i]};
}
else {
ordered[cnt++] = {title: anchor.innerHTML, content: childs[i]};
}
}
else {
ordered[cnt++] = {title: anchor.innerHTML, content: childs[i]};
}
}
else {
bottomlinks[cnt_bottom++] = {title: anchor.innerHTML, content: childs[i]};
}
}
// sort the array using locale compare function
if(interwikiTools.sort) ordered.sort(function(a,b) { return a.title.localeCompare(b.title); });
// get ul element so we can remove the old items and put the sorted items back
var ul = container.getElementsByTagName("ul");
if (!ul) return; if (ul.length != 1) return; ul = ul[0];
var button_more;
var buttons = ul.getElementsByTagName("button");
if(buttons.length>0) {
button_more = buttons[0];
}
var child;
// remove all items
while (child = ul.firstChild) {
ul.removeChild(child);
}
// append ordered items
addTranslateLink(container);
for(key in interwikiTools.toplinks) {
if(toplinks[interwikiTools.toplinks[key]])
ul.appendChild(toplinks[interwikiTools.toplinks[key]].content);
}
for (i=0;i<ordered.length;i++) {
ul.appendChild(ordered[i].content);
}
for (i=0;i<bottomlinks.length;i++) {
ul.appendChild(bottomlinks[i].content);
}
try { ul.appendChild(button_more); } catch(err) { }
// toggle translated switch
interwikiTools.translated = !interwikiTools.translated;
}
function initInterwikiTools() {
// get the main container from sidebar
var container = document.getElementById("p-lang");
if (!container) return;
// store the original items
childs = container.getElementsByTagName("li");
for (i=0;i<childs.length;i++) {
interwikiTools.originalTitle[i] = childs[i].getElementsByTagName("a").item(0).innerHTML;
interwikiTools.originalLang[i] = childs[i].getElementsByTagName("a").item(0).lang;
interwikiTools.original[i] = childs[i];
}
addTranslateLink(container);
if(interwikiTools.auto) startInterwikiTools();
}
function resetInterwikiTools() {
// get the main container from sidebar
var container = document.getElementById("p-lang");
if (!container) return;
var ul = container.getElementsByTagName("ul");
if (!ul) return; if (ul.length != 1) return;
ul = ul[0];
var child;
// remove all items
while (child = ul.firstChild) {
ul.removeChild(child);
}
// append ordered items
addTranslateLink(container);
for (i=0;i<interwikiTools.original.length;i++) {
interwikiTools.original[i].getElementsByTagName("a").item(0).innerHTML = interwikiTools.originalTitle[i];
interwikiTools.original[i].getElementsByTagName("a").item(0).lang = interwikiTools.originalLang[i];
ul.appendChild(interwikiTools.original[i]);
}
interwikiTools.translated = !interwikiTools.translated;
}
function addTranslateLink(container) {
if(!interwikiTools.translateLink) return;
newNode = document.createElement("li");
newNode.className = "interwiki-translate";
newNode.innerHTML = "<a href='' onClick='startInterwikiTools(); return false;'>" + interwikiTools.translation["translate"] + "</a>";
var ul = container.getElementsByTagName("ul");
if (ul) {
ul = ul[0];
ul.insertBefore(newNode,ul.firstChild);
}
}
// code by ExpressingIT
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func
} else {
window.onload = function() {
if (oldonload) {
oldonload()
}
func()
}
}
}
// parse the language code from the domain.
function getWPLanguageCode() {
url = window.location.hostname;
return url.match(/(.[^\.]+)/)[1];
}