【问题标题】:switching language app with the same localized button使用相同的本地化按钮切换语言应用程序
【发布时间】:2015-09-16 11:12:14
【问题描述】:

我正在开发具有两种语言的 iOS 应用程序。 我为每种语言本地化了主故事板,现在我尝试使用相同的按钮(切换按钮文本)在语言之间切换。

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

【问题讨论】:

  • 你能分享一张你的本地化字符串文件和故事板是如何组织的截图吗?我需要它来告诉更多相关的答案
  • 感谢评论,我添加了storyboard和strings文件的截图。
  • @Mane_87 。我是本地化新手。我正在使用 3 种不同的语言如何更改语言

标签: ios objective-c localization


【解决方案1】:

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

这是 GitHub 上的 Working sample project。如下图所示:

演示视图控制器的完整代码

#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

您的 Localizable 文件将如下所示:

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

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

【讨论】:

  • 感谢您的回答。 Main.strings 文件没问题,但我问是否可以更改整个视图和应用程序其余部分的语言,而不是在您的示例中设置所有组件,如 localizeTexts 方法中的标签和按钮?谢谢
  • 让我们像这样简化您的问题:切换语言后如何重新加载 1 个按钮文本?答案是:如果不调用“刷新”正在显示的文本值的方法,就不可能反映当前选择的语言。该对象在内存中,因此您必须重新创建或更新其值。
  • 抱歉,我的问题不在按钮上,但我应该将所有应用程序设置为所选语言。这意味着使用适当的字符串文件重新加载情节提要。我尝试了很多方法,但我仍然卡住了(比如添加 ` [(AppDelegate *)[[UIApplication sharedApplication] delegate] window].rootViewController = [self.storyboard instantiateInitialViewController];` 和这段代码 [link] stackoverflow.com/questions/26496404/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2021-09-11
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多