MediaWiki:Common.js

出自Quickpedia wiki
於 2026年4月25日 (六) 06:18 由 Msnhinet8(留言 | 貢獻) 所做的修訂

注意:在您發布之後,您可能需要清除瀏覽器快取才能看到變更。

  • Firefox或Safari:按住Shift時點擊重新整理,或按Ctrl-F5或Ctrl-R(Mac則為⌘-R)
  • Google Chrome:按Ctrl-Shift-R(Mac則為⌘-Shift-R)
  • Internet Explorer或Edge:按住Ctrl時點擊重新整理,或按Ctrl-F5
  • Opera:按Ctrl-F5。
/**
 * MediaWiki:Common.js(強化完整版)
 * 功能:
 * - 語言切換(簡 / 繁)
 * - 自動暫存(24小時)
 * - 深色模式
 * - 右上角時鐘
 */

mw.loader.using(['mediawiki.util', 'mediawiki.Uri']).then(function () {

    $(function () {

        /* =========================
         * ① 語言切換(簡 / 繁)
         * ========================= */

        var variants = [
            { code: 'zh-tw', label: '繁體' },
            { code: 'zh-cn', label: '简体' }
        ];

        var current =
            mw.config.get('wgUserVariant') ||
            mw.util.getParamValue('variant') ||
            'zh-tw';

        var $langMenu = $('<span>').css({
            marginLeft: '10px',
            fontWeight: 'bold'
        });

        variants.forEach(function (v, i) {
            var $link = $('<a>')
                .text(v.label)
                .css({
                    cursor: 'pointer',
                    margin: '0 4px',
                    color: v.code === current ? '#000' : '#0645ad',
                    textDecoration: v.code === current ? 'underline' : 'none'
                })
                .on('click', function () {
                    var url = new mw.Uri(window.location.href);
                    url.query.variant = v.code;
                    window.location.href = url.toString();
                });

            $langMenu.append($link);
            if (i < variants.length - 1) {
                $langMenu.append(' / ');
            }
        });

        mw.util.addPortletLink(
            'p-personal',
            '#',
            $langMenu.prop('outerHTML'),
            'pt-lang-switch',
            '語言切換'
        );


        /* =========================
         * ② 深色模式
         * ========================= */

        var darkBtn = mw.util.addPortletLink(
            'p-personal',
            '#',
            '深色模式',
            'pt-darkmode'
        );

        $(darkBtn).on('click', function (e) {
            e.preventDefault();
            $('body').toggleClass('dark-mode');

            var isDark = $('body').hasClass('dark-mode');
            localStorage.setItem('dark-mode', isDark ? '1' : '0');
        });

        if (localStorage.getItem('dark-mode') === '1') {
            $('body').addClass('dark-mode');
        }


        /* =========================
         * ③ 右上角時鐘
         * ========================= */

        function updateClock() {
            var now = new Date();
            return now.toLocaleTimeString('zh-TW', { hour12: false });
        }

        var $clock = $('<span>')
            .attr('id', 'mw-clock')
            .css({
                marginLeft: '10px',
                fontWeight: 'bold',
                fontFamily: 'monospace'
            })
            .text(updateClock());

        $('#p-personal').append($clock);

        setInterval(function () {
            $clock.text(updateClock());
        }, 1000);


        /* =========================
         * ④ 自動暫存(24小時)
         * ========================= */

        if (mw.config.get('wgAction') === 'edit') {

            var interval = 600000; // 10分鐘
            var expire = 24 * 60 * 60 * 1000;

            function getKey() {
                return 'autosave_' + mw.config.get('wgPageName');
            }

            setInterval(function () {
                var text = $('#wpTextbox1').val();
                if (!text) return;

                var data = {
                    value: text,
                    time: Date.now()
                };

                localStorage.setItem(getKey(), JSON.stringify(data));
                console.log('已自動暫存');
            }, interval);

            var saved = localStorage.getItem(getKey());

            if (saved) {
                try {
                    var data = JSON.parse(saved);
                    if (Date.now() - data.time < expire) {
                        if (!$('#wpTextbox1').val()) {
                            $('#wpTextbox1').val(data.value);
                            console.log('已還原暫存');
                        }
                    } else {
                        localStorage.removeItem(getKey());
                    }
                } catch (e) {}
            }
        }


        /* =========================
         * ⑤ 訪客預設語言(不干擾轉換)
         * ========================= */

        var isAnon = mw.config.get('wgUserName') === null;

        if (isAnon && !mw.util.getParamValue('variant')) {
            var url = new mw.Uri(window.location.href);
            url.query.variant = 'zh-tw';
            window.location.replace(url.toString());
        }

    });

});