gpt4 book ai didi

ios - 使用相同的本地化按钮切换语言应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:39:59 25 4
gpt4 key购买 nike

我正在开发一款支持两种语言的 iOS 应用。我为每种语言本地化了主 Storyboard,现在我正尝试使用相同的按钮(切换按钮文本)在语言之间切换。

我发现了很多用于更改应用程序语言的代码,每个代码都有按钮,例如 thisAdvance-Localization-in-ios-apps但我不知道如何根据按钮中选择的语言重新加载 Storyboard及其 .strings。有什么帮助吗?谢谢

localized Main.storyboard English strings file

最佳答案

恐怕您不能使用 Main.strings 文件。您最终会将 Storyboard 中的所有可本地化文本移动到 Localizable.strings 并使用类似 NSLocalizedString(key, comment) 的方法从那里加载它们。

这是一个Working sample project在 GitHub 上。它的工作原理如下面的屏幕截图所示:

enter image description here

演示 View Controller 的完整代码

#import "ViewController.h"

//--------------- Modify NSBunle behavior -------------
#import <objc/runtime.h>

@interface CustomizedBundle : NSBundle
@end

@implementation CustomizedBundle
static const char kAssociatedLanguageBundle = 0;

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

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

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

@implementation NSBundle (Custom)
+ (void)setLanguage:(NSString*)language {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
object_setClass([NSBundle mainBundle], [CustomizedBundle class]);
});

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

//--------------- Demo ---------------------------------
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UIButton *button;

@property (nonatomic, assign) BOOL usingArabic;
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

[self localizeTexts];
}

- (void)localizeTexts {
self.label.text = NSLocalizedString(@"explanation_message", nil);
[self.button setTitle:NSLocalizedString(@"language_switch_title", nil) forState:UIControlStateNormal];
}


- (IBAction)switchLanguageTouched:(id)sender {
_usingArabic = !_usingArabic;
NSString *targetLang = _usingArabic ? @"ar" : @"en";

[NSBundle setLanguage:targetLang];

[[NSUserDefaults standardUserDefaults] setObject:targetLang forKey:@"selectedLanguage"];
[[NSUserDefaults standardUserDefaults] synchronize];

[NSBundle setLanguage:targetLang];

[self localizeTexts];
}

@end

您的可本地化文件将如下所示:

enter image description here

希望这对您有所帮助。编码愉快!

编辑:如果不调用上面示例中的“localizeTexts”之类的方法来“刷新”显示的文本值,就不可能反射(reflect)当前选择的语言。该对象在内存中,因此您必须重新创建或更新它的值。

关于ios - 使用相同的本地化按钮切换语言应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32606991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com