iOS-搞一波国际化

作者: Arthur澪 | 来源:发表于2020-12-23 15:38 被阅读0次

简介

国际化跟字典差不多,比如要支持中文和英文,就会生成两个.string文件,在这两个文件里设一个Key,在中文的.string文件中这个Key对应的是中文,另一个则对应英文。

步骤

1.创建Localizable.string文件
-

PS:命名最好为Localizable.string

-
2.添加Language
-

一般会选择中文(zh-Hans)还有另一种语言(如日语 ja),也可以选择多种语言。

- -
3.把上面选择的语言添加到Localizable.strings文件
- - -

如下图,添加进来了,出现两个文件,对应两种语言的配置文件

-
4.进行语言映射

就是用同一个key,提供两个语言相对应的字符串

- -
5.给Label设置字符串

使用NSLocalizedString(@"key", @"备注")这个方法,如:

label.text = NSLocalizedString(@"wxtip", @"温馨提示");
6.切换语言
  • 原理
    App的NSUserDefault中有一个Key:AppleLanguages,负责存储App语言的字段,默认这个字段会根据系统语言去变动。如果用代码把AppleLanguages设置值为en、zh-Hanz、ja等,就可以切换语言了。

步骤:
写一个NSBundle的扩展:

#import <Foundation/Foundation.h>

@interface NSBundle (Language)

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

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

static const char _bundle = 0;

@interface BundleEx : NSBundle

@end

@implementation BundleEx

- (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

@implementation NSBundle (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

切换语言,需要重设APP的根控制器rootvc 生效。

// 公共方法
/// 入参language为:zh-Hans、en、ja等等
- (void)changeLanguageTo:(NSString *)language {
    // 设置语言
    [NSBundle setLanguage:language];
    
    // 将设置好的语言存储好,下次进来直接加载
    [[NSUserDefaults standardUserDefaults] setObject:language forKey:@"myLanguage"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    // 重设APP的根控制器rootvc
    // .......
}

完成!

相关文章

  • iOS-搞一波国际化

    简介 国际化跟字典差不多,比如要支持中文和英文,就会生成两个.string文件,在这两个文件里设一个Key,在中文...

  • iOS-语言国际化

    一、项目内的语言国际化 1.1、按下图顺序添加你所需要的语言,我这里添加了两种:中文、英语,因为英文是自带的,所以...

  • 全网最骚SpringBoot国际化i18n配置

    前言 忽然来了个需求让我搞国际化配置,通过添加header确定返回哪种语言信息。个人认知里信息国际化无非是常量信息...

  • iOS-私有API与runtime

    iOS-私有API与runtime iOS-私有API与runtime

  • iOS-代码混淆加固策略

    iOS-代码混淆加固策略 iOS-代码混淆加固策略

  • iOS-性能优化深入探究

    iOS-性能优化深入探究 iOS-性能优化深入探究

  • 终极搞一波

    spring ioc IOC负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整...

  • iOS-自动打包及分发(三)

    iOS-自动打包及分发(一)iOS-自动打包及分发(二)iOS-自动打包及分发(三) 废话不多说了,上正文: 一、...

  • iOS-项目配置国际化

    这篇文章统一归纳一下项目中用到的国际化,方便自己使用,不管是做下列那种国际化,项目中都要添加国际化项目。 名称国际...

  • iOS-国际化语言开发

    原文地址:https://www.jianshu.com/p/7cb0fad6d06f此文作为收藏

网友评论

    本文标题:iOS-搞一波国际化

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