iOS国际化
转载:1、点击打开链接
转载:2、点击打开链接包含了App程序的国际化化例如App名字的国际化 、应用内部内容的国际化
介绍的很详细,包括了图片,xib,storyboar的国际化,还分享了swift版的demo
iOS应用内切换国际化
/* Method for retrieving localized strings. */
- (NSString *)localizedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1);应用内部实现切换多语言关键是调用NSBundl的此方法
key代表在xx.strings文件中文本对应的关键字,value可以直接设为nil,tableName代表xx.strings文件的名字比如:
NSString *inviteMsg = [bundle localizedStringForKey:@"title" value:nil table:@"Localizable"];
就是从Lcalizable.strings中读取key为title的文本,bundel代表Localizable.strings文件的路径1是项目中的国际化文件,2是在资源文件中的文件位置,每一个Localizable.strings不同语言的文件会放在各自对应语言的文件夹中
Localizable.strings(chinese(Simplifief)) 简体中文 就放在 zh-Hans.lproj文件中,
//获取系统当前语言版本(中文zh-Hans,英文en)
NSArray* languages = [def objectForKey:@"AppleLanguages"];
NSString *current = [languages objectAtIndex:0];
可以根据上面的代码获取系通同语言;中文简体的话 current = @"zh-Hans";//获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:current ofType:@"lproj"];
bundle = [NSBundle bundleWithPath:path];//生成bundle
在通过上面红色字体的NSBundel的方法获取key对应的文本,返回的是current语言对应的文本
current = @"zh-Hans" 返回的就是中文
所以可以收到设置curren,文本的国际化后的文本,再去显示。就可以做到应用内部切换国际化了例如
NSString *path = [[NSBundle mainBundle] pathForResource:@"zh-Hans" ofType:@"lproj"];
bundle = [NSBundle bundleWithPath:path];//生成bundleNSString *inviteMsg = [bundle localizedStringForKey:@"title" value:nil table:@"Localizable"];
inviteMsg 在任何系统的语言下,都会返回中文
需要注意的是ios系统不同版本current会有所不同
iOS7之前是
zh-Hans: 简体
zh-Hant: 繁体
iOS8之前是
zh-Hans: 简体
zh-Hant: 繁体
zh-HK: 香港繁体(增加)
iOS9是
zh-Hans-CN: 简体(改变)
zh-Hant-CN: 繁体(改变)
zh-HK: 香港繁体
zh-TW: 台湾繁体(增加)
如果考虑系统的语言设置,读取current时,不能直接去获取bundle,否则zaiios9的情况下,简体中文时current返回是zh-Hans-CN,生产bundel时会找不到文件
因为本地的文件夹名字还是zh-Hans,所以可以通过判断current的前缀,再去读取bundel。
可以通过NSString的hasPrefix:方法判断current前缀是否包含zh-Hans;