E621 辅助翻译

目前仅支持汉化 E621 的标签,且字典尚不完善

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         E621 辅助翻译
// @name:en-US   E621 translator for Chinese
// @namespace    https://greasyfork.org/users/159546
// @version      1.0.2
// @description  目前仅支持汉化 E621 的标签,且字典尚不完善
// @description:en-US E621 tags translate to Chinese
// @author       LEORChn
// @match        https://e621.net/posts*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=e621.net
// @grant        none
// @run-at       document-start
// @license      MIT
// ==/UserScript==
initEZLib();

var tagsRaw = `
  // 所有行都会无视前空格。所有原文都无视大小写。注释必须写在双斜杠后。
  // Copyrights // 版权
  nintendo, pokemon: 任天堂,宝可梦
  mythology, european mythology, greek mythology: 神话,欧洲神话,希腊神话
  asian mythology, east asian mythology, chinese mythology: 亚洲神话,东亚神话,中国神话

  // Species // 种族
  pokemon (species), generation 1 pokemon: 口袋妖怪,第一代口袋妖怪
  mammal: 哺乳动物
  canine, canid, canis, wolf: 高智力犬类,犬科,犬属,狼  // FIXME: 暂时被搞晕了
  leporid, lagomorph, rabbit: 兔类,兔形目,兔子

  // General // 一般
  feral, anthro: 野生形态,直立形态
  clothed, clothing: 着装得体的,着装的                   // FIXME: 这两者的区别有待修改
  asian clothing, east asian clothing, chinese clothing: 亚洲服饰,东亚服饰,中国服饰
  armor: 防具
  chinese, hanfu, chinese dress: 中国的,汉服,旗袍?
  moon, full moon: 月亮,满月
  video games: 电子游戏
  simple background: 简单的背景

  solo, duo, trio: 角色数量 单个,角色数量 两个,角色数量 三个
  group, large group: 团体,三个角色以上大团体
  unseen character: 涉及到图像外的角色
  male, female, male/female, male/male, female/female: 雄性,雌性,雄性和雌性,雄性和雄性,雌性和雌性
  facial hair, beard, hair: 面部毛发,胡子,头发和胡子等毛发
  feathers, wings: 羽毛,翅膀
  smile, blush: 微笑,脸红
  nude, sex, erection, penetration, cum: 裸体,性交,勃起,中出,射精
  bodily fluids, genital fluids: 体液,生殖液
  genitals, penis, balls, breasts, nipples: 生殖器,阴茎,睾丸,乳房,乳头

  // Meta // 图像元数据
  thumbnail, low res: 缩略图,低分辨率
  hi res, absurd res, superabsurd res: 高分辨率,超高分辨率,顶级分辨率
  wallpaper: 可用于壁纸的分辨率
  text, english text: 有文本的,有英语文本
`;
var tags = {};
var tagsFlatArray = tagsRaw.split('\n').map(function(lineText){
    if(!lineText.trim().length) return; // 去除纯空行
    if(lineText.trim().startsWith('//')) return; // 去除注释行
    var kv = lineText.split('//')[0].split(/[::]/); // 支持行内注释,
    var keys = kv[0].split(/[,,]/),
        values = kv[1].split(/[,,]/);
    if(keys.length != values.length) alert('发现这一行没有对齐:\n' + lineText);
    return keys.map(function(e, i){
        try{
            return [e.trim().toLowerCase(), values[i].trim()];
        }catch(err){
            if(keys.length <= values.length) alert('在解析这一行时发生错误:\n' + lineText);
            // 如果key数量大于value数量,那么前面的没有对齐信息就已经讲过了
        }
    });
}).filter(function(e){ return e; }).flat();
tagsFlatArray.foreach(function(e, i){
    tags[e[0]] = e[1];
});
setInterval(function(){
    $$('.search-tag').foreach(e=>{
        var origin = e.innerText;
        if(!(origin in tags)) return;
        e.innerText = tags[origin];
    });
}, 1000);



function $$(e){ return document.querySelectorAll(e); }
function initEZLib(){
    Array.prototype.foreach =
    NodeList.prototype.foreach = function(func){
        if(!(func instanceof Function)) return;
        for(var i=0; i < this.length; i++) try{
            if(func(this[i], i, this)) return true;
        }catch(e){
            console.warn(e);
        }
    }
}