Click here to Close
 
打印

[原创] 关于 iPhone 的多语言环境及其它

本主题由 Peter 于 2008-5-4 17:31 加入精华

关于 iPhone 的多语言环境及其它

  看到坛子里有很多小白鼠,随便装东西删东西,经常把自己的 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 编辑 ]
本帖最近评分记录
  • horsepower 人气 +3 精品文章 2008-5-5 15:38
  • zhubangrui 人气 +3 感谢分享 2008-5-5 14:10
  • ureyking 人气 +3 从原理上说明了 喜欢 小白有必要认真研读 ... 2008-5-5 07:54
  • 繁星满天 人气 +5 看了这个才知道啥是高人。深入浅出绝对经典 ... 2008-5-4 23:10
  • mumacn 人气 +3 多些此类文章更好 2008-5-4 14:16
  • midgo 人气 +3 支持,可是如何开启语言选项中的中文菜单选项 ... 2008-1-31 00:04
  • 绝版男人 人气 +5 精彩 2008-1-27 14:41

TOP

有深度的帖子,说的很精彩,感谢!

TOP

楼主,我想问个问题,如果我想要我的iPhone在浏览网页和阅读短信的时候显示泰文,要怎么做呢?

TOP

不了解 iPhone 是否已经内置了泰文字体支持 ,如果你的 iPhone 可以设置多语言环境,安装 More keyboards & regins (安装源:http://cynix.org/iphone.plist),看看有没有泰文支持。
More keyboards & regins 现在还不能在 1.1.3 下安装。

TOP

引用:
原帖由 macres 于 2008-1-27 14:22 发表
不了解 iPhone 是否已经内置了泰文字体支持 ,如果你的 iPhone 可以设置多语言环境,安装 More keyboards & regins (安装源:http://cynix.org/iphone.plist),看看有没有泰文支持。
More keyboards & regins 现在还不能在 1.1 ...
一定没有内置泰文字体的支持,因为我收到的短信和上网浏览都是一个一个的方框
我先去装个More keyboards & regins试试看,看看里面有没有泰文的支持。
谢谢啦。

TOP

还有个问题,如果我装了More keyboards & regins并选择了泰文支持,那我原来的中文显示不会消失吧?

TOP

中文显示不会消失。但安装 More keyboards & regins 只是验证一下,我怀疑本身没有泰文字体。

TOP

引用:
原帖由 macres 于 2008-1-27 14:32 发表
中文显示不会消失。但安装 More keyboards & regins 只是验证一下,我怀疑本身没有泰文字体。
我也怀疑其本身应该没有泰文字库~~~

TOP

如果有 Mac,可以试一下将 Mac 下的泰文字体上传到 iPhone 试试(我不知道字体名称)

TOP

好好,我去搞个试试看

TOP