iOS 的本地化 Localization

时间:2023-01-24 03:18:00

基本本地化格式说明:

/**/中间的是注释,value是key在相应语言环境下的显示值,以';'结尾.

/* comment */
"key" = "value";

做本地化测试的时候最好把机器中的程序删除,工程clean,然后在改变语言环境再去测试。


一.程序源文件
1.在.m或.mm文件中使用的NSLocalizedString(<#key#>, <#comment#>) 对想要本地化的字符串标识.
2.运行 

genstrings -o target_dir/ src_dir/*.m

target_dir是你想生成的对应的语言包文件夹比如 en.lproj,src_dir包含想本地化的源程序目录
如果没有target_dir可能需要你先创建一个,执行无错误的化就会在src_dir内生成Localizable.strings文件
3.把这个文件加到工程中,重复,就可以让程序的源文件支持多个语言版本.

iOS 的本地化 Localization

注意1:之后又修改了源文件,要继续添加本地化字符串可以给genstrings加上-a参数这样会把所有用到NSLocalizedString的key追加在后面,然后手工把之前有的删了就行;不加-a的话会重新生成一个,以前做好的对应字符也不存在了
注意2:添加的时候最好确保一下程序中非语言包文件夹中没有Localizable.strings文件,最好不是拖拽式添加,而是用菜单选择式添加.如果你的Localizable.strings文件添加后没有如上图合成一个包的形式,那就需要从工程中删了重新添加.


二.xib文件
1.Xcode中选择文件,utilities面板的localization中添加想要的语言包。

iOS 的本地化 Localization

2.然后这个nib文件中有很多字符串,比如一个UILabel上显示的文字,我想提取出来让别人帮我翻译下,那就可以使用下面命令提取字符串:

ibtool --generate-strings-file MainMenu.strings en.lproj/MainMenu.nib

3.然后我拿到一个翻译好了的MainMenu.strings,想要根据这个文件来生成一个对应的nib文件,使用如下命令

  ibtool --strings-file de.lproj/MainMenu.strings --write de.lproj/MainMenu.nib en.lproj/MainMenu.nib

iOS 的本地化 Localization

注意:确保文件都存在,如果文件夹中没有这个MainMenu.strings,那么就是简单的复制一记。
三.Info.plist文件
每个程序的Info.plist都有个对应的InfoPlist.strings的文件。
比较简介的添加本地化的方式是在Xcode中选择这个文件,打开utilities面板,在Localization那里添加想要的语言。

另一种就是建自己想要的语言包文件夹,然后复制已经存在的InfoPlist.strings到这个文件夹中,在把这个文件加入工程中(不需要形成1中那样的包的形式)。

iOS 的本地化 Localization


下面两种都可以改变程序的显示名称:

CFBundleDisplayName = "name";
“CFBundleDisplayName” = "name";

四.Setting.bundle
Setting.bundle包中默认有一个en.lproj问价夹包含Root.string 对应的是默认的Root.plist的英语语言包。

bundle中的plist中的Preference Items下面的每个item中的title或titles的值都是可以本地化的。

把你要本地化的那个key按照标准格式写到list对应的.string文件中.把这个.string文件复制到各个语言包文件夹中,修改值.

iOS 的本地化 Localization


下面有个程序帮你提取list中的每个title和titles中的键值:bStrings.zip

command: bStrings [-o out] [src] [-a]

-o : 指明输出文件

out: 如果是文件,所有plist中提取的字符串都将存放到这个文件中。

 如果是文件夹,每个plist的字符串提取到文件夹中对应的文件里面(对应的文件会自动创建)。 如果out地址不存在,则指向当前目录。 

src 指向需要本地化的plist文件或存放这些plist文件的目录。不存在的话指向当前目录。

-a: 追加模式,如果输出文件已经存在,那么新内容添加在结尾。否则就是清空在写。

不能运行的话去这里看程序源码.