Fandom Developers Wiki
m (Real Rollback has quotations)
(fr: Correct translation)
Line 81: Line 81:
 
title: 'Rollback révoque la/le(s) modification(s) du dernier contributeur de cette page en un clic',
 
title: 'Rollback révoque la/le(s) modification(s) du dernier contributeur de cette page en un clic',
 
failGeneral: 'Impossible de révoquer',
 
failGeneral: 'Impossible de révoquer',
failRevisions: 'Echec de l\'obtention des révisions',
+
failRevisions: 'Échec de l\'obtention des révisions',
failContent: 'Echec de l\'obtention du contenu de la page',
+
failContent: 'Échec de l\'obtention du contenu de la page',
 
failEditor: 'Aucun éditeur différent n\'a été trouvé',
 
failEditor: 'Aucun éditeur différent n\'a été trouvé',
failPublish: 'Echec de la publication de la modification',
+
failPublish: 'Échec de la publication de la modification',
 
success: 'Révocation(s) réussie(s) !',
 
success: 'Révocation(s) réussie(s) !',
 
rollback: 'révocation',
 
rollback: 'révocation',
summary1: 'Révoqué les modifications par',
+
summary1: 'Révocation des modifications de',
summary2: 'à la dernière version par',
+
summary2: 'à la dernière version de',
 
script: 'script',
 
script: 'script',
 
talk: 'discussion',
 
talk: 'discussion',

Revision as of 09:40, 20 December 2019

/*
 * @name:               Rollback
 * @description:        Perform rollbacks without needing to be in the usergroup
 * @author:             Ozank Cx <dev.fandom.com/wiki/User:Ozank_Cx>
 *                      Cleanup/+i18n by Count of Howard <dev.fandom.com/wiki/User:Count_of_Howard>
 */

