『WEIP技术组』简单Cydia插件汉化随笔教学
『WEIP技术组』简单Cydia插件汉化随笔教学
更多精彩请关注
威锋技术组官方微博 https://weibo.com/weiptech
使用语言包最大的好处就是:1,不会修改作者的源程序,避免破解,修改的法律问题;2,在程序更新后如果语言字段资源没有更新或部分更新的话不影响语言包,仅需部分更新即可;3,可根据您的系统自动切换语言。
iOS的插件一般的资源和OSX类似,只要是使用了多语言环境开发的程序其实都可以使用语言包达到汉化的目的!
因为iPhone OS中已经内建了多语言的支持,中文语言资源文件夹常见为:
简体:
zh_CN.lproj
zh-Hans.lproj (高优先级)
繁体
zh_TW.lproj (zh_HK)
zh-Hant.lproj (高优先级)
这个优先级是指比如一个插件文件夹同时有 zh_CN.lproj 和 zh-Hans.lproj 这2个简体语言资源文件时,系统会最先调用zh-Hans.lproj ,这个要特别强调,因为有时候作者可能开发时也放了中文支持,但可能有的本地化不是太好,而如果作者是用的zh_CN.lproj简体文件夹的话,我们就可以直接使用zh-Hans.lproj简体资源文件夹来汉化,这样在制作完语言包后打包一般不会产生冲突,又可以安全地替换掉作者的资源!
工具篇
一般我习惯于在WINDOWS里面来提取资源字串和制作汉化包,其实主要是我习惯了使用威锋网友开发的PropertyList Editor (也简称pledit,可以挂载到WINSCP里面关联使用,但是它有一个问题就是无法正确地处理软回车符)
下载地址:https://bbs.weiphone.com/read-htm-tid-350850.html
当然也有其它更好的编辑工具,但是习惯了,对于一个不熟悉的工具,即便再好也可能会因为习惯问题不用
Deb文件可以使用7-zip来解包的.
7-zip下载地址:x32 : https://downloads.sourceforge.net/sevenzip/7z920.exe
x64 :https://downloads.sourceforge.net/sevenzip/7z920-x64.msi
WinSCP下载 : https://weip.dev.weiphone.com/jai ... ser_v5.5.1b3970.zip
UltraEdit下载: https://weip.dev.weiphone.com/jailbreaktools/others/UltraEdit_17.30.0.1002_SC.zip
常用语言资源位置
首先我们制作语言包主要是提取程序和插件的字符串,一般的是从 plist 后缀的文件里面提取,当然如果作者本身有其它的语言资源那就更方便了,我们仅需将语言资源复制到对应的中文语言文件夹再汉化即可!
/Applications/xxxxx.app 这里的是应用程序,一般会在桌面上显示图标
/Library/PreferenceBundles/xxxxx.bundle 这里的一般是插件的主程序目录
/Library/PreferenceLoader/Preferences 这里的文件其实都是基于依赖于PreferenceLoader这个插件的,基本上都是plist文件。它即可能是插件的主界面资源,又有可能仅是在系统的设置里面能够看到并配置的插件名称,它们又可能都有在这个plist文件里(可以修改对应的文件来修改设置里面插件名称)
字符串提取
如果是从plist文件提取的话,一般资源都在几个常见的字段组合下,比如:
<key>label</key>
<string>显示字串</string>复制代码
(键值key的 lable 对应的string里面的字符串)
<key>footerText</key>
<string>显示字串</string>
复制代码
(键值key的 footerText 对应的string里面的字符串,一般这个key是对项目的说明)
<key>shortTitles</key>
<array>
<string>显示字串</string>
<string>显示字串</string>
</array>
复制代码
(键值key shortTitles 对应的下面string里面的字符串,一般这个key是设置里面的多选项的显示字串)
<key>title</key>
<string>显示字串</string>
复制代码
(键值key title 对应的下面string里面的字符串,一般这个key是设置里面的项目名称)
多语言资源语言包文件结构
文件为.strings的后缀名,编码为UTF-8,使用pledit打开后内容一般为:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>原始显示字符串</key>
<string>替换的中文翻译字符串</string>
</dict>
</plist>复制代码在汉化plist文件时,一般一个plist文件对应一个strings的语言资源
好,现在开始实战了,在实战的过程中我会教大家一些小的技巧
首先我们要知道什么是快链,实际上在iOS中,快链类似于WINDOWS的快捷方式,但是它又比它好,在汉化的过程中,如果一个插件有几个不同的路径的多语言资源的话,我们可以通过快链的方式将语言包统一在一个位置,方便以后的维护和更新
如果不会全新创建一个strings的文件也不要紧,我们可以随便找一个语言文件,然后去修改里面的字串
以 Messages Customiser为例子,WinSCP为编辑环境,pledit为编辑器:
我们首先使用Winscp的终端命令将 Messages Customiser解包 (解包命令:dpkg-deb -x 解包的文件名 ./temp ) 这样就将源程序解包了。这个解包的主要目的是创建一套正确的安装文件结构,方便最终的多语言的汉化包打包,如果不会打包可以忽略此处,本文暂不讲解如何打包!
解包后我们会看到Messages Customiser的文件结构如下:
Library
MobileSubstrate
DynamicLibraries
CustomMessagesColour.dylib
CustomMessagesColour.plist
PreferenceBundles
MCPrefs.bundle
AppTintPrefs.plist
MCPrefs.plist
BackgroundPrefs.plist
OtherBubblePrefs.plist
ChatViewPrefs.plist
OtherSettingsPrefs.plist
CompatibilityPrefs.plist
SMSBubblePrefs.plist
ConvoListPrefs.plist
SMSPrefs.plist
HelpPrefs.plist
SMSPrefs_other.plist
IMBubblePrefs.plist
InfoTextPrefs.plist
Info.plist
icon.png
icon@2x.png
icon_big.png
icon_big@2x.png
mail.png
mail@2x.png
banner_ipad.png
banner_iphone.png
banner_iphone@2x.png
paypal.png
banner_ipad@2x.png
paypal@2x.png
MCPrefs
PreferenceLoader
Preferences
me.chewitt.MCPrefs.plist
这样解开以后我们就可以大体知道这个程序安装了那些文件,文件在那个位置了!(其实直接在Cydia 里面点击已安装的插件,然后在插件介绍页面的最下方有个“文件系统”,这里也可以看到这个插件所安装的文件及其路径,也可以用7-zip打开查看路径和提取文件。)
其中
MobileSubstrate文件夹是基于Mobile Substrate(现在改名叫Cydia Substrate)环境的启动加载项
PreferenceLoader 内的文件me.chewitt.MCPrefs.plist后可以看到实际上就是在设置里面的项目的名称,你可以直接修改源程序安装后的对应目录的文件来修改显示的名称,但是多语言方式就没必要,不过你可以复制这个显示名称字段到语言文件里面,有一部分的PreferenceLoader项目名会读取多语言字段来变化在设置里面的名称的(不过这个Messages Customiser的无法自动切换显示名称)
PreferenceBundles的MCPrefs.bundle文件夹就是Messages Customiser设置的主目录了,这里我们能看到这里面有很多的plist文件,
按照标准来讲,在MCPrefs.bundle文件夹里面创建一个zh-Hans.lproj 的文件夹(注意一点的是目录权限需为0755),然后在创建MCPrefs.bundle里面的plist相同名称,但是后缀名为.strings的语言文件
关于strings语言文件创建的技巧及原则:
这里就要说到一个小技巧了,其实在这些plist文件里面有很多重复的资源项目,比如颜色的字段,那么我们其实没必要每一个plist文件都单独使用一个string的资源文件,只需要通过iOS的快链方式
首先,我们创建一个 Localizable.strings 的真实的语言包资源文件,然后用它来创建不同名称的对应到MCPrefs.bundle里面的plist的strings快链文件,这样在系统读取快链的"文件或文件夹时会自动跳转读取Localizable.strings
在WinScp里面的步骤:先点选创建好的Localizable.strings文件,然后在空白处点击鼠标右键,新建->连接
依次将其他plist的语言文件快链建好,结构清单如下(快链方式在图标的左下角有箭头标示):
全部的结构创建好以后我们就可以开始做字符串的汉化了。
根据文件清单的名称可以看出每个文件大概对应的项目,比如MCPrefs就是设置的主页面,那么当打开MCPrefs.plist文件,就可以看到里面对应显示的内容:
好,我们开始修改Localizable.strings,添加汉化字段,比如上面的2个label的string,如下
<dict>
<key>Bubble Colour Settings</key>
<string>气泡颜色设置</string>
<key>Enabled</key>
<string>启 用</string>
</dict>复制代码
添加完毕后保存,然后退出设置的后台,再打开设置,可以看到结果,添加的中文语言已将这2个字段替换了!
你们有没发现我在汉化Enabled的“启用”这个词时,中间添加了空格,这个实际上是为了一个整体的美观,所以:汉化不是完全的 “英->中” 那么简单,还要有个人的一些风格,有些专业的词汇,难以理解的词汇和部分无法翻译的也可以在合适的位置添加自己的注释!比如我这个空格添加后,整体的效果如下,这样搞整体效果就美观多了!
OK,设置项目的多语言汉化方式基本就完了
无法多语言化自动设置的英文名称的设置项目的手动强制汉化:
打开 /Library/PreferenceLoader/Preferences 文件夹,找到欲修改的插件的plist文件打开
找到label字段(有的还有title字段),将下面的string项目修改为你想改的名称,如图:
Activator 手势部分的英文字串的多语言化
资源主要在/Library/Activator/Listeners目录下
/Library/Activator 这个目录其实是一个快链,完整的路径其实是 /private/var/stash/Activator(有的还有.xxx的随机字符)
它的多语言文件是有要求的,必须为:Localizable.strings ;这就是为什么我建议不管怎么搞,原始多语言文件建议使用Localizable.strings文件名的原因!
在我的日常汉化习惯中,我习惯于所有的汉化字串都在一个文件里面
以Eclipse为例:
打开这里的 com.gmoran.eclipse 文件夹,创建 zh-Hans.lproj 的语言文件夹,其实这里我仅是创建的一个快链,指向了 Eclipse 的主设置文件目录的汉化文件夹,且主资源的名称为:Localizable.strings
Activator 手势部分的英文字串资源全部在对应文件夹的Info.plist文件里面
可以看出其中:description 键值对应的string字符串是这个手势开关的说明;title为这个开关的名称
那么我们可以按照前面所讲的汉化方式,将这个字符串的翻译放在Localizable.strings文件里面就行了,不过有一点要注意的是,Activator 手势部分汉化后如果要预览效果,一定要Respring刷新系统缓存后才能生效,否则看到的还是英文!
Applications 的系统级的应用(有桌面图标的) 汉化
如果一个程序内包含了其他国家的语言包,但是没有中文语言包的,那就方便,只需要将英文资源复制一套到中文语言文件夹,然后在翻译对应字串即可,但是有些程序没有语言包,怎么办呢?其实有些程序是可以汉化的,不过资源是在主执行程序内部,那么我们就需要使用UltraEdit等内码编辑器来查找字符串资源了!
下面我来举一个例子:(MyWi 7) 首先我们运行MyWi 7
在主界面可以看到这些文字:”Welcome to MyWi” “Support / Help”
为什么我选的是少的单词呢?其实我这么做是先从简单入手,看找到几个简单的单词汉化后是否有效,没效果就马上放弃嘛!省得搞半天发现不支持多语言
好我们来搜索 “Support / Help” 这个关键词 (注意选择:查找ASCII)
这里我搜索到了2个字段,基本说明搜索的字段是对的,那么我们就可以使用这个字串来汉化
但是我们搜索 “Welcome to MyWi” 时会发现搜索不到,怎么回事呢?好,调整一下搜索的关键词,直接搜索 “Welcome” 这是或发现搜索到很多,然后搜索到这发现了一个 “Welcome to %@”
其实看到这,脑袋灵活的应该能明白个大概了,这个 “%@“ 其实就是一个变量,那么我们可以直接提取这个字段汉化,但是这个变量在汉化时不要改动它!
再说明一下:仔细看上面的截图,在ASCII码搜索结果左边的内码区,我们看到有一个”00“的内码,其实”00“在程序内部表示结束的意思,也相当于这个字段的起始和结束范围。
好,确定了这2个字段以后我们尝试在/Applications/MyWi.app文件夹下创建一个简体中文目录:zh-Hans.lproj,并创建多语言汉化文件:Localizable.strings (应用程序汉化一般也必须是这个文件名)
汉化字串如下:
<dict>
<key>Support / Help</key>
<string>支持 / 帮助</string>
<key>Welcome to %@</key>
<string>欢迎使用 %@</string>
</dict>复制代码
保存文件后,打开MyWi,此时,我们就可以看到这两个字段已经变成中文了,这样就说明这个程序也是支持多语言的,那么就可以放心地去对照程序运行界面的文字来搜索提取字串来多语言汉化了
Applications 的系统级的应用(有桌面图标) 桌面图标名称的多语言汉化:
所有的iOS类的应用程序(有桌面图标的)包括IPA安装的程序,桌面图标的名称实际上是由程序目录下的 info.plist 文件控制的,
在里面一般有个 CFBundleDisplayName (不是全部都有,比如MyWi里面就没有这个字段)
<key>CFBundleDisplayName</key>
<string>桌面图标名称</string>复制代码
其实无需打开这个文件,iOS都有一个标准的,那就是info.strings,这个其实就可以控制桌面图标的显示名称,我们先不管MyWi的info.plist里面有没有CFBundleDisplayName,直接在zh-Hans.lproj 语言文件夹里面创建一个格式和 Localizable.strings 一样的 info.strings 文件,里面只有一个键值的字段翻译:
<key>CFBundleDisplayName</key>
<string>你想更换的中文名</string>
复制代码
如图:
保存后Respring刷新系统缓存后,就会发现桌面图标已改为上面的名称!
Flipswitch的Switches开关的名称的汉化:路径位于/Library/Switches 目录下的XXX.bundle 文件夹
这个开关的汉化和APP的桌面图标名称的汉化是一样的,在每个开关文件夹下都有一个 Info.plist 文件,里面也有一个CFBundleDisplayName的键值
,我们也只需在开关目录下创建语言文件夹以及格式和内容都跟APP图标名汉化一样的InfoPlist.strings文件即可!
基于 PreferenceLoader 的插件的多语言汉化
PreferenceLoader 的插件有点小小的区别,如果它的插件设置包含在 /Library/PreferenceLoader/Preferences 目录下的 plist 文件里面的话,我们就不能用 Localizable.strings 这个名字了,因为假设有2个 plist 文件:A.plist 和 B.plist 而A.plist如果语言包使用了Localizable.strings这个名字,B.plist 就无法使用这个文件名了,会被覆盖或者在安装时直接提示冲突!
那么我们就直接在语言包文件夹下创建使用和 plist 文件主名称相同,但是后缀名为.strings 的语言文件,其他汉化的方法和PreferenceBundles的一样,所以这里我特别说明一下!
比如我的PreferenceLoader 简体中文语言文件夹下这些 strings 文件。
总结一下
汉化不是完全的英->中,很多时候单词很容易模凌两可的,最好对这些词要亲自使用一下后来决定正确的翻译,甚至是用自己的理解去翻译,比一定要照搬翻译!简体汉化转繁体汉化也不是完全的将文字变为繁体就行了,它们其实有很多的词语的区别,比如 “程序”和”程式”;“设置”和“设定”等
开始汉化时,可以先试着汉化几个简单的单词看是否有效,有效了再去完整地汉化,省得翻译差不多了结果不支持,我就吃过这个亏!
最后,希望大家能从我的教程中学习到原理,多为别人奉献一些好的汉化作品!
威锋技术组的发展离不开每一个锋友的支持;为了更好的服务,更多的奉献,
威锋技术组离不开您的支持:支付宝捐助 - https://me.alipay.com/weiptech
评论(2)