FormatJS CLI localization gives React and JavaScript teams a repeatable way to extract translatable messages from application source, compile ICU messages, and check the translation catalogs before they reach users. This guide explains the working relationship between formatjs extract, formatjs compile, formatjs compile-folder, and formatjs verify, with examples of the errors each stage can and cannot detect.
People searching for a FormatJS CLI extraction tutorial often have a practical problem: strings have been added to a React component, a translator has edited a locale file, and the build passes without proving that the finished sentence is understandable. The solution is to connect message ownership, explicit descriptions, stable IDs, ICU syntax, structural verification and human review into one release process.
This world-facing guide covers source discovery, the @formatjs/cli package, React Intl message descriptors, plural and select logic, catalog compilation, format adapters, Unicode quality checks, continuous integration, accessibility and production rollback. It distinguishes command-line validation from linguistic approval so teams can ship multilingual interfaces without assuming that a successful command means an accurate translation.
- Extract source descriptors with
formatjs extractrather than copying UI text into spreadsheets by hand. - Compile translated catalogs with
formatjs compileorcompile-folderand preserve the runtime message format. - Use
formatjs verifyfor missing keys, extra keys and compatible ICU message structures; it does not decide whether words are well translated. - Keep dynamic placeholders, plural categories, rich-text tags and accessibility labels under separate review.
- Rebuild, render and test target-language interfaces before accepting a release.
What the workflow does and what it cannot prove
The main distinction is between controlled technical transformation and meaningful communication. FormatJS CLI can perform documented file operations, but a multilingual product also needs correct intent, reviewable context, accessible design, stable release provenance and human acceptance. A tool can pass all of its own checks while a user still misunderstands a payment, safety warning or irreversible action. The objective is not more files; it is an interface that people can understand and use in the language they selected.
A practical reading order is to understand the source messages first, establish the command-line inputs and outputs, inspect the target catalogs, run structural validation, render the result and finally verify the complete user journey. For a small project, these stages can be completed by a few people; in a large organization, they should have documented handoffs. Either way, every transition needs evidence that the correct version moved forward.
Define the task before opening a terminal
FormatJS is a toolchain around internationalized messages, not an automatic bilingual author. Extraction finds message descriptors in recognized source patterns; compilation produces runtime resources; verification compares catalogs. The three responsibilities should have different owners and acceptance tests.
Take a settings screen with an account name, invoice count and cancel button. Its copy contains variable data, fixed commands and context-sensitive labels. Record those message classes before choosing a catalog format.
Common failure and why it matters
A team may extract every visible string yet leave untranslated alt text, notifications or validation errors. A large catalog is evidence of collection, not evidence of coverage.
Practical verification
List every interface surface and identify how its messages enter the source catalog; compare that inventory with routes, dialogs and API-driven error states before shipping.
A useful review exercise at this stage is to take a real feature that depends on define the task before opening a terminal, compare the source intent with the target-language experience, and record an observable pass-or-fail result. Ask what the user would conclude before and after clicking the relevant control. Preserve the smallest reliable test as a fixture for future releases. This connects language quality with actual product behavior rather than treating a successful command as the final definition of correctness.
Install and pin the command-line dependency
Install @formatjs/cli as a development dependency and keep the chosen version in the lockfile. A documented package.json script is easier for teammates to reproduce than a one-off global binary whose behavior can drift.
A project can expose scripts such as "extract": "formatjs extract" and "compile": "formatjs compile", then pass file arguments through its package manager. Record the node and package-manager environment too.
Common failure and why it matters
Different developer machines may install different optional native packages or resolve incompatible transitive versions. Successful extraction on one machine does not automatically prove compilation will work in CI.
Practical verification
Run the exact documented commands in a clean checkout and record both the package lock and the relevant runtime versions in the release notes.
Understand what extraction recognizes
The documented extraction path supports recognizable descriptors such as defineMessage, defineMessages, FormattedMessage and intl.formatMessage. Dynamic code that constructs arbitrary strings at runtime is not necessarily discoverable by static extraction.
Compare a literal descriptor such as defaultMessage: 'Welcome, {name}!' with a string built from a user-supplied key. The first provides extractable context; the second needs an explicit localization design.
Common failure and why it matters
If a developer assembles a message by concatenating translated fragments, the extractor may see pieces rather than the grammatical sentence. The target language may require another word order altogether.
Practical verification
Require developers to add complete message descriptors for new product copy, and review the extraction diff whenever source components change.
Choose clear IDs and message descriptions
An ID links a source phrase to its translations, while the description explains the intended meaning. Stable IDs ease continuity; descriptive metadata prevents a translator from mistaking ‘Open’ as an adjective when it is a button command.
For a destructive action, the description can explain that ‘Remove’ deletes an attached payment method rather than merely hides a panel. Keep that decision near the message descriptor.
Common failure and why it matters
A hash-generated ID can change when copy changes; a manually chosen ID can remain stable while meaning has changed. Neither strategy removes the need to assess old translations.
Practical verification
Check whether reused IDs retain exactly the same meaning and whether new or changed messages carry enough context for independent human translation.
A useful review exercise at this stage is to take a real feature that depends on choose clear ids and message descriptions, compare the source intent with the target-language experience, and record an observable pass-or-fail result. Ask what the user would conclude before and after clicking the relevant control. Preserve the smallest reliable test as a fixture for future releases. This connects language quality with actual product behavior rather than treating a successful command as the final definition of correctness.
Separate source locale and target locales
A source catalog is an editorial reference, not a guarantee that every target has been approved. The translator needs the current source message, context, version and applicable variables; developers need a way to track missing target entries.
In a project with English source and French and Japanese targets, keep locale files distinct and establish what happens when one translation remains unavailable. An explicit fallback policy prevents silent surprises.
Common failure and why it matters
Copying the English source into every target key can satisfy key-completeness checks while hiding the fact that no translation occurred. A catalog can be syntactically complete and linguistically empty.
Practical verification
Compare target strings with the source, track actual review state outside the compiler, and test whether fallback behavior is understandable when target work is incomplete.
Run a controlled source extraction
A common starting command is formatjs extract "src/**/*.{ts,tsx}" --out-file messages.json. The quoted glob is a deliberate input boundary: it should match the intended source files, not generated builds, vendored packages or irrelevant test fixtures.
Begin with one representative feature directory, inspect the output, and then expand to the full application. Check message counts and investigate substantial changes instead of assuming the new count is always better.
Common failure and why it matters
A misspelled glob, moved source directory or newly introduced file extension can quietly shrink catalog coverage. Generated files can inflate it with irrelevant copies.
Practical verification
Inspect the set of extracted IDs and their source locations against a previous reviewed extraction, recording any removals as intentional changes.
Account for JavaScript and TypeScript patterns
Static extraction works best when message descriptors remain statically visible. TypeScript wrappers, assertions and component helpers are supported in documented scenarios, but custom abstractions can obscure what should be translated.
A team can compare a FormattedMessage usage and a utility wrapper in the same feature. When only one is discovered, change the coding pattern rather than fabricating catalog entries after extraction.
Common failure and why it matters
Refactors can change syntax without changing visible product copy; conversely, a successful typecheck can coexist with missing translation descriptors. Tool success and product coverage are different facts.
Practical verification
Test new helper abstractions with a small extraction fixture before applying them across hundreds of components.
A useful review exercise at this stage is to take a real feature that depends on account for javascript and typescript patterns, compare the source intent with the target-language experience, and record an observable pass-or-fail result. Ask what the user would conclude before and after clicking the relevant control. Preserve the smallest reliable test as a fixture for future releases. This connects language quality with actual product behavior rather than treating a successful command as the final definition of correctness.
Keep sentences whole, not assembled from fragments
Languages differ in word order, agreement and the location of punctuation. A string such as ‘You have’ plus a number plus ‘items’ is not equivalent to a single localized message that gives the translator access to the whole sentence.
Write a full ICU message such as {count, plural, one {# item} other {# items}} and allow the target locale to use appropriate plural categories and wording.
Common failure and why it matters
The source language’s singular/plural split does not describe every language’s grammar. A translator may need additional categories, different nouns or a different sentence structure.
Practical verification
Ask reviewers to test counts such as zero, one, two, several and large numbers in each locale, not just one screenshot with the number three.
Protect ICU placeholder identity
Interpolated variables connect localization resources to application data. A translated message must preserve the required argument names and valid ICU syntax, even when visible word order changes.
If the source is Delete {filename}?, a translated message may move the file name to the beginning but must still reference filename. Test with an accented and a long file name.
Common failure and why it matters
A translator may accidentally rename {filename} to {file}, remove braces or treat an ICU symbol as ordinary punctuation. A visually plausible sentence can then fail at runtime.
Practical verification
Use structural validation and render the message with realistic argument values; preserve the same data contract across source and target catalogs.
Distinguish plural from select decisions
ICU plural rules select quantity-sensitive forms; select expressions choose variants such as a status or category. They solve different problems and need the right runtime argument type and fallback branches.
For a shipping notice, a quantity may determine an item phrase while a delivery state chooses between dispatched and delayed. Model the two decisions explicitly instead of forcing both into English grammar.
Common failure and why it matters
Inventing a one-to-one plural category mapping across languages is unsafe. Using a select key that the application never supplies also leaves unreachable or broken branches.
Practical verification
Exercise representative branches and confirm that every required argument supplies a valid value, with an appropriate other fallback where the syntax requires it.
A useful review exercise at this stage is to take a real feature that depends on distinguish plural from select decisions, compare the source intent with the target-language experience, and record an observable pass-or-fail result. Ask what the user would conclude before and after clicking the relevant control. Preserve the smallest reliable test as a fixture for future releases. This connects language quality with actual product behavior rather than treating a successful command as the final definition of correctness.
Review rich text and tags as structure
React Intl messages can include rich-text placeholders or elements. Translators need freedom to reposition surrounding words without losing the intended element boundaries, label meaning or interactive purpose.
A sentence containing a link to a privacy policy should keep the link associated with the right visible words in every language. Review the rendered accessible name as well as the underlying markup.
Common failure and why it matters
A locale may preserve syntactically valid tags yet attach the link to the wrong action. This is a product comprehension failure rather than a compiler error.
Practical verification
Check the final DOM, keyboard path, screen-reader label and link destination in at least one realistic flow per target language.
Choose a consistent formatter boundary
FormatJS supports built-in formatter choices for several localization-platform shapes. Extraction and compilation formats must agree, and the selected exchange format should be reviewed as part of the source-to-target contract.
If a translation vendor exports a structured JSON dialect, document which formatter is used and retain a sample fixture for a single plural, a placeholder, and a descriptive message.
Common failure and why it matters
Changing a vendor format without updating compilation can produce empty or malformed runtime catalogs. A valid JSON document can still have the wrong semantic shape.
Practical verification
Compile a miniature representative fixture before processing a complete locale set; verify the resulting keys and rendered values, not just JSON validity.
Understand compiler output versus translation quality
The documented formatjs compile stage transforms extracted or translated resources into a form usable by React Intl and validates ICU syntax. Compilation does not assess cultural appropriateness, clarity or whether the source instruction is legally appropriate.
A warning message can compile successfully while saying ‘Continue’ when the user is actually deleting a record. The grammar may be perfect; the action label is still harmful.
Common failure and why it matters
Teams that equate green build status with approved language stop reviewing high-risk copy. A missing reviewer sign-off can become a release defect despite a clean pipeline.
Practical verification
Make compiler success one release gate and human task-based language approval another; both must pass for the target locale to be considered production-ready.
A useful review exercise at this stage is to take a real feature that depends on understand compiler output versus translation quality, compare the source intent with the target-language experience, and record an observable pass-or-fail result. Ask what the user would conclude before and after clicking the relevant control. Preserve the smallest reliable test as a fixture for future releases. This connects language quality with actual product behavior rather than treating a successful command as the final definition of correctness.
Use folder compilation deliberately
The compile-folder workflow batch-compiles locale files from a consistent folder convention. This is useful when languages increase, but it also makes an incorrect filename or unreviewed artifact easy to distribute widely.
Keep source inputs and generated outputs in named directories. For each locale, compare the input file’s version and message count with the output artifact included in the package.
Common failure and why it matters
A stale compiled file can survive when an expected locale is not rebuilt, particularly when a cache or deployment job copies an old directory.
Practical verification
Perform clean builds, retain a manifest of expected locale outputs, and fail deployment when a required locale artifact is missing.
Use verification for missing and extra keys
The formatjs verify command can compare target catalogs against a source locale. The documented --missing-keys and --extra-keys checks detect key-set differences, not semantic mistranslation.
Use a source file such as lang/en.json alongside target files, then run a documented verification command with --source-locale en. Decide whether optional locales may have approved gaps.
Common failure and why it matters
A missing key may trigger fallback and escape attention; an extra key may represent retired source copy that should no longer be shipped or may reflect a deliberate migration.
Practical verification
Record whether each discrepancy is newly introduced, intentionally retired, or scheduled for completion, rather than clearing errors by adding meaningless placeholders.
Check structural equality where appropriate
The documented --structural-equality option inspects message structure so required argument relationships survive localization. It is particularly valuable for dynamic ICU expressions that render differently across locales.
Validate a translation with a named amount variable and a nested choice. The reviewer can adjust word order, but cannot delete the variable that connects the text to the actual amount.
Common failure and why it matters
A translator may replace ICU markup with a static phrase or omit a variable in a hard-to-see branch. The string may look acceptable when previewed with only one data value.
Practical verification
Run structural verification, then use runtime fixtures for each branching case so syntactic validity and actual behavior are both tested.
A useful review exercise at this stage is to take a real feature that depends on check structural equality where appropriate, compare the source intent with the target-language experience, and record an observable pass-or-fail result. Ask what the user would conclude before and after clicking the relevant control. Preserve the smallest reliable test as a fixture for future releases. This connects language quality with actual product behavior rather than treating a successful command as the final definition of correctness.
Know the limits of syntax modes
Recent FormatJS documentation describes syntax-aware verification for ICU, Java-style printf and Apple-style printf resources. These checks have different accepted source formats and different rules; they are not interchangeable.
A Java format string using indexed percent substitutions should be validated as such, not treated as an ICU message containing braces. Document the syntax used by each artifact.
Common failure and why it matters
Trying to validate Android XML directly through a JSON-oriented input mode, or feeding legacy Apple files to the .xcstrings path, can produce misleading failures or unsupported-input errors.
Practical verification
Use a converter or the supported catalog shape explicitly, and keep the original file’s formatting flags, variable types and provenance when preparing verification inputs.
Prepare for native binding failures
Current FormatJS documentation notes native Rust dependencies for npm compilation workflows and no JavaScript compilation fallback in affected paths. A CI environment must include the compatible optional package for its operating system and architecture.
Test compilation on the same OS and architecture used by deployment workers; distinguish the extraction step from the native compilation step when triaging a failure.
Common failure and why it matters
A package manager that suppresses optional dependencies can leave extraction operational while compilation fails. Repeatedly rewriting messages will not repair an unavailable native module.
Practical verification
Inspect installation logs, supported platform documentation and lockfile behavior before changing source content; prove a clean compilation in the target environment.
Make CI errors interpretable
An effective pipeline reports which phase failed: discovery, extraction diff, catalog compatibility, compilation, packaging or runtime rendering. This saves reviewers from treating a generic build failure as a translation error.
Separate jobs or clear log headings can show extracted key changes, source-locale comparison, structural verification and final compiled-artifact checks.
Common failure and why it matters
A single command that combines everything without diagnostic boundaries encourages hurried ‘fixes’ that suppress checks rather than repair a broken translation contract.
Practical verification
Use clear failure summaries with the locale, message ID and remediation owner. Keep private content out of publicly accessible CI logs.
A useful review exercise at this stage is to take a real feature that depends on make ci errors interpretable, compare the source intent with the target-language experience, and record an observable pass-or-fail result. Ask what the user would conclude before and after clicking the relevant control. Preserve the smallest reliable test as a fixture for future releases. This connects language quality with actual product behavior rather than treating a successful command as the final definition of correctness.
Build realistic Unicode tests
Accent marks, combining characters, emoji sequences, non-Latin scripts and right-to-left text reveal defects absent from ASCII test data. The CLI does not substitute for a browser and font environment.
Render a name with diacritics inside a translated confirmation dialog, a long Japanese button label, and an Arabic passage beside an account number. Observe wrapping and direction changes.
Common failure and why it matters
Truncation, incorrect bidi isolation or missing glyphs can make a correct translation unusable. The error may occur in CSS or typography after compilation is finished.
Practical verification
Use actual locale data and accessible devices for layout tests, and keep screenshot findings separate from message-syntax problems.
Test accessibility separately from visual copy
Screen readers, live regions, form errors and focus announcements may surface strings that visual testing overlooks. The same action should have consistent meaning through visible and assistive channels.
A password-reset confirmation can include a visible paragraph and an aria-label that describes another action. Treat both as separate localization assets requiring review.
Common failure and why it matters
A translation may be shorter yet obscure an action for a keyboard or screen-reader user; a longer label may overflow a control without affecting its programmatic name.
Practical verification
Inspect semantic controls, announce dynamic messages in the selected language, and test keyboard order after changing locale or writing direction.
Coordinate translation updates with code changes
Source edits and translator delivery rarely arrive at exactly the same time. Teams need a known cutoff, source version, fallback policy and artifact provenance to prevent a previous wording from entering the newest release.
When a developer renames an account action, tag the source change and show reviewers which target catalogs still contain the earlier instruction. Accept the translation only against the latest meaning.
Common failure and why it matters
A successful synchronization can restore old phrases after a newer source change; deployment order matters as much as text content.
Practical verification
Compare catalog revisions with the product branch, mark strings requiring re-review and require the responsible reviewer to accept potentially changed actions.
A useful review exercise at this stage is to take a real feature that depends on coordinate translation updates with code changes, compare the source intent with the target-language experience, and record an observable pass-or-fail result. Ask what the user would conclude before and after clicking the relevant control. Preserve the smallest reliable test as a fixture for future releases. This connects language quality with actual product behavior rather than treating a successful command as the final definition of correctness.
Keep security and privacy out of localization files
Translation resources are commonly visible in build artifacts or vendor systems. They should contain interface text, not secrets, tokens, real customer names or private operational instructions.
Use dummy amounts and synthetic profile names in screenshots and translation comments. Restrict the ability to approve security-sensitive warnings or privacy notices.
Common failure and why it matters
Leaking customer records through example data is a privacy failure that a message parser cannot detect. Translating a security warning incorrectly can also change user behavior.
Practical verification
Review export payloads for embedded secrets and set an escalation path for passwords, fraud notices, consent wording and retention-policy messages.
Create a deliberate release and rollback boundary
A multilingual release should state which locale builds, message revisions and reviewer approvals belong together. Compiled output must be traceable so teams can reverse a bad locale without deleting valid source work.
Keep a manifest with source commit, tool version, locale set and artifacts. A rollback should restore the previous reviewed translation resources while preserving application data.
Common failure and why it matters
Releasing a new language independently from its design and support readiness can expose broken onboarding or incomplete error recovery paths.
Practical verification
Treat the release as complete only after smoke tests, sign-off and a documented rollback rehearsal for at least one target locale.
Measure what matters after deployment
Successful localization should reduce user confusion, not merely increase translated key counts. Measure support tickets, task completion and specific confusing labels while respecting privacy.
When users repeatedly cancel a purchase at the translated payment step, review the microcopy and UI sequence rather than automatically blaming the checkout system.
Common failure and why it matters
Raw page views and compiler success do not reveal whether a translated interface is understood. Country alone is not a reliable proxy for a reader’s language preference.
Practical verification
Use accessible feedback channels, opt-in usability studies and targeted correction tickets to improve future catalog revisions.
A useful review exercise at this stage is to take a real feature that depends on measure what matters after deployment, compare the source intent with the target-language experience, and record an observable pass-or-fail result. Ask what the user would conclude before and after clicking the relevant control. Preserve the smallest reliable test as a fixture for future releases. This connects language quality with actual product behavior rather than treating a successful command as the final definition of correctness.
Worked walkthroughs: three different defects and how to fix them
Worked project: a billing confirmation
Imagine a React billing dashboard with English source messages, French and Japanese catalogs, a due-date variable, a pluralized line-item count, a link to payment terms and a destructive ‘Cancel subscription’ button. First, annotate each full message with a stable ID and context. Extract the descriptors and inspect the source catalog. Send translators the complete sentence and a screenshot showing whether ‘cancel’ means leaving a page or terminating a paid contract. Verify missing keys and compatible arguments; compile the target catalogs and render zero, one and multiple line items. Finally, check keyboard access, reading order and mobile wrapping. The case passes only if the payment action, count and account outcome have the same meaning in all tested languages.
For a disciplined review, write down the intended result, the exact source revision, the target locale and the visible evidence. Run the described workflow on a disposable test account with synthetic data; compare what the interface communicates with what the system actually does. If the problem is technical, repair the file or configuration contract; if the wording is misleading, revise the translation and seek language approval. A corrected build should pass both kinds of inspection before returning to production.
Worked project: a regression discovered in CI
A developer adds a new message that interpolates an invoice ID. The source change builds, but the German target accidentally uses {invoiceNumber} where the source expects {invoiceId}. A structural verification step should flag the mismatch before the UI is released. The fix is not to rename the application variable casually; the translation must preserve the agreed argument contract. Recompile, run a realistic invoice fixture and ensure the value is announced clearly to assistive technology. Keep the failed test as a regression fixture. This distinguishes a semantic UI defect from a structural catalog error and gives the translator a precise, recoverable correction.
For a disciplined review, write down the intended result, the exact source revision, the target locale and the visible evidence. Run the described workflow on a disposable test account with synthetic data; compare what the interface communicates with what the system actually does. If the problem is technical, repair the file or configuration contract; if the wording is misleading, revise the translation and seek language approval. A corrected build should pass both kinds of inspection before returning to production.
Worked project: an unfamiliar deployment worker
A multilingual web application extracts messages locally, but a fresh CI worker cannot compile because an optional native dependency is unavailable. The useful diagnostic sequence begins with the build environment, not rewriting translations. Compare the operating system and CPU architecture to the documented supported package, verify installation of optional dependencies, reproduce with a clean lockfile install and rerun compilation. Once compilation succeeds, compare emitted output with the expected locale manifest. Only then perform browser QA. This avoids masking a packaging problem by deleting legitimate messages or downgrading verification rules.
For a disciplined review, write down the intended result, the exact source revision, the target locale and the visible evidence. Run the described workflow on a disposable test account with synthetic data; compare what the interface communicates with what the system actually does. If the problem is technical, repair the file or configuration contract; if the wording is misleading, revise the translation and seek language approval. A corrected build should pass both kinds of inspection before returning to production.
A release checklist that protects readers
- Freeze the source-message revision, the language list and the build tool version before collecting final approvals.
- Check that extraction covers every intended UI surface, including errors, hidden labels, emails and permission states.
- Review meaning, terminology, placeholders, variable types, punctuation and all conditional branches for each target locale.
- Compile from a clean checkout and confirm that the expected per-locale artifacts are present and loaded at runtime.
- Exercise realistic numbers, dates, names, long strings, Unicode characters and right-to-left text where relevant.
- Test the entire task with keyboard navigation, assistive technology and small screens, not merely static screenshots.
- Record approvals, defects, deployment revision and rollback steps so corrections can be traced without guesswork.
A release decision should be reversible and specific. If only one language has a harmful or misleading translation, the team should be able to hold that locale or revert its resources without discarding correct source code or other approved languages. Keep the change log explicit: which message, which locale, which screen, and which expected user action changed? This discipline is especially important for payments, consent, health notices, account deletion and security alerts, where unclear wording can have consequences outside the interface.
Frequently asked questions
Does FormatJS translate sentences automatically?
No. The CLI organizes extraction, compilation and validation; human translators or approved translation services supply wording. A structurally valid target string may still be inaccurate, culturally inappropriate or confusing.
The practical test is not whether the term sounds technical; it is whether a reviewer can trace the message from source intent to the exact visible screen and reproduce its behavior. When the answer depends on package versions, use the official command reference for the version pinned in the project and preserve a small regression example before deploying a change.
Why use source descriptions?
The same English word can be a noun, verb or command. Context explains the intent, user action and surrounding interface, reducing expensive rework when a target-language sentence requires different wording.
The practical test is not whether the term sounds technical; it is whether a reviewer can trace the message from source intent to the exact visible screen and reproduce its behavior. When the answer depends on package versions, use the official command reference for the version pinned in the project and preserve a small regression example before deploying a change.
What is the difference between extract and compile?
Extraction identifies message descriptors in source files and produces a catalog. Compilation converts supported message resources into runtime-consumable output and checks message syntax.
The practical test is not whether the term sounds technical; it is whether a reviewer can trace the message from source intent to the exact visible screen and reproduce its behavior. When the answer depends on package versions, use the official command reference for the version pinned in the project and preserve a small regression example before deploying a change.
What does verify catch?
Depending on flags and input format, it can detect missing or extra keys and structural incompatibilities. It cannot judge tone, legal meaning, accessibility or whether users understand the text.
The practical test is not whether the term sounds technical; it is whether a reviewer can trace the message from source intent to the exact visible screen and reproduce its behavior. When the answer depends on package versions, use the official command reference for the version pinned in the project and preserve a small regression example before deploying a change.
Should every language have identical plural branches?
No. Languages differ in plural categories. Preserve ICU semantics and runtime argument contracts, then review each locale’s actual grammatical requirements.
The practical test is not whether the term sounds technical; it is whether a reviewer can trace the message from source intent to the exact visible screen and reproduce its behavior. When the answer depends on package versions, use the official command reference for the version pinned in the project and preserve a small regression example before deploying a change.
Can translated strings include HTML?
Treat markup and rich-text placeholders as structured elements, not arbitrary HTML injection. Review accessibility, security and correct link association in the rendered result.
The practical test is not whether the term sounds technical; it is whether a reviewer can trace the message from source intent to the exact visible screen and reproduce its behavior. When the answer depends on package versions, use the official command reference for the version pinned in the project and preserve a small regression example before deploying a change.
Why does compile fail while extract succeeds?
Compilation paths may require native dependencies unavailable on the current platform or omitted by package installation. Check the supported environment before modifying source strings.
The practical test is not whether the term sounds technical; it is whether a reviewer can trace the message from source intent to the exact visible screen and reproduce its behavior. When the answer depends on package versions, use the official command reference for the version pinned in the project and preserve a small regression example before deploying a change.
Are extra keys always harmful?
Not necessarily. They may be transitional or historical, but every unexpected key needs an explicit decision so stale content does not silently remain part of a release.
The practical test is not whether the term sounds technical; it is whether a reviewer can trace the message from source intent to the exact visible screen and reproduce its behavior. When the answer depends on package versions, use the official command reference for the version pinned in the project and preserve a small regression example before deploying a change.
How can a team prevent stale translations?
Version source messages, inspect extracted diffs, associate target catalogs with a release commit, and require re-review when the source meaning changes.
The practical test is not whether the term sounds technical; it is whether a reviewer can trace the message from source intent to the exact visible screen and reproduce its behavior. When the answer depends on package versions, use the official command reference for the version pinned in the project and preserve a small regression example before deploying a change.
What is the minimum human QA?
Read the full message in context and test the user action, numbers, links, keyboard access, right-to-left behavior if relevant and realistic application states.
The practical test is not whether the term sounds technical; it is whether a reviewer can trace the message from source intent to the exact visible screen and reproduce its behavior. When the answer depends on package versions, use the official command reference for the version pinned in the project and preserve a small regression example before deploying a change.
Next reading and original documentation
Official references are best used to confirm command syntax, supported flags and version-specific behavior. The explanations above focus on applying those commands to reliable translation outcomes; the linked documentation provides the authoritative details for each tool release.
Final perspective
Professional translation is a chain of accountable decisions. Collect the right source message, describe the real user action, preserve structure, check the language in context and prove that the compiled interface behaves correctly. FormatJS CLI is most useful when it makes these steps repeatable and auditable. The benefit for international readers is not a cleverer automation pipeline; it is being able to understand what a product says and trust what happens next.