(function() {
    if ($('.mw-rollback-link').length || $('.mw-custom-rollback-link').length || window.RollbackWikiDisable) {
        return;
    }

    var config = mw.config.get([
        'wgAction',
        'wgPageName',
        'wgContentLanguage',
        'wgCanonicalSpecialPageName'
    ]),
    i18n = {
        'en': {
            title: '"Rollback" reverts edit(s) to this page of the last contributor in one click',
            failGeneral: 'Unable to rollback',
            failRevisions: 'Failed to get revisions',
            failContent: 'Failed to get page content',
            failEditor: 'No different editor found',
            failPublish: 'Failed to publish edit',
            success: 'Rollback successful',
            rollback: 'rollback',
            summary1: 'Reverted edits by',
            summary2: 'to last version by',
            script: 'script',
            talk: 'talk',
            block: 'block'
        },
        'be': {
            title: 'Адкат дазваляе прыбраць змены, занесеныя апошнім рэдактарам, у адзін клік',
            failGeneral: 'Не ўдалося адкаціць',
            failRevisions: 'Не ўдалося зрабіць змены',
            failContent: 'Не ўдалося атрымаць змесціва старонкі',
            failEditor: 'Рэдактар не знойдзены',
            failPublish: 'Не ўдалося апублікаваць змены',
            success: 'Адкат паспяхова завершаны',
            rollback: 'адкат',
            summary1: 'Адкочаныя змены:',
            summary2: 'да апошняй версіі ад',
            script: 'скрыпт',
            talk: 'сцяна',
            block: 'заблакаваць'
        },
        'de': {
            title: 'Macht alle letzten Änderungen der Seite, die vom gleichen Benutzer vorgenommen worden sind, durch nur einen Klick rückgängig.',
            failGeneral: 'Zurücksetzten ist nicht möglich',
            failRevisions: 'Versionsgeschichten konnten nicht geladen werden',
            failContent: 'Seiteninhalt konnte nicht geladen werden',
            failEditor: 'Es wurde kein anderer Bearbeiter gefunden',
            failPublish: 'Bearbeitung konnte nicht veröffentlicht werden',
            success: 'Erfolgreich zurückgesetzt',
            rollback: 'Zurücksetzen',
            summary1: 'Rückgängig machen von Änderungen durch',
            summary2: 'zu der letzten Version von',
            script: 'Skript',
            talk: 'Diskussion',
            block: 'Sperren'
        },
        'es': {
            title: '«Revertir» revierte todas las ediciones del último usuario con un solo clic',
            failGeneral: 'No se ha podido revertir',
            failRevisions: 'Error al obtener revisiones',
            failContent: 'Error al obtener contenido de la página',
            failEditor: 'No se han encontrado editores diferentes',
            failPublish: 'Error al publicar la edición',
            success: 'Revertido correctamente',
            rollback: 'revertir',
            summary1: 'Revertidos los cambios de ',
            summary2: 'a la última edición de',
            script: 'script',
            talk: 'disc.',
            block: 'bloquear'
        },
        'fr': {
            title: 'Rollback révoque la/le(s) modification(s) du dernier contributeur de cette page en un clic',
            failGeneral: 'Impossible de révoquer',
            failRevisions: 'Échec de l\'obtention des révisions',
            failContent: 'Échec de l\'obtention du contenu de la page',
            failEditor: 'Aucun éditeur différent n\'a été trouvé',
            failPublish: 'Échec de la publication de la modification',
            success: 'Révocation(s) réussie(s) !',
            rollback: 'révocation',
            summary1: 'Révocation des modifications de',
            summary2: 'à la dernière version de',
            script: 'script',
            talk: 'discussion',
            block: 'bloquer'
        },
        'it': {
            title: '"Rollback" annulla le modifiche a questa pagina dell\'ultimo contributore con un solo clic',
            failGeneral: 'Impossibile eseguire il rollback',
            failRevisions: 'Impossibile ottenere le modifiche',
            failContent: 'Impossibile ottenere il contenuto della pagina',
            failEditor: 'Nessun editor diverso trovato',
            failPublish: 'Impossibile pubblicare la modifica',
            success: 'Rollback eseguito correttamente',
            rollback: 'rollback',
            summary1: 'Annullate le modifiche di',
            summary2: ', riportata alla versione precedente di',
            script: 'script',
            talk: 'discussione',
            block: 'blocca'
        },
        'ko': {
            title: '롤백은 한 클릭안에 편집들을 전 사용자의 개정으로 되돌립니다',
            failGeneral: '롤백을 할수가 없습니다',
            failRevisions: '수정을 찾을수가 없었습니다',
            failContent: '패이지 내용을 찾을수가 없었습니다',
            failEditor: '다른 편집자를 찾을수가 없었습니다',
            failPublish: '편집을 올릴수가 없었습니다',
            success: '롤백 성공',
            rollback: '롤백',
            summary1: '사용자의 편집들이 되돌려졌습니다:',
            summary2: '이 사용자의 개정으로:',
            script: '스크립트',
            talk: '톡',
            block: '블록'
        },
        'pl': {
            title: 'Rollback pozwala cofać edycje do wersji poprzedniego autora jednym kliknięciem',
            failGeneral: 'Nie udało się zrewertować edycji',
            failRevisions: 'Nie udało się pobrać wersji',
            failContent: 'Nie udało się pobrać zawartości strony',
            failEditor: 'Strona ma tylko jednego edytora',
            failPublish: 'Nie udało się opublikować edycji',
            success: 'Rewert udany',
            rollback: 'rewert',
            summary1: 'Wycofano ostatnie edycje użytkownika',
            summary2: 'do poprzedniej wersji autorstwa',
            script: 'skrypt',
            talk: 'dyskusja',
            block: 'blokada'
        },
        'ru': {
            title: 'Откат позволяет убрать изменения, внесённые последним редактором, в один клик',
            failGeneral: 'Не удалось откатить',
            failRevisions: 'Не удалось сделать изменения',
            failContent: 'Не удалось получить содержимое страницы',
            failEditor: 'Редактор не найден',
            failPublish: 'Не удалось опубликовать изменения',
            success: 'Откат успешно завершён',
            rollback: 'откатить',
            summary1: 'Откаченные изменения:',
            summary2: 'к последней версии от',
            script: 'скрипт',
            talk: 'стена',
            block: 'заблокировать'
        },
        'tr': {
            title: 'Geri alma işlemi, son katılımcının bu sayfasını tek bir tıklamayla değiştirir',
            failGeneral: 'Geri alınamıyor',
            failRevisions: 'Düzeltmeler alınamadı',
            failContent: 'Sayfa içeriği alınamadı',
            failEditor: 'Farklı bir editör bulunamadı',
            failPublish: 'Düzenleme yayınlanamadı',
            success: 'Geri alma başarılı',
            rollback: 'rollback',
            summary1: 'Yapılan düzenlemeler',
            summary2: 'son versiyona göre',
            script: 'komut',
            talk: 'tartışma',
            block: 'engelle'
        },
        'uk': {
            title: 'Відкат дозволяє прибрати зміни, внесені останнім редактором, в один клік',
            failGeneral: 'Не вдалося відкотити',
            failRevisions: 'Не вдалося зробити зміни',
            failContent: 'Не вдалося отримати вміст сторінки',
            failEditor: 'Редактор не знайдено',
            failPublish: 'Не вдалося опублікувати зміни',
            success: 'Відкат успішно завершено',
            rollback: 'відкинути',
            summary1: 'Відкочені зміни:',
            summary2: 'до останньої версії від',
            script: 'скрипт',
            talk: 'обговорення',
            block: 'заблокувати'
        },
        'zh': {
            title: '回退能一键恢复本页面最后一位编辑者的贡献',
            failGeneral: '无法回退',
            failRevisions: '无法获取修订版本',
            failContent: '无法获取页面内容',
            failEditor: '无法找到另一位编辑者',
            failPublish: '发布编辑失败',
            success: '回退成功',
            rollback: '回退',
            summary1: '已恢复由',
            summary2: '的编辑至最后一个修订版本由',
            script: '脚本',
            talk: '讨论',
            block: '封禁'
        },
        'zh-hant': {
            title: '回退能一鍵恢復本頁面最後一位編輯者的貢獻',
            failGeneral: '無法回退',
            failRevisions: '無法讀取修訂版本',
            failContent: '無法讀取頁面內容',
            failEditor: '無法找到另一位編輯者',
            failPublish: '發布編輯失敗',
            success: '回退成功',
            rollback: '回退',
            summary1: '已恢復由',
            summary2: '的編輯至最後一個修訂版本由',
            script: '腳本',
            talk: '討論',
            block: '封禁'
        }
    },
    lang = i18n[config.wgContentLanguage] || i18n[config.wgContentLanguage.split('-')[0]] || i18n.en;

    function init() {
        var rollbackLinkParams = {
            style: 'cursor: pointer',
            title: lang.title
        };

        if (
            config.wgAction === 'history' &&
            $('#pagehistory li').length > 1
        ) {
            rollbackLinkParams['data-id'] = config.wgPageName;
            $('#pagehistory li:first .mw-history-undo a').before(
                $('<span/>', {
                    class: 'mw-custom-rollback-link'
                }).html(
                    buildElement('a', lang.rollback, rollbackLinkParams) + ' | '
                )
            );
        } else if (
            config.wgCanonicalSpecialPageName === 'Contributions'
        ) {
            rollbackLinkParams['data-id'] = $('#mw-content-text ul').find('a:first').attr('title');
            $('#mw-content-text ul').find('li').each(
                function() {
                    if ($(this).find('.mw-uctop').length) {
                        $(this).append(
                            $('<span/>', {
                                class: 'mw-custom-rollback-link'
                            }).html(
                                '[' + buildElement('a', lang.rollback, rollbackLinkParams) + ']'
                            )
                        );
                    }
                }
            );
        } else if (
            $('#differences-nextlink').length === 0 &&
            (
                $.getUrlVar('diff') || 
                $.getUrlVar('oldid')
            )
        ) {
            rollbackLinkParams['data-id'] = config.wgPageName;
            $('.mw-usertoollinks:last').after(
                '&nbsp;&nbsp;&nbsp;&nbsp;<span class="mw-custom-rollback-link">' +
                '[' + buildElement('a', lang.rollback, rollbackLinkParams) + ']</span>'
            );
        }

        $('.mw-custom-rollback-link a').click(
            function() {
                getRevisionIdAndContent($(this).attr('data-id'), handleData);
                $(this).parent().remove();
            }
        );
    }

    function buildElement(tag, html, attrs) {
        if (typeof(html) !== 'string') {
            attrs = html;
            html = null;
        }

        var h = '<' + tag;
        for (var attr in attrs) {
            if (attrs[attr] === false) {
                continue;
            }

            h += ' ' + attr + '="' + mw.html.escape(attrs[attr]) + '"';
        }
        return h += html ? ">" + mw.html.escape(html) + "</" + tag + ">" : "/>";
    }

    function getRevisionIdAndContent(title, callback) {
        new mw.Api().get({
            action: 'query',
            prop: 'revisions',
            titles: title,
            rvprop: 'user|ids',
            rvlimit: 500,
            cb: new Date().getTime()
        }).done(
            function(d) {
                if (!d.error) {
                    callback(title, d);
                } else {
                    new BannerNotification(
                        lang.failGeneral + ' (' + lang.failRevisions + '): ' + d.error.code, 'error'
                    ).show();
                }
            }
        ).fail(
            function() {
                new BannerNotification(
                    lang.failGeneral + ' (' + lang.failRevisions + ')', 'error'
                ).show();
            }
        );
    }

    function handleData(title, data) {
        var revisions;

        for (var i in data.query.pages) {
            revisions = data.query.pages[i].revisions;
        }

        var currentUser = revisions[0].user,
            lastUser,
            revId;

        for (var i in revisions) {
            if (revisions[i].user != currentUser) {
                lastUser = revisions[i].user;
                revId = revisions[i].revid;
                break;
            }
        }

        if (lastUser) {
            new mw.Api().get({
                action: 'query',
                prop: 'revisions',
                rvprop: 'content',
                revids: revId,
                cb: new Date().getTime()
            }).done(
                function(d) {
                    if (!d.error) {
                        var content = "";
                        for (var i in d.query.pages) {
                            if (d.query.pages[i].revisions) {
                                content = d.query.pages[i].revisions[0]["*"];
                            }
                        }
                        performRollback(title, content, currentUser, lastUser);
                    } else {
                        new BannerNotification(
                            lang.failGeneral + ' (' + lang.failContent + '): ' + d.error.code,'error'
                        ).show();
                    }
                }
            ).fail(
                function() {
                    new BannerNotification(
                        lang.failGeneral + ' (' + lang.failContent + ')','error'
                    ).show();
                }
            );
        } else {
            new BannerNotification(
                lang.failGeneral + ' (' + lang.failEditor + ')','error'
            ).show();
        }
    }

    function performRollback(page, text, user, user2) {
        var summary = lang.summary1 + ' [[Special:Contributions/' + user + '|' + user + ']] ([[User_talk:' + user + '|' + lang.talk +
                ']] | [[Special:Block/' + user + '|' + lang.block + ']]) ' + lang.summary2 + user2 + ' ([[w:c:dev:Rollback|' + lang.script + ']])';

        if (summary.length > 150) {
            summary = lang.summary1 + ' ' + user + ' ([[w:c:dev:Rollback|' + lang.script + ']])';
        }

        new mw.Api().post({
            action: 'edit',
            title: page,
            text: text,
            summary: summary,
            token: mw.user.tokens.values.editToken
        }).done(
            function(d) {
                if (!d.error) {
                    new BannerNotification(
                        lang.success + '!', 'confirm'
                    ).show();
                } else {
                    new BannerNotification(
                        lang.failGeneral + ' (' + lang.failPublish + '): ' + d.error.code,'error'
                    ).show();
                }
            }
        ).fail(
            function() {
                new BannerNotification(
                    lang.failGeneral + ' (' + lang.failPublish + ')', 'error'
                ).show();
            }
        );
    }

    init();
})();