Merge pull request #762 from mwhudson/better-language-lists

make language list at snap build time
This commit is contained in:
Michael Hudson-Doyle 2020-05-21 14:37:52 +12:00 committed by GitHub
commit 6b0428b095
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 132 additions and 32 deletions

28
languagelist Normal file
View File

@ -0,0 +1,28 @@
console:en_US:English
console:en_GB:English (UK)
ssh:kab:Tamaziɣt Taqbaylit
console:ca:Català
ssh:zh_CN:中文(简体)
console:hr:Hrvatski
console:cs:Čeština
console:ast:Asturianu
console:be:Беларуская
console:nl:Nederlands
console:fi:Suomi
console:fr:Français
console:de:Deutsch
console:el:Ελληνικά
ssh:he:עברית
console:hu:Magyar
console:id:Bahasa Indonesia
console:lv:Latviski
console:lt:Lietuviškai
console:pl:Polski
console:ru:Русский
console:sr:Српски
console:es:Español
console:sv:Svenska
ssh:bo:བོད་ཡིག
console:uk:Українська
console:nb:Norsk bokmål
ssh:oc:Galés

69
scripts/make-language-lists Executable file
View File

@ -0,0 +1,69 @@
#!/usr/bin/python3
import gettext
import glob
import gzip
import os
import sys
DATA_PATH = '/usr/share/localechooser/languagelist.data.gz'
lang_dir = 'po'
if len(sys.argv) > 1:
lang_dir = sys.argv[1]
translations = set()
for fname in glob.glob('{}/*.po'.format(lang_dir)):
translations.add(os.path.splitext(os.path.basename(fname))[0])
if not translations:
print("found no languages", file=sys.stderr)
sys.exit(1)
langs = [
('console', 'en_US', 'English'),
('console', 'en_GB', 'English (UK)'),
('ssh', 'kab', 'Tamaziɣt Taqbaylit'),
]
for level, code, name in langs:
if code in translations:
translations.remove(code)
def kind_for_level(level):
if int(level) <= 2:
return "console"
else:
return "ssh"
with gzip.open(DATA_PATH, mode='rt') as data:
for line in data:
level, code, name, desc = line.strip().split(':')
if code not in translations:
continue
langs.append((kind_for_level(level), code, desc))
translations.remove(code)
with gzip.open(DATA_PATH, mode='rt') as data:
for line in data:
level, code, name, desc = line.strip().split(':')
code = code.split("_", 1)[0]
if code not in translations:
continue
level = int(level)
langs.append((kind_for_level(level), code, desc))
translations.remove(code)
for code in translations:
if gettext.find('iso_639_3', languages=[code]):
native_lang = gettext.translation('iso_639_3', languages=[code])
native = native_lang.gettext(name).capitalize()
langs.append(('ssh', code, native))
else:
print('do not know native name for {}'.format(code), file=sys.stderr)
sys.exit(1)
for level, code, name in langs:
sys.stdout.write("{}:{}:{}\n".format(level, code, name))

View File

@ -122,6 +122,14 @@ parts:
font/subiquity.psf: subiquity.psf
stage:
- subiquity.psf
languagelists:
plugin: nil
build-packages:
- localechooser-data
override-build: |
$SNAPCRAFT_PROJECT_DIR/scripts/make-language-lists $SNAPCRAFT_PROJECT_DIR/po > $SNAPCRAFT_PART_INSTALL/languagelist
stage:
- languagelist
probert:
plugin: python
build-packages: [python-setuptools, libnl-3-dev, libnl-genl-3-dev, libnl-route-3-dev]

View File

@ -39,9 +39,10 @@ class WelcomeController(SubiquityController):
lang = os.environ.get("LANG")
if lang is not None and lang.endswith(".UTF-8"):
lang = lang.rsplit('.', 1)[0]
for code, name in self.model.supported_languages:
for code, name in self.model.get_languages(self.app.is_linux_tty):
if code == lang:
self.model.switch_language(code)
break
else:
self.model.selected_language = lang

View File

@ -14,8 +14,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
import os
from subiquitycore import gettext38
from subiquitycore import i18n
@ -28,36 +28,20 @@ class LocaleModel(object):
XXX Only represents *language* selection for now.
"""
supported_languages = [
('en_US', 'English'),
('ast_ES', 'Asturian'),
('ca_EN', 'Catalan'),
('hr_HR', 'Croatian'),
('nl_NL', 'Dutch'),
('fi_FI', 'Finnish'),
('fr_FR', 'French'),
('de_DE', 'German'),
('el_GR', 'Greek, Modern (1453-)'),
# ('he_IL', 'Hebrew'), # noqa: disabled as it does not render correctly on a vt with default font
('hu_HU', 'Hungarian'),
('lv_LV', 'Latvian'),
('nb_NO', 'Norsk bokmål'), # noqa: iso_639_3 for nb does not translate Norwgian
('pl_PL', 'Polish'),
('ru_RU', 'Russian'),
('es_ES', 'Spanish'),
('uk_UA', 'Ukrainian'),
]
selected_language = None
def get_languages(self):
def get_languages(self, is_linux_tty):
base = os.environ.get("SNAP", ".")
lang_path = os.path.join(base, "languagelist")
languages = []
for code, name in self.supported_languages:
native = name
if gettext38.find('iso_639_3', languages=[code]):
native_lang = gettext38.translation('iso_639_3',
languages=[code])
native = native_lang.gettext(name).capitalize()
languages.append((code, native))
with open(lang_path) as lang_file:
for line in lang_file:
level, code, name = line.strip().split(':')
if is_linux_tty and level != "console":
continue
languages.append((code, name))
languages.sort(key=lambda x: x[1])
return languages
def switch_language(self, code):

View File

@ -101,7 +101,8 @@ This is version {snap_version} of the installer.
SSH_HELP_PROLOGUE = _("""
It is possible to connect to the installer over the network, which
might allow the use of a more capable terminal.""")
might allow the use of a more capable terminal and can offer more languages
than can be rendered in the Linux console.""")
SSH_HELP_MULTIPLE_ADDRESSES = _("""
To connect, SSH to any of these addresses:

View File

@ -10,6 +10,8 @@ from subiquity.ui.views.welcome import WelcomeView
class FakeApp:
is_linux_tty = True
class opts:
run_on_serial = False

View File

@ -64,6 +64,7 @@ class WelcomeView(BaseView):
def __init__(self, model, controller):
self.model = model
self.controller = controller
self.is_linux_tty = controller.app.is_linux_tty
if controller.app.opts.run_on_serial and not controller.app.rich_mode:
s = self.make_serial_choices()
self.title = "Welcome!"
@ -74,8 +75,14 @@ class WelcomeView(BaseView):
def make_language_choices(self):
btns = []
current_index = None
for i, (code, native) in enumerate(self.model.get_languages()):
if code == self.model.selected_language:
langs = self.model.get_languages(self.is_linux_tty)
cur = self.model.selected_language
log.debug("_build_model_inputs selected_language=%s", cur)
if cur in ["C", None]:
cur = "en_US"
for i, (code, native) in enumerate(langs):
log.debug("%s", (code, self.model.selected_language))
if code == cur:
current_index = i
btns.append(
forward_btn(