Knowledge Base
Answers to common questions about localizing apps, docs, and content with General Translation.
Internationalization
Setting up i18n in a codebase: libraries, frameworks, and components.
- How do I translate a Flask or FastAPI app?Mark user-facing strings, pick each request's locale (usually from Accept-Language), and load that locale's translations. Flask apps usually use Flask-Babel with gettext catalogs, and FastAPI apps wire Babel into a middleware. General Translation's CLI fills those catalogs, and its experimental gt-flask and gt-fastapi SDKs translate inline t() strings without catalogs.
- How do I localize an Android app with strings.xml?Keep every default string in res/values/strings.xml, add a strings.xml for each language under a locale-qualified folder such as values-es or values-b+zh+Hant+TW, and read text with stringResource or getString. Translate by hand, in Play Console, or with General Translation's CLI, which writes each values folder and rebuilds plurals for every target language.
- How do I add i18n to TanStack Start?TanStack Start has no built-in i18n, so you add a library that resolves the locale for each server request, usually from a URL prefix or cookie, and loads messages before render. Paraglide JS, react-i18next, and Lingui render translations you supply; General Translation's experimental gt-tanstack-start also generates them from copy written inline in JSX.
- How do I add i18n to a Next.js Pages Router app?Add an i18n block with locales and defaultLocale to next.config.js, and Next.js serves /es and /fr, redirects visitors by browser language, and passes the locale to getStaticProps and getServerSideProps. A library renders the messages; General Translation's gt-next also generates the translations from copy written inline in JSX.
- How do I translate strings outside JSX?Pass each string that isn't a JSX child, such as a placeholder or a module-scope constant, through a translation function where it renders. General Translation's useGT hook returns that function, and msg with useMessages translates constants defined outside a component.Video
- How do I translate a Vue app?Translating a Vue app means putting each template string behind a lookup for the active language and translating it into every target language. General Translation's gt-vue plugin translates content wrapped in the <T> component, and npx gt translate writes one catalog per target language.Video
- How do I translate a React Native app?Mark the text in your components, generate a translation file for each language, add Intl polyfills, and load the file for the device's language. With General Translation's experimental gt-react-native, you wrap text in <T>, a Babel plugin adds the polyfills, and npx gt translate writes the files.Video
- How do I translate a React app?Translating a React app means internationalizing its components so they render in the user's language, then translating every string into each language you support. General Translation's gt-react translates JSX in place in the <T> component, and npx gt translate writes one file per language.Video
- How do I translate a Node.js app?Detect each request's language, usually from its Accept-Language header, and return every string in that language. General Translation's gt-node binds the locale per request with withGT and translates strings with getGT, from translations that npx gt translate --publish generates before you deploy.Video
- How do I internationalize an app with Cursor or Claude Code?Start with General Translation's Setup for Agents prompt in Cursor or Claude Code, choose a feature and target languages, and have the agent implement and verify the result. Browser sign-in, machine-readable docs, and MCP tools connect setup to translation and review. Use Locadex to automate continuing localization through pull requests.Video
- How do I add i18n to a Next.js App Router app?Start with gt init to configure General Translation in a supported App Router project, then mark source content, generate translations, and verify language switching. gt-next keeps copy in JSX with translation context; the CLI, Dashboard editor, and Locadex handle generation, review, and ongoing updates. This guide also shows the explicit local-file setup.Video
- What is pseudo-localization?Pseudo-localization is a test that swaps your source text for an altered version, accented, padded about 40% longer, and wrapped in brackets, so hardcoded strings, truncation, broken fonts, and concatenated sentences show up before any translation exists. Android ships the en-XA and ar-XB pseudo-locales for it.Video
- Language switcher best practices: UX, SEO, and accessibilityName each language in its own language, such as Deutsch or 日本語, and don't use flags, which represent countries. Link each option to the same page in that language with a crawlable link, remember the choice in a cookie, and never auto-redirect a localized URL.Video
- Internationalization vs. localization (i18n vs. l10n)Internationalization (i18n) is the code and design work that lets one product support many locales, such as formatting dates with Intl and supporting right-to-left text. Localization (l10n) adapts it for one locale, which covers translation plus currency, date formats, units, tone, and legal details.Video
- How should I name i18n translation keys?Name keys by where text appears and what it means, such as checkout.summary.title, not by its English wording. Give each distinct use its own key, even when the English matches: German translates the button Open as Öffnen and the status Open as Offen.Video
- How do I make a website multilingual?Pick where translations live, in a proxy, CMS plugin, site builder, or your own code, then give each language its own URL, as Google recommends. Translate full pages plus titles and meta descriptions, link the versions with hreflang, and offer a language switcher instead of auto-redirecting visitors.Video
- How do I localize an iOS app with String Catalogs?Add your languages in Xcode, write user-facing text with localizable APIs such as SwiftUI Text and String(localized:), and build so Xcode collects those strings into a String Catalog (.xcstrings). Translate in Xcode, through XLIFF, or with General Translation's CLI when catalogs should update with releases and share terminology with your website and Android app.Video
- How do I find hardcoded strings that aren't translated?Run a linter that flags user-facing string literals in CI, such as eslint-plugin-i18next's no-literal-string rule for JSX, Android Lint's HardcodedText check, or erb_lint's HardCodedString linter for Rails. Then click through the app in a pseudo-locale to catch text that static checks can't trace.Video
- How do I detect a user's browser language?Read the browser's ordered language list, navigator.languages in JavaScript or the Accept-Language header on the server, sorted by q-value, and match it to your supported locales with a fallback. Safari and Chrome incognito report only one language, and IP geolocation reveals location, not language.Video
- Should you build your own i18n or use General Translation?Hand-rolled i18n (a dictionary per language and a small t() helper) is fine for one or two languages and a little copy. As an app grows, you rebuild plural rules, fallbacks, and file syncing, and you still need to produce translations. General Translation's open-source libraries handle rendering, and General Translation generates and updates translations from your code.Video
- react-intl alternatives: General Translation vs. react-intlGeneral Translation lets React teams keep ICU message syntax while adding translation generation, shared terminology, and Dashboard review. react-intl supplies formatting and FormatJS catalog tooling; General Translation produces the translations too.Video
- Localization testing checklist for multilingual appsTest nine things in every supported locale on a production build: whole journeys including error states and emails, language switching, plurals, currency and time zones, text expansion, right-to-left layout, accessibility, translation delivery, and crawlable language URLs. Give each check an explicit pass condition.Video
- i18next alternatives: General Translation vs. i18nextChoose General Translation to keep copy inline in React components and generate translations with its JSX structure and product context. You can also keep i18next and use General Translation to translate existing catalogs. i18next supplies message rendering and plural selection; translation generation comes from a separate service.Video
- General Translation vs. vue-i18n: which should you use?General Translation lets Vue teams write source copy directly in templates and generate translations with the CLI. Its gt-vue plugin renders that content with locale-aware plural and number formatting. Choose it to remove keyed source-file maintenance; vue-i18n remains a fit for teams using Nuxt's i18n module and an established catalog workflow.Video
- General Translation vs. Symfony Translation: which should you use?Symfony Translation renders messages in PHP and Twig. General Translation translates its YAML catalogs in CI, keeps them current as your source changes, and gives reviewers a Dashboard to edit them. Keep Symfony's rendering and add automated translation to your release workflow.Video
- General Translation vs. Rails I18n: do you need both?Rails I18n looks up messages and formats dates and numbers. General Translation produces the translations, keeps them current as your English changes, and gives your team a Dashboard for review. Use both to ship translated Rails catalogs with each release.Video
- General Translation vs. Paraglide JS: which should you use?Choose General Translation to keep copy inline and generate translations with the structure of your React components, shared terminology, and Dashboard review. Choose Paraglide JS for compiled, typed message functions and per-message tree-shaking. Paraglide renders your catalogs; General Translation connects source copy to translation generation and ongoing updates.Video
- General Translation vs. nestjs-i18n: which should you use?nestjs-i18n resolves each request's language in a NestJS app and renders messages from per-language JSON or YAML catalogs, but it doesn't translate anything. General Translation's CLI translates those catalogs, and its gt-node library translates content that only exists at run time, so you can keep nestjs-i18n and add General Translation.Video
- General Translation vs. Mobility: which should you use?Mobility stores translated model attributes in your database. General Translation produces those translations through its API, using your Glossary and Custom Prompts. Use both to translate product listings, posts, and other database content while keeping your Rails models.Video
- General Translation vs. Lingui: which should you use?Choose General Translation to keep copy inline like Lingui and generate the translations with your JSX structure as context. Lingui extracts inline messages into catalogs for your translators or a connected service to translate. General Translation's CLI updates translations as your code changes, and your team reviews them in the Dashboard.Video
- General Translation vs. Intlayer: which should you use?Intlayer keeps each component's content in a typed declaration file next to it, with every language written side by side, and can fill missing languages with an AI provider you configure. General Translation keeps copy inline in your components in one language and generates the other languages with the context of your code.Video
- General Translation vs. i18next, react-intl, and next-intl: which i18n library should you use?Open-source libraries such as i18next, react-intl, and next-intl don't translate anything. They display translations you supply in a catalog file for each language, written by you, your translators, or a separate service. General Translation's libraries are open source too and do the same job, and General Translation also does the translating, with your code as context.Video
- General Translation vs. GNU gettext: do you need both?Keep GNU gettext for extraction and rendering, and add General Translation to generate and maintain the PO files. General Translation carries translator notes and message context into generation, applies shared terminology, and gives reviewers a Dashboard editor. Your existing gettext calls and compiled catalogs stay in place.Video
- General Translation vs. Django's translation framework: do you need both?Use Django's translation framework and General Translation together. Django handles message extraction, language selection, and rendering. General Translation fills its PO files, including plural forms, with your product terminology and Dashboard review. Your templates and URL patterns stay the same while translations update with your code.Video
- General Translation vs. Babel and Flask-Babel: which should you use?Babel formats dates, numbers, and currencies for any locale and manages gettext catalogs, and Flask-Babel connects it to Flask, but neither translates your strings. General Translation's CLI fills in Babel's PO files for every language, plural forms included, so you can keep Flask-Babel and stop translating catalogs by hand.Video
- Can I do i18n without translation files?Yes. General Translation's gt-react and gt-next libraries do React and Next.js i18n with no translation keys and no JSON file per language to maintain. Copy stays inline in JSX inside the <T> component, and the gt translate command generates each language's translations in your build, with context from your code. Locadex can keep them current through pull requests.Video
- How do I translate conditional text in JSX?Keep the sentence whole and translate every version of it, because a ternary splits it into fragments that lose their meaning and their place in each language's word order. General Translation does this with <Branch> inside <T>, which translates the sentence as one unit.Video
Locale Formatting
Plurals, dates, numbers, currencies, and right-to-left text in every locale.
- What are locale codes, such as en-US and en-GB?A locale code identifies a language and, when it matters, its script and region, such as en-US for English in the United States or zh-Hant-TW for Traditional Chinese in Taiwan. Most software uses BCP 47 tags built from ISO codes. General Translation uses BCP 47 codes for the source and target locales in gt.config.json.
- How do I format numbers, dates, and currencies for each locale?Format each value when the page renders, with the reader's locale and JavaScript's Intl API, and keep it out of the translated sentence. General Translation's <Num>, <Currency>, <DateTime>, and <RelativeTime> components do both inside a <T>, so one translation serves every value.Video
- What is ICU message format?ICU message format is a syntax for one translatable string that holds variables, plurals, select choices, and ordinals, such as {count, plural, one {# file} other {# files}}. Each language keeps the CLDR plural categories it needs: English uses one and other, while Polish adds few and many.Video
- How do I support RTL (right-to-left) languages in CSS?Put dir="rtl" and lang on the html element, because lang alone doesn't change direction, then replace physical CSS such as margin-left with logical properties such as margin-inline-start. Flex rows, grid columns, and default text alignment flip on their own; translateX(), left, and right don't.Video
- How do I handle plurals in React?Handle plurals in React by giving each language one sentence per plural form and picking it with that language's plural rules, since English has 2 forms, Russian has 4, and Arabic has 6. General Translation's <Plural> component in gt-react and gt-next takes your source forms, and General Translation generates the forms each target language needs.Video
Translation
Machine and AI translation, quality, context, and glossaries.
- What is translation memory, and do you still need it with AI?Translation memory (TM) is a database of earlier source and target segment pairs that a translation tool searches for exact, in-context, and fuzzy matches. With AI, you still want approved wording reused and past translations available as context. General Translation reuses matching translations from earlier file versions and keeps team edits, without a separate TM to maintain.
- How do I translate YAML locale files?Translate only the string values and keep keys, placeholders such as %{name} or {{name}}, and anchors as they are. Quote values that contain a colon or start with % or {, set each file's locale root or filename, and add the plural keys the target language needs. General Translation's CLI translates YAML values in place and leaves keys alone.
- How do I translate PO and POT files?Fill every msgstr, including each plural form the Plural-Forms header asks for, and keep msgid, msgctxt, and placeholders unchanged. Run msgfmt --check for headers, plural counts, and placeholders on entries with a format flag, and check separately that no msgstr is empty. General Translation's CLI writes a translated PO file for each language from your POT template.
- How do I translate Lottie animations?Translate the strings in the animation's text layers, stored in the Lottie JSON at t.d.k[].s.t, then check that each translation fits its box, fonts cover the new script, and no text was exported as shapes. Re-export per language, swap text at run time, or script the JSON; General Translation's CLI translates dotLottie 1.0 .lottie files and refits the layout.
- How do I translate .resx files in a .NET app?Create a culture-named copy of each neutral .resx file, such as Resources.fr.resx, and translate only each entry's value, keeping names, comments, and placeholders such as {0} unchanged. .NET builds each culture into a satellite assembly and falls back from fr-CA to fr to the neutral file. General Translation's CLI writes those culture files from the neutral source.
- How do I keep terminology consistent in AI translation?Keep one glossary of approved terms, including names that stay untranslated, apply it to every translation request, keep variables and code out of translation, and review the result. General Translation does this with Context Groups, whose Glossary and Custom Prompts apply to every project you assign them to, plus the Var component for values that are never translated.
- DeepL alternatives: General Translation vs. DeepLDeepL is a machine translation API, so it returns a translation for each text or document you send it. General Translation is a localization platform. It adds what an API leaves to you: context from your code and your team, consistent terms across every surface, review in a Dashboard, and continuous translation with each release.
- Best AI translation tools for developers: APIs vs. localization platformsUse a translation API when you already own the localization pipeline. Use General Translation when you want context, consistency checks, review, and continuous delivery managed together. DeepL, Google Cloud Translation, OpenAI, and Claude can power a production pipeline; General Translation provides one for your app, docs, and site.
- How do I translate Google Slides?Copy the deck once per language, replace the text in every text box, table cell, and speaker note, and resize text that overflows. General Translation's Google Drive integration writes each language to its own copy next to the source and runs a formatting pass to fit the new text to each slide.Video
- How do I review and edit translations?Compare each translation with its source and the other locales, and fix what reads wrong. With General Translation, you edit translations on the Dashboard's Translations page and track review with labels and comments, and the next translation run by Locadex, its AI agent, brings the edits into a pull request.Video
- Is AI translation accurate enough for a production app?Often, for widely spoken languages, but only after it passes evaluation on your own languages, UI strings, and higher-risk content. In WMT25, Gemini 2.5 Pro matched or beat human reference translations in 10 of 16 language pairs, yet a document benchmark doesn't show whether short interface strings are ready to ship.Video
- How do I translate SRT subtitles without breaking timing?Translate only the cue text in an SRT file; keep cue numbers, timecodes, blank-line separators, and formatting tags as in the source. Then check line length and reading speed against your destination's requirements: Netflix's English guide, for example, allows 42 characters per line and 20 characters per second for adult programs.Video
- How do I translate Markdown and MDX without breaking syntax?Translate prose, image alt text, frontmatter titles and descriptions, and display-text component props. Keep code blocks, inline code, imports, JSX component names, frontmatter keys, and link URLs unchanged unless a locale mapping rewrites them. Quote translated YAML values, then run your site's build.Video
- How do I translate i18n JSON files?Translate only the string values in a JSON locale file. Keep nonplural keys, placeholders such as {{name}}, and tags unchanged, but expect plural keys to differ by language: Polish needs inbox_few and inbox_many. Use a format-aware tool or API, then parse and validate the output before review.Video
- Google Translate alternatives: General Translation vs. Google TranslateGoogle Translate is a quick way to translate one-off text, but shipping a product in another language also needs each string translated in context, consistent terms, correct variables and plurals, review, and a release process. General Translation understands each string's context in your code and automates the whole localization workflow, from code to review to every release.Video
Multilingual SEO
Locale routing, hreflang, sitemaps, and translated metadata for multilingual sites.
- How do I translate SEO titles and meta descriptions?Write each language version's title and meta description in that language, using the words that market searches for, which often differ from a literal translation. Then localize the tags around them, including Open Graph, canonical, hreflang, html lang, and structured data. General Translation's gt-next translates titles and descriptions inside generateMetadata with getGT.
- How do I create a sitemap for a multilingual website?List every language version of each page as its own url entry. If the sitemap carries your hreflang, give each entry xhtml:link alternates for every version, including itself, plus an optional x-default, and split files at 50,000 URLs or 50MB. General Translation's gt-next gives each locale its own URL for the sitemap to list.
- What is hreflang, and how do I set it up?Hreflang tells Google which URLs are language or regional versions of the same page, so it can show the right one in search results. Add it with HTML link tags, HTTP Link headers, or a sitemap, make every link reciprocal, and use valid codes such as en-GB, not en-UK.Video
- Subdirectory vs. subdomain vs. ccTLD for multilingual SEOUse subdirectories such as example.com/de/ when one product shares a site and release process. Only a ccTLD signals a country, subdomains allow separate hosting, Google discourages ?lang= parameters, and it treats vanity domains such as .io and .ai as generic.Video
- Language redirects and SEO: URL, cookie, or Accept-Language?Let the URL decide the language of every page you want indexed, because Googlebot sends no Accept-Language header and crawls mostly from US addresses. Use a saved cookie choice, then Accept-Language, only to pick where a neutral root such as / redirects, with a temporary 302 or 307.Video
- How do I set up SEO for a multilingual Next.js app?Give each language its own prefixed URL, such as /en/about and /es/about, then publish html lang, a self-referencing canonical, hreflang alternates with x-default, a translated title and description, and a sitemap entry for each published language. Mark unpublished versions noindex. General Translation's gt-next routes each language to its own URL and translates titles with getGT.Video
Workflow Tools
Choosing localization tools and keeping translations in sync with continuous localization.
- Weglot alternatives: General Translation vs. WeglotWeglot is a website translation service that translates rendered pages through plugins, a snippet, or a proxy, and Weglot 2.0 adds JSON translation workflows in GitHub. General Translation is a localization platform that combines source-code internationalization, file translation, shared context, Dashboard review, and locale routing.
- How do I translate content in Payload CMS?Add localization to your Payload config and set localized true on each field; Payload then stores one value per locale but doesn't fill them. General Translation's gt-payload plugin adds a Translate button that writes each target locale, as a draft when drafts are enabled and directly otherwise. It never publishes.
- General Translation vs. Lingo.dev: which should you use?Lingo.dev is built around configurable translation engines, with CLI, React, and GitHub tools to reach them. General Translation is a localization platform: libraries, code context, shared terminology, Dashboard review on every plan, and Locadex, which also internationalizes your code. Choose Lingo.dev for model control per language pair.
- What does the Locadex agent do?Locadex is General Translation's AI agent which internationalizes your code and translates your content in your GitHub repository. Its automations run when a pull request is opened, when a commit is pushed, or when you start one, and every change arrives as a pull request.Video
- How do I translate content in Storyblok?In Storyblok, add your target languages to the space and give each translatable field a value per language. General Translation's Storyblok integration fills those values from the Dashboard with Sync and apply, as drafts you review and publish in Storyblok.Video
- How do I translate content in Sanity?Store each language as its own document or as a value per locale in each field, then translate the source into every target locale. General Translation's gt-sanity plugin adds a Translate action to Sanity Studio and, by default, imports each translation as a draft you review and publish.Video
- How do I translate a Mintlify docs site?Write a translated copy of every page in a folder per language and add each language to the docs.json navigation. General Translation's AI agent, Locadex, opens a pull request that adds the translated pages and per-language navigation, then translates later changes.Video
- How do I keep translations up to date on every deploy?Run translation as a pipeline step before each production build, so new copy ships translated with the deploy that adds it. General Translation's gt CLI does this with npx gt translate, using a project API key and project ID stored as CI secrets.Video
- What is a translation management system (TMS)?A translation management system (TMS) is software that stores your source content and its translations and runs the translation workflow: translation memory, glossaries, review, machine translation, and integrations. Its translation memory reuses earlier translations by exact or fuzzy match. Crowdin, Lokalise, Phrase, Smartling, and Transifex are common examples.Video
- What's the best i18n library for a React app?The four main React i18n libraries are General Translation's gt-react, react-i18next, Lingui, and React Intl. All four render and format translations, but only gt-react also generates them, from copy written inline in your JSX. Choose react-i18next to keep i18next catalogs and plugins, Lingui for extraction to compiled catalogs, and React Intl for FormatJS and ICU MessageFormat.Video
- Transifex alternatives: General Translation vs. TransifexChoose General Translation to translate marked JSX with its structure and developer context, then bundle the results or serve them from its CDN. Transifex Native also keeps strings in code, but publishes them through its content delivery service. Transifex is a strong fit for teams using its translation partners, quality scores, or snippet-based website translation.Video
- Smartling alternatives: General Translation vs. SmartlingChoose General Translation when you want app translations generated from code as part of your release. Smartling combines a translation management system, AI and human services, and a website translation proxy. General Translation keeps copy in your components, carries its context into translation, and gives your team a Dashboard for review.Video
- Phrase alternatives: General Translation vs. PhraseGeneral Translation is a strong Phrase Strings alternative when your app and documentation ship together. It generates translations from code and content files, applies shared terminology, and runs in your release workflow. Phrase combines software localization with a document-focused TMS, vendor management, and a broad choice of translation engines.Video
- next-intl alternatives: gt-next vs. next-intlnext-intl renders translations you supply in a message catalog for each language. gt-next renders translations too, and General Translation also generates them from copy written inline in your JSX. Both are MIT-licensed and support the App Router and Server Components. If your next-intl catalogs already work, you can keep them and use General Translation to translate them without migrating.Video
- Lokalise alternatives: General Translation vs. LokaliseGeneral Translation is a strong Lokalise alternative for teams that want readable copy in JSX and translation built into development. Lokalise is built around shared keys, design-tool integrations, and mobile over-the-air delivery. General Translation generates translations from the app's marked content and supports review in its Dashboard or in GitHub pull requests.Video
- General Translation vs. Weblate: which should you use?Weblate is a self-hostable, Git-based localization platform built for translating repository files with a community or team. General Translation integrates translation generation into development and releases, using marked JSX and shared product context. Keep your gettext files or adopt inline authoring to remove source-catalog maintenance too.Video
- General Translation vs. Tolgee: which should you use?Tolgee combines keyed messages, in-context editing, and AI translation in a self-hostable platform. General Translation keeps readable copy directly in your components and generates translations from the marked JSX, so you can ship new copy in every language without maintaining message keys.Video
- General Translation vs. Locize: which should you use?Locize is a translation management system from the creators of i18next that delivers translations from a CDN, collects new keys from your running app, and adds AI translation and an in-context editor. You still maintain the i18n library and its keys. General Translation can be your i18n library and translate it, or translate the i18next files you already have.Video
- General Translation vs. i18n-tasks: which should you use?i18n-tasks is a Ruby gem that finds missing and unused Rails I18n keys, tidies locale files, and can fill missing keys through Google Translate, DeepL, OpenAI, Yandex, or watsonx. General Translation translates whole locale files with your Glossary, Custom Prompts, and Dashboard review. They do different jobs, and many teams can use both.Video
- General Translation vs. a TMS (Crowdin, Lokalise, Phrase)Choose General Translation when developers want translation generation, code-derived context, and review connected to product releases. Keep your existing catalogs and rendering library, or author inline JSX without translation keys. A TMS fits programs centered on language vendors, CAT editors, and XLIFF exchange; its integrations can automate the file transfers.Video
- Crowdin alternatives: General Translation vs. CrowdinChoose General Translation to keep copy in your components and generate translations with your build. Crowdin manages translation projects around resource files, translators, and review workflows, which engineers connect to the app and maintain as the product changes. Crowdin remains a strong fit for open-source community translation and vendor-led programs.Video
- What is the best localization software for developers?The best localization software for developers translates content where it is written in the code, with context from your product, and keeps every language current. General Translation does this with open-source libraries, Context Groups, and Locadex, an AI agent which opens pull requests.Video