IOS Json文件 做本地国际化
说在前面:项目已经提交快一周啦 还没审核通过,有点小失落!!!!
说正题:
介绍:目前项目为保证Windows 、MAC 、 IOS 、Android各个平台界面一致,便于维护。软件的UI界面统一使用HTML,HTML页面做好各个平台,各中尺寸的适配。然后用WebView装载这个Html这样APP的UI界面就有Html呈现。然后,定好与后端通信的协议,就可以实现UI HTML与后端各个平台的通信了。
重点,,重点、、、、、
然而,就IOS端APP来说,UI HTML 页面需要做国际化,而后段(Object-C)创建的一些提示性或者Buttom也要做国际化。那么,问题就来,前端要做一套,后段也要做一套,不便于维护,有没有简单一点的方法,做一套实现呢?答案是肯定的。
就HTML而言,本地做好对应国际化的Json文件,然后根据语言来实现加载本地对应的国际化语言Json文件应该不是问题。
那么,Object-C端呢?出了创建Localizable.strings来实现国际化,能不能加载Json文件来实现呢?怎么实现呢?
思路:在APP 一开始运行的时候都去系统语言,加载对应语言的JSon文件,然后将JSon载入内存,在需要的地方直接调用内存中JSon对应的键值即可实现国际化。
具体实现:
step1:创建单利类,在初始化中读取系统语言,根据系统语言读取对应的Json文件,代码如下:
#import <Foundation/Foundation.h>
@interface TRLocalTranslation : NSObject
+(TRLocalTranslation *)sharedManager;
-(NSString *)ttObjectForKey:(NSString *)string;
@end
~~~~~~~~~~~~~~~~~~~~~~~~
#import "TRLocalTranslation.h"
@implementation TRLocalTranslation
{
NSDictionary *tempLan;
}
static TRLocalTranslation *_instance = nil;
+(TRLocalTranslation *)sharedManager
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc]init];
});
return _instance;
}
-(NSString *)ttObjectForKey:(NSString *)string
{
NSString *str = (NSString *)[tempLan objectForKey:string];
return str;
}
-(instancetype)init
{
self =[super init];
if (self) {
NSArray *languageArray = [NSLocale preferredLanguages];
NSString *language = [languageArray firstObject];
if ([language hasPrefix:@"zh"])
{
language = @"local_zh.json";
}else if ([language hasPrefix:@"en"])
{
language = @"local_en.json";
}
else
{
language = @"local_en.json";
}
//==Json文件路径
NSString *path=[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"translation"];
NSString *Json_path=[path stringByAppendingPathComponent:language];
//==Json数据
NSData *data=[NSData dataWithContentsOfFile:Json_path];
//==JsonObject
NSError *error;
id JsonObject=[NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingAllowFragments
error:&error];
NSLog(@"%@",JsonObject);
if ([JsonObject isKindOfClass:[NSDictionary class]])
{
tempLan = [(NSDictionary *)JsonObject copy];
}else {
NSAssert(0, @"language Json Error!");
}
}
return self;
}
@end
step2:在需要做国际化的地方直接调用[[TRLocalTranslation sharedManager] ttObjectForKey:@“XXXXX”]
, 但是,这样写起来也比较臃肿,可以定义一个宏来简化代码,仿照系统的实现,仿写宏#define TTLocalozedString(x) [[TRLocalTranslation sharedManager] ttObjectForKey:x]
。然后在需要做国际化的地方直接像系统一样调用TTLocalozedString(@"XXX”)
即可。
到此结束,有好的方法希望大家分享。