Merge lp:~ev/ubiquity/translated_layouts into lp:ubiquity

Proposed by Evan
Status: Merged
Merged at revision: not available
Proposed branch: lp:~ev/ubiquity/translated_layouts
Merge into: lp:ubiquity
Diff against target: 292 lines (+121/-33)
5 files modified
.bzrignore (+1/-0)
d-i/make-keyboard-names (+82/-20)
debian/rules (+7/-1)
debian/ubiquity.install-any (+1/-0)
ubiquity/components/ubi-console-setup.py (+30/-12)
To merge this branch: bzr merge lp:~ev/ubiquity/translated_layouts
Reviewer Review Type Date Requested Status
Ubuntu Installer Team Pending
Review via email: mp+17461@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Evan (ev) wrote :

I know you guys are busy, but I wanted to give everyone an opportunity to review this before I landed it on trunk. This and the accompanying console-setup branch add translated keyboard names to ubiquity, per the foundations-lucid-oem-config-localized-keyboard-layout specification.

I'm not entirely sold on shoving 1.5M of text into Python data structures. If it's an issue for the rest of you, I'll do away with keyboard_names.py and modify ubiquity to directly scan the kbdnames.gz file.

Please also see lp:~ev/console-setup/translated_layouts (merged from Debian), which is a prerequisite for this branch.

Thanks

lp:~ev/ubiquity/translated_layouts updated
3658. By Evan

