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-09-16 · structural checks only, no LLM · one row per repo

64
repos scanned
21
ship a verified broken string
117
broken strings verified by hand
2
fixed upstream so far
RepoLocale formatLocalesTranslations managedVerified brokenStatusWhat was wrong
solidusio/solidus5.3k★Rails YAML33in repo13Fixed · our PR merged →pt-BR: 13 strings dropped %{…}; merged same day, 3 core approvals
nocodb/nocodb65k★JSON (vue-i18n)37Crowdin4Fixed · by maintainer →our issue #14573 → maintainer swept 39 locale files (+300/−300)
ACINQ/phoenix861★Android XML + Apple .xcstrings15in repo7PR open →Android: 5 locales drop %2$s, 2 add a stray %1$s (iOS xcstrings follow-up queued)
hoppscotch/hoppscotch80k★JSON (vue-i18n)33in repo5PR open →af: {naam}→{name}, {team}→{workspace}, hard-coded 10MB → {sizeLimit}
excalidraw/excalidraw132k★JSON (i18next)56Crowdin4PR open →our issue #12097 → contributor fixed es-ES {{mix}} and added a placeholder-parity test suite
AppFlowy-IO/AppFlowy77k★JSON (easy_localization)35in repo3PR open →de-DE: {Name}/{Zeit} translated variable names (cs/pl {}→{count} queued)
KRTirtho/spotube49k★Flutter ARB29in repo1PR open →ko: {error} dropped
mastodon/mastodon50k★JSON (react-intl) + Rails YAML105Crowdin7Issue open →7 invalid ICU strings (de double-brace, ta translated 'other' keyword…) fall back to English
chatwoot/chatwoot37k★JSON (vue-i18n) + Rails YAML52Crowdin1Reported in thread →zh drops {assigneeName}; all-locale pipe-plural collapse (export config) — commented on the open issue
ifmeorg/ifme1.6k★Rails YAML17in repo20Fix ready · not yet filed%{typename} renamed in 5 locales; hi/id/vi/zh translated variable names
24pullrequests/24pullrequests1.7k★Rails YAML16in repo16Fix ready · not yet filed%{contributing_path} link dropped in 14 locales
Kochava-Studios/witsy2.0k★JSON (vue-i18n)8in repo7Fix ready · not yet filedfr/pl/pt translated the variable names ({raccourci}, {uzasadnienie}…)
HemantKArya/BloomeeTunes2.2k★Flutter ARB6in repo6Fix ready · not yet filedde/es drop {title}; ja/ko drop {name}
makeplane/plane59k★JSON (react-i18next)19in repo3Fix ready · not yet filedcs template toasts drop {templateType}/{templateName}
thunder-app/thunder1.0k★Flutter ARB26in repo3Fix ready · not yet filedes/it/sk drop {username}
scambra/devise_invitable2.7k★Rails YAML24in repo2Fix ready · not yet filedzh-HK/zh-TW: %{email) paren typo
Anxcye/anx-reader8.9k★Flutter ARB15in repo1Fix ready · not yet filedzh-TW drops {count}
louislam/uptime-kuma91k★JSON (vue-i18n)75Weblate6Verified · TMS-managedes {aquí}, fr {virgule}… translated variable names; Weblate-managed
immich-app/immich114k★JSON (ICU)79Weblate4Verified · TMS-managed3 invalid ICU + hy {user}; Weblate-managed, deploy-only issue form
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/twenty57k★gettext .po31Crowdin0Verified · TMS-managedCrowdin auto-pull every 2h; sr invents {dayOrDays}
ente-io/ente29k★JSON (i18next)51Crowdin0Verified · TMS-managedCrowdin bot commits; findings unverified
we-promise/sure9.9k★Rails YAML117in repo0Vendored upstreamhits are in vendored rails-i18n defaults — belongs upstream
usememos/memos63k★JSON44in repo0Scanned · not verified
laurent22/joplin56k★JSON10in repo0Scanned · not verified
RocketChat/Rocket.Chat46k★JSON58in repo0Scanned · not verified
activepieces/activepieces24k★JSON10in repo?Scanned · not verified
ai-shifu/ChatALL16k★JSON9in repo0Scanned · not verified
apexcharts/apexcharts.js15k★JSON47in repo0Scanned · not verified
mealie-recipes/mealie13k★JSON41in repo0Scanned · not verified
formbricks/formbricks13k★JSON24in repo0Scanned · not verified
iib0011/omni-tools10k★JSON10in repo?Scanned · not verified
gitalk/gitalk7.2k★JSON10in repo0Scanned · not verified
nanbingxyz/5ire5.3k★JSON6in repo?Scanned · not verified
deckerst/aves5.3k★Android XML56in repo0Scanned · not verified
GitJournal/GitJournal4.2k★Flutter ARB21in repo0Scanned · not verified
stringer-rss/stringer4.1k★JSON16in repo0Scanned · not verified
chrisvel/tududi3.4k★JSON24in repo0Scanned · not verified
bensheldon/good_job3.0k★JSON12in repo0Scanned · not verified
Apipie/apipie-rails2.5k★JSON12in repo0Scanned · not verified
hoochanlon/Free-NTFS-for-Mac2.4k★JSON4in repo0Scanned · not verified
daodao97/chatmcp2.2k★Flutter ARB3in repo0Scanned · 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
thredded/thredded1.6k★JSON9in repo0Scanned · not verified
BrisklyDev/brisk1.5k★Flutter ARB8in repo0Scanned · not verified
baotlake/office-website1.4k★JSON51in repo0Scanned · not verified
okisdev/ChatChat1.3k★JSON12in repo0Scanned · not verified
TracksApp/tracks1.2k★JSON11in repo0Scanned · not verified
igorkasyanchuk/active_storage_validations1.2k★JSON16in repo0Scanned · not verified
matthiasn/lotti1.2k★Flutter ARB11in repo?Scanned · 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
GetStream/stream-chat-react844★JSON11in repo?Scanned · not verified
localsend/localsend92k★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.

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.