Skip to main content
Use hyperlocalise/hyperlocalise@v1 with check: check to validate committed translations in pull requests. The action reports missing messages, placeholder errors, and other findings, then fails according to your severity threshold. It does not generate or repair translations.

Choose the check you need

Use full validation as your baseline. Drift is based on planning and lockfile state; it does not replace validation of the target contents.

Before you start

Commit i18n.yml, source files, and reviewed target files to your repository. Commit .hyperlocalise.lock.json too if you use incremental generation or drift checks. See the quickstart. The examples use GitHub-hosted Ubuntu runners. They need no translation-provider API key because they validate local files without calling a model. Translation and automated repair belong in a separate workflow with provider credentials.

1. Add full validation to pull requests

Create .github/workflows/localization.yml in your app repository:
This example fails on errors while keeping warnings visible. Remove severity-threshold: error to use the default threshold, which fails on both warnings and errors. For example, a brand name that matches the source can produce a same_as_source warning. The action installs the CLI. @v1 selects the action release line, while hyperlocalise-version selects the CLI version and defaults to latest. You can pin an exact CLI release or set hyperlocalise-version: config when i18n.yml contains a CLI version pin.

2. Read and reproduce a failure

A missing target key produces a not_localized error. A missing target file produces missing_target_file. Invalid translated ICU structures can produce icu_shape_mismatch. Inspect the job summary and inline annotations where source locations are available. Download check-report.json and check-summary.txt from the uploaded artifact for details. Reproduce the error-level gate locally:
To see warnings as well:
Fix the relevant target file, or generate missing translations locally, then commit the reviewed result. Use the ICU troubleshooting guide for structural errors. To block merging on this job, select its status check in your repository’s branch protection or ruleset after it has run. Adding a workflow alone does not require that check for merging. See GitHub protected branches.

Check only changed keys

For repositories with existing findings, you can scope a pull request check to changed translation keys. Replace the baseline workflow with:
The action uses the GitHub token to fetch the PR diff and passes it to check --diff-stdin. The additional permission allows reading that diff. See GitHub workflow permissions.
Changed-key mode supports .json, .jsonc, and .arb. It ignores unsupported file types, skips files without identifiable changed keys, and omits file-level and document-level checks. Keep full validation for missing files, Markdown/MDX, and other formats. This mode requires a pull request event.
If source IDs include extract --prefix-id filename prefixes but your targets use pack --prefix-id, add prefix-id: true to the action inputs.

Detect pending translation work

Use drift mode to inspect the translation plan:
The action runs hyperlocalise run --dry-run. It considers executable tasks or prune candidates reported by the plan to be drift. It uploads drift-report.json and drift-summary.txt. Command failures still fail the action when fail-on-drift is false. Use the changed-string workflow to update translations and checkpoint state. A clean drift result is not a guarantee that every target message is valid.

Action inputs

For a monorepo, set working-directory: apps/web and keep config-path: i18n.yml if the configuration lives at apps/web/i18n.yml.

Next steps