From 5cb37acefc4b1242e6496511ec1a57080842292d Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Thu, 7 May 2020 12:47:09 +1200 Subject: [PATCH 1/7] make some language lists at snap build time --- scripts/make-language-lists | 30 ++++++++++++++++++++++++++++++ snapcraft.yaml | 9 +++++++++ 2 files changed, 39 insertions(+) create mode 100755 scripts/make-language-lists diff --git a/scripts/make-language-lists b/scripts/make-language-lists new file mode 100755 index 00000000..c60297bb --- /dev/null +++ b/scripts/make-language-lists @@ -0,0 +1,30 @@ +#!/usr/bin/python3 + +import glob +import gzip +import os + + +translations = set() +for fname in glob.glob('po/*.po'): + translations.add(os.path.splitext(os.path.basename(fname))[0]) + +print('found translations', translations) + +console_langs = open('languagelist-console', 'w') +ssh_langs = open('languagelist-ssh', 'w') +data = gzip.open('/usr/share/localechooser/languagelist.data.gz', mode='rt') + +for line in data: + level, code, name, desc = line.strip().split(':') + if code not in translations: + continue + level = int(level) + new_line = "{}:{}\n".format(code, desc) + ssh_langs.write(new_line) + if level <= 2: + console_langs.write(new_line) + +console_langs.close() +ssh_langs.close() +data.close() diff --git a/snapcraft.yaml b/snapcraft.yaml index 9f7129e8..baa35101 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -124,6 +124,15 @@ parts: font/subiquity.psf: subiquity.psf stage: - subiquity.psf + languagelists: + plugin: nil + build-packages: + - localechooser-data + override-build: | + scripts/make-language-lists + stage: + - languagelist-console + - languagelist-ssh probert: plugin: python build-packages: [python-setuptools, libnl-3-dev, libnl-genl-3-dev, libnl-route-3-dev] From a6d98f29e6e86293de454809d8ced4854c9fafe1 Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Mon, 11 May 2020 16:02:44 +1200 Subject: [PATCH 2/7] change languagelist format a bit, add some special cases --- scripts/make-language-lists | 67 +++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 17 deletions(-) diff --git a/scripts/make-language-lists b/scripts/make-language-lists index c60297bb..b5c12798 100755 --- a/scripts/make-language-lists +++ b/scripts/make-language-lists @@ -1,30 +1,63 @@ #!/usr/bin/python3 +import gettext import glob import gzip import os +import sys +DATA_PATH = '/usr/share/localechooser/languagelist.data.gz' translations = set() for fname in glob.glob('po/*.po'): translations.add(os.path.splitext(os.path.basename(fname))[0]) -print('found translations', translations) - -console_langs = open('languagelist-console', 'w') -ssh_langs = open('languagelist-ssh', 'w') -data = gzip.open('/usr/share/localechooser/languagelist.data.gz', mode='rt') -for line in data: - level, code, name, desc = line.strip().split(':') - if code not in translations: - continue - level = int(level) - new_line = "{}:{}\n".format(code, desc) - ssh_langs.write(new_line) - if level <= 2: - console_langs.write(new_line) +langs = [ + ('console', 'en_US', 'English'), + ('console', 'en_GB', 'English (UK)'), + ('ssh', 'kab', 'Tamaziɣt Taqbaylit'), +] -console_langs.close() -ssh_langs.close() -data.close() +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)) + sys.exit(1) + +with open('languagelist', 'w') as langlist: + for level, code, name in langs: + langlist.write("{}:{}:{}\n".format(level, code, name)) From 0a746a84bd07536f5a436557ff4f08f1d2b7694a Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Mon, 11 May 2020 16:16:11 +1200 Subject: [PATCH 3/7] add initial languagelist --- languagelist | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 languagelist diff --git a/languagelist b/languagelist new file mode 100644 index 00000000..5dad7122 --- /dev/null +++ b/languagelist @@ -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 From 5b1c40817ba0f3701f6f5d39772f0383ad2bf5c0 Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Mon, 11 May 2020 16:19:21 +1200 Subject: [PATCH 4/7] read languages from language list --- subiquity/controllers/welcome.py | 2 +- subiquity/models/locale.py | 40 +++++++----------------- subiquity/ui/views/tests/test_welcome.py | 2 ++ subiquity/ui/views/welcome.py | 8 ++++- 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/subiquity/controllers/welcome.py b/subiquity/controllers/welcome.py index 55bca45f..293e0d6e 100644 --- a/subiquity/controllers/welcome.py +++ b/subiquity/controllers/welcome.py @@ -39,7 +39,7 @@ 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) else: diff --git a/subiquity/models/locale.py b/subiquity/models/locale.py index 57c17824..4fff358c 100644 --- a/subiquity/models/locale.py +++ b/subiquity/models/locale.py @@ -13,8 +13,8 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import gettext import logging +import os 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 gettext.find('iso_639_3', languages=[code]): - native_lang = gettext.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): diff --git a/subiquity/ui/views/tests/test_welcome.py b/subiquity/ui/views/tests/test_welcome.py index adc28059..739fdc16 100644 --- a/subiquity/ui/views/tests/test_welcome.py +++ b/subiquity/ui/views/tests/test_welcome.py @@ -14,6 +14,8 @@ class WelcomeViewTests(unittest.TestCase): def make_view_with_languages(self, languages): controller = mock.create_autospec(spec=WelcomeController) + controller.app = mock.Mock() + controller.app.is_linux_tty = True model = mock.create_autospec(spec=LocaleModel) model.get_languages.return_value = languages return WelcomeView(model, controller) diff --git a/subiquity/ui/views/welcome.py b/subiquity/ui/views/welcome.py index 3f772d38..f207db0c 100644 --- a/subiquity/ui/views/welcome.py +++ b/subiquity/ui/views/welcome.py @@ -40,6 +40,7 @@ class WelcomeView(BaseView): def __init__(self, model, controller): self.model = model self.controller = controller + self.is_linux_tty = controller.app.is_linux_tty super().__init__(screen( self._build_model_inputs(), buttons=None, @@ -49,7 +50,12 @@ class WelcomeView(BaseView): def _build_model_inputs(self): btns = [] current_index = None - for i, (code, native) in enumerate(self.model.get_languages()): + langs = self.model.get_languages(self.is_linux_tty) + cur = self.model.selected_language + 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 == self.model.selected_language: current_index = i btns.append(forward_btn(label=native, on_press=self.confirm, From 0216f1c6fcb827b3384b9bfbc9b02b9b9c7e84fb Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Mon, 11 May 2020 16:23:58 +1200 Subject: [PATCH 5/7] advertize that SSH gets you more languages --- subiquity/ui/views/help.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subiquity/ui/views/help.py b/subiquity/ui/views/help.py index aec7b8dd..9ace98a9 100644 --- a/subiquity/ui/views/help.py +++ b/subiquity/ui/views/help.py @@ -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: From 99ad097306400841ff48e69db52826ecefa1b83b Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Mon, 11 May 2020 16:36:42 +1200 Subject: [PATCH 6/7] snapcraft.yaml fixery --- scripts/make-language-lists | 16 +++++++++++----- snapcraft.yaml | 5 ++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/scripts/make-language-lists b/scripts/make-language-lists index b5c12798..5ee71782 100755 --- a/scripts/make-language-lists +++ b/scripts/make-language-lists @@ -8,10 +8,17 @@ 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/*.po'): +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'), @@ -55,9 +62,8 @@ for code in translations: native = native_lang.gettext(name).capitalize() langs.append(('ssh', code, native)) else: - print('do not know native name for {}'.format(code)) + print('do not know native name for {}'.format(code), file=sys.stderr) sys.exit(1) -with open('languagelist', 'w') as langlist: - for level, code, name in langs: - langlist.write("{}:{}:{}\n".format(level, code, name)) +for level, code, name in langs: + sys.stdout.write("{}:{}:{}\n".format(level, code, name)) diff --git a/snapcraft.yaml b/snapcraft.yaml index baa35101..700a1f8d 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -129,10 +129,9 @@ parts: build-packages: - localechooser-data override-build: | - scripts/make-language-lists + $SNAPCRAFT_PROJECT_DIR/scripts/make-language-lists $SNAPCRAFT_PROJECT_DIR/po > $SNAPCRAFT_PART_INSTALL/languagelist stage: - - languagelist-console - - languagelist-ssh + - languagelist probert: plugin: python build-packages: [python-setuptools, libnl-3-dev, libnl-genl-3-dev, libnl-route-3-dev] From 35f1d511a6105f17736267cd406dbaf044795e73 Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Mon, 11 May 2020 17:27:45 +1200 Subject: [PATCH 7/7] fix some silly mistakes --- subiquity/controllers/welcome.py | 1 + subiquity/ui/views/welcome.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/subiquity/controllers/welcome.py b/subiquity/controllers/welcome.py index 293e0d6e..eac965be 100644 --- a/subiquity/controllers/welcome.py +++ b/subiquity/controllers/welcome.py @@ -42,6 +42,7 @@ class WelcomeController(SubiquityController): 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 diff --git a/subiquity/ui/views/welcome.py b/subiquity/ui/views/welcome.py index f207db0c..1538fb15 100644 --- a/subiquity/ui/views/welcome.py +++ b/subiquity/ui/views/welcome.py @@ -52,11 +52,12 @@ class WelcomeView(BaseView): current_index = None 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 == self.model.selected_language: + if code == cur: current_index = i btns.append(forward_btn(label=native, on_press=self.confirm, user_arg=code))