def set_active_language(language): log.debug(f"Setting display language to {language}.") langinfo = get_available_languages().get(language) if langinfo is None: langinfo = get_available_languages()["default"] lang = langinfo.pylang try: translation = gettext.translation(app.name, localedir=paths.locale_path(), languages=[language]) translation.install(names=["ngettext"]) locale_changed = False with suppress(Exception): locale.setlocale(locale.LC_ALL, lang) locale_changed = True if not locale_changed: if "_" in lang: with suppress(Exception): locale.setlocale(locale.LC_ALL, lang.split("_")[0]) locale_changed = True if not lang.startswith("en"): app_started.connect(lambda s: set_wx_language(lang), weak=False) CultureInfo.CurrentUICulture = langinfo.culture CultureInfo.DefaultThreadCurrentUICulture = langinfo.culture ctypes.windll.kernel32.SetThreadLocale(langinfo.LCID) app.current_language = langinfo except IOError: log.error(f"Translation catalog for language {lang} was not found.") en_culture = CultureInfo.GetCultureInfoByIetfLanguageTag("en") CultureInfo.CurrentUICulture = en_culture CultureInfo.DefaultThreadCurrentUICulture = en_culture ctypes.windll.kernel32.SetThreadLocale(en_culture.LCID) app.current_language = get_available_languages()["en"]
def get_voices(self, language=None): rv = [] voices = [] if language is not None: current_culture = CultureInfo.CurrentCulture if current_culture.IetfLanguageTag.startswith(language.lower()): voices.extend(self.GetInstalledVoices(current_culture)) if language in locale_map: for locale in locale_map[language]: culture = CultureInfo.GetCultureInfoByIetfLanguageTag( f"{language}-{locale}") voices.extend(self.GetInstalledVoices(culture)) voices.extend(self.GetInstalledVoices(CultureInfo(language))) else: voices = self.GetInstalledVoices() if not voices: log.warning("No suitable TTS voice was found.") return rv for voice in voices: if not voice.Enabled: continue info = voice.VoiceInfo rv.append( VoiceInfo( id=info.Id, name=info.Name, desc=info.Description, language=info.Culture.IetfLanguageTag, gender=info.Gender, age=info.Age, )) return rv
def __init__(self, given_lang): self.given_lang = given_lang try: culture = CultureInfo.GetCultureInfoByIetfLanguageTag(given_lang) self.culture = (culture if culture.LCID != UNKNOWN_CULTURE_LCID else culture.Parent) self.language = self.culture.IetfLanguageTag except CultureNotFoundException: raise ValueError(f"Invalid language {given_lang}.")
def speak_utterance(self, utterance): # We need to wrap the whole utterance in another # one that sets the voice. Because The Speak() # function does not honor the engine voice. voice_utterance = SapiSpeechUtterance() voice_utterance.prompt.Culture = CultureInfo.GetCultureInfoByIetfLanguageTag( self.voice.language) with voice_utterance.set_style(SpeechStyle(voice=self.voice)): voice_utterance.append_utterance(utterance) self.synth.SpeakAsync(voice_utterance.prompt)
def _take_stock(self): for func, args in self._heal_funcs: func(*args) self._heal_funcs.clear() voice = self.synth().voice voice_utterance = SapiSpeechUtterance() with voice_utterance.set_style( SpeechStyle(voice=voice, rate=self.synth().rate_to_spec())): voice_utterance.append_utterance(self) voice_utterance.prompt.Culture = CultureInfo.GetCultureInfoByIetfLanguageTag( voice.language) ssml = voice_utterance.prompt.ToXml() if not self.prompt.IsEmpty: self.prompt.ClearContent() self._speech_sequence.append( SpeechElement(SpeechElementKind.ssml, ssml))
def set_app_locale(localeinfo): culture = CultureInfo.GetCultureInfoByIetfLanguageTag(localeinfo.language) CultureInfo.CurrentCulture = culture CultureInfo.CurrentUICulture = culture CultureInfo.DefaultThreadCurrentUICulture = culture ctypes.windll.kernel32.SetThreadLocale(culture.LCID)