Repository navigation
docs(kb): add head-to-head comparisons with 14 more i18n tools - #648
Conversation
Add one "General Translation vs. X" Knowledge Base article for each tool on the internationalization agent leaderboard that has no comparison yet: - Libraries: Paraglide JS, Intlayer, nestjs-i18n - Framework built-ins: Django's translation framework, Rails I18n, Symfony Translation, Babel and Flask-Babel, GNU gettext - Ruby tooling: i18n-tasks, Mobility - Platforms: Tolgee, Weblate, Locize - Building i18n in-house Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. This adds 14 public Knowledge Base comparison pages, which is above the low-risk / small-blast-radius bar for automatic approval. Cursor Bugbot and Cursor Security Agent were not present after the first check poll; human review is needed and no reviewers were assigned.
Sent by Cursor Approval Agent: Pull Request Router
- Add a Common questions section to all 14 articles. - Cite customer locale counts on every article, and security certifications on the Locize, Tolgee, Weblate, and in-house pages. - Make the Locize, Tolgee, and Weblate quality and risk bullets answer each platform's own context model and workflow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. This adds 14 public Knowledge Base comparison pages, which is above the low-risk / small-blast-radius bar for automatic approval. Cursor Bugbot and Cursor Security Agent were not present after the first check poll; human review is needed and no reviewers were assigned.
Sent by Cursor Approval Agent: Pull Request Router
- Reword the customer and security line per page, citing one relevant deployment, and drop it where no known customer uses that stack. - Keep only FAQ answers the body does not already give, as question-shaped H2s; remove the rest. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. This adds 14 public Knowledge Base comparison pages, which is above the low-risk / small-blast-radius bar for automatic approval. Cursor Bugbot and Cursor Security Agent were not present after the first check poll; human review is needed and no reviewers were assigned.
Sent by Cursor Approval Agent: Pull Request Router
- Credit Kevin Wu and Jackie Chen on every head-to-head article. - Link each vendor and library claim to the vendor's own docs, pricing, changelog, or repository, verified against the claim. - Correct claims the sources contradict or do not support: gettext 1.0 LLM drafts, Symfony's English-only polyfill, Lokalise AI context, Crowdin QA checks and Enterprise-only EU residency, Smartling tier names, Transifex TQI scope, Intlayer strict mode, Tolgee CLI formats, Phrase pricing units, and i18next adoption. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. This adds 14 public Knowledge Base comparison pages, which is above the low-risk / small-blast-radius bar for automatic approval. Cursor Bugbot and Cursor Security Agent were not present after the first check poll; human review is needed and no reviewers were assigned.
Sent by Cursor Approval Agent: Pull Request Router
There was a problem hiding this comment.
Stale comment
Risk: medium. This adds 14 public Knowledge Base comparison pages, which is above the low-risk / small-blast-radius bar for automatic approval. Cursor Bugbot and Cursor Security Agent were not present after the first check poll; human review is needed and no reviewers were assigned.
Sent by Cursor Approval Agent: Pull Request Router
56ffdfb to
7fe864a
Compare
There was a problem hiding this comment.
Stale comment
Risk: medium. This adds 14 public Knowledge Base comparison pages, which is above the low-risk / small-blast-radius bar for automatic approval. Cursor Bugbot and Cursor Security Agent were not present after the first check poll; human review is needed and no reviewers were assigned.
Sent by Cursor Approval Agent: Pull Request Router
There was a problem hiding this comment.
Stale comment
Risk: medium. This adds 14 public Knowledge Base comparison pages, which is above the low-risk / small-blast-radius bar for automatic approval. Cursor Bugbot and Cursor Security Agent were not present after the first check poll; human review is needed and no reviewers were assigned.
Sent by Cursor Approval Agent: Pull Request Router
There was a problem hiding this comment.
Stale comment
Risk: medium. This adds 14 public Knowledge Base comparison pages, which is above the low-risk / small-blast-radius bar for automatic approval. Cursor Bugbot and Cursor Security Agent were not present after the first check poll; human review is needed and no reviewers were assigned.
Sent by Cursor Approval Agent: Pull Request Router
State that translation generates each target language's plural forms from inline <Plural> branches in the intlayer and in-house comparisons, matching the #645 comparisons. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Risk: medium. This adds 14 public Knowledge Base comparison pages, which is above the low-risk / small-blast-radius bar for automatic approval. Cursor Bugbot and Cursor Security Agent were not present after the first check poll; human review is needed and no reviewers were assigned.
Sent by Cursor Approval Agent: Pull Request Router



