一、启动项目国际化支持
首先在项目中增添需要支持的语言,默认是英语。如图:
屏幕快照 2019-03-14 下午5.28.26.png
无论是给APP名字还是APP内添加国际化都需要先做这步。
二、给APP名字(CFBundleDisplayName)国际化
新建一个Strings文件
屏幕快照 2019-03-14 下午5.35.37.png
并一定要取名为 InfoPlist.strings
注意后缀是 strings, 不是string.
然后选中这个新建的文件,在右边点击Localization展开并选择需要支持的语言。
屏幕快照 2019-03-14 下午5.41.25.png
选择支持的语言后,刚才新建的InfoPlist.strings文件就会变成可展开的列表。子项目就是所支持的语言配置文件。
屏幕快照 2019-03-14 下午5.44.45.png
然后在英语配置文件里写入 CFBundleDisplayName = "EngName";
在中文配置文件里写入 CFBundleDisplayName = "中文名";
然后运行,切换系统语言环境APP图标就会对应的显示 EngName 或 "中文名" 字样。
三、应用内容的国际化
和上面一样创建一个Strings 文件。但是取名为: Localizable.strings
这个是默认名字,如果不是这个名字,在接下来使用宏的时候就要指定文件名。
和上面同样的操作,产生支持的国际化语言子文件。
1、假设有个label,在代码中设置其text。代码中这样写。
self.label.text = NSLocalizedString(@"label_001_text", nil);
其中 @"label_001_text" 就是一个key, 宏 NSLocalizedString(key, comment) 的意思就是去默认的Bundle中,去寻找当前语言对应的默认的本地化文件,寻找这个key,取得value作为返回值,给label的text赋值。
2、然后我们就在 Localizable.strings 的子文件中,英文配置文件里面输入
"label_001_text" = "Is a EnglishText";
同理,在中文配置文件中输入:
"label_001_text" = "我是一个标签";
就这样,在切换不同系统语言的情况下,刚才的宏就会去寻找对应的文件,根据key值获取不同的值,完成国际化的过程。
四、UIStoryBoard 里面直接输入的文字国际化
1、在本文的第一步,创建国际化支持的时候,就会弹出一个窗口,默认选中自带的StoryBoard支持国际化,在那一步操作完成后,其实StoryBoard已经自动的添加了国际化子文件了。这个子文件,与上面两种情况自己手动创建的文件是一样的。只是它是为这个UIStoryBoard配置的而已。
我们一样在配置文件中写入需要对应的 " key "= "value"。
但是,这个key哪里来?这个可以是从 StoryBoard,选中目标控件,右边就可以获得控件的ID。如图
这个label的 ID 就是: 5TS-Zs-DwC
然后我们就可以在语言配置文件中写入
// 英文配置文件中这样写:
"5TS-Zs-DwC.text" = "Is a EnglishText";
// 中文配置文件中这样写:
"5TS-Zs-DwC.text" = "我是一个标签";
这样,根据标签的属性,就完成了 UIStoryBoard 的国际化。
五、新建的 UIStoryBoard 或者 xib 文件国际化
自己创建的UIStoryBoard 或者 xib 文件国际化其实同理,选中文件后,点击右边的第一个标签(show the file inspector)里面的 Localization 展开并选择需要支持的语言。然后刚才选中的文件就会自动配置好对应的本地化文件了。然后像上面一样写对应的配置内容。
六、国际化代码的四个宏
1、NSLocalizedString(key, comment)
NSLocalizedString其实是从mainBundle中默认读取了Localizable.string中的key所对应的value。comment参数则是对key的描述,有利于翻译人员理解这个key所适用的场景。
2、NSLocalizedStringFromTable(key, tbl, comment)
NSLocalizedStringFromTable则是从mainBundle中读取指定多语言文件中的key所对应的value。tbl参数就是用于指定多语言文件名的参数。
3、NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment)
NSLocalizedStringFromTableInBundle会读取指定Bundle中所指定的多语言文件中的key所对应的value。bundle参数就是用于传入所指定的Bundle。
4、NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment)
NSLocalizedStringWithDefaultValue则是从指定Bundle中读取指定多语言文件中的key所对应的value,如果取不到对应的value,允许指定一个默认的value。val参数就是用于传入默认的value值。
key: 获取value的key
tbl: 国际化配置文件的文件名
bundle: 国际化配置文件所在的bundle
comment: 对key的描述,翻遍翻译人员理解的描述
val: 如果找不到value的时候的默认值
七、已经创建好的项目,后期才做国际化怎么办
思路:
1、开启国际化支持
2、使用某种正则匹配代码文件,在需要字符串复制的地方,都加上国际化的宏。(或手动搞。。。这个正则没那么容易完全完美匹配)
3、使用Xcode自带了一个命令行工具genstrings。我们可以利用这个工具生成所需的多语言文件。
先打开终端,(安装了xcode工具行命令的情况下)切换到xcode的命令工具
sudo xcode-select -switch /Applications/Xcode.app/
到项目目录下创建两个文件夹
cd 工程目录
mkdir en.lproj
mkdir zh-Hans.lproj
在文件夹中用 genstrings 根据之前代码文件中已经批量添加的国际化代码的前提下,批量把 key = value 写到配置文件中。
注意:项目文件路径中不能包含中文,否则中文路径的识别不了。
find ./ -name \*.m -print0 | xargs -0 genstrings -o en.lproj
find ./ -name \*.m -print0 | xargs -0 genstrings -o zh-Hans.lproj
4、将生成的Localizable.strings文件拖入到项目,然后对立面的value进行翻译替换。
5、这样代码中有了国际化的宏,又有了对应的配置文件,就能实现国际化。
八、在应用内实现实时切换语言
1、首先需要上面几个步骤中的某些步骤先有了配置文件,这是首要条件。
2、我们查看国际化宏的定义本质:
#define NSLocalizedString(key, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
#define NSLocalizedStringFromTable(key, tbl, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
[bundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
[bundle localizedStringForKey:(key) value:(val) table:(tbl)]
其实就是用了 mainBundle 的 localizedStringForKey:的一些列方法而已,从指定bundle、配置文件、key、读取value,不成功就返回默认value。那么我们就可以自己写个宏,然后将文件参数,或者bundle参数动态修改。然后再将APP清除到根视图,重新加载。就能替换了。
// 宏的本质
NSBundle *mainBundle = [NSBundle mainBundle];
NSString *value = [mainBundle localizedStringForKey:@"key" value:@"defaultValue" table:@"somefile.strings"];
九、NSUserDefaults 存放着语言设置
应用启动时,首先会读取NSUserDefaults中的key为AppleLanguages对应的value,该value是一个String数组,也就是说,我们访问这个名为AppleLanguages的key可以返回一个string数组,该数组存储着APP支持的语言列表,数组的第一项为APP当前默认的语言。
十、xib 或者 UIStoryBoard 国际化时
先创建好视图全部设定好后再点击 右边的 Localizable,展开自动创建国际化文件,这样的话,会自动有一系列的控件ID键值对格式已经写好了。
网友评论