我有方法可以设置NSUserDefaults来播放基于英文版的歌曲。我目前正在为其他语言翻译它,但由于警报是基于NSUserDefaults对象。这应该更有意义:
- (void)applySoundNameAndSaveSoundToNSUserDefaults {
[self.audioPlayer stop];
NSString *soundName = self.soundNameLabel.text;
[[NSUserDefaults standardUserDefaults] setObject:soundName forKey:@"AlarmSound"];
}
因此,您可以看到单元格标签是否已本地化,它会将该名称的语言版本放在NSUserDefaults中,如果我这样做,我不想这样做。
我就是这样玩的:
self.alarmSound = [[NSUserDefaults standardUserDefaults] stringForKey:@"AlarmSound"];
- (void) fireLocalNotification {
NSString *notificationSound;
notificationSound = [NSString stringWithFormat:@"%@", self.alarmSound];
notificationSound = [notificationSound stringByAppendingString:@".caf"];
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.soundName = [NSString stringWithFormat:@"%@", notificationSound];
}
这有一个问题,因为主包中的sound.caf文件以英文格式命名。那么如何在本地化时获得英文版'self.soundNameLabel.text'?
编辑我在文档中找到了这个:initWithFormat:locale:
这正是我正在寻找的。但我已经读过它没有自动释放,所以我不知道它是否应该使用。另外,我在使用它时会出现'string is not literal string'之类的错误
答案 0 :(得分:0)
Jteve,
我可能会通过简单的验证来完成。您可以使用其他方法来解决您的问题,但这意味着您必须更改所有代码。这就是我要做的事情(不推荐):
- (void)applySoundNameAndSaveSoundToNSUserDefaults {
[self.audioPlayer stop];
NSString *soundName = self.soundNameLabel.text;
//You know your translation value and your original English String so:
if ([soundName isEqualToString:@"SpanishString1"] || [soundName isEqualToString:@"GermanString1"]) {
soundName = @"EnglishString1";
} else if ([soundName isEqualToString:@"GermanString2"]) {
soundName = @"EnglishString2";
}
//Multiple if conditions in case you have more than one .caf
[[NSUserDefaults standardUserDefaults] setObject:soundName forKey:@"AlarmSound"];
}
这样
- (void) fireLocalNotification
方法不受影响
我强烈建议避免所有成本基于本地化创建算法逻辑。你的代码应该在任何语言上完美运行,因为它应该只是装饰性的。
我希望这有效。还有其他方法可以做到这一点,但这是避免改变整个方法的最简单方法。
答案 1 :(得分:0)
我能够通过从主包中创建一个Keys / Objects字典来解决这个问题,因为那是本地化字符串所在的字典,然后获取该对象的键(因为那是我的基础所以总是英语):
NSString *localizedSoundName = self.soundNameLabel.text;
NSDictionary *localizedDict = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings"]];
NSArray *tempArray = [localizedDict allKeysForObject:localizedSoundName];
NSString *englishSoundName = [tempArray objectAtIndex:0];
[[NSUserDefaults standardUserDefaults] setObject:englishSoundName forKey:@"AlarmSound"];
答案 2 :(得分:0)
您应该重新设计模型,以便将面向用户的UI字符串与基础文件名分开。例如,想象一个表示Sound的模型对象,它将具有displayName(显示给用户,已本地化)和fileName(传递给AVAudioPlayer)。无论应用程序处于何种本地化状态,fileName始终对应于正确的文件。