我想使用iOS 7新的语音合成API,我的应用程序本地化为法语&英语。
要实现这一点,必须对2件事进行本地化:
语音文字:我将其放在通常的localizable.string
文件中,并使用NSLocalizedString
宏在代码中检索它。
语言语言:必须为相应的语言选择AVSpeechSynthesisVoice
。
类实例化方法是AVSpeechSynthesisVoice voiceWithLanguage:(NSString *)lang
。
我目前正在使用[NSLocale currentLocale].localeIdentifier
作为此方法的参数。
问题:如果用户的设备语言是葡萄牙语,[NSLocale currentLocale]
选择葡萄牙语代词,而NSLocalizedString
解析的文本是英语。
如何知道NSLocalizedString
当前读取的区域设置?
答案 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;
}
}
}