Skip to content

🔧 chore(i18n): sync translations from Crowdin#545

Merged
scttbnsn merged 3 commits into
dev/v1.6from
l10n_crowdin
Jul 24, 2026
Merged

🔧 chore(i18n): sync translations from Crowdin#545
scttbnsn merged 3 commits into
dev/v1.6from
l10n_crowdin

Conversation

@github-actions

@github-actions github-actions Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Automated sync from Crowdin. Review wording, then merge.

✨ Added

  • Added locale strings for Global update mode (title/description/options + failure errors) in configView across multiple languages.
  • Added locale strings for Sync Across Devices (title/label/description + failure errors) in configView.appearance.
  • Added/expanded container update workflow i18n: preview-only/dry-run labels/tooltips/conditions, overridden/revert/revert-all and skipped-entry messaging, noSkippedEntries, updateInsight, and a full structured updateStatus (title/buttons/summary/conditions/actions).
  • Added new list-view UI strings for audit, notifications, security, registries, servers, triggers, and watchers (including rules.container-unhealthy, notification bell/template controls, scanner runtime tool messaging, and various card label groups).
  • Added dashboardView.resizeWidget.
  • Added shared UI strings for column picker + data table sorting labels (sortBy, ascending/descending).
  • Added localized appShell.banners.legacyApiPathTitle banner text variants using the {total} placeholder across supported locales.

🔧 Changed

  • Restructured locale JSON shapes where required (e.g., registryLink moved to an object form; containerComponents.updateStatus expanded/replaced from the prior smaller structure).
  • Improved/standardized copy in shared components and several view locales (e.g., sorting labels, “failed”/other remaining English -> localized text in some languages).

🗑️ Removed

  • Removed duplicated legacy updateStatus.summary.pinned entries after migrating to the larger updateStatus structure in multiple locale files.

⚠️ Concerns

  • Many newly added strings are still in English—review and ensure proper translations per locale.
  • Verify JSON key structure matches the consuming code (especially containerComponents.updateStatus, dashboardView.resizeWidget, and nested objects like registryLink).
  • Confirm interpolation placeholders remain intact and consistent (e.g., {total}, {count}) after restructuring.
  • Check for any accidental duplication/missing keys in large updateStatus/updateInsight blocks after the pinned-entry removal.

@vercel

vercel Bot commented Jul 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
drydock-website Ready Ready Preview, Comment Jul 24, 2026 3:19pm
drydockdemo-website Ready Ready Preview, Comment Jul 24, 2026 3:19pm

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 65161d81-e77e-497f-a507-478a2a23e089

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds localization coverage for global update modes, cross-device appearance sync, container update previews and statuses, notification templates, list-view cards, dashboard resizing, table sorting, column picking, and legacy API-path banners across supported locales.

Possibly related PRs

  • CodesWhat/drydock#501 — Adds related locale keys and update-insight/update-status text for pinned-container update information.
