From dab8cae84c108a8815b35e62456bb57d37cd8164 Mon Sep 17 00:00:00 2001 From: l3126596029 Date: Sun, 13 Sep 2026 03:47:42 +0800 Subject: [PATCH] fix: humanized fallback for share display names (26.9.7) --- CHANGELOG.md | 5 +++++ README.md | 2 +- iridium/share.py | 19 +++++++++++++------ mcdreforged.plugin.json | 2 +- tests/test_pure.py | 20 ++++++++++---------- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8738df..3f46510 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ 本文件记录 Iridium 的重要变更。 +## [26.9.7] - 2026-09-13 + +### Fixed +- `!!share`:无 NBT 改名时,正文 fallback 改为 ID 美化名(如 `Time Twister Wireless`),不再直接显示 `kubejs:...`;语言键命中则显示正式本地化名 + ## [26.9.6] - 2026-09-13 ### Fixed diff --git a/README.md b/README.md index 5f5d012..79d5d2a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ MCDReforged 插件:物品展示 / 戴头 / 获取头颅 / 游戏内计算器 / | | | |---|---| -| 版本 | **26.9.6** | +| 版本 | **26.9.7** | | 作者 | 云镜之端/SKYMirror | | 许可 | 保留所有权益(All Rights Reserved) | | 前置 | MCDReforged `>= 2.6.0` | diff --git a/iridium/share.py b/iridium/share.py index b4f1ecb..90f1b3b 100644 --- a/iridium/share.py +++ b/iridium/share.py @@ -87,28 +87,35 @@ def _extract_custom_name(item_snbt: str) -> Optional[str]: return None +def _humanize_id(item_id: str) -> str: + """kubejs:time_twister_wireless -> Time Twister Wireless""" + path = item_id.split(":", 1)[-1] + parts = [p for p in path.replace("-", "_").split("_") if p] + if not parts: + return item_id + return " ".join(p[:1].upper() + p[1:] for p in parts) + + def _translate_key(item_id: str) -> str: """Guess client language key from item id (best-effort).""" if ":" not in item_id: return f"item.minecraft.{item_id}" ns, path = item_id.split(":", 1) if ns == "minecraft": - # Most block-items use block.minecraft.*; tools/items use item.minecraft.* - # Prefer item.* — missing key falls back via "fallback" return f"item.minecraft.{path}" - # Modded cables/blocks: block.. - return f"block.{ns}.{path}" + return f"item.{ns}.{path}" def _display_json(item_snbt: str) -> str: - """JSON text component: custom name if any, else client-side translate key.""" + """JSON text component: custom name if any, else client translate + humanized fallback.""" custom = _extract_custom_name(item_snbt) if custom: return '{"text":"' + _json_str(custom) + '"}' item_id = _item_id(item_snbt) key = _translate_key(item_id) + pretty = _humanize_id(item_id) return ( - '{"translate":"' + _json_str(key) + '","fallback":"' + _json_str(item_id) + '"}' + '{"translate":"' + _json_str(key) + '","fallback":"' + _json_str(pretty) + '"}' ) diff --git a/mcdreforged.plugin.json b/mcdreforged.plugin.json index d2a39c4..f6ce96a 100644 --- a/mcdreforged.plugin.json +++ b/mcdreforged.plugin.json @@ -1,6 +1,6 @@ { "id": "iridium", - "version": "26.9.6", + "version": "26.9.7", "name": "Iridium", "description": { "zh_cn": "物品展示 / 戴头 / 获取头颅 / 游戏内计算器 / 进服 MOTD", diff --git a/tests/test_pure.py b/tests/test_pure.py index 48080b4..9635277 100644 --- a/tests/test_pure.py +++ b/tests/test_pure.py @@ -252,19 +252,19 @@ def test_share_query_sanitizes_player(): def test_extract_display_name(): - from iridium.share import _display_json, _item_id, _translate_key + from iridium.share import _display_json, _humanize_id, _item_id, _translate_key assert _item_id('{id:"minecraft:stone",Count:1b}') == "minecraft:stone" assert _translate_key("minecraft:diamond") == "item.minecraft.diamond" - assert _translate_key("ae2:fluix_covered_cable") == "block.ae2.fluix_covered_cable" - assert '"text"' in _display_json( - '{id:"minecraft:diamond",tag:{display:{Name:"Shiny"}}}' - ) - assert '"translate"' in _display_json('{id:"minecraft:stone",Count:1b}') - assert "fallback" in _display_json('{id:"minecraft:stone",Count:1b}') - assert "custom_name" not in _display_json( - '{id:"minecraft:stone",Count:1b}' - ) or True + assert _translate_key("kubejs:time_twister_wireless") == "item.kubejs.time_twister_wireless" + assert _humanize_id("kubejs:time_twister_wireless") == "Time Twister Wireless" + assert _humanize_id("minecraft:fluix_covered_cable") == "Fluix Covered Cable" + assert '"text"' in _display_json('{id:"minecraft:diamond",tag:{display:{Name:"Shiny"}}}') + disp = _display_json('{id:"kubejs:time_twister_wireless",Count:1b}') + assert '"translate"' in disp + assert "Time Twister Wireless" in disp + assert "fallback" in disp + assert "kubejs:time_twister_wireless" not in disp if __name__ == "__main__":