在GreasyFork网站添加代码复制按钮

在“安装此脚本”按钮旁添加一个“复制代码”按钮,模仿其样式。

当前为 2025-10-17 提交的版本,查看 最新版本

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

You will need to install an extension such as Tampermonkey to install this script.

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Add Code Copy Button at GreasyFork Site
// @name:zh-CN   在GreasyFork网站添加代码复制按钮
// @name:zh-TW   在GreasyFork網站添加代碼複製按鈕
// @name:ja      GreasyForkサイトにコードコピーボタンを追加
// @name:ko      GreasyFork 사이트에 "코드 복사" 버튼 추가
// @name:ru      Добавить кнопку "Копировать код" на сайте GreasyFork
// @name:es      Añadir un botón "Copiar código" en el sitio GreasyFork
// @name:fr      Ajouter un bouton "Copier le code" sur le site GreasyFork
// @name:de      Einen "Code kopieren"-Button auf der GreasyFork-Seite hinzufügen
// @name:it      Aggiungi un pulsante "Copia codice" sul sito GreasyFork
// @name:pt-BR   Adicionar um botão "Copiar código" no site GreasyFork
// @name:pt      Adicionar um botão "Copiar código" no site GreasyFork
// @name:ar      إضافة زر "نسخ الكود" في موقع GreasyFork
// @name:hi      GreasyFork साइट पर "कोड कॉपी करें" बटन जोड़ें
// @name:tr      GreasyFork sitesine "Kodu Kopyala" düğmesi ekle
// @name:vi      Thêm nút "Sao chép mã" vào trang GreasyFork
// @name:th      เพิ่มปุ่ม "คัดลอกโค้ด" ในเว็บไซต์ GreasyFork
// @name:pl      Dodaj przycisk "Kopiuj kod" na stronie GreasyFork
// @name:nl      Voeg een knop "Code kopiëren" toe op de GreasyFork-site
// @name:sv      Lägg till en knapp "Kopiera kod" på GreasyFork-webbplatsen
// @name:da      Tilføj en knap "Kopiér kode" på GreasyFork-siden
// @name:fi      Lisää painike "Kopioi koodi" GreasyFork-sivustolle
// @name:no      Legg til en knapp "Kopier kode" på GreasyFork-nettstedet
// @name:el      Προσθήκη κουμπιού "Αντιγραφή κώδικα" στον ιστότοπο GreasyFork
// @name:he      הוסף כפתור "העתק קוד" לאתר GreasyFork
// @name:cs      Přidejte tlačítko „Kopírovat kód“ na stránku GreasyFork
// @name:hu      Adjon hozzá egy „Kód másolása” gombot a GreasyFork webhelyhez
// @name:ro      Adăugați un buton „Copiază codul” pe site-ul GreasyFork
// @name:id      Tambahkan tombol "Salin kode" di situs GreasyFork
// @name:ms      Tambah butang "Salin kod" di laman GreasyFork
// @name:uk      Додайте кнопку "Копіювати код" на сайті GreasyFork
// @name:bg      Добавете бутон "Копирай кода" на сайта GreasyFork
// @namespace    http://tampermonkey.net/
// @version      1.0.2.5
// @description  Adds a "复制代码" button next to the "安装此脚本" button, imitating its style.
// @description:zh-CN  在“安装此脚本”按钮旁添加一个“复制代码”按钮,模仿其样式。
// @description:zh-TW  在“安裝此腳本”按鈕旁添加一個“複製代碼”按鈕,模仿其樣式。
// @description:ja     「このスクリプトをインストール」ボタンの横に「コードをコピー」ボタンを追加し、そのスタイルを模倣します。
// @description:ko     "이 스크립트 설치" 버튼 옆에 "코드 복사" 버튼을 추가하며, 그 스타일을 모방합니다。
// @description:ru     Добавляет кнопку "Копировать код" рядом с кнопкой "Установить этот скрипт", повторяя её стиль.
// @description:es     Añade un botón "Copiar código" junto al botón "Instalar este script", imitando su estilo.
// @description:fr     Ajoute un bouton "Copier le code" à côté du bouton "Installer ce script", en imitant son style.
// @description:de     Fügt einen "Code kopieren"-Button neben den "Dieses Skript installieren"-Button hinzu und imitiert dessen Stil.
// @description:it     Aggiunge un pulsante "Copia codice" accanto al pulsante "Installa questo script", imitando il suo stile.
// @description:pt-BR  Adiciona um botão "Copiar código" ao lado do botão "Instalar este script", imitando seu estilo.
// @description:pt     Adiciona um botão "Copiar código" ao lado do botão "Instalar este script", imitando seu estilo.
// @description:ar     يضيف زر "نسخ الكود" بجانب زر "تثبيت هذا السكربت"، مقلدًا أسلوبه.
// @description:hi     "इस स्क्रिप्ट को इंस्टॉल करें" बटन के बगल में "कोड कॉपी करें" बटन जोड़ता है, इसकी शैली की नकल करता है。
// @description:tr     "Bu betiği yükle" düğmesinin yanına "Kodu Kopyala" düğmesi ekler ve stilini taklit eder.
// @description:vi     Thêm nút "Sao chép mã" bên cạnh nút "Cài đặt tập lệnh này", bắt chước phong cách của nó.
// @description:th     เพิ่มปุ่ม "คัดลอกโค้ด" ถัดจากปุ่ม "ติดตั้งสคริปต์นี้" โดยเลียนแบบสไตล์ของมัน
// @description:pl     Dodaje przycisk „Kopiuj kod” obok przycisku „Zainstaluj ten skrypt”, naśladując jego styl.
// @description:nl     Voegt een knop "Code kopiëren" toe naast de knop "Dit script installeren" en imiteert de stijl ervan.
// @description:sv     Lägger till en knapp "Kopiera kod" bredvid knappen "Installera detta skript" och imiterar dess stil.
// @description:da     Tilføjer en knap "Kopiér kode" ved siden af "Installer dette script"-knappen og efterligner dens stil.
// @description:fi     Lisää "Kopioi koodi" -painikkeen "Asenna tämä skripti" -painikkeen viereen ja jäljittelee sen tyyliä.
// @description:no     Legger til en knapp "Kopier kode" ved siden av "Installer dette skriptet"-knappen, og etterligner stilen.
// @description:el     Προσθέτει ένα κουμπί "Αντιγραφή κώδικα" δίπλα στο κουμπί "Εγκατάσταση αυτού του σεναρίου", μιμούμενο το στυλ του.
// @description:he     מוסיף כפתור "העתק קוד" ליד הכפתור "התקן סקריפט זה", מחקה את הסגנון שלו.
// @description:cs     Přidává tlačítko „Kopírovat kód“ vedle tlačítka „Nainstalovat tento skript“ a napodobuje jeho styl.
// @description:hu     Hozzáad egy „Kód másolása” gombot a „Telepítse ezt a szkriptet” gomb mellé, utánozva annak stílusát.
// @description:ro     Adaugă un buton „Copiază codul” lângă butonul „Instalează acest script”, imitând stilul acestuia.
// @description:id     Menambahkan tombol "Salin kode" di samping tombol "Pasang skrip ini", meniru gayanya.
// @description:ms     Menambah butang "Salin kod" di sebelah butang "Pasang skrip ini", meniru gayanya.
// @description:uk     Додає кнопку "Копіювати код" поруч із кнопкою "Встановити цей скрипт", наслідуючи її стиль.
// @description:bg     Добавя бутон "Копирай кода" до бутона "Инсталирай този скрипт", имитирайки стила му.
// @author       aspen138
// @license      MIT
// @match        https://greasyfork.org/*/scripts/*/code
// @match        https://sleazyfork.org/*/scripts/*/code
// @match        https://greasyfork.org/*/scripts/*/code?locale_override=1
// @match        https://sleazyfork.org/*/scripts/*/code?locale_override=1
// @icon         data:image/png;base64,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
// @grant        GM_setClipboard
// @grant        GM_addStyle
// ==/UserScript==


//轻提醒
function Toast(msg, duration) {
    let p1 = new Promise((resolve,reject)=>{
        duration = isNaN(duration) ? 3000 : duration;
        var m = document.createElement('div');
        m.innerHTML = msg;
        m.style.cssText = "font-family:siyuan;max-width:60%;min-width: 150px;padding:0 14px;height: 40px;color: rgb(255, 255, 255);line-height: 40px;text-align: center;border-radius: 4px;position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);z-index: 999999;background: rgba(0, 0, 0,.7);font-size: 16px;";
        document.body.appendChild(m);
        setTimeout(function() {
            var d = 0.5;
            m.style.webkitTransition = '-webkit-transform ' + d + 's ease-in, opacity ' + d + 's ease-in';
            m.style.opacity = '0';
            setTimeout(function() {
                document.body.removeChild(m)
            }, d * 1000);
        }, duration);
    });
}

(function () {
  'use strict';

  // Internationalization strings
  const i18n = {
    'en': {
      copyCode: 'Copy Code',
      codeNotFound: 'Code element not found!',
      codeCopied: 'Code copied to clipboard!'
    },
    'zh-CN': {
      copyCode: '复制代码',
      codeNotFound: '代码元素未找到!',
      codeCopied: '代码已复制到剪贴板!'
    },
    'zh-TW': {
      copyCode: '複製代碼',
      codeNotFound: '代碼元素未找到!',
      codeCopied: '代碼已複製到剪貼板!'
    },
    'ja': {
      copyCode: 'コードをコピー',
      codeNotFound: 'コード要素が見つかりません!',
      codeCopied: 'コードをクリップボードにコピーしました!'
    },
    'fr': {
      copyCode: 'Copier le code',
      codeNotFound: 'Élément de code introuvable !',
      codeCopied: 'Code copié dans le presse-papiers !'
    },
    'es': {
      copyCode: 'Copiar código',
      codeNotFound: '¡Elemento de código no encontrado!',
      codeCopied: '¡Código copiado al portapapeles!'
    },
    'de': {
      copyCode: 'Code kopieren',
      codeNotFound: 'Code-Element nicht gefunden!',
      codeCopied: 'Code in die Zwischenablage kopiert!'
    },
    'ru': {
      copyCode: 'Копировать код',
      codeNotFound: 'Элемент кода не найден!',
      codeCopied: 'Код скопирован в буфер обмена!'
    },
    'it': {
      copyCode: 'Copia codice',
      codeNotFound: 'Elemento codice non trovato!',
      codeCopied: 'Codice copiato negli appunti!'
    },
    'ko': {
      copyCode: '코드 복사',
      codeNotFound: '코드 요소를 찾을 수 없습니다!',
      codeCopied: '코드가 클립보드에 복사되었습니다!'
    },
    'pt-BR': {
      copyCode: 'Copiar código',
      codeNotFound: 'Elemento de código não encontrado!',
      codeCopied: 'Código copiado para a área de transferência!'
    },
    'ar': {
      copyCode: 'نسخ الكود',
      codeNotFound: 'عنصر الكود غير موجود!',
      codeCopied: 'تم نسخ الكود إلى الحافظة!'
    }
  };

  // Function to detect current page language
  function detectLanguage() {
    // Try to get language from URL path
    const urlMatch = window.location.pathname.match(/^\/([a-z]{2}(?:-[A-Z]{2})?)\//);
    if (urlMatch) {
      return urlMatch[1];
    }

    // Try to get from HTML lang attribute
    const htmlLang = document.documentElement.lang;
    if (htmlLang && i18n[htmlLang]) {
      return htmlLang;
    }

    // Try to get from browser language
    const browserLang = navigator.language || navigator.userLanguage;
    if (browserLang && i18n[browserLang]) {
      return browserLang;
    }

    // Check for simplified Chinese language codes
    if (browserLang && (browserLang.startsWith('zh-CN') || browserLang === 'zh')) {
      return 'zh-CN';
    }

    // Check for traditional Chinese
    if (browserLang && (browserLang.startsWith('zh-TW') || browserLang.startsWith('zh-HK'))) {
      return 'zh-TW';
    }

    // Default to English
    return 'en';
  }

  // Get current language
  const currentLang = detectLanguage();
  const strings = i18n[currentLang] || i18n['en'];

  // Optional: add some basic styling for the copy button, if needed.
  // We replicate the "install-link" style from the example.
  GM_addStyle(`
    .install-link.copy-button {
      margin-left: 8px;
      text-decoration: none;
      display: inline-block;
      padding: 0.5em 1em;
      border-radius: 4px;
      background: #449d44;
      color: #fff !important;
      transition: background-color 0.2s ease-in-out;
    }
    .install-link.copy-button:hover {
      background: #398439;
    }
  `);

  // A small helper to safely query elements by selector
  function $(selector, parent = document) {
    return parent.querySelector(selector);
  }

  // Wait until the page is fully loaded
  window.addEventListener('load', () => {
    // 1. Find the parent area that contains the "安装此脚本" button
    const installArea = $('#install-area');
    if (!installArea) return;

    // 2. Create a new button to copy the code
    const copyBtn = document.createElement('a');
    copyBtn.classList.add('install-link', 'copy-button');
    copyBtn.href = 'javascript:void(0)';
    copyBtn.textContent = strings.copyCode;

    // 3. Insert this copy button to the right of the existing button
    installArea.appendChild(copyBtn);

    // 4. When user clicks the copy button, grab code from .code-container
    copyBtn.addEventListener('click', () => {
      // Retrieve the code text from the <pre> element
      const codePre = $('.code-container pre');
      if (!codePre) {
        alert(strings.codeNotFound);
        return;
      }

      // The innerText should contain the displayed code
      const codeText = codePre.innerText || '';

      // Put this text into the clipboard
      GM_setClipboard(codeText);

      // Provide some user feedback
      Toast(strings.codeCopied, 1000);
    });
  });
})();