feat(i18n): offer every ISO 639-1 language
The table was thirty languages typed by hand. It is now generated: utils/generate_languages.py takes the 184 alpha-2 codes from pycountry, the display names from CLDR through babel, and the writing direction from CLDR character order. 159 languages carry their endonym; the remaining 25 have no CLDR entry and carry their English ISO name. That corrects the right-to-left set, which had four entries and needs ten — dv, ks, ps, sd, ug and yi were simply missed. Only 29 languages ship an interface catalogue, so the other 155 render in English until one is filled. make i18n-ui fills app/i18n/ui/ for them, and make i18n now covers the interface strings as well; neither asks for a string a shipped catalogue already answers, so hand-written entries stay. 184 entries do not fit on a screen, so the language menu scrolls inside itself. overscroll-behavior keeps the page behind it from moving once the list reaches its end. babel and pycountry are dev dependencies: the generator needs them, the application does not. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -224,7 +224,7 @@ class TestSync(unittest.TestCase):
|
||||
session = Mock(get=Mock(return_value=listing), post=Mock(return_value=answer))
|
||||
|
||||
with patch.object(i18n_sync.requests, "Session", return_value=session):
|
||||
i18n_sync.sync("http://lt", "", set(sources), ["de"])
|
||||
i18n_sync.sync("http://lt", "", set(sources), ["de"], self.directory)
|
||||
return session
|
||||
|
||||
def test_missing_entries_are_written(self):
|
||||
@@ -267,13 +267,26 @@ class TestSync(unittest.TestCase):
|
||||
|
||||
self.assertEqual(self.path.read_text(encoding="utf-8"), original)
|
||||
|
||||
def test_the_content_directory_is_created(self):
|
||||
def test_a_string_the_shipped_catalog_covers_is_not_requested(self):
|
||||
ui = Path(tempfile.mkdtemp())
|
||||
self.addCleanup(shutil.rmtree, ui, True)
|
||||
self.addCleanup(setattr, i18n, "UI_DIR", i18n.UI_DIR)
|
||||
i18n.UI_DIR = ui
|
||||
(ui / "de.yaml").write_text("Close: Schliessen\n", encoding="utf-8")
|
||||
|
||||
session = self._run(["Close", "Hello"])
|
||||
|
||||
self.assertEqual(session.post.call_count, 1)
|
||||
self.assertNotIn("Close", yaml.safe_load(self.path.read_text(encoding="utf-8")))
|
||||
|
||||
def test_the_catalog_directory_is_created(self):
|
||||
nested = self.directory / "content"
|
||||
i18n.CONTENT_DIR = nested
|
||||
self.directory = nested
|
||||
self.path = nested / "de.yaml"
|
||||
|
||||
self._run(["Hello"])
|
||||
|
||||
self.assertTrue((nested / "de.yaml").is_file())
|
||||
self.assertTrue(self.path.is_file())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user