iOS语言国际化

958 阅读2分钟

一、语言设置方式

1.获取系统的语言自动切换显示的语言

2.手动设置语言,如app中设置中的设置语言

二、获取系统语言

在工程中,设置多语言操作如下:

1.配置项目语言设置

添加成功后,新建文件,在工程中新建Strings File文件,命名为Localizable,切记,如果想自动跟随系统的话,必须这个名字

选中新建的strings文件,点击右边栏的Localization选项

然后会弹出一个选择框

这里选择简体中文(需求所需要的语言),然后在下图选择你之前为工程设置的语言选项

如下图,我这里是勾选了Englist 和 Chinese,Simlified ,则有两个文件,一个简体中文一个英文

2.关键字的配置

如图,我设置的关键字,中文和英文

格式类似字典,等号之前是key,之后是value,记得用;结尾

这里使用中文为key,是因为平常以中文命名

3.权限声明的国际化

参照Localizable文件的建法,新建一个名为InfoPlist的strings文件,然后在不同语言版本的字符表中添加如下内容:

(权限白名单这些根据项目需要添加)

三.代码使用

1.对输入key封装

首先新建LanguageManager文件

.h文件

#import <Foundation/Foundation.h>
//定义宏,方便使用
#define langIter(str) [[LanguageManager shareManager] ym_languageInternation:str]
NS_ASSUME_NONNULL_BEGIN
@interface LanguageManager : NSObject
+ (instancetype)shareManager;
//当前语言id
- (NSString *)ym_currentLanguageId;
/**
 获取国际化文字
 @param string 对应的中文字符串
 @return 国际化字符串
 */
- (NSString *)ym_languageInternation:(NSString *)string;
/** 更换语言   */
- (void)ym_changeLanguage:(NSString *)languageId;
@end
NS_ASSUME_NONNULL_END

.m文件

#import "LanguageManager.h"

@interface LanguageManager ()

@property (nonatomic,strong) NSDictionary<NSString *,NSString *> *languageBundleMap;
@property (nonatomic,copy) NSString *preLanguageId;

@end

@implementation LanguageManager


#define     XYUserDefaults           [NSUserDefaults standardUserDefaults]
#define languageIdKey @"languageIdKey"

- (instancetype)init
{
    self = [super init];
    if (self) {
        [self initLanguageBundleMap];
        NSString *cacheId = [XYUserDefaults objectForKey:languageIdKey]; //这里是优先获取设置的语言,如果没有设置,则获取系统的语言
        if (cacheId) {
            self.preLanguageId = cacheId;
        } else {
            self.preLanguageId = [self getPreferredLanguage];
        }
    }
    return self;
}

//获取系统当前语言
- (NSString*)getPreferredLanguage {

    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];

    NSArray * allLanguages = [defaults objectForKey:@"AppleLanguages"];

    NSString * preferredLang = [allLanguages objectAtIndex:0];

    return preferredLang;
}

- (void)initLanguageBundleMap {
    _languageBundleMap = @{
                           @"zh-Hans-CN":@"zh-Hans", // 简体中文                           @"zh":@"zh-Hans", // 模拟器
                           @"en":@"en", // 英语
                           };
}

+ (instancetype)shareManager {
    static dispatch_once_t onceToken;
    static LanguageManager *instance = nil;
    dispatch_once(&onceToken, ^{
        instance = [[LanguageManager alloc] init];
    });
    return instance;
}

//当前语言id
- (NSString *)ym_currentLanguageId {
    return self.preLanguageId;
}

/**
 获取国际化文字

 @param string 对应的中文字符串
 @return 国际化字符串
 */
- (NSString *)ym_languageInternation:(NSString *)string {
    NSString *languagePath = [[NSBundle mainBundle] pathForResource:self.languageBundleMap[self.preLanguageId] ofType:@"lproj"];
    NSString *str = [[NSBundle bundleWithPath:languagePath] localizedStringForKey:string value:nil table:nil];
    return str;
}

/** 更换语言   */
- (void)ym_changeLanguage:(NSString *)languageId {

    if ([languageId isEqualToString:self.preLanguageId]) {
        return;
    }

    self.preLanguageId = languageId;

    //保存在本地id在本地
    [XYUserDefaults setObject:languageId forKey:languageIdKey];
    [XYUserDefaults synchronize];

    //改变语言之后,通知app
//    [[NSNotificationCenter defaultCenter] postNotificationName:languageIdKey object:nil];

}

@end

2.使用方式

随便创建两个button,让它们的title根据系统语言变化而变化

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.drawBoardBtn setTitle:langIter(@"画板") forState:UIControlStateNormal];
    [self.drawLineBtn setTitle:langIter(@"画线") forState:UIControlStateNormal];

}

展示效果如下:

但这里已经可以了,当然可以根据项目需求去封装label  button等控件