「MediaWiki:Common.js」の版間の差分

提供:svg2wiki
ナビゲーションに移動 検索に移動
 
1行目: 1行目:
 
/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */
 
/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */
  
−
/* Google 翻訳ウィジェット(デバッグログ付き) */
+
/* Google 翻訳ウィジェット(自動言語選択 + 原文明示バナー完全版) */
 
$( function () {
 
$( function () {
−
    console.log( '[GT-Debug] Common.js 読み込み開始' );
 
−
 
 
     if ( $( '#p-googletranslator' ).length ) {
 
     if ( $( '#p-googletranslator' ).length ) {
−
        console.log( '[GT-Debug] すでにサイドバー要素が存在するため中断' );
 
 
         return;
 
         return;
 
     }
 
     }
16行目: 13行目:
 
         var $notice = $( '<div class="mw-translate-notice">⚠️ このページは、日本語の原文から機械翻訳(Google 翻訳)されたものです。</div>' );
 
         var $notice = $( '<div class="mw-translate-notice">⚠️ このページは、日本語の原文から機械翻訳(Google 翻訳)されたものです。</div>' );
 
         $( '#mw-content-text' ).prepend( $notice );
 
         $( '#mw-content-text' ).prepend( $notice );
−
        console.log( '[GT-Debug] 通知バナー要素を DOM に追加' );
 
 
     }
 
     }
  
35行目: 31行目:
 
         $( '#mw-panel' ).append( boxHtml );
 
         $( '#mw-panel' ).append( boxHtml );
 
     }
 
     }
−
    console.log( '[GT-Debug] サイドバー枠を配置' );
 
  
−
     // 3. プルダウンの自動発火ロジック
+
     // 3. ブラウザ言語に応じた自動翻訳の発火処理
 
     function triggerAutoTranslation() {
 
     function triggerAutoTranslation() {
−
        console.log( '[GT-Debug] triggerAutoTranslation 開始' );
+
         if ( sessionStorage.getItem( 'gt_auto_applied' ) || ( document.cookie.indexOf( 'googtrans=' ) !== -1 && document.cookie.indexOf( 'googtrans=/ja/ja' ) === -1 ) ) {
−
        console.log( '[GT-Debug] 現在の Cookie (googtrans):', document.cookie );
 
−
        console.log( '[GT-Debug] sessionStorage (gt_auto_applied):', sessionStorage.getItem( 'gt_auto_applied' ) );
 
−
 
 
−
         if ( sessionStorage.getItem( 'gt_auto_applied' ) || document.cookie.indexOf( 'googtrans=' ) !== -1 ) {
 
−
            console.log( '[GT-Debug] 既存のCookieまたはセッション適用フラグがあるため自動適用をスキップ' );
 
 
             return;
 
             return;
 
         }
 
         }
  
 
         var userLang = ( navigator.language || navigator.userLanguage || '' ).toLowerCase();
 
         var userLang = ( navigator.language || navigator.userLanguage || '' ).toLowerCase();
−
         console.log( '[GT-Debug] 検知されたブラウザ言語 (navigator.language):', userLang );
+
         var targetLang = '';
  
−
        var targetLang = '';
 
 
         if ( userLang.indexOf( 'zh' ) === 0 ) {
 
         if ( userLang.indexOf( 'zh' ) === 0 ) {
 
             targetLang = 'zh-CN';
 
             targetLang = 'zh-CN';
60行目: 49行目:
 
             }
 
             }
 
         }
 
         }
−
        console.log( '[GT-Debug] 判定されたターゲット言語:', targetLang );
 
  
 
         if ( !targetLang ) {
 
         if ( !targetLang ) {
−
            console.log( '[GT-Debug] 日本語環境、または非対応言語のため終了' );
 
 
             return;
 
             return;
 
         }
 
         }
  
 +
        // セレクトボックスの生成とオプションの準備を監視
 
         var checkCount = 0;
 
         var checkCount = 0;
 
         var timer = setInterval( function () {
 
         var timer = setInterval( function () {
 
             checkCount++;
 
             checkCount++;
 
             var select = document.querySelector( '.goog-te-combo' );
 
             var select = document.querySelector( '.goog-te-combo' );
−
             if ( select ) {
+
 
 +
             if ( select && select.options && select.options.length > 1 ) {
 
                 clearInterval( timer );
 
                 clearInterval( timer );
−
                console.log( '[GT-Debug] .goog-te-combo を検出しました (試行回数: ' + checkCount + ')' );
 
−
                console.log( '[GT-Debug] 変更前の select.value:', select.value );
 
−
 
 
                 sessionStorage.setItem( 'gt_auto_applied', 'true' );
 
                 sessionStorage.setItem( 'gt_auto_applied', 'true' );
 
                 select.value = targetLang;
 
                 select.value = targetLang;
−
 
+
                 select.dispatchEvent( new Event( 'change' ) );
−
                // change イベントを発火
 
−
                var evt = document.createEvent( 'HTMLEvents' );
 
−
                evt.initEvent( 'change', true, true );
 
−
                 select.dispatchEvent( evt );
 
−
 
 
−
                console.log( '[GT-Debug] change イベントを発火しました。変更後の select.value:', select.value );
 
 
             }
 
             }
  
−
             if ( checkCount > 50 ) {
+
             if ( checkCount > 60 ) {
 
                 clearInterval( timer );
 
                 clearInterval( timer );
−
                console.warn( '[GT-Debug] 5秒経過しても .goog-te-combo が見つかりませんでした' );
 
 
             }
 
             }
 
         }, 100 );
 
         }, 100 );
 
     }
 
     }
  
−
     // 4. Google 翻訳の初期化コールバック
+
     // 4. Google 翻訳の初期化(標準セレクトボックス形式で生成)
 
     window.googleTranslateElementInit = function () {
 
     window.googleTranslateElementInit = function () {
−
        console.log( '[GT-Debug] googleTranslateElementInit コールバック呼び出し' );
 
 
         new google.translate.TranslateElement({
 
         new google.translate.TranslateElement({
 
             pageLanguage: 'ja',
 
             pageLanguage: 'ja',
−
             includedLanguages: supportedLangs.join( ',' ),
+
             includedLanguages: supportedLangs.join( ',' )
−
            layout: google.translate.TranslateElement.InlineLayout.SIMPLE
 
 
         }, 'google_translate_element');
 
         }, 'google_translate_element');
  
106行目: 83行目:
 
     };
 
     };
  
−
    console.log( '[GT-Debug] Google 翻訳スクリプトのロード要求を送信' );
 
 
     mw.loader.load( '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit' );
 
     mw.loader.load( '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit' );
 
} );
 
} );

2026年10月23日 (金) 09:20時点における最新版

/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */

/* Google 翻訳ウィジェット(自動言語選択 + 原文明示バナー完全版) */
$( function () {
    if ( $( '#p-googletranslator' ).length ) {
        return;
    }

    var supportedLangs = ['ja', 'ko', 'en', 'nl', 'fr', 'de', 'zh-CN', 'ru'];

    // 1. 記事本文の上に通知バナーを配置
    if ( $( '#mw-content-text' ).length && !$( '.mw-translate-notice' ).length ) {
        var $notice = $( '<div class="mw-translate-notice">⚠️ このページは、日本語の原文から機械翻訳(Google 翻訳)されたものです。</div>' );
        $( '#mw-content-text' ).prepend( $notice );
    }

    // 2. サイドバー用ブロックのHTML生成
    var boxHtml = 
        '<nav id="p-googletranslator" class="mw-portlet mw-portlet-googletranslator vector-menu vector-menu-portal portal" role="navigation">' +
        '  <h3 class="vector-menu-heading"><span>翻訳 / Translate</span></h3>' +
        '  <div class="vector-menu-content body">' +
        '    <ul class="vector-menu-content-list" style="padding-top: 8px;">' +
        '      <li style="list-style: none;"><div id="google_translate_element"></div></li>' +
        '    </ul>' +
        '  </div>' +
        '</nav>';

    if ( $( '#p-tb' ).length ) {
        $( '#p-tb' ).after( boxHtml );
    } else {
        $( '#mw-panel' ).append( boxHtml );
    }

    // 3. ブラウザ言語に応じた自動翻訳の発火処理
    function triggerAutoTranslation() {
        if ( sessionStorage.getItem( 'gt_auto_applied' ) || ( document.cookie.indexOf( 'googtrans=' ) !== -1 && document.cookie.indexOf( 'googtrans=/ja/ja' ) === -1 ) ) {
            return;
        }

        var userLang = ( navigator.language || navigator.userLanguage || '' ).toLowerCase();
        var targetLang = '';

        if ( userLang.indexOf( 'zh' ) === 0 ) {
            targetLang = 'zh-CN';
        } else {
            var shortLang = userLang.split( '-' )[0];
            if ( shortLang !== 'ja' && supportedLangs.indexOf( shortLang ) !== -1 ) {
                targetLang = shortLang;
            }
        }

        if ( !targetLang ) {
            return;
        }

        // セレクトボックスの生成とオプションの準備を監視
        var checkCount = 0;
        var timer = setInterval( function () {
            checkCount++;
            var select = document.querySelector( '.goog-te-combo' );

            if ( select && select.options && select.options.length > 1 ) {
                clearInterval( timer );
                sessionStorage.setItem( 'gt_auto_applied', 'true' );
                select.value = targetLang;
                select.dispatchEvent( new Event( 'change' ) );
            }

            if ( checkCount > 60 ) {
                clearInterval( timer );
            }
        }, 100 );
    }

    // 4. Google 翻訳の初期化(標準セレクトボックス形式で生成)
    window.googleTranslateElementInit = function () {
        new google.translate.TranslateElement({
            pageLanguage: 'ja',
            includedLanguages: supportedLangs.join( ',' )
        }, 'google_translate_element');

        triggerAutoTranslation();
    };

    mw.loader.load( '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit' );
} );