forked from organicmaps/organicmaps
Merge pull request #1065 from bykoianko/master-ios8-tts-fix-second-try
iOS. Bugfix. If select a language for TTS - english will be used anyway on iOS 8 and earlier.
This commit is contained in:
commit
038824222d
3 changed files with 30 additions and 17 deletions
|
@ -5,6 +5,9 @@
|
|||
|
||||
+ (instancetype)tts;
|
||||
+ (void)activateAudioSession;
|
||||
// Returns a list of available languages in the following format:
|
||||
// * name in bcp47;
|
||||
// * localized name;
|
||||
- (vector<std::pair<string, string>>)availableLanguages;
|
||||
- (NSString *)savedLanguage;
|
||||
- (void)setNotificationsLocale:(NSString *)locale;
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
extern NSString * const kUserDefaultsTTSLanguageBcp47 = @"UserDefaultsTTSLanguageBcp47";
|
||||
extern NSString * const kUserDafaultsNeedToEnableTTS = @"UserDefaultsNeedToEnableTTS";
|
||||
static NSString * const DEFAULT_LANG = @"en-US";
|
||||
|
||||
@interface MWMTextToSpeech()
|
||||
{
|
||||
|
@ -47,12 +48,15 @@ extern NSString * const kUserDafaultsNeedToEnableTTS = @"UserDefaultsNeedToEnabl
|
|||
else
|
||||
preferedLanguageBcp47 = [AVSpeechSynthesisVoice currentLanguageCode];
|
||||
|
||||
string const preferedLanguageTwine = tts::bcp47ToTwineLanguage(preferedLanguageBcp47);
|
||||
pair<string, string> const lan {preferedLanguageTwine, tts::translatedTwine(preferedLanguageTwine)};
|
||||
pair<string, string> const lan =
|
||||
make_pair([preferedLanguageBcp47 UTF8String],
|
||||
tts::translatedTwine(tts::bcp47ToTwineLanguage(preferedLanguageBcp47)));
|
||||
|
||||
if (find(_availableLanguages.begin(), _availableLanguages.end(), lan) != _availableLanguages.end())
|
||||
[self setNotificationsLocale:@([preferedLanguageBcp47 UTF8String])];
|
||||
[self setNotificationsLocale:preferedLanguageBcp47];
|
||||
else
|
||||
[self setNotificationsLocale:@"en"];
|
||||
[self setNotificationsLocale:DEFAULT_LANG];
|
||||
|
||||
// Before 9.0 version iOS has an issue with speechRate. AVSpeechUtteranceDefaultSpeechRate does not work correctly.
|
||||
// It's a work around for iOS 7.x and 8.x.
|
||||
_speechRate = isIOSVersionLessThan(@"7.1.1") ? 0.3 : (isIOSVersionLessThan(@"9.0.0") ? 0.15 : AVSpeechUtteranceDefaultSpeechRate);
|
||||
|
@ -142,8 +146,6 @@ extern NSString * const kUserDafaultsNeedToEnableTTS = @"UserDefaultsNeedToEnabl
|
|||
|
||||
- (void)createVoice:(NSString *)locale
|
||||
{
|
||||
NSString * const DEFAULT_LANG = @"en-US";
|
||||
|
||||
if (!locale)
|
||||
{
|
||||
LOG(LERROR, ("locale is nil. Trying default locale."));
|
||||
|
@ -211,17 +213,23 @@ extern NSString * const kUserDafaultsNeedToEnableTTS = @"UserDefaultsNeedToEnabl
|
|||
static vector<pair<string, string>> availableLanguages()
|
||||
{
|
||||
NSArray<AVSpeechSynthesisVoice *> * voices = [AVSpeechSynthesisVoice speechVoices];
|
||||
vector<string> native(voices.count);
|
||||
vector<pair<string, string>> native(voices.count);
|
||||
for (AVSpeechSynthesisVoice * v in voices)
|
||||
native.push_back(tts::bcp47ToTwineLanguage(v.language));
|
||||
native.emplace_back(make_pair(tts::bcp47ToTwineLanguage(v.language), [v.language UTF8String]));
|
||||
|
||||
sort(native.begin(), native.end());
|
||||
using namespace routing::turns::sound;
|
||||
vector<pair<string, string>> result;
|
||||
for (auto const & p : kLanguageList)
|
||||
{
|
||||
if (find(native.begin(), native.end(), p.first) != native.end())
|
||||
result.push_back(p);
|
||||
for (pair<string, string> const & lang : native)
|
||||
{
|
||||
if (lang.first == p.first)
|
||||
{
|
||||
// Twine names are equal. Make a pair: bcp47 name, localized name.
|
||||
result.emplace_back(make_pair(lang.second, p.second));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -35,19 +35,21 @@ using namespace std;
|
|||
_languages.push_back(standart);
|
||||
|
||||
using namespace tts;
|
||||
string const current = bcp47ToTwineLanguage([AVSpeechSynthesisVoice currentLanguageCode]);
|
||||
if (current != standart.first && !current.empty())
|
||||
NSString * currentBcp47 = [AVSpeechSynthesisVoice currentLanguageCode];
|
||||
string const currentBcp47Str = [currentBcp47 UTF8String];
|
||||
string const currentTwineStr = bcp47ToTwineLanguage(currentBcp47);
|
||||
if (currentBcp47Str != standart.first && !currentBcp47Str.empty())
|
||||
{
|
||||
string const translated = translatedTwine(current);
|
||||
pair<string, string> const cur {current, translated};
|
||||
string const translated = translatedTwine(currentTwineStr);
|
||||
pair<string, string> const cur {currentBcp47Str, translated};
|
||||
if (translated.empty() || find(v.begin(), v.end(), cur) != v.end())
|
||||
_languages.push_back(cur);
|
||||
else
|
||||
self.isLocaleLanguageAbsent = YES;
|
||||
}
|
||||
string const savedLanguage = tts.savedLanguage.UTF8String;
|
||||
if (savedLanguage != current && savedLanguage != standart.first && !savedLanguage.empty())
|
||||
_languages.push_back({savedLanguage, translatedTwine(savedLanguage)});
|
||||
if (savedLanguage != currentBcp47Str && savedLanguage != standart.first && !savedLanguage.empty())
|
||||
_languages.emplace_back(make_pair(savedLanguage, translatedTwine(bcp47ToTwineLanguage(tts.savedLanguage))));
|
||||
}
|
||||
|
||||
- (IBAction)unwind:(id)sender
|
||||
|
|
Loading…
Add table
Reference in a new issue