赞
踩
iOS中,国际化适配,大概有下面几种情况需要适配。
1,App名称/图标本地化
2,启动页本地化
3,代码中字符串本地化
4,xib/storyboard本地化
5,图片的本地化
这些都比较简单,网上搜一下,有很多可以参考的好文章。接下来,分享一下,在项目中遇到的一些问题。
一,启动页的本地化,
关于启动页的本地化,网上也有很多说法,作者在项目中用的是多storyboard,如图。
在设置中切换系统语言,启动页并不会跟随切换。这是符合Apple人机界面交互准则的。
如果遇到launchStreen.storyboard上,图片不显示的问题,参考一下两种解决办法:
1,把图片放在工程目录下,不要放到Asset里面。
2,改一下图片名字,或者清空Xcode的缓存derivedData数据。
二, 关于一些第三方库的多语言适配
由于一些第三方库没有多语言,所以我们有时候项目中总是用到了这些库,我们需要去调整这些库。
比如app中配置了切换语言的入口,有些第三方库比如MJRefresh的多语言是根据系统语言适配的,当我们app内切换语言的时候,这些库并不会切换语言,所以我们需要做一些处理。
处理这些的大概方法是,重写这些库语言处理的函数,调整为符合我们使用的要求。或者我们可以直接修改这些库的源码。
三,本地化字符串参数顺序的问题
1,单个参数
2,多个参数
为了使多语言中语法通顺,必须要更改占位符对应的参数顺序,请看下面的例子。句子按照中文语法组织,注意en.lproj中的tip_2字段。
我们可以在%和@之间,加上1$,2$来指定参数的顺序。顺序是从1开始的。
中文环境打印
英文环境打印
https://help.apple.com/app-store-connect/?lang=zh-cn#/deve6f78a8e2
仅当app处于可编辑状态时,才可以管理语言!
仅当app处于可编辑状态时,才可以管理语言!
仅当app处于可编辑状态时,才可以管理语言!
这些本地化的信息都会在App Store中表现出来。
五,InfoPlist的本地化
权限提示的本地化是系统根据系统语言设置的,不会随着我们app内部切换语言切换。
一是我们上面所说的App名称和隐私权限描述,都是由系统读取的,系统会根据当前用户的系统语言来进行读取显示,跟系统语言
相关。有些App里面有做切换语言功能,需要注意App内切换语言的功能无法应用到我们今天说的App名称和隐私权限描述的多语言显示,因为这个是系统自己读取的,我们无法指定。
注意,层级要正确,如果在Info.plist里面是在最外边可以这么写,但是如果是在一个字典中,那么也需要把字典加进去,保持层级不变,不能只写想修改的那个key值。比如快捷菜单的层级在Info.plist里面是这样,如果想修改「查看密码」这个文字
- <key>UIApplicationShortcutItems</key>
- <array>
- <dict>
- <key>UIApplicationShortcutItemIconType</key>
- <string>UIApplicationShortcutIconTypeLove</string>
- <key>UIApplicationShortcutItemTitle</key>
- <string>查看密码</string>
- <key>UIApplicationShortcutItemType</key>
- <string>all</string>
- </dict>
- </array>
那么你在多语言里面就要这么写
- "UIApplicationShortcutItems" = (
- {
- "UIApplicationShortcutItemType" = all;
- "UIApplicationShortcutItemTitle" = "View Password";
- "UIApplicationShortcutItemIconType" = "UIApplicationShortcutIconTypeLove";
- },
- );
六,本地字符串的规范问题。
有些第三方SDK,参考阿里音视频裁剪模块。用中文作为key,这不是一个很好的习惯。
当用中文作为key,在中文环境下 NSLocalizedString去寻找value的时候,如果找不到,会返回自身。虽然这样省去了中文的配置,但不是一个很好的习惯。
我们应该这样写:以 组件_控件_功能 的样式组织key。
1,获取系统语言
- NSArray *languages = [NSLocale preferredLanguages];
- NSString *systemlanguage = [languages objectAtIndex:0];
如果系统语言设置为一下几种情况,systemlanguage的对应值
中文简体 zh-Hans-CN
繁体中文 zh-Hant-CN
English(US) en-US
English(UK) en-GB
2,设置代码中字符串
- #define kLocalizationString(key) getLocalizationString(key)
-
- UIKIT_STATIC_INLINE NSString *getLocalizationString(NSString *key) {
- NSString *appLanguage = @"en";
- NSInteger language = [[kUserDefault objectForKey:kLanguageKey] intValue];
- if (Language_en == language) {
- appLanguage = @"en";
- } else if (Language_zhHans == language) {
- appLanguage = @"zh-Hans";
- } else {
- //获取系统语言
- NSArray *languages = [NSLocale preferredLanguages];
- NSString *systemlanguage = [languages objectAtIndex:0];
- if ([systemlanguage containsString:@"en"]) {
- appLanguage = @"en";
- } else if ([systemlanguage containsString:@"zh-Hans"]) {
- appLanguage = @"zh-Hans";
- } else {
- appLanguage = @"en";
- }
- }
- NSString *path = [[NSBundle mainBundle] pathForResource:appLanguage ofType:@"lproj"];
- NSString *realString = [[NSBundle bundleWithPath:path] localizedStringForKey:key value:nil table:@"MainPartLocalize"];
-
- return realString;
- }
以上是常规的做法,现在提供一种本地字符串半自动化的方案。
一,批量替换字符串
搜索条件里输入 (@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?")
替换内容里输入
NSLocalizedString($0, nil)
点击点击Replace All
,即可完成替换。
替换后的截图
二,生成多语言文件
首先,我们需要先新建所需语言的文件夹。
- cd 工程目录
- mkdir en.lproj
- mkdir zh-Hans.lproj
然后,遍历所有.m
文件,根据每个文件内的需要国际化的字符串生成key和value。
- find . -name "*.m" | xargs genstrings -o en.lproj
- find . -name "*.m" | xargs genstrings -o zh-Hans.lproj
此时,en.lproj
和zh-Hans.lproj
文件夹中就应该有了相应的Localizable.string文件了。
我们把这两个文件夹拖到工程里,然后在相应的Localizable.strings文件中,修改每个key所对应的value值就行了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。