def test_NVDASupportedLanguages_LanguageIsSetCorrectly(self): """ Tests languageHandler.setLanguage, using all NVDA supported languages, which should do the following: - set the translation service and languageHandler.curLang - set the windows locale for the thread (fallback to system default) - set the python locale for the thread (match the translation service, fallback to system default) """ for localeName in TRANSLATABLE_LANGS: with self.subTest(localeName=localeName): langOnly = localeName.split("_")[0] languageHandler.setLanguage(localeName) # check curLang/translation service is set self.assertEqual(languageHandler.curLang, localeName) # check Windows thread is set threadLocale = ctypes.windll.kernel32.GetThreadLocale() threadLocaleName = languageHandler.windowsLCIDToLocaleName( threadLocale) threadLocaleLang = threadLocaleName.split("_")[0] if localeName in UNSUPPORTED_WIN_LANGUAGES: # our translatable locale isn't supported by windows # check that the system locale is unchanged self.assertEqual(self._defaultThreadLocaleName, threadLocaleName) else: # check that the language codes are correctly set for the thread self.assertEqual( langOnly, threadLocaleLang, f"full values: {localeName} {threadLocaleName}", ) # check that the python locale is set python_locale = locale.setlocale(locale.LC_ALL) if localeName in UNSUPPORTED_WIN_LANGUAGES: # our translatable locale isn't supported by python # check that the system locale is unchanged self.assertEqual(self._defaultPythonLocale, python_locale) else: # check that the language codes are correctly set for python # They can be set to the exact locale that was requested, to the locale gotten # from the language name if language_country cannot be set # or just to English name of the language. lang_country = languageHandler.localeStringFromLocaleCode( localeName) possibleVariants = {lang_country} if "65001" in lang_country: # Python normalizes Unicode Windows code page to 'utf8' possibleVariants.add( lang_country.replace("65001", "utf8")) if "_" in lang_country: possibleVariants.add( languageHandler.localeStringFromLocaleCode( localeName.split("_")[0])) possibleVariants.add( languageHandler.englishLanguageNameFromNVDALocale( localeName)) self.assertIn( locale.setlocale(locale.LC_ALL), possibleVariants, f"full values: {localeName} {python_locale}")
def __init__(self, *args, **kwargs): self._prevLang = languageHandler.getLanguage() ctypes.windll.kernel32.SetThreadLocale(0) defaultThreadLocale = ctypes.windll.kernel32.GetThreadLocale() self._defaultThreadLocaleName = languageHandler.windowsLCIDToLocaleName( defaultThreadLocale) locale.setlocale(locale.LC_ALL, "") self._defaultPythonLocale = locale.setlocale(locale.LC_ALL) languageHandler.setLanguage(self._prevLang) super().__init__(*args, **kwargs)
def _getFormatFieldAtRange(self, range, formatConfig): formatField = textInfos.FormatField() fontObj = None paraFormatObj = None if formatConfig["reportAlignment"]: if not paraFormatObj: paraFormatObj = range.para alignment = paraFormatObj.alignment if alignment == comInterfaces.tom.tomAlignLeft: formatField["text-align"] = "left" elif alignment == comInterfaces.tom.tomAlignCenter: formatField["text-align"] = "center" elif alignment == comInterfaces.tom.tomAlignRight: formatField["text-align"] = "right" elif alignment == comInterfaces.tom.tomAlignJustify: formatField["text-align"] = "justify" if formatConfig["reportLineNumber"]: formatField["line-number"] = range.getIndex( comInterfaces.tom.tomLine) if formatConfig["reportFontName"]: if not fontObj: fontObj = range.font formatField["font-name"] = fontObj.name if formatConfig["reportFontSize"]: if not fontObj: fontObj = range.font formatField["font-size"] = "%spt" % fontObj.size if formatConfig["reportFontAttributes"]: if not fontObj: fontObj = range.font formatField["bold"] = bool(fontObj.bold) formatField["italic"] = bool(fontObj.italic) formatField["underline"] = bool(fontObj.underline) formatField["strikethrough"] = bool(fontObj.StrikeThrough) if fontObj.superscript: formatField["text-position"] = "super" elif fontObj.subscript: formatField["text-position"] = "sub" if formatConfig["reportLinks"]: linkRange = range.Duplicate linkRange.Collapse(comInterfaces.tom.tomStart) formatField["link"] = linkRange.Expand( comInterfaces.tom.tomLink) > 0 if formatConfig["reportColor"]: if not fontObj: fontObj = range.font fgColor = fontObj.foreColor if fgColor == comInterfaces.tom.tomAutoColor: # Translators: The default color of text when a color has not been set by the author. formatField['color'] = _("default color") elif fgColor & 0xff000000: # The color is a palet index (we don't know the palet) # Translators: The color of text cannot be detected. formatField['color'] = _("Unknown color") else: formatField["color"] = colors.RGB.fromCOLORREF(fgColor) bkColor = fontObj.backColor if bkColor == comInterfaces.tom.tomAutoColor: # Translators: The default background color when a color has not been set by the author. formatField['background-color'] = _("default color") elif bkColor & 0xff000000: # The color is a palet index (we don't know the palet) # Translators: The background color cannot be detected. formatField['background-color'] = _("Unknown color") else: formatField["background-color"] = colors.RGB.fromCOLORREF( bkColor) if not fontObj: fontObj = range.font try: langId = fontObj.languageID if langId: formatField[ 'language'] = languageHandler.windowsLCIDToLocaleName( langId) except: log.debugWarning("language error", exc_info=True) pass return formatField
def _getFormatFieldAtRange(self,range,formatConfig): formatField=textInfos.FormatField() fontObj=None paraFormatObj=None if formatConfig["reportAlignment"]: if not paraFormatObj: paraFormatObj=range.para alignment=paraFormatObj.alignment if alignment==comInterfaces.tom.tomAlignLeft: formatField["text-align"]="left" elif alignment==comInterfaces.tom.tomAlignCenter: formatField["text-align"]="center" elif alignment==comInterfaces.tom.tomAlignRight: formatField["text-align"]="right" elif alignment==comInterfaces.tom.tomAlignJustify: formatField["text-align"]="justify" if formatConfig["reportLineNumber"]: formatField["line-number"]=range.getIndex(comInterfaces.tom.tomLine) if formatConfig["reportFontName"]: if not fontObj: fontObj=range.font formatField["font-name"]=fontObj.name if formatConfig["reportFontSize"]: if not fontObj: fontObj=range.font formatField["font-size"]="%spt"%fontObj.size if formatConfig["reportFontAttributes"]: if not fontObj: fontObj=range.font formatField["bold"]=bool(fontObj.bold) formatField["italic"]=bool(fontObj.italic) formatField["underline"]=bool(fontObj.underline) formatField["strikethrough"]=bool(fontObj.StrikeThrough) if fontObj.superscript: formatField["text-position"]="super" elif fontObj.subscript: formatField["text-position"]="sub" if formatConfig["reportLinks"]: linkRange=range.Duplicate linkRange.Collapse(comInterfaces.tom.tomStart) formatField["link"]=linkRange.Expand(comInterfaces.tom.tomLink)>0 if formatConfig["reportColor"]: if not fontObj: fontObj=range.font fgColor=fontObj.foreColor if fgColor==comInterfaces.tom.tomAutoColor: # Translators: The default color of text when a color has not been set by the author. formatField['color']=_("default color") elif fgColor&0xff000000: # The color is a palet index (we don't know the palet) # Translators: The color of text cannot be detected. formatField['color']=_("Unknown color") else: formatField["color"]=colors.RGB.fromCOLORREF(fgColor) bkColor=fontObj.backColor if bkColor==comInterfaces.tom.tomAutoColor: # Translators: The default background color when a color has not been set by the author. formatField['background-color']=_("default color") elif bkColor&0xff000000: # The color is a palet index (we don't know the palet) # Translators: The background color cannot be detected. formatField['background-color']=_("Unknown color") else: formatField["background-color"]=colors.RGB.fromCOLORREF(bkColor) if not fontObj: fontObj=range.font try: langId = fontObj.languageID if langId: formatField['language']=languageHandler.windowsLCIDToLocaleName(langId) except: log.debugWarning("language error",exc_info=True) pass return formatField