(Translated by https://www.hiragana.jp/)
User:Peacearth/link-ts.js - 维基百科,自由的百科全书 とべ转到内容ないよう

User:Peacearth/link-ts.js

维基百科ひゃっか自由じゆうてき百科ひゃっかぜん

注意ちゅうい保存ほぞんきさき,你必须清じょ浏览缓存才能さいのういた做出てき更改こうかいGoogle ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具こうぐ栏的“刷新さっしん”按钮。まいりHelp:绕过浏览缓存以获取さら帮助。

//Link Translator
//ゆかり[[User:Liangent]]最初さいしょ設計せっけい
//ゆかり[[User:Kovl]]おさむあらため v2015-2-6-7-52
//ゆかり[[user:Panintelize]] さいおさむあらため.2016-02-06
//ゆかり[[User:Peacearth]] 翻譯ほんやくためしげるたい/正體しょうたい版本はんぽん.2016-06-08
//みなもとだい码取[[User:Liangent/Gadgets/Toolkit/linktranslator.uncompressed.js]]
//v2015-2-6-7-52
//此腳ほん依賴いらい其他腳本

$(function() {
mw.loader.using(['jquery.ui']);
var LTUI = {
    Translate:"翻譯ほんやく",
    TranslateLinks:"翻譯ほんやく連結れんけつ",
    LinkTranslator:"連結れんけつ翻譯ほんやく",
    TLTitle:"自動じどう翻譯ほんやくしたがえ其他げん維基百科ひゃっか複製ふくせいてきぶんほん",
    SourceLanguageCode:"目標もくひょう維基てきげんだい碼:",
    OriginalLink:"はら連結れんけつ:",
    NOLINKINPAGE:"此頁ぼつゆうにんなん連結れんけつ",
    Done:"完成かんせい",
    NoWikiEd:"linktranslator.jsあずかWikiEdあいよう,请於ぺーじめんみぎ上角うえすみ暫時ざんじきんようWikiEd。",
    EditMessage:"ゆかり[[User:Peacearth/link-ts|連結れんけつ翻譯ほんやく]]自動じどう翻譯ほんやく;",
    
    //OPTION
    KeepOriginalText:"以原文げんぶん顯示けんじみどりれん:",
    KeepOriginalText2:"以原文げんぶん顯示けんじあいれん:",
    CommentOriginalLink:"注釋ちゅうしゃくげん連結れんけつ:",
    UseLangLink:"またがげん連結れんけつ:",
    
    //STATUS
    PARSEFAILED:"解析かいせき失敗しっぱい",
    ERROR:"錯誤さくご",
    NOLINK:"ぼつゆう連結れんけつ",
    MULTIPLELINK:"連結れんけつ",
    PAGESAME:"ぺーじ面相めんそうどう",
    PAGEDIFF:"ぺーじめん不同ふどう",
    DONTEXIST:"ぺーじめん存在そんざい"
};

var LTConf = {
    SourceLanguageCode:"en",
    KeepOriginalText:"checked", //"checked" OR ""
    KeepOriginalText2:"checked",
    CommentOriginalLink:"",
    UseLangLink:"checked"
};

//clear previous button
$('#wpLinktranslator').remove();

// secure server?
if ((mw.config.get('wgAction') == 'edit' || mw.config.get('wgAction') == 'submit') && mw.config.get('wgServer') == '//zh.wikipedia.org') {
    $('#wpDiff').after('\n<input id="wpLinktranslator" value="' + LTUI.TranslateLinks + '" title="' + LTUI.TLTitle + '" type="button"/>');
    $('#wpLinktranslator').click(LTClick);
}

//variables
var jobid = 0;
var ldsb = '__LEFT_DOUBLE_SQUARE_BRACKETS__';
var EXEConf;

//on click "Translate links" #wpLinktranslator
function LTClick(event) {
    event.preventDefault();
    $('#linktranslator').remove();
    if ($("#wikEdFrameWrapper").css("visibility") == "visible"){
	    alert(LTUI.NoWikiEd);
	    return;
	}
    $('<div id="linktranslator" title="' + LTUI.LinkTranslator + '">' +
        '<label for="linktranslator-source-lang">' + LTUI.SourceLanguageCode + '</label> ' +
        '<input id="linktranslator-source-lang" value="' + LTConf.SourceLanguageCode + '" type="text" /><br />' +
        '<label for="linktranslator-keep-original">' + LTUI.KeepOriginalText + '</label> ' +
        '<input type="checkbox" id="linktranslator-keep-original" ' + LTConf.KeepOriginalText + '/><br />' +
        '<label for="linktranslator-keep-original2">' + LTUI.KeepOriginalText2 + '</label> ' +
        '<input type="checkbox" id="linktranslator-keep-original2" ' + LTConf.KeepOriginalText2 + '/><br />' +
        '<label for="linktranslator-comment-link">' + LTUI.CommentOriginalLink + '</label> ' +
        '<input type="checkbox" id="linktranslator-comment-link" ' + LTConf.CommentOriginalLink + '/><br />' +
        '<label for="linktranslator-lang-link">' + LTUI.UseLangLink + '</label> ' +
        '<input type="checkbox" id="linktranslator-lang-link" ' + LTConf.UseLangLink + '/><br />' +
        '<input id="linktranslator-translate" value="' + LTUI.Translate + '" type="button" /></div>'
        
    ).dialog({
        modal: false,
        close: function() {jobid++;},
        width: 500
    });
    $('#linktranslator-translate').click(TClick);
}

//on click "Translate" #linktranslator-translate
function TClick(event) {
    event.preventDefault();
    var thisjobid = jobid; // or in #wpLinktranslator's click event?
    
    EXEConf = {
		KeepOriginalText:$('#linktranslator-keep-original').prop('checked'),
		KeepOriginalText2:$('#linktranslator-keep-original2').prop('checked'),
		CommentOriginalLink:$('#linktranslator-comment-link').prop('checked'),
		UseLangLink:$('#linktranslator-lang-link').prop('checked')
	};
	
    LTConf.SourceLanguageCode = $('#linktranslator-source-lang').val();
    var api = 'http://' + LTConf.SourceLanguageCode + '.wikipedia.org/w/api.php';
    if (document.location.protocol == 'https:') {
        api = 'https://' + LTConf.SourceLanguageCode + '.wikipedia.org/w/api.php';
    }
    
    var wikitext = $('#wpTextbox1').val();
    // how to make a set to avoid duplicated links?
    var links = $('#wpTextbox1').val().match(/(\[\[)(?!\:?.?.?\:)(?!Image:)(?!File:)(.+?)(\|.+?)?(\]\])/g);
    
    if (links === null) {
        $('#linktranslator').text(LTUI.NOLINKINPAGE);
        return;
    } else { // assert links.length != 0 here.
        $('#linktranslator').dialog( "option", "position", { my: "top", at: "top"} );
        $('#linktranslator').html('<div id="linktranslator-progressbar"></div>');
        $('#linktranslator-progressbar').progressbar();
    }
    
    var respcount = 0;
    // TODO: should be rewritten using jQuery.each
    
    function eachlink(i) {
        var linkidx = i;
        var link = links[i].slice(2, -2);
        
        var linktarget = link;
        // TODO: pipe tricks like [[/subpage/]]?
        var linkdisplay = link;
        var idx = link.indexOf('|');
        if (idx != -1) {
            linktarget = link.substring(0, idx);
            linkdisplay = link.substring(idx + 1);
        }
        $('#linktranslator').append('<div id="linktranslator-item-' + i + '"></div>');
        $('#linktranslator-item-' + i).text(links[i] + ' -> ')
            .append('<span class="linktranslator-item-newlink">...</span>');
        // TODO: if newtarget == linkdisplay?
        // TODO: cannot identify if missing or [[zh:]] (for main page, also blank text)
        $.ajax({
            data: {
                action: 'parse',
                format: 'json',
                page: linktarget,
                prop: 'langlinks',
                redirects: 1
            },
            dataType: "jsonp",
            type: 'POST',
            url: api,
            success: function(data) {
                console.log(data);
                if (thisjobid != jobid) {
                    return;
                }
                
                var llink;
                var newtarget;
                var newlinks;
                
                if(data.parse){
                	//request successful
                    llink = $.grep(data.parse.langlinks, function(e){ return e.lang === 'zh'; });
                } else if(data.error.info){
                	//request completed with error
                    if(data.error.info == "The page you specified doesn't exist")
                        {$('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.DONTEXIST);}
                    else
                        {$('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.ERROR + '(' + data.error.info + ')');}
                    return;
                } else{
                	//error without info field
                    $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.PARSEFAILED);
                    return;
                }
                
                if (llink.length === 1) {
                    newtarget = llink[0]["*"];
                    
                    if(linktarget === newtarget){
                        $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.PAGESAME);
                        return;
                    }
                    
                    //EXEConf.KeepOriginalText
                    if(EXEConf.KeepOriginalText2) {
                        newlinks = ldsb + newtarget + '|' + linkdisplay + ']]';
                    } else {
                        newlinks = ldsb + newtarget + ']]';
                    }
                } else if (llink.length === 0) {
                    if(EXEConf.UseLangLink) {
                        newlinks = '{{link-' + LTConf.SourceLanguageCode + '||' + '';
                        if(EXEConf.KeepOriginalText) {
                            newlinks = '{{tsl|' + LTConf.SourceLanguageCode + '|' + linktarget + '||' + linkdisplay +'}}'; 
                        } else {
                            newlinks = '{{tsl|' + LTConf.SourceLanguageCode + '|' + linktarget + '}}'; 
                        }
                    } else {
                        $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.NOLINK);
                        return;
                    }
                } else {
                   $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.MULTIPLELINK);
                   return;
                }
                
            
                //EXEConf.CommentOriginalLink
                var newcomment;
                if(EXEConf.CommentOriginalLink) {
                    newcomment = '<!-- ' + LTUI.OriginalLink + ldsb + link + ']] -->';
                } else {
                    newcomment = '';
                }
                
                //mark on dialogue
                $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(newlinks.replace(new RegExp(ldsb, 'g'), '[['));
                // only replacing the first is ok, we will run this many times
                wikitext = wikitext.replace(links[linkidx], newlinks + newcomment);
                
            },
            error: function(jqXHR, textStatus, errorThrown) {
                if (thisjobid != jobid) {
                    return;
                }
                $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.ERROR + '(' + textStatus + ')');
            },
            complete: function() {
                if (thisjobid != jobid) {
                    return;
                }
                respcount++;
                $('#linktranslator-progressbar').progressbar('value', respcount * 100 / links.length);
                if (respcount >= links.length) {
                    $('#wpTextbox1').val(wikitext.replace(new RegExp(ldsb, 'g'), '[['));
                    $('#linktranslator').prepend('<div id="linktranlator-done"><strong>' + LTUI.Done + '</strong></div>');
                }
            }
        });//ajax complete
    }//trino complete
    
    for (var i = 0; i < links.length; i++) {eachlink(i);}
    $('#wpSummary').val(LTUI.EditMessage + $('#wpSummary').val());
}

//end
});