ios - 用于简化 Objective C 中的 Singleton 方法调用的宏,以执行类似 NSLocalizedString 的操作

标签 ios objective-c macros translation nslocalizedstring

我想在我的 iOS 应用程序中支持一些 Apple 不支持的语言。所以我创建了一个单例来管理这个东西:

#import "Translator.h"

@implementation Translator {

    NSDictionary* _langDictionary;
    NSString* _selectedLang;
}

NSString* kDefaultLang = @"es_ES";
NSString* kLangKey = @"lang";

+ (id)sharedManager {
    static Translator *sharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedManager = [[self alloc] init];
    });
    return sharedManager;
}

- (id)init {
    if (self = [super init]) {
        _selectedLang = [[NSUserDefaults standardUserDefaults] stringForKey:kLangKey];
        if (_selectedLang == nil) {
            _selectedLang = kDefaultLang;
        }
        else {
            [self loadLang:_selectedLang];
        }
    }
    return self;
}

- (void) saveLang:(NSString*)lang{
    [[NSUserDefaults standardUserDefaults] setObject:lang forKey:kLangKey];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

- (void) loadLang:(NSString*) selectedLang {
    if ([selectedLang isEqualToString:kDefaultLang]) {
        [self saveLang:kDefaultLang];
        NSLog(@"Default Languaje loaded");
    }
    else {
        // Check if languaje file exists in mainBundle
        NSString *langPath = [[NSBundle mainBundle] pathForResource:selectedLang ofType:@"plist"];
        BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:langPath];
        // If exists, load the lang file
        if (fileExists) {
            [self saveLang:selectedLang];
            _langDictionary = [NSDictionary dictionaryWithContentsOfFile:langPath];
            NSLog(@"Languaje %@ loaded", selectedLang);
        }
        else {
            NSLog(@"Error loading: %@ languaje.",selectedLang);
            [self loadLang:kDefaultLang];
        }
    }
}

- (NSString*)translationForKey:(NSString*)key defaultText:(NSString*)text {

    NSString* translation;

    if (_selectedLang != kDefaultLang) {
        translation = [_langDictionary objectForKey:key];
    }
    
    if (translation == nil) {
        translation = text;
    }
    
    return translation;
}

@end

我想创建一个宏来简化单例调用。像 NSLocalizedString 这样的东西。而不是写:

[[Translator sharedManager] translationForKey:@"key" defaultText:@"defaultText"]

我想得到这样的翻译:

NSLocalizedString(@"key", @"defaultText");

但我不知道我必须写什么来定义这个宏:

Translate(@"key",@"defaultText")

最佳答案

目前,我使用的是几乎相同的翻译结构。

#define DICT(key) [[[MPConnector sharedConnector] getAllTranslations] valueForKey:key]

我这样调用它;

someLabel.text = DICT(@"NOW_LISTENING");

你可以试试;

#define Translate(key, default) [[Translator sharedManager] translationForKey:key defaultText:default]

P.S:我没有尝试使用多个参数的宏,但我的效果很好。

关于ios - 用于简化 Objective C 中的 Singleton 方法调用的宏,以执行类似 NSLocalizedString 的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29251732/

相关文章:

c++ - 表达式中的宏未按预期工作

ios - 函数可以从异步 block 返回值吗

ios - 默认实现中缺少 UITableViewCell detailTextLabel

ios - 应用关闭后本地保存的视频不再播放

objective-c - Collection was mutated while being enumerated 错误在 Objective-C

swift - Objective-C 的 "#ifdef __IPHONE_11_0"的 Swift 等价物是什么?

ios - 尝试设置 UILabel 的文本时 UIImage 消失

ios - Firebase App Distribution 的开发者资料

Iphone CLLocationCoordinate2D

c - 我们为什么以及如何重定向调试语句?