1 import config
2 import os
3 import ctypes
4 import locale
5 import gettext
6
7
8 LOCALE_SLANGUAGE=0x2
9 LOCALE_SLANGDISPLAYNAME=0x6f
10
11 curLang="en"
12
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
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:
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
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
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
52 """generates a list of locale names, plus their full localized language and country names.
53 @rtype: list of tuples
54 """
55
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
59 if 'en' not in l:
60 l.append('en')
61 l.sort()
62
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
69 l.append("Windows")
70 d.append("User default, windows")
71
72 return zip(l,d)
73
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
87 try:
88 locale.setlocale(locale.LC_ALL,lang)
89 localeChanged=True
90 except:
91 pass
92 if not localeChanged and '_' in lang:
93
94 try:
95 locale.setlocale(locale.LC_ALL,lang.split('_')[0])
96 except:
97 pass
98
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
110
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
120 if ld[0]=='x':
121 return None
122 if len(ld)>=2:
123 ld[1]=ld[1].upper()
124 return "_".join(ld)
125