Greasy Fork

Greasy Fork is available in English.

Warframe Market 物品名称中英对照显示 支持搜索

Warframe Market 物品名称中英对照显示 老外发消息再也不用一个一个找了,直接搜索英文就出来

当前为 2025-12-26 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Warframe Market 物品名称中英对照显示 支持搜索
// @version      2.0
// @description  Warframe Market 物品名称中英对照显示 老外发消息再也不用一个一个找了,直接搜索英文就出来
// @author       hhq
// @license      GPL-3.0
// @match        https://warframe.market/zh-hans/*
// @grant        none
// @run-at       document-start
// @namespace http://greasyfork.icu/users/598831
// ==/UserScript==

(function() {
    'use strict';

    // 需要拦截的目标 LocalStorage 键名
    const TARGET_STORAGE_KEYS = [
        'manifests/items',
        'manifests/rivenWeapons',
        'manifests/sisterWeapons',
        'manifests/lichWeapons'
    ];

    // ================= 数据处理核心逻辑 =================

    // 处理 application-state 这种 item_name / url_name 结构
    function modifyStateItem(item) {
        if (item && item.item_name && item.url_name) {
            const en = item.url_name.replace(/_/g, ' ');
            if (!item.item_name.toLowerCase().includes(en.toLowerCase())) {
                item.item_name = `${item.item_name} ( ${en} )`;
            }
        }
    }

    // 处理 manifests 这种 i18n 嵌套结构
    function modifyManifest(data) {
        if (!data || typeof data !== 'object') return data;
        for (const id in data) {
            const item = data[id];
            try {
                const zh = item.i18n?.['zh-hans']?.name;
                const en = item.i18n?.en?.name;
                if (zh && en && !zh.includes(`( ${en} )`)) {
                    item.i18n['zh-hans'].name = `${zh} ( ${en} )`;
                }
            } catch (e) {}
        }
        return data;
    }

    // 自动识别数据类型并分发处理
    function processData(obj) {
        if (!obj || typeof obj !== 'object') return obj;

        // 1. 判断是否为 application-state 结构 (拍卖行数据)
        if (obj.riven || obj.lich || obj.sister) {
            if (obj.riven?.items) obj.riven.items.forEach(modifyStateItem);
            if (obj.lich) {
                if (obj.lich.weapons) obj.lich.weapons.forEach(modifyStateItem);
                if (obj.lich.ephemeras) obj.lich.ephemeras.forEach(modifyStateItem);
            }
            if (obj.sister) {
                if (obj.sister.weapons) obj.sister.weapons.forEach(modifyStateItem);
                if (obj.sister.ephemeras) obj.sister.ephemeras.forEach(modifyStateItem);
            }
            // console.log("油猴脚本:已拦截并处理页面状态数据");
        }

        // 2. 判断是否为 Manifest 结构 (本地存储的物品清单)
        // 通常 manifests 的第一层是一个以 ID 为 Key 的大对象,且包含 i18n 字段
        const firstKey = Object.keys(obj)[0];
        if (firstKey && obj[firstKey]?.i18n) {
            modifyManifest(obj);
            // console.log("油猴脚本:已拦截并处理清单缓存数据");
        }

        return obj;
    }

    // ================= 核心拦截器 =================

    // 1. 劫持 JSON.parse (最底层,拦截所有数据解析)
    const nativeParse = JSON.parse;
    JSON.parse = function(text, reviver) {
        const obj = nativeParse.call(JSON, text, reviver);
        return processData(obj);
    };

    // 2. 劫持 localStorage.getItem (确保 LocalStorage 读出的字符串在解析前就被拦截)
    const nativeGetItem = localStorage.getItem;
    localStorage.getItem = function(key) {
        const value = nativeGetItem.apply(this, arguments);

        // 只有目标键才需要特殊处理
        if (TARGET_STORAGE_KEYS.includes(key) && value) {
            try {
                // 这里我们解析一次,修改完再转回字符串返回
                // 这样即使网站不直接用 JSON.parse,拿到的字符串也是改好的
                const data = nativeParse(value);
                const modifiedData = modifyManifest(data);
                return JSON.stringify(modifiedData);
            } catch (e) {
                return value;
            }
        }
        return value;
    };

    console.log("✅ Warframe Market 物品名称中英对照显示 已激活成功 无效果请按F5刷新");

})();