2015-08-30 3 views
0

У меня есть метод, который я установил 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]; 
} 

This обладают проблемой, потому что мой файл sound.caf в главном расслоении называется в английском формате. Итак, как мне получить английскую версию «self.soundNameLabel.text», когда она локализована?


EDIT Я нашел это в документации: initWithFormat:locale: это именно то, что я ищу. Но я читал, что он не автореализован, поэтому я не знаю, нужно ли это использовать. Кроме того, я получаю ошибки для что-то вроде «строка не символьная строка» при использовании его

+0

Вы делаете это неправильно. Просто не устанавливайте поведение программы в строках, отображаемых пользователю. Я уверен, что вы можете сохранить необходимую информацию в лучшей форме, чем локализованные тексты. – Sulthan

ответ

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 

будут затронуты

Я настоятельно рекомендую, чтобы избежать любой ценой создать алгоритм логики на основе локализация. Ваш код должен работать безупречно на любом языке, поскольку это должно быть просто косметическим.

Я надеюсь, что это сработает. Есть и другие способы сделать это, но это самый простой способ избежать изменения всех ваших методов.

+0

Я хотел бы избежать этого, я надеялся, что будет удобный API-интерфейс, который мне не нужно будет создавать условный оператор if, поскольку у меня много языков и ___A LOT___ звуковых имен (примерно 22) так что было бы много утверждений –

+0

Вы можете использовать тег на свой souneNameLabel и просто называть свой .caf от 1 до 22.и вы удаляете всю локализацию @JteveSobs –

+0

есть только 1 ярлык (метка меняется в зависимости от выбора), так что хорошая идея, но не сработает. тег всегда будет равен 1 или тому, к чему я его установил. Мне просто интересно, есть ли способ получить обратную ссылку на локализованную строку –

0

Я смог решить это, просто создав словарь ключевых слов/объектов из основного пакета, так как там, где находятся локализованные строки, а затем получить ключ для объекта (который всегда будет английским, поскольку это моя база) :

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"]; 
0

Вы должны переделать вашу модель таким образом, чтобы пользователь обращенных строки пользовательского интерфейса отделены от основных имен файлов. Например, представьте себе объект модели, представляющий звук, он будет иметь displayName (показано пользователю, локализован) и fileName (которое передается AVAudioPlayer). Независимо от того, в какой локализации находится приложение, имя файла всегда соответствует правильному файлу.

+0

Это точно мой случай benjamin? displayName (показать пользователю, локализованный), например, @ «Polizei», а fileName (которое передается AVAudioPlayer) - это Police.caf, поэтому мне нужна английская версия. У меня нет «objectAtIndex» для ссылки, иначе этот вопрос даже не будет задан, это случай, когда он только получает его от метки –

Смежные вопросы