Unbreak KDE keyboard layout handling.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.bzrignore'
2--- .bzrignore 2010-01-20 12:15:00 +0000
3+++ .bzrignore 2010-01-20 23:36:15 +0000
4@@ -5,6 +5,7 @@
5 ./build-stamp
6 debian/build
7 debian/files
8+debian/kbdnames.gz
9 debian/oem-config
10 debian/oem-config-check
11 debian/oem-config-debconf
12
13=== modified file 'd-i/make-keyboard-names'
14--- d-i/make-keyboard-names 2006-10-02 18:34:01 +0000
15+++ d-i/make-keyboard-names 2010-01-20 23:36:15 +0000
16@@ -3,8 +3,12 @@
17 # Derived from console-setup/Keyboard/kbdnames-maker, by Anton Zinoviev.
18 # Mangled to produce a Python module by Colin Watson.
19
20+# This needs to die in a big chemical fire.
21+
22 use warnings 'all';
23 use strict;
24+use Locale::gettext;
25+use POSIX;
26
27 my $file;
28
29@@ -23,43 +27,101 @@
30 print "# Instead of editing this file, it is better to edit the original and\n";
31 print "# regenerate this.\n\n";
32
33-print "models = {\n";
34+print "lang = {\n";
35+print " 'C': {\n";
36+print " 'models' : {\n";
37 for my $model (sort keys %KeyboardNames::models) {
38 my $name = $KeyboardNames::models{$model};
39 (my $modelesc = $model) =~ s/'/\\'/;
40- print " '$modelesc': '$name',\n";
41+ print " '$modelesc': '$name',\n";
42 }
43-print "}\n\n";
44-print "models_rev = {}\n";
45-print "models_rev.update(((v, k) for (k, v) in models.iteritems()))\n\n";
46+print " },\n";
47+print " 'models_rev' : {},\n";
48
49 my %layouts_rev;
50-print "layouts = {\n";
51+print " 'layouts' : {\n";
52 for my $layout (sort keys %KeyboardNames::layouts) {
53 my $name = $KeyboardNames::layouts{$layout};
54 $layouts_rev{$name} = $layout;
55 (my $layoutesc = $layout) =~ s/'/\\'/g;
56- print " '$layoutesc': '$name',\n";
57+ print " '$layoutesc': '$name',\n";
58 }
59-print "}\n\n";
60-print "layouts_rev = {}\n";
61-print "layouts_rev.update(((v, k) for (k, v) in layouts.iteritems()))\n\n";
62+print " },\n";
63+print " 'layouts_rev' : {},\n";
64
65-print "variants = {\n";
66+print " 'variants' : {\n";
67 for my $layout (sort keys %KeyboardNames::variants) {
68 my $desc = $layouts_rev{$layout};
69- print " '$layout': {\n";
70+ print " '$layout': {\n";
71 (my $layoutesc = $desc) =~ s/'/\\'/g;
72- print " '$layoutesc': '',\n";
73+ print " '$layoutesc': '',\n";
74 for my $variant (sort keys %{$KeyboardNames::variants{$layout}}) {
75 my $variantname = $KeyboardNames::variants{$layout}{$variant};
76 (my $variantesc = "$desc - $variant") =~ s/'/\\'/g;
77- print " '$variantesc': '$variantname',\n";
78- }
79+ print " '$variantesc': '$variantname',\n";
80+ }
81+ print " },\n";
82+}
83+print " },\n";
84+print " 'variants_rev' : {},\n";
85+print " },\n";
86+
87+# Make sure we output UTF-8
88+$ENV{'LC_ALL'} = "en_US.UTF-8";
89+binmode STDOUT, ":utf8";
90+
91+for my $mo (</usr/share/locale/*/LC_MESSAGES/xkeyboard-config.mo>) {
92+ my $lang = $mo;
93+ $lang =~ s:/usr/share/locale/(.*)/LC_MESSAGES/xkeyboard-config.mo:$1:;
94+ $ENV{'LANGUAGE'} = $lang;
95+ setlocale(LC_ALL,"");
96+
97+ $lang =~ s:\@:__:;
98+ $lang =~ s:__Latn:__latin:; # special fixup for sr
99+
100+ my $d = Locale::gettext->domain("xkeyboard-config");
101+
102+ print " '$lang': {\n";
103+ print " 'models': {\n";
104+ for my $model (sort keys %KeyboardNames::models) {
105+ my $name = $KeyboardNames::models{$model};
106+ (my $local_model = $d->get($model)) =~ s/'/\\'/g;
107+ print " u'$local_model': '$name',\n"
108+ }
109+ print " },\n";
110+ print " 'models_rev' : {},\n";
111+ print " 'layouts' : {\n";
112+ for my $layout (sort keys %KeyboardNames::layouts) {
113+ my $name = $KeyboardNames::layouts{$layout};
114+ my $local_layout = $d->get($layout);
115+ (my $layoutesc = $local_layout) =~ s/'/\\'/g;
116+ print " u'$layoutesc': '$name',\n";
117+ }
118+ print " },\n";
119+ print " 'layouts_rev' : {},\n";
120+ print " 'variants' : {\n";
121+ for my $layout (sort keys %KeyboardNames::variants) {
122+ my $local_desc = $d->get($layouts_rev{$layout});
123+ print " '$layout': {\n";
124+ (my $layoutesc = $local_desc) =~ s/'/\\'/g;
125+ print " u'$layoutesc': '',\n";
126+ for my $variant (sort keys %{$KeyboardNames::variants{$layout}}) {
127+ my $local_variant = $d->get($variant);
128+ my $variantname = $KeyboardNames::variants{$layout}{$variant};
129+ (my $variantesc = "$local_desc - $local_variant") =~ s/'/\\'/g;
130+ print " u'$variantesc': '$variantname',\n";
131+ }
132+ print " },\n";
133+ }
134+ print " },\n";
135+ print " 'variants_rev' : {},\n";
136 print " },\n";
137 }
138-print "}\n\n";
139-print "variants_rev = {}\n";
140-print "for layoutname in variants.keys():\n";
141-print " variants_rev[layoutname] = {}\n";
142-print " variants_rev[layoutname].update(((v, k) for (k, v) in variants_rev[layoutname].iteritems()))\n";
143+
144+print "}\n";
145+print "for l in lang:\n";
146+print " lang[l]['models_rev'].update(((v, k) for (k, v) in lang[l]['models'].iteritems()))\n";
147+print " lang[l]['layouts_rev'].update(((v, k) for (k, v) in lang[l]['layouts'].iteritems()))\n";
148+print " for layoutname in lang[l]['variants'].keys():\n";
149+print " lang[l]['variants_rev'][layoutname] = {}\n";
150+print " lang[l]['variants_rev'][layoutname].update(((v, k) for (k, v) in lang[l]['variants_rev'][layoutname].iteritems()))\n";
151
152=== modified file 'debian/rules'
153--- debian/rules 2009-11-27 20:38:59 +0000
154+++ debian/rules 2010-01-20 23:36:15 +0000
155@@ -57,6 +57,7 @@
156 $(MAKE) -C d-i clean
157 dh_auto_clean
158 dh_clean
159+ rm -f debian/kbdnames.gz
160
161 $(MAKE) -C d-i check
162
163@@ -64,11 +65,16 @@
164 $(MAKE) -C d-i/source/console-setup/Keyboard MyKeyboardNames.pl \
165 xkbdir=/usr/share/X11/xkb
166
167+debian/kbdnames.gz: d-i/source/console-setup/Keyboard/MyKeyboardNames.pl
168+ ( cd d-i/source/console-setup/Keyboard \
169+ && ./kbdnames-maker MyKeyboardNames.pl \
170+ | grep -v '^C[*]' | grep -v '[*]model[*]' | sort | gzip -9 ) >$@
171+
172 ubiquity/keyboard_names.py: d-i/source/console-setup/Keyboard/MyKeyboardNames.pl
173 d-i/make-keyboard-names $< > $@
174
175 install: DH_OPTIONS=
176-install: build ubiquity/keyboard_names.py
177+install: build ubiquity/keyboard_names.py debian/kbdnames.gz
178 dh_testdir
179 dh_testroot
180 dh_prep
181
182=== modified file 'debian/ubiquity.install-any'
183--- debian/ubiquity.install-any 2009-11-27 20:38:59 +0000
184+++ debian/ubiquity.install-any 2010-01-20 23:36:16 +0000
185@@ -42,6 +42,7 @@
186 compat/locale usr/lib/ubiquity/console-setup
187 scripts/console-setup-apply usr/lib/ubiquity
188 ubiquity/components/ubi-console-setup.py usr/lib/ubiquity/plugins
189+debian/kbdnames.gz usr/share/console-setup-mini
190
191 # debian-installer-utils
192 d-i/source/debian-installer-utils/block-attr bin
193
194=== modified file 'ubiquity/components/ubi-console-setup.py'
195--- ubiquity/components/ubi-console-setup.py 2010-01-19 16:21:02 +0000
196+++ ubiquity/components/ubi-console-setup.py 2010-01-20 23:36:16 +0000
197@@ -208,10 +208,11 @@
198
199 def on_keyboard_layout_selected(self):
200 layout = self.get_keyboard()
201+ l = self.controller.dbfilter.get_locale()
202 if layout is not None:
203 #skip updating keyboard if not using display
204 if self.keyboardDisplay:
205- ly = keyboard_names.layouts[unicode(layout)]
206+ ly = keyboard_names.lang[l]['layouts'][unicode(layout)]
207 self.keyboardDisplay.setLayout(ly)
208
209 #no variants, force update by setting none
210@@ -227,9 +228,10 @@
211
212 if self.keyboardDisplay:
213 var = None
214- ly = keyboard_names.layouts[layout]
215+ l = self.controller.dbfilter.get_locale()
216+ ly = keyboard_names.lang[l]['layouts'][layout]
217 if variant and keyboard_names.variants.has_key(ly):
218- variantMap = keyboard_names.variants[ly]
219+ variantMap = keyboard_names.lang[l]['variants'][ly]
220 var = variantMap[unicode(variant)]
221
222 self.keyboardDisplay.setVariant(var)
223@@ -254,7 +256,8 @@
224 self.page.keyboard_layout_combobox.setCurrentIndex(index)
225
226 if self.keyboardDisplay:
227- ly = keyboard_names.layouts[unicode(layout)]
228+ l = self.controller.dbfilter.get_locale()
229+ ly = keyboard_names.lang[l]['layouts'][unicode(layout)]
230 self.keyboardDisplay.setLayout(ly)
231
232 def get_keyboard(self):
233@@ -278,9 +281,10 @@
234
235 if self.keyboardDisplay:
236 var = None
237- layout = keyboard_names.layouts[self.get_keyboard()]
238- if variant and keyboard_names.variants.has_key(layout):
239- variantMap = keyboard_names.variants[layout]
240+ l = self.controller.dbfilter.get_locale()
241+ layout = keyboard_names.lang[l]['layouts'][self.get_keyboard()]
242+ if variant and keyboard_names.lang[l]['variants'].has_key(layout):
243+ variantMap = keyboard_names.lang[l]['variants'][layout]
244 var = variantMap[unicode(variant)]
245
246 self.keyboardDisplay.setVariant(var)
247@@ -342,6 +346,16 @@
248 self.db.fset('console-setup/model', 'seen', 'false')
249 self.db.fset('console-setup/codeset', 'seen', 'false')
250
251+ # Roughly taken from console-setup's config.proto:
252+ l = self.db.get('debian-installer/locale').rsplit('.', 1)[0]
253+ if l not in keyboard_names.lang:
254+ self.debug("Untranslated layout '%s'" % l)
255+ l = l.rsplit('_', 1)[0]
256+ if l not in keyboard_names.lang:
257+ self.debug("Untranslated layout '%s'" % l)
258+ l = 'C'
259+ self._locale = l
260+
261 # Technically we should provide a version as the second argument,
262 # but that isn't currently needed and it would require querying
263 # apt/dpkg for the current version, which would be slow, so we don't
264@@ -498,19 +512,23 @@
265
266 return (real_model, real_layout, real_variant, real_options)
267
268+ def get_locale(self):
269+ return self._locale
270+
271 def apply_keyboard(self, layout, variant):
272 model = self.db.get('console-setup/modelcode')
273
274- if layout not in keyboard_names.layouts:
275+ l = self.get_locale()
276+ if layout not in keyboard_names.lang[l]['layouts']:
277 self.debug("Unknown keyboard layout '%s'" % layout)
278 return
279- layout = keyboard_names.layouts[layout]
280+ layout = keyboard_names.lang[l]['layouts'][layout]
281
282- if layout not in keyboard_names.variants:
283+ if layout not in keyboard_names.lang[l]['variants']:
284 self.debug("No known variants for layout '%s'" % layout)
285 variant = ''
286- elif variant in keyboard_names.variants[layout]:
287- variant = keyboard_names.variants[layout][variant]
288+ elif variant in keyboard_names.lang[l]['variants'][layout]:
289+ variant = keyboard_names.lang[l]['variants'][layout][variant]
290 else:
291 self.debug("Unknown keyboard variant '%s' for layout '%s'" %
292 (variant, layout))

Subscribers

People subscribed via source and target branches

to status/vote changes: