ios - 如何更改 iphone 应用程序中的语言运行时?

标签 ios objective-c iphone localization

我正在使用下面的代码。
此代码保存 Locale 名称,但如何使用新语言刷新整个应用程序。
这里 langcode 变量根据用户选择是动态的。

NSString *langCode = @"fr";
NSArray *languages = nil;
languages = [NSArray arrayWithObject:langCode];
[[NSUserDefaults standardUserDefaults] setObject:languages forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];

哪个是在运行时更改语言? (从我的应用程序设置屏幕)

最佳答案

在 Language 上设置类别后,问题就解决了。

.h 文件

@interface NSBundle (Language)

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

@end

.m文件

#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);

    [[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:self];
}

从我的设置 View Controller 中调用类别类的上述方法,并为整个应用程序触发发布通知。

[NSBundle setLanguage:langCode];

关于ios - 如何更改 iphone 应用程序中的语言运行时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27565034/

相关文章:

iphone - CAL层深度

ios - 无法单击列表中的 NavigationLink (SwiftUI)

objective-c - TabBarController didSelectViewController 不工作

ios - ML Kit iOS 人脸检测漏洞

ios - 选中的 TabBar 项目高度

ios - Objective-C 到 Swift 的可达性

iphone - 如何通过代码更改应用程序首选项设置?

iphone - 当用户选择不购买 iOS InApp Purchase 中的项目时,如何自定义错误处理?

ios - 找不到 GPPSignIn.h 文件

iphone - 如何用CCSpriteBatchNode替换CCSpriteSheet