From dfc28773757d70c9d926a360a4422c71b279ff94 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Mon, 27 Jul 2026 14:46:31 -0700 Subject: [PATCH 1/5] fix: fall back to English per-key when locale is missing a msgid Previously, gettext.translation was called with a single-locale languages list. If the loaded catalog was missing a msgid the raw key was surfaced to the user instead of the English text. The chained locale_options list in set_client_locale only handled catalog *load* failures, not per-key lookups. Chain "en" behind the preferred locale so per-key fallback works. Also: - Add CI workflow to detect drift between committed .mo files and the .properties sources they are compiled from; regenerates and diffs on every PR that touches localization files. Uploads the regenerated .mo files as an artifact on failure so they can be downloaded and committed. - Fix wrong doit task name (combine_property_files -> properties) in bin/i18n/README.md, and update the English-fallback claim to match the new behavior. - Remove duplicate Localization section from contributing.md. - Fix NameError in dodo.py uniquify_file when no lines were discarded. - Gitignore the doit intermediate combined.tmp and codestrings.tmp files. --- .github/workflows/check-mo-freshness.yml | 58 ++++++++++++++++++++++++ .gitignore | 2 + bin/i18n/README.md | 28 +++++++----- contributing.md | 19 -------- dodo.py | 2 +- tabcmd/execution/localize.py | 6 ++- tests/commands/test_localize.py | 21 +++++++++ 7 files changed, 104 insertions(+), 32 deletions(-) create mode 100644 .github/workflows/check-mo-freshness.yml diff --git a/.github/workflows/check-mo-freshness.yml b/.github/workflows/check-mo-freshness.yml new file mode 100644 index 00000000..151c1a0d --- /dev/null +++ b/.github/workflows/check-mo-freshness.yml @@ -0,0 +1,58 @@ +name: Check .mo bundles are up to date + +on: + workflow_dispatch: + pull_request: + branches: + - development + - main + paths: + - 'tabcmd/locales/**/*.properties' + - 'tabcmd/locales/**/*.po' + - 'tabcmd/locales/**/*.mo' + - 'bin/i18n/**' + - 'dodo.py' + - '.github/workflows/check-mo-freshness.yml' + +permissions: + contents: read + +jobs: + check-mo-freshness: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v7 + + - name: Set up Python + uses: actions/setup-python@v7 + with: + python-version: '3.12' + + - name: Install localization deps + run: | + python -m pip install --upgrade pip + pip install .[localize] + + - name: Regenerate .po and .mo bundles + run: python -m doit localize + + - name: Verify regenerated files match what is committed + id: verify + run: | + if ! git diff --exit-code -- 'tabcmd/locales/**/*.po' 'tabcmd/locales/**/*.mo'; then + echo "" + echo "The committed .po/.mo files are out of date with the .properties sources." + echo "Run 'python -m doit localize' locally and commit the regenerated files." + echo "The freshly-generated files are attached as a workflow artifact." + exit 1 + fi + + # If the diff step failed the regenerated files are still on disk. Uploading + # them makes it easy to download from the failed CI run and commit them. + - name: Upload regenerated .mo files on failure + if: failure() + uses: actions/upload-artifact@v4 + with: + name: regenerated-mo-files + path: tabcmd/locales/**/*.mo diff --git a/.gitignore b/.gitignore index e37ef3a4..3e094da4 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,8 @@ test-output/ # localization intermediate files *.po +tabcmd/locales/**/combined.tmp +tabcmd/locales/codestrings.tmp # venv site-packages diff --git a/bin/i18n/README.md b/bin/i18n/README.md index 7bac1758..21e25eac 100644 --- a/bin/i18n/README.md +++ b/bin/i18n/README.md @@ -1,28 +1,34 @@ ### Strings and localization -New text should not be hardcoded into the python, but added to tabcmd/locales/en/extra.properties. This file can be given to the translation team and they will return a copy for each other language. Until then, the english string will be used as a fallback. +New text should not be hardcoded into the python, but added to `tabcmd/locales/en/extra.properties` (or directly to `tabcmd/locales/en/tabcmd_messages_en.properties`). The English properties file is given to the translation team, and they return a translated copy for each supported locale. Until translations return, non-English users automatically see the English string via per-key fallback in gettext (see `tabcmd/execution/localize.py`). -To handle localizing text we used the python standard library tool [gettext](https://docs.python.org/3/library/gettext.html). This expects .mo files. I couldn't find a tool that transformed .properties -> .mo directly so we go through .po format. -(FYI: to read mo files for debugging use https://poedit.net/download) +To handle localizing text we use the python standard library tool [gettext](https://docs.python.org/3/library/gettext.html). This expects .mo files. There is no direct .properties -> .mo tool so we go through .po format. +(FYI: to read .mo files for debugging use https://poedit.net/download) +Missing string keys are validated on every PR by `.github/workflows/check-strings.yml`, which runs `python bin/i18n/check_strings.py`. Run it locally the same way before pushing. -These steps are separated for easier troubleshooting: each step is idempotent and will overwrite the existing output. More details about implementation are in the script code at dodo.py +## Regenerating .mo bundles -1. convert strings from .properties files to .mo for bundling -This step combines the .properties files into a single file, discarding any strings that are not present in code and normalizing curly quotes and unrecognized characters in the strings it keeps. (These files are separate because they are pulled from separate translation sources internally.) -> python -m doit combine_property_files +Run these when properties files change. Each step is idempotent and will overwrite the existing output. More details about implementation are in the script code at `dodo.py`. -2. Convert the combined .properties file into a .po file (these are human readable) +Or run the full pipeline in one command: +> python -m doit localize + +Individual steps: + +1. Combine .properties files into a single per-locale `combined.tmp`. Discards strings not present in code and normalizes curly quotes. +> python -m doit properties + +2. Convert each `combined.tmp` into a human-readable .po file: > python -m doit po -3. Convert the .po files into .mo files (these are not human readable) -This also checks the .mo files for validity by loading them with gettext +3. Convert the .po files into binary .mo files. Also validates each .mo by loading it with gettext: > python -m doit mo ## Optional reorganization task -Move all strings from extra.properties to the bottom of tabcmd_messages_xx.properties: +Move all strings from `extra.properties` to the bottom of `tabcmd_messages_xx.properties`: > python -m doit move_tabcmd_strings This consolidates all strings into the main tabcmd_messages files and clears the extra.properties files. \ No newline at end of file diff --git a/contributing.md b/contributing.md index 97ee80d9..c67179c4 100644 --- a/contributing.md +++ b/contributing.md @@ -138,25 +138,6 @@ The version reflected in the executable (tabcmd -v) is stored in a metadata file -### Localization - -Strings should be added/edited in /tabcmd/locales/en/{name}.properties by id and referred to in code as -> string = _("string.id") - -- regenerate updated strings for packaging as exe -> python -m doit combine_property_files po mo - - -### Versioning - -Versioning is done with setuptools_scm and based on git tags. The version number will be x.y.dev0.dirty except for commits with a new version tag. - This is pulled from the git state, and to get a clean version like "v2.1.0", you must be on a commit with the tag "v2.1.0" (Creating a Github release also creates a tag on the selected branch.) - -The version reflected in the executable (tabcmd -v) is stored in a metadata file created by a .doit script: -> python -m doit version - - - ### Packaging Packaging for release is done in a github action and should not need to be done locally. diff --git a/dodo.py b/dodo.py index 9d193c9b..82ac894c 100644 --- a/dodo.py +++ b/dodo.py @@ -455,7 +455,7 @@ def uniquify_file(filename): ) ) else: - print("Saved {} sorted unique lines to {}".format(len(uniques), filename)) + print("Saved {} sorted unique lines to {}".format(len(unique_lines), filename)) def task_clean_all(): diff --git a/tabcmd/execution/localize.py b/tabcmd/execution/localize.py index cc8baf1c..6547bccd 100644 --- a/tabcmd/execution/localize.py +++ b/tabcmd/execution/localize.py @@ -76,7 +76,11 @@ def define_locale_dir(logger): def _load_language(current_locale, domain, logger): locale_dir = define_locale_dir(logger) - language: gettext.NullTranslations = gettext.translation(domain, locale_dir, languages=[current_locale]) + # Chain "en" behind the preferred locale so a msgid missing from the + # preferred catalog falls back to the English msgstr per-key, instead of + # surfacing the raw msgid to the user. + languages = [current_locale] if current_locale == "en" else [current_locale, "en"] + language: gettext.NullTranslations = gettext.translation(domain, locale_dir, languages=languages) language.install() # I believe this is the expensive call _ = language.gettext return _ diff --git a/tests/commands/test_localize.py b/tests/commands/test_localize.py index 500cd0cc..9f7e5fdc 100644 --- a/tests/commands/test_localize.py +++ b/tests/commands/test_localize.py @@ -2,6 +2,7 @@ import locale import sys import unittest +import tabcmd.execution.localize as localize_module from tabcmd.execution.localize import set_client_locale, _get_default_locale @@ -40,6 +41,26 @@ def test_en_smoke_line_processed(self): assert translations("importcsvsummary.line.processed") == "Lines processed: {0}" + def test_fallback_to_english_when_key_missing_in_locale(self): + # session.errors.password_file_not_found exists in en but not fr. + # Loading fr should chain en behind it so the key resolves to the en msgstr. + localize_module.translate = None + translations = set_client_locale("fr") + assert translations is not None + result = translations("session.errors.password_file_not_found") + assert result == "Password file not found: '{0}'. Check the path passed to --password-file." + + def test_key_present_in_locale_uses_locale_translation(self): + # createsite.errors.site_name_already_exists is translated in fr; the fallback + # should NOT clobber the fr msgstr. + localize_module.translate = None + translations = set_client_locale("fr") + assert translations is not None + result = translations("createsite.errors.site_name_already_exists") + assert result != "createsite.errors.site_name_already_exists" + assert "'{0}'" in result # placeholder preserved + assert result != "There is already a site named '{0}'. Try a different site name." + # https://docs.python.org/3/library/locale.html # c:\dev\tabcmd\tabcmd\execution\localize.py:85: DeprecationWarning: # 'locale.getdefaultlocale' is deprecated and slated for removal in Python 3.15. Use setlocale(), getencoding() and getlocale() instead From 43e7c5e80603d68521287bf594a610f719918765 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Mon, 27 Jul 2026 17:32:41 -0700 Subject: [PATCH 2/5] fix: move setuptools_scm import out of top-level dodo.py The check-mo-freshness workflow only installs .[localize], which doesn't pull setuptools_scm; the top-level import made 'doit properties/po/mo' crash with ModuleNotFoundError. setuptools_scm is only used by task_version, so import it lazily inside that task. --- dodo.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dodo.py b/dodo.py index 82ac894c..cf2dcdd5 100644 --- a/dodo.py +++ b/dodo.py @@ -2,7 +2,6 @@ import os import subprocess import sys -import setuptools_scm LOCALES = ["en", "de", "es", "fr", "ga", "it", "pt", "sv", "ja", "ko", "zh"] @@ -382,7 +381,7 @@ def task_version(): def write_for_pyinstaller(): import pyinstaller_versionfile - import os + import setuptools_scm version = setuptools_scm.get_version(local_scheme="no-local-version") numeric_version = version.replace("dev", "") From 1329628c2af4cd9865770f78b603aeda58dd5e77 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Mon, 27 Jul 2026 17:37:23 -0700 Subject: [PATCH 3/5] fix: unblock check-mo-freshness workflow Two follow-on issues discovered when the workflow ran in a clean CI env: 1. prop2po.py imports click, which was not in the [localize] extra. Add click as a dep of [localize] so 'pip install .[localize]' is sufficient to run 'doit localize' from scratch. 2. task_properties invoked check_strings.py in build mode, which hard-fails on missing non-English keys. With the English fallback added in this branch, non-en gaps are handled at runtime, so blocking the build on them is counterproductive. Remove enforce_strings_present from the properties task; check-strings.yml already runs check_strings.py in dev mode on every PR as a separate check. --- dodo.py | 32 +++++--------------------------- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/dodo.py b/dodo.py index cf2dcdd5..5f3a6350 100644 --- a/dodo.py +++ b/dodo.py @@ -102,35 +102,13 @@ def merge(): print("Combined strings for {} to {}".format(current_locale, OUTPUT_FILE)) uniquify_file(OUTPUT_FILE) - """Search loc files for each string used in code - print an error if not found. - Uses enhanced check_strings.py script for validation. - """ - - def enforce_strings_present(): - print("\n***** Verify that all string keys are present using check_strings validator") - - # English must be processed FIRST for validation baseline, others can be in any order - locales_ordered = ["en"] + [loc for loc in LOCALES if loc != "en"] - result = subprocess.run( - ["python", "bin/i18n/check_strings.py", "--mode", "build", "--locales"] + locales_ordered, - capture_output=True, - text=True, - ) - - # Print the output from the validation script - if result.stdout: - print(result.stdout) - if result.stderr: - print(result.stderr, file=sys.stderr) - - if result.returncode != 0: - print("VALIDATION FAILED: Missing localization strings found") - exit(1) - else: - print("All string validations passed") + # String-key coverage is validated by .github/workflows/check-strings.yml + # (running bin/i18n/check_strings.py directly) on every PR. Missing non-en + # keys are handled at runtime by the English fallback in localize.py, so + # they should not fail this build step. return { - "actions": [process_code, merge, enforce_strings_present], + "actions": [process_code, merge], "verbosity": 2, } diff --git a/pyproject.toml b/pyproject.toml index 0456f3c7..b450b145 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,7 @@ test = [ "types-requests", "types-setuptools" ] -localize = ["doit", "ftfy"] +localize = ["doit", "ftfy", "click"] package = ["doit", "pyinstaller==5.13.1", "setuptools==81"] versioning = [ "doit", From d94f91f7b90fbad2199f1faf647c405472f9edba Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Mon, 27 Jul 2026 17:43:23 -0700 Subject: [PATCH 4/5] chore: regenerate .mo bundles from committed .properties sources The committed .mo files were out of sync with their .properties sources: ~20 keys per locale were either orphan translations for removed code or missing translations for currently-used code. Regenerated via the check-mo-freshness workflow on Ubuntu and downloaded from the workflow artifact so the bytes match what CI produces. --- tabcmd/locales/de/LC_MESSAGES/tabcmd.mo | Bin 19443 -> 19591 bytes tabcmd/locales/en/LC_MESSAGES/tabcmd.mo | Bin 20732 -> 22558 bytes tabcmd/locales/es/LC_MESSAGES/tabcmd.mo | Bin 19175 -> 19346 bytes tabcmd/locales/fr/LC_MESSAGES/tabcmd.mo | Bin 19599 -> 19776 bytes tabcmd/locales/ga/LC_MESSAGES/tabcmd.mo | Bin 19517 -> 19659 bytes tabcmd/locales/it/LC_MESSAGES/tabcmd.mo | Bin 19329 -> 19510 bytes tabcmd/locales/ja/LC_MESSAGES/tabcmd.mo | Bin 21856 -> 22037 bytes tabcmd/locales/ko/LC_MESSAGES/tabcmd.mo | Bin 19611 -> 19810 bytes tabcmd/locales/pt/LC_MESSAGES/tabcmd.mo | Bin 18559 -> 18733 bytes tabcmd/locales/sv/LC_MESSAGES/tabcmd.mo | Bin 17966 -> 18161 bytes tabcmd/locales/zh/LC_MESSAGES/tabcmd.mo | Bin 16694 -> 16916 bytes 11 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tabcmd/locales/de/LC_MESSAGES/tabcmd.mo b/tabcmd/locales/de/LC_MESSAGES/tabcmd.mo index cac49e59979b37c6f1ff8c94d05485f8d51a94ca..bb3aab6b0d2c871bf7163f386c2a8b79917a78a7 100644 GIT binary patch delta 3701 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 lJy@FW*FTjuW+9Ln} diff --git a/tabcmd/locales/en/LC_MESSAGES/tabcmd.mo b/tabcmd/locales/en/LC_MESSAGES/tabcmd.mo index a067f324e46517169c6aa3b84575f9fb3f72e1a8..3a7c7bd533615742f31ac910fb600e7457cc10ff 100644 GIT binary patch delta 7157 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 Ho0|R?3Pdf6 delta 5342 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 diff --git a/tabcmd/locales/es/LC_MESSAGES/tabcmd.mo b/tabcmd/locales/es/LC_MESSAGES/tabcmd.mo index db1cd9b874478be8c6aee87ea29b4edfa754f199..971f2d80edd2c1a4d424761741a12dd87085b2b4 100644 GIT binary patch delta 3705 zcmZwJdvKK18OQOH1cS&m7YqqRPJnP{Ng~FYq-w(bQZB{TQfuQT`(}5?&A!{cAnA-< zE5a0nQr)7cb;f3D!BPLPuMRUhN-vCvH644wF||f)r^QZ1p~a4)Ez|FB-`7|>WtRQC z=e*}V=XsuU_JuPCOYXhDBtKF)=AhxvbNrpb-wT(h_358i#v4;da|kEnJJ^69;#91g zV9XWRgcdhp4Wk_ehpcVRq89oXE!Ix)ZA10ngqnW<75F}^W_|Mn7b^YFP?3$G7CeV~ppwq{ z*oYQ4qPE0Em3nW`9z@nQ&!e6nLIwOjHexxG&Bn#3^)_Q(6ZCVj1b3k_^Kc%Hpe87< z@&lwebgsrH|HlPkw z6sO~EoQs2~Ql3PW@J!Gi%fps-BkIhoLM0SO&3`{?o+Cl~I4bc|Q>niqJWIz?EGIpJ zGp(qSuS1=M4DvA#^QDQN4ty0Y?RSw_%tU5Y;ImMb=tM1aQ(y)y?YmKlKB4;atT}<& zn-Nq7r9`DtHKO)(8CqO{8s{J%vxhJ3t{xu($wKxpjdtWOq$|Hy5mF z9tb*~LPd5QExv`CNS(#ZPl3UCuDps%AUcPA>K`;bSC7dV8(WX=Stj0BW7wOmkr zb2X|GUqF>If(mQ^wb%EcCU^?9r!S)ddjmP(=HJNNW-_a5o`tA0(1{AfMTVF?sPT_t zoqqpExlm@mLEb^;Jo0ig7f}IRMwnW77HXn)wD=`d3Advb-h+J1kN8pmKSzxp4*Umd z+(Z^r|9q@rebdE-PWM*>zm1GFM^FP_#1NjwIXIbeD6?g#aXrY#+`*R?cqHh54i(67 z(0>j!-+1e9RU_sfqT?DaRGL%xIXsVRaUu29-eyt1jzg%!_!3@xYnmh2 zghQx_F5*VKlGPOGov8Q4_fd(wfQ#|B!F}D-{Yt)6@s2zfD*0FNcDx52oJ_hpbUAFp z@1jb75*cEKQ5lr+FO&kDhYB!?*Wf-JhcBYez^iyIp20qxOH@x{em@r)@BKNs5jKVv&iU}HOQ4R+x!)PgU`5@Y^`+h|W}_0LKSHSRIgLhqs~av9kuz~!hd zyB)Q)hcSv18MKAW?7j&)n6O=fH6B3>`YH3zqvYnu9o{gzRt) z{l8`(iid`}vrDEQRjD7N0)HM4;5pohcdYV%mSa{2|A)jk=ucq*H!!Ixb2`igzZ_Gu z)<3PQagcT&-i+hc`7f3zR?!~78r+X;pLrCO+1tqRFjF~57B^u7rq&l893S!;Cj7m` z3r*@S^^QzAUg8Z_&M5U>tA1~cce=K@>}yUs?WRLL;YfGd`9{vkWJB@f_HZH|>F#xt zStpt8&JLs;lMVOu_D4eg=!lbWvQ8+Pc5|uE-sua+6S=e#%4EaYT&6It{;Ha&lMOjL zm?;x?lcA)W?e24P$%xllpDxY&)271djFS#U6K+p95$bVb;q7rZoe8G?>|LTtI=xxu z`k(tTCy@&Ey8Zp(WaR(dia43xbUdXeM<-rTT(|gSBA&c;wExrYOv>qv_r-g?!!vD( zci!$OE4{1`(anvrTNvx{Oo9cZ6@gXubkS@vK?prfq-TO*>Y(+Kj_RHk-<{EnUhEB%E+A6pd$N zxt>tmRS#RewD?eQxSOb*j-BU^wH-l}*V-kqc_HH@Y|`!TVY#GhQ#mK% MSdLcV*>y|)1F|A91ONa4 delta 3472 zcmaLZeQZ=!8prW7#WvLzXaTX5)}HD}1!M$7SVW-|ib4q$kSHcPOlNLkmf=phGvzII zXAxr{20=$utfC+&z7St7M$)Je4I=&lipJoIY=kB1nspZ%R@r3L?~l1=|Jm5I^Ev0f zob#OLIrmN07ulj3encqXt}#SK#L0ypOv6 zGaP_tQGpisGo}tLYNAFQfeTOz{4-j73Tv6)yc3)_jznb6qgGVLay7vy)C4U!9PdU2 zwjOoeUL1^{qbB+XR$*0zF~nrXpvIYk7Vkm@`X}|7-)s#o=s`_%47GyqQ7b4TDn)Kl z0p7%iCT>MtzZ|c|`_SSZ)C7l7ssAqMhq##7ObzP(YcQwC=g_zw9lQ#=@k-o}n)ozo zprV0f1FKOhy#=)gGN^I7kxR|%LH_`%w8w+vX9J5_)ew$X4I=+q;aEPDvYSyUTZB}> zxOgLWp#tbZl46dc20n#a>3P&18N|V%cpVPIR#fU&pfdVM(BF%e{?SXxzcy7b2eh)m zEJG7aM-8+f=r2bFa4#y*C-7SIkwuwPs1p2$+9Q^WX_{H6abkg8Xz6c7Vm3WF8jAb~ zDkVQ4zowK~q(zH=K&^BkYTzuYL=T`A@CqtpM^QEY8ZDkdT{nQiX`1nPp6czcafrn6moJ6X2;U;BdFgGiuqfmi0p=y37>i#vT(&kZt?Ziqw z{~ypGICBg&Q168kM9M5WUW2@w%mn0RXQrbjxD_?<5>&uz(PB3$LvNw(KZ5+4zw@E- zOG$^WuanGgCeqM_^MeyEYJ&BsUHnYoLDWD$pav*sc@Z3jVO)UP#A{IJccU`<9(LpB zNYadF*-!W&=1OQBq@hi87-!-c)aIB(p0vxOs7b_&B z081JCXPkgq=y(R-h;y$b|1C8B$^q4GB+Jla)QE~aiM+f_7wUzx37fG8qo}u)UOILO3v9%G%r*yGQ2}p5y$4=JE$lCN4gNDYU&BeAkL37NP3}O|B#T|R2OS*AvbD(` z!W-~KR4Gm)mzZ;?mDKT#bRkgGb?Z<8zk?I;6kd$AM4?UCfRiydnMON}F5H8E!*lpB zJ4v-$&qo`+iML`kg;gq-25!LX=|7Ki@hj9qt|d(tm!KB70hi(~ybdeJ1kZmnjXDk_ z12>>*{{m_SZ{q|!iFzuk#}*umdj4mj#YM>eGHX#Q-iaFb1S)`^k!qQ0X6FGiO?ct^ zKSqOnVRASRci~F>2`RtnpwN@>F}x8!#U`v^*_v>^4Dls{3+ZniU)U49sO!cNy)w2E zm6KxHGhteX8amwVFOX$ zjvh|Mk5GY>vkGm>5tvhrr_f-r#>FAH18eXt)Ta6ZU&0|b6*kWS)Bwk^Kb{E;v7=Oy zO02~Od>5Os3QHJFB2|h+;X)EwqrHkAN02)`_Sxf%JJU|jk6rk?rfh{c+niiijXn?#alSu zkGyJc+>Q$1Mbu+-3KiIYa1)N2K{@bkWDREO&4vFJ*W#D-_h243FsK$@J7H$wRe2j; z&Vl=I2R@5;;S36CaVOT}0TniuNaR21SC#*^tm2NgSbXVXFWu=T953Rgv&r^kJeEzS z-AH>Xz0&K%STfb=Igv~@mhH@#wpb$SImZ>T)op`kJnH@3|2zwGN4mHl?4(@XgiD?STF{?B-e9oO-a@o2(HIaw#F@H#S4 z$Me#jUpydOG|*YaJQ)Q^#L;#|?}rEVUX(vlRa(Z##&g;|C$l8Kx$jVa_>j6j`Il=( z`9IbCvB)p8b)k|OMC~N08L=Q;6CFO#;}Sjw)p@$|B^jd9M2JJxY+DrOhVn{Ap?$z@45KQuhk zzxV3XMR|YfB!BV9`NjFsP2>EY(I+qNAI$vQ`1$=;Toz8-6-ko)yF>fkH=HZUpJTj4 MQ=ig&Ys<7>0ZyIg@&Et; diff --git a/tabcmd/locales/fr/LC_MESSAGES/tabcmd.mo b/tabcmd/locales/fr/LC_MESSAGES/tabcmd.mo index 70813c3563967e07d984ae432b60a78401fee473..7fb39edf7958bbfde5e383f8ae663230d7ec43b2 100644 GIT binary patch delta 3681 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 R=L{cT{zZrQmFW{b=5HlF(8T}% diff --git a/tabcmd/locales/ga/LC_MESSAGES/tabcmd.mo b/tabcmd/locales/ga/LC_MESSAGES/tabcmd.mo index ecc45de222bfa7f4ac973c88497140198c7e605d..be01907c551b0281acad4361fcf4566c9606fddc 100644 GIT binary patch delta 3662 zcmZwIe{dA#9mnw}0g_4tghVk3ktc)*Shzrh2uZ30k3b_9E!LR;l3sGl-AymI=j|RC z{yBl-0PSe&jmnRqWl~$|ly=mUu`?O8bZDtRm{O}%2Bpqai>2a^!qkr1AMelIPOP0W zmwW9#yZe2<-|zF>a&%AG3wz6QXQzyP$nbB3ziIqk8mF_*{=HabOdY2uaT30Rjrb3| z66-EE<{F%j7FXj`Ob7178qN>mWITd;?gTa%lQVB{U>W!XzlhT&lmf2A8Jx#Z*LNci zn4jPjd=97M>!=An#p`hL#8M%hXgTjiJ+~zo--E?Ou#x%AiQtC6paNG?<{Yd;B^1U+ zOygDfAZnr?SbIgucGUPfRQw@S;@`#^<~N5qQ0tGOGCPZ!@B`EX zQy83$&1mr}s3mbxt==7+4!1Rz8Pn;kn?vl7}tl&8R)ojVdUCivI{I&Y|G^II8ehuB89U@B#xZ zSV4ItXWCFL??LSa5BZn_d@0aVfv3=N{w|V>nLtz}J_FT>F4RQp0zI^xe+yOUVfCM9 z%?Z@noJCboPF8AFGips2qQx-kJ_q@jU3_URhlBBF1OJ4Lj8~F{#W|?X^#sO|)it^M zIABh*HyC&VmDzE$_(xPA4Hhdytz{P~!PTgQHlRAU4VBQt$fKqZcoNCUoC{PNNhoJ( zIiUOI22>|*MYS@DN^A(V*55@1cmlPi&!ZAMgKTi~Pb9XP#O#W59cmABp%QVCTg)!h z{XfJy{r;ckK$X3Oyo1b#$jiDZ6PQfnvvDf(n`InmcdrfHiri}sp>F&&hVV_CiIZrDDqD!UuOIoCd->7?2ZQku zR3fK?@efe(s%&YgnlZPZfh8QMm9O9p_z|wg76#{I4wvBLsE(XR1ukc&sx!5yC2K{s zb_Hrldr|RRyb&M6*YMA%f}d@o|64S`4hmz0@`!DIgl+g6RE7V>#n`}W>`uHBSK&`l zZ?=#5qBvuTstzp0>v0{bQxBkCXh(4ozKy!SeparumK|Kx4eR;33BQTzz;XN%*6=b= zLSIEyvT)(@|tBeO?QriP7WO0jKjDV>-e8X zm1R+h>_@fwuebom&MhU}hDvw?s^agV5`77k&}Eb_n^6gO;SRhP_h7Dqouz~Cqt<$H zi!pa#0$1TPNViNC7iBA|g}rzSK7dN#3@*faveWzEHta(mRmjVz4u6a+znRfmOe|-X zbD+#4r~nV4Zg?KG7cSs*oWxCZ&$OTd^`bWARwSkwL5mlVCYp%^Q=BEJ1lA*=%r@-C zBe+w)|4%tkMLYP?+KnJF%%#BD^pmce_4qpO#0WYpPR?nnK6 zU&RDgaC02fxQ6-7X%243dF+%J=1`TM!!Ddm6a`*`44ENZhEJiE=p+0xhS^A3qWiHP zk05iJ-v#62*~#ozvmkIS=J+$)`FaG8p(g5Or_^B%r{ccg{7KZ3oJ5w}ypQ|P-c(9> z1o@?!w^5sL{L<2H??M$cg#Gvfbg`m~{@>5RCdyQc#!(jCGz;-6Ork2@j!NtqR0VHg zFHX3*w8k;ieY>#&e}&WWMN}d0qL#Fh-)a+fpbF><=SqRT!@ybw&LbP%EMLz18?(3) z7qeq-#jQvz^IM#W)hkLZUX0r~zZ*B>CDhU-d6-|K`58WqXOJmPp7m0Ps=wY-ny?42 zVPFdm<6gWAJNb=G#(h|ghfz!N3uM{NYpBX<*a&PRvl6vL+wfX^G{3j1rOXt5*^CqN{D`0R@|QI%ni_NbkaG`_ zyo8$yrCh&nqnk}d3vCUV@?0rwI+F36OemIg`y2>to1WR-FTd}962 z^|+HvhX&li!AL6l|1L!xZy=LM>⪙bBgm8pG+oF-xwYLY}iXX1Bs1^fx=_co68D+ zx2MJw&dn?zTeyDCfiZ=ud2Qng+1941%KYzbQ~uQ4j*4!Y;6(Gi;m&+l>!QNL z;SH6!6~)@@Xl?B#82PVy+Rdtj=UaE9y`$J|J6g?}xVza7I-VDaIX1~niBxR#s-<9C z>Ya6q^?7rxA9qsLxhLV9ZZ~5Gm$(_ns!r=U9Qc0PYj0_x`$;E~4aE|EJlh{ixEf)Z kTZ#`AZ+G(t!!`9b>p6B->7wln(z?;ki_Z$>FW%DgA8K7A?f?J) delta 3419 zcmaLYd2EzL7{~Exp-@>sE}=lNZ)v#%mb;wNN|(D(4M&8i>$ZJMSC(D6M_U_pg{WyX zB4N2J;sF5??j;e47)3=JxkN;w#3)2X3`8kWtCINrv9IwTW7FJ4O1{^^xbODvYPpAxBM5V|rRDk#Lp@mCP0{+IFb*QY&xoBk0QHZf;b7ELBhz0I12k?DXR1}sEV$2`iIb>fA%iwuS3<$1!dNqG_-&RHPHg6UyTZ2 zB`VO(I1H0WQsy#h3w}eL5sSez%`DVBKF24~qQ41=*&K<}P~@jkCAp6LnoL%a7FswC zmFXhX#8K21y?{z!AF5(!QG5I?TKEfUTo)#%X$nwVT8g?J4>*n0s7McCE}lUPZ=g!p zmDS}4)E<|j0xWa-^~kSzkq--ZqULErCHNC+YumAi0?k4Kh?@a4RKnS)$h^p!<_X93 zsL1y_HlYH!gzVbwhg6a7JgkxqMFlnmwdadb&)1{2Hh~Ik8+O+B|2PeTGZ#=3HQ&BL zq^zRr*~q)ej745{#)Deme$>QOsDM|Xg^j2Ry^VVQH1cb%@}c=NDTl`ANY*#wX=va) z=SC2cj9(Ogs!$%H7@ftB3_iY^Dko z_-fQbXHXSzk-h>iLXuO1VcthY`aNo3Iv<*-0Cj&U z>a4879Ndpo)to`i^9SnC_T?egG7q7JtB|6aeW-c9#D4nz-=e`_TnfWz;%%aB(6|LO1K1IvRf5fmPU< z4V;Jd_yC^5C1~-KGHt;7@E~g9o2WhS#Q~av3sBE(L~YqsoQY#O$=bRV*c*3ZoS@7H z&W&5hK{olE3^@n6WNL5&9zrcxQkXi$VeCQwMW??VwKeY|$G}{|&Dgal75HA{n`|y1 zMKiaGs6SORqe(}Z1+Wa)V+dPt75Yg_Z@S-6;|CO{UPNA0<~69m4xj@60vDmalR2;$ zdtp81;W|`+Z+YUWfmgY(m72fhtFlq;*-st1Y?c{H+=Ct;q<(ewu4*Hha$*(#D z(_Q~uiG>5n@tw}4x&LFnC3esb`^&u*cEFC>UWKKXAe#Op8Z&Q(q-kRwV6iLc15DH zI6pZo_e`sHWg|w78+zrnofGCJa;Ik9v`Rc*JTdvokb;avThEx}=Og;I%drbakNlr`5=-6g~8n^;*g^Kaef-S_|i diff --git a/tabcmd/locales/it/LC_MESSAGES/tabcmd.mo b/tabcmd/locales/it/LC_MESSAGES/tabcmd.mo index 50a2e9f7482bc20238163ed7a34ee46fb1377735..81bf77442ad08df8ef4e9919fbe0bd999d22b69f 100644 GIT binary patch delta 3678 zcmZwI3vg7`9mnyL015ABASNbq6A}YTHiSpO5P?8Q1cF$_nTo}9lfB7qyV<+$y-Pu7 zx-2vv$;_ z>cJav2i}bRs8qg&O5x?8UdUjJdNu0Kw4yc?L(RVjHP4}-ej2s$ccznnML0x59Tu=X zf-?=Ml&?kI1sD04eSB%6qk(UtMg31mEM@|;D)35FCYn(T-5=FcP#E+7}&{1chmOk#D-a|`MYG@}A>kS=Bys{cVO z)${*T3fkE@=XJawzo0SxFyEg@HNBWvWsE)5-2rpq3P9h!J*+NvmPUK_0#g`V?AGDu91#&)U zzlxe~oRvGOYRvqAhTAA8HSb^(Uc)sQBENbAZpFoT0G0ZSI2MOc8T%AR<0x*f{`;7S z%1jYzTn(sJc(NH8ZN+mUSloTfNSw#WNq_G z;1yIrV@anLC=OhN%EUdm2)~9T)9k-FlS{=(8Wz&<7Ouq6y#DUSb$B~Ik4pJPY{ap= z9PYr?*pA;tU8)PHj18flh7w*L4OokMj3YQ7JygbD$WT~8;S}z`k-UE+_#~>sRn(D; zXI5om4U!DA35nHYa0UJlbw@7aQk*e2cZu&t1@Ztc!xW})0FPj%if#Rl!f%nW<_NQF z#z9nyn|LiMm5&D=M5XW)uE)Ql&bVz}?oF9N1$Y>v_#5OwGK)D+UCxcDBX)4Ip8v-v zXuxjN4o(Ce{)l=HC|}yabkvJx4(jaIV;jbii*1gg9@DpRISwHUm|8B5&VCt^WOFZW zzzlv{&;J_~6u?F)0w*QLF*n>+r*jC(+TJSO|kQ&mVyV8bC zZPKXmhw(u?7ud4Im@d{g$0_L2mEOk9#LcL)eHGRI5t0lupPNT4CW3e3Uepm?L1khA z(d*7Uj3u}Sb$13(fqjU2S|-xSJvQ?&Lonvc6b|6`a0V{o%1^^~EXJ?mB;1M`xDzY! zC-^eHg*W1EZde%}LEWV{0vXQ=r1S#hbYWnksELUb-47q#PuuoRy|9mO$JpdTRj(u`V_VK)>SR?!(xq84my zAx(M4bmNz(r&s6B{0!2?)N$}d=%Vh*PW%r347Xz|=b_BLidsl7i(f!J?!}K$?N5c* zy*g9mxXZIL$iL&K^gui8+Bv^(R<~)7tx<8yE5` z#($jWhbDI9`-di<&hz`HmgW2J7JWF5{}0r z9bHbsvlCv2w=HQKFWlMH8wurlN9?%m*`c14lTLo|m+o*Zo=({z*9&`Tw{J}OqT(Lg z3)x$l$&ERQP{Q##x}9_);y0A1@-w+sxD^Vrv zE|0nX=l7@`Plmdj-rjH`^8bE{*lt%Umek1MiRWb3&5n%65?>!~|Ge2v+Fh~kSeO68 z%&I*96YJCn|MjYUBmC!Q-#5aaKliRt{_*;OG5*n|wS|4>tXX}3yLD+nD@m{;eV0}? z^*vI*&@Wq6H9FIl-J3PMw?-4R{MUXOO?%AsET`Mrn9a5|yqkNX&Nr-H+jYY|wiTyS zEYUOktHp+`T<$CibY1g)Da(%6)Aj)M{ZL}uTw|w2o{{WnnDO>;m delta 3402 zcmZwI3v5$W9LMp~!Ejg}gN<2WvJ2D+!YWUByE%q{C{vL{h&a3TZWKy8Zab9)tPp}k zgA(h5IYFaFXM$1eK!PFy5k-yYKx1SvfyE#$lF3xW_xES7F)=P(Kj+-X`Tx)VoO`=x zn`ix#p5#{pdp>UX+sl6;|Lxi8{rmT{*O(!6w_|_Yi{tQpyb>?sa2(#pm_axjhv5>m z@Ls$On_PEcKK-LOz?h`@iiU3N!ppH&-^`7E97BH&YQWVv0=K&7)2QoD;6OZ&N;JEl zF-2&h0+r!axEM9T`_aPfcscRS+wO^WBqMVXH6t(6Re%yyfCV@j??ffG8FgJN7U1Wo zK;NMceYwVvlNpa1rxYz*hD!84^@(qq+za-h0)2s+K__YkUb0f=7AnD6d?|1x>iX3< z3OAyKub={aj4J(Ex9{O%ax;af`^REZnJ=U<8Ew1*n{gx_L=yy4!yjwY2T-@$;_P%xW;lefiX1Gn~MeN;Vf&vb&H~Fj1U|>re^oLyBVB zPy=_MW_l5|NAfv16enUaR-#IOH>#qKx&2nO=(i1`{@PUC9MH@Pn1%vWpaxp(_E)14 z*nmp(DZCof$fQgMY6&i&_K3yBG|dgDae}Vv(4yaj4K(n1TT zqGq}THE;s8L=T}R@G7ceZKyRqg%*B~x^5tY(=^whmb4OeJQ;BtTTz*|;&A)~Ej*7Z zVII-tc+?tKq7tlj`;ExQY~jno7SuRLQ4{P$E$yWQQKCL1fuy;ThDx{qm01-M)2wxU z0+sn|u18UcoJLmd@0(PS0&Z4GOHhfGqt<*W>i$O5(xy;}y?_Js{2!q~a^?%vK;3_z zAXB2~cp>s`GEDUZ~4;rIg~@!7fIrqX*6`< zBKJfT6<{-J7eDLz9%`U-r~&#gy#N-Y9~YxGaU<${3#zh*uo*u`ie?-u^He>I$zB}z zkcKu<8_vfcQE#|X>NEvcqDuEXUW%=#iX6Zk{0Q~4@fm97CsFsE!#P;Y;D2HSHGv2V zuY?{PN&OYDnDn)l^*A0kAulbn7ZvyeoQNl}0{iopx&d!PVwh)K526z5Kn3b@?ME3^ z`ms0}XCp;4Yl@SZ5^dwaBo6Gvay*5%qMz5>EW8I*+TA!EJ8&Kj>+nY0fl9m+ zRl(m;OE8+3g07o|dOQ<20XHUTXieV0GCYo(FrW8p2%AyoHQG!lL{(%7QVg>K$<;i9 zWw-~G;04s)m@w9u85l$_Zbv2bGG2?x{WKgJzv1f`W13&$2<~PK^E)oX(Y)?d@&{0* zZFB8Hm9*bDV{XC<)Y?Ca%*A|wO7sU@j)PfWE#(H}K}(uFG_?DVqxQf#%*CG6M>h^a z&15?2d>HkdCs8wb4D}{!L9OXWI2SvS4R0nAO^@j!EX4?F{GC{!=YKy9WqJZD@ekaH z3)v7#;5e#;KO>Vhlb9}Jn-H?R=1Kes-@!V3gN42xiztHv)}j)55w(YoAR){TIEwgY z)Kq@M@fO#^SVMpEw9IB~!WHz}QENSy1=c2wBE>ShklaiME<_*M-iURmC2K`h#kduf}^E(5C9fRXCuGi!g~T_y_8`m#)ifw&U2Fes9X4<9W!V zZc5QY8<*lHEW%Sb1U<7ei4-FH(M+A4*zhzElZGS;7 zG1V+^KE8hbY9q0GoCXYr zBMpunh$n)HhPbH?hN>KUb%PyG1VVO#lYwyb?qDPws;Y@a6LvIFl~_}6r!RQBJ$+*J z8Y&)$23OhXlYOIE-hYlXIFaM{OruQx&o!cEYYwdiC)t+i_w}I(wi$ zE6=`{IB_LO##Ob-KJCx%?wLB~%keU@aqL>hjxSGb?K?C*dT>#X)Xu_^^v{JWveI5_ zq^H;QWNn91`Q`p}VEEx40~W?s*%r~PdM8$AClaxAmw!i(Ve=zaRA*{}(O5KG6SL}V z$BG0kCmfGC@znkjUwX@^r9Dzp%V(s|jJY{GwYz*$ddm1+y>tJ2XR3YN(5#r1+EY@L VJ~KUVNve@s&X)UgQa>)Z?l031)`b87 diff --git a/tabcmd/locales/ja/LC_MESSAGES/tabcmd.mo b/tabcmd/locales/ja/LC_MESSAGES/tabcmd.mo index ce6b79faf1cfce2aa07564598b25344c194db3db..8551145560074a86171d8b8a577d3379b00d78b9 100644 GIT binary patch delta 3730 zcmZwJ4{X%s9mnyfth6A-QVNt-3cnUhTPar@SVw6QYAGEQTd{18iruyMqj$5tJMXSc zaND)Oj8%+-!%bqyNM#DxfOuORFrpYDbF;>6V#YQ*Vn@mnaX3db>d4-o{(jcEtSR?; zp6B=c`99z0xnH?(IOU0fl=#rp)F%u-C;2yvfBzb<+7~~sPckNt>L6y~B`m;?aXRK@ z7&99eqJ@o^gJIW)aT@jgn1#PUjXR6^#>CA#6f7D(#rZgEvNK^l7Ez$2Mp+)^$sBv4}_9t;P5G-JQbJp$fchtn`Y_k;ePyy9q0fun~ z?nW(i2xsD3$lB&IYN1cj!rUp2m8kX>)cjjef$zj=tZxP=DD|gNkqx01yn-4qmBtb* zLJRLe9Z3k4>POsqKeDztg&IGI3iuybglSAR7t2uVHDO#6bWvD;iN!dCnjkIP z2_zp?Ux+%xRc`x6*D&VNz8!TW`%oEr0hOWOB1tyqu?jC`lYcg8is-EgD^NRYKwYX1 zya6A=dDxFiElCZ+3&W$t#4e>MU2F0&GMDbT2A%+fV`h7#V7ku7gNSX2ex#B%rv-r9k%0 zt*A__MWxb*3TzANtaqU%IEFgY-=G5fGjhSrzmd63CaY_nn^1RP1uBpb(#7(2_Msm?LG8Gm zw-vFOAD{x+k1H^V6?hdFVj17*2Hc2x(H$;{J7;^224&!VT#MO!>D$nY>+lR#VGg6T zqh{2O_Mig4h`PkJ{J~J*8&HA&6j$R(RA6akPGGsnX_%Hc1ugI(ZpSz9Wn4#oG+{Oe zAHY)71PNS<&!7T+7Zq?iZ?9@xk9S}KHU3>xzmIVl=97k_cn@B}c*f1VbSPZKTkx%~ z8nXkhTSS`haU^(i*)?~u({Ckip#4GAop~F-hVz+(Y#SeL!JVk1N#h*UUV_A8nvlB_ zH$4>CwAq7|cp9hSXQ;Eyy4Cr*l_9a2wWt?P4-%6(fC})BsGX(~g)&r%v(ZMi@4zK^ z2z6w`_`1ITHMAB*lAh~Z$0ZL=Ig^s?pE_$?^6hEwrzS7t-u#t&>_{XO@w9n;tr7eFZaW(D z1cIBrodI8Kdng#QgR$1wmauJN-nRBGpU3I#vpemW?dgbwy2D?7vdJ6h?2g!;Xv`by zjwUAN-;&c|$2|4}%oGiTf}UU~*19Rw9rPtD@+0Ho&a`1~Bx*-I9i5>zZ>Oit_Io!6 zLXoID^_QO#RnTsaG1vb*_uHLePkX4V%Nz9lzeheh+8zmnHF9j?($RHCM|K8+_l>oG z(Hsri?SV~!_T;m3R;DCp6kJM8=FNLPH8H+AD>1leLZZ5;I@vUTW@_^3@?&Yqhbu}l z5=WQLO*9tGN-nwm)d`6Yt+@$*`O>sH5@Y)k*Va@enkyEMAL%=O@kru>y4>X54FeP6 zt44QjjqSYBxGn#++e*_Ah{mkYCaZb$EUdA;-sKN{*XpvPQE!KBb==7$kq*nr ztQ8vFeYDJq`R$-(KM;tSx=_UGiiaY$r7T!cn?fuWj#ieJb2go}x7*VZi21wQJb{o} zxCG^+gGRfDf|l3%JVl=`X>~_!tJvvlRk=|vvljS^J?7$%9=q80*zmU9BZp3m>^(Ky P``mEv-r+>v`nvxB8uU<2 delta 3425 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 TJH|Q}<~t7-?&}!Koj&R>VHW0% diff --git a/tabcmd/locales/pt/LC_MESSAGES/tabcmd.mo b/tabcmd/locales/pt/LC_MESSAGES/tabcmd.mo index fa709d8ac9072a1809f9e6a84bcb9f9820df907a..6bfc41ef43a06090a8ccecfb9f466e6bdc52a870 100644 GIT binary patch delta 3682 zcmZwJe{h^d9mnxa8WT!?H>sharJJ@PX;Ur%La|AxNgL7{q16HZCB{lxdhE+Mehr;|NSK0&Q?QR41d2s52Idv_R_!gHhj~JP$z} zGnePJyU#wm-~H}Bm;8HQ-VgTYWhNFDeB1Ez48KeGz4QsyKKeN^%a}5%CvhIWj^+3s zF2b_e#$1K9XmKl+VlwpWSVDaW7vR&V=SFd z<_Ipt7jYT>0X4xtaWyWO8!V&|E%j}v=k5;M58_lHSkC-rH0i$^ zLK>^E0xfPqZHbFY^ZM&>rZKs|pF74QYDz(NLFfoo9neGW4kpqIimxCgbe99H54 zYJkGxAdsb~dM#=XH-+tYg(h(^?f0X$@BC@Qk!Xz`Dzfz&v)GSpr+qXOKD3h0Zd%zX_N&;jI8lM6kG#AMEfDvbn` zF^egXeRCr!6StyL8AAm&fZFSCp$0gL+S8X%f&Csi;ARpT+stEjjk6kc2AWZUxJVbX z7uEl9EYth{QwmzyDdaoIyn}qXnSY@IxSTLG@p9Ba4QTNTs1)|0Cfi?NwOH{AL3Mo$fnA??d{U5md)tVFX{pl{k-dXk~S%ejUiie3gqP7z*2; zK?O1%w!e)UZC4gT!L`SCId2QaH#7+KiPfPZK1OK4uSUuSbxN`5Bj+aRRsE zO1{=~_E&ncdii z+wc`sCRXu%tN_-dRyKf&{6W;ppFnNdNmO7n_=~j>ufxl+4>itxxE>E+0#D-)G1I~Z zas1;v8rLdTd)E2BmP2izUe-_p6DZBztg}#Xz zzkqaa#x*#g_diX6^JFfd1}wQgSm73IqP`n-{{=jc=kW75UKgagnsg{rE-F(;k))V0 zWKJ`Q#B6HT5+v@xK718hncsYtccTIKqf$18df!<2N!)@BM6Cb@ zQ30I5VtfOY*-2FDS8|Yae^zKFe-pksQ&L`CzcZZJ$TPeEw zcpk$u_&jpU3~|)k@lU9Mnl}cSN+U0dc@Q7Qr%`*np(Xea=O?HPT*Q~L>}LKM!M~!$ zxi{Jx{Nr&9ucG14IE;CljJXRBp|&KSBU_9ms8m-WSvO6nfp#I=Y<`3m&tW;v`b_q_ zvm&|j+3)7%B6HjGb0hPQ=jDbMF3HdRw&Z+4?zP3&&bZS_rQB4cBN}T@IbTjYo*#)P z`l3DYSbL|N@STL;?hhm#<3~F>dt;HHcg*Q=d?(VCa?{C=-`N?B_oP!!#Pg$m+RM&d zdP8ZK<42r+M)KlrB9d_Z_ML7z5zDPzn##`v!zQCC&q+nPdfbj^Po%@?j`qdflot;D z@w-Hoa5{a)`k(vVPERt@>Gt+U6S4nyE9Q8esd!RPP7l0lYTl_Qd*X>NO}Bs4>?NJf z_|AA|?(j03mwU(FJ0q7_xnoB5@yhwRs;W2hb6cw4Ey($`tuu3T>*IylF}osLT-{LE zN+O(Cwy&u%+f-YZJJvKdK0$%*P80hEpgAc?oNCARL1S}if-$6zhZkG z&x>|BwuesfMA!6P%c5i-IVR^c2kbkTCL|$@cpD$UsJ;l z^f=LUq$}=sr#m8XS1oLH&D29v-Q9$Z+7A=);gmM*IkqzBYa7ET*V}8lDiP z;Ag0Te#8I!Et?@=?zCn`m5p#q%EMFTgY z+Aqg(xE3vZ2{pinsMLSw*RyC$Y^D_T{sc@Z@&*bQppEBXH=d2#Q3HRC>L|OIY~X0r zOy{HaKmyfIH`3H>_3JxOOMB42-|st!S&ia;U?ln14A1AHl+8n>?0RGsjDxdqH7bB! zBq?Ses^g=mnVvxHk&)aSgHv!UHlkABiOT3YzrGDE>ibS3|Jqao+|bNQn1%+ZLv^&+ zuP;Xha3?Cz$8jQh$fV3s)Dj#=?GcN{6wRfme!{-1(W1TqiP`j~C@Av1sFd^}KQn|; zq=gpFK+SY1s^cVTiS9#9U<)c^`%r6q1TFjp)vk!nDVk}hC2d6APqq1lE>xu3upB=^ z3;R(iEM{~$8MVfZr~sGw^_9raJix`m=TQCZLQU{{)Y6{HAPO{q1duY76qLdRsK`Rd zm}ZslW2neq@!f?A27g z#!E54M?e8bQ2ixQd!ZZonU}d}VxJ>1m~T=Pv{u9TYMhUixE8O*rFa;XnHs*g3Zwxw z!+TIOSdYrU>v#cviE3BOzfcOa0q5XqJQcU2`rCsSVd@A4hl0g|ZNZ1o!&-KdW-x%) z;Ancg7(0;zVtRZ(MGf4Km*BXGnT*_o7WGZ2W4Z&QcmSthaMH;oN|_`D?aFnih8}7Y z?Lq}`0LiY&X5sXFJnD1={rVDA1{_pMA3-fm4{8teqfS>5=~cTb)Umz%q^y4{1r2Z) z&c_$N$I9`j|Ty3ahw+3Ip zr%+3_fappvg6vbXayI8*0c_@mUf6>XJchSn16%X~+>Pv0v!ph&1Zy#mdM_#?+i?u` zV*m?+neRg-mQlY2N8@_Gz7@3u`+}*=?$0GZN^t_UN%rHH_$LPO3$}I$$FQ(0zqt*S zi7m(hG28Ke{0X&`tLifUarqfF!K%5&ypLDndbH{@{q#(yz=<$Fpi*8s&zPriCN|?C zv~U(XvmBeXL&MQ%`s0E?`rG^wOO}NrH{IaIJDjNPRy*-ztR)r+Cu4D^x}`0Ci`#+W zSX+l{S0|F;WJkg*3r9n)y}ZLtB&(x#l84nXr!(9Zi-sa`Cuuv$Q1aGx+dG~=kTo>k zuC5Z*PWWcqJ21@2&j065huh}WjQAw0`hWVn!FFsn770b|HalsD6kdBGWV>$M^#&DH zWEa~j7$>11i8$1v=)H=O1G(wFfg$vHQUR# z%Chq6iQ0~)pQ)|z#+TooGrS>wvu#D=R=XQ-wUcr0*@|$^j7H1R?MT>pXPXm?#MQvH zBOPucKEYzDEpeB}glL7^!#uDpCu}XgVxc#9+@IO$owYN)ob&o~({;hA-ft7@PZ{yw j{?dh&qtbgO1d9HriwkR7^U|jTXL>7w_YO`Un?L7oajD&< diff --git a/tabcmd/locales/sv/LC_MESSAGES/tabcmd.mo b/tabcmd/locales/sv/LC_MESSAGES/tabcmd.mo index e329a6a88f01698761fa98826e41d1f6b652ae22..0fa1d20a14bff8ec143200625ac794e0373ba9d3 100644 GIT binary patch delta 3712 zcmZwI4Qy5A9mnyfEo(Js_oQ2822XQ*(r*R6tjOup`D~(B;H@LA>ypK2Fywd!DYj8g09@O*QNC)#A zPQ~MR4gL-_!N0Kvr%cWV(u9`s7f}7~4(h*+xrJbe`OUGQ!JknBmk{PctUxWO6+@WB znfM55qVMBud>xtFyp5XZeY7~IJZ}T4elu$P?Wl!6gwvVdJkO0%{|ahlqo@hrL3Nl) z<@H#F7H>ywiHl10?w~w~%x#XK`kzEC`0rSS#SFFp7op}`hiMJa$IW8A9~D^^t8o-H zK=HKvLMl<^I@BKC64c)rn8Z2M-;3Ikr%)L>gv!vbkR+QCY{K)?$Ui}vDq3s6WvIy7 zQHQDr=i&o+9S)*Wc^s9(b3wU;&X#f&>ddsE0*ax=e+)Iw!Js^Z3Ve75`PT~HrlJ;$ z36I5@WvG~_XhAK+MVgph zsP+f2Lht{NxKU)Mk#CT>fPCD{ho}WiV40eDK5C#ww0H+9g#)OGcOk!KKNl_FXQ=ig zf&W0YD`hg(Uyrkx-`vEFPWKlB??Kv{gQ$kTz%agv*J2szP-OL}cAdzt*}+8mE9N)wBxP<)b^xud2F1&yfa0K;l;;o?k7c8NC z5exAH9FIE5`tVG^I;_JtFoMeH>ILL~D>s{%y%A5L_I?s!D$)=a?Nu8pLz}Q2)A%_& zfr@Y@vydFK7)P&!`3j8r@LBpv2<5%bVRjnrf8fXm_>u^7+!$mxb z<)7hI#51T5PZ@dE0=HlpK8iXc`|&}14F_=3P5Hfl4K?0GPTUXhI^2n`qxyaR%dPno z?Zm68ID~`v8@v_#+H7djy9L?s z&`VP_j7 zc`-K;PPl$Yx7(lS$}X!+6{hpUCL<}&NrijjZf7JO?sR%112H${1w()GDXU62QJ=B? z=XtLaPllszUtc8A_5U7qIbJjsORDGCzzcKp=6c3siLZ>+e_ZV)ooK8(7R^3;O?5%` zvYkQj`PS{W8*`brW07s>b+_6+$MYgR zj*ZhOmgpIKY6;%v^Jv{%tllE)_c{sdY>WA(%}v?9w3~9QVz!>cjqfMDhT2+oBJM=` z!#y#-x4$zSb5+BZ*XBCqn!5=bu^%PmqbY5_=h*6eTiX<@ve_=~tqz++q%Yz4w)^J? SQZ~k6vICJ+#AZs{LjM8YkTYrk delta 3411 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 delta 3412 zcmZwIdr*{B7{~Dg32C4ppb-+h24PyPqA3Dh&`O;&DT_+G&?+yoMZ3DYq?xu>WX_Nc z)21e5lVy`NUC6am>}nS;O<81(O^!_&X;P-5Q~uG^_s5>5nI>o5&pGdV-t#=?IcHy< zXi9kV!Gy?xj6N$3|F-Zym;d{d)cg0}Qz^#e&|QmZxCKYyP8^1(aVQQ=HD(ZAfq6I+ z9bAZK;~MMhm_>gV4m2iW4$#np$M9TC?jL`!5HF;E6>7rycpkRc`!Uq`y_kU~P>CiD zFeV=zRG>;6fz_x5E=32|;<>~(@7Nprk&Mh~)QVDAt^yRJ0!+o>csnYw<*0F+a4>$2 z3iK;xV|KbRiLT>qRgk$7>h2Rk8N0h@1p{Dp(aYqq#BrmTIm$j z83>`~X+wsZjkf<0YHRn~>nE&9tm+)DXJ=7=t#CA7D%oUI$?iaQ!T9kKT!KoV11XB> zL`{4UwbIk5Gm^!{Avgw$unJZBdr%d9!uB_zL%(wn_1B^5;eu8+m}Mxym8glTZGS#0 zfd^5Ew&F;PA&W8xQCsjk>WnxHrfIH5&EvH$L5KbtBxlnRp`pz8ph|KS`Ix>$kq$aI z9<|b$sENaEMf>f60!6GcgYSbZKgu1^0RoU&>hF_y97IfmT@Z}gu=E7DQ zIz;bbB_2c#ETm4vGUcd4H52=x&l*BKzr@;PuQ#K91uJnhzKgHp3DkV+308+6oJak~ z&=|o;iaxx6jn@Q^BgvXKQKkG5_17=8 zByK6bMSnISJ)Rk|SR z!ELBgA4F9ypZYskfx3Sy62mm17PJ}1<8d5>Blzj0VkPSQnQLgM0*$B%TdXf52iWYy zMfe+Pf;&s&Ki8$GL)C%aXKEr zo3NPl{rE8I{z=sM^m1d)#4=QZ6Hsr)dQ8J*sMEa)dFh$2Fb7Xz2BufUx1yke`fJao zaN!bMiP_kRA7VH1G40$`DStujVbP`WKvPi_yafaJ5YE6J9E+34Lh~)g<+u{>!@SGm z6=*G`!Fe<9VICgCXECjkGT}z-&6wAoEYR!ETU#6bVnBBEa7y~kv%Pcfni~u>`fJ^w z#~%p$>U?v&VPC-SscQ%<2sWbE*U%VrJ)y8S+!!*my|pz#cYdQA3VUkZFgHCu|2^IY zUv15tfIsZ|!!_Z1=ee=pQ+g6o1M@Uh$m93k?Z&?C?@vtm=SpL+Ay$^YH^K8i^UZbr zZqPTUrq*q6!)}ezn-{8agTX*BmXuMLnCUJgPDn|TaZR1Fj}>P1^oj1t?wi8QCg|1$ z-B5kBrT>uF@N@Fdh`yX#9Qz~p&cs-XGcX}}5?Q;o(US7QSnkmF#I&E+Z9UZX>Y>)A zu9g*tUTBYfQqY|^yz7yULyxt0J+;B9o-xh&amy>*Km111PaQ34ywG&`(TD8tH;T3= zMyty!Vhe_s_K9|uUmSb2c)|b3PdD2KGsos9MOT+sJeORN96dUr F=x-1P;p+eZ From 46b741068dc7daa833bbd057a8664e79e0c32497 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Wed, 29 Jul 2026 13:22:25 -0700 Subject: [PATCH 5/5] ci: drop .po from check-mo-freshness (globally gitignored, dead check) .po files are gitignored across the repo, so the workflow's `git diff --exit-code -- '**/*.po'` was always a no-op and the `.po` path filter never triggered a run. Trim both. No behavior change; the .mo drift check is what has always been doing the actual work. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/check-mo-freshness.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/check-mo-freshness.yml b/.github/workflows/check-mo-freshness.yml index 151c1a0d..53d46ebb 100644 --- a/.github/workflows/check-mo-freshness.yml +++ b/.github/workflows/check-mo-freshness.yml @@ -8,7 +8,6 @@ on: - main paths: - 'tabcmd/locales/**/*.properties' - - 'tabcmd/locales/**/*.po' - 'tabcmd/locales/**/*.mo' - 'bin/i18n/**' - 'dodo.py' @@ -40,15 +39,16 @@ jobs: - name: Verify regenerated files match what is committed id: verify run: | - if ! git diff --exit-code -- 'tabcmd/locales/**/*.po' 'tabcmd/locales/**/*.mo'; then + # .po files are globally gitignored, so only check .mo drift. + if ! git diff --exit-code -- 'tabcmd/locales/**/*.mo'; then echo "" - echo "The committed .po/.mo files are out of date with the .properties sources." + echo "The committed .mo files are out of date with the .properties sources." echo "Run 'python -m doit localize' locally and commit the regenerated files." echo "The freshly-generated files are attached as a workflow artifact." exit 1 fi - # If the diff step failed the regenerated files are still on disk. Uploading + # If the verify step failed the regenerated files are still on disk. Uploading # them makes it easy to download from the failed CI run and commit them. - name: Upload regenerated .mo files on failure if: failure()