「MediaWiki:Common.js」:修訂間差異

出自Quickpedia wiki
無編輯摘要
無編輯摘要
第1行: 第1行:
/* === MediaWiki Custom Language Variant Handling === */
$(function() {
$(function() {
  var variants = mw.config.get('wgContentLanguageVariants'); // 獲取可用的語言變體
    // 1. **自定義語系下拉選單 (您提供的第一段程式碼)**
    var variants = mw.config.get('wgContentLanguageVariants'); // 獲取可用的語言變體


  if (variants && variants.length > 1) {
     // 篩選出只包含簡體和繁體的變體
     var currentVariant = mw.config.get('wgUserVariant');
     var filteredVariants = [];
     var languageDropdown = $('<div id="zh-variant-dropdown"></div>').append('<label for="zh-variant-select">中文:</label><select id="zh-variant-select"></select>');
     if (variants) {
     var variantSelect = languageDropdown.find('#zh-variant-select');
        for (var i = 0; i < variants.length; i++) {
 
            var variantCode = variants[i];
    for (var i = 0; i < variants.length; i++) {
            if (variantCode === 'zh-tw' || variantCode === 'zh-hant' ||
      var variantCode = variants[i];
                variantCode === 'zh-cn' || variantCode === 'zh-hans') {
      var variantName = '';
                filteredVariants.push(variantCode);
 
            }
      switch (variantCode) {
         }
        case 'zh-tw':
        case 'zh-hant':
          variantName = '中文(繁體)';
          break;
        case 'zh-cn':
        case 'zh-hans':
          variantName = '中文(簡體)';
          break;
        default:
          variantName = variantCode;
      }
 
      var option = $('<option>').val(variantCode).text(variantName);
      if (variantCode === currentVariant) {
         option.prop('selected', true);
      }
      variantSelect.append(option);
     }
     }


     variantSelect.on('change', function() {
     // 如果篩選後有至少兩種語系變體,才建立下拉選單
      var selectedVariant = $(this).val();
    if (filteredVariants.length > 1) {
      var currentUrl = new URL(window.location.href);
        var currentVariant = mw.config.get('wgUserVariant');
      currentUrl.searchParams.set('variant', selectedVariant);
        var languageDropdown = $('<div id="zh-variant-dropdown" class="portal"></div>'); // 增加portal class 讓外觀更像側邊欄組件
      window.location.href = currentUrl.toString();
        languageDropdown.append('<h3>中文</h3>'); // 增加標題
    });
        var variantSelect = $('<select id="zh-variant-select"></select>');


    // 將下拉選單添加到您希望顯示的位置,例如側邊欄頂部
        for (var i = 0; i < filteredVariants.length; i++) {
    $('#mw-panel').prepend(languageDropdown);
            var variantCode = filteredVariants[i];
            var variantName = '';


    // 或者添加到左上角 (需要 CSS 定位,如同之前的討論)
            switch (variantCode) {
    // $('body').prepend(languageDropdown);
                case 'zh-tw':
  }
                case 'zh-hant':
});
                    variantName = '繁體中文';
                    break;
                case 'zh-cn':
                case 'zh-hans':
                    variantName = '簡體中文';
                    break;
                default:
                    // 這裡應該不會執行到,因為上面已經過濾了
                    variantName = variantCode;
            }


/* Language Redirection and Menu Filtering for Simplified/Traditional Chinese */
            var option = $('<option>').val(variantCode).text(variantName);
            if (variantCode === currentVariant) {
                option.prop('selected', true);
            }
            variantSelect.append(option);
        }


(function() {
        variantSelect.on('change', function() {
    // === 1. 自動語系導向邏輯 ===
            var selectedVariant = $(this).val();
    var lang = (navigator.language || navigator.userLanguage).toLowerCase();
            var currentUrl = new URL(window.location.href);
    var simplifiedCodes = ['zh-cn', 'zh-sg', 'zh-hans']; // 簡體中文語系代碼
            // 設置 URL 參數 'variant'
    var traditionalCodes = ['zh-tw', 'zh-hk', 'zh-mo', 'zh-hant']; // 繁體中文語系代碼
            currentUrl.searchParams.set('variant', selectedVariant);
            // 如果頁面當前有 /簡體 或 /繁體 這種路徑,需要移除它們,因為我們現在用 ?variant=
            var pathParts = currentUrl.pathname.split('/');
            var lastPart = pathParts[pathParts.length - 1];
            if (lastPart === '簡體' || lastPart === '繁體') {
                pathParts.pop(); // 移除最後一個部分
                currentUrl.pathname = pathParts.join('/');
            }
            window.location.href = currentUrl.toString();
        });


    var currentURL = window.location.href;
        // 將下拉選單添加到側邊欄頂部 (通常是 #mw-panel 或 #p-navigation)
        // 選擇 #mw-panel 是為了讓它在整個側邊欄的頂部
        $('#mw-panel').prepend(languageDropdown.append(variantSelect));
        // 如果您的維基百科使用的是不同的側邊欄 ID,請調整這裡
        // 例如:$('#p-navigation').prepend(languageDropdown.append(variantSelect));
    }


     // 檢查 URL 中是否已經有繁體或簡體的標示
     // 2. **自動語系導向邏輯 (基於瀏覽器語系,並使用 ?variant= 參數)**
     // 注意:您可能需要根據您的實際URL結構調整 '/簡體' 和 '/繁體'
     // 只有當頁面URL中沒有 `?variant=` 參數時才自動導向
     // 如果您的繁體版本不需要 '/繁體' 這個路徑,或者預設就是繁體,請調整 below!
    var currentUrl = new URL(window.location.href);
    var hasSimplifiedInURL = currentURL.includes('/簡體');
     if (!currentUrl.searchParams.has('variant')) {
    var hasTraditionalInURL = currentURL.includes('/繁體');
        var browserLang = (navigator.language || navigator.userLanguage).toLowerCase();
        var simplifiedCodes = ['zh-cn', 'zh-sg', 'zh-hans'];
        var traditionalCodes = ['zh-tw', 'zh-hk', 'zh-mo', 'zh-hant'];


    // 只有當 URL 中尚未明確指定繁簡版本時,才進行語系導向
        var targetVariant = '';
    if (!hasSimplifiedInURL && !hasTraditionalInURL) {
        if (simplifiedCodes.includes(browserLang)) {
        var isSimplifiedBrowser = simplifiedCodes.includes(lang);
            targetVariant = 'zh-hans'; // 導向簡體變體
         var isTraditionalBrowser = traditionalCodes.includes(lang);
         } else if (traditionalCodes.includes(browserLang)) {
            targetVariant = 'zh-hant'; // 導向繁體變體
        } else {
            // 如果瀏覽器語系既不是簡體也不是繁體中文,預設導向繁體
            targetVariant = 'zh-hant';
        }


         if (isSimplifiedBrowser) {
        // 只有當目標變體與當前用戶變體不同時才導向
             // 如果瀏覽器是簡體,導向到簡體版本
         if (targetVariant && mw.config.get('wgUserVariant') !== targetVariant) {
             window.location.href = currentURL + '/簡體';
             currentUrl.searchParams.set('variant', targetVariant);
        } else if (isTraditionalBrowser) {
            // 同樣,如果頁面當前有 /簡體 或 /繁體 這種路徑,需要移除它們
            // 如果瀏覽器是繁體,導向到繁體版本
             var pathParts = currentUrl.pathname.split('/');
            // 再次強調:確保您的 Wiki 支援 /繁體 這個路徑來顯示繁體內容。
            var lastPart = pathParts[pathParts.length - 1];
            // 如果您的繁體版本就是預設URL (沒有額外路徑),則這裡可以考慮不導向。
            if (lastPart === '簡體' || lastPart === '繁體') {
            window.location.href = currentURL + '/繁體';
                pathParts.pop();
        } else {
                currentUrl.pathname = pathParts.join('/');
            // 如果瀏覽器語系既不是簡體也不是繁體中文 (例如英文),則預設導向到繁體中文。
            }
             window.location.href = currentURL + '/繁體';
             window.location.href = currentUrl.toString();
         }
         }
     }
     }


    // === 2. 隱藏其他語系選項 (MediaWiki 右上角的語系切換器) ===
    // MediaWiki 的語系切換器通常在一個 class 為 'mw-portlet' 或 id 為 'p-variants' 的區塊裡
    // 裡面的每個語系選項是一個 <li> 包含一個 <a>
    // 我們需要移除或隱藏那些非 'zh-hans' 或 'zh-hant' 的選項


     // 等待頁面內容完全加載,確保語系選單已經存在
     // 3. **隱藏 MediaWiki 內建語系切換器 (如果存在)**
    // 這部分是為了防止兩個語系選單同時出現,造成混淆
     $(document).ready(function() {
     $(document).ready(function() {
         var variantsMenu = $('#p-variants'); // 這是 MediaWiki 語系選單的標準 ID
         var variantsMenu = $('#p-variants'); // MediaWiki 標準語系選單 ID
 
         if (variantsMenu.length > 0) {
         if (variantsMenu.length > 0) {
            // 遍歷所有的語系選項 (<li> 元素)
             variantsMenu.hide(); // 直接隱藏整個內建選單
             variantsMenu.find('li').each(function() {
                var $li = $(this);
                var $link = $li.find('a');
                if ($link.length > 0) {
                    var href = $link.attr('href');
                    // 檢查 href 中是否包含簡體或繁體的標識
                    // MediaWiki 通常會使用 /zh-hans, /zh-hant 這樣的路徑
                    if (!href.includes('/zh-hans') && !href.includes('/zh-hant') &&
                        !href.includes('/zh-cn') && !href.includes('/zh-tw')) {
                        // 如果不包含,則隱藏這個 li 元素
                        $li.hide();
                    }
                }
            });
 
            // 可選:如果你希望將原本的語系選擇標題 (例如 "Language variants") 也改為中文
            // 找到標題元素,通常是 .mw-portlet-variants h3 或類似
            // 實際元素請檢查您的 Wiki HTML 結構
            // var titleElement = variantsMenu.find('h3'); // 假設是 h3
            // if (titleElement.length > 0) {
            //    titleElement.text('語系選項'); // 或 '語言選項'
            // }
 
            // 可選:如果你希望簡化菜單,只顯示“簡體”和“繁體”的文字
            // 而不是預設的“中文(簡體)” “中文(臺灣)” 等
            variantsMenu.find('a[href*="/zh-hans"]').text('簡體中文');
            variantsMenu.find('a[href*="/zh-cn"]').text('簡體中文'); // 確保zh-cn也顯示為簡體
            variantsMenu.find('a[href*="/zh-hant"]').text('繁體中文');
            variantsMenu.find('a[href*="/zh-tw"]').text('繁體中文'); // 確保zh-tw也顯示為繁體
            variantsMenu.find('a[href*="/zh-hk"]').text('繁體中文'); // 確保zh-hk也顯示為繁體
            variantsMenu.find('a[href*="/zh-mo"]').text('繁體中文'); // 確保zh-mo也顯示為繁體
 
         }
         }
        // 如果您希望保留標題,只隱藏 li 內容,可以這樣做:
        // variantsMenu.find('li').hide();
     });
     });


})();
});

