看到坛子里有很多小白鼠,随便装东西删东西,经常把自己的 iPhone 弄死,心存不忍,想把有些问题写出来,供大家在使用 iPhone、尤其是使用语言包时参考。当然不知道有没有谁愿意认真看到底的,不过我还是反复修改了多次,语言中也尽可能使用了比较通俗的词汇(自己认为啊),并且只针对iPhone 展开叙述,不一定专业,如有错误之处,请指正。
如果你不想三天两头把 iPhone 弄死,请了解并正确操作你的 iPhone:
· iPhone 不是一个电话。iPhone 是一个便携电脑。当你使用蓝牙进行配对时会发现,识别出来的iPhone 显示为 localhost。localhost 就是本地主机的意思,只有支持服务器功能的系统才可能成为localhost。如果你安装一个Apache 到你的 iPhone,在浏览器输入
http://127.0.0.1/ 就明白 iPhone 是什么了。说 iPhone 不是电话有点错误,严格说,iPhone 是一个电话和一个带有 iPod 所有功能的便携电脑的组合体。
· 必须要认识 root 这个人。root 是 Unix 系统中的最高权限用户,无所不能。也正因为如此,当我们还不具备一个标准用户资格的时候,拿着 root 这把钥匙,非同小可。要知道,一个专业的 Unix 服务器管理员,都不会轻易动用 root 账户。
· 不要随意改变 iPhone 内的文件权限(貌似使用什么工具可以)。iPhone 使用 Mac OS X 系统,Mac OS X 是 Unix 内核,对权限敏感。所谓权限就是用户(Owner)、组(Group,用户所在的组,系统设定为 Wheel)、所有人(Others)对文件的读取(R)、写入(W)、执行(E)的权限。iPhone整个系统初始设定为禁止写入的(写入包括修改),破解就是使iPhone 允许写入。
· 要理解 iPhone 系统和程序的关联关系。在 MacOS X 系统下,随便安装程序,只要不是对系统进行操作的程序,如果出现问题,最多只影响该程序自身,一般不会影响其它程序或系统。即便造成死机,按 Power+Home 强制关机后,再重启也会回到桌面。如果发现解决不了的兼容性问题,把那个程序删了就可以了。
· 要理解语言包是什么,语言包只是程序包里面的一个文件夹,不是程序的某个语言版本。安装语言包不是安装整个程序,卸载语言包也不是把程序删除。语言包也是程序的一部分,每个固件的语言包都是专用的,原则上不能通用。
· 不要使用 SFTP(包括 WinSCP)随意删除任何东西!iPhone 作为一个便携电子产品,苹果恐怕能省的都省了,连字符串文件都使用二进制压缩,留下的应该都是有用的。如果你不能确定对你绝对无用,不要删除。
· 只安装得到他人验证的软件,只修改得到他人验证的文件。
言归正传,说说 iPhone 的多语言环境。
1. iPhone的多语言结构和语言包(选读·如果你只关心如何安装、卸载简体中文语言包,可跳过)
Mac OS X 的标准开发环境是 Xcode,使用的程序语言为 ObjectiveC,可以开发出基于 Cocoa(纯 Mac OS X)和 Carbon(兼容 Mac OS 9.x 以前系统)程序。标准 Cocoa 架构的程序多采用支持多语言的程序包(Package)形式,程序包在 Mac 系统下显示为单一文件,在 Win 系统下显示为后缀 .app 的文件夹。
iPhone 的原生程序(如 SMS、Mail 等)就是标准的 Cocoa 程序,但是是经过精减的 Cocoa 程序。在这里,我们抛开 Mac OS X 的 Cocoa 程序不表,着重介绍 iPhone 的 Cocoa 程序的多语言结构。
标准的 iPhone 的 Cocoa 程序包(假设为 A.app)的内容至少为:icon.png、Info.plist、PkgInfo.plist、A 以及各种后缀为 .lproj 的语言包文件夹等。其中 A 是主程序,而语言包内的 Localizable.strings(有可能使用 Main.strings等其它名称)等则为对应的语言文件。一般情况下,可进行本地化的程序至少带有一个英文语言包文件夹(通常为 English.lproj 或 en.lproj)或程序开发人员的母语对应的语言包文件夹,该文件夹中的文件是将程序中涉及界面、提示、警告等需要本地化的字符串提取出来,记录成与程序源代码形成对应关系的字符串文件。这些文件是以 Unicode 编码保存的。iPhone 原始的语言包内的文件,为了节省空间,采用了Binary(二进制)存储方式。要修改其内容或进行本地化操作,必须先将其转换为 ASCII 字符格式(在线转换地址:
http://140.124.181.188/~khchung/cgi-bin/plutil.cgi)。转换后的文件内容的形式一般为:
(示例一)
*/ 说明文字 /*
“Are youkidding? %d” = “Are you kidding? %d”;
或
“JOG_CONTENT”= “Are you kidding? %d”;
或者是
(示例二)
<key>Content</key>
<string>Are you kidding?</string>
在示例一中,上述双引号、等号、分号均为英文半角字符,并且必不可少。等号前后是否有空格无关紧要。
由上面的例子可以看出,程序中使用的是等号前的双引号内的内容,而根据语言,在显示时替换为等号后双引号内的内容。因此,汉化时,翻译的只是等号后双引号内的内容。无论汉化还是修改别人汉化的文件,不能丢失上述的双引号、等号、分号等。这是保证语言包文件不出错的先决条件。
双引号中的内容如果有强制换行,那么在程序上就会显示为换行;双引号中带有 %及紧跟其后的字符(如 @、a、等)在汉化时不能拆分和改动。程序会在运行时以相应的内容替换这些字符。
双引号内不能再有半角字符的双引号,否则程序会因不知道截取到哪里,造成程序运行故障。
在示例二中,<key></key> 和 <string></string> 相当于示例一中等号前后的双引号,因此,汉化实际上只翻译 <string></string> 之间的文字。与示例一的区别是:行的末尾没有分号。
关于简体中文语言包的制作,理论上是将程序中其它语种的语言包拷贝并存储为 zh_CN.lproj(繁体为zh_TW.lproj。不建议使用 cn.lproj 或 Chinese.lproj,因为可能造成繁简字体混合显示)后,对其内含的所有需要汉化的文件进行逐一翻译而来的。而拷贝而来的 zh_CN.lproj 文件夹内的文件名称均不得改动。
实际操作中,有多种工具可以辅助完成资源文件的提取并提供对照翻译的界面,甚至可以使用词库进行自动翻译,最后生成 zh_CN.lproj 文件夹。
一般情况下,程序包中每个文件或文件夹都是有用的,所以随意的删除和修改可能造成不可恢复的错误。但是,假如你只使用英文和简体中文,那么你完全可以大胆删除其它语言的语言包文件夹(当然你必须清楚删除的是什么),这样也可以达到为应用程序瘦身的目的。
2. 安装、卸载简体中文语言包的注意事项
简体中文语言包标准形式为:名称为 zh_CN.lproj 的文件夹。
语言包的安装就是将语言包放置到 iPhone 对应的程序包(如 A 程序的语言包对应 A.app 程序)的根目录下。每个程序的简体中文语言包名称都是 zh_CN.lproj,因此绝对不能放错地方,否则在使用简体中文程序界面时就会出错。
这里需要重点强调的是:下载的语言包在安装时只上传简体中文语言包文件夹 zh_CN.lproj 到程序包的文件夹内(与 English.lproj 或 en.lproj 同一个文件夹),绝对不能将程序包(如 A.app)全部替换原有程序,否则,这个程序就死掉了(原因请阅读上面选读部分)。
“卸载”就是安装过程的反操作,这里不再重复。
一个标准支持多语言的程序在没有其它语言包存在的情况下,英文语言包(English.lproj 或 en.lproj)是必不可少的。因为如果设置的语言对应的语言包不存在,程序会自动调用英文语言包。语言包文件夹及内含的文件属性不需要进行设置(除非由于误操作使其不可访问)。
如果你安装了简体中文语言包,出现任何程序运行故障,需要从以下几个方面检查是否是语言包本身的问题:
1) 确认出现运行故障的程序是否是安装了语言包的程序,如果是,继续(如果不是,和语言包无关);
2) 将 设置 – 通用 – 多语言环境 – 语言 暂时改为英文,再重新运行有故障的程序;如果问题排除,继续(如果依旧,和语言包无关);
3) 检查涉及该程序的简体中文语言包文件(这个工作比较复杂,因为可能还涉及到 System/Liberay 里面的文件)。最好的办法是下载最新的对应当前固件版本的语言包文件替换,如果问题依然存在,继续(如果排除,就可以干点别的事了);
4) 这次如果想继续使用简体中文语言包,有几个选择:一、请求作者帮助;二、请求同好帮助;三、自己动手检查所有相关文件(可用 SFTP 打开、检查、修改或在本地进行后上传替换);四、放弃使用。具体到自己手动检查所有相关文件这一节,恐怕需要参考下面的选读内容了。
需要说明的是:单一程序的语言包文件本身如果有问题(错译或漏译除外),最有可能就是语言包文件内容的格式遭到破坏(具体可以参考上面的叙述),造成程序的某个功能出错或不能运行。但是,不会影响系统以及其它程序。
值得注意的是:系统文件的语言包(就是放入 System/Liberay 里面的语言包)如果有问题(错译或漏译除外),就可能会影响某个程序或系统的某个功能,甚至造成系统崩溃、不能启动等严重后果。因此,汉化作者除自己要勇于充当小白鼠外,还需要其他小白鼠的合作。通常期望汉化作者自己单独充当小白鼠并不现实,因为要让一个人备足所有版本的 iPhone 来测试所有用户环境下语言包的功能,未免太苛求。
汉化也是对程序进行修改的范畴,因此也可能会造成程序运行故障,或是因为加入语言包引发程序潜在的 Bug。这一点,语言包的用户应该给予作者以足够的谅解与支持。
3. 特例程序
以 Installer 为例,打开 Installer.app 文件夹,你会发现找不到任何语言包文件夹,这说明该程序并非Cocoa 标准架构的程序,或作者没有做本地化提取。这类程序仍然可以汉化,但汉化的程序必须覆盖原程序或以另一个程序的名义才可以运行。另外,汉化要直接修改主程序的 Hex 代码,并非像翻译字符串那样简单,这也是很多第三方程序没有汉化版本的原因。
4. 附记
我的 iPhone:OTB 1.1.2,47周,升级到 1.1.3,卡贴。
[
本帖最后由 macres 于 2008-5-4 23:09 编辑 ]