🚥 Pre-merge checks | ✅ 2
✅ Passed checks (2 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch l10n_crowdin

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 20

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@ui/src/locales/ar/configView.json`:
- Around line 9-26: Translate the newly added English UI strings into their
target locales while preserving the existing JSON keys and interpolation
placeholders. Update the update-mode entries in
ui/src/locales/ar/configView.json (lines 9-26) and
ui/src/locales/de/configView.json (lines 9-26); dry-run copy in
ui/src/locales/ar/containerComponents.json (lines 10-12) and
ui/src/locales/de/containerComponents.json (lines 10-12); resize-widget labels
in ui/src/locales/ar/dashboardView.json (line 6) and
ui/src/locales/de/dashboardView.json (line 6); audit action labels in
ui/src/locales/ar/listViews.json (lines 57-61) and
ui/src/locales/fr/listViews.json (lines 57-61); and column-picker labels in
ui/src/locales/ar/sharedComponents.json (lines 3-8) and
ui/src/locales/fr/sharedComponents.json (lines 3-8).

In `@ui/src/locales/de/listViews.json`:
- Around line 57-61: Translate every newly added English locale value in the
specified ranges: update audit, notification, security, and dry-run strings in
ui/src/locales/de/listViews.json:57-61; sorting strings in
ui/src/locales/de/sharedComponents.json:3-8 and
ui/src/locales/es/sharedComponents.json:3-8; error and appearance-sync additions
in ui/src/locales/es/configView.json:9-26 and
ui/src/locales/fr/configView.json:9-26; update-policy and status strings in
ui/src/locales/es/containerComponents.json:10-12 and
ui/src/locales/fr/containerComponents.json:10-12; resize labels in
ui/src/locales/es/dashboardView.json:6 and
ui/src/locales/fr/dashboardView.json:6; and the remaining list-view strings in
ui/src/locales/es/listViews.json:57-61. Preserve the existing locale keys and
JSON structure while replacing only the untranslated values.

In `@ui/src/locales/it/configView.json`:
- Around line 10-23: Translate the newly added English values in the Italian
catalog, including the update-mode strings under "title", "description", and
"options", plus the sync and error messages at the referenced entries. Preserve
all existing keys and JSON structure so ConfigGeneralTab.vue and ConfigView.vue
continue resolving the same configuration strings.

In `@ui/src/locales/it/containerComponents.json`:
- Around line 10-12: Translate all newly added container workflow strings in the
Italian catalog, including the referenced workflow, status, insight,
grouped-view, policy-toast, previewOnly, dryRunUpdateTooltip, and
dryRunCondition entries. Replace remaining English values with accurate Italian
translations while preserving every key, placeholder such as {trigger}, and
existing catalog structure.

In `@ui/src/locales/it/dashboardView.json`:
- Line 6: Update the resizeWidget entry in the Italian dashboard locale catalog
from English to the Italian wording used by the dashboard resize control,
preserving the existing key and JSON structure.

In `@ui/src/locales/it/listViews.json`:
- Line 57: Translate the newly added list-view entries in the Italian catalog,
including the audit, notification, security, scanner, and dry-run values
identified by the referenced ranges. Replace each remaining English string with
accurate Italian while preserving the existing JSON keys and formatting.

In `@ui/src/locales/it/sharedComponents.json`:
- Around line 3-8: Translate the Italian catalog’s shared table-control values
in columnPicker, including toggleTooltip, heading, reset, and
hiddenBadgeTooltip, into Italian while preserving the {count} placeholder
exactly.

In `@ui/src/locales/ja/configView.json`:
- Around line 10-23: Translate the newly added English strings in the Japanese
catalog to Japanese, including the update-mode title, description, and option
labels/descriptions near the visible "title", "description", and "options"
entries, along with the sync and error messages at the referenced locations.
Preserve the existing JSON keys and structure.

In `@ui/src/locales/ja/containerComponents.json`:
- Around line 10-12: Translate the newly added container workflow strings in the
Japanese catalog—including the visible previewOnly, dryRunUpdateTooltip, and
dryRunCondition entries and the referenced workflow, status, insight,
grouped-view, and policy-toast ranges—into natural Japanese while preserving all
keys, placeholders, and message meaning.

In `@ui/src/locales/ja/dashboardView.json`:
- Line 6: Update the resizeWidget entry in the Japanese dashboard catalog from
English to the Japanese wording used by the dashboard resize control, preserving
the existing key and JSON structure.

In `@ui/src/locales/ja/listViews.json`:
- Line 57: Translate the newly added list-view values in the Japanese catalog,
including the audit, notification, security, scanner, and dry-run entries
identified by keys such as update-applied-dryrun and the additional listed
ranges. Replace each remaining English value with accurate Japanese while
preserving the existing JSON keys and structure.

In `@ui/src/locales/ko/containerComponents.json`:
- Around line 372-421: Translate all newly added source-language English catalog
values into their target languages while preserving every interpolation token.
Update Korean entries in ui/src/locales/ko/containerComponents.json#L372-L421,
`#L10-L12`, `#L30-L32`, `#L39`, `#L196-L197`, `#L349-L354`, and `#L523-L524`;
ui/src/locales/ko/configView.json#L9-L26, `#L93`, `#L103-L107`, and `#L146-L147`;
ui/src/locales/ko/dashboardView.json#L6; ui/src/locales/ko/listViews.json#L57,
`#L60-L61`, `#L108-L109`, `#L129-L150`, `#L195`, `#L244-L247`, and `#L354-L357`; and
ui/src/locales/ko/sharedComponents.json#L3-L8 and `#L31-L33`. Update Dutch entries
in ui/src/locales/nl/configView.json#L9-L26, `#L93`, `#L103-L107`, and `#L146-L147`,
and ui/src/locales/nl/containerComponents.json#L10-L12, `#L30-L32`, `#L39`,
`#L196-L197`, `#L349-L354`, `#L372-L421`, and `#L523-L524`. Update Japanese labels in
ui/src/locales/ja/sharedComponents.json#L3-L8 and `#L31-L33`, and Russian labels
in ui/src/locales/ru/sharedComponents.json#L3-L8 and `#L31-L33`.

In `@ui/src/locales/nl/dashboardView.json`:
- Line 6: Translate every newly added English value in the affected locale
catalogs while preserving all existing keys, JSON structure, and placeholders:
ui/src/locales/nl/dashboardView.json:6; ui/src/locales/nl/listViews.json:57-61,
107-109, 129-150, 195, 244-247, 354-357;
ui/src/locales/nl/sharedComponents.json:3-8, 31-33;
ui/src/locales/pl/configView.json:9-26, 93, 103-107, 145-147;
ui/src/locales/ru/configView.json:9-26, 93, 103-107, 145-147;
ui/src/locales/ru/containerComponents.json:10-12, 30-32, 39, 196-197, 349-354,
372-421, 523-524; ui/src/locales/ru/dashboardView.json:6; and
ui/src/locales/ru/listViews.json:57-61, 107-109, 129-150, 195, 244-247, 354-357.

In `@ui/src/locales/pl/appShell.json`:
- Line 160: Update the legacyApiPathTitle translation to use the verb-first
Polish word order and correct plural forms, placing {total} after “Wykryto” as
in “Wykryto {total} starszych ścieżek API”.

In `@ui/src/locales/pl/containerComponents.json`:
- Around line 10-12: Translate every newly added English value in the specified
Polish and Brazilian Portuguese locale catalogs into its target language,
covering all listed container, dashboard, list, shared-component, and
configuration entries. Preserve each interpolation placeholder, key, JSON
structure, and existing locale-specific formatting; update every affected site,
including the Brazilian Portuguese registry card labels at
ui/src/locales/pt-BR/listViews.json lines 283-286.

In `@ui/src/locales/ru/containerComponents.json`:
- Around line 372-421: The updateStatus translation object is nested under
groupedViews while UpdateStatusPanel.vue resolves
containerComponents.updateStatus.*. Move updateStatus to the top-level
containerComponents object, preserving all existing keys and translations so the
requested paths resolve correctly.

In `@ui/src/locales/tr/appShell.json`:
- Line 160: Update the legacyApiPathTitle translations in
ui/src/locales/tr/appShell.json:160-160 and
ui/src/locales/zh-TW/appShell.json:160-160 to describe requests detected for
removed or unversioned API paths rather than old API paths, while preserving the
{total} placeholder.

In `@ui/src/locales/tr/configView.json`:
- Around line 9-26: Complete the missing translations for all newly added
English values while preserving interpolation placeholders. Update
ui/src/locales/tr/configView.json (lines 10-23, 93, 104-106, 147),
ui/src/locales/tr/containerComponents.json (10-12, 30-32, 39, 196-197, 350-353,
373-380, 382-420, 523-524), ui/src/locales/tr/dashboardView.json (6),
ui/src/locales/zh-CN/configView.json (10-23, 93, 104-106, 147),
ui/src/locales/zh-CN/containerComponents.json (10-12, 30-32, 39, 196-197,
350-353, 373-380, 382-420, 523-524), ui/src/locales/zh-CN/dashboardView.json
(6), ui/src/locales/zh-CN/listViews.json (57, 60-61, 108-109, 129-150, 195,
244-247, 354-357), and ui/src/locales/zh-CN/sharedComponents.json (4-7, 31-33),
translating each affected catalog value into its target language without
changing keys or placeholders.

In `@ui/src/locales/tr/listViews.json`:
- Around line 57-61: Replace the English values with accurate target-language
translations while preserving all JSON keys and interpolation placeholders.
Update ui/src/locales/tr/listViews.json ranges 57-61, 107-109, 129-150, 194-195,
244-247, 354-357 and ui/src/locales/tr/sharedComponents.json ranges 3-8, 30-33;
ui/src/locales/uk/configView.json ranges 9-26, 93, 103-107, 145-147 and
ui/src/locales/uk/containerComponents.json ranges 10-12, 30-39, 196-197,
349-354, 372-421, 523-524; ui/src/locales/zh-TW/configView.json ranges 9-26, 93,
103-107, 145-147, ui/src/locales/zh-TW/containerComponents.json ranges 10-12,
30-39, 196-197, 349-354, 372-421, 523-524,
ui/src/locales/zh-TW/dashboardView.json range 6,
ui/src/locales/zh-TW/listViews.json ranges 57-61, 107-109, 129-150, 194-195,
244-247, 354-357, and ui/src/locales/zh-TW/sharedComponents.json ranges 3-8,
30-33. Translate the affected audit, update, sync, container, notification,
scanner, security, dashboard, column-picker, and sorting labels for Turkish,
Ukrainian, and Traditional Chinese respectively.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: fe73148e-23f4-4285-a905-56cf083b699a

📥 Commits

Reviewing files that changed from the base of the PR and between cd5b18c and 5a6c346.

📒 Files selected for processing (96)
  • ui/src/locales/ar/appShell.json
  • ui/src/locales/ar/configView.json
  • ui/src/locales/ar/containerComponents.json
  • ui/src/locales/ar/dashboardView.json
  • ui/src/locales/ar/listViews.json
  • ui/src/locales/ar/sharedComponents.json
  • ui/src/locales/de/appShell.json
  • ui/src/locales/de/configView.json
  • ui/src/locales/de/containerComponents.json
  • ui/src/locales/de/dashboardView.json
  • ui/src/locales/de/listViews.json
  • ui/src/locales/de/sharedComponents.json
  • ui/src/locales/es/appShell.json
  • ui/src/locales/es/configView.json
  • ui/src/locales/es/containerComponents.json
  • ui/src/locales/es/dashboardView.json
  • ui/src/locales/es/listViews.json
  • ui/src/locales/es/sharedComponents.json
  • ui/src/locales/fr/appShell.json
  • ui/src/locales/fr/configView.json
  • ui/src/locales/fr/containerComponents.json
  • ui/src/locales/fr/dashboardView.json
  • ui/src/locales/fr/listViews.json
  • ui/src/locales/fr/sharedComponents.json
  • ui/src/locales/it/appShell.json
  • ui/src/locales/it/configView.json
  • ui/src/locales/it/containerComponents.json
  • ui/src/locales/it/dashboardView.json
  • ui/src/locales/it/listViews.json
  • ui/src/locales/it/sharedComponents.json
  • ui/src/locales/ja/appShell.json
  • ui/src/locales/ja/configView.json
  • ui/src/locales/ja/containerComponents.json
  • ui/src/locales/ja/dashboardView.json
  • ui/src/locales/ja/listViews.json
  • ui/src/locales/ja/sharedComponents.json
  • ui/src/locales/ko/appShell.json
  • ui/src/locales/ko/configView.json
  • ui/src/locales/ko/containerComponents.json
  • ui/src/locales/ko/dashboardView.json
  • ui/src/locales/ko/listViews.json
  • ui/src/locales/ko/sharedComponents.json
  • ui/src/locales/nl/appShell.json
  • ui/src/locales/nl/configView.json
  • ui/src/locales/nl/containerComponents.json
  • ui/src/locales/nl/dashboardView.json
  • ui/src/locales/nl/listViews.json
  • ui/src/locales/nl/sharedComponents.json
  • ui/src/locales/pl/appShell.json
  • ui/src/locales/pl/configView.json
  • ui/src/locales/pl/containerComponents.json
  • ui/src/locales/pl/dashboardView.json
  • ui/src/locales/pl/listViews.json
  • ui/src/locales/pl/sharedComponents.json
  • ui/src/locales/pt-BR/appShell.json
  • ui/src/locales/pt-BR/configView.json
  • ui/src/locales/pt-BR/containerComponents.json
  • ui/src/locales/pt-BR/dashboardView.json
  • ui/src/locales/pt-BR/listViews.json
  • ui/src/locales/pt-BR/sharedComponents.json
  • ui/src/locales/ru/appShell.json
  • ui/src/locales/ru/configView.json
  • ui/src/locales/ru/containerComponents.json
  • ui/src/locales/ru/dashboardView.json
  • ui/src/locales/ru/listViews.json
  • ui/src/locales/ru/sharedComponents.json
  • ui/src/locales/tr/appShell.json
  • ui/src/locales/tr/configView.json
  • ui/src/locales/tr/containerComponents.json
  • ui/src/locales/tr/dashboardView.json
  • ui/src/locales/tr/listViews.json
  • ui/src/locales/tr/sharedComponents.json
  • ui/src/locales/uk/appShell.json
  • ui/src/locales/uk/configView.json
  • ui/src/locales/uk/containerComponents.json
  • ui/src/locales/uk/dashboardView.json
  • ui/src/locales/uk/listViews.json
  • ui/src/locales/uk/sharedComponents.json
  • ui/src/locales/vi/appShell.json
  • ui/src/locales/vi/configView.json
  • ui/src/locales/vi/containerComponents.json
  • ui/src/locales/vi/dashboardView.json
  • ui/src/locales/vi/listViews.json
  • ui/src/locales/vi/sharedComponents.json
  • ui/src/locales/zh-CN/appShell.json
  • ui/src/locales/zh-CN/configView.json
  • ui/src/locales/zh-CN/containerComponents.json
  • ui/src/locales/zh-CN/dashboardView.json
  • ui/src/locales/zh-CN/listViews.json
  • ui/src/locales/zh-CN/sharedComponents.json
  • ui/src/locales/zh-TW/appShell.json
  • ui/src/locales/zh-TW/configView.json
  • ui/src/locales/zh-TW/containerComponents.json
  • ui/src/locales/zh-TW/dashboardView.json
  • ui/src/locales/zh-TW/listViews.json
  • ui/src/locales/zh-TW/sharedComponents.json

Comment thread ui/src/locales/ar/configView.json
Comment thread ui/src/locales/de/listViews.json Outdated
Comment thread ui/src/locales/it/configView.json Outdated
Comment thread ui/src/locales/it/containerComponents.json Outdated
Comment thread ui/src/locales/it/dashboardView.json Outdated
Comment thread ui/src/locales/ru/containerComponents.json
Comment thread ui/src/locales/tr/appShell.json Outdated
Comment thread ui/src/locales/tr/configView.json
Comment thread ui/src/locales/tr/listViews.json Outdated
Comment thread ui/src/locales/uk/dashboardView.json Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@ui/src/locales/es/dashboardView.json`:
- Line 118: Translate the remaining English catalog values: update “Registries”
in ui/src/locales/es/dashboardView.json (118-118) to Spanish; translate the
audit action labels, unhealthy-container rule, notification-bell/template-editor
text, “Clean,” scanner asset actions/failure text, and dry-run badge/tooltip in
ui/src/locales/zh-TW/listViews.json (57-61, 107-109, 129-150, 195-195, 245-247,
354-357); and translate the column-picker and sorting labels in
ui/src/locales/zh-TW/sharedComponents.json (3-8, 31-33) into Traditional
Chinese.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: f4357993-406e-47fc-b7d9-97e4b5baa252

📥 Commits

Reviewing files that changed from the base of the PR and between 5a6c346 and 3622888.

📒 Files selected for processing (101)
  • ui/src/locales/ar/appShell.json
  • ui/src/locales/ar/configView.json
  • ui/src/locales/ar/containerComponents.json
  • ui/src/locales/ar/dashboardView.json
  • ui/src/locales/ar/listViews.json
  • ui/src/locales/ar/sharedComponents.json
  • ui/src/locales/de/appShell.json
  • ui/src/locales/de/configView.json
  • ui/src/locales/de/containerComponents.json
  • ui/src/locales/de/dashboardView.json
  • ui/src/locales/de/listViews.json
  • ui/src/locales/de/sharedComponents.json
  • ui/src/locales/es/agentsView.json
  • ui/src/locales/es/appShell.json
  • ui/src/locales/es/common.json
  • ui/src/locales/es/configView.json
  • ui/src/locales/es/containerComponents.json
  • ui/src/locales/es/containersView.json
  • ui/src/locales/es/dashboardView.json
  • ui/src/locales/es/listViews.json
  • ui/src/locales/es/notificationOutboxView.json
  • ui/src/locales/es/sharedComponents.json
  • ui/src/locales/fr/appShell.json
  • ui/src/locales/fr/configView.json
  • ui/src/locales/fr/containerComponents.json
  • ui/src/locales/fr/dashboardView.json
  • ui/src/locales/fr/listViews.json
  • ui/src/locales/fr/sharedComponents.json
  • ui/src/locales/it/appShell.json
  • ui/src/locales/it/configView.json
  • ui/src/locales/it/containerComponents.json
  • ui/src/locales/it/dashboardView.json
  • ui/src/locales/it/listViews.json
  • ui/src/locales/it/sharedComponents.json
  • ui/src/locales/ja/appShell.json
  • ui/src/locales/ja/configView.json
  • ui/src/locales/ja/containerComponents.json
  • ui/src/locales/ja/dashboardView.json
  • ui/src/locales/ja/listViews.json
  • ui/src/locales/ja/sharedComponents.json
  • ui/src/locales/ko/appShell.json
  • ui/src/locales/ko/configView.json
  • ui/src/locales/ko/containerComponents.json
  • ui/src/locales/ko/dashboardView.json
  • ui/src/locales/ko/listViews.json
  • ui/src/locales/ko/sharedComponents.json
  • ui/src/locales/nl/appShell.json
  • ui/src/locales/nl/configView.json
  • ui/src/locales/nl/containerComponents.json
  • ui/src/locales/nl/dashboardView.json
  • ui/src/locales/nl/listViews.json
  • ui/src/locales/nl/sharedComponents.json
  • ui/src/locales/pl/agentsView.json
  • ui/src/locales/pl/appShell.json
  • ui/src/locales/pl/configView.json
  • ui/src/locales/pl/containerComponents.json
  • ui/src/locales/pl/dashboardView.json
  • ui/src/locales/pl/listViews.json
  • ui/src/locales/pl/sharedComponents.json
  • ui/src/locales/pt-BR/appShell.json
  • ui/src/locales/pt-BR/configView.json
  • ui/src/locales/pt-BR/containerComponents.json
  • ui/src/locales/pt-BR/dashboardView.json
  • ui/src/locales/pt-BR/listViews.json
  • ui/src/locales/pt-BR/sharedComponents.json
  • ui/src/locales/ru/appShell.json
  • ui/src/locales/ru/configView.json
  • ui/src/locales/ru/containerComponents.json
  • ui/src/locales/ru/dashboardView.json
  • ui/src/locales/ru/listViews.json
  • ui/src/locales/ru/sharedComponents.json
  • ui/src/locales/tr/appShell.json
  • ui/src/locales/tr/configView.json
  • ui/src/locales/tr/containerComponents.json
  • ui/src/locales/tr/dashboardView.json
  • ui/src/locales/tr/listViews.json
  • ui/src/locales/tr/sharedComponents.json
  • ui/src/locales/uk/appShell.json
  • ui/src/locales/uk/configView.json
  • ui/src/locales/uk/containerComponents.json
  • ui/src/locales/uk/dashboardView.json
  • ui/src/locales/uk/listViews.json
  • ui/src/locales/uk/sharedComponents.json
  • ui/src/locales/vi/appShell.json
  • ui/src/locales/vi/configView.json
  • ui/src/locales/vi/containerComponents.json
  • ui/src/locales/vi/dashboardView.json
  • ui/src/locales/vi/listViews.json
  • ui/src/locales/vi/sharedComponents.json
  • ui/src/locales/zh-CN/appShell.json
  • ui/src/locales/zh-CN/configView.json
  • ui/src/locales/zh-CN/containerComponents.json
  • ui/src/locales/zh-CN/dashboardView.json
  • ui/src/locales/zh-CN/listViews.json
  • ui/src/locales/zh-CN/sharedComponents.json
  • ui/src/locales/zh-TW/appShell.json
  • ui/src/locales/zh-TW/configView.json
  • ui/src/locales/zh-TW/containerComponents.json
  • ui/src/locales/zh-TW/dashboardView.json
  • ui/src/locales/zh-TW/listViews.json
  • ui/src/locales/zh-TW/sharedComponents.json
🚧 Files skipped from review as they are similar to previous changes (88)
  • ui/src/locales/zh-TW/dashboardView.json
  • ui/src/locales/zh-CN/dashboardView.json
  • ui/src/locales/de/dashboardView.json
  • ui/src/locales/nl/appShell.json
  • ui/src/locales/vi/appShell.json
  • ui/src/locales/vi/sharedComponents.json
  • ui/src/locales/nl/sharedComponents.json
  • ui/src/locales/ko/appShell.json
  • ui/src/locales/zh-CN/appShell.json
  • ui/src/locales/ru/appShell.json
  • ui/src/locales/zh-TW/appShell.json
  • ui/src/locales/tr/appShell.json
  • ui/src/locales/pt-BR/dashboardView.json
  • ui/src/locales/ar/sharedComponents.json
  • ui/src/locales/zh-CN/sharedComponents.json
  • ui/src/locales/uk/dashboardView.json
  • ui/src/locales/pl/appShell.json
  • ui/src/locales/ko/dashboardView.json
  • ui/src/locales/fr/dashboardView.json
  • ui/src/locales/vi/dashboardView.json
  • ui/src/locales/ar/dashboardView.json
  • ui/src/locales/de/appShell.json
  • ui/src/locales/fr/sharedComponents.json
  • ui/src/locales/pt-BR/sharedComponents.json
  • ui/src/locales/nl/dashboardView.json
  • ui/src/locales/pl/sharedComponents.json
  • ui/src/locales/ru/sharedComponents.json
  • ui/src/locales/tr/dashboardView.json
  • ui/src/locales/pt-BR/appShell.json
  • ui/src/locales/es/appShell.json
  • ui/src/locales/ru/configView.json
  • ui/src/locales/fr/appShell.json
  • ui/src/locales/zh-CN/configView.json
  • ui/src/locales/tr/configView.json
  • ui/src/locales/ko/configView.json
  • ui/src/locales/pl/configView.json
  • ui/src/locales/it/dashboardView.json
  • ui/src/locales/uk/appShell.json
  • ui/src/locales/pl/dashboardView.json
  • ui/src/locales/tr/sharedComponents.json
  • ui/src/locales/ru/dashboardView.json
  • ui/src/locales/nl/configView.json
  • ui/src/locales/vi/configView.json
  • ui/src/locales/pt-BR/configView.json
  • ui/src/locales/ja/sharedComponents.json
  • ui/src/locales/it/configView.json
  • ui/src/locales/ja/appShell.json
  • ui/src/locales/fr/configView.json
  • ui/src/locales/ko/listViews.json
  • ui/src/locales/ar/appShell.json
  • ui/src/locales/es/configView.json
  • ui/src/locales/tr/containerComponents.json
  • ui/src/locales/it/sharedComponents.json
  • ui/src/locales/zh-CN/listViews.json
  • ui/src/locales/zh-CN/containerComponents.json
  • ui/src/locales/it/appShell.json
  • ui/src/locales/uk/listViews.json
  • ui/src/locales/zh-TW/configView.json
  • ui/src/locales/uk/configView.json
  • ui/src/locales/vi/containerComponents.json
  • ui/src/locales/ja/listViews.json
  • ui/src/locales/de/listViews.json
  • ui/src/locales/de/configView.json
  • ui/src/locales/fr/listViews.json
  • ui/src/locales/ja/containerComponents.json
  • ui/src/locales/uk/sharedComponents.json
  • ui/src/locales/nl/containerComponents.json
  • ui/src/locales/de/containerComponents.json
  • ui/src/locales/ar/configView.json
  • ui/src/locales/tr/listViews.json
  • ui/src/locales/es/listViews.json
  • ui/src/locales/zh-TW/containerComponents.json
  • ui/src/locales/ar/containerComponents.json
  • ui/src/locales/it/listViews.json
  • ui/src/locales/ko/containerComponents.json
  • ui/src/locales/it/containerComponents.json
  • ui/src/locales/ko/sharedComponents.json
  • ui/src/locales/pl/listViews.json
  • ui/src/locales/de/sharedComponents.json
  • ui/src/locales/pt-BR/containerComponents.json
  • ui/src/locales/es/containerComponents.json
  • ui/src/locales/ar/listViews.json
  • ui/src/locales/nl/listViews.json
  • ui/src/locales/vi/listViews.json
  • ui/src/locales/uk/containerComponents.json
  • ui/src/locales/fr/containerComponents.json
  • ui/src/locales/ru/listViews.json
  • ui/src/locales/ru/containerComponents.json

Comment thread ui/src/locales/es/dashboardView.json
@scttbnsn
scttbnsn changed the base branch from main to dev/v1.6 July 24, 2026 13:07
@scttbnsn
scttbnsn merged commit fd37530 into dev/v1.6 Jul 24, 2026
28 of 44 checks passed
scttbnsn added a commit that referenced this pull request Jul 24, 2026
Routine dev → main sync, per the branch model (main only advances by
merging from dev/v1.6). This one carries the CI-hardening and bot-config
batch:

- #590/#592 drift guard + integration-branch targeting (already on dev,
now visible to the bot: Renovate reads renovate.json from the default
branch, so baseBranchPatterns and skipInstalls only take effect on main)
- #594 skipInstalls: false + the lockfile-sync guard (runs npm's own ci
--dry-run check per workspace)
- #593 .planning untracked + tracked-ignored-files guard
- #545 Crowdin translation sync with all 21 review comments fixed
upstream
- Five Renovate dependency batches (#484/#485/#487/#489/#510)
- postcss override 8.5.22 (GHSA-r28c-9q8g-f849)

After merge, `git diff origin/main origin/dev/v1.6` must be empty (tree
equality — the invariant release-cut enforces).

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
scttbnsn added a commit that referenced this pull request Jul 26, 2026
)

The Crowdin sync failed on main on 2026-07-24 with a bare `exit 1` and
no message. Root cause turned out to be a bug class rather than a
one-off, so this fixes both instances of it and adds coverage.

## The pattern

Inside a `set -e`/`pipefail` region, a command that exits non-zero on an
*empty* result aborts the step before an explicitly written fallback can
run. The fallback is dead code. The tell: someone wrote handling for the
empty case, and the empty case can't reach it.

## 1. Crowdin base-branch resolution

`i18n-crowdin.yml` resolves the highest `dev/vX.Y` on origin and falls
back to the default branch when there is none, so translations always
have somewhere to land between a GA and the next dev branch being cut.
Under `set -euo pipefail` a no-match `grep` exits 1, which fails the
pipeline, which fails the assignment, which aborts the step. The `if [
-z ]` fallback below it could never run.

It fired for real: merging sync PR #596 briefly deleted `dev/v1.6` via
auto-delete-head-branches, the push-to-main sync run found no `dev/v*`,
and the job died.

Guards the grep only, so a failing `ls-remote` (network, auth) still
propagates and fails loudly instead of silently retargeting translations
at main. That distinction matters more than the fix itself.

## 2. Load-test report resolution

Sweeping the other workflows for the same pattern turned up 8 more sites
in `ci-verify.yml`:

```
report="$(find artifacts/load-test/<mode> ... | sort -rn | head -n1 | cut -d' ' -f2-)"
```

`find` exits 0 on a directory that exists but is empty — the case the
downstream scripts handle. It exits 1 when the directory is *missing*,
and GitHub runs these steps under the default `bash -eo pipefail`, so
that aborts the step. `summarize-load-test-report.sh` and
`check-load-test-correctness.sh` both open with an `if [ -z "${REPORT}"
]` block written for exactly this, and neither gets to run.

Reachable, not theoretical: these steps are `if: always()`, and
`run-load-test.sh` only does `mkdir -p` on the artifact dir at line 168
— after the docker build, compose up, and the health-check wait that
exits 1 at line 136. A load test that fails the way load tests usually
fail leaves the directory absent, and the step meant to explain that
dies with a bare exit 1.

## Coverage

`crowdin-base-branch-resolver.test.ts` executes the real `id: base` run
block extracted from the workflow against a stubbed git, rather than
asserting on workflow text, so it tracks the actual logic instead of a
copy that can drift. Three cases: no dev branches falls back and exits
0; several picks `dev/v1.10` over `v1.9` (lexical sort gets this wrong);
failing `ls-remote` still exits non-zero. That last one guards against
"fixing" the bug by swallowing all errors, which would be worse than the
bug.

Verified it fails against the pre-fix snippet with `expected 1 to be
+0`, and that the other two still pass — the bug only affects the one
path.

`ci-verify-find-pipefail-guard.test.ts` discovers the find sites by
walking the parsed workflow rather than pinning line numbers, so it also
catches a new unguarded `find` added later. Carries a sanity assertion
so it can't pass vacuously if the shape stops matching. Verified it
catches a revert by naming the exact offending step.

Executing the load-test steps for real would need docker plus Artillery
artifacts, so that one is a static assertion by design — noted in a
comment in the file.

## Notes

- Full pre-push gate green locally, including the 100% coverage gate and
zizmor.
- Related but separate: `main` is currently failing its scheduled CI
Verify on `brace-expansion@5.0.7` (CVE-2026-14257). That is already
fixed on `dev/v1.6` at 5.0.8 — it just needs the next dev → main sync,
no code change.
- Also closed #598 and deleted `l10n_crowdin`; it was cut before #545
landed and had gone conflicting. It regenerates from the dev tip on the
next push here.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Changelog

- 🐛 Fixed Crowdin base-branch resolver so “no matching dev/vX.Y”
correctly falls back to `DEFAULT_BRANCH` under `set -euo pipefail`,
while `git ls-remote` failures still propagate.
- 🐛 Fixed CI load-test report discovery by guarding each `find
artifacts/load-test/<site>/...*.json ...` command-substitution pipeline
so missing artifact directories don’t abort later empty-report handling
under `pipefail`.
- 🔧 Changed `test/cpu-bench.sh` to guard the per-container `grep "^$c "`
used to compute stats so missing samples don’t stop the script under
`set -euo pipefail`.
- ✨ Added Jest coverage for Crowdin fallback behavior, highest
`dev/vX.Y` selection, and `ls-remote` error propagation.
- ✨ Added static workflow analysis coverage to ensure every load-test
report lookup assignment site uses a fully pipefail-safe `find` guard
(including later pipeline stages).

## Concerns

- Ensure the workflow-scan regex continues to correctly identify the
intended `find`-into-variable command-substitution assignments and
doesn’t miss new sites.
- Verify the static “expected eight-site count” remains in sync with the
number of load-test report lookup assignments across CI
(ci/behavior/stress, summarize/correctness/regression).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants