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-10-28 · structural checks only, no LLM · one row per repo
| Repo | Locale format | Locales | Translations managed | Verified broken | Status | What was wrong |
|---|---|---|---|---|---|---|
| ACINQ/phoenix876★ | Android XML + Apple .xcstrings | 15 | in repo | 55 | Fixed · our PR merged → | Android: format-argument mismatches in 7 locales — PR #829 merged 2026-09-23 (maintainer's cause: lnurl work and the it/pl/ja/ko/uk localisations done in parallel against older files, never reconciled). iOS follow-up issue #831: 48 malformed format specifiers in Localizable.xcstrings (ar 39, fr 4, es 3, cs 2) |
| solidusio/solidus5.3k★ | Rails YAML | 33 | in repo | 36 | Fixed · our PR merged → | pt-BR: 13 strings dropped %{…} (PR #6626 merged same day, 3 approvals); nl/pl follow-up PR #6637 merged 2026-09-22 (3 approvals). Re-scan of main: nl/pl clean, the same %{names} drop remains in 19 other locales; also say_yes/say_no parsed as booleans in ko/pt and duplicate keys in 6 locale files. 09-30: their i18n-tasks interpolation spec never covered i18n/ (en.yml lives in core) — PR #6655 points it there + fixes 21 strings incl. a ja validation that raised and fr order emails showing a literal %{total} |
| bensheldon/good_job3.0k★ | Rails YAML | 12 | in repo | 30 | Fixed · our PR merged → | ru/uk plural one forms hard-coded 1, so 21 minutes read as 1 минута, plus a uk few form and a ru label copied from another key; #1842 + #1848 merged 10-06 by the maintainer |
| npmx-dev/npmx.dev3.6k★ | JSON (vue-i18n) | 40 | in repo | 20 | Fixed · our PR merged → | 20 placeholders renamed in 7 locales, so values the code passes rendered blank (tr-TR search count, nl settings link); merged 10-10 |
| 24pullrequests/24pullrequests1.7k★ | Rails YAML | 16 | in repo | 20 | Fixed · our PR merged → | %{contributing_path} primer link dropped in 13 locales + hi variable names; merged same day (~2.5h after filing). 4 more in pt_br/zh_Hans/zh_Hant (our checker had skipped underscore-named files) → follow-up #5085 merged 09-30. Their i18n spec now checks interpolations too (i18n-tasks, #5086 merged 10-01) |
| bulwarkmail/webmail1.2k★ | JSON (next-intl) | 26 | in repo | 15 | Fixed · our PR merged → | mn showed the words 'Email'/'Server' instead of the user's email and server (value keys held label text); hu translated {delimiter} to {elválasztó}; mn {from}/{to} for {before}/{after}; fa/sk descriptions cut short; merged 10-06 |
| CyberTimon/RapidRAW10k★ | JSON (i18next) | 13 | in repo | 13 | Fixed · our PR merged →Now checked in their CI → | ru _one forms hard-coded one image, so 21 selected images read as Удалить изображение (delete image); merged 10-18 by the maintainer, who then merged a placeholder check into their own i18n:check the same day |
| floatpane/matcha1.1k★ | JSON | 10 | in repo | 9 | Fixed · our PR merged → | ar few form held the dual (two days ago), but the plural code maps 3–10 to few, so 3–10 days read as two days; merged 10-18 by the maintainer |
| hoppscotch/hoppscotch81k★ | JSON (vue-i18n) | 33 | in repo | 7 | Fixed · our PR merged → | af: {naam}→{name}, {team}→{workspace} ×3, hard-coded 10MB → {sizeLimit} ×2 — PR merged 2026-09-21 into next; re-scan of the merged tree: af clean, same drops still in 25 of the other 33 locales (123 strings) |
| makeplane/plane62k★ | JSON (react-i18next) | 19 | in repo | 3 | Fixed · our PR merged → | cs template toasts: {templateName}/{templateType} restored; merged same day by a co-founder |
| kanriapp/kanri2.0k★ | JSON (vue-i18n) | 10 | in repo | 3 | Fixed · our PR merged → | delete-board confirmations: de dropped {boardName}, pt_br used {boardname} (case-sensitive), so users were not told which board they were deleting; merged 10-17 by the maintainer |
| mattogodoy/nametag1.1k★ | JSON (next-intl) | 9 | in repo | 3 | Fixed · our PR merged → | de/ja/nb kept the pre-6ed69b9 wording: {name} the code no longer passes, and the relationship described from the wrong side; merged 10-03 by the maintainer, same day |
| scambra/devise_invitable2.7k★ | Rails YAML | 24 | in repo | 2 | Fixed · our PR merged →Now checked in their CI → | zh-HK/zh-TW closed the interpolation with a paren — %{email) — so Rails never substituted the address; merged same day by the maintainer |
| Anxcye/anx-reader8.9k★ | Flutter ARB | 15 | in repo | 1 | Fixed · our PR merged → | zh-TW collapsed the statisticYesterday ICU plural to the singular, so every value rendered as 昨天; merged 10-17 by the maintainer |
| nocodb/nocodb65k★ | JSON (vue-i18n) | 37 | Crowdin | 186 | Fixed · by maintainer → | our issue #14573 → maintainer swept 39 locale files (+300/−300). 10-01 re-scan: 182 plural strings in 13 locales (pt_BR 22, sv 23, da/no/pt 22, nl 21, it 16, ar/ro 14, fi 3, eu, ja, zh-Hant) had the | separator machine-translated into <unk>, ●, +, £… — both forms render run together; not covered by eloqnt #14639. Issue #14717 (10-01) confirmed by the team and fixed the same day by maintainer PR #14718 (13 locales, +181/−182); develop re-checked clean, 0 errors in 39 locales |
| ifmeorg/ifme1.6k★ | Rails YAML | 17 | in repo | 20 | PR open → | %{typename} renamed in 5 locales; hi/id/vi/zh translated variable names; ko refill date dropped |
| Kochava-Studios/witsy2.0k★ | JSON (vue-i18n) | 8 | in repo | 7 | PR open → | fr/pl/pt translated the variable names ({raccourci}, {uzasadnienie}…) |
| HemantKArya/BloomeeTunes2.2k★ | Flutter ARB | 6 | in repo | 6 | PR open → | de/es drop {title}; ja/ko drop {name} |
| excalidraw/excalidraw135k★ | JSON (i18next) | 56 | Crowdin | 4 | PR open → | our issue #12097 → contributor fixed es-ES {{mix}} and added a placeholder-parity test suite |
| thunder-app/thunder1.0k★ | Flutter ARB | 26 | in repo | 3 | PR open → | es/it/sk drop {username} |
| 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 |
| AppFlowy-IO/AppFlowy78k★ | JSON (easy_localization) | 35 | in repo | 3 | Taken into private repo → | de-DE: {Name}/{Zeit} translated variable names. PR #9019 closed 10-27 by the maintainer: "incorporated into a consolidated pull request in our Premium repository" (private). Counts as fixed once the public de-DE.json changes. |
| chatwoot/chatwoot38k★ | JSON (vue-i18n) + Rails YAML | 52 | Crowdin | 2 | Reported in thread → | zh drops {assigneeName}; all-locale pipe-plural collapse (export config) — commented on the open issue. 10-01 re-scan: pt_BR help-center views count merged both plural forms |
| immich-app/immich117k★ | JSON (ICU) | 79 | Weblate | 11 | Verified · TMS-managed | 3 invalid ICU + hy {user}; Weblate-managed, deploy-only issue form. 10-01 re-scan (underscore files now read): add_upload_to_stack drops its {isStack, select} in 7 locales, so it always says add to stack |
| louislam/uptime-kuma93k★ | JSON (vue-i18n) | 75 | Weblate | 6 | Verified · TMS-managed | es {aquí}, fr {virgule}… translated variable names; Weblate-managed |
| 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/twenty60k★ | gettext .po | 31 | Crowdin | 0 | Verified · TMS-managed | Crowdin auto-pull every 2h; sr invents {dayOrDays} |
| ente-io/ente30k★ | JSON (i18next) | 51 | Crowdin | 0 | Verified · TMS-managed | Crowdin bot commits; findings unverified |
| KRTirtho/spotube49k★ | Flutter ARB | 29 | in repo | 1 | Code since replaced → | ko "error" dropped {error}. PR #3128 closed 10-28: the Compose Multiplatform migration replaced app_ko.arb; the new values-ko/strings.xml checks clean. |
| we-promise/sure9.9k★ | Rails YAML | 117 | in repo | 0 | Vendored upstream | hits are in vendored rails-i18n defaults — belongs upstream |
| usememos/memos64k★ | JSON | 44 | in repo | 0 | Scanned · not verified | |
| laurent22/joplin57k★ | JSON | 10 | in repo | 0 | Scanned · not verified | |
| RocketChat/Rocket.Chat46k★ | JSON | 58 | in repo | 0 | Scanned · not verified | |
| wg-easy/wg-easy27k★ | JSON | 25 | in repo | 0 | Scanned · not verified | |
| activepieces/activepieces25k★ | JSON | 10 | in repo | ? | Scanned · not verified | |
| getmaxun/maxun18k★ | JSON | 8 | in repo | 0 | Scanned · not verified | |
| ai-shifu/ChatALL16k★ | JSON | 9 | in repo | 0 | Scanned · not verified | |
| YishenTu/claudian16k★ | JSON | 9 | in repo | 0 | Scanned · not verified | |
| apexcharts/apexcharts.js15k★ | JSON | 47 | in repo | 0 | Scanned · not verified | |
| mealie-recipes/mealie14k★ | JSON | 41 | in repo | 0 | Scanned · not verified | |
| formbricks/formbricks13k★ | JSON | 24 | in repo | 0 | Scanned · not verified | |
| Notsfsssf/pixez-flutter13k★ | Flutter ARB | 15 | in repo | 0 | Scanned · not verified | |
| zyronon/TypeWords10k★ | JSON | 13 | 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 | |
| al1abb/invoify6.4k★ | JSON | 17 | in repo | 0 | Scanned · not verified | |
| valhalla/valhalla6.3k★ | gettext .po | 34 | in repo | 0 | Scanned · not verified | |
| elk-zone/elk6.0k★ | JSON | 42 | in repo | ? | Scanned · not verified | |
| sdras/cssgridgenerator5.4k★ | JSON | 5 | 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 | |
| dromara/carbon5.2k★ | JSON | 33 | in repo | 0 | Scanned · not verified | |
| unovue/inspira-ui5.0k★ | JSON | 36 | 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 | |
| bdlukaa/fluent_ui3.5k★ | Flutter ARB | 40 | in repo | 0 | Scanned · not verified | |
| chrisvel/tududi3.4k★ | JSON | 24 | in repo | 0 | Scanned · not verified | |
| klembot/twinejs2.9k★ | JSON | 22 | in repo | ? | Scanned · not verified | |
| gamosoft/NoteDiscovery2.8k★ | JSON | 11 | 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 | |
| walterlow/freecut2.2k★ | JSON | 8 | in repo | 0 | Scanned · not verified | |
| daodao97/chatmcp2.2k★ | Flutter ARB | 3 | in repo | 0 | Scanned · not verified | |
| NatLabRockies/api-umbrella2.2k★ | gettext .po | 58 | in repo | ? | 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 | |
| quick123official/quick_redis_blog1.7k★ | JSON | 16 | in repo | ? | 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 | |
| xpavle00/Habo1.5k★ | Flutter ARB | 26 | in repo | ? | Scanned · not verified | |
| baotlake/office-website1.4k★ | JSON | 51 | in repo | 0 | Scanned · not verified | |
| mubaraknumann/unifideck1.4k★ | JSON | 15 | in repo | ? | Scanned · not verified | |
| okisdev/ChatChat1.3k★ | JSON | 12 | in repo | 0 | Scanned · not verified | |
| Blockstream/esplora1.3k★ | gettext .po | 17 | in repo | ? | Scanned · not verified | |
| polychromatic/polychromatic1.2k★ | gettext .po | 11 | 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 | |
| hrfee/jfa-go1.2k★ | JSON | 25 | in repo | ? | Scanned · not verified | |
| matthiasn/lotti1.2k★ | Flutter ARB | 11 | in repo | ? | Scanned · not verified | |
| Gisto/Gisto1.2k★ | JSON | 6 | in repo | 0 | Scanned · not verified | |
| commetchat/commet1.1k★ | Flutter ARB | 27 | in repo | 0 | 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 | |
| jamaljsr/polar858★ | JSON | 9 | in repo | 0 | Scanned · not verified | |
| GetStream/stream-chat-react844★ | JSON | 11 | in repo | ? | Scanned · not verified | |
| localsend/localsend96k★ | 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.
Seeing one of these in your own app?
Each page explains one failure, what causes it, and how to find every instance — using the cases on this scoreboard as the worked examples.
- Your app shows {name} instead of the name
- Rails renders %{name} instead of the value
- vue-i18n prints {count} instead of the value
- A Flutter string renders without its placeholder
- Android substitutes the wrong value in a translated string
- An ICU plural in one language throws at runtime
- Your translation platform exported a string without its placeholder
- A translated string renders as nothing at all
- A translation hard-codes a number the code is supposed to supply
- One character in a placeholder breaks the substitution
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.