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

做App国际化有两种方式,其一是跟随系统的语言设置,其二是在App内部设置语言切换。如微信:

WechatIMG3.jpeg

切换语言完成后,当前页面会先dismiss掉,之后进入个人中心,再push到设置页面。动图效果如下:
WeChat.gif

为什么要退出到个人中心页面再Push到设置页面?

这和多语言的设计原理有关,之所以重新回到个人中心页面,严格来说不能说回到,因为在语言切换之后,控制器需要重走一遍生命周期(需要把对应的控件中的字符串重新赋值,安卓也是同理),是很好的切换语言的方式,当然也可以自己实现,但是微信这种十亿人都在用的App都是用的这种方式切换,说明大家也是可以接受这种方式的,也最简洁。

多语言切换的实现

App实现国际化功能,
1.创建工程中创建String文件。
2.在TagetInfo菜单下的language,添加需要支持的语言,点击加号时,需要选择一个多语言的文件,就是第一步创建的String文件。

image.png

3.在对应的语言中,配置key-value字串即可。
上述不够详细,是因为这是比较草率的实现一个多语言的方式,下面介绍

如何使用bundle实现App国际化。

bundle用来存放资源文件,将资源文件放在bundle中有诸多好处,String文件就可以放在bundle中,接下来的重中之重,就是根据用户行为,读取不用的多语言String文件了。
为了让多语言的功能实现起来更加的方便,我给NSBundle添加了一个分类,代码如下:

@implementation NSBundle (UPHKLocalized)
static NSBundle *bundle = nil;
+ (instancetype)hk_bundle {
    if (bundle == nil) {
        bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"UPHKStrings" ofType:@"bundle"]];
    }
    return bundle;
}

+ (void)clearBundle {
    bundle = nil;
    [UPNotificationCenter postNotificationName:UPHKLanguageChangedNoti object:nil];
}

+ (NSString *)localizedStringForKey:(NSString *)key {
    return [self localizedStringForKey:key value:nil];
}

+ (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value {
    if (bundle == nil) {
        NSString *language = [UPHKInternationalUtil getCurrentLanguage];
        if ([language hasPrefix:@"en"]) {
            language = @"en";
        } else if ([language hasPrefix:@"zh"]) {
            if ([language rangeOfString:@"Hans"].location != NSNotFound) {
                language = @"zh-Hans";
            } else {
                language = @"zh-Hant";
            }
        } else {
            language = @"en";
        }
        bundle = [NSBundle bundleWithPath:[[NSBundle hk_bundle] pathForResource:language ofType:@"lproj"]];
    }
    value = [bundle localizedStringForKey:(key) value:nil table:@"UPHKLanguage"];
    return [[NSBundle mainBundle] localizedStringForKey:key value:value table:nil];
}
@end

在该分类中,用到了UPHKInternationalUtil,它的作用实际上是存储用户上次的语言选择。
最后的使用就更加的简单了:
#define Localized(key) [NSBundle localizedStringForKey:key]
直接在代码中调用宏获取对应的key值即可。如self.label.text = Localized(@"A");
在String文件中做如下定义:
en文件: @"A"= @"hello";
hans文件 @"A" = @"你好";
hant文件 @"A" = @"妳好";

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容