於 2025年6月24日 (二) 08:11 的修訂

/* === MediaWiki Custom Language Variant Handling === */

$(function() {
    // 1. **自定義語系下拉選單 (您提供的第一段程式碼)**
    var variants = mw.config.get('wgContentLanguageVariants'); // 獲取可用的語言變體

    // 篩選出只包含簡體和繁體的變體
    var filteredVariants = [];
    if (variants) {
        for (var i = 0; i < variants.length; i++) {
            var variantCode = variants[i];
            if (variantCode === 'zh-tw' || variantCode === 'zh-hant' ||
                variantCode === 'zh-cn' || variantCode === 'zh-hans') {
                filteredVariants.push(variantCode);
            }
        }
    }

    // 如果篩選後有至少兩種語系變體,才建立下拉選單
    if (filteredVariants.length > 1) {
        var currentVariant = mw.config.get('wgUserVariant');
        var languageDropdown = $('<div id="zh-variant-dropdown" class="portal"></div>'); // 增加portal class 讓外觀更像側邊欄組件
        languageDropdown.append('<h3>中文</h3>'); // 增加標題
        var variantSelect = $('<select id="zh-variant-select"></select>');

        for (var i = 0; i < filteredVariants.length; i++) {
            var variantCode = filteredVariants[i];
            var variantName = '';

            switch (variantCode) {
                case 'zh-tw':
                case 'zh-hant':
                    variantName = '繁體中文';
                    break;
                case 'zh-cn':
                case 'zh-hans':
                    variantName = '簡體中文';
                    break;
                default:
                    // 這裡應該不會執行到,因為上面已經過濾了
                    variantName = variantCode;
            }

            var option = $('<option>').val(variantCode).text(variantName);
            if (variantCode === currentVariant) {
                option.prop('selected', true);
            }
            variantSelect.append(option);
        }

        variantSelect.on('change', function() {
            var selectedVariant = $(this).val();
            var currentUrl = new URL(window.location.href);
            // 設置 URL 參數 'variant'
            currentUrl.searchParams.set('variant', selectedVariant);
            // 如果頁面當前有 /簡體 或 /繁體 這種路徑,需要移除它們,因為我們現在用 ?variant=
            var pathParts = currentUrl.pathname.split('/');
            var lastPart = pathParts[pathParts.length - 1];
            if (lastPart === '簡體' || lastPart === '繁體') {
                pathParts.pop(); // 移除最後一個部分
                currentUrl.pathname = pathParts.join('/');
            }
            window.location.href = currentUrl.toString();
        });

        // 將下拉選單添加到側邊欄頂部 (通常是 #mw-panel 或 #p-navigation)
        // 選擇 #mw-panel 是為了讓它在整個側邊欄的頂部
        $('#mw-panel').prepend(languageDropdown.append(variantSelect));
        // 如果您的維基百科使用的是不同的側邊欄 ID,請調整這裡
        // 例如:$('#p-navigation').prepend(languageDropdown.append(variantSelect));
    }

    // 2. **自動語系導向邏輯 (基於瀏覽器語系,並使用 ?variant= 參數)**
    // 只有當頁面URL中沒有 `?variant=` 參數時才自動導向
    var currentUrl = new URL(window.location.href);
    if (!currentUrl.searchParams.has('variant')) {
        var browserLang = (navigator.language || navigator.userLanguage).toLowerCase();
        var simplifiedCodes = ['zh-cn', 'zh-sg', 'zh-hans'];
        var traditionalCodes = ['zh-tw', 'zh-hk', 'zh-mo', 'zh-hant'];

        var targetVariant = '';
        if (simplifiedCodes.includes(browserLang)) {
            targetVariant = 'zh-hans'; // 導向簡體變體
        } else if (traditionalCodes.includes(browserLang)) {
            targetVariant = 'zh-hant'; // 導向繁體變體
        } else {
            // 如果瀏覽器語系既不是簡體也不是繁體中文,預設導向繁體
            targetVariant = 'zh-hant';
        }

        // 只有當目標變體與當前用戶變體不同時才導向
        if (targetVariant && mw.config.get('wgUserVariant') !== targetVariant) {
            currentUrl.searchParams.set('variant', targetVariant);
            // 同樣,如果頁面當前有 /簡體 或 /繁體 這種路徑,需要移除它們
            var pathParts = currentUrl.pathname.split('/');
            var lastPart = pathParts[pathParts.length - 1];
            if (lastPart === '簡體' || lastPart === '繁體') {
                pathParts.pop();
                currentUrl.pathname = pathParts.join('/');
            }
            window.location.href = currentUrl.toString();
        }
    }


    // 3. **隱藏 MediaWiki 內建語系切換器 (如果存在)**
    // 這部分是為了防止兩個語系選單同時出現,造成混淆
    $(document).ready(function() {
        var variantsMenu = $('#p-variants'); // MediaWiki 標準語系選單 ID
        if (variantsMenu.length > 0) {
            variantsMenu.hide(); // 直接隱藏整個內建選單
        }
        // 如果您希望保留標題,只隱藏 li 內容,可以這樣做:
        // variantsMenu.find('li').hide();
    });

});