[PR #6852] [client] Add CI check for translation key parity #27285

Open
opened 2026-08-05 07:08:29 -04:00 by saavagebueno · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/netbirdio/netbird/pull/6852
Author: @heisbrot
Created: 7/21/2026
Status: 🔄 Open

Base: mainHead: feature/ui-translation-key-parity-check


📝 Commits (1)

  • abd250c [client] Add CI check for translation key parity

📊 Changes

4 files changed (+151 additions, -1 deletions)

View changed files

.github/workflows/ui-translations.yml (+42 -0)
📝 client/ui/frontend/package.json (+2 -1)
client/ui/i18n/check-translations.mjs (+104 -0)
📝 client/ui/i18n/locales/ja/common.json (+3 -0)

📄 Description

English (en) is the source of truth for UI translation keys. The other nine locales rely on runtime English fallback for any missing key (see the i18n bundle fallback in client/ui/i18n/bundle_test.go), so an incomplete translation never surfaces in CI. This adds a check that makes key drift a hard failure.

Describe your changes

  • client/ui/i18n/check-translations.mjs — dependency-free Node script. Treats en/common.json as the source of truth and requires every locale declared in _index.json to carry the exact same key set. On mismatch it prints per-locale counts, lists the specific missing/orphaned keys, emits GitHub Actions ::error:: annotations (inline on the PR diff), and exits non-zero. Also warns about locale directories on disk not declared in _index.json.
  • .github/workflows/ui-translations.yml — dedicated "UI Translations" workflow that runs the check on PRs and pushes to main when client/ui/i18n/locales/** (or the script) changes. Kept separate from frontend-ui.yml so it needs no pnpm/Wails/build toolchain — just checkout + Node 22 (~seconds).
  • client/ui/frontend/package.json — added pnpm i18n:check so the same check runs locally.
  • client/ui/i18n/locales/ja/common.json — close the one gap the check found: ja was missing daemon.outdated.download ("Download Latest"). Added 最新版をダウンロード, placed after daemon.outdated.description to match the en ordering.

Chose key-set equality rather than a bare count comparison: it still enforces matching counts, but also catches a same-count-but-wrong-key drift and reports exactly which keys differ.

Verified: node client/ui/i18n/check-translations.mjs passes for all 10 locales at 444 keys each; confirmed it exits non-zero and names ja: daemon.outdated.download before the fix.

Stack

Checklist

  • Is it a bug fix
  • Is a typo/documentation fix
  • Is a feature enhancement
  • It is a refactor
  • Created tests that fail without the change (if possible)
  • This change does not modify the public API, gRPC protocols, functionality behavior, CLI / service flags, or introduce a new feature — OR I have discussed it with the NetBird team beforehand (link the issue / Slack thread in the description). See CONTRIBUTING.md.

By submitting this pull request, you confirm that you have read and agree to the terms of the Contributor License Agreement.

Documentation

Select exactly one:

  • I added/updated documentation for this change
  • Documentation is not needed for this change (CI/tooling check plus a one-string translation fix; no behavior, API, or configuration change)

Docs PR URL (required if "docs added" is checked)

Paste the PR link from https://github.com/netbirdio/docs here:

https://github.com/netbirdio/docs/pull/__

🤖 Generated with Claude Code


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.

Summary by CodeRabbit

  • New Features

    • Added a Japanese translation for the daemon outdated state, including guidance to download the latest version.
    • Added automated checks to verify translation keys remain consistent across supported locales.
    • Added a command to run translation validation locally and in continuous integration.
  • Bug Fixes

    • Translation checks now flag missing, extra, invalid, or undeclared locale files.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/netbirdio/netbird/pull/6852 **Author:** [@heisbrot](https://github.com/heisbrot) **Created:** 7/21/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `feature/ui-translation-key-parity-check` --- ### 📝 Commits (1) - [`abd250c`](https://github.com/netbirdio/netbird/commit/abd250c48b2f70f41e94a9287833d5508b48b2ec) [client] Add CI check for translation key parity ### 📊 Changes **4 files changed** (+151 additions, -1 deletions) <details> <summary>View changed files</summary> ➕ `.github/workflows/ui-translations.yml` (+42 -0) 📝 `client/ui/frontend/package.json` (+2 -1) ➕ `client/ui/i18n/check-translations.mjs` (+104 -0) 📝 `client/ui/i18n/locales/ja/common.json` (+3 -0) </details> ### 📄 Description English (`en`) is the source of truth for UI translation keys. The other nine locales rely on runtime English fallback for any missing key (see the i18n bundle fallback in `client/ui/i18n/bundle_test.go`), so an incomplete translation never surfaces in CI. This adds a check that makes key drift a hard failure. ## Describe your changes - **`client/ui/i18n/check-translations.mjs`** — dependency-free Node script. Treats `en/common.json` as the source of truth and requires every locale declared in `_index.json` to carry the exact same key set. On mismatch it prints per-locale counts, lists the specific missing/orphaned keys, emits GitHub Actions `::error::` annotations (inline on the PR diff), and exits non-zero. Also warns about locale directories on disk not declared in `_index.json`. - **`.github/workflows/ui-translations.yml`** — dedicated "UI Translations" workflow that runs the check on PRs and pushes to `main` when `client/ui/i18n/locales/**` (or the script) changes. Kept separate from `frontend-ui.yml` so it needs no pnpm/Wails/build toolchain — just checkout + Node 22 (~seconds). - **`client/ui/frontend/package.json`** — added `pnpm i18n:check` so the same check runs locally. - **`client/ui/i18n/locales/ja/common.json`** — close the one gap the check found: `ja` was missing `daemon.outdated.download` ("Download Latest"). Added `最新版をダウンロード`, placed after `daemon.outdated.description` to match the `en` ordering. Chose key-set equality rather than a bare count comparison: it still enforces matching counts, but also catches a same-count-but-wrong-key drift and reports exactly which keys differ. Verified: `node client/ui/i18n/check-translations.mjs` passes for all 10 locales at 444 keys each; confirmed it exits non-zero and names `ja: daemon.outdated.download` before the fix. ## Issue ticket number and link ## Stack <!-- branch-stack --> ### Checklist - [ ] Is it a bug fix - [ ] Is a typo/documentation fix - [x] Is a feature enhancement - [ ] It is a refactor - [ ] Created tests that fail without the change (if possible) - [x] This change does **not** modify the public API, gRPC protocols, functionality behavior, CLI / service flags, or introduce a new feature — **OR** I have discussed it with the NetBird team beforehand (link the issue / Slack thread in the description). See [CONTRIBUTING.md](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTING.md#discuss-changes-with-the-netbird-team-first). > By submitting this pull request, you confirm that you have read and agree to the terms of the [Contributor License Agreement](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT.md). ## Documentation Select exactly one: - [ ] I added/updated documentation for this change - [x] Documentation is **not needed** for this change (CI/tooling check plus a one-string translation fix; no behavior, API, or configuration change) ### Docs PR URL (required if "docs added" is checked) Paste the PR link from https://github.com/netbirdio/docs here: https://github.com/netbirdio/docs/pull/__ 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- codesmith:footer --> --- <a href="https://app.blacksmith.sh/netbirdio/codesmith/netbird/pr/6852"><picture><source media="(prefers-color-scheme: dark)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v2.svg"><source media="(prefers-color-scheme: light)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-light-v2.svg"><img alt="View with Codesmith" src="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v2.svg"></picture></a> <a href="https://backend.blacksmith.sh/track/enable-autofix?expires=1787237121&installation_model_id=427504&pr_number=6852&repository=netbirdio%2Fnetbird&return_to=https%3A%2F%2Fgithub.com%2Fnetbirdio%2Fnetbird%2Fpull%2F6852&signature=076f608f6199d944d1bf3e3758a0ad800983e6dfbed460ee5a2187cd3c377025"><picture><source media="(prefers-color-scheme: dark)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-light.svg"><img alt="Autofix with Codesmith" src="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark.svg"></picture></a> <sup>Need help on this PR? Tag <code>/codesmith</code> with what you need. Autofix is disabled.</sup> <!-- codesmith:autofix:disabled --> <!-- /codesmith:footer --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a Japanese translation for the daemon outdated state, including guidance to download the latest version. * Added automated checks to verify translation keys remain consistent across supported locales. * Added a command to run translation validation locally and in continuous integration. * **Bug Fixes** * Translation checks now flag missing, extra, invalid, or undeclared locale files. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
saavagebueno added the pull-request label 2026-08-05 07:08:29 -04:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#27285