diff --git a/.github/scripts/build_i18n_messages.py b/.github/scripts/build_i18n_messages.py index 6770dddf..824194a4 100644 --- a/.github/scripts/build_i18n_messages.py +++ b/.github/scripts/build_i18n_messages.py @@ -316,7 +316,8 @@ def main() -> int: if total_failures: print( - f"\nCompleted with {len(total_failures)} translation failures.", + f"\nCompleted with {len(total_failures)} translation failures " + f"(partial progress persisted, next run will retry).", file=sys.stderr, flush=True, ) @@ -324,7 +325,14 @@ def main() -> int: print(f" - {lang}: {key} → {error}", file=sys.stderr, flush=True) if len(total_failures) > 20: print(f" ... and {len(total_failures) - 20} more.", file=sys.stderr, flush=True) - return 2 + # Exit 0 on partial failure so the workflow's Commit + push + # step still runs and the keys that DID translate reach + # develop. The un-translated keys stay empty and the next + # workflow tick (or a manual dispatch) retries them. + # Previously we returned 2, which failed the whole run and + # discarded 36 out of 38 successful translations because + # 2 googletrans timeouts hit sv at the start of the burst. + return 0 print("\ni18n messages generated successfully.", flush=True) return 0 diff --git a/.github/scripts/build_translation_cache.py b/.github/scripts/build_translation_cache.py index e1877328..6ac25b1c 100644 --- a/.github/scripts/build_translation_cache.py +++ b/.github/scripts/build_translation_cache.py @@ -388,12 +388,20 @@ def main() -> int: write_language_cache(output_dir / f"{lang}.json", cache) if failures: - print(f"Completed with {len(failures)} translation failures.", file=sys.stderr, flush=True) + print( + f"Completed with {len(failures)} translation failures " + f"(partial progress persisted, next run will retry).", + file=sys.stderr, flush=True, + ) for text, lang, error in failures[:20]: print(f"- {lang}: {text[:80]} -> {error}", file=sys.stderr, flush=True) if len(failures) > 20: print(f"... and {len(failures) - 20} more.", file=sys.stderr, flush=True) - return 2 + # Exit 0 on partial failure so the workflow's Commit + push + # step still runs. Otherwise a couple of transient googletrans + # timeouts would fail the whole workflow and discard every + # successful translation from the same batch. + return 0 print("Translation cache generated successfully.", flush=True) return 0 diff --git a/.github/workflows/build-i18n-messages.yml b/.github/workflows/build-i18n-messages.yml index 7124dd86..8152b699 100644 --- a/.github/workflows/build-i18n-messages.yml +++ b/.github/workflows/build-i18n-messages.yml @@ -24,11 +24,15 @@ on: push: branches: [develop] paths: - # `**/common.json` catches every locale, not just en/. Needed - # because manual edits to sk/sv (or any curated locale) that - # empty a key so the workflow refills it wouldn't otherwise - # trigger the job when en/ hasn't changed. - - 'AppImage/messages/**/common.json' + # Only en/ triggers the run — it's the source of truth. Other + # locales are destinations, and the bot auto-commits them at + # the end of every run; if they were in the trigger too, each + # auto-commit would fire another (empty) run. + # Manual edits to a curated locale that empty a key for the + # workflow to refill are the exception — dispatch this + # workflow manually from Actions in that case, or piggy-back + # a trivial en/ change onto the commit. + - 'AppImage/messages/en/common.json' - '.github/scripts/build_i18n_messages.py' - '.github/workflows/build-i18n-messages.yml' workflow_dispatch: