我经常下载到一些繁体命名的文件,虽然看得懂,但后续搜索时为免遗漏,总要简体和繁体都搜一遍,非常不便。例如,我曾下载了一批红烧肉的教学视频,有繁体有简体——有些大陆的账号,上传的视频不知为何也是繁体标题——如果时候搜 红烧肉
,显然就漏掉了繁体的 紅燒肉
。1
其实两岸三地的玩家们,早就制作过各种繁简文件名转换工具,不过碍于两点,结果都不了了之:第一,早年的方案依托第三方库,比如 opencc,一般人用不明白2;另一方面,或许是因为繁体中文世界进入互联网较早,这方面的早期玩家也是港澳台朋友居多,偏偏简体到繁体不是函数关系,经常出错(例如把“头发”转成“頭發”),最后效果不佳。
时至今日,繁简转换本身已经成为自动化玩家圈子里的悬案,问题之所以鲜少被提及,只是因为大家逐渐能看懂对方的文字。我也能够熟练阅读繁体中文,但很不幸,计算机不行,这就出现了文章开头所说的搜索障碍。为此,我返回到繁简文件名转换的课题,只考虑对我——简体中文使用者——有意义的繁体转简体,并最终避开了 opencc 等第三方库,遂有此文。
本文取道系统内置的繁简转换功能,理论上也可以完成简体转繁体,但前文已经提及,无法确保百分比正确,何况我用不到,故本文刻意避开。惟需注意,不同于一般的功能,原生繁简转换并未提供 AppleScript、Shell 或 Python 接口,许多玩家恐怕也是第一次遇到这三板斧劈不开的难题。不过,macOS 还提供了另一种自动化脚本:Swift Script。3
——不用担心,Swift Script 本质上也是一段脚本,如果你也不熟悉 Python (Script),那么 Swift Script 对你而言不过是葡萄牙语和西班牙语的区别。而且,虽然冠着 Swift 的大名,但不需要 Xcode 也能运行 Swift Script,毕竟 macOS 上的几种自动化脚本语言本就可以互相嵌套嘛,只要支持其中一种,基本就能跑其他一切。
不过,我也更喜欢捷径:Keyboard Maestro 自带了运行 Swift Script 的模块,无需再自行编写嵌套模板。思路很简单:
- 逐个获取当前选中的文件;
- 每次处理一个文件,将其文件名转换为简体;
- 然后重命名;
- 依次处理完选中的所有文件。
注意,上述步骤也会把文件路径中的繁体转换成简体,导致重命名时失去目标而失败,但我的电脑上几乎不会出现这种情况,故未继续优化。你可以将文件夹路径和文件名拆开处理,即可避开潜在的对象错误。
我所用的繁体转简体代码如下,如确有必要,可更换 Hant
和 Hans
从而逆向转换。
import Foundation
let input = ProcessInfo.processInfo.environment["KMVAR_localMinja"]!
let mutableString = NSMutableString(string: input)
let transform = "Hant-Hans"
if CFStringTransform(mutableString, nil, transform as CFString, false) {
print(mutableString)
} else {
print("Conversion failed QAQ")
}
依托这个 Keyboard Maestro 动作,即可将选定的文件批量转换为简体名称。
当然,转换的目的,还是在文件管理中简化搜索。如果本就是繁体的严肃作品(例如音乐或书籍),自然不必强扭作简体文字,反之亦然。
- 至于为何不考虑英文的“braised pork”?啊,不要忘了这个例子在讨论中餐。我很难想象为何要舍近求远,向老外讨教中餐技法。 ↩
- 一般人的安装流程是这样的:请下载 Python,请安装 opencc,如失败,请检查 Python 位置,请检查有无其他 Python,请……不会有更多步骤了,因为此君已经放弃了。 ↩
- 为何会想到使用 Swift Script?一般用户只能通过快捷键完成繁简转换,并且还只能当场粘贴,现炒现吃,无法融入自动化流程;但启动器 LaunchBar 可以调用系统的繁简转换服务,因此一定有某种接口。假设 LaunchBar 也依靠脚本,那么通过排除法,答案基本上就是 Swift Script(确实,还有个东西叫 Javascript for Automation,但自动化语境下的 Javascript 和 AppleScript 基本只是同源的方言,当成一个东西看待就好)。 ↩