美文网首页
应用内切换语言

应用内切换语言

作者: lyuxxx | 来源:发表于2017-03-21 16:05 被阅读72次

思路

主要就是利用runtime hook系统的方法,宏定义为NSLocalizedString(key, comment),方法为[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil],设置语言的时候传入正确的语言代码并找到相应的bundle,进而得到想要的字符串。当然已经显示的页面还要自己处理页面的刷新,比如更新rootViewController。

#import <Foundation/Foundation.h>

@interface NSBundle (Language)

+ (void)setLangage:(NSString *)language;//zh-Hans,en,zh-Hant...

@end
#import "NSBundle+Language.h"
#import <objc/runtime.h>

static NSString *languageKey = @"chosenLanguage";

@implementation NSBundle (Language)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];
        SEL originalSelector = @selector(localizedStringForKey:value:table:);
        SEL swizzledSelector = @selector(yx_localizedStringForKey:value:table:);
        
        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
        
        BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
        if (didAddMethod) {
            class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

- (NSString *)yx_localizedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName {
    NSString *chosenLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:languageKey];
    chosenLanguage = chosenLanguage ? chosenLanguage: @"Base";
    NSBundle *chosenBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:chosenLanguage ofType:@"lproj"]];
    chosenBundle = chosenBundle ? chosenBundle: NSBundle.mainBundle;
    NSString *result = [chosenBundle yx_localizedStringForKey:key value:value table:tableName];
    return result;
}

+ (void)setLangage:(NSString *)language {
    [[NSUserDefaults standardUserDefaults] setObject:language forKey:languageKey];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

@end

相关文章

  • Android应用实现语言切换

    语言切换需求 应用内切换语言,支持阿拉伯语(从右到左书写,即RTL语言支持) 语言切换是切换系统语言,不只本应用 ...

  • 应用内切换语言

    思路 主要就是利用runtime hook系统的方法,宏定义为NSLocalizedString(key, com...

  • Android应用内切换语言

    首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈。 最近接触到...

  • ios 应用内切换语言

    1.首先添加需要支持的语言,默认支持英文,再添加中文即可 2.创建文件 创建完成后,再勾选另外的语言,base暂时...

  • iOS应用内切换语言

    关键代码 最后效果

  • iOS应用内语言切换

    最近项目需要在应用内做到语言切换比较简单的方式是

  • Android 应用内语言切换

    如果是做国际类APP,那么肯定会涉及到多国语言切换的问题。本文简单的实现语言的切换。 前提条件 基础类 直接复制粘...

  • Android应用内切换语言

    一、前言: 最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先。实现了中文,英文,泰语的切换。...

  • iOS 应用内切换语言

    随着移动App时代的发展,应用程序相继出现了不同语言的版本方案,中文,英文,法文,韩文等等;想在应用程序中实现语言...

  • 语言本地化实现(I US)

    参考资料:应用内切换语言实现本地化

网友评论

      本文标题:应用内切换语言

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