Skip to main content

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

95
repos scanned
28
ship a verified broken string
477
broken strings verified by hand
15
fixed upstream so far
2
now run the check in CI
RepoLocale formatLocalesTranslations managedVerified brokenStatusWhat was wrong
ACINQ/phoenix876★Android XML + Apple .xcstrings15in repo55Fixed · 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 YAML33in repo36Fixed · 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 YAML12in repo30Fixed · 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)40in repo20Fixed · 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 YAML16in repo20Fixed · 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)26in repo15Fixed · 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)13in repo13Fixed · 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★JSON10in repo9Fixed · 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)33in repo7Fixed · 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)19in repo3Fixed · our PR merged →cs template toasts: {templateName}/{templateType} restored; merged same day by a co-founder
kanriapp/kanri2.0k★JSON (vue-i18n)10in repo3Fixed · 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)9in repo3Fixed · 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 YAML24in repo2Fixed · 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 ARB15in repo1Fixed · 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)37Crowdin186Fixed · 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 YAML17in repo20PR open →%{typename} renamed in 5 locales; hi/id/vi/zh translated variable names; ko refill date dropped
Kochava-Studios/witsy2.0k★JSON (vue-i18n)8in repo7PR open →fr/pl/pt translated the variable names ({raccourci}, {uzasadnienie}…)
HemantKArya/BloomeeTunes2.2k★Flutter ARB6in repo6PR open →de/es drop {title}; ja/ko drop {name}
excalidraw/excalidraw135k★JSON (i18next)56Crowdin4PR open →our issue #12097 → contributor fixed es-ES {{mix}} and added a placeholder-parity test suite
thunder-app/thunder1.0k★Flutter ARB26in repo3PR open →es/it/sk drop {username}
mastodon/mastodon50k★JSON (react-intl) + Rails YAML105Crowdin7Issue open →7 invalid ICU strings (de double-brace, ta translated 'other' keyword…) fall back to English
AppFlowy-IO/AppFlowy78k★JSON (easy_localization)35in repo3Taken 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 YAML52Crowdin2Reported 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)79Weblate11Verified · TMS-managed3 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)75Weblate6Verified · TMS-managedes {aquí}, fr {virgule}… translated variable names; Weblate-managed
diaspora/diaspora14k★Rails YAML92WebTranslateIt3Verified · TMS-managedar {community_spotlight}% mangled; WebTranslateIt, no-PR policy
calcom/cal.com49k★JSON (next-i18next)43Lingo.dev1Verified · TMS-managedar drops {{appName}}; locales regenerated by Lingo.dev on every push
twentyhq/twenty60k★gettext .po31Crowdin0Verified · TMS-managedCrowdin auto-pull every 2h; sr invents {dayOrDays}
ente-io/ente30k★JSON (i18next)51Crowdin0Verified · TMS-managedCrowdin bot commits; findings unverified
KRTirtho/spotube49k★Flutter ARB29in repo1Code 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 YAML117in repo0Vendored upstreamhits are in vendored rails-i18n defaults — belongs upstream
usememos/memos64k★JSON44in repo0Scanned · not verified
laurent22/joplin57k★JSON10in repo0Scanned · not verified
RocketChat/Rocket.Chat46k★JSON58in repo0Scanned · not verified
wg-easy/wg-easy27k★JSON25in repo0Scanned · not verified
activepieces/activepieces25k★JSON10in repo?Scanned · not verified
getmaxun/maxun18k★JSON8in repo0Scanned · not verified
ai-shifu/ChatALL16k★JSON9in repo0Scanned · not verified
YishenTu/claudian16k★JSON9in repo0Scanned · not verified
apexcharts/apexcharts.js15k★JSON47in repo0Scanned · not verified
mealie-recipes/mealie14k★JSON41in repo0Scanned · not verified
formbricks/formbricks13k★JSON24in repo0Scanned · not verified
Notsfsssf/pixez-flutter13k★Flutter ARB15in repo0Scanned · not verified
zyronon/TypeWords10k★JSON13in repo0Scanned · not verified
iib0011/omni-tools10k★JSON10in repo?Scanned · not verified
gitalk/gitalk7.2k★JSON10in repo0Scanned · not verified
al1abb/invoify6.4k★JSON17in repo0Scanned · not verified
valhalla/valhalla6.3k★gettext .po34in repo0Scanned · not verified
elk-zone/elk6.0k★JSON42in repo?Scanned · not verified
sdras/cssgridgenerator5.4k★JSON5in repo0Scanned · not verified
nanbingxyz/5ire5.3k★JSON6in repo?Scanned · not verified
deckerst/aves5.3k★Android XML56in repo0Scanned · not verified
dromara/carbon5.2k★JSON33in repo0Scanned · not verified
unovue/inspira-ui5.0k★JSON36in repo0Scanned · not verified
GitJournal/GitJournal4.2k★Flutter ARB21in repo0Scanned · not verified
stringer-rss/stringer4.1k★JSON16in repo0Scanned · not verified
bdlukaa/fluent_ui3.5k★Flutter ARB40in repo0Scanned · not verified
chrisvel/tududi3.4k★JSON24in repo0Scanned · not verified
klembot/twinejs2.9k★JSON22in repo?Scanned · not verified
gamosoft/NoteDiscovery2.8k★JSON11in repo0Scanned · not verified
Apipie/apipie-rails2.5k★JSON12in repo0Scanned · not verified
hoochanlon/Free-NTFS-for-Mac2.4k★JSON4in repo0Scanned · not verified
walterlow/freecut2.2k★JSON8in repo0Scanned · not verified
daodao97/chatmcp2.2k★Flutter ARB3in repo0Scanned · not verified
NatLabRockies/api-umbrella2.2k★gettext .po58in repo?Scanned · not verified
cogwheel0/conduit2.1k★JSON12in repo0Scanned · not verified
fossasia/badgemagic-app2.0k★Flutter ARB23in repo0Scanned · not verified
astrofox-io/astrofox2.0k★JSON8in repo0Scanned · not verified
publify/publify1.9k★JSON17in repo0Scanned · not verified
JHubi1/ollama-app1.8k★Flutter ARB5in repo?Scanned · not verified
CcSimple/vue-plugin-hiprint1.7k★JSON7in repo0Scanned · not verified
shakacode/react-webpack-rails-tutorial1.7k★JSON4in repo0Scanned · not verified
quick123official/quick_redis_blog1.7k★JSON16in repo?Scanned · not verified
thredded/thredded1.6k★JSON9in repo0Scanned · not verified
BrisklyDev/brisk1.5k★Flutter ARB8in repo0Scanned · not verified
xpavle00/Habo1.5k★Flutter ARB26in repo?Scanned · not verified
baotlake/office-website1.4k★JSON51in repo0Scanned · not verified
mubaraknumann/unifideck1.4k★JSON15in repo?Scanned · not verified
okisdev/ChatChat1.3k★JSON12in repo0Scanned · not verified
Blockstream/esplora1.3k★gettext .po17in repo?Scanned · not verified
polychromatic/polychromatic1.2k★gettext .po11in repo0Scanned · not verified
TracksApp/tracks1.2k★JSON11in repo0Scanned · not verified
igorkasyanchuk/active_storage_validations1.2k★JSON16in repo0Scanned · not verified
hrfee/jfa-go1.2k★JSON25in repo?Scanned · not verified
matthiasn/lotti1.2k★Flutter ARB11in repo?Scanned · not verified
Gisto/Gisto1.2k★JSON6in repo0Scanned · not verified
commetchat/commet1.1k★Flutter ARB27in repo0Scanned · not verified
fossasia/magic-epaper-app1.1k★Flutter ARB21in repo0Scanned · not verified
opennookorg/screenshot-studio985★JSON7in repo0Scanned · not verified
ianho7/maptoposter-online938★JSON7in repo?Scanned · not verified
sharatsachin/ytplaylist-len916★JSON26in repo0Scanned · not verified
AQBot-Desktop/AQBot902★JSON10in repo0Scanned · not verified
jamaljsr/polar858★JSON9in repo0Scanned · not verified
GetStream/stream-chat-react844★JSON11in repo?Scanned · not verified
localsend/localsend96k★JSON (slang)57Weblate + PRs0Clean0 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.

Check your own repo

Same check, no API key, no account. Point it at your locale directory:

npx @shipi18n/cli check ./locales

Maintainers: 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.