美文网首页
iOS-配置App多语言支持(应用程序内部国际化,不跟随系统语言

iOS-配置App多语言支持(应用程序内部国际化,不跟随系统语言

作者: 90de46ea2b08 | 来源:发表于2017-06-01 11:18 被阅读81次

上篇文章介绍了配置App多语言支持(跟随设备的系统语言变化),本篇文章则继续介绍配置App多语言支持(应用程序内部国际化,不跟随系统语言)

1.创建生成并配置多语言文件

参考上一篇文章 iOS-配置App多语言支持(跟随设备的系统语言变化)中步骤1~5。

2.流程+实现思路

  • 流程图:
app内自由切换语言流程.png
  • 思路:

在初始化首个Controller的时候,进行应用语言的加载。首次加载因为userLanguage(应用内语言)不存在,则使用系统当前的语言,保存到userlanguage,下次直接读。读出来之后,获取到对应文件路径,得到文件的索引,储存到工具类InternationalControl的静态变量bundle中。
其他地方需要用字符串时,用工具类获得bundle即可读取相应文件中的字符串。切换语言后本文暂且用通知的方式进行传递。

3.用到的工具类InternationalControl,方法介绍都有注释

InternationalControl.h

//
//  InternationalControl.h
//  MultiLanguage
//
//  Created by chenqianfeng on 16/4/19.
//  Copyright © 2016年 chenqianfeng. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface InternationalControl : NSObject
+(NSBundle *)bundle;//获取当前资源文件
+(void)initUserLanguage;//初始化语言文件
+(NSString *)userLanguage;//获取应用当前语言
+(void)setUserlanguage:(NSString *)language;//设置当前语言
@end

InternationalControl.m

//
//  InternationalControl.m
//  MultiLanguage
//
//  Created by chenqianfeng on 16/4/19.
//  Copyright © 2016年 chenqianfeng. All rights reserved.
//

#import "InternationalControl.h"

@implementation InternationalControl
//1)创建静态变量bundle,以及获取方法bundle(注:此处不要使用getBundle)。

static NSBundle *bundle = nil;

+ ( NSBundle * )bundle{
    return bundle;
}
//2)初始化方法: userLanguage储存在NSUserDefaults中,首次加载时要检测是否存在,如果不存在的话读AppleLanguages,并赋值给userLanguage。

+(void)initUserLanguage{
    
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    NSString *string = [def valueForKey:@"userLanguage"];
    if(string == nil){
        //获取系统当前语言版本(中文zh-Hans,英文en)
        NSArray* languages = [def objectForKey:@"AppleLanguages"];
        NSString *current = [languages objectAtIndex:0];
        if ([current isEqualToString:@"zh-Hans"]) {
            //部分手机中文环境为zh-Hans,此时不需要截取
            string = current;
        }else{
            //部分手机中文环境为zh-Hans-US或者zh-Hans-CN,此时需要截取到zh-Hans
            NSArray *arr = [current componentsSeparatedByString:@"-"];
            //拿到[arr lastObject]操作系统语言的手机版本后缀,然后把其截去
            NSArray *stringArr = [current componentsSeparatedByString:[NSString stringWithFormat:@"-%@",[arr lastObject]]];
            string = stringArr[0];
        }
        [def setValue:string forKey:@"userLanguage"];
        [def synchronize];//持久化,不加的话不会保存
    }
    //获取文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];
    bundle = [NSBundle bundleWithPath:path];//生成bundle
}
//3)获得当前语言方法
+(NSString *)userLanguage{
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    NSString *language = [def valueForKey:@"userLanguage"];
    return language;
}
//4)设置语言方法
+(void)setUserlanguage:(NSString *)language{
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    //1.第一步改变bundle的值
    NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];
    bundle = [NSBundle bundleWithPath:path];
    //2.持久化
    [def setValue:language forKey:@"userLanguage"];
    [def synchronize];
}
@end

4.工具类的使用

//初始化应用语言,首次存入系统语言
   [InternationalControl initUserLanguage];
//set language
   [InternationalControl setUserlanguage:@"zh-Hans"];//简体中文
   [InternationalControl setUserlanguage:@"en"];//英文

/**
    取值
    hello.strings       多语言文件名
    paly                     多语言文件中的一个key
    注释:如果多语言文件名用的是系统默认名称Localizable.strings,也可以用NSLocalizedString(@"play", @"title")来进行取值
*/
   NSString *rightItemTitle = [[InternationalControl bundle] localizedStringForKey:@"play" value:nil table:@"hello"];

相关文章

网友评论

      本文标题:iOS-配置App多语言支持(应用程序内部国际化,不跟随系统语言

      本文链接:https://www.haomeiwen.com/subject/tjvsfxtx.html