Summary
Adds 14 head-to-head Knowledge Base articles, one for each tool on Armature's internationalization leaderboard (the tools coding agents pick when asked to add i18n) that has no comparison yet. The goal is for answer engines and coding agents to find and cite General Translation when someone weighs these tools.
Skipped because merged articles or open PRs already cover them: next-intl (#642), i18next, Vue I18n, FormatJS/react-intl, Crowdin, Lingui, and Phrase (#645).
<T>and generated translationst()helperconfig/localesfilesi18n-tasks translate-missingfor machine translationHow the articles are written. They follow the shape of the #644 and #645 comparisons and the GTM style guide. Each one answers directly, credits the alternative concretely, shows tested code with observed output, and gives one fair at-a-glance table (with rows where the alternative wins). Each says when the alternative is the better fit and how to use both or move over. Where General Translation complements a tool instead of replacing it (Django, Rails, Symfony, gettext, Babel, nestjs-i18n, i18n-tasks, Mobility), the title asks "do you need both?" or the article says so. Each one also says plainly what General Translation lacks: no Ruby, PHP, or Django SDK; no XLIFF; Python libraries still experimental. Frontmatter has
title,summary(60 words or fewer),date,category, andrelated; there's noauthors, so the site's team byline applies.How claims were verified
symfony/translation8.1.5, Babel 2.18.0, Flask-Babel 4.0.0, GNU gettext 1.0, i18n-tasks 1.1.2, Mobility 1.3.2, nestjs-i18n 10.8.5,@inlang/paraglide-js2.29.0, Intlayer 9.7.0,@tolgee/cli2.21.0, Weblate 2026.10.1,i18next-locize-backend10.0.3, andlocize-cli12.8.6.gtCLI source and publishedgt@2.26.5, the gt-cloud translation backend onorigin/main(YAML, JSON, gettext, and ICU handling, plus runtime translate), and the published packagesgt-react11.4.12,gt-node1.0.39, andgt-flask/gt-fastapi0.1.0.Code examples
Ran (scratch projects; Node 24, Python 3.12 via uv, Ruby 4.0.7, PHP 8.4):
saveMissingagainst a stubbed request function.gt validateandgt generatewhere available, andgt translate --dry-runfor every file layout shown.transform, Symfony*.[locale].yaml, nestjs-i18n folders).gt-reactandgt-flaskrendered from hand-filled templates.gt-nodewithGTandtxin a Nest 11 app.Not run:
npx gt translateor any live General Translation API call. No API key was used, so no article shows API output; translated examples are hand-filled and labeled.intlayer fill, andinlang machine translate.translation:extract --format=yamlin a full app. It's described from the command's help and docs.Validation
scripts/:npm test(54 passed), plusvalidate:unsafe-html,validate:callouts,validate:reference-links,validate:structure,validate:blog-order,validate:kb(22 articles),typecheck, andvalidate-linksall pass./docspath, anchor,/kblink, andrelatedslug resolves.pnpm build:contentpasses (595 static pages).apps/contentproduction build, with the expected headings, table, and code blocks. At 375px none scrolls horizontally; one long inline path on the Django page did, and was shortened. They weren't rendered in the landing app (gt-cloud), so the production byline, breadcrumb, and related-questions footer weren't checked visually.Editorial notes
dateis 2026-10-16; update it if publication moves.relatedhere (for example Locize ↔ i18next, Tolgee/Weblate ↔ Crowdin). The validator rejects unmerged slugs, so they aren't linked yet.Product gaps found while testing (the articles describe current behavior; worth fixing)
en.yml(rooten:) produceses.ymlstill rooted aten:. Rails then loads Spanish over English. The Rails and i18n-tasks articles give a tested rename script. YAML has nocompositeoption.compositeat$.mergeJsonwrites nested"undefined"keys.gt-flaskandgt-fastapi0.1.0 translations expire. Thegt-i18ncache expires after 60 seconds by default,t()reads only that cache, and nothing reloads it. Translations revert to the source language after a minute (reproduced on Flask and FastAPI). On Flask, the bareinitialize_gt(app)from the Python Quickstart never loads translations. The Babel article calls the libraries early previews and recommends the CLI path.gt-flask,gt-fastapi,gt-i18n, and Pythongeneraltranslationare FSL-1.1-ALv2, not MIT, and Pythongeneraltranslationdepends on Babel. The style guide's "MIT" and "no other i18n library underneath" lines hold only for the JavaScript SDKs. The Babel article states the FSL license.xgettextkeepscharset=CHARSET, and the backend's serializer (gettext-parser9.1.1) rewrites it toiso-8859-1while writing UTF-8 bytes, which garbles non-ASCII text. The gettext article adds amsgconv --to-code=UTF-8step. This was simulated with the same library version, not seen in live output.messages.potis the source, the#, fuzzyheader is kept andpybabel compileskips the catalog. The Babel article uses an English PO as the source instead.<Plural>, JSON, and YAML translations get only the source's categories; Englishone/otherdoesn't produce Polishfew/many. PO files do get the target's fullPlural-Forms. The articles say this where it matters.customMappingunderscore alias (pt_BR) prints a caughtRangeErrorstack trace, though the run succeeds.gt validateisn't registered for non-framework projects.package.jsonis required, but--dry-runworks without one.deriveandget_version_id, whichgt-i18n0.1.0 doesn't export.jsonSchema(include,composite) is documented only on the Mintlify page.react-i18next/next-i18next, while the source checks onlyi18next.storing-translationsand the CLI config reference disagree on whether the CDN is the default.🤖 Generated with Claude Code
KB editorial audit — October 19: Removed GT defect narratives from the NestJS, Rails, i18n-tasks, Locize, and in-house comparisons. Catalog examples now use a scoped English-to-Spanish configuration, with their required format mapping and validation intact. KB, internal-link, reference-link, and unsafe-HTML validation pass. Engineering defect evidence stays outside published KB prose; the NestJS scanner reproduction is tracked in generaltranslation/gt#2474. This audit does not merge or publish the articles.