iOS app 国际化

1. 创建一个新应用

在Xcode的Single Application View模版中,Xcode对English做了本地化。

国际化了两个文件:Main.storyboard和LaunchScreen.storyboard

 

2. 开始国际化

选中project,在上图的Localizations选项下,添加简体中文;Xcode会询问你是否国际化以下文件,这个地方并不重要,因为项目中所有的资源文件都可以很方便的国际化和去国际化。

观察一下有哪些文件是可以国际化的:

  • xib和storyboard资源文件;
  • info.plist文件
  • strings文件等等

简而言之,除了代码文件和xcassets,都可以国际化。

 

3. 国际化代码中的文本

国际化是基于.strings文件的,该文件的内容只是简单的key value对,如下:

"KEY1" = "CONTENT1"; "KEY2" = "CONTENT2"

其中Localizable和InfoPlist两个strings文件尤为重要,前者在这一小节介绍,后者在`国际化info.plist`中介绍。

如果你在.m文件中,使用代码的方式设置按钮的title,可以使用NSLocalizedString宏定义

#define NSLocalizedString(key, comment) 
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil] 

该方法会在Localizable.strings中查找key对应的value。

完整处理过程:

  1. 新建Localizable.strings文件;
  2. 打开右侧file inspector,打开Localization选项,选中Base和中文简体;
  3. 如下,Localizable.strings文件就会从一个文件变成两个文件,编译各种语言对应的文件即可;
  4. 在代码中使用NSLocalizedString(key, nil),key为Localizable.strings中的key。

注释:NSLocalizedString宏定义中的comment参数并没有实际意义。

 

4. 国际化storyboard和xib文件

国际化storyboard和xib文件国际化也是在file inspector的Localization中。

国际化的结果就是在Xcode中可以看到一个文件变成了对应的两个文件。

再观察一下目录结构:

Base.lproj:

en.lproj:

这类资源文件,Xcode的处理方式是,原文件放在Base中,在其它语言版本中只有一个对应文件名的strings文件,再看一下LaunchScreen,strings的部分内容:

/* Class = "UILabel"; text = "Detail view content goes here"; ObjectID = "0XM-y9-sOw"; */
"0XM-y9-sOw.text" = "Detail view content goes here";

/* Class = "UITableViewController"; title = "Master"; ObjectID = "7bK-jq-Zjz"; */
"7bK-jq-Zjz.title" = "Master";

其中的ObjectID是什么?

用source code的方式,打开LaunchScreen.storyboard,全局搜索一下 0XM-y9-sOw,结果如下:

<label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="0XM-y9-sOw">

ObjectID是原文件中对应的对象。

5. 国际化info.plist

按照上面的思路,国际化一下info.plist,然后编译,碰到了什么问题?

Xcode找不到info.plist。

因为通过file inspector的Localization,Xcode会创建两个info.plist分别放在Base.lproj和zh-Hans.lproj文件夹下。

还记得上面没讲的 InfoPlist.strings 吗? 

处理过程:

1. 新建一个 InfoPlist.strings 文件;
2. Localization该文件;
3. 编辑对应语言的InfoPlist.strings文件即可。比如,英文版本应用名叫English,中文版本叫中文,如下:

"CFBundleDisplayName" = "English";

和

"CFBundleDisplayName" = "中文";

6. 练习:国际化音频文件


以下是必要步骤的简单描述:

1. 把音频文件A拷贝到项目中。
2. 打开音频文件inspector,选择本地化按钮,选择了Base和简体中文作为支持语言。
3. 重命名第二个音频文件B,和第一个名字A一样,然后将其拷贝到es.lproj文件夹。
4. 确保你在Finder提示中选择了“Replace File”。

7. 国际化与多target问题

问题描述:
我们应用有4个分身(4个相似的app),同时还做了国际化,此时我就迷茫了!四个应用有a,b,c,d四个info.plist文件名,但是国际化info.plist的文件名都是InfoPlist.strings。。。

解决办法:

  1. 创建四个文件夹;
  2. 在四个文件夹中分别创建一个InfoPlist.strings;
  3. 4个InfoPlist.strings关联到不同target。OK啦~

原文地址:https://www.cnblogs.com/tangjuanj/p/6015619.html