diff --git a/addon/generics/speechSymbols/__init__.py b/addon/generics/speechSymbols/__init__.py index 5f28270..e69de29 100644 --- a/addon/generics/speechSymbols/__init__.py +++ b/addon/generics/speechSymbols/__init__.py @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/addon/generics/speechSymbols/models.py b/addon/generics/speechSymbols/models.py index f4e7118..5d8a30c 100644 --- a/addon/generics/speechSymbols/models.py +++ b/addon/generics/speechSymbols/models.py @@ -1,5 +1,3 @@ -# coding: utf-8 - import codecs import collections import os diff --git a/addon/generics/speechSymbols/views.py b/addon/generics/speechSymbols/views.py index 3a84e97..ad14a98 100644 --- a/addon/generics/speechSymbols/views.py +++ b/addon/generics/speechSymbols/views.py @@ -1,5 +1,3 @@ -# coding: utf-8 - import copy import os import wx @@ -319,9 +317,9 @@ def onOk(self, evt): self.speechSymbols = None if gui.messageBox( # Translators: The message displayed - _("For the edited unicode rule to apply, NVDA must be restarted. Press enter to restart NVDA, or cancel to exit at a later time."), + _("For the edited unicode rule to apply, NVDA must be restarted. Do you want to restart NVDA now?"), # Translators: The title of the dialog - _("unicode rule edited"),wx.OK|wx.CANCEL|wx.ICON_WARNING,self + _("unicode rule edited"), wx.OK|wx.CANCEL|wx.ICON_WARNING, self )==wx.OK: queueHandler.queueFunction(queueHandler.eventQueue,core.restart) diff --git a/addon/generics/synthDrivers/__init__.py b/addon/generics/synthDrivers/__init__.py index 1824385..2ca175c 100644 --- a/addon/generics/synthDrivers/__init__.py +++ b/addon/generics/synthDrivers/__init__.py @@ -1,47 +1,22 @@ import re -import driverHandler import languageHandler import speech try: - from speech import IndexCommand, CharacterModeCommand, LangChangeCommand, BreakCommand, PitchCommand, RateCommand, VolumeCommand + from speech import LangChangeCommand, BreakCommand except: - from speech.commands import IndexCommand, CharacterModeCommand, LangChangeCommand, BreakCommand, PitchCommand, RateCommand, VolumeCommand + from speech.commands import LangChangeCommand, BreakCommand + +from synthDrivers.WorldVoiceXVED2 import _config number_pattern = re.compile(r"[0-9]+[0-9.:]*[0-9]+|[0-9]") comma_number_pattern = re.compile(r"(?<=[0-9]),(?=[0-9])") chinese_space_pattern = re.compile(r"(?<=[\u4e00-\u9fa5])\s+(?=[\u4e00-\u9fa5])") class WorldVoiceBaseSynthDriver: - - def patchedSpeak(self, speechSequence, symbolLevel=None, priority=None): - if self._cni: - temp = [] - for command in speechSequence: - if isinstance(command, str): - temp.append(comma_number_pattern.sub(lambda m:'', command)) - else: - temp.append(command) - speechSequence = temp - if self.uwv \ - and _config.vocalizerConfig['autoLanguageSwitching']['useUnicodeLanguageDetection'] \ - and not _config.vocalizerConfig['autoLanguageSwitching']['afterSymbolDetection']: - speechSequence = self._languageDetector.add_detected_language_commands(speechSequence) - speechSequence = list(speechSequence) - self._realSpeakFunc(speechSequence, symbolLevel, priority=priority) - - def patchedSpeakSpelling(self, text, locale=None, useCharacterDescriptions=False, priority=None): - if config.conf["speech"]["autoLanguageSwitching"] \ - and _config.vocalizerConfig['autoLanguageSwitching']['useUnicodeLanguageDetection'] \ - and config.conf["speech"]["trustVoiceLanguage"]: - for text, loc in self._languageDetector.process_for_spelling(text, locale): - self._realSpellingFunc(text, loc, useCharacterDescriptions, priority=priority) - else: - self._realSpellingFunc(text, locale, useCharacterDescriptions, priority=priority) - def patchedNumSpeechSequence(self, speechSequence): - return self.coercionNumberLangChange(speechSequence, self._numlan, self._nummod) + return self.coercionNumberLangChange(speechSequence, self._nummod, self._numlan, self.speechSymbols) def patchedSpaceSpeechSequence(self, speechSequence): if not int(self._chinesespace) == 0: @@ -100,23 +75,49 @@ def lengthsplit(self, string, length): result.append(fragment) return result - def resplit(self, pattern, string, mode): + def resplit(self, pattern, string, mode, numberLanguage, speechSymbols): result = [] numbers = pattern.findall(string) others = pattern.split(string) for other, number in zip(others, numbers): + dot_count = len(number.split(".")) if mode == 'value': - result.extend([other, LangChangeCommand('StartNumber'), number, LangChangeCommand('EndNumber')]) + number_str = number elif mode == 'number': - result.extend([other, LangChangeCommand('StartNumber'), ' '.join(number).replace(" . ", " ."), LangChangeCommand('EndNumber')]) + dot_count = dot_count +1 + number_str = ' '.join(number).replace(" . ", ".") + + translate_dict = {} + for c in "1234567890": + if speechSymbols and c in speechSymbols.symbols: + symbol = speechSymbols.symbols[c] + if symbol.language == numberLanguage or symbol.language == "Windows": + translate_dict[ord(c)] = symbol.replacement if symbol.replacement else c + + nodot_str = number_str.split(".") + temp = "" + for n, d in zip(nodot_str, ["."]*(len(nodot_str) -1)): + if len(n) == 1: + n = n.translate(translate_dict) + temp = temp +n +d + n = nodot_str[-1] + if len(n) == 1: + n = n.translate(translate_dict) + temp = temp +n + number_str = temp + + if dot_count > 2: + number_str = number_str.replace(".", _config.vocalizerConfig["autoLanguageSwitching"]["numberDotReplacement"]) + + result.extend([other, LangChangeCommand('StartNumber'), number_str, LangChangeCommand('EndNumber')]) result.append(others[-1]) return result - def coercionNumberLangChange(self, speechSequence, numberLanguage, mode): + def coercionNumberLangChange(self, speechSequence, mode, numberLanguage, speechSymbols): result = [] for command in speechSequence: if isinstance(command, str): - result.extend(self.resplit(number_pattern, command, mode)) + result.extend(self.resplit(number_pattern, command, mode, numberLanguage, speechSymbols)) else: result.append(command) diff --git a/addon/globalPlugins/WorldVoiceXVED2/__init__.py b/addon/globalPlugins/WorldVoiceXVED2/__init__.py index ec239fb..0fb73bb 100644 --- a/addon/globalPlugins/WorldVoiceXVED2/__init__.py +++ b/addon/globalPlugins/WorldVoiceXVED2/__init__.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - import os import sys base_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) diff --git a/addon/globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py b/addon/globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py index 4a2cb1a..421c55c 100644 --- a/addon/globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py +++ b/addon/globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py @@ -73,6 +73,12 @@ def makeSettings(self, sizer): self.Bind(wx.EVT_SLIDER, self.onVolumeSliderScroll, self._volumeSlider) self.sliderDisable() + self._dotText = settingsSizerHelper.addLabeledControl( + labelText=_("Number dot replacement"), + wxCtrlClass=wx.TextCtrl, + value=_config.vocalizerConfig["autoLanguageSwitching"]["numberDotReplacement"], + ) + self._useUnicodeDetectionCheckBox = wx.CheckBox(self, # Translators: Wether to use or not unicode characters based language detection. label=_("Detect text language based on unicode characters")) @@ -219,6 +225,7 @@ def onOk(self, event): except BaseException as e: pass + _config.vocalizerConfig["autoLanguageSwitching"]["numberDotReplacement"] = self._dotText.GetValue() _config.vocalizerConfig["autoLanguageSwitching"]["useUnicodeLanguageDetection"] = self._useUnicodeDetectionCheckBox.GetValue() _config.vocalizerConfig["autoLanguageSwitching"]["afterSymbolDetection"] = self._afterSymbolDetectionCheckBox.GetValue() _config.vocalizerConfig["autoLanguageSwitching"]["ignoreNumbersInLanguageDetection"] = self._ignoreNumbersCheckBox.GetValue() diff --git a/addon/locale/zh_CN/LC_MESSAGES/nvda.po b/addon/locale/zh_CN/LC_MESSAGES/nvda.po index 4df30ff..8b0833e 100644 --- a/addon/locale/zh_CN/LC_MESSAGES/nvda.po +++ b/addon/locale/zh_CN/LC_MESSAGES/nvda.po @@ -7,107 +7,107 @@ msgid "" msgstr "" "Project-Id-Version: 'WorldVoiceXVE' '1.6'\n" "Report-Msgid-Bugs-To: 'nvda-translations@groups.io'\n" -"POT-Creation-Date: 2021-02-03 08:50+0800\n" -"PO-Revision-Date: 2021-02-03 08:52+0800\n" +"POT-Creation-Date: 2021-07-02 10:25+0800\n" +"PO-Revision-Date: 2021-07-02 10:26+0800\n" "Last-Translator: \n" "Language-Team: \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0\n" "X-Poedit-Basepath: ../../..\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Poedit-SearchPath-0: .\n" -#: generics/contextHelp.py:34 +#: generics/speechSymbols/contextHelp.py:34 msgid "No help available here." msgstr "无可用说明" -#: generics/contextHelp.py:41 +#: generics/speechSymbols/contextHelp.py:41 msgid "No user guide found." msgstr "未找到用户指南。" -#: generics/models.py:22 +#: generics/speechSymbols/models.py:22 msgid "context" msgstr "上下文" -#: generics/models.py:23 +#: generics/speechSymbols/models.py:23 msgid "force" msgstr "强制" -#: generics/views.py:33 +#: generics/speechSymbols/views.py:33 msgid "Add Symbol" msgstr "添加符号" -#: generics/views.py:38 +#: generics/speechSymbols/views.py:38 msgid "&Symbol:" msgstr "符号(&S)" -#: generics/views.py:61 +#: generics/speechSymbols/views.py:61 msgid "Unicode Setting" msgstr "Unicode 设置" -#: generics/views.py:85 +#: generics/speechSymbols/views.py:85 msgid "&Symbols" msgstr "符号(&S)" -#: generics/views.py:95 +#: generics/speechSymbols/views.py:95 msgid "Unicode" msgstr "Unicode" -#: generics/views.py:97 +#: generics/speechSymbols/views.py:97 msgid "Replacement" msgstr "替换文字" -#: generics/views.py:99 +#: generics/speechSymbols/views.py:99 msgid "Language" msgstr "语言" -#: generics/views.py:102 +#: generics/speechSymbols/views.py:102 msgid "Mode" msgstr "模式" -#: generics/views.py:106 +#: generics/speechSymbols/views.py:106 msgid "Change selected symbol" msgstr "更改选择的符号" -#: generics/views.py:128 +#: generics/speechSymbols/views.py:128 msgid "&Replacement" msgstr "替换文字(&R)" -#: generics/views.py:136 +#: generics/speechSymbols/views.py:136 msgid "&language" msgstr "语言(&L)" -#: generics/views.py:141 +#: generics/speechSymbols/views.py:141 msgid "&Detect language mode" msgstr "语言检测模式" -#: generics/views.py:148 +#: generics/speechSymbols/views.py:148 msgid "&Add" msgstr "添加(&A)" -#: generics/views.py:151 +#: generics/speechSymbols/views.py:151 msgid "Re&move" msgstr "移除(&R)" -#: generics/views.py:256 +#: generics/speechSymbols/views.py:256 #, python-format msgid "Symbol \"%s\" is already present." msgstr "符号 \"%s\" 已存在" -#: generics/views.py:257 +#: generics/speechSymbols/views.py:257 msgid "Error" msgstr "错误" -#: generics/views.py:322 +#: generics/speechSymbols/views.py:322 msgid "" "For the edited unicode rule to apply, NVDA must be restarted. Press enter to " "restart NVDA, or cancel to exit at a later time." msgstr "为了让已编辑的 Unicode 生效,必须重新启动 NVDA,您要立即重新启动吗?" -#: generics/views.py:324 +#: generics/speechSymbols/views.py:324 msgid "unicode rule edited" msgstr "unicode 规则已编辑" @@ -218,63 +218,63 @@ msgstr "音调(&P)" msgid "V&olume:" msgstr "音量(&O)" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:78 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:77 +msgid "Number dot replacement" +msgstr "数字点替换文字" + +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:84 msgid "Detect text language based on unicode characters" msgstr "用 unicode 编码检测文本语言" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:84 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:90 msgid "Detect text language after symbol process" msgstr "在符号处理后检测文本语言" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:90 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:96 msgid "Ignore numbers when detecting text language" msgstr "检测语言时忽略数字" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:96 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:102 msgid "Ignore common punctuation when detecting text language" msgstr "检测语言时忽略数字和常见的标点符号" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:101 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:107 msgid "Language assumed for latin characters:" msgstr "拉丁字符对应的语言" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:111 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:117 msgid "Language assumed for CJK characters:" msgstr "中日韩字符对应的语言:" -#: synthDrivers/WorldVoiceXVED2/__init__.py:44 +#: synthDrivers/WorldVoiceXVED2/__init__.py:51 msgid "Number &Language" msgstr "数字语言(&M)" -#: synthDrivers/WorldVoiceXVED2/__init__.py:48 +#: synthDrivers/WorldVoiceXVED2/__init__.py:55 msgid "Number Language" msgstr "数字语言" -#: synthDrivers/WorldVoiceXVED2/__init__.py:53 +#: synthDrivers/WorldVoiceXVED2/__init__.py:60 msgid "Number &Mode" msgstr "数字模式(&M)" -#: synthDrivers/WorldVoiceXVED2/__init__.py:57 +#: synthDrivers/WorldVoiceXVED2/__init__.py:64 msgid "Number Mode" msgstr "数字模式" -#: synthDrivers/WorldVoiceXVED2/__init__.py:62 +#: synthDrivers/WorldVoiceXVED2/__init__.py:69 msgid "Pause time when encountering spaces between Chinese" msgstr "中文空格暂停时间" -#: synthDrivers/WorldVoiceXVED2/__init__.py:68 +#: synthDrivers/WorldVoiceXVED2/__init__.py:75 msgid "Ignore comma between number" msgstr "忽略数字中的逗号" -#: synthDrivers/WorldVoiceXVED2/__init__.py:73 -msgid "Ignore language information of document" -msgstr "忽略文档中的语言信息" - -#: synthDrivers/WorldVoiceXVED2/__init__.py:78 +#: synthDrivers/WorldVoiceXVED2/__init__.py:80 msgid "Enable WorldVoice setting rules to detect text language" msgstr "启用 WorldVoice 设定规则来检测文本语言" -#: synthDrivers/WorldVoiceXVED2/__init__.py:81 +#: synthDrivers/WorldVoiceXVED2/__init__.py:83 msgid "Enable WorldVoice rules" msgstr "启用 WorldVoice 规则" @@ -290,6 +290,9 @@ msgstr "数值" msgid "number" msgstr "数字" +#~ msgid "Ignore language information of document" +#~ msgstr "忽略文档中的语言信息" + #~ msgid "Automatic &Language Switching Settings" #~ msgstr "自动语言切换设定(&L)" diff --git a/addon/locale/zh_HK/LC_MESSAGES/nvda.po b/addon/locale/zh_HK/LC_MESSAGES/nvda.po index 26f01b6..3061e1b 100644 --- a/addon/locale/zh_HK/LC_MESSAGES/nvda.po +++ b/addon/locale/zh_HK/LC_MESSAGES/nvda.po @@ -7,108 +7,108 @@ msgid "" msgstr "" "Project-Id-Version: 'WorldVoice' '1.6'\n" "Report-Msgid-Bugs-To: 'nvda-translations@groups.io'\n" -"POT-Creation-Date: 2021-02-03 08:50+0800\n" -"PO-Revision-Date: 2021-02-03 08:51+0800\n" +"POT-Creation-Date: 2021-07-02 10:27+0800\n" +"PO-Revision-Date: 2021-07-02 10:28+0800\n" "Last-Translator: \n" "Language-Team: \n" "Language: zh_HK\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0\n" "X-Poedit-Basepath: ../../..\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Poedit-SearchPath-0: .\n" -#: generics/contextHelp.py:34 +#: generics/speechSymbols/contextHelp.py:34 msgid "No help available here." msgstr "無可用說明。" -#: generics/contextHelp.py:41 +#: generics/speechSymbols/contextHelp.py:41 msgid "No user guide found." msgstr "無找到使用者指南。" -#: generics/models.py:22 +#: generics/speechSymbols/models.py:22 msgid "context" msgstr "上下文" -#: generics/models.py:23 +#: generics/speechSymbols/models.py:23 msgid "force" msgstr "強制" -#: generics/views.py:33 +#: generics/speechSymbols/views.py:33 msgid "Add Symbol" msgstr "新增符號" -#: generics/views.py:38 +#: generics/speechSymbols/views.py:38 msgid "&Symbol:" msgstr "符號(&S)" -#: generics/views.py:61 +#: generics/speechSymbols/views.py:61 msgid "Unicode Setting" msgstr "Unicode 設定" -#: generics/views.py:85 +#: generics/speechSymbols/views.py:85 msgid "&Symbols" msgstr "符號(&S)" -#: generics/views.py:95 +#: generics/speechSymbols/views.py:95 msgid "Unicode" msgstr "Unicode" -#: generics/views.py:97 +#: generics/speechSymbols/views.py:97 msgid "Replacement" msgstr "替代文字" -#: generics/views.py:99 +#: generics/speechSymbols/views.py:99 msgid "Language" msgstr "語言" -#: generics/views.py:102 +#: generics/speechSymbols/views.py:102 msgid "Mode" msgstr "模式" -#: generics/views.py:106 +#: generics/speechSymbols/views.py:106 msgid "Change selected symbol" msgstr "變更選擇的符號" -#: generics/views.py:128 +#: generics/speechSymbols/views.py:128 msgid "&Replacement" msgstr "替代文字(&R)" -#: generics/views.py:136 +#: generics/speechSymbols/views.py:136 msgid "&language" msgstr "語言(&l)" -#: generics/views.py:141 +#: generics/speechSymbols/views.py:141 msgid "&Detect language mode" msgstr "偵測語言模式(&D)" -#: generics/views.py:148 +#: generics/speechSymbols/views.py:148 msgid "&Add" msgstr "新增(&A)" -#: generics/views.py:151 +#: generics/speechSymbols/views.py:151 msgid "Re&move" msgstr "移除(&M)" -#: generics/views.py:256 +#: generics/speechSymbols/views.py:256 #, python-format msgid "Symbol \"%s\" is already present." msgstr "符號 \"%s\" 已存在。" -#: generics/views.py:257 +#: generics/speechSymbols/views.py:257 msgid "Error" msgstr "錯誤" -#: generics/views.py:322 +#: generics/speechSymbols/views.py:322 msgid "" "For the edited unicode rule to apply, NVDA must be restarted. Press enter to " "restart NVDA, or cancel to exit at a later time." msgstr "" "為了讓已編輯的 unicode 生效, NVDA 必需重新啟動。您要立即重新啟動 NVDA 嗎?" -#: generics/views.py:324 +#: generics/speechSymbols/views.py:324 msgid "unicode rule edited" msgstr "unicode 規則已編輯" @@ -219,63 +219,63 @@ msgstr "音調(&P)" msgid "V&olume:" msgstr "音量(&O)" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:78 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:77 +msgid "Number dot replacement" +msgstr "數字點替代文字" + +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:84 msgid "Detect text language based on unicode characters" msgstr "用 unicode 編碼偵測文字語言" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:84 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:90 msgid "Detect text language after symbol process" msgstr "在符號處理後偵測文字語言" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:90 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:96 msgid "Ignore numbers when detecting text language" msgstr "偵測語言時忽略數字" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:96 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:102 msgid "Ignore common punctuation when detecting text language" msgstr "偵測語言時忽略常見標點符號" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:101 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:107 msgid "Language assumed for latin characters:" msgstr "拉丁字元假設的語言:" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:111 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:117 msgid "Language assumed for CJK characters:" msgstr "中日韓字元假設的語言:" -#: synthDrivers/WorldVoiceXVED2/__init__.py:44 +#: synthDrivers/WorldVoiceXVED2/__init__.py:51 msgid "Number &Language" msgstr "數字語言(&L)" -#: synthDrivers/WorldVoiceXVED2/__init__.py:48 +#: synthDrivers/WorldVoiceXVED2/__init__.py:55 msgid "Number Language" msgstr "數字語言" -#: synthDrivers/WorldVoiceXVED2/__init__.py:53 +#: synthDrivers/WorldVoiceXVED2/__init__.py:60 msgid "Number &Mode" msgstr "數字模式(&M)" -#: synthDrivers/WorldVoiceXVED2/__init__.py:57 +#: synthDrivers/WorldVoiceXVED2/__init__.py:64 msgid "Number Mode" msgstr "數字模式" -#: synthDrivers/WorldVoiceXVED2/__init__.py:62 +#: synthDrivers/WorldVoiceXVED2/__init__.py:69 msgid "Pause time when encountering spaces between Chinese" msgstr "當遇到中文與中文間的空白時暫停長度" -#: synthDrivers/WorldVoiceXVED2/__init__.py:68 +#: synthDrivers/WorldVoiceXVED2/__init__.py:75 msgid "Ignore comma between number" msgstr "忽略在數字間的逗號" -#: synthDrivers/WorldVoiceXVED2/__init__.py:73 -msgid "Ignore language information of document" -msgstr "忽略文件中的語言資訊" - -#: synthDrivers/WorldVoiceXVED2/__init__.py:78 +#: synthDrivers/WorldVoiceXVED2/__init__.py:80 msgid "Enable WorldVoice setting rules to detect text language" msgstr "啟用 WorldVoice 設定規則來偵測文字語言" -#: synthDrivers/WorldVoiceXVED2/__init__.py:81 +#: synthDrivers/WorldVoiceXVED2/__init__.py:83 msgid "Enable WorldVoice rules" msgstr "啟用 WorldVoice 規則" @@ -291,6 +291,9 @@ msgstr "數值" msgid "number" msgstr "數字" +#~ msgid "Ignore language information of document" +#~ msgstr "忽略文件中的語言資訊" + #~ msgid "Configure speech each voice." #~ msgstr "配置各別語音設定值。" diff --git a/addon/locale/zh_TW/LC_MESSAGES/nvda.po b/addon/locale/zh_TW/LC_MESSAGES/nvda.po index f46e748..62c87a5 100644 --- a/addon/locale/zh_TW/LC_MESSAGES/nvda.po +++ b/addon/locale/zh_TW/LC_MESSAGES/nvda.po @@ -7,108 +7,108 @@ msgid "" msgstr "" "Project-Id-Version: 'WorldVoice' '1.6'\n" "Report-Msgid-Bugs-To: 'nvda-translations@groups.io'\n" -"POT-Creation-Date: 2021-02-03 08:50+0800\n" -"PO-Revision-Date: 2021-02-03 08:51+0800\n" +"POT-Creation-Date: 2021-07-02 10:20+0800\n" +"PO-Revision-Date: 2021-07-02 10:24+0800\n" "Last-Translator: \n" "Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0\n" "X-Poedit-Basepath: ../../..\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Poedit-SearchPath-0: .\n" -#: generics/contextHelp.py:34 +#: generics/speechSymbols/contextHelp.py:34 msgid "No help available here." msgstr "無可用說明。" -#: generics/contextHelp.py:41 +#: generics/speechSymbols/contextHelp.py:41 msgid "No user guide found." msgstr "無找到使用者指南。" -#: generics/models.py:22 +#: generics/speechSymbols/models.py:22 msgid "context" msgstr "上下文" -#: generics/models.py:23 +#: generics/speechSymbols/models.py:23 msgid "force" msgstr "強制" -#: generics/views.py:33 +#: generics/speechSymbols/views.py:33 msgid "Add Symbol" msgstr "新增符號" -#: generics/views.py:38 +#: generics/speechSymbols/views.py:38 msgid "&Symbol:" msgstr "符號(&S)" -#: generics/views.py:61 +#: generics/speechSymbols/views.py:61 msgid "Unicode Setting" msgstr "Unicode 設定" -#: generics/views.py:85 +#: generics/speechSymbols/views.py:85 msgid "&Symbols" msgstr "符號(&S)" -#: generics/views.py:95 +#: generics/speechSymbols/views.py:95 msgid "Unicode" msgstr "Unicode" -#: generics/views.py:97 +#: generics/speechSymbols/views.py:97 msgid "Replacement" msgstr "替代文字" -#: generics/views.py:99 +#: generics/speechSymbols/views.py:99 msgid "Language" msgstr "語言" -#: generics/views.py:102 +#: generics/speechSymbols/views.py:102 msgid "Mode" msgstr "模式" -#: generics/views.py:106 +#: generics/speechSymbols/views.py:106 msgid "Change selected symbol" msgstr "變更選擇的符號" -#: generics/views.py:128 +#: generics/speechSymbols/views.py:128 msgid "&Replacement" msgstr "替代文字(&R)" -#: generics/views.py:136 +#: generics/speechSymbols/views.py:136 msgid "&language" msgstr "語言(&l)" -#: generics/views.py:141 +#: generics/speechSymbols/views.py:141 msgid "&Detect language mode" msgstr "偵測語言模式(&D)" -#: generics/views.py:148 +#: generics/speechSymbols/views.py:148 msgid "&Add" msgstr "新增(&A)" -#: generics/views.py:151 +#: generics/speechSymbols/views.py:151 msgid "Re&move" msgstr "移除(&M)" -#: generics/views.py:256 +#: generics/speechSymbols/views.py:256 #, python-format msgid "Symbol \"%s\" is already present." msgstr "符號 \"%s\" 已存在。" -#: generics/views.py:257 +#: generics/speechSymbols/views.py:257 msgid "Error" msgstr "錯誤" -#: generics/views.py:322 +#: generics/speechSymbols/views.py:322 msgid "" "For the edited unicode rule to apply, NVDA must be restarted. Press enter to " "restart NVDA, or cancel to exit at a later time." msgstr "" "為了讓已編輯的 unicode 生效, NVDA 必需重新啟動。您要立即重新啟動 NVDA 嗎?" -#: generics/views.py:324 +#: generics/speechSymbols/views.py:324 msgid "unicode rule edited" msgstr "unicode 規則已編輯" @@ -219,63 +219,63 @@ msgstr "音調(&P)" msgid "V&olume:" msgstr "音量(&O)" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:78 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:77 +msgid "Number dot replacement" +msgstr "數字點替代文字" + +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:84 msgid "Detect text language based on unicode characters" msgstr "用 unicode 編碼偵測文字語言" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:84 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:90 msgid "Detect text language after symbol process" msgstr "在符號處理後偵測文字語言" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:90 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:96 msgid "Ignore numbers when detecting text language" msgstr "偵測語言時忽略數字" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:96 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:102 msgid "Ignore common punctuation when detecting text language" msgstr "偵測語言時忽略常見標點符號" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:101 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:107 msgid "Language assumed for latin characters:" msgstr "拉丁字元假設的語言:" -#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:111 +#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:117 msgid "Language assumed for CJK characters:" msgstr "中日韓字元假設的語言:" -#: synthDrivers/WorldVoiceXVED2/__init__.py:44 +#: synthDrivers/WorldVoiceXVED2/__init__.py:51 msgid "Number &Language" msgstr "數字語言(&L)" -#: synthDrivers/WorldVoiceXVED2/__init__.py:48 +#: synthDrivers/WorldVoiceXVED2/__init__.py:55 msgid "Number Language" msgstr "數字語言" -#: synthDrivers/WorldVoiceXVED2/__init__.py:53 +#: synthDrivers/WorldVoiceXVED2/__init__.py:60 msgid "Number &Mode" msgstr "數字模式(&M)" -#: synthDrivers/WorldVoiceXVED2/__init__.py:57 +#: synthDrivers/WorldVoiceXVED2/__init__.py:64 msgid "Number Mode" msgstr "數字模式" -#: synthDrivers/WorldVoiceXVED2/__init__.py:62 +#: synthDrivers/WorldVoiceXVED2/__init__.py:69 msgid "Pause time when encountering spaces between Chinese" msgstr "當遇到中文與中文間的空白時暫停長度" -#: synthDrivers/WorldVoiceXVED2/__init__.py:68 +#: synthDrivers/WorldVoiceXVED2/__init__.py:75 msgid "Ignore comma between number" msgstr "忽略在數字間的逗號" -#: synthDrivers/WorldVoiceXVED2/__init__.py:73 -msgid "Ignore language information of document" -msgstr "忽略文件中的語言資訊" - -#: synthDrivers/WorldVoiceXVED2/__init__.py:78 +#: synthDrivers/WorldVoiceXVED2/__init__.py:80 msgid "Enable WorldVoice setting rules to detect text language" msgstr "啟用 WorldVoice 設定規則來偵測文字語言" -#: synthDrivers/WorldVoiceXVED2/__init__.py:81 +#: synthDrivers/WorldVoiceXVED2/__init__.py:83 msgid "Enable WorldVoice rules" msgstr "啟用 WorldVoice 規則" @@ -291,6 +291,9 @@ msgstr "數值" msgid "number" msgstr "數字" +#~ msgid "Ignore language information of document" +#~ msgstr "忽略文件中的語言資訊" + #~ msgid "Configure speech each voice." #~ msgstr "配置各別語音設定值。" diff --git a/addon/synthDrivers/WorldVoiceXVED2/__init__.py b/addon/synthDrivers/WorldVoiceXVED2/__init__.py index 3c83a63..9f099fb 100644 --- a/addon/synthDrivers/WorldVoiceXVED2/__init__.py +++ b/addon/synthDrivers/WorldVoiceXVED2/__init__.py @@ -118,9 +118,9 @@ def __init__(self): speech.speak = self.patchedSpeak speech.speakSpelling = self.patchedSpeakSpelling - speechSymbols = SpeechSymbols() - speechSymbols.load('unicode.dic') - self._languageDetector = languageDetection.LanguageDetector(list(self._voiceManager.languages), speechSymbols) + self.speechSymbols = SpeechSymbols() + self.speechSymbols.load('unicode.dic') + self._languageDetector = languageDetection.LanguageDetector(list(self._voiceManager.languages), self.speechSymbols) speech._speakWithoutPauses = speech.SpeechWithoutPauses(speakFunc=self.patchedSpeak) speech.speakWithoutPauses = speech._speakWithoutPauses.speakWithoutPauses @@ -157,7 +157,6 @@ def speak(self, speechSequence): and _config.vocalizerConfig['autoLanguageSwitching']['afterSymbolDetection']: speechSequence = self._languageDetector.add_detected_language_commands(speechSequence) speechSequence = list(speechSequence) - speechSequence = self.patchedNumSpeechSequence(speechSequence) speechSequence = self.patchedSpaceSpeechSequence(speechSequence) currentInstance = defaultInstance = self._voiceManager.defaultVoiceInstance.token @@ -232,13 +231,8 @@ def _speak(self, voiceInstance, chunks): def patchedSpeak(self, speechSequence, symbolLevel=None, priority=None): if self._cni: - temp = [] - for command in speechSequence: - if isinstance(command, str): - temp.append(comma_number_pattern.sub(lambda m:'', command)) - else: - temp.append(command) - speechSequence = temp + speechSequence = [comma_number_pattern.sub(lambda m:'', command) if isinstance(command, str) else command for command in speechSequence] + speechSequence = self.patchedNumSpeechSequence(speechSequence) if self.uwv \ and _config.vocalizerConfig['autoLanguageSwitching']['useUnicodeLanguageDetection'] \ and not _config.vocalizerConfig['autoLanguageSwitching']['afterSymbolDetection']: diff --git a/addon/synthDrivers/WorldVoiceXVED2/_config.py b/addon/synthDrivers/WorldVoiceXVED2/_config.py index 109ebf2..88aecb8 100644 --- a/addon/synthDrivers/WorldVoiceXVED2/_config.py +++ b/addon/synthDrivers/WorldVoiceXVED2/_config.py @@ -24,6 +24,7 @@ volume = integer(default=50,min=0,max=100) [autoLanguageSwitching] +numberDotReplacement = string(default=".") useUnicodeLanguageDetection = boolean(default=false) afterSymbolDetection = boolean(default=false) ignoreNumbersInLanguageDetection = boolean(default=false) @@ -39,7 +40,7 @@ def load(): global vocalizerConfig if not vocalizerConfig: path = os.path.join(globalVars.appArgs.configPath, VOCALIZER_CONFIG_FILENAME) - vocalizerConfig = configobj.ConfigObj(path, configspec=StringIO(_configSpec), encoding="utf-8") + vocalizerConfig = configobj.ConfigObj(path, configspec=StringIO(_configSpec), encoding="utf-8", default_encoding='utf8') vocalizerConfig.newlines = "\r\n" vocalizerConfig.stringify = True val = Validator() diff --git a/buildVars.py b/buildVars.py index 924f458..0e983dc 100644 --- a/buildVars.py +++ b/buildVars.py @@ -25,7 +25,7 @@ def _(arg): # Translators: Long description to be shown for this add-on on add-on information from add-ons manager "addon_description" : _("WorldVoice"), # version - "addon_version" : "1.7.1", + "addon_version" : "1.7.2", # Author(s) "addon_author" : "Tseng Woody ", # URL for the add-on documentation support