Example #1
0
    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}")
Example #2
0
    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)
Example #3
0
 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
Example #4
0
	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