Broken translations in open source
We run shipi18n check on public repos, verify every finding by hand against the source language, and send the fix upstream. This page is the running tally.
updated 2026-09-16 · structural checks only, no LLM · one row per repo
| Repo | Locale format | Locales | Translations managed | Verified broken | Status | What was wrong |
|---|---|---|---|---|---|---|
| solidusio/solidus5.3k★ | Rails YAML | 33 | in repo | 13 | Fixed · our PR merged → | pt-BR: 13 strings dropped %{…}; merged same day, 3 core approvals |
| nocodb/nocodb65k★ | JSON (vue-i18n) | 37 | Crowdin | 4 | Fixed · by maintainer → | our issue #14573 → maintainer swept 39 locale files (+300/−300) |
| ACINQ/phoenix861★ | Android XML + Apple .xcstrings | 15 | in repo | 7 | PR open → | Android: 5 locales drop %2$s, 2 add a stray %1$s (iOS xcstrings follow-up queued) |
| hoppscotch/hoppscotch80k★ | JSON (vue-i18n) | 33 | in repo | 5 | PR open → | af: {naam}→{name}, {team}→{workspace}, hard-coded 10MB → {sizeLimit} |
| excalidraw/excalidraw132k★ | JSON (i18next) | 56 | Crowdin | 4 | PR open → | our issue #12097 → contributor fixed es-ES {{mix}} and added a placeholder-parity test suite |
| AppFlowy-IO/AppFlowy77k★ | JSON (easy_localization) | 35 | in repo | 3 | PR open → | de-DE: {Name}/{Zeit} translated variable names (cs/pl {}→{count} queued) |
| KRTirtho/spotube49k★ | Flutter ARB | 29 | in repo | 1 | PR open → | ko: {error} dropped |
| mastodon/mastodon50k★ | JSON (react-intl) + Rails YAML | 105 | Crowdin | 7 | Issue open → | 7 invalid ICU strings (de double-brace, ta translated 'other' keyword…) fall back to English |
| chatwoot/chatwoot37k★ | JSON (vue-i18n) + Rails YAML | 52 | Crowdin | 1 | Reported in thread → | zh drops {assigneeName}; all-locale pipe-plural collapse (export config) — commented on the open issue |
| ifmeorg/ifme1.6k★ | Rails YAML | 17 | in repo | 20 | Fix ready · not yet filed | %{typename} renamed in 5 locales; hi/id/vi/zh translated variable names |
| 24pullrequests/24pullrequests1.7k★ | Rails YAML | 16 | in repo | 16 | Fix ready · not yet filed | %{contributing_path} link dropped in 14 locales |
| Kochava-Studios/witsy2.0k★ | JSON (vue-i18n) | 8 | in repo | 7 | Fix ready · not yet filed | fr/pl/pt translated the variable names ({raccourci}, {uzasadnienie}…) |
| HemantKArya/BloomeeTunes2.2k★ | Flutter ARB | 6 | in repo | 6 | Fix ready · not yet filed | de/es drop {title}; ja/ko drop {name} |
| makeplane/plane59k★ | JSON (react-i18next) | 19 | in repo | 3 | Fix ready · not yet filed | cs template toasts drop {templateType}/{templateName} |
| thunder-app/thunder1.0k★ | Flutter ARB | 26 | in repo | 3 | Fix ready · not yet filed | es/it/sk drop {username} |
| scambra/devise_invitable2.7k★ | Rails YAML | 24 | in repo | 2 | Fix ready · not yet filed | zh-HK/zh-TW: %{email) paren typo |
| Anxcye/anx-reader8.9k★ | Flutter ARB | 15 | in repo | 1 | Fix ready · not yet filed | zh-TW drops {count} |
| louislam/uptime-kuma91k★ | JSON (vue-i18n) | 75 | Weblate | 6 | Verified · TMS-managed | es {aquí}, fr {virgule}… translated variable names; Weblate-managed |
| immich-app/immich114k★ | JSON (ICU) | 79 | Weblate | 4 | Verified · TMS-managed | 3 invalid ICU + hy {user}; Weblate-managed, deploy-only issue form |
| diaspora/diaspora14k★ | Rails YAML | 92 | WebTranslateIt | 3 | Verified · TMS-managed | ar {community_spotlight}% mangled; WebTranslateIt, no-PR policy |
| calcom/cal.com49k★ | JSON (next-i18next) | 43 | Lingo.dev | 1 | Verified · TMS-managed | ar drops {{appName}}; locales regenerated by Lingo.dev on every push |
| twentyhq/twenty57k★ | gettext .po | 31 | Crowdin | 0 | Verified · TMS-managed | Crowdin auto-pull every 2h; sr invents {dayOrDays} |
| ente-io/ente29k★ | JSON (i18next) | 51 | Crowdin | 0 | Verified · TMS-managed | Crowdin bot commits; findings unverified |
| we-promise/sure9.9k★ | Rails YAML | 117 | in repo | 0 | Vendored upstream | hits are in vendored rails-i18n defaults — belongs upstream |
| usememos/memos63k★ | JSON | 44 | in repo | 0 | Scanned · not verified | |
| laurent22/joplin56k★ | JSON | 10 | in repo | 0 | Scanned · not verified | |
| RocketChat/Rocket.Chat46k★ | JSON | 58 | in repo | 0 | Scanned · not verified | |
| activepieces/activepieces24k★ | JSON | 10 | in repo | ? | Scanned · not verified | |
| ai-shifu/ChatALL16k★ | JSON | 9 | in repo | 0 | Scanned · not verified | |
| apexcharts/apexcharts.js15k★ | JSON | 47 | in repo | 0 | Scanned · not verified | |
| mealie-recipes/mealie13k★ | JSON | 41 | in repo | 0 | Scanned · not verified | |
| formbricks/formbricks13k★ | JSON | 24 | in repo | 0 | Scanned · not verified | |
| iib0011/omni-tools10k★ | JSON | 10 | in repo | ? | Scanned · not verified | |
| gitalk/gitalk7.2k★ | JSON | 10 | in repo | 0 | Scanned · not verified | |
| nanbingxyz/5ire5.3k★ | JSON | 6 | in repo | ? | Scanned · not verified | |
| deckerst/aves5.3k★ | Android XML | 56 | in repo | 0 | Scanned · not verified | |
| GitJournal/GitJournal4.2k★ | Flutter ARB | 21 | in repo | 0 | Scanned · not verified | |
| stringer-rss/stringer4.1k★ | JSON | 16 | in repo | 0 | Scanned · not verified | |
| chrisvel/tududi3.4k★ | JSON | 24 | in repo | 0 | Scanned · not verified | |
| bensheldon/good_job3.0k★ | JSON | 12 | in repo | 0 | Scanned · not verified | |
| Apipie/apipie-rails2.5k★ | JSON | 12 | in repo | 0 | Scanned · not verified | |
| hoochanlon/Free-NTFS-for-Mac2.4k★ | JSON | 4 | in repo | 0 | Scanned · not verified | |
| daodao97/chatmcp2.2k★ | Flutter ARB | 3 | in repo | 0 | Scanned · not verified | |
| cogwheel0/conduit2.1k★ | JSON | 12 | in repo | 0 | Scanned · not verified | |
| fossasia/badgemagic-app2.0k★ | Flutter ARB | 23 | in repo | 0 | Scanned · not verified | |
| astrofox-io/astrofox2.0k★ | JSON | 8 | in repo | 0 | Scanned · not verified | |
| publify/publify1.9k★ | JSON | 17 | in repo | 0 | Scanned · not verified | |
| JHubi1/ollama-app1.8k★ | Flutter ARB | 5 | in repo | ? | Scanned · not verified | |
| CcSimple/vue-plugin-hiprint1.7k★ | JSON | 7 | in repo | 0 | Scanned · not verified | |
| shakacode/react-webpack-rails-tutorial1.7k★ | JSON | 4 | in repo | 0 | Scanned · not verified | |
| thredded/thredded1.6k★ | JSON | 9 | in repo | 0 | Scanned · not verified | |
| BrisklyDev/brisk1.5k★ | Flutter ARB | 8 | in repo | 0 | Scanned · not verified | |
| baotlake/office-website1.4k★ | JSON | 51 | in repo | 0 | Scanned · not verified | |
| okisdev/ChatChat1.3k★ | JSON | 12 | in repo | 0 | Scanned · not verified | |
| TracksApp/tracks1.2k★ | JSON | 11 | in repo | 0 | Scanned · not verified | |
| igorkasyanchuk/active_storage_validations1.2k★ | JSON | 16 | in repo | 0 | Scanned · not verified | |
| matthiasn/lotti1.2k★ | Flutter ARB | 11 | in repo | ? | Scanned · not verified | |
| fossasia/magic-epaper-app1.1k★ | Flutter ARB | 21 | in repo | 0 | Scanned · not verified | |
| opennookorg/screenshot-studio985★ | JSON | 7 | in repo | 0 | Scanned · not verified | |
| ianho7/maptoposter-online938★ | JSON | 7 | in repo | ? | Scanned · not verified | |
| sharatsachin/ytplaylist-len916★ | JSON | 26 | in repo | 0 | Scanned · not verified | |
| AQBot-Desktop/AQBot902★ | JSON | 10 | in repo | 0 | Scanned · not verified | |
| GetStream/stream-chat-react844★ | JSON | 11 | in repo | ? | Scanned · not verified | |
| localsend/localsend92k★ | JSON (slang) | 57 | Weblate + PRs | 0 | Clean | 0 placeholder findings |
Verified broken = strings we checked by hand where a translation drops, renames or malforms an interpolation variable or ICU construct so the UI shows the wrong thing at runtime. ? = the scanner flagged the repo but we haven't hand-verified it yet; raw scanner counts are deliberately not published. Plural simplifications and English-only suffix variables are excluded. Translations managed matters because repos on a TMS (Crowdin, Weblate, …) revert direct locale PRs — for those we open an issue instead.
How repos get here
Candidates come from GitHub code search for locale trees (ARB, Android, .po, Rails YAML, i18next/vue-i18n JSON), filtered to active repos with 800+ stars. Each is cloned and checked with the open-source CLI. Nothing is sent to an LLM.
What counts as a bug
Only what breaks at runtime: a dropped or renamed {variable}, a positional %2$s that vanished, invalid ICU MessageFormat, a %{email) typo. Every row's number was read against the source string by a human before anything was filed.
What the scan taught the scanner
Scanning real repos found eleven classes of false positive in our own checker in one week. Each became a regression fixture in the public corpus before we filed anything. Maintainers' time is the scarce resource.
Check your own repo
Same check, no API key, no account. Point it at your locale directory:
npx @shipi18n/cli check ./localesMaintainers: if a row about your project is wrong, open an issue and we'll correct it. Fixes are sent as one-file PRs on repos that accept them and as issues on repos that use a translation platform.