可用项目本文花费半天时间,如果喜欢请给个
背景
对很多开发者来说,国际市场是事后的想法,但由于App Store提供了无缝的全球分享模式,任何iOS开发者都可以通过一键点击把应用程序发布至超过150个国家的市场。亚洲和欧洲代表了潜在客户不断增长的市场,这两个市场中很多人都不是以英语为母语,但是为了让应用充分利用市场的潜力,你至少要把应用语言国际化。
注意:国际化另一个重要的方面是使用Auto Layout改变文本的大小。不过为了让本教程尽可能地简单,我们不会主要关注Auto Layout。对于Auto Layout这个话题,我们另有其他教程。
国际化和本地化
-
国际化是一项你和开发者通过利用系统提供的API来实现的活动,并在代码上做一些补充和修改,从而让应用的中文版、阿拉伯语版本和英文版一样好。简单说,国际化是一个应用程序国际兼容性设计的过程,比如:
- 以用户母语处理文本输入和输出;
- 处理不同的日期、时间以及数字格式;
- 利用适当的历法和时区处理数据;
本地化(相比之下)仅仅是把应用的用户界面和资源翻译成不同的语言,这是你可以也应该交给别人做的工作,除非你能精通app应该支持的每种语言。
我们开始本地化实施(xib)
-
添加项目语言支持
我这里选择了Spanish(es)
-
观察项目变化
观察发现本地化的核心文件是.string文件,现在我只是做了对xib文件的支持(接下来对sting文件内部进行分析,对于xib这里只研究Main.Storyboard)
-
在Main.Storyboard中拖入控件UIlabel,然后按照上面的步骤添加语言支持
韩语本地化sting文件
之前默认添加的英语string文件(和西班牙语一样内容为空)
-
更新Main.Storyboard中的english.string和spanish.string文件
这里的文件内容都变成了一样。
-
我们这里稍微修改一下MainStoryboard的string文件内容。
-
用模拟器运行程序
切换语言系统
本地化的字符串函数(代码)
使用Foundation框架本地化字符串函数宏获取制定区域的本地化字符串。
NSLocalizedString(<#key#>, <#comment#>)
NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>)
NSLocalizedStringFromTableInBundle(<#key#>, <#tbl#>, <#bundle#>, <#comment#>)
NSLocalizedStringWithDefaultValue(<#key#>, <#tbl#>, <#bundle#>, <#val#>, <#comment#>)
#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)]
关键方法还是如下
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName;
参数 | 描述 |
---|---|
key | The key for a string in the table identified by tableName. |
value | The value to return if key is nil or if a localized string for key can’t be found in the table. |
tableName | The receiver’s string table to search. If tableName is nil or is an empty string, the method attempts to use the table in Localizable.strings. |
- tableName 指的是.string文件
- 在这里我发现了Localizable.strings,它是所有没有制定table或者table不存在的默认table文件。
创建 Localizable.strings
一定要为文件命名为Localizable.strings(重要性已经说过),然后操作如下:
之后可以继续操作
语言和地区
在iOS中,数字格式化是基于地区/国家,而不是语言。
美国人的100万是“1,000,000″, 但在西班牙,100万写作“1.000.000″。我们通过General -> Lauguge&Region -> Region设置
-
在MainStoryboard添加Label控件
这个控件用于处理语言和数字的本地化
-
在Localizable.strings(Spanish)中添加
"Yesterday you sold %@ apps" = "Ayer le vendió %@ aplicaciones"; // 也可以加入其它键值 "You like?" = "~Es bueno?~";
-
在Localizable.strings(English)中添加
"Yesterday you sold %@ apps" = "Yesterday you sold %@ apps(English)";
"You like?" = "You like?(English)";
```
-
在ViewController的ViewDidLoad中正式用代码实现
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; NSString *numberString = [numberFormatter stringFromNumber:@(1000000)]; self.numberTextLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Yesterday you sold %@ apps", nil), numberString];
-
测试结果
修改模拟器设置后运行模拟器
本地化图片
思路是通过本地化图片名称,用代码加载不同的图片
本地化Info.plist文件
本地化相关文件,方法和Localizable.strings一样创建。
可以在里边用字符串覆盖其他语言,为给应用程序一个不同的语名字(例如西班牙)。
"CFBundleDisplayName" = "Me Gusta";