IOS Json文件 做本地国际化

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”)即可。
到此结束,有好的方法希望大家分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值