From faa1602c2c9ef9158989840440a986c9d4f7faf5 Mon Sep 17 00:00:00 2001 From: bob <1478449280@qq.com> Date: Sat, 27 Nov 2021 22:58:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 95 ++++++++++++++++++++++++++++------------------- docts/Doc.py | 10 ++--- docts/__init__.py | 2 +- setup.cfg | 1 - 4 files changed, 62 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 2bd193e..5e29f6f 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,42 @@ # docts + document translate, read & translate & write 借助 [pygtrans](https://github.com/foyoux/pygtrans) 链接谷歌机器翻译 - ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/docts) ![PyPI](https://img.shields.io/pypi/v/docts) ![GitHub last commit](https://img.shields.io/github/last-commit/foyoux/docts) +![PyPI - Python Version](https://img.shields.io/pypi/pyversions/docts) ![PyPI](https://img.shields.io/pypi/v/docts) ![GitHub last commit](https://img.shields.io/github/last-commit/foyoux/docts) + +--- + +## v0.1.0 + +> 由于上层依赖库问题,现需手动提供额外参数 + +```python +from docts import * + +xlf_path = 'xlf_path.xlf' + +# 使用示例方法 +todo(xlf_path) + +# 运行完毕后, 会在xlf_path同目录下生成一个翻译好的文件, 则直接导入 Sisulizer +# 现在需要手动构造 client 参数,具体参考:https://github.com/foyoux/pygtrans +client = Translate(proxies={"socks5": "http://localhost:10808"}) +doc = Doc(xlf_path, client) +# WordFilters对象的add_filter等方法直接转移到, Doc对象中 +doc.add_filter(xxx_filter) +# 保存文件也无需使用 write_xl* +doc.save_words() ------- +# 需要导出忽略文件时 +doc.save_ignores() + +``` + +--- - 从 **v0.0.7** 开始, 无需 **xlwings** 和 **Excel**, 废弃 **xls** 文件, 改用无限制的 **xlf** @@ -36,14 +65,10 @@ document translate, read & translate & write ``` - - 看着迷迷糊糊, 不妨动手试一试 -------- - - ## 概述 此项目我暂时只用来结合 **Sisulizer** 翻译 **CHM帮助文档** , 但实际不仅于此, 支持配合 **Sisulizer** 翻译它所支持的所有格式, 理论上也是支持与其他本地化程序配合使用的. @@ -59,8 +84,6 @@ document translate, read & translate & write 效果可参考: [InstallShield2020-Documents](https://github.com/foyoux/InstallShield2020-Documents) - - ## 环境准备 1. 安装Sisulizer4 @@ -77,15 +100,11 @@ document translate, read & translate & write 在菜单: 工具->平台->HTML, [如图设置](images/image-20210626144042156.png) - - *注意* - 你当然只能在 **Windows** 系统里操作 - 由于依赖 **xlwings**, 而它是依赖 **Excel** 的, 所以你必须安装 **Excel**, 后期会考虑移除此依赖 - - ## 快速入门 以 **Sisulizer** 帮助文档为例 @@ -93,7 +112,7 @@ document translate, read & translate & write 1. 利用Sisulizer解析字符串并导出 ![利用Sisulizer解析字符串并导出](images/利用Sisulizer解析字符串并导出.gif) - + 2. 利用 **docts** 进行翻译 安装: `pip install docts` @@ -104,11 +123,10 @@ document translate, read & translate & write ![生成本地化文件](images/生成本地化文件.gif) - - ## 详细教程 -**Sisulizer** 只支持 **xls** 文件, 这限制了导出条目在 **65536** 内, 所以引入了 **xlf**, **xlf** 文件是一种 **xml** 文本格式, 没有这个限制, 但是 **xls** 的读写比 **xlf** 方便一些, 为了 方便(简单), 省事(偷懒)起见, 翻译的整体步骤就是: +**Sisulizer** 只支持 **xls** 文件, 这限制了导出条目在 **65536** 内, 所以引入了 **xlf**, **xlf** 文件是一种 **xml** 文本格式, 没有这个限制, 但是 **xls** +的读写比 **xlf** 方便一些, 为了 方便(简单), 省事(偷懒)起见, 翻译的整体步骤就是: 1. 导出 **xlf** 2. 读取 **xlf** 中的字符串, 然后翻译, 最后写入 **xls**, 如果超过 **65536** 条就分多个文件写入. @@ -120,25 +138,23 @@ document translate, read & translate & write 2. Python, (最好再配个 PyCharm) 3. 再就是这个包 `pip install docts`, 或者自己写代码, 解析 **xlf**, 和 **xls** - - ### Sisulizer简单介绍 **Sisulizer** 支持很多文件, 比如常见的: -- 文本类型: **TXT** / **CSV** / **HTM** / **HTML** / **XHTML** / **SHTML** / **XML** / **INI** / **JSON** / **XLF** / **properties** / **PO** / **XAML** ... +- 文本类型: **TXT** / **CSV** / **HTM** / **HTML** / **XHTML** / **SHTML** / **XML** / **INI** / **JSON** / **XLF** / ** + properties** / **PO** / **XAML** ... - 源码类型: **.c** / **.cpp** / **.h** / **.sql** / **.cs** / **.js** / **.php** / **.ts** / **.java** / ... - 二进制类型: **.exe** / **.dll** / **.apk** / **.jar** / ... - 太多了 **Sisulizer** 支持单个翻译和批量翻译, 并且支持多种语言, 丰富的设置选项与功能. -参照上面快速入门中的步骤, 此项目理论上支持任何 **Sisulizer** 支持的文件, 而不仅仅可以用来翻译 **CHM** 文件. 这套路理论上也是支持其他翻译工具的, 此项目核心其实就是 [pygtrans](https://github.com/foyoux/pygtrans) , 它支持 **十万** 的批量翻译, 只要将导出内容解析, 然后用它翻译, 重写回去, 再到相应工具导入即可. +参照上面快速入门中的步骤, 此项目理论上支持任何 **Sisulizer** 支持的文件, 而不仅仅可以用来翻译 **CHM** 文件. 这套路理论上也是支持其他翻译工具的, +此项目核心其实就是 [pygtrans](https://github.com/foyoux/pygtrans) , 它支持 **十万** 的批量翻译, 只要将导出内容解析, 然后用它翻译, 重写回去, 再到相应工具导入即可. [Sisulizer简易教程]() - - ### 使用Sisulizer翻译CHM文档的完整过程 大致步骤大家看 **快速入门中的动图**, 下面主要讲解一些选项的区别, 与 **docts** 的使用 @@ -192,7 +208,7 @@ document translate, read & translate & write # 它会被自动应用到每一个字符串句子上 wf.add_filter(filter_point) ``` - + - 你可能想把所有的 '•' 变成 '●', 因为前者是 **UTF-8** 的编码, 在翻译后的文件中的 **GB2312** 无法正常显示, 而翻译或过滤并不能解决这个问题, 这是你希望将 '•' 变成 '●' ```python @@ -264,11 +280,11 @@ document translate, read & translate & write ``` - - ## CHM相关 -- 微软推出的一种[帮助文档格式](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/htmlhelp/microsoft-html-help-1-4-sdk), 实际上是一个 **压缩包**+**自定义块数据** +- +微软推出的一种[帮助文档格式](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/htmlhelp/microsoft-html-help-1-4-sdk) +, 实际上是一个 **压缩包**+**自定义块数据** - 通过解压缩工具或 `hh.exe -decompile folder file.chm` 命令可进行反编译, 此命令系统自带 @@ -278,37 +294,38 @@ document translate, read & translate & write - 网上找到两款免费可以重编译 **CHM** 文件的工具 - 1. KeyTools: 亲测可用, 项目 **files** 目录下有提供 - 2. Precision Helper: 未测试 + 1. KeyTools: 亲测可用, 项目 **files** 目录下有提供 + 2. Precision Helper: 未测试 - 翻译 **CHM文档** 的一般套路如下: - 1. 反编译CHM - 2. 借助工具翻译HTML文件 - 3. 重编译 + 1. 反编译CHM + 2. 借助工具翻译HTML文件 + 3. 重编译 此项目借助 **Sisulizer** 直接支持CHM文档的特性进行操作, 个人觉得这个方法更Nice, 因为我想没有哪个本地化程序是无限制提供免费机器翻译的, 并且也不可能达到 **10万条句子**/**10s** 的速度. - **Sisulizer** 本身是支持 **机器翻译** 的, 可能由于盗版问题严重, 已全面停用了这一功能. -- **Sisulizer** 只支持旧版 **Excel** 格式的 **xls** 文件, 而 **xls** 工作表最多只支持 **65536条数据**, 当导出句子大于这一数量时, 会丢失数据, 所以建议导出统一使用 **XLIFF** 选项导出为 **xlf** 文件, **dcots** 导出时会自动分量 **xls** 文件导出. +- **Sisulizer** 只支持旧版 **Excel** 格式的 **xls** 文件, 而 **xls** 工作表最多只支持 **65536条数据**, 当导出句子大于这一数量时, 会丢失数据, 所以建议导出统一使用 ** + XLIFF** 选项导出为 **xlf** 文件, **dcots** 导出时会自动分量 **xls** 文件导出. - 软件本地化工具: 都好久没更新了, 三年吧 - 1. [Sisulizer](https://www.sisulizer.com/): 使用简单, 功能强大, 我比较喜欢, 最新版是2018发布的 **374** 版 + 1. [Sisulizer](https://www.sisulizer.com/): 使用简单, 功能强大, 我比较喜欢, 最新版是2018发布的 **374** 版 - [(2018版, 似乎也是最新版)支持的文件类型](images/image-20210626142536447.png) + [(2018版, 似乎也是最新版)支持的文件类型](images/image-20210626142536447.png) - 2. [SDL Passolo](https://www.trados.com/products/passolo/): 这个比较出名, 不过用得很少, 最新版也是2018出的 + 2. [SDL Passolo](https://www.trados.com/products/passolo/): 这个比较出名, 不过用得很少, 最新版也是2018出的 - [(2018版, 似乎是最新版)支持的所有文件类型](images/image-20210626142113761.png) + [(2018版, 似乎是最新版)支持的所有文件类型](images/image-20210626142113761.png) - 3. Radialix : 这个也用得很少, 没前面两个出名 + 3. Radialix : 这个也用得很少, 没前面两个出名 - 文件本地化工具: - 1. [SDL Trados Studio](https://www.trados.com/products/trados-studio/): 和 **SDL Passolo** 同家, 目前最厉害的文件本地化工具吧 + 1. [SDL Trados Studio](https://www.trados.com/products/trados-studio/): 和 **SDL Passolo** 同家, 目前最厉害的文件本地化工具吧 - [(2021版)支持的所有文件类型](images/image-20210626141828377.png) + [(2021版)支持的所有文件类型](images/image-20210626141828377.png) > 2021年07月08日22时14分53秒 diff --git a/docts/Doc.py b/docts/Doc.py index 0ba7b81..4caada4 100644 --- a/docts/Doc.py +++ b/docts/Doc.py @@ -30,10 +30,9 @@ def parse_xlf(xlf_path: str) -> List[str]: return words -def write_xlf(xlf_path: str, origins: List[str], trans: List[str] = None, step=60000): +def write_xlf(xlf_path: str, origins: List[str], client: Translate, trans: List[str] = None): # 翻译 if trans is None: - client = Translate() trans = client.translate(origins) if isinstance(trans, Null): print(trans.msg) @@ -65,11 +64,12 @@ def write_xlf(xlf_path: str, origins: List[str], trans: List[str] = None, step=6 class Doc: """...""" - def __init__(self, xlf_path: str): + def __init__(self, xlf_path: str, client: Translate): """...""" self.xlf_path = xlf_path self.words = parse_xlf(xlf_path) self.ignores = [] + self.client = client def add_filter(self, _filter: Callable[[str], bool]): """ @@ -158,11 +158,11 @@ def reset(self): def save_words(self): """...""" xlf_path = self.xlf_path[:-4] + '_words.xlf' - write_xlf(xlf_path, self.words) + write_xlf(xlf_path, self.words, self.client) return xlf_path def save_ignores(self): """...""" xlf_path = self.xlf_path[:-4] + '_ignores.xlf' - write_xlf(xlf_path, self.ignores, self.ignores) + write_xlf(xlf_path, self.ignores, self.client, self.ignores) return xlf_path diff --git a/docts/__init__.py b/docts/__init__.py index 3306896..6d89892 100644 --- a/docts/__init__.py +++ b/docts/__init__.py @@ -6,7 +6,7 @@ __description__ = 'document translate, read & translate & write' __url__ = 'https://github.com/foyoux/docts' -__version__ = '0.0.1' +__version__ = '0.1.0' __author__ = 'foyou' __author_email__ = 'yimi.0822@qq.com' __license__ = 'GPL-3.0' diff --git a/setup.cfg b/setup.cfg index 320e6b3..91e45c7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,7 +31,6 @@ packages = find: python_requires = >=3.6.* install_requires = pygtrans - pxy [options.packages.find] where = . ;exclude =