Set the acceptance boundary before testing
"Supports French" is too broad to test or approve. Support may differ between a marketing site and an account dashboard, between desktop and mobile, or between a button label and a date picker. Even the same component can pass in its default state and fail with an error, loading message, or long translated action.
Write the release claim as a bounded statement. Name the component version, consumer, locale, script, direction, content fixture, state, viewport, browser or platform, font condition, and formatting policy. If any of these can change the result, include it in the record.
Release unit: [component and version]
Named consumer: [product, route, or screen]
Locale: [BCP 47 locale]
Script: [script used by the fixture]
Direction: [LTR / RTL / mixed]
Component state: [default / focus / error / disabled / loading / other]
Viewport or container: [recorded size]
Runtime environment: [browser, platform, relevant settings]
Font condition: [loaded / loading fallback / unavailable / missing glyph]
Formatting policy: [date, number, currency, calendar, time zone]
Required evidence: [render, interaction, programmatic check, linguistic review]
Decision owner: [role or named team]Do not approve a capability label
A locale listed in configuration is declared support. It doesn't prove that translations are populated, fonts cover the script, components render correctly, application formatting follows policy, or a qualified reviewer accepts the language.
Assign ownership before changing the interface
Localization defects often look alike. A clipped label may come from a rigid component, an unexpected translation, a fallback font with different metrics, or a product wrapper that narrows the available space. Fixing the first visible symptom can hide the failure and introduce drift elsewhere.
Make the first responsible layer the correction owner. Other teams may help investigate or verify, but the owner needs authority to change the rule or resource that diverged.
| Owns | Typical failure | Evidence needed | |
|---|---|---|---|
| Visual system | Semantic color, type, spacing, direction-aware visual roles, and reusable guidance | A shared role or visual rule is absent, ambiguous, or unsuitable for the required condition | Versioned source rule and expected downstream mapping |
| Font resources | Family files, faces, weights, glyph coverage, fallback order, and loading policy | Missing glyphs, unintended synthesis, metric changes, or the wrong family rendering | Requested resource, loaded face, selected face, and representative glyph render |
| Translation resources | Localized strings, placeholders, plural forms, grammatical variants, and translator context | Missing, truncated, malformed, or contextually wrong localized content | Resource key, source context, target value, and translation status |
| Component contract | Structure, flexible sizing, logical direction, supported content, states, focus behavior, and fallbacks | Clipping, overlap, incorrect mirroring, lost focus, or an unsupported error state | Component fixture covering the required locale condition and state |
| Application policy | Locale-specific dates, numbers, currencies, calendars, units, sorting, validation, and input rules | The component renders supplied data correctly, but the supplied representation is wrong | Policy decision, formatter configuration, input fixture, and expected output |
| Runtime locale state | Active locale, direction propagation, persistence, switching, hydration, and route state | The interface shows stale or mixed locale state after navigation or reload | Runtime event or state evidence joined to the rendered observation |
| Linguistic review | Meaning, fluency, tone, terminology, cultural fit, and market acceptance | The UI works technically, but the language is misleading, awkward, or inappropriate | Review by an authorized language owner with comments and disposition |
Ownership is about correction authority
Finding a defect doesn't make someone its owner. Assign the layer that can correct the governing source, then name who must retest the downstream result.
Build a localization stress matrix
Testing every component in every locale, state, viewport, and platform is usually impractical. Testing one polished screen in every locale is shallow. Instead, select cases by distinct failure mechanism. Each case should expose a risk that the others don't already cover.
| Representative case | What to inspect | Likely owner if it fails | |
|---|---|---|---|
| Expansion | A long action, navigation label, badge, alert, and table heading | Wrapping, truncation, adjacent controls, height growth, and responsive reflow | Translation resource, component contract, or product layout |
| Contraction | Short labels inside balanced layouts or equal-width controls | Stranded space, ambiguous abbreviations, alignment, and accidental fixed widths | Component or product layout |
| Bidirectional layout | A full RTL fixture with navigation, forms, tables, and directional controls | Logical order, alignment, edge placement, focus sequence, and intentional mirroring | Component, CSS, or application direction state |
| Mixed-direction content | RTL prose containing an email address, code, identifier, amount, or phone number | Segment order, punctuation, caret behavior, selection, and copy accuracy | Application markup or component contract |
| Additional script | A supported locale using a script absent from the default Latin fixture | Glyph coverage, family selection, weight availability, line metrics, and visual hierarchy | Font resources or typography mapping |
| Regional formats | Dates, times, numbers, currencies, units, and calendars with meaningful boundary values | Ordering, separators, symbols, precision, time zone, calendar assumptions, and speech output | Application policy and formatter configuration |
| Inputs | Names, addresses, search, numbers, dates, and validation messages | Accepted characters, input direction, keyboard behavior, parsing, autofill, and error recovery | Application policy, validation, or component behavior |
| Icons and imagery | Back and forward controls, progress, charts, screenshots, and images containing text | Whether direction changes meaning, embedded text remains untranslated, or symbolism becomes misleading | Component guidance, content, or product design |
| Interaction states | Focus, hover, active, disabled, selected, loading, empty, and destructive states | State remains perceivable and correctly placed after content or direction changes | Component contract and visual roles |
| Error and recovery | Field errors, banners, interrupted operations, and retry actions with localized copy | Announcement order, association, available recovery, wrapping, and persistence | Component, application behavior, or translation |
| Responsive composition | Narrow container, mobile viewport, zoomed text, and dense data display | Reflow, overflow, reading order, touch targets, and hidden information | Component or consuming layout |
Choose cases by risk, not market count
Start with the locales you actually support. Then identify which ones contribute a distinct script, direction, grammatical requirement, formatting convention, or content-length risk. One language shouldn't become a permanent proxy for every language. Each selected case needs to earn its place.
- 1
List supported scope
Record the locales, scripts, directions, platforms, components, and product consumers included in this release.
- 2
Tag each component risk
Mark the content expansion, direction, typography, formatting, input, interaction, error, and responsive risks that can affect it.
- 3
Select the smallest distinct set
Choose cases that collectively exercise the required risks. Remove duplicate cases only when they test the same mechanism under equivalent conditions.
- 4
Add change-based coverage
Include any locale, component, or consumer directly affected by the release, even if another case covers a similar general risk.
- 5
Record exclusions
State what wasn't tested and why. An exclusion narrows the approval; it doesn't become a passing result.
Audit strings and translation context
A flexible component can't rescue a broken content contract. Inspect each built-in or product-supplied string before judging the layout. The source should make sense outside the screen, and translators need to know where it appears, what the user is doing, what each placeholder means, and which constraints are genuine.
- Keep translatable text outside code paths that prevent proper replacement or grammatical variation.
- Give translators context for the component, state, user action, audience, and available space.
- Name placeholders by meaning. Record whether their values can change order, direction, number, or grammatical form.
- Support the plural, gender, case, or selection behavior required by the target language instead of joining fragments at runtime.
- Check whether icons, screenshots, illustrations, or media contain embedded text that needs a separate resource.
- Treat character limits as exceptional product constraints, not as a substitute for flexible layout.
- Preserve intentional markup and accessibility labels without asking translators to edit fragile presentation syntax.
- Record the source version so a later copy change can trigger the right retests.
Use real task content
Pseudo-localization can expose expansion and resource-boundary problems, but it can't approve meaning or fluency. Pair structural stress fixtures with real target-language content and an authorized linguistic review.
Audit the component contract
Test reusable components in isolation first. This shows whether the shared contract can support the condition at all. Then test named consumers, because wrappers, local styles, composition, routing, and real data can change the result.
- Content containers grow, wrap, or reflow according to an explicit rule rather than an English-shaped fixed dimension.
- Start and end relationships use logical direction where direction should control placement.
- Icons mirror only when their meaning is directional. Logos, media controls, and familiar symbols need an explicit decision.
- DOM order, visual order, keyboard order, and reading order remain coherent in both directions.
- Font stacks cover the required script, symbols, and requested faces. Test missing glyph and loading-time fallback conditions separately.
- Check line height and vertical alignment with representative glyphs, marks, and multi-line content.
- Default, hover, focus, active, disabled, selected, loading, empty, success, warning, and error states retain their meaning.
- Labels, descriptions, errors, values, and controls keep their programmatic relationships after reflow.
- Truncation has a documented use case and preserves access to the full value when the task requires it.
- Test responsive behavior at exact transition edges, not only at comfortable wide and narrow examples.
Component specimen · Input
Ambient Sage
Live renderThe input primitive in Ambient Sage, across 4 states.
Default
Focus
Disabled
Error
Enter a valid email address.
Audit application-owned locale behavior
A design system can provide a calendar shell, input style, table treatment, or typography role. The consuming application still decides which calendar system applies, how it parses a date, which time zone it displays, whether it converts a currency amount, and how a locale switch affects stored state.
Use boundary values that reveal policy errors. Include ambiguous dates, zero and negative values, large grouped numbers, currencies with different minor-unit conventions, daylight-saving transitions where relevant, long time-zone names, and names or addresses that don't follow the default market's structure. Record the expected representation before running the test.
- Dates: ordering, calendar, first day of week, range display, parsing, and invalid input.
- Times: 12-hour or 24-hour conventions, time zone, daylight changes, and relative-time wording.
- Numbers: decimal and grouping separators, signs, precision, percentages, compact notation, and native digits where required.
- Currencies: currency identity, symbol placement, spacing, precision, and the difference between formatting and conversion.
- Sorting and search: collation policy, accents, case behavior, script handling, and the difference between display labels and stable identifiers.
- Forms: names, addresses, telephone numbers, postal codes, input methods, autofill, validation, and server-side parity.
- Locale switching: active state, direction, persistence, routing, cache behavior, hydration, and partially loaded content.
Inspect the upstream system before testing consumers
Ambient Sage is a public example of semantic roles, typography, spacing, and implementation guidance. Use it to define the visual inputs. Leave font delivery, locale resources, component mapping, and rendered observations open until your product test supplies evidence.
Keep five evidence states separate
One "done" checkbox hides where support stops. Use five states so reviewers can see whether the team has merely named a capability, implemented it, populated it with real content, observed it, or obtained linguistic approval.
| Question answered | Sufficient evidence | |
|---|---|---|
| Declared | What does the team claim to support? | Versioned scope naming the locale, script, direction, component, consumer, states, and environments |
| Implemented | Does the required mechanism exist in the relevant artifact or application? | Inspectable component behavior, resource wiring, formatter configuration, font declaration, or runtime handling |
| Populated | Are the required resources actually present for this case? | Target strings, font files or faces, locale data, icons, imagery, and other required content at recorded versions |
| Observed | What happened in the named consumer under recorded conditions? | Screenshots or recordings plus interaction, computed state, logs, or programmatic assertions appropriate to the claim |
| Linguistically accepted | Does an authorized reviewer accept the language and cultural result? | Reviewer identity or role, review scope, comments, date, and disposition |
These states are related, but they aren't interchangeable. You can test an implemented locale switch with incomplete translations. A populated translation can render in the wrong direction. A correct screenshot can contain poor language. Linguistic approval can also become stale after a source-string or layout change.
Localization readiness is a chain of bounded claims, not a language checkbox.
Copy the component-by-locale acceptance record
Keep expectations and observations in the same record. This makes the result falsifiable and stops a screenshot, issue link, or translation status from standing in for the full release decision.
Record ID: LOC-[component]-[locale]-[case]
Scope
- Design-system source and version:
- Component and version:
- Named product consumer:
- Locale and script:
- Direction:
- State and task:
- Viewport or container:
- Runtime environment:
Inputs
- Source string and context:
- Translation resource and version:
- Placeholders or grammatical requirements:
- Font resource, faces, and fallback condition:
- Formatting or calendar rule:
- Visual token and component constraints:
Expectation
- Content expectation:
- Layout and direction expectation:
- Typography expectation:
- Interaction and reading-order expectation:
- Formatting expectation:
- Fallback expectation:
Observation
- Rendered result:
- Interaction result:
- Programmatic or computed result:
- Linguistic review result:
- Unexpected differences:
Evidence
- Evidence references:
- Capture or run date:
- Reviewer and role:
- Known evidence limits:
Decision
- First divergent layer:
- Correction owner:
- Required correction:
- Retest trigger:
- Disposition: accept / revise / block / defer
- Decision owner and date:
- Approval boundary and exclusions:Example of an unexecuted record
Suppose a team plans to test a checkout action in an RTL locale. Its record might declare an RTL fixture, a narrow mobile consumer, localized price formatting, a loaded target-script font, and focus plus error states. Before execution, the observation fields must say "not run," the evidence references remain empty, and the disposition is "defer." That's more accurate than marking the component ready because its source uses logical CSS properties.
A planned test is not a result
Templates, expected outcomes, and proposed fixtures are useful implementation inputs. They don't become observed or accepted evidence until someone executes and reviews the named case.
Find the first divergent layer
When a case fails, trace it from the earliest governing source to the rendered consumer. Stop at the first layer where the actual state differs from the recorded expectation. Correct that layer, regenerate or redistribute downstream artifacts if needed, and rerun the affected case.
- 1
Check the declared scope
Confirm that the locale, script, direction, component state, and consumer are included. If the requirement is absent or disputed, the decision owner must resolve it first.
- 2
Check populated resources
Verify the exact translation, font face, locale data, icon, and content version used by the case.
- 3
Check implementation and distribution
Confirm that the expected component contract, tokens, resources, and formatter configuration reached the tested build.
- 4
Check project mapping
Inspect whether the named consumer uses the intended component, variant, semantic roles, direction state, and locale policy without an accidental local substitute.
- 5
Check runtime state
Verify the active locale, direction, route, persistence, font selection, loaded content, and timing at the moment of observation.
- 6
Check the rendered and linguistic result
Compare the observed layout, interaction, formatting, and language with the pre-recorded expectations. Preserve the evidence even when the result fails.
Don't widen a button, reduce a font size, or add a local override until this trace identifies why the case diverged. A component change may be correct, but only when the evidence shows that the shared constraint is the first faulty layer.
Use Ambient Sage as bounded upstream input
Ambient Sage can supply declared visual inputs for a localization exercise. Its public kit identifies Plus Jakarta Sans for body and heading roles, JetBrains Mono for the mono role, selected weights, a compact product scale, semantic colors, spacing, and implementation artifacts. These facts help a team state what should enter the consumer.
Token specimen · real values
Ambient Sage
Live renderAmbient Sage's actual tokens — the same values its exports use.
The acceptance record must still leave several fields unresolved: whether the requested font resources cover each required script and symbol; which fallbacks the product delivers; whether localized strings are populated; whether components use the intended roles; whether locale formatting follows product policy; and what happens in the named consumer. Identity Forge provides design-system inputs. The adopting product owns localization behavior and approval.
Choose accept, revise, block, or defer
| Use when | Required follow-up | |
|---|---|---|
| Accept | All evidence required by the bounded scope supports the recorded expectations, with no unresolved blocking failure | Retain evidence and retest when a listed trigger occurs |
| Revise | The case has a correctable problem that can remain within the current release workflow without making the supported claim false | Assign the correction, preserve failed evidence, and rerun the affected case before approval |
| Block | A required task, meaning, direction, format, interaction, or fallback fails, or required evidence contradicts the release claim | Prevent the bounded release claim until the owner corrects the first divergent layer and the case passes |
| Defer | The capability is outside current scope, the test has not run, evidence is unavailable, or an authorized decision is still pending | State the exclusion, owner, prerequisite, and condition for reconsideration |
A release can accept one locale and defer another. It can also accept a component in one consumer while blocking it in another. Keep that granularity, because broad approval erases the conditions under which the team collected the evidence.
Set retest triggers before evidence goes stale
Localization evidence remains useful only while its inputs and conditions stay materially unchanged. Record the triggers when approving the case instead of deciding later whether an old screenshot still transfers.
- The source string, translation, placeholder contract, or grammatical rule changes.
- The component structure, sizing, state behavior, responsive rule, or direction handling changes.
- A typography role, font file, face, fallback stack, loading policy, or glyph subset changes.
- Locale data, formatter configuration, calendar policy, time-zone policy, validation, sorting, or input behavior changes.
- The consuming product changes its component mapping, wrapper, local styles, route, state persistence, or locale-switching behavior.
- A supported browser, platform, viewport class, input method, or accessibility environment changes materially.
- A defect or user report challenges an assumption covered by the accepted record.
Complete one bounded pass first
Start with one high-risk component in one named product consumer. Complete four records: one expansion case, one bidirectional or mixed-direction case, one additional-script case, and one locale-formatting case. A locale may cover more than one risk, but keep the expectations and evidence distinct.
Widen coverage only after those records show whether your ownership model and evidence fields work in practice. The next step is concrete: choose the component that combines important content, interaction states, and constrained space, then write its expectations before opening the localized build.
Design system localization questions
Does passing Storybook or an isolated component fixture approve the product?
No. It proves only the recorded isolated conditions. Test a named product consumer because wrappers, local styles, routing, real data, runtime locale state, and composition can change the result.
Should every supported locale be tested against every component?
Use risk-based representative coverage plus direct coverage for changed or critical paths. Don't claim that an untested combination passed. Record what the selected cases cover, what they don't cover, and which changes trigger broader testing.
Is pseudo-localization enough for localization readiness?
No. It's useful for expansion, resource extraction, and some direction or encoding faults. It can't approve translation meaning, grammar, terminology, cultural fit, or the actual target-script font result.
Who owns a clipped translated label?
Investigate before assigning the fix. The first divergent layer may be the translation, font metrics, component constraint, product wrapper, or responsive composition. The layer that owns the incorrect rule or resource owns the correction.
Does a design kit make a component localization-ready?
A design kit can provide upstream typography, semantic roles, spacing, layout guidance, and implementation artifacts. Localization readiness still depends on translation resources, font delivery and coverage, component behavior, application formatting, runtime locale state, rendered checks, and linguistic approval.
Sources
- Design System Localization: Adapting Components for Every Language: The guide identifies text expansion, bidirectional layouts, multiple scripts, typography, locale-sensitive formats, and localized documentation as design-system concerns.
- Localization Testing Guide: Best Practices & Checklist: The testing guide separates scenario planning, execution, reporting, and confirmation of fixes within a broader localization-testing process.
- Multilingual UI/UX Design: A Complete Guide for Global Products: The guide covers multilingual risks involving text length, writing systems, bidirectional layouts, typography, regional formats, navigation, visual elements, and accessibility.
- Software Localization Checklist: Localization of UI and Design Elements: The checklist discusses layout adaptation, text direction, expansion, navigation, embedded text, imagery, icons, colors, typography, and device sizes.
- Integrating Localization Into Design Systems: This implementation case shows that localization can intersect with design tokens, variables, theme switching, density, JSON structure, and design tooling.
- Core components - Design System Checklist: The component checklist records reusable requirements for component composition, states, responsiveness, accessibility, and selected localization-sensitive behavior.
- How to Prepare Your Product for Localization: а Technical Checklist: The technical checklist covers translatable resources, internationalization architecture, flexible layouts, translator context, workflow ownership, testing, and approval responsibilities.
- Ambient Sage Design Kit: The public Ambient Sage kit supplies bounded upstream evidence for its declared visual direction, typography, semantic roles, spacing, and implementation artifacts, but not for localized rendering.