iOS项目中本地化处理一共4点:
1、APP名称
2、文字
3、图片
4、SB和XIB
1、APP名称
APP名称主要是跟随系统的语言来进行展示
![](https://img.haomeiwen.com/i10864359/4f8b68d6f0aa34cd.png)
创建 InfoPlist.strings (注:名称不能改变!!!!)
![](https://img.haomeiwen.com/i10864359/43395c4c8f20bb89.png)
![](https://img.haomeiwen.com/i10864359/d77e7f2973fb9ba6.png)
设置本地显示名称 指定CFBundleDisplayName的内容,语言跟随系统(CFBundleDisplayName不能改,没有@符号)
![](https://img.haomeiwen.com/i10864359/cdfce94f884dc538.png)
![](https://img.haomeiwen.com/i10864359/5bc419056332112a.png)
2.文字
文字的话,可以可以跟随系统,也可以设置多语言,不跟随系统(同一个APP内部进行语言切换)
跟随系统,多语言设置
跟随系统的文字本地化处理和App名称本地化过程一样,只是创建名称不同,必须创建名称是Localizable.strings
![](https://img.haomeiwen.com/i10864359/5c00765187ef7268.png)
![](https://img.haomeiwen.com/i10864359/606e3fe89fa76b88.png)
![](https://img.haomeiwen.com/i10864359/aa2aa6997d9b58ad.png)
使用的时候用 NSLocalizedString(@"setting", nil) 代替原来的@"setting";
![](https://img.haomeiwen.com/i10864359/1f8cf19b08c0bb83.png)
![](https://img.haomeiwen.com/i10864359/c56399008757d432.png)
多语言本地化,不跟随系统(APP内语言切换)
思路:创建配置文件,根据偏好设置,进行多语言切换
跟随系统的文字本地化处理和跟随系统,多语言设置本地化过程一样,只是创建名称可以随意取
使用的时候用 跟随系统,多语言设置本地化 NSLocalizedString(@"", nil) 是系统写好的;
多语言本地化,不跟随系统可以自己封装一个。
效果
![](https://img.haomeiwen.com/i10864359/58c249139679fd51.gif)
实现
![](https://img.haomeiwen.com/i10864359/ff4f329c91c84a33.png)
![](https://img.haomeiwen.com/i10864359/558bd50e4ba732a4.png)
![](https://img.haomeiwen.com/i10864359/150cab00d552ee2a.png)
本地化取值封装
#define LOCALIZATION(text) [[CJLocalizable shareLocalizable] localStringForKey:(text)]
typedef NS_ENUM(NSInteger,languageType) {
KChiese,
KJapanese
};
@interface CJLocalizable : NSObject
@property (nonatomic, assign) languageType nowCurrentLanguageType;
+(instancetype)shareLocalizable;
// 取值
-(NSString * )localStringForKey:(NSString *)key;
// 重置当前的语言
-(void)setNewLanguage:(languageType)languageType;
@end
#define LanguageDefaultKey @"LanguageDefaultKey"
@interface CJLocalizable ()
@property(nonatomic,copy)NSString * currentLanguage;//当前语言
@property(nonatomic,strong) NSDictionary * currentLanguageDict;//当前自定义语言的字典
@end
@implementation CJLocalizable
+ (instancetype)shareLocalizable{
static CJLocalizable * _localizable = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_localizable = [[CJLocalizable alloc]init];
});
return _localizable;
}
- (instancetype)init
{
self = [super init];
if (self) {
// 本地默认的现在使用的语言
NSArray * languageS = [NSLocale preferredLanguages];
NSString * currentLanguage = languageS.firstObject;
// 本地保存的现在使用的语言
NSString * localLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:LanguageDefaultKey];
if (localLanguage) {
if ([localLanguage isEqualToString: @"zh-Hans"]) {
self.nowCurrentLanguageType = KChiese;
}else if([localLanguage isEqualToString: @"ja"]){
self.nowCurrentLanguageType = KJapanese;
}
[self loadDictForNewLanguage:localLanguage];
}else{
[self loadDictForNewLanguage:currentLanguage];
}
}
return self;
}
-(void)loadDictForNewLanguage:(NSString *)newLanguage{
NSString * path = [[NSBundle mainBundle] pathForResource:@" mainLocailzable" ofType:@"strings" inDirectory:nil forLocalization:newLanguage];
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
self.currentLanguage = newLanguage;
self.currentLanguageDict = [NSDictionary dictionaryWithContentsOfFile:path];
}
}
// 取值
-(NSString *)localStringForKey:(NSString *)key
{
if (self.currentLanguageDict == nil) {
// 如果为空,使用默认
return NSLocalizedString(key, key);
}else{
NSString * localString = self.currentLanguageDict[key];
if (localString) {
return localString;
}else{
return key;
}
}
}
// 重置当前的语言
-(void)setNewLanguage:(languageType)languageType{
if (self.nowCurrentLanguageType == languageType) {
return;
}
if (languageType == KChiese) {
self.currentLanguage = @"zh-Hans";
}else if(languageType == KJapanese){
self.currentLanguage = @"ja";
}
self.nowCurrentLanguageType = languageType;
[self loadDictForNewLanguage:self.currentLanguage];
[[NSUserDefaults standardUserDefaults] setValue:self.currentLanguage forKey:LanguageDefaultKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
@end
3、图片
我把图片放在了Assets.xcassets中
![](https://img.haomeiwen.com/i10864359/6767de4b607d1e93.gif)
1.根据图片名称不同,在封装的类中封装一个方法
![](https://img.haomeiwen.com/i10864359/e9ff8744cd49feda.png)
#define LOCALIMAGE(imageName) [[CJLocalizable shareLocalizable] getImageNameWithString:(imageName)]
-(NSString *)getImageNameWithString:(NSString *)name{
if (self.nowCurrentLanguageType == KChiese) {
return [NSString stringWithFormat:@"%@_zh",name];
}else if(self.nowCurrentLanguageType == KJapanese){
return [NSString stringWithFormat:@"%@_ja",name];
}
return @"";
}
2.跟文字本地化处理一样,在相应的文件中,填上相应的名称就可以了。
如果是在本地文件Localizable.strings中添加名称, 使用的时候就是NSLocalizedString(@"", nil) 。
如果是在自定义的 mainLocailzable.strings中添加名称,使用的就是LOCALIZATION(@"icon")。
![](https://img.haomeiwen.com/i10864359/cf7006b3da647a72.png)
![](https://img.haomeiwen.com/i10864359/2a2ba10d13000efb.png)
4、SB和XIB
(跟随系统的语言进行展示,不跟随APP 内部选择的语言展示,如需要跟随APP内部选择语言展示,重新用LOCALIZATION()赋值)
创建XIB 然后本地化操作
![](https://img.haomeiwen.com/i10864359/b111973464863723.png)
![](https://img.haomeiwen.com/i10864359/d445e23b6bd9d719.png)
![](https://img.haomeiwen.com/i10864359/e29c46335e560e5c.png)
网友评论