我想在我的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/