Speech Synthezis API:NSLocalizedString使用哪种语言环境?

时间:2014-02-21 11:06:47

标签: ios nslocale avspeechsynthesizer

我想使用iOS 7新的语音合成API,我的应用程序本地化为法语&英语。

要实现这一点,必须对2件事进行本地化:

  • 语音文字:我将其放在通常的localizable.string文件中,并使用NSLocalizedString宏在代码中检索它。

  • 语言语言:必须为相应的语言选择AVSpeechSynthesisVoice

类实例化方法是AVSpeechSynthesisVoice voiceWithLanguage:(NSString *)lang。 我目前正在使用[NSLocale currentLocale].localeIdentifier作为此方法的参数。

问题:如果用户的设备语言是葡萄牙语,[NSLocale currentLocale]选择葡萄牙语代词,而NSLocalizedString解析的文本是英语。

如何知道NSLocalizedString当前读取的区域设置?

2 个答案:

答案 0 :(得分:3)

好的,我终于理解了Apple API:

  • [NSLocale currentLocale]:DOESN' T返回用户在设置中选择的当前语言>一般>国际,但返回用户在同一屏幕中选择的区域代码。

  • [NSLocale preferredLanguages]:此列表提供设备语言,它是此列表中的第一个字符串

  • [[NSBundle mainBundle] preferredLocalizations]返回应用程序解析的语言包。我猜这是NSLocalizedString使用的。在我的情况下它只有一个对象,但我想知道在哪种情况下它可以有多个。

  • [AVSpeechSynthesisVoice currentLanguageCode]返回系统预定义语言代码。

  • [AVSpeechSynthesisVoice voiceWithLanguage:]类instanciation方法需要完整的语言代码:使用语言和区域。 (例如:传递@" en"它将返回nil对象,它需要@" 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,Australien,GreatBritain或Canada的用户将获得与其通常设置最相符的声音。

答案 1 :(得分: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;
        }
    }
}