一、语言设置方式
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等控件