Wikipedia Flag Icons

Display flag icons to Wikipedia languages list.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name            Wikipedia Flag Icons
// @description     Display flag icons to Wikipedia languages list.
// @icon            http://en.wikipedia.org/favicon.ico
// @version         2023.07.21 (3.0)
// @namespace       wikiflagicons
// @author          https://github.com/DavideViolante/
// @grant           none
// @include         http*://*.wikipedia.org/*
// @include         http*://*.wikimedia.org/*
// @include         http*://*.wiktionary.org/*
// @include         http*://*.wikibooks.org/*
// @include         http*://*.wikidata.org/*
// @include         http*://*.wikinews.org/*
// @include         http*://*.wikiquote.org/*
// @include         http*://*.wikisource.org/*
// @include         http*://*.wikiversity.org/*
// @include         http*://*.wikivoyage.org/*
// ==/UserScript==

// Flag icons by http://www.famfamfam.com/lab/icons/flags/

// Customize the following 2 parameters
const primaryLang = 'en';
const secondaryLang = 'it';

const flagUrl = 'https://github.com/DavideViolante/Wikipedia-Flag-Icons/raw/master/Chrome%20Extension/WikipediaFlagIcons/flags/';

(function () {
  // This extension was created with the help of Chat GPT
  const flagLangCode = {
    en: 'gb', de: 'de', es: 'es', fr: 'fr', it: 'it', nl: 'nl', ja: 'jp', pl: 'pl', ru: 'ru', sv: 'se',
    vi: 'vn', id: 'id', ms: 'my', cs: 'cz', ko: 'kr', hu: 'hu', no: 'no', pt: 'pt', ro: 'ro', sr: 'rs',
    fi: 'fi', tr: 'tr', uk: 'ua', zh: 'cn', bs: 'ba', bg: 'bg', da: 'dk', et: 'ee', el: 'gr', he: 'il',
    ge: 'ge', uz: 'uz', am: 'et', arz: 'eg', az: 'az', be: 'by', bi: 'vu', bn: 'bd', hy: 'am', is: 'is',
    hr: 'hr', lv: 'lv', lt: 'lt', sk: 'sk', sl: 'si', th: 'th', ga: 'ie', ka: 'ge', kk: 'kz', ne: 'np',
    kl: 'gl', km: 'kh', ky: 'kg', lb: 'lu', lo: 'la', mg: 'mg', mk: 'mk', mn: 'mn', mt: 'mt', ps: 'af',
    rw: 'rw', si: 'lk', sm: 'ws', so: 'so', sq: 'al', tg: 'tj', tk: 'tm', ur: 'pk', uz: 'uz',
    hi: 'in', ca: 'catalonia', eo: 'eo', sco: 'scotland', tet: 'tl'
  };

  // Define a function to get the flag URL based on the language code
  function getFlagUrl(langCode) {
    return chrome.runtime.getURL(`${flagUrl}${flagLangCode[langCode]}.png`);
  }

  // Function to add the image element inside the link
  function addFlagImage(link, prop, popupMenu) {
    if (!link.querySelector('img.flag-image')) {
      const img = document.createElement('img');
      img.src = getFlagUrl(prop);
      img.alt = prop;
      img.title = prop;
      img.className = 'flag-image';
      img.style.marginRight = '5px'; // Add 5px space between the image and text (adjust as needed)
      img.style.marginLeft = '5px'; // Add 5px space between the image and text (adjust as needed)
      if (popupMenu) {
        const anchor = link.querySelector('a');
        anchor.insertBefore(img, anchor.firstChild);
      } else {
        link.insertBefore(img, link.firstChild);
      }
    }
  }

  // Function to apply flags to the language links
  function applyFlagsToLanguageLinks(links, popupMenu) {
    links.forEach(link => {
      // Get the language code from the class name (e.g., 'interwiki-en' -> 'en')
      const prop = link.className.match(/interwiki-(\w+)/)[1];
      addFlagImage(link, prop, popupMenu);
      // Add a flag-applied class to the link to mark that the flag has been added
      link.classList.add('flag-applied');
    });
  }

  // Find the initial language links and apply the flags
  const initialLinks = document.querySelectorAll('.interlanguage-link:not(.flag-applied)');
  applyFlagsToLanguageLinks(initialLinks);

  const clickFn = () => {
    // Delay querying the language links to give time for them to be rendered
    setTimeout(() => {
      const additionalLinks = document.querySelectorAll('.uls-language-list .interlanguage-link');
      applyFlagsToLanguageLinks(additionalLinks, true);
    }, 500);
  };

  // MutationObserver to detect the appearance of the button
  const observer = new MutationObserver(mutationsList => {
    const showMoreButton = document.querySelector('.mw-interlanguage-selector.mw-ui-button');
    const showMoreButtonEn = document.querySelector('#p-lang-btn');
    if (showMoreButton) {
      showMoreButton.addEventListener('click', clickFn);
      observer.disconnect();
    }
    if (showMoreButtonEn) {
      showMoreButtonEn.addEventListener('click', clickFn);
      observer.disconnect();
    }
  });

  // Observe mutations in the document to detect the appearance of the button
  observer.observe(document, { childList: true, subtree: true });

})();