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的程序词典。直接用一个路由词典把简中链接到日本新字体汉字,这是个非常实用的解决方案诶。
yx_wh
6
最新版GoldenDict-ng已经添加了中文简繁体汉字到日文新字体汉字的查询
URE
7
试过了,如果不升级到NG最新版,使用自定义的s2jp.json和 jp2s.json,一样能够工作,这两个配置文件在原版GoldenDict里也工作的很好
这个版本好像有点问题,用这个CC-CEDICT,因为有简繁跳转,词条会重复显示。
yx_wh
9
诶,你这个是同时有繁体简体中文汉字的英汉汉英辞典吧?那不应该启用GoldenDict的这个OpenCC选项。这个选项是和日文辞典一起用的。因为现代日语的辞典一般只用日本新字体汉字作为语词的条目。
应该使用群组功能把中文查询组和日文查询组分开。
我用pyglossary CC-CEDICT.mdx CC-CEDICT.txt 把辞典转换成tabfile .txt之后发现这辞典就没有跳转啊。
暗黑破坏神
暗黑破坏神暗黑破壞神
Àn hēi Pò huài Shén
Diablo (video game series)
暗黑破壞神 暗黑破坏神暗黑破壞神
Àn hēi Pò huài Shén
Diablo (video game series)
这是两个内容完全相同的条目,只是一个词头叫「暗黑破坏神」一个叫「暗黑破壞神」,并未使用跳转。
URE
10
开启了opencc后,候选词列表中有异体字转换后的同名项是很正常嘛
URE
11
这个功能通过opencc的配置文件可以灵活实现,这几天学习了一下opencc的设计文档才明确,这也是opencc的设计理念。但凡能够通过加增配置文件实现的功能,不应该在程序本体中蜿蜒曲折去编码变现才合理
用 25.10 版的不会重复词条,新版的会重复,所以感觉哪里应该还是可以优化一下的。
URE
14

我这里只有候选词列表是这样表现的,文章内容正常,跟OPENCC确实有关
用的NG,不是菁典版,词典展示页面,简繁两条都显示,25.10版本中只显示一条,昨天忘了截图,重新配置再截图要好久。
URE
16
那应该是NG新版本的问题了,在查询时可能没有过滤同一个词典中重复的词条内容。