iOS开发笔记 -- 多国语言适配

一、前言

项目要求:多国语言适配。
正确姿势有两种:1、根据系统的语言设置软件对应的语言。2、应用内切换语言。
意外:客户要求 能够灵活的设置语言,不用重新上架,就能够读取对应的语言。上帝发话 就只能做第三种方案:根据接口来读取翻译好的字符,然后赋值。所以就做了一个接口,传语种id,返回 一个界面 对应的一组字段,后台做翻译列表,据说上帝很满意,介于界面不是很多,就不吐槽他了(注:这种方式虽然比较灵活,但是请慎用)。


NOW,开始记录前两种方式,demo在此

二、根据系统语言适配


1、应用名称适配

(1)、新建一个项目,选中该项目 点击 + 号,添加自己所需要的语言
这里写图片描述

(2)、新建一个 配置文件 string file,命名 InfoPlist
这里写图片描述

(3)、选中该文件 ,点击Localize 将设置的语言 添加进去
这里写图片描述

(4)、在生成的文件里 写入关键字 CFBundleDisplayName 设置不同语言对应的APP名称

这里写图片描述

(5)、切换系统语言 查看APP的名字 是否对应改变。

2、代码适配

(1)、新建一个 string file 文件,命名 Localizable,重述以上步骤。
(2)、在生成的文件里添加 对应的 key = value,例如
这里写图片描述
(3)、使用方式,NSLocalizedString 这个宏其实就是在当前bundle中查找资源文件名Localizable.strings中键值key所指向的字符串

self.title = NSLocalizedString(@"首页标题", nil);

(4)、显示效果图:
这里写图片描述

3、xib/storyboard 适配

xib/storyboard 的适配 用到了脚本、自动生成 key = value,快捷而又简单。

(1)、选中项目、Build Phases 点击 + 号,选中 New Run Script Phase 添加脚本

这里写图片描述

${SRCROOT}/${TARGET_NAME}/RunScript/AutoGenStrings.py ${SRCROOT}/${TARGET_NAME}

这里写图片描述

(2)、新建一个UITableViewCell的xib文件,添加一个标题
这里写图片描述

(3)、选中该文件 添加语言
这里写图片描述

(4)、command + B 编译一下 就会生成 对应的 值,例如

这里写图片描述

三、应用内切换语言


 应用内切换语言是APP最常用的一种,例如微信、支付宝等都使用这种方式。

1、按照上述所示方式,建立 string file 文件,命名可以根据模块来区分。

2、创建一个单例,用于切换语言,单例中主要有三个方法,可以 看 demo

initLanguage方法,程序初始化时,读取设置的语言,默认为中文。
- (void)initLanguage {
    NSString *language = [[NSUserDefaults standardUserDefaults]objectForKey:LANGUAGE_KEY];
    if (language) {
        self.language = language;
    }else {
        self.language = ZH; //默认 中文
    }
    self.bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:self.language ofType:@"lproj"]];
}
changeLanguage方法,切换语言,读取对应资源,并将该语言的值存储到本地。
- (void)changeLanguage:(NSString *)language {
    if ([language isEqualToString:self.language]) {
        return;
    }else {
        self.language = language;
    }
    self.bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:self.language ofType:@"lproj"]];
    [[NSUserDefaults standardUserDefaults]setObject:self.language forKey:LANGUAGE_KEY];
}
getStringForKey方法, 读取资源文件 对应的key值,name:创建的string file 的文件名。
- (NSString *)getStringForKey:(NSString *)key name:(NSString *)name {
    if (self.bundle) {
        return NSLocalizedStringFromTableInBundle(key, name, self.bundle, nil);
    }else {
        return NSLocalizedStringFromTable(key, name, @"");
    }
}

3、使用方式,详情见 demo,切换语言后 重新加载资源文件,即可实现 所见即所得。

self.title = [[LanguageManage share] getStringForKey:@"首页标题" name:@"HomeString"];

有不完善的地方,后续会继续补充。

猜你喜欢

转载自blog.csdn.net/qq_31748121/article/details/80590722