Module languageHandler
[hide private]
[frames] | no frames]

Source Code for Module languageHandler

  1  import config 
  2  import os 
  3  import ctypes 
  4  import locale 
  5  import gettext 
  6   
  7  #a few Windows locale constants 
  8  LOCALE_SLANGUAGE=0x2 
  9  LOCALE_SLANGDISPLAYNAME=0x6f 
 10   
 11  curLang="en" 
 12   
13 -def localeNameToWindowsLCID(localeName):
14 """Retreave the Windows locale identifier (LCID) for the given locale name 15 @param localeName: a string of 2letterLanguage_2letterCountry or or just 2letterLanguage 16 @type localeName: string 17 @returns: a Windows LCID 18 @rtype: integer 19 """ 20 localeName=locale.normalize(localeName) 21 if '.' in localeName: 22 localeName=localeName.split('.')[0] 23 #Windows Vista is able to convert locale names to LCIDs 24 func_LocaleNameToLCID=getattr(ctypes.windll.kernel32,'LocaleNameToLCID',None) 25 if func_LocaleNameToLCID is not None: 26 localeName=localeName.replace('_','-') 27 LCID=func_LocaleNameToLCID(unicode(localeName),0) 28 else: #Windows doesn't have this functionality, manually search Python's windows_locale dictionary for the LCID 29 LCList=[x[0] for x in locale.windows_locale.iteritems() if x[1]==localeName] 30 if len(LCList)>0: 31 LCID=LCList[0] 32 else: 33 LCID=0 34 return LCID
35
36 -def getLanguageDescription(language):
37 """Finds out the description (licalized full name) of a given local name""" 38 LCID=localeNameToWindowsLCID(language) 39 if LCID==0: return None 40 buf=ctypes.create_unicode_buffer(1024) 41 #If the original locale didn't have country info (was just language) then make sure we just get language from Windows 42 if '_' not in language: 43 res=ctypes.windll.kernel32.GetLocaleInfoW(LCID,LOCALE_SLANGDISPLAYNAME,buf,1024) 44 else: 45 res=0 46 if res==0: 47 res=ctypes.windll.kernel32.GetLocaleInfoW(LCID,LOCALE_SLANGUAGE,buf,1024) 48 sLanguage=buf.value 49 return sLanguage
50
51 -def getAvailableLanguages():
52 """generates a list of locale names, plus their full localized language and country names. 53 @rtype: list of tuples 54 """ 55 #Make a list of all the locales found in NVDA's locale dir 56 l=[x for x in os.listdir('locale') if not x.startswith('.')] 57 l=[x for x in l if os.path.isfile('locale/%s/LC_MESSAGES/nvda.mo'%x)] 58 #Make sure that en (english) is in the list as it may not have any locale files, but is default 59 if 'en' not in l: 60 l.append('en') 61 l.sort() 62 #For each locale, ask Windows for its human readable display name 63 d=[] 64 for i in l: 65 desc=getLanguageDescription(i) 66 label="%s, %s"%(desc,i) if desc else i 67 d.append(label) 68 #include a 'user default, windows' language, which just represents the default language for this user account 69 l.append("Windows") 70 d.append("User default, windows") 71 #return a zipped up version of both the lists (a list with tuples of locale,label) 72 return zip(l,d)
73
74 -def setLanguage(lang):
75 global curLang 76 try: 77 if lang=="Windows": 78 windowsLCID=ctypes.windll.kernel32.GetUserDefaultUILanguage() 79 localeName=locale.windows_locale[windowsLCID] 80 gettext.translation('nvda',localedir='locale',languages=[localeName]).install(True) 81 curLang=localeName 82 else: 83 gettext.translation("nvda", localedir="locale", languages=[lang]).install(True) 84 curLang=lang 85 localeChanged=False 86 #Try setting Python's locale to lang 87 try: 88 locale.setlocale(locale.LC_ALL,lang) 89 localeChanged=True 90 except: 91 pass 92 if not localeChanged and '_' in lang: 93 #Python couldn'tsupport the language_country locale, just try language. 94 try: 95 locale.setlocale(locale.LC_ALL,lang.split('_')[0]) 96 except: 97 pass 98 #Set the windows locale for this thread (NVDA core) to this locale. 99 LCID=localeNameToWindowsLCID(lang) 100 ctypes.windll.kernel32.SetThreadLocale(LCID) 101 config.conf["general"]["language"]=lang 102 return True 103 except IOError: 104 gettext.install("nvda", unicode=True) 105 curLang="en" 106 return False
107
108 -def getLanguage():
109 return curLang
110
111 -def normalizeLanguage(lang):
112 """ 113 Normalizes a language-dialect string in to a standard form we can deal with. 114 Converts any dash to underline, and makes sure that language is lowercase and dialect is upercase. 115 """ 116 lang=lang.replace('-','_') 117 ld=lang.split('_') 118 ld[0]=ld[0].lower() 119 #Filter out meta languages such as x-western 120 if ld[0]=='x': 121 return None 122 if len(ld)>=2: 123 ld[1]=ld[1].upper() 124 return "_".join(ld)
125