【问题标题】:Macro for NSLocalizedString not workingNSLocalizedString 的宏不起作用
【发布时间】:2017-01-12 10:30:22
【问题描述】:

我在 Prefix.pch 中为 NSLocalizedString 构建一个宏:

#undef NSLocalizedString
#define NSLocalizedString(key,_comment) [[LocalizedText sharedInstance] localizedStringFor:key]

我的LocalizedText 类如下所示:

+ (LocalizedText *)sharedInstance {
    @synchronized(self)
    {
        if (_singletonInstance == nil)
            _singletonInstance = [[LocalizedText alloc] init];
    }

    return _singletonInstance;
}

- (NSString *) localizedStringFor:(NSString*) key
{

    NSUserDefaults *deviceLanguage = [NSUserDefaults standardUserDefaults];

   NSString *currentLanguage = [deviceLanguage objectForKey:@"deviceLanguage"];

    NSString *path;
    if([currentLanguage isEqual: @"en"])
        path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
    else if([currentLanguage isEqual: @"de"])
        path = [[NSBundle mainBundle] pathForResource:@"de" ofType:@"lproj"];
    else if([currentLanguage isEqual: @"it"])
        path = [[NSBundle mainBundle] pathForResource:@"it" ofType:@"lproj"];


    NSBundle* languageBundle = [NSBundle bundleWithPath:path];
    NSString* str=[languageBundle localizedStringForKey:key value:@"" table:nil];

    return str;

}

例如,当我将NSUserDefaults 更改为@"en" 时,我希望每个NSLocalizedString 都能为我提供正确的英文翻译,但它永远不会改变并且始终是默认语言。我的代码有什么问题?

【问题讨论】:

    标签: ios objective-c macros nslocalizedstring


    【解决方案1】:

    在调试您的宏之前,我会设置如下测试:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *currentLanguage = [defaults objectForKey:@"deviceLanguage"];
    
    NSString *key = @"SomeKeyFromYourLocalizedFile";
    NSString *localized = [[LocalizedText sharedInstance] localizedStringFor:key];
    NSLog(@"%@: %@", currentLanguage, localized);
    
    [defaults setObject:@"de" forKey:@"deviceLanguage"];
    [defaults synchronize];
    NSString *localized = [[LocalizedText sharedInstance] localizedStringFor:key];
    NSLog(@"%@: %@", currentLanguage, localized);
    
    [defaults setObject:@"it" forKey:@"deviceLanguage"];
    [defaults synchronize];
    NSString *localized = [[LocalizedText sharedInstance] localizedStringFor:key];
    NSLog(@"%@: %@", currentLanguage, localized);
    

    然后看看它的输出。您的错误可能就在其中。

    我希望:

    en: English localized
    de: German localized
    it: Italian localized
    

    之后,您只需使用您的宏(看起来它就像那样工作)。我试过了:

    #ifdef NSLocalizedString
    #undef NSLocalizedString
    #endif
    #define NSLocalizedString(key, comment) NSLog(@"Output %@, %@", key, comment)
    
    NSLocalizedString(@"First", @"Second");
    

    这会导致: 2017-01-12 14:31:31.501 App[49000:50650596] Output First, Second

    【讨论】:

    • 感谢您的帮助,似乎“[[LocalizedText sharedInstance]localizedStringFor:key]”工作得很好,但是当我尝试使用宏时,该函数没有被调用,所以这似乎是一个问题用马可它自己。
    • 这很奇怪!我尝试了同样的方法,并且 确实 工作。请查看更新后的答案。
    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多