Files
Joseph MattielloandClaude Opus 5 4dc9d15d0e chore(i18n): wire Crowdin core-option translation pipeline (#252)
libretro_core_options_intl.h has been included behind HAVE_NO_LANGEXTRA
all along but is an empty stub -- no arrays, just RETRO_LANGUAGE_*
placeholder comments -- so option labels have never been translatable.
This adds the standard libretro Crowdin pipeline that fills it.

The intl/ toolchain and the three workflows are copies of the RetroArch
example_translation sample. Placeholders are filled for this repo:
core name virtualjaguar-libretro, both headers at the repo root.

Three deliberate deviations from the sample:

- The workflows watch and write develop, not the default branch. This
  repo is GitFlow and master is release-only; the sample assumes one
  default branch, so on a schedule it would check out and commit
  straight to master.
- The `on:` blocks are rewritten. The sample ships `on:`,
  `workflow_dispatch` and `schedule:` as sibling lines, which is not
  valid YAML -- the manual-dispatch trigger is silently lost.
- intl/activate.py is dropped. It is a one-shot placeholder filler that
  targets the older crowdin_prep.yml / crowdin_translate.yml names and
  raises against the current sample's filenames. The placeholders here
  are already filled, so it had no remaining use.

The sync step also gained a `git diff --cached --quiet ||` guard: the
generator only rewrites the header when a translation actually changed,
so a quiet week would otherwise fail the run on an empty commit.

options_intl[] stays all-NULL. The generator writes only the intl
header; enabling a language means replacing its NULL with &options_xx
by hand once translations exist. That is manual upstream too, and is
documented rather than pre-empted -- referencing symbols that do not
exist yet would not compile.

This unblocks now that #257 froze the option strings, so translators
are not handed text that is about to change.

Timing: sync runs Fridays 06:35 UTC.

docs/core-option-translations.md covers the pipeline, the
enable-a-language step, and the four setup steps that need libretro org
access (Crowdin token -> CROWDIN_API_KEY secret -> initial setup run ->
sync run). Until that secret exists both workflows fail on an empty
key, which is the intended visible "not set up yet" state.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-02 03:44:21 -04:00

16 lines
420 B
Python

#!/usr/bin/env python3
import sys
import subprocess
try:
api_key = sys.argv[1]
core_name = sys.argv[2]
dir_path = sys.argv[3]
except IndexError as e:
print('Please provide path to libretro_core_options.h, Crowdin API Token and core name!')
raise e
subprocess.run(['python3', 'intl/crowdin_prep.py', dir_path, core_name])
subprocess.run(['python3', 'intl/crowdin_source_upload.py', api_key, core_name])