미디어위키:Common.js: 두 판 사이의 차이

    CABAL WIKI
    편집 요약 없음
    편집 요약 없음
    23번째 줄: 23번째 줄:
       스크롤해서 지나치면 화면 상단에 고정되어 계속 보입니다. */
       스크롤해서 지나치면 화면 상단에 고정되어 계속 보입니다. */
    mw.loader.using('mediawiki.util', function () {
    mw.loader.using('mediawiki.util', function () {
      /* ----- 브라우저 언어 자동 번역 -----
        영어/일본어 브라우저로 접속하면 자동으로 번역 상태로 시작.
        - googtrans 쿠키가 이미 있으면(이전에 언어를 고른 적 있음) 건드리지 않음
        - 사용자가 위젯을 직접 조작한 적 있으면(gtUserChose) 자동 적용 안 함 */
      try {
        var userChose = localStorage.getItem('gtUserChose');
        var hasCookie = /(^|;\s*)googtrans=/.test(document.cookie);
        var nav = ((navigator.languages && navigator.languages[0]) || navigator.language || '').toLowerCase();
        var target = nav.indexOf('ja') === 0 ? 'ja' : (nav.indexOf('en') === 0 ? 'en' : '');
        if (target && !hasCookie && !userChose) {
          document.cookie = 'googtrans=/ko/' + target + '; path=/';
        }
        // 위젯을 직접 클릭하면 이후로는 사용자의 선택을 존중 (자동 적용 중지)
        document.addEventListener('click', function (e) {
          if (e.target.closest && e.target.closest('#google_translate_element')) {
            localStorage.setItem('gtUserChose', '1');
          }
        }, true);
      } catch (err) { /* 쿠키/스토리지 차단 환경이면 자동 적용만 생략 */ }


       var $div = $('<div id="google_translate_element"></div>');
       var $div = $('<div id="google_translate_element"></div>');

    2026년 7월 3일 (금) 15:22 판

    /* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
    /* MediaWiki:Common.js 에 이 파일 내용 전체를 붙여넣으세요. (CSS는 넣지 말 것!) */
    
    /* ===== 외부 링크 새 창 열기 ===== */
    $(document).ready(function () {
      $('#bodyContent a.external').attr('target', '_blank').attr('rel', 'noopener noreferrer');
    });
    
    /* ===== 목차 박스 드래그 이동 =====
       (원치 않으면 이 블록 전체를 삭제해도 됩니다.
        새 디자인은 목차가 본문 안 박스로 정리되어 있어 고정(fixed) 배치는 껐습니다) */
    mw.loader.using('jquery.ui', function () {
      if ($('#toc').length === 0) return;
      $('#toc').css({ cursor: 'move' });
      $('#toc').draggable({
        containment: 'window',
        scroll: false
      });
    });
    
    /* ===== Google 자동 번역 위젯 =====
       처음에는 배너 옆(카드 오른쪽 여백)에 있다가,
       스크롤해서 지나치면 화면 상단에 고정되어 계속 보입니다. */
    mw.loader.using('mediawiki.util', function () {
    
      /* ----- 브라우저 언어 자동 번역 -----
         영어/일본어 브라우저로 접속하면 자동으로 번역 상태로 시작.
         - googtrans 쿠키가 이미 있으면(이전에 언어를 고른 적 있음) 건드리지 않음
         - 사용자가 위젯을 직접 조작한 적 있으면(gtUserChose) 자동 적용 안 함 */
      try {
        var userChose = localStorage.getItem('gtUserChose');
        var hasCookie = /(^|;\s*)googtrans=/.test(document.cookie);
        var nav = ((navigator.languages && navigator.languages[0]) || navigator.language || '').toLowerCase();
        var target = nav.indexOf('ja') === 0 ? 'ja' : (nav.indexOf('en') === 0 ? 'en' : '');
        if (target && !hasCookie && !userChose) {
          document.cookie = 'googtrans=/ko/' + target + '; path=/';
        }
        // 위젯을 직접 클릭하면 이후로는 사용자의 선택을 존중 (자동 적용 중지)
        document.addEventListener('click', function (e) {
          if (e.target.closest && e.target.closest('#google_translate_element')) {
            localStorage.setItem('gtUserChose', '1');
          }
        }, true);
      } catch (err) { /* 쿠키/스토리지 차단 환경이면 자동 적용만 생략 */ }
    
      var $div = $('<div id="google_translate_element"></div>');
      // 본문 카드(.mw-body)에 붙여서 카드 기준으로 위치 고정 (없으면 body)
      var $anchor = $('.mw-body').first();
      ($anchor.length ? $anchor : $('body')).append($div);
    
      // 스크롤 시 상단 고정 전환
      var PIN_AT = 200; // 이만큼 스크롤하면 상단 고정 (배너를 지나는 지점)
      function updateTranslatePos() {
        var el = document.getElementById('google_translate_element');
        var body = document.querySelector('.mw-body');
        if (!el || !body) return;
        var pinned = window.scrollY > PIN_AT;
        el.classList.toggle('gt-pinned', pinned);
        // 넓은 화면에서 고정 시: 카드 오른쪽 모서리에 맞춰 가로 위치 유지
        if (pinned && window.innerWidth > 1420) {
          el.style.left = (body.getBoundingClientRect().right + 22) + 'px';
        } else {
          el.style.left = '';
        }
      }
      window.addEventListener('scroll', updateTranslatePos, { passive: true });
      window.addEventListener('resize', updateTranslatePos);
      updateTranslatePos();
    
      window.googleTranslateElementInit = function () {
        new google.translate.TranslateElement({
          pageLanguage: 'ko',
          includedLanguages: 'en,ja,ko',
          layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
          autoDisplay: false
        }, 'google_translate_element');
      };
    
      var script = document.createElement('script');
      script.src = '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
      document.body.appendChild(script);
    });