Skip to content

Migrate translations from Crowdin to General Translation - #2660

Open
jarvisonsmart wants to merge 4 commits into
mainfrom
migrate-to-general-translation
Open

Migrate translations from Crowdin to General Translation#2660
jarvisonsmart wants to merge 4 commits into
mainfrom
migrate-to-general-translation

Conversation

@jarvisonsmart

Copy link
Copy Markdown
Collaborator

Migrates the translation pipeline from Crowdin to General Translation and modernizes the whole i18n setup along the way.

What changed

Translation files restructured (packages/localization)

  • The single 1,675-key base.json (plus 23 <lang>-base.json siblings) is split into locales/<locale>/<group>.json — 15 thematic group files (offers, marketplace, chat, contacts, settings, …). Keys keep their full dotted names, so no call site changed.
  • base.json vs en-base.json dual-source-of-truth is gone: they were merged into a single English source (locales/en/), with en-base.json winning the two drifted values (notifications.TRADE_REMINDER.title, messages.readAt).
  • src/translations.ts is now generated (pnpm generate) — flat catalogs, no more runtime unflatten with the type-level lie. Disabled locales (ar, fa, fi, id, no, pcm, sv, tr, uk) live in a separate generated src/extraTranslations.ts so Metro never bundles them; enabling one later means moving it to the APP_LOCALES list in scripts/generateTranslations.mjs.
  • The legal documents and infoPlist strings moved into the same per-locale layout.

i18n-js → i18next (apps/mobile)

  • I18nProvider now builds i18next instances with keySeparator: false, so the flat dotted keys are used as-is — all ~1,850 t() call sites are untouched, including dynamic template-literal keys.
  • Fixed the long-standing 'dev' vs 'en_dev' locale-name mismatch (one devAwareLng() helper; the persisted settings value stays 'dev').
  • Missing keys now fall back to the raw key instead of i18n-js's [missing …] marker.
  • Added intl-pluralrules polyfill (Hermes lacks Intl.PluralRules) and converted 6 {{count}} keys to proper _one/_other plural forms — Slavic locales get correct plurals once translations sync. More candidates are listed in the migration notes for follow-up.
  • Notification service: getNotificationContentByLocale is now a typed flat-catalog lookup (no any, no @ts-expect-error, no try/catch).

Crowdin → General Translation

  • crowdin.yml + nightly Crowdin workflow deleted; zero crowdin references remain.
  • New .github/workflows/translate.yaml: on push to main touching locales/en/** (or manual dispatch), runs gt translate + pnpm generate and opens/updates a chore/translations-sync PR. Translated files stay committed in git; the hosted API is only the translation engine.
  • New guard check:translations (wired into test-lint CI): validates locale JSON, orphan keys (plural-aware), empty English values (2 legacy warnings), and codegen freshness.
  • Docs rewritten: packages/localization/AGENTS.md and docs/how_to_help_translate.md (filename typo fixed; Crowdin screenshots removed, Translators Debug Mode guide kept).

What still needs doing (not blocking review)

  1. GitHub secrets: add GT_API_KEY (must be a production key — the dev key can't call the translation API; generate via npx gt auth -t production) and GT_PROJECT_ID; the CROWDIN_* secrets can be deleted.
  2. First translation run: trigger translate.yaml manually (or run gt translate locally with the production key). This fills the new plural forms in all locales (until then those 6 keys render English via fallback) and the small pre-existing gaps. The run should preserve existing human translations (CLI docs: local edits are kept unless source changed) — worth eyeballing the first sync PR diff to confirm.
  3. pcm (Nigerian Pidgin) is not supported by GT — its files remain committed and validated but won't receive updates; decide later whether to drop it or translate it another way.

Notification-service jest failures in local runs are pre-existing environment issues (PgClient: Failed to connect — tests need the CI Postgres); mobile suite passes (221 tests), full turbo:typecheck / format / lint pass across all 29 workspaces.

Restructure packages/localization into locales/<locale>/<group>.json with a
single merged English source (en-base won both drifted values), generated
translation catalogs (no more runtime unflatten), and a separate module for
not-yet-enabled locales so they stay out of the app bundle.

Replace i18n-js with i18next (keySeparator: false keeps all call sites
unchanged), unify the dev/en_dev locale naming, and add proper plural forms
for count-based keys. Notification service now uses a typed flat-catalog
lookup.

Crowdin config and sync workflow are replaced by a General Translation CI
workflow that machine-translates new English strings and opens a sync PR.
A check:translations guard validates locale files and codegen freshness in
CI.
@greptile-apps

greptile-apps Bot commented Aug 8, 2026

Copy link
Copy Markdown

Too many files changed for review (511 files, 100 file limit).

@coderabbitai

coderabbitai Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 493 files, which is 393 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: d47d6f66-efe9-4a59-85a8-bd6514c07bf2

📥 Commits

Reviewing files that changed from the base of the PR and between 8e9bd7a and bf558ee.

⛔ Files ignored due to path filters (18)
  • docs/images/image1.png is excluded by !**/*.png
  • docs/images/image10.png is excluded by !**/*.png
  • docs/images/image11.png is excluded by !**/*.png
  • docs/images/image13.png is excluded by !**/*.png
  • docs/images/image16.png is excluded by !**/*.png
  • docs/images/image17.png is excluded by !**/*.png
  • docs/images/image19.png is excluded by !**/*.png
  • docs/images/image2.png is excluded by !**/*.png
  • docs/images/image20.png is excluded by !**/*.png
  • docs/images/image21.png is excluded by !**/*.png
  • docs/images/image22.png is excluded by !**/*.png
  • docs/images/image3.png is excluded by !**/*.png
  • docs/images/image4.png is excluded by !**/*.png
  • docs/images/image5.png is excluded by !**/*.png
  • docs/images/image6.png is excluded by !**/*.png
  • docs/images/image7.png is excluded by !**/*.png
  • docs/images/image9.png is excluded by !**/*.png
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (493)
  • .agents/skills/adding-translation-key/SKILL.md
  • .claude/skills/adding-translation-key
  • .github/workflows/crowdin.yaml
  • .github/workflows/test-lint.yaml
  • .github/workflows/translate.yaml
  • README.md
  • apps/mobile/app.config.ts
  • apps/mobile/index.js
  • apps/mobile/jest.config.ts
  • apps/mobile/jest.setup.ts
  • apps/mobile/package.json
  • apps/mobile/src/state/useSetAppLanguageFromStore.ts
  • apps/mobile/src/state/useSetRelativeDateFormatting.ts
  • apps/mobile/src/utils/getNewI18n.ts
  • apps/mobile/src/utils/localization/I18nProvider.tsx
  • apps/notification-service/src/services/PushNotificationService/utils.ts
  • crowdin.yml
  • docs/how_to_help_transalte.md
  • docs/how_to_help_translate.md
  • packages/localization/AGENTS.md
  • packages/localization/ar-base.json
  • packages/localization/base.json
  • packages/localization/bg-base.json
  • packages/localization/cs-base.json
  • packages/localization/de-base.json
  • packages/localization/en-base.json
  • packages/localization/es-base.json
  • packages/localization/fa-base.json
  • packages/localization/fi-base.json
  • packages/localization/fr-base.json
  • packages/localization/gt-lock.json
  • packages/localization/gt.config.json
  • packages/localization/id-base.json
  • packages/localization/it-base.json
  • packages/localization/ja-base.json
  • packages/localization/locales/ar/chat.json
  • packages/localization/locales/ar/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/ar/clubs.json
  • packages/localization/locales/ar/common.json
  • packages/localization/locales/ar/community.json
  • packages/localization/locales/ar/contacts.json
  • packages/localization/locales/ar/currency.json
  • packages/localization/locales/ar/donations.json
  • packages/localization/locales/ar/infoPlist.json
  • packages/localization/locales/ar/legal.json
  • packages/localization/locales/ar/login.json
  • packages/localization/locales/ar/marketplace.json
  • packages/localization/locales/ar/misc.json
  • packages/localization/locales/ar/notifications.json
  • packages/localization/locales/ar/offers.json
  • packages/localization/locales/ar/privacyPolicy.json
  • packages/localization/locales/ar/settings.json
  • packages/localization/locales/ar/termsOfUse.json
  • packages/localization/locales/ar/tradeChecklist.json
  • packages/localization/locales/bg/chat.json
  • packages/localization/locales/bg/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/bg/clubs.json
  • packages/localization/locales/bg/common.json
  • packages/localization/locales/bg/community.json
  • packages/localization/locales/bg/contacts.json
  • packages/localization/locales/bg/currency.json
  • packages/localization/locales/bg/donations.json
  • packages/localization/locales/bg/infoPlist.json
  • packages/localization/locales/bg/legal.json
  • packages/localization/locales/bg/login.json
  • packages/localization/locales/bg/marketplace.json
  • packages/localization/locales/bg/misc.json
  • packages/localization/locales/bg/notifications.json
  • packages/localization/locales/bg/offers.json
  • packages/localization/locales/bg/privacyPolicy.json
  • packages/localization/locales/bg/settings.json
  • packages/localization/locales/bg/termsOfUse.json
  • packages/localization/locales/bg/tradeChecklist.json
  • packages/localization/locales/cs/chat.json
  • packages/localization/locales/cs/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/cs/clubs.json
  • packages/localization/locales/cs/common.json
  • packages/localization/locales/cs/community.json
  • packages/localization/locales/cs/contacts.json
  • packages/localization/locales/cs/currency.json
  • packages/localization/locales/cs/donations.json
  • packages/localization/locales/cs/infoPlist.json
  • packages/localization/locales/cs/legal.json
  • packages/localization/locales/cs/login.json
  • packages/localization/locales/cs/marketplace.json
  • packages/localization/locales/cs/misc.json
  • packages/localization/locales/cs/notifications.json
  • packages/localization/locales/cs/offers.json
  • packages/localization/locales/cs/privacyPolicy.json
  • packages/localization/locales/cs/settings.json
  • packages/localization/locales/cs/termsOfUse.json
  • packages/localization/locales/cs/tradeChecklist.json
  • packages/localization/locales/de/chat.json
  • packages/localization/locales/de/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/de/clubs.json
  • packages/localization/locales/de/common.json
  • packages/localization/locales/de/community.json
  • packages/localization/locales/de/contacts.json
  • packages/localization/locales/de/currency.json
  • packages/localization/locales/de/donations.json
  • packages/localization/locales/de/infoPlist.json
  • packages/localization/locales/de/legal.json
  • packages/localization/locales/de/login.json
  • packages/localization/locales/de/marketplace.json
  • packages/localization/locales/de/misc.json
  • packages/localization/locales/de/notifications.json
  • packages/localization/locales/de/offers.json
  • packages/localization/locales/de/privacyPolicy.json
  • packages/localization/locales/de/settings.json
  • packages/localization/locales/de/termsOfUse.json
  • packages/localization/locales/de/tradeChecklist.json
  • packages/localization/locales/en/chat.json
  • packages/localization/locales/en/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/en/clubs.json
  • packages/localization/locales/en/common.json
  • packages/localization/locales/en/community.json
  • packages/localization/locales/en/contacts.json
  • packages/localization/locales/en/currency.json
  • packages/localization/locales/en/donations.json
  • packages/localization/locales/en/infoPlist.json
  • packages/localization/locales/en/legal.json
  • packages/localization/locales/en/login.json
  • packages/localization/locales/en/marketplace.json
  • packages/localization/locales/en/misc.json
  • packages/localization/locales/en/notifications.json
  • packages/localization/locales/en/offers.json
  • packages/localization/locales/en/privacyPolicy.json
  • packages/localization/locales/en/settings.json
  • packages/localization/locales/en/termsOfUse.json
  • packages/localization/locales/en/tradeChecklist.json
  • packages/localization/locales/es/chat.json
  • packages/localization/locales/es/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/es/clubs.json
  • packages/localization/locales/es/common.json
  • packages/localization/locales/es/community.json
  • packages/localization/locales/es/contacts.json
  • packages/localization/locales/es/currency.json
  • packages/localization/locales/es/donations.json
  • packages/localization/locales/es/infoPlist.json
  • packages/localization/locales/es/legal.json
  • packages/localization/locales/es/login.json
  • packages/localization/locales/es/marketplace.json
  • packages/localization/locales/es/misc.json
  • packages/localization/locales/es/notifications.json
  • packages/localization/locales/es/offers.json
  • packages/localization/locales/es/privacyPolicy.json
  • packages/localization/locales/es/settings.json
  • packages/localization/locales/es/termsOfUse.json
  • packages/localization/locales/es/tradeChecklist.json
  • packages/localization/locales/fa/chat.json
  • packages/localization/locales/fa/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/fa/clubs.json
  • packages/localization/locales/fa/common.json
  • packages/localization/locales/fa/community.json
  • packages/localization/locales/fa/contacts.json
  • packages/localization/locales/fa/currency.json
  • packages/localization/locales/fa/donations.json
  • packages/localization/locales/fa/infoPlist.json
  • packages/localization/locales/fa/legal.json
  • packages/localization/locales/fa/login.json
  • packages/localization/locales/fa/marketplace.json
  • packages/localization/locales/fa/misc.json
  • packages/localization/locales/fa/notifications.json
  • packages/localization/locales/fa/offers.json
  • packages/localization/locales/fa/privacyPolicy.json
  • packages/localization/locales/fa/settings.json
  • packages/localization/locales/fa/termsOfUse.json
  • packages/localization/locales/fa/tradeChecklist.json
  • packages/localization/locales/fi/chat.json
  • packages/localization/locales/fi/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/fi/clubs.json
  • packages/localization/locales/fi/common.json
  • packages/localization/locales/fi/community.json
  • packages/localization/locales/fi/contacts.json
  • packages/localization/locales/fi/currency.json
  • packages/localization/locales/fi/donations.json
  • packages/localization/locales/fi/infoPlist.json
  • packages/localization/locales/fi/legal.json
  • packages/localization/locales/fi/login.json
  • packages/localization/locales/fi/marketplace.json
  • packages/localization/locales/fi/misc.json
  • packages/localization/locales/fi/notifications.json
  • packages/localization/locales/fi/offers.json
  • packages/localization/locales/fi/privacyPolicy.json
  • packages/localization/locales/fi/settings.json
  • packages/localization/locales/fi/termsOfUse.json
  • packages/localization/locales/fi/tradeChecklist.json
  • packages/localization/locales/fr/chat.json
  • packages/localization/locales/fr/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/fr/clubs.json
  • packages/localization/locales/fr/common.json
  • packages/localization/locales/fr/community.json
  • packages/localization/locales/fr/contacts.json
  • packages/localization/locales/fr/currency.json
  • packages/localization/locales/fr/donations.json
  • packages/localization/locales/fr/infoPlist.json
  • packages/localization/locales/fr/legal.json
  • packages/localization/locales/fr/login.json
  • packages/localization/locales/fr/marketplace.json
  • packages/localization/locales/fr/misc.json
  • packages/localization/locales/fr/notifications.json
  • packages/localization/locales/fr/offers.json
  • packages/localization/locales/fr/privacyPolicy.json
  • packages/localization/locales/fr/settings.json
  • packages/localization/locales/fr/termsOfUse.json
  • packages/localization/locales/fr/tradeChecklist.json
  • packages/localization/locales/id/chat.json
  • packages/localization/locales/id/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/id/clubs.json
  • packages/localization/locales/id/common.json
  • packages/localization/locales/id/community.json
  • packages/localization/locales/id/contacts.json
  • packages/localization/locales/id/currency.json
  • packages/localization/locales/id/donations.json
  • packages/localization/locales/id/infoPlist.json
  • packages/localization/locales/id/legal.json
  • packages/localization/locales/id/login.json
  • packages/localization/locales/id/marketplace.json
  • packages/localization/locales/id/misc.json
  • packages/localization/locales/id/notifications.json
  • packages/localization/locales/id/offers.json
  • packages/localization/locales/id/privacyPolicy.json
  • packages/localization/locales/id/settings.json
  • packages/localization/locales/id/termsOfUse.json
  • packages/localization/locales/id/tradeChecklist.json
  • packages/localization/locales/it/chat.json
  • packages/localization/locales/it/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/it/clubs.json
  • packages/localization/locales/it/common.json
  • packages/localization/locales/it/community.json
  • packages/localization/locales/it/contacts.json
  • packages/localization/locales/it/currency.json
  • packages/localization/locales/it/donations.json
  • packages/localization/locales/it/infoPlist.json
  • packages/localization/locales/it/legal.json
  • packages/localization/locales/it/login.json
  • packages/localization/locales/it/marketplace.json
  • packages/localization/locales/it/misc.json
  • packages/localization/locales/it/notifications.json
  • packages/localization/locales/it/offers.json
  • packages/localization/locales/it/privacyPolicy.json
  • packages/localization/locales/it/settings.json
  • packages/localization/locales/it/termsOfUse.json
  • packages/localization/locales/it/tradeChecklist.json
  • packages/localization/locales/ja/chat.json
  • packages/localization/locales/ja/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/ja/clubs.json
  • packages/localization/locales/ja/common.json
  • packages/localization/locales/ja/community.json
  • packages/localization/locales/ja/contacts.json
  • packages/localization/locales/ja/currency.json
  • packages/localization/locales/ja/donations.json
  • packages/localization/locales/ja/infoPlist.json
  • packages/localization/locales/ja/legal.json
  • packages/localization/locales/ja/login.json
  • packages/localization/locales/ja/marketplace.json
  • packages/localization/locales/ja/misc.json
  • packages/localization/locales/ja/notifications.json
  • packages/localization/locales/ja/offers.json
  • packages/localization/locales/ja/privacyPolicy.json
  • packages/localization/locales/ja/settings.json
  • packages/localization/locales/ja/termsOfUse.json
  • packages/localization/locales/ja/tradeChecklist.json
  • packages/localization/locales/nl/chat.json
  • packages/localization/locales/nl/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/nl/clubs.json
  • packages/localization/locales/nl/common.json
  • packages/localization/locales/nl/community.json
  • packages/localization/locales/nl/contacts.json
  • packages/localization/locales/nl/currency.json
  • packages/localization/locales/nl/donations.json
  • packages/localization/locales/nl/infoPlist.json
  • packages/localization/locales/nl/legal.json
  • packages/localization/locales/nl/login.json
  • packages/localization/locales/nl/marketplace.json
  • packages/localization/locales/nl/misc.json
  • packages/localization/locales/nl/notifications.json
  • packages/localization/locales/nl/offers.json
  • packages/localization/locales/nl/privacyPolicy.json
  • packages/localization/locales/nl/settings.json
  • packages/localization/locales/nl/termsOfUse.json
  • packages/localization/locales/nl/tradeChecklist.json
  • packages/localization/locales/no/chat.json
  • packages/localization/locales/no/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/no/clubs.json
  • packages/localization/locales/no/common.json
  • packages/localization/locales/no/community.json
  • packages/localization/locales/no/contacts.json
  • packages/localization/locales/no/currency.json
  • packages/localization/locales/no/donations.json
  • packages/localization/locales/no/infoPlist.json
  • packages/localization/locales/no/legal.json
  • packages/localization/locales/no/login.json
  • packages/localization/locales/no/marketplace.json
  • packages/localization/locales/no/misc.json
  • packages/localization/locales/no/notifications.json
  • packages/localization/locales/no/offers.json
  • packages/localization/locales/no/privacyPolicy.json
  • packages/localization/locales/no/settings.json
  • packages/localization/locales/no/termsOfUse.json
  • packages/localization/locales/no/tradeChecklist.json
  • packages/localization/locales/pcm/chat.json
  • packages/localization/locales/pcm/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/pcm/clubs.json
  • packages/localization/locales/pcm/common.json
  • packages/localization/locales/pcm/community.json
  • packages/localization/locales/pcm/contacts.json
  • packages/localization/locales/pcm/currency.json
  • packages/localization/locales/pcm/donations.json
  • packages/localization/locales/pcm/legal.json
  • packages/localization/locales/pcm/login.json
  • packages/localization/locales/pcm/marketplace.json
  • packages/localization/locales/pcm/misc.json
  • packages/localization/locales/pcm/notifications.json
  • packages/localization/locales/pcm/offers.json
  • packages/localization/locales/pcm/privacyPolicy.json
  • packages/localization/locales/pcm/settings.json
  • packages/localization/locales/pcm/termsOfUse.json
  • packages/localization/locales/pcm/tradeChecklist.json
  • packages/localization/locales/pl/chat.json
  • packages/localization/locales/pl/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/pl/clubs.json
  • packages/localization/locales/pl/common.json
  • packages/localization/locales/pl/community.json
  • packages/localization/locales/pl/contacts.json
  • packages/localization/locales/pl/currency.json
  • packages/localization/locales/pl/donations.json
  • packages/localization/locales/pl/infoPlist.json
  • packages/localization/locales/pl/legal.json
  • packages/localization/locales/pl/login.json
  • packages/localization/locales/pl/marketplace.json
  • packages/localization/locales/pl/misc.json
  • packages/localization/locales/pl/notifications.json
  • packages/localization/locales/pl/offers.json
  • packages/localization/locales/pl/privacyPolicy.json
  • packages/localization/locales/pl/settings.json
  • packages/localization/locales/pl/termsOfUse.json
  • packages/localization/locales/pl/tradeChecklist.json
  • packages/localization/locales/pt/chat.json
  • packages/localization/locales/pt/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/pt/clubs.json
  • packages/localization/locales/pt/common.json
  • packages/localization/locales/pt/community.json
  • packages/localization/locales/pt/contacts.json
  • packages/localization/locales/pt/currency.json
  • packages/localization/locales/pt/donations.json
  • packages/localization/locales/pt/infoPlist.json
  • packages/localization/locales/pt/legal.json
  • packages/localization/locales/pt/login.json
  • packages/localization/locales/pt/marketplace.json
  • packages/localization/locales/pt/misc.json
  • packages/localization/locales/pt/notifications.json
  • packages/localization/locales/pt/offers.json
  • packages/localization/locales/pt/privacyPolicy.json
  • packages/localization/locales/pt/settings.json
  • packages/localization/locales/pt/termsOfUse.json
  • packages/localization/locales/pt/tradeChecklist.json
  • packages/localization/locales/sk/chat.json
  • packages/localization/locales/sk/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/sk/clubs.json
  • packages/localization/locales/sk/common.json
  • packages/localization/locales/sk/community.json
  • packages/localization/locales/sk/contacts.json
  • packages/localization/locales/sk/currency.json
  • packages/localization/locales/sk/donations.json
  • packages/localization/locales/sk/infoPlist.json
  • packages/localization/locales/sk/legal.json
  • packages/localization/locales/sk/login.json
  • packages/localization/locales/sk/marketplace.json
  • packages/localization/locales/sk/misc.json
  • packages/localization/locales/sk/notifications.json
  • packages/localization/locales/sk/offers.json
  • packages/localization/locales/sk/privacyPolicy.json
  • packages/localization/locales/sk/settings.json
  • packages/localization/locales/sk/termsOfUse.json
  • packages/localization/locales/sk/tradeChecklist.json
  • packages/localization/locales/sv/chat.json
  • packages/localization/locales/sv/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/sv/clubs.json
  • packages/localization/locales/sv/common.json
  • packages/localization/locales/sv/community.json
  • packages/localization/locales/sv/contacts.json
  • packages/localization/locales/sv/currency.json
  • packages/localization/locales/sv/donations.json
  • packages/localization/locales/sv/infoPlist.json
  • packages/localization/locales/sv/legal.json
  • packages/localization/locales/sv/login.json
  • packages/localization/locales/sv/marketplace.json
  • packages/localization/locales/sv/misc.json
  • packages/localization/locales/sv/notifications.json
  • packages/localization/locales/sv/offers.json
  • packages/localization/locales/sv/privacyPolicy.json
  • packages/localization/locales/sv/settings.json
  • packages/localization/locales/sv/termsOfUse.json
  • packages/localization/locales/sv/tradeChecklist.json
  • packages/localization/locales/sw/chat.json
  • packages/localization/locales/sw/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/sw/clubs.json
  • packages/localization/locales/sw/common.json
  • packages/localization/locales/sw/community.json
  • packages/localization/locales/sw/contacts.json
  • packages/localization/locales/sw/currency.json
  • packages/localization/locales/sw/donations.json
  • packages/localization/locales/sw/infoPlist.json
  • packages/localization/locales/sw/legal.json
  • packages/localization/locales/sw/login.json
  • packages/localization/locales/sw/marketplace.json
  • packages/localization/locales/sw/misc.json
  • packages/localization/locales/sw/notifications.json
  • packages/localization/locales/sw/offers.json
  • packages/localization/locales/sw/privacyPolicy.json
  • packages/localization/locales/sw/settings.json
  • packages/localization/locales/sw/termsOfUse.json
  • packages/localization/locales/sw/tradeChecklist.json
  • packages/localization/locales/tr/chat.json
  • packages/localization/locales/tr/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/tr/clubs.json
  • packages/localization/locales/tr/common.json
  • packages/localization/locales/tr/community.json
  • packages/localization/locales/tr/contacts.json
  • packages/localization/locales/tr/currency.json
  • packages/localization/locales/tr/donations.json
  • packages/localization/locales/tr/infoPlist.json
  • packages/localization/locales/tr/legal.json
  • packages/localization/locales/tr/login.json
  • packages/localization/locales/tr/marketplace.json
  • packages/localization/locales/tr/misc.json
  • packages/localization/locales/tr/notifications.json
  • packages/localization/locales/tr/offers.json
  • packages/localization/locales/tr/privacyPolicy.json
  • packages/localization/locales/tr/settings.json
  • packages/localization/locales/tr/termsOfUse.json
  • packages/localization/locales/tr/tradeChecklist.json
  • packages/localization/locales/uk/chat.json
  • packages/localization/locales/uk/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/uk/clubs.json
  • packages/localization/locales/uk/common.json
  • packages/localization/locales/uk/community.json
  • packages/localization/locales/uk/contacts.json
  • packages/localization/locales/uk/currency.json
  • packages/localization/locales/uk/donations.json
  • packages/localization/locales/uk/infoPlist.json
  • packages/localization/locales/uk/legal.json
  • packages/localization/locales/uk/login.json
  • packages/localization/locales/uk/marketplace.json
  • packages/localization/locales/uk/misc.json
  • packages/localization/locales/uk/notifications.json
  • packages/localization/locales/uk/offers.json
  • packages/localization/locales/uk/privacyPolicy.json
  • packages/localization/locales/uk/settings.json
  • packages/localization/locales/uk/termsOfUse.json
  • packages/localization/locales/uk/tradeChecklist.json
  • packages/localization/locales/zh/chat.json
  • packages/localization/locales/zh/childSafetyAndSexAbusePrevention.json
  • packages/localization/locales/zh/clubs.json
  • packages/localization/locales/zh/common.json
  • packages/localization/locales/zh/community.json
  • packages/localization/locales/zh/contacts.json
  • packages/localization/locales/zh/currency.json
  • packages/localization/locales/zh/donations.json
  • packages/localization/locales/zh/infoPlist.json
  • packages/localization/locales/zh/legal.json
  • packages/localization/locales/zh/login.json
  • packages/localization/locales/zh/marketplace.json
  • packages/localization/locales/zh/misc.json
  • packages/localization/locales/zh/notifications.json
  • packages/localization/locales/zh/offers.json
  • packages/localization/locales/zh/privacyPolicy.json
  • packages/localization/locales/zh/settings.json
  • packages/localization/locales/zh/termsOfUse.json
  • packages/localization/locales/zh/tradeChecklist.json
  • packages/localization/nl-base.json
  • packages/localization/no-base.json
  • packages/localization/package.json
  • packages/localization/pcm-base.json
  • packages/localization/pl-base.json
  • packages/localization/pt-base.json
  • packages/localization/scripts/checkTranslations.mjs
  • packages/localization/scripts/generateTranslations.mjs
  • packages/localization/sk-base.json
  • packages/localization/src/extraTranslations.ts
  • packages/localization/src/translations.ts
  • packages/localization/sv-base.json
  • packages/localization/sw-base.json
  • packages/localization/tr-base.json
  • packages/localization/tsconfig.json
  • packages/localization/uk-base.json
  • packages/localization/uk-childSafetyAndSexAbusePrevention.json
  • packages/localization/uk-privacyPolicy.json
  • packages/localization/uk-termsOfUse.json
  • packages/localization/zh-base.json
  • pnpm-workspace.yaml
  • tooling/handy-scripts/src/cleanupUnusedTranslations.ts

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


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.

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown

📱 Preview on the staging app

Open Vexl (stage) → Account → Scan QR code and scan this:

PR preview QR code

Preview link: stagingapp.vexl.it://link/?type=load-pr-preview&channel=pr-2660&version=1.44.2

Channel pr-2660
Commit bf558ee
Runtime 3a16ea5cadcf5802b239e08cefc85990ffb30e5b, 4a3e6ff7307a1913c9b499a4592c4a7ab61afd1d
Dashboard update group

The preview only loads into staging builds with a matching runtime — if this PR changes native code, ship a new staging build first. To go back to the staging channel: debug screen → "Clear PR preview".

Register existing human translations on the GT platform (so they are never
machine-retranslated), machine-translate the missing keys for active locales
(plural forms and pre-existing gaps), and add hand-written Czech/Slovak/Polish
_few/_many plural forms that GT cannot derive from the English _one/_other
source. Adds iOS infoPlist permission strings for nl, sw, and zh and wires
them into the app config. Commits gt-lock.json so CI sync PRs track local
edits correctly.
Run gt translate with --save-local in CI so locale-file corrections committed
to git are uploaded to the General Translation platform instead of being
overwritten by the next sync. Add a nightly schedule so dashboard-side edits
reach the repo without waiting for an English string change. Update docs to
match.
Documents the English-only workflow (pick the right group file, run pnpm
generate, never run gt commands) for coding agents, with a .claude/skills
symlink so Claude Code picks it up.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant