2014-02-21 1 views
2

Я хочу использовать iOS 7 новый язык synthezis речи, и мое приложение локализовано на французском языке & english.Speech Synthezis API: какой язык используется NSLocalizedString?

Для этого, чтобы работать, 2 вещи должны быть локализованы:

  • речи текст: Я положил его в обычном localizable.string файле, и получить его в коде с помощью NSLocalizedString макросъемки.

  • язык речи: AVSpeechSynthesisVoice должен быть выбран для соответствующего языка.

Метод instanciation класса - AVSpeechSynthesisVoice voiceWithLanguage:(NSString *)lang. В настоящее время я использую [NSLocale currentLocale].localeIdentifier в качестве параметра для этого метода.

Проблема: если язык устройства пользователя является португальским, [NSLocale currentLocale] выберите portuguese prononciation, а текст разрешен NSLocalizedString - английский.

Как я могу узнать, в какой языковой стандарт в настоящее время используется код NSLocalizedString?

ответ

2

Хорошо, я, наконец, удалось понять смысл интерфейсов Apple:

  • [NSLocale currentLocale]: не возвращает текущий язык определена пользователем в меню Настройки> Общие> международный, но возвращает код региона, выбранного пользователем в такой же экран.

  • [NSLocale preferredLanguages]: Этот список не дает язык устройства, это первая строка в этом списке

  • [[NSBundle mainBundle] preferredLocalizations] возвращения язык расслоение разрешено путем применения. Я думаю, это то, что использует NSLocalizedString. У меня только один объект в моем случае, но мне интересно, в каких случаях он может иметь более одного.

  • [AVSpeechSynthesisVoice currentLanguageCode] возвращает системный предопределенный код языка.

  • [AVSpeechSynthesisVoice voiceWithLanguage:] класс instanciation метод необходим полный код языка: с языком и регионом. (например: передача @ "en" к нему будет возвращать нулевой объект, ему нужно @ "en-US" или @ "en-GB" ...)

  • [AVSpeechSynthesisVoice currentLanguageCode] дает голос по умолчанию, определенный ОС.

Так это то, что мой окончательный код выглядит

// current user locale (language & region) 
    NSString *voiceLangCode = [AVSpeechSynthesisVoice currentLanguageCode]; 
    NSString *defaultAppLang = [[[NSBundle mainBundle] preferredLocalizations] firstObject]; 

    // nil voice will use default system voice 
    AVSpeechSynthesisVoice *voice = nil; 

    // is default voice language compatible with our application language ? 
    if ([voiceLangCode rangeOfString:defaultAppLang].location == NSNotFound) { 
     // if not, select voice from application language 
     NSString *pickedVoiceLang = nil; 
     if ([defaultAppLang isEqualToString:@"en"]) { 
      pickedVoiceLang = @"en-US"; 
     } else { 
      pickedVoiceLang = @"fr-FR"; 
     } 
     voice = [AVSpeechSynthesisVoice voiceWithLanguage:pickedVoiceLang]; 
    } 


    AVSpeechUtterance *mySpeech = [[AVSpeechUtterance alloc] initWithString:NSLocalizedString(@"MY_SPEECH_LOCALIZED_KEY", nil)]; 
    frontPicUtterance.voice = voice; 

Таким образом, пользователь из NewZealand, Австралия, GreatBritain или Канады получит голос, который соответствует самому его обычным настройкам. Ответ

+0

Я думаю, что [NSLocale preferredLanguages] лучше, потому что тх приложение может быть не локализовано на экзотический язык, но TTS доступна на устройстве – djdance

3

Vinzzz был отличный старт - я обобщил его работать с любым языком:

NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0]; 
NSString *voiceLangCode = [AVSpeechSynthesisVoice currentLanguageCode]; 
if (![voiceLangCode hasPrefix:language]) { 
    // the default voice can't speak the language the text is localized to; 
    // switch to a compatible voice: 
    NSArray *speechVoices = [AVSpeechSynthesisVoice speechVoices]; 
    for (AVSpeechSynthesisVoice *speechVoice in speechVoices) { 
     if ([speechVoice.language hasPrefix:language]) { 
      self.voice = speechVoice; 
      break; 
     } 
    } 
}