From 047b8c3bf73e135dcf523a1e606a9c3b4ade318c Mon Sep 17 00:00:00 2001 From: "Calum H." Date: Fri, 29 May 2026 16:55:39 +0100 Subject: [PATCH] fix: i18n string problems (#6131) * fix: apply non-json i18n fixes * fix: pruning * fix: prepr * fix: run.mjs * fix: lint --- .github/workflows/i18n-pull.yml | 14 + .github/workflows/i18n-push.yml | 23 +- .github/workflows/turbo-ci.yml | 3 +- apps/app-frontend/package.json | 1 + .../src/components/ui/world/WorldItem.vue | 2 +- .../app-frontend/src/locales/cs-CZ/index.json | 9 - .../app-frontend/src/locales/de-CH/index.json | 9 - .../app-frontend/src/locales/de-DE/index.json | 9 - .../src/locales/es-419/index.json | 9 - .../app-frontend/src/locales/fr-FR/index.json | 12 - .../app-frontend/src/locales/he-IL/index.json | 3 - .../app-frontend/src/locales/hu-HU/index.json | 6 - .../app-frontend/src/locales/id-ID/index.json | 6 - .../app-frontend/src/locales/it-IT/index.json | 12 - .../app-frontend/src/locales/ja-JP/index.json | 6 - .../app-frontend/src/locales/ko-KR/index.json | 3 - .../app-frontend/src/locales/ms-MY/index.json | 6 - .../app-frontend/src/locales/nl-NL/index.json | 6 - .../app-frontend/src/locales/pl-PL/index.json | 9 - .../app-frontend/src/locales/pt-BR/index.json | 6 - .../app-frontend/src/locales/pt-PT/index.json | 9 - .../app-frontend/src/locales/ru-RU/index.json | 24 -- .../app-frontend/src/locales/th-TH/index.json | 6 - .../app-frontend/src/locales/tr-TR/index.json | 3 - .../app-frontend/src/locales/uk-UA/index.json | 15 - .../app-frontend/src/locales/zh-CN/index.json | 15 - .../app-frontend/src/locales/zh-TW/index.json | 15 - apps/frontend/package.json | 1 + .../servers/marketing/ServerPlanSelector.vue | 9 +- apps/frontend/src/composables/auth/scopes.ts | 8 +- .../composables/use-server-install-content.ts | 2 +- apps/frontend/src/locales/ar-SA/index.json | 6 - apps/frontend/src/locales/cs-CZ/index.json | 12 - apps/frontend/src/locales/da-DK/index.json | 15 - apps/frontend/src/locales/de-CH/index.json | 48 --- apps/frontend/src/locales/de-DE/index.json | 48 --- apps/frontend/src/locales/en-US/index.json | 74 ++-- apps/frontend/src/locales/es-419/index.json | 48 --- apps/frontend/src/locales/es-ES/index.json | 48 --- apps/frontend/src/locales/fi-FI/index.json | 3 - apps/frontend/src/locales/fil-PH/index.json | 33 -- apps/frontend/src/locales/fr-FR/index.json | 51 --- apps/frontend/src/locales/he-IL/index.json | 21 - apps/frontend/src/locales/hu-HU/index.json | 84 ---- apps/frontend/src/locales/id-ID/index.json | 39 -- apps/frontend/src/locales/it-IT/index.json | 75 ---- apps/frontend/src/locales/ja-JP/index.json | 69 --- apps/frontend/src/locales/ko-KR/index.json | 84 ---- apps/frontend/src/locales/ms-MY/index.json | 87 ---- apps/frontend/src/locales/nl-NL/index.json | 75 ---- apps/frontend/src/locales/no-NO/index.json | 36 -- apps/frontend/src/locales/pl-PL/index.json | 75 ---- apps/frontend/src/locales/pt-BR/index.json | 60 --- apps/frontend/src/locales/pt-PT/index.json | 45 -- apps/frontend/src/locales/ro-RO/index.json | 3 - apps/frontend/src/locales/ru-RU/index.json | 81 ---- apps/frontend/src/locales/sr-CS/index.json | 9 - apps/frontend/src/locales/sv-SE/index.json | 24 -- apps/frontend/src/locales/th-TH/index.json | 6 - apps/frontend/src/locales/tr-TR/index.json | 54 --- apps/frontend/src/locales/uk-UA/index.json | 84 ---- apps/frontend/src/locales/vi-VN/index.json | 48 --- apps/frontend/src/locales/zh-CN/index.json | 84 ---- apps/frontend/src/locales/zh-TW/index.json | 69 --- apps/frontend/src/pages/[type]/[project].vue | 4 +- apps/frontend/src/pages/app.vue | 2 +- .../frontend/src/pages/dashboard/projects.vue | 8 +- .../src/pages/discover/[type]/index.vue | 27 +- .../[organization]/settings/projects.vue | 16 +- apps/frontend/src/pages/report.vue | 36 +- apps/frontend/src/pages/settings/account.vue | 16 +- .../src/pages/settings/billing/index.vue | 89 ++-- apps/frontend/src/pages/user/[user].vue | 12 +- apps/frontend/src/plugins/i18n.ts | 41 +- package.json | 2 + packages/moderation/package.json | 3 +- packages/moderation/src/data/nags/core.ts | 20 +- packages/moderation/src/data/nags/links.ts | 8 +- packages/moderation/src/data/nags/tags.ts | 7 +- .../moderation/src/locales/ar-SA/index.json | 13 - .../moderation/src/locales/cs-CZ/index.json | 16 - .../moderation/src/locales/da-DK/index.json | 7 - .../moderation/src/locales/de-CH/index.json | 10 - .../moderation/src/locales/de-DE/index.json | 10 - .../moderation/src/locales/en-US/index.json | 11 +- .../moderation/src/locales/es-419/index.json | 10 - .../moderation/src/locales/es-ES/index.json | 10 - .../moderation/src/locales/fil-PH/index.json | 10 - .../moderation/src/locales/fr-FR/index.json | 10 - .../moderation/src/locales/he-IL/index.json | 7 - .../moderation/src/locales/hu-HU/index.json | 28 -- .../moderation/src/locales/id-ID/index.json | 31 -- .../moderation/src/locales/it-IT/index.json | 28 -- .../moderation/src/locales/ja-JP/index.json | 28 -- .../moderation/src/locales/ko-KR/index.json | 28 -- .../moderation/src/locales/ms-MY/index.json | 31 -- .../moderation/src/locales/nl-NL/index.json | 13 - .../moderation/src/locales/no-NO/index.json | 10 - .../moderation/src/locales/pl-PL/index.json | 22 - .../moderation/src/locales/pt-BR/index.json | 13 - .../moderation/src/locales/pt-PT/index.json | 10 - .../moderation/src/locales/ro-RO/index.json | 13 - .../moderation/src/locales/ru-RU/index.json | 31 -- .../moderation/src/locales/sv-SE/index.json | 13 - .../moderation/src/locales/tr-TR/index.json | 25 -- .../moderation/src/locales/uk-UA/index.json | 22 - .../moderation/src/locales/vi-VN/index.json | 10 - .../moderation/src/locales/zh-CN/index.json | 31 -- .../moderation/src/locales/zh-TW/index.json | 22 - packages/ui/package.json | 1 + .../components/billing/ResubscribeModal.vue | 32 +- .../billing/ServersPurchase0Plan.vue | 16 +- .../billing/ServersPurchase1Region.vue | 9 +- .../src/components/servers/ServerListing.vue | 8 +- .../server-list-empty/ServerListEmpty.vue | 2 +- .../src/layouts/shared/browse-tab/layout.vue | 11 +- .../components/ContentSelectionBar.vue | 11 +- .../modals/ConfirmDeletionModal.vue | 19 +- .../components/modals/ConfirmRepairModal.vue | 29 +- .../components/modals/ConfirmUnlinkModal.vue | 2 +- .../components/modals/ContentInstallModal.vue | 8 +- .../components/modals/InlineBackupCreator.vue | 16 +- .../src/layouts/shared/content-tab/layout.vue | 17 +- .../components/modals/FileCreateItemModal.vue | 22 +- .../components/modals/FileDeleteItemModal.vue | 16 +- .../components/modals/FileMoveItemModal.vue | 10 +- .../modals/FileUploadConflictModal.vue | 28 +- .../upload/FileUploadDragAndDrop.vue | 5 +- .../shared/installation-settings/layout.vue | 44 +- packages/ui/src/locales/ar-SA/index.json | 19 - packages/ui/src/locales/cs-CZ/index.json | 34 -- packages/ui/src/locales/da-DK/index.json | 7 - packages/ui/src/locales/de-CH/index.json | 70 --- packages/ui/src/locales/de-DE/index.json | 73 ---- packages/ui/src/locales/en-US/index.json | 136 ++++-- packages/ui/src/locales/es-419/index.json | 67 --- packages/ui/src/locales/es-ES/index.json | 73 ---- packages/ui/src/locales/fil-PH/index.json | 19 - packages/ui/src/locales/fr-FR/index.json | 76 ---- packages/ui/src/locales/he-IL/index.json | 13 - packages/ui/src/locales/hu-HU/index.json | 172 -------- packages/ui/src/locales/id-ID/index.json | 97 ----- packages/ui/src/locales/it-IT/index.json | 139 ------ packages/ui/src/locales/ja-JP/index.json | 136 ------ packages/ui/src/locales/ko-KR/index.json | 160 ------- packages/ui/src/locales/ms-MY/index.json | 166 -------- packages/ui/src/locales/nl-NL/index.json | 82 ---- packages/ui/src/locales/no-NO/index.json | 25 -- packages/ui/src/locales/pl-PL/index.json | 172 -------- packages/ui/src/locales/pt-BR/index.json | 97 ----- packages/ui/src/locales/pt-PT/index.json | 43 -- packages/ui/src/locales/ru-RU/index.json | 232 ---------- packages/ui/src/locales/sv-SE/index.json | 70 --- packages/ui/src/locales/th-TH/index.json | 4 - packages/ui/src/locales/tr-TR/index.json | 124 ------ packages/ui/src/locales/uk-UA/index.json | 208 --------- packages/ui/src/locales/vi-VN/index.json | 112 ----- packages/ui/src/locales/zh-CN/index.json | 178 -------- packages/ui/src/locales/zh-TW/index.json | 166 -------- packages/ui/src/utils/common-messages.ts | 120 +++++- pnpm-lock.yaml | 334 +++++---------- scripts/coverage-i18n.ts | 45 +- scripts/i18n-icu-contract.test.ts | 58 +++ scripts/i18n-icu-contract.ts | 397 ++++++++++++++++++ turbo.jsonc | 6 +- 165 files changed, 1283 insertions(+), 5626 deletions(-) create mode 100644 scripts/i18n-icu-contract.test.ts create mode 100644 scripts/i18n-icu-contract.ts diff --git a/.github/workflows/i18n-pull.yml b/.github/workflows/i18n-pull.yml index 4ea0e1952..62c278321 100644 --- a/.github/workflows/i18n-pull.yml +++ b/.github/workflows/i18n-pull.yml @@ -56,6 +56,17 @@ jobs: ref: ${{ github.ref }} token: ${{ secrets.CROWDIN_GH_TOKEN }} + - name: Setup Node + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version-file: .nvmrc + + - name: Enable Corepack + run: corepack enable + + - name: Install script dependencies + run: pnpm install --frozen-lockfile --ignore-scripts + - name: Configure Git author id: git-author uses: MarcoIeni/git-config@59144859caf016f8b817a2ac9b051578729173c4 # v0.1.2 @@ -95,6 +106,9 @@ jobs: shell: bash run: sudo chown -R $USER:$USER . + - name: Prune stale ICU translations + run: pnpm scripts i18n-icu-contract prune-local + - name: Create Pull Request uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 with: diff --git a/.github/workflows/i18n-push.yml b/.github/workflows/i18n-push.yml index 9a0de81d4..6146c3752 100644 --- a/.github/workflows/i18n-push.yml +++ b/.github/workflows/i18n-push.yml @@ -4,11 +4,14 @@ on: push: branches: ['main'] paths: - - '.github/workflows/i18n.push.yml' + - '.github/workflows/i18n-push.yml' - 'apps/*/src/locales/en-US/**' - 'apps/*/locales/en-US/**' - 'packages/*/src/locales/en-US/**' - 'packages/*/locales/en-US/**' + - 'scripts/i18n-icu-contract.ts' + - 'package.json' + - 'pnpm-lock.yaml' - 'crowdin.yml' workflow_dispatch: @@ -56,6 +59,18 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ github.ref }} + fetch-depth: 2 + + - name: Setup Node + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version-file: .nvmrc + + - name: Enable Corepack + run: corepack enable + + - name: Install script dependencies + run: pnpm install --frozen-lockfile --ignore-scripts - name: Query branch name id: branch-name @@ -79,3 +94,9 @@ jobs: env: CROWDIN_PROJECT_ID: ${{ vars.CROWDIN_PROJECT_ID }} CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + + - name: Clear stale ICU translations in Crowdin + run: pnpm scripts i18n-icu-contract clear-crowdin-changed --base-ref HEAD^ --crowdin-branch "[${{ github.repository_owner }}.${{ github.event.repository.name }}] ${{ steps.branch-name.outputs.safe_branch_name }}" + env: + CROWDIN_PROJECT_ID: ${{ vars.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} diff --git a/.github/workflows/turbo-ci.yml b/.github/workflows/turbo-ci.yml index e25448c86..a31fcb8bc 100644 --- a/.github/workflows/turbo-ci.yml +++ b/.github/workflows/turbo-ci.yml @@ -204,4 +204,5 @@ jobs: - name: Verify intl:extract has been run run: | pnpm turbo run intl:extract --force - git diff --exit-code --color */*/src/locales/en-US/index.json + pnpm scripts i18n-icu-contract prune-local --check + git diff --exit-code --color */*/src/locales/*/index.json diff --git a/apps/app-frontend/package.json b/apps/app-frontend/package.json index a2e5bfaf5..9df74bb68 100644 --- a/apps/app-frontend/package.json +++ b/apps/app-frontend/package.json @@ -10,6 +10,7 @@ "lint": "eslint . && prettier --check .", "fix": "eslint . --fix && prettier --write .", "intl:extract": "formatjs extract \"src/**/*.{vue,ts,tsx,js,jsx,mts,cts,mjs,cjs}\" --ignore \"**/*.d.ts\" --ignore node_modules --out-file src/locales/en-US/index.json --format crowdin --preserve-whitespace", + "intl:prune-local": "pnpm -w scripts i18n-icu-contract prune-local --scope apps/app-frontend", "test": "vue-tsc --noEmit" }, "dependencies": { diff --git a/apps/app-frontend/src/components/ui/world/WorldItem.vue b/apps/app-frontend/src/components/ui/world/WorldItem.vue index f9b447000..ba4597bd5 100644 --- a/apps/app-frontend/src/components/ui/world/WorldItem.vue +++ b/apps/app-frontend/src/components/ui/world/WorldItem.vue @@ -244,7 +244,7 @@ const messages = defineMessages({