获取本地化字符串的英文版

时间:2015-08-30 14:53:39

标签: ios objective-c nslocalizedstring

我有方法可以设置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'之类的错误

3 个答案:

答案 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始终对应于正确的文件。