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

#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]

附言:我没有尝试使用具有多个参数的宏,但是我的效果很好。

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

10-09 02:05