iOS项目中本地化处理一共4点:
1、APP名称
2、文字
3、图片
4、SB和XIB
1、APP名称
APP名称主要是跟随系统的语言来进行展示

创建 InfoPlist.strings (注:名称不能改变!!!!)


设置本地显示名称 指定CFBundleDisplayName的内容,语言跟随系统(CFBundleDisplayName不能改,没有@符号)


2.文字
文字的话,可以可以跟随系统,也可以设置多语言,不跟随系统(同一个APP内部进行语言切换)
跟随系统,多语言设置
跟随系统的文字本地化处理和App名称本地化过程一样,只是创建名称不同,必须创建名称是Localizable.strings



使用的时候用 NSLocalizedString(@"setting", nil) 代替原来的@"setting";


多语言本地化,不跟随系统(APP内语言切换)
思路:创建配置文件,根据偏好设置,进行多语言切换
跟随系统的文字本地化处理和跟随系统,多语言设置本地化过程一样,只是创建名称可以随意取
使用的时候用 跟随系统,多语言设置本地化 NSLocalizedString(@"", nil) 是系统写好的;
多语言本地化,不跟随系统可以自己封装一个。
效果

实现



本地化取值封装
#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中

1.根据图片名称不同,在封装的类中封装一个方法

#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")。


4、SB和XIB
(跟随系统的语言进行展示,不跟随APP 内部选择的语言展示,如需要跟随APP内部选择语言展示,重新用LOCALIZATION()赋值)
创建XIB 然后本地化操作



网友评论