您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add language toggle buttons that work across multiple tables correctly + description toggle
// ==UserScript== // @name FFXIV Guide: Toggle language columns // @name:ko FFXIV Guide: 언어별 세로단 토글 // @namespace http://tampermonkey.net/ // @version 1.1.1 // @description Add language toggle buttons that work across multiple tables correctly + description toggle // @description:ko 언어별로 세로단을 가리는 버튼을 추가하는 스크립트 입니다 // @match https://ffxivguide.akurosia.org/translate/ // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; const languageMap = { en: { label: '🇺🇸 EN', headers: ['Singular_en', 'Name_en', 'Description_en', 'Text_en'] }, de: { label: '🇩🇪 DE', headers: ['Singular_de', 'Name_de', 'Description_de', 'Text_de'] }, fr: { label: '🇫🇷 FR', headers: ['Singular_fr', 'Name_fr', 'Description_fr', 'Text_fr'] }, ja: { label: '🇯🇵 JA', headers: ['Singular_ja', 'Name_ja', 'Description_ja', 'Text_ja'] }, cn: { label: '🇨🇳 CN', headers: ['Singular_cn', 'Name_cn', 'Description_cn', 'Text_cn'] }, ko: { label: '🇰🇷 KO', headers: ['Singular_ko', 'Name_ko', 'Description_ko', 'Text_ko'] }, }; const hiddenLangs = new Set(); const buttonRefs = {}; let descriptionHidden = false; function toggleLanguage(langKey) { const { headers } = languageMap[langKey]; const shouldHide = !hiddenLangs.has(langKey); const tables = document.querySelectorAll('table'); tables.forEach(table => { const ths = table.querySelectorAll('thead tr th'); const indexes = []; ths.forEach((th, i) => { const text = th.textContent.trim(); if (headers.includes(text)) { if (descriptionHidden && text.startsWith('Description_')) return; indexes.push(i + 1); } }); indexes.forEach(index => { const cells = table.querySelectorAll(`th:nth-child(${index}), td:nth-child(${index})`); cells.forEach(cell => { cell.style.display = shouldHide ? 'none' : ''; }); }); }); if (shouldHide) hiddenLangs.add(langKey); else hiddenLangs.delete(langKey); updateButtonStyle(langKey); } function updateButtonStyle(langKey) { const btn = buttonRefs[langKey]; if (!btn) return; const isHidden = hiddenLangs.has(langKey); btn.style.opacity = isHidden ? '0.4' : '1'; btn.style.backgroundColor = isHidden ? '#222' : '#444'; } function toggleDescriptionColumns() { descriptionHidden = !descriptionHidden; const tables = document.querySelectorAll('table'); tables.forEach(table => { const ths = table.querySelectorAll('thead tr th'); const indexes = []; ths.forEach((th, i) => { const text = th.textContent.trim(); const match = text.match(/^Description_(\w{2})$/); if (match) { const langKey = match[1]; if (!hiddenLangs.has(langKey)) { indexes.push(i + 1); } } }); indexes.forEach(index => { const cells = table.querySelectorAll(`th:nth-child(${index}), td:nth-child(${index})`); cells.forEach(cell => { cell.style.display = descriptionHidden ? 'none' : ''; }); }); }); const btn = buttonRefs['description']; if (btn) { btn.style.opacity = descriptionHidden ? '0.4' : '1'; btn.style.backgroundColor = descriptionHidden ? '#222' : '#444'; } } function insertToggleButtons() { const searchButton = document.getElementById('submit'); if (!searchButton || !searchButton.parentElement) { setTimeout(insertToggleButtons, 300); return; } const wrapper = document.createElement('div'); wrapper.style.margin = '10px 0'; // Language buttons Object.entries(languageMap).forEach(([key, { label }]) => { const btn = document.createElement('button'); btn.textContent = label; styleButton(btn); btn.addEventListener('click', () => toggleLanguage(key)); wrapper.appendChild(btn); buttonRefs[key] = btn; }); // Description-only toggle const descBtn = document.createElement('button'); descBtn.textContent = '📝 아이템 설명'; styleButton(descBtn); descBtn.addEventListener('click', toggleDescriptionColumns); wrapper.appendChild(descBtn); buttonRefs['description'] = descBtn; searchButton.parentElement.insertAdjacentElement('afterend', wrapper); } function styleButton(btn) { btn.style.marginRight = '5px'; btn.style.padding = '4px 8px'; btn.style.fontSize = '12px'; btn.style.cursor = 'pointer'; btn.style.background = '#444'; btn.style.color = '#fff'; btn.style.border = '1px solid #888'; btn.style.borderRadius = '4px'; btn.style.transition = 'all 0.2s ease'; } insertToggleButtons(); })();