]>
Commit | Line | Data |
---|---|---|
1 | #Boa:FramePanel:LanguageSelectPanel | |
2 | import os, sys | |
3 | import wx | |
4 | from wx.lib import langlistctrl | |
5 | from Main import opj | |
6 | ||
7 | ||
8 | # Normally you would just set _ to be a reference to the | |
9 | # wx.GetTranslation function, and then wrap all you literal strings in | |
10 | # _() function calls. Then everytime you use one of your literals, it | |
11 | # would first pass through the translation function and try to load a | |
12 | # translated version of the string from the current message catalogs. | |
13 | # For this example, since we are changinb language on the fly, and | |
14 | # since we are only translating the label for one widget, we'll not do | |
15 | # it the automatic way and we'll be more explicit. See the setup in | |
16 | # __init__() and the translation done in updateLanguage() below. | |
17 | ||
18 | _ = wx.GetTranslation | |
19 | ||
20 | exampleStrings = [ | |
21 | 'the quick brown fox jumps over the lazy dog', # demo string | |
22 | 'Tip of the Day', # wx built in translation | |
23 | 'Warning', # wx built in translation | |
24 | ] | |
25 | ||
26 | ||
27 | [wxID_LANGUAGESELECTPANEL, wxID_LANGUAGESELECTPANELENGLISHBASECH, | |
28 | wxID_LANGUAGESELECTPANELLANGCTRLCONTAINER, | |
29 | wxID_LANGUAGESELECTPANELLANGFILTERRB, wxID_LANGUAGESELECTPANELSTATICLINE1, | |
30 | wxID_LANGUAGESELECTPANELSTATICTEXT1, wxID_LANGUAGESELECTPANELSTATICTEXT2, | |
31 | wxID_LANGUAGESELECTPANELSTATICTEXT3, wxID_LANGUAGESELECTPANELTRANSLATEDST, | |
32 | ] = [wx.NewId() for _init_ctrls in range(9)] | |
33 | ||
34 | class LanguageSelectPanel(wx.Panel): | |
35 | def _init_coll_boxSizer3_Items(self, parent): | |
36 | # generated method, don't edit | |
37 | ||
38 | parent.AddWindow(self.langCtrlContainer, 1, border=0, flag=wx.GROW) | |
39 | parent.AddSpacer(wx.Size(8, 8), border=0, flag=0) | |
40 | parent.AddWindow(self.langFilterRB, 0, border=0, flag=0) | |
41 | ||
42 | def _init_coll_flexGridSizer1_Growables(self, parent): | |
43 | # generated method, don't edit | |
44 | ||
45 | parent.AddGrowableRow(1) | |
46 | parent.AddGrowableCol(0) | |
47 | ||
48 | def _init_coll_boxSizer1_Items(self, parent): | |
49 | # generated method, don't edit | |
50 | ||
51 | parent.AddWindow(self.staticText1, 0, border=8, flag=wx.ALL) | |
52 | parent.AddSizer(self.boxSizer3, 1, border=8, flag=wx.ALL | wx.GROW) | |
53 | parent.AddSizer(self.boxSizer2, 0, border=8, flag=wx.GROW | wx.ALL) | |
54 | ||
55 | def _init_coll_boxSizer2_Items(self, parent): | |
56 | # generated method, don't edit | |
57 | ||
58 | parent.AddWindow(self.staticText2, 0, border=8, flag=wx.ALL) | |
59 | parent.AddWindow(self.englishBaseCh, 0, border=8, flag=wx.GROW | wx.ALL) | |
60 | parent.AddWindow(self.staticLine1, 0, border=8, flag=wx.GROW | wx.ALL) | |
61 | parent.AddWindow(self.staticText3, 0, border=8, flag=wx.ALL) | |
62 | parent.AddWindow(self.translatedST, 0, border=8, flag=wx.GROW | wx.ALL) | |
63 | ||
64 | def _init_sizers(self): | |
65 | # generated method, don't edit | |
66 | self.boxSizer1 = wx.BoxSizer(orient=wx.VERTICAL) | |
67 | ||
68 | self.flexGridSizer1 = wx.FlexGridSizer(cols=2, hgap=8, rows=0, vgap=8) | |
69 | ||
70 | self.boxSizer3 = wx.BoxSizer(orient=wx.HORIZONTAL) | |
71 | ||
72 | self.boxSizer2 = wx.BoxSizer(orient=wx.VERTICAL) | |
73 | ||
74 | self._init_coll_boxSizer1_Items(self.boxSizer1) | |
75 | self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1) | |
76 | self._init_coll_boxSizer3_Items(self.boxSizer3) | |
77 | self._init_coll_boxSizer2_Items(self.boxSizer2) | |
78 | ||
79 | self.SetSizer(self.boxSizer1) | |
80 | ||
81 | def _init_ctrls(self, prnt): | |
82 | # generated method, don't edit | |
83 | wx.Panel.__init__(self, id=wxID_LANGUAGESELECTPANEL, | |
84 | name='LanguageSelectPanel', parent=prnt, | |
85 | style=wx.RESIZE_BORDER | wx.DEFAULT_DIALOG_STYLE) | |
86 | ||
87 | self.staticText1 = wx.StaticText(id=wxID_LANGUAGESELECTPANELSTATICTEXT1, | |
88 | label='Choose a language that will be used for example translation.', | |
89 | name='staticText1', parent=self, style=0) | |
90 | ||
91 | self.langCtrlContainer = wx.Panel(id=wxID_LANGUAGESELECTPANELLANGCTRLCONTAINER, | |
92 | name='langCtrlContainer', parent=self, style=wx.TAB_TRAVERSAL) | |
93 | self.langCtrlContainer.SetBackgroundColour(wx.Colour(255, 255, 255)) | |
94 | self.langCtrlContainer.Bind(wx.EVT_SIZE, self.OnLangCtrlContainerSize) | |
95 | ||
96 | self.langFilterRB = wx.RadioBox(choices=['Translated example languages', | |
97 | 'Available languages on your system', 'All languages'], | |
98 | id=wxID_LANGUAGESELECTPANELLANGFILTERRB, label='Filter', | |
99 | majorDimension=1, name='langFilterRB', parent=self, | |
100 | style=wx.RA_SPECIFY_COLS) | |
101 | self.langFilterRB.Bind(wx.EVT_RADIOBOX, self.OnLangFilterRBRadiobox, | |
102 | id=wxID_LANGUAGESELECTPANELLANGFILTERRB) | |
103 | ||
104 | self.staticText2 = wx.StaticText(id=wxID_LANGUAGESELECTPANELSTATICTEXT2, | |
105 | label='English Text:', name='staticText2', parent=self, | |
106 | style=0) | |
107 | ||
108 | self.staticText3 = wx.StaticText(id=wxID_LANGUAGESELECTPANELSTATICTEXT3, | |
109 | label='Translated Text:', name='staticText3', parent=self, | |
110 | style=0) | |
111 | ||
112 | self.englishBaseCh = wx.Choice(choices=self.choices, | |
113 | id=wxID_LANGUAGESELECTPANELENGLISHBASECH, name='englishBaseCh', | |
114 | parent=self, style=0) | |
115 | self.englishBaseCh.Bind(wx.EVT_CHOICE, self.OnLangSelectAndTranslate, | |
116 | id=wxID_LANGUAGESELECTPANELENGLISHBASECH) | |
117 | ||
118 | self.staticLine1 = wx.StaticLine(id=wxID_LANGUAGESELECTPANELSTATICLINE1, | |
119 | name='staticLine1', parent=self, style=0) | |
120 | ||
121 | self.translatedST = wx.StaticText(id=wxID_LANGUAGESELECTPANELTRANSLATEDST, | |
122 | label='', name='translatedST', parent=self, style=0) | |
123 | ||
124 | self._init_sizers() | |
125 | ||
126 | def __init__(self, parent, log): | |
127 | self.choices = [] | |
128 | self.choices = exampleStrings | |
129 | ||
130 | self._init_ctrls(parent) | |
131 | ||
132 | self.log = log | |
133 | ||
134 | lang = wx.LANGUAGE_DEFAULT | |
135 | filter = 'demo' | |
136 | langs = (wx.LANGUAGE_AFRIKAANS, wx.LANGUAGE_ENGLISH, wx.LANGUAGE_DEFAULT, | |
137 | wx.LANGUAGE_SPANISH, wx.LANGUAGE_GERMAN, wx.LANGUAGE_ITALIAN, | |
138 | wx.LANGUAGE_FRENCH) | |
139 | ||
140 | ||
141 | # usually you would define wx.Locale in your wx.App.OnInit class. | |
142 | # for the demo we just define it in this module | |
143 | self.locale = None | |
144 | wx.Locale.AddCatalogLookupPathPrefix(opj('data/locale')) | |
145 | self.updateLanguage(wx.LANGUAGE_DEFAULT) | |
146 | ||
147 | ||
148 | self.filterMap = {'demo': langlistctrl.LC_ONLY, | |
149 | 'available': langlistctrl.LC_AVAILABLE, | |
150 | 'all': langlistctrl.LC_ALL} | |
151 | ||
152 | self.filterIdxMap = {0: 'demo', | |
153 | 1: 'available', | |
154 | 2: 'all'} | |
155 | self.langs = langs | |
156 | self.langCtrl = langlistctrl.LanguageListCtrl(self.langCtrlContainer, -1, | |
157 | filter=self.filterMap[filter], only=langs, select=lang) | |
158 | ||
159 | self.langCtrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnLangSelectAndTranslate) | |
160 | self.langCtrl.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnClearTranslatedText) | |
161 | ||
162 | self.OnLangCtrlContainerSize() | |
163 | ||
164 | self.englishBaseCh.Select(0) | |
165 | self.OnLangSelectAndTranslate() | |
166 | ||
167 | ||
168 | def updateLanguage(self, lang): | |
169 | # Make *sure* any existing locale is deleted before the new | |
170 | # one is created. The old C++ object needs to be deleted | |
171 | # before the new one is created, and if we just assign a new | |
172 | # instance to the old Python variable, the old C++ locale will | |
173 | # not be destroyed soon enough, likely causing a crash. | |
174 | if self.locale: | |
175 | assert sys.getrefcount(self.locale) <= 2 | |
176 | del self.locale | |
177 | ||
178 | # create a locale object for this language | |
179 | self.locale = wx.Locale(lang) | |
180 | self.locale.AddCatalog('wxpydemo') | |
181 | ||
182 | def translateExample(self): | |
183 | self.translatedST.SetLabel(_(self.englishBaseCh.GetStringSelection())) | |
184 | ||
185 | def OnLangCtrlContainerSize(self, event=None): | |
186 | if event: event.Skip() | |
187 | self.langCtrl.SetSize(self.langCtrlContainer.GetSize()) | |
188 | ||
189 | def OnLangFilterRBRadiobox(self, event): | |
190 | self.langCtrl.SetUpFilter( | |
191 | self.filterMap[self.filterIdxMap[self.langFilterRB.GetSelection()]], | |
192 | self.langs) | |
193 | ||
194 | def OnLangSelectAndTranslate(self, event=None): | |
195 | lang = self.langCtrl.GetLanguage() | |
196 | ||
197 | if lang is not None: | |
198 | # set to the selected language | |
199 | self.updateLanguage(lang) | |
200 | ||
201 | self.translateExample() | |
202 | ||
203 | # set back to default | |
204 | self.updateLanguage(wx.LANGUAGE_DEFAULT) | |
205 | ||
206 | def OnClearTranslatedText(self, event): | |
207 | self.translatedST.SetLabel('') | |
208 | ||
209 | ||
210 | def runTest(frame, nb, log): | |
211 | win = LanguageSelectPanel(nb, log) | |
212 | return win | |
213 | ||
214 | #------------------------------------------------------------------------------- | |
215 | ||
216 | overview = """<html><body> | |
217 | <h2>Internationalization (I18N)</h2> | |
218 | <p> | |
219 | This demo demonstrates how to setup and use the wx.Locale object to translate text. | |
220 | <p> | |
221 | It also shows the langlistctrl.LanguageListCtrl that can be used to display | |
222 | languages with their associated countries flags, e.g. for setting the language | |
223 | in your application. | |
224 | ||
225 | </body></html> | |
226 | """ | |
227 | ||
228 | if __name__ == '__main__': | |
229 | import sys,os | |
230 | import run | |
231 | run.main(['', os.path.basename(sys.argv[0])]) |