yx_wh
1
我阅读了帮助文件,看来GoldenDict的OpennCC默认只使用了
s2tw.json(简体中文→台湾繁体)
s2hk.json(简体中文→港澳繁体)
t2s.json(繁体中文→简体中文)
三个文件。在查询简体中文和繁体中文的时候这是完全够用的,但是碰到中国人学日文(日本人学中文应该类似)的时候就不够用了,因为日本战后使用的「新字体」,有的字在Unicode里面和简体中文、繁体中文都不一样。
例:国铁、國鐵、国鉄。
日本新字体汉字的「国」和简体中文在Unicode里面是一个字,但是日本新字体汉字的「鉄」和简体中文的「铁」繁体中文的「鐵」都不一样。
而opencc里面是有t2jp.json和jp2t.json实现繁体汉字→日本新字体和日本新字体→繁体汉字转换的。所以说,要是GoldenDict的词典-词典来源-转写-中文转换里面增加
繁体中文→日本新字体(直接使用t2jp.json) 和 日本新字体→繁体中文(直接使用jp2t.json)
简体中文→日本新字体(先用s2t.json转一遍,再用t2jp.json转一遍) 和 日本新字体→简体中文(先用jp2t.json转一遍,再用t2s.json转一遍)
四个额外选项,那对中文或者日文的学习者来说,想必都会更加方便吧!
yx_wh
2
在AI辅助下造出了程序辞典。
中日跳转:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import urllib.parse
from opencc import OpenCC
def main():
if len(sys.argv) < 2:
return
word = sys.argv[1].strip()
if not word:
return
try:
# 第一步:简体 → 标准繁体
cc_s2t = OpenCC('s2t')
trad = cc_s2t.convert(word)
# 第二步:标准繁体 → 日本新字体
cc_t2jp = OpenCC('t2jp')
result = cc_t2jp.convert(trad)
except Exception:
# 转换失败,不输出任何内容
return
# 如果转换结果与原始输入相同,也不输出
if result == word:
return
# 对结果进行 URL 编码,构造可点击的链接
encoded = urllib.parse.quote(result)
html = f'<meta charset="utf-8"><a href="gdlookup://localhost/{encoded}">{result}</a>'
sys.stdout.buffer.write(html.encode('utf-8'))
if __name__ == '__main__':
main()
日中跳转:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import urllib.parse
from opencc import OpenCC
# 手动修正字典:日文新字体转换后常见的错误映射 → 正确繁体
# 键为 jp2t 转换后的错误繁体词,值为正确的繁体词
FIX_MAP = {
"花辨": "花瓣",
"單辨": "單瓣",
"旗辨": "旗瓣",
"重辨": "重瓣",
"離辨花": "離瓣花",
"合辦花": "合瓣花",
"僧帽辨": "僧帽瓣",
"房室辨": "房室瓣",
"三尖辨": "三尖瓣",
"半月辨": "半月瓣",
"辨證論": "辯證論",
"辨證法": "辯證法", # jp2t 会把“証”转成“證”,所以这里是“辨證”
"辨纔": "辯才", # jp2t 会把“弁才”转成“辨纔”
"辨士": "辯士",
"雄辨": "雄辯",
"抗辨": "抗辯",
"辨口": "辯口",
"答辨": "答辯",
"辨論": "辯論",
"口辨": "口辯",
"多辨": "多辯",
"辨解": "辯解",
"強辨": "強辯",
"員辨": "員弁",
"武辨": "武弁",
"辨別": "辨別", # 这个本身是对的(辨别),无需改,但作为示例保留
# 如果你发现其他错误,可以在这里继续添加
}
def main():
if len(sys.argv) < 2:
return
word = sys.argv[1].strip()
if not word:
return
try:
cc_jp2t = OpenCC('jp2t')
trad = cc_jp2t.convert(word)
# 🔧 手动修正:遍历修正字典,替换错误的繁体词
for wrong, correct in FIX_MAP.items():
if wrong in trad:
trad = trad.replace(wrong, correct)
cc_t2s = OpenCC('t2s')
simp = cc_t2s.convert(trad)
except Exception:
return
# 如果输入与繁体或简体相同,不输出
if word == trad or word == simp:
return
# 构建 HTML 输出
html_parts = []
# 如果需要显示繁体链接(且与简体不同),则加一个
if trad != simp:
# 繁体链接
encoded_trad = urllib.parse.quote(trad)
html_parts.append(f'<a href="gdlookup://localhost/{encoded_trad}">繁:{trad}</a> ')
# 简体链接
encoded_simp = urllib.parse.quote(simp)
html_parts.append(f'<a href="gdlookup://localhost/{encoded_simp}">简:{simp}</a>')
else:
# 繁简相同,只输出一个链接(但前提是它与输入不同,因为上面已经判断了)
encoded = urllib.parse.quote(trad)
html_parts.append(f'<a href="gdlookup://localhost/{encoded}">{trad}</a>')
html = '<meta charset="utf-8">' + ' '.join(html_parts) # 用空格分隔
sys.stdout.buffer.write(html.encode('utf-8'))
if __name__ == '__main__':
main()
URE
3
建议NG添加一个针对opencc的额外配置项,这样需要什么就可以自由添加。
yx_wh
5
谢谢!
许多手机应用没有内置opencc也没有PC版GoldenDict的程序词典。直接用一个路由词典把简中链接到日本新字体汉字,这是个非常实用的解决方案诶。