美文网首页iOS 道路之行
ios设置app内部语言国际化

ios设置app内部语言国际化

作者: 笨猫25 | 来源:发表于2018-04-19 12:09 被阅读0次

前言:最近遇到一个客户需求,修改app内语言,除中文外都为英文,搜了很多资料,最终完成。


第一步:我们都知道首先需要获取系统语言

NSArray *languages = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];     NSString *currentLanguage = languages.firstObject;

第二步:我们要判断当前是中文还是非中文

 if([currentLanguage isEqualToString:@"zh-Hans-CN"]){//简体中文处理

        }else{//非中文处理        }

如果 [[NSUserDefaults standardUserDefaults] setObject:@"语言" forKey:@"AppleLanguages"];来处理

那么,会导致每次进入app时,都会读取AppleLanguages的首个元素,最后只会读取本地的语言,不会读取系统语言。

因此我们要想办法避开AppleLanguages。

使用另外一个key替代原来的AppleLanguages,这里我用的myLanguage,保存我们需要保存的语言

- (void)changeLanguageTo:(NSString *)language {      // 设置好的语言存储好,下次进来直接加载     [[NSUserDefaults standardUserDefaults] setObject:language forKey:@"myLanguage"];     [[NSUserDefaults standardUserDefaults] synchronize]; }

首次进入需要读取本地存储的语言

 if ([[NSUserDefaults standardUserDefaults] objectForKey:@"myLanguage"] && ![[[NSUserDefaults standardUserDefaults] objectForKey:@"myLanguage"] isEqualToString:@""]) {

//非首次同样判断当前系统语言,然后我们需要做的就是修改语言

        }else{ //首次没有本地存储时读取系统语言并存储

if([currentLanguage isEqualToString:@"zh-Hans-CN"]){  

          [self changeLanguageTo:@"zh-Hans-CN"];      

  }else{           

  [self changeLanguageTo:@"en"];      

  }}

第三步:修改系统语言

在App启动后会生成了一个Bundle,里面识别好了对应着AppleLanguages的国际化文件,在app运行期间,我们只需要去修改bundle,这里我们写一个bundle的扩展

#import<Foundation/Foundation.h>

@interfaceNSBundle(Language)

+ (void)setLanguage:(NSString *)language;

@end

.m实现代码:

#import "NSBundle+Language.h"

#import<objc/runtime.h>

static const char _bundle = 0;

@interface BundleZd : NSBundle

@end

@implementation BundleZd

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {    

NSBundle *bundle = objc_getAssociatedObject(self, &_bundle);    

return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName]; }

@end

@implementationNSBundle (Language)

//此处单例

+ (void)setLanguage:(NSString*)language {

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        object_setClass([NSBundle mainBundle], [BundleEx class]);

    });

    objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

@end


在appdelegate中使用[NSBundle setLanguage:@"语言"]来设置具体语言

 if([currentLanguage isEqualToString:@"zh-Hans-CN"]){

             [NSBundle setLanguage:@"zh-Hans-CN"];

        }else{

             [NSBundle setLanguage:@"en"];

        }

changeLanguageTo方法中也需要加入 [NSBundle setLanguage:@"当前的语言"];//即首次进入也需要设置


相关文章

  • iOS开发之APP内部切换语言

    前言 iOS开发中,随着APP越来越完善,很多APP都做了国际化,也实现了APP内部切换语言。 原理 国际化都会走...

  • ios设置app内部语言国际化

    前言:最近遇到一个客户需求,修改app内语言,除中文外都为英文,搜了很多资料,最终完成。 第一步:我们都知道首先需...

  • iOS多语言配置

    iOS 多语言配置(国际化) iOS app包显示名称可以国际化,具体方法如下: 基础设置 在info.plist...

  • iOS国际化(本地化)

    iOS App国际化(本地化)分为App内部语言更换和App跟随手机语言变化,本文所记录的是跟随手机语言变化 在X...

  • iOS开发之APP内部切换语言

    iOS开发之APP内部切换语言 iOS开发之APP内部切换语言

  • iOS-图文讲解语言国际化

    前言:iOS的语言国际化是指根据用户手机系统的语言设置,自动将APP的语言设置为和用户手机系统语言一致的语言。通常...

  • iOS如何使用bundle做App国际化(App内多语言切换)

    做App国际化有两种方式,其一是跟随系统的语言设置,其二是在App内部设置语言切换。如微信: 为什么要退出到个人中...

  • iOS10 权限设置国际化语言

    最近有人问我:“iOS中权限设置怎么做到国际化语言”。其实很简单,实现的方法跟App名称的国际化大同小异。下面就来...

  • 语言国际化设置

    App内的国际化设置1.添加语言 1.1选择语言 2.创建语言文件 2.1设置语言文件,选择需要国际化的 3.写入...

  • 2019-02-14

    iOS开发之APP内部切换语言 - 简书

网友评论

    本文标题:ios设置app内部语言国际化

    本文链接:https://www.haomeiwen.com/subject/xltwkftx.html