【问题标题】:Change app language programmatically for Localization in iOS以编程方式更改应用程序语言以在 iOS 中进行本地化
【发布时间】:2014-10-17 10:51:26
【问题描述】:

我正在为五个不同的国家/地区创建一个 iPhone 应用程序。因此,根据国家/地区名称,我在应用程序资源中添加了 Localizable.strings(请参阅下面的屏幕截图-1),并且它对我来说可以通过设备设置语言更改正常工作。

[btnAIO setTitle:NSLocalizedString(@"AllInOnesTitle", nil) forState:UIControlStateNormal];

现在我的应用要求已经改变,成功登录后我正在获取用户国家代码。根据要求,用户不必从设备设置中更改语言。所以,第一次我需要为所有用户显示我的登录屏幕,并且在成功登录后,根据用户国家代码,我需要分别为我的应用程序更改所有文本。

可以通过为我的所有文本提供五个条件(检查国家/地区语言代码),但这不是正确的方法。

任何人都可以请建议我这是最好的方法吗?谢谢!

【问题讨论】:

    标签: ios ios7 localization internationalization nslocalizedstring


    【解决方案1】:

    您可以为 NSBundle 创建类别,称为 NSBundle+Language

    NSBundle+Language.h

    #import <Foundation/Foundation.h>
    
    @interface NSBundle (Language)
    +(void)setLanguage:(NSString*)language;
    @end
    

    NSBundle+Language.m

    #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
    

    所以你可以为每个国家代码设置它的语言名称,然后当 选择国家用语言调用setLanguage的方法

    例如 [NSBundle setLanguage:"en"];

    【讨论】:

    • Storyboards 和 Xib 会发生什么?
    • 完美。需要注意的一件事是,您需要重新加载视图才能再次显示新语言。
    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 2018-08-09
    • 1970-01-01
    • 2012-01-13
    • 2011-07-03
    • 2019-05-09
    相关资源
    最近更新 更多