iOS的多语言本地化适配
1. 获取跟随系统的语言类型
NSArray *languages = [NSLocale preferredLanguages];
NSString *language = [languages objectAtIndex:0]; //系统默认语言
2. App内部语言设置
规则:
- 未设置语言,则跟随系统默认语言
- 设置某一种语言存语言配置类型
NSUserDefaults
,打开App
时从NSUserDefaults
读取对应语言配置类型
//设定一个 kLanguageKey 用于记录语言类型
static NSString *kLanguageKey = @"kLanguageKey";
//应用启动后,判断是否被设置,未设置则跟随系统
///默认语言设置
- (void)readLanguageConfig{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSArray *languages = [NSLocale preferredLanguages];
NSString *language = [languages objectAtIndex:0];
//未设置则跟随系统
if (![def objectForKey:kLanguageKey]) {
[def setObject:language forKey:kLanguageKey];
[def synchronize];
}
}
3. 多语言的使用和创建
-
创建如图
.strings
后缀的文件 -
先选中
.strings
文件,然后再最右边侧边栏点击Localization
选择一种默认语言一般为English
,再然后在项目的Project > info
里设置Localizations
添加语种,然后StoryBoard或者.strings文件下会生成对应语言的文件,对应文件填写对应的下标语言即可(目前XIB还不支持类似StoryBoard这种自动生成多语言的文件配置,适配估计得拉线出来改~略坑) -
各个文件的内容填写示例如下:
//格式如下: "文本的key" = "对应语言的文本内容" "key" = "value" //中文 "testText" = "这是一个测试" //中文 繁体字(香港或者台湾) "testText" = "這是壹個測試" //英文 "testText" = "This is a test" //韩文 "testText" = "이것은 테스트입니다" //日文 "testText" = "これはテストです" // 俄语 "testText" = "Это тест"
-
如何调用使用:
//为了避免繁琐 定义一个宏定义或者封装一个方法去读取 #define kLocalizationString(key) getLocalizationString(key) NSString* getLocalizationString(NSString *key){ //文件名 = 语言代码 + .lproj NSString *appLanguage = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"kLanguageKey"]]; NSString *path = [[NSBundle mainBundle] pathForResource:appLanguage ofType:@"lproj"]; //获取对应语言的字符串 // testText 文本的key // localizedStrings 是.strings文件的文件名 NSString *realString = [[NSBundle bundleWithPath:path] localizedStringForKey:key value:nil table:@"localizedStrings"]; return realString; }
4. 多语言之间的切换
使用已经介绍差不多了,还有就是切换了,不清楚语言代码的话可以打印或者新建对应的语言去根目录查看.lproj
对应的文件名即是苹果配置对应的语言代码,如图:
所以知道语言代码之后就简单很多,无非就是把对应的语言代码存到NSUserDefaults
,其次再刷新UI显示即可
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:kLanguageKey];
[[NSUserDefaults standardUserDefaults] synchronize];
//刷新UI展示方案,目前能想到的有以下这两种:
1. 全局刷新的话一般采用重新设置根窗口或者根控制器即重新从入口进来一遍的意思(简单直接)
2. 采用通知更新那些已经存在内存里的页面,未创建的页面自然从配置读取去设置(用到多语言的地方需要订阅通知)
未经作者授权,禁止转载
本文来自博客园,作者:CoderWGB,转载请注明原文链接:https://www.cnblogs.com/wgb1234/p/12902455.html
THE END