Get started

Design system localization checklist: verify components across scripts and locales

A component is localization-ready only for the locale, consumer, state, viewport, and environment covered by recorded evidence. A translated string, flexible component, or clean screenshot proves one part of that chain, not the whole result. Use this checklist to select representative risks, route failures to the right owner, and make an explicit release decision.

Updated November 2, 2026

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]
A narrow release claim is testable. "Localized component" is not.

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.

OwnsTypical failureEvidence needed
Visual systemSemantic color, type, spacing, direction-aware visual roles, and reusable guidanceA shared role or visual rule is absent, ambiguous, or unsuitable for the required conditionVersioned source rule and expected downstream mapping
Font resourcesFamily files, faces, weights, glyph coverage, fallback order, and loading policyMissing glyphs, unintended synthesis, metric changes, or the wrong family renderingRequested resource, loaded face, selected face, and representative glyph render
Translation resourcesLocalized strings, placeholders, plural forms, grammatical variants, and translator contextMissing, truncated, malformed, or contextually wrong localized contentResource key, source context, target value, and translation status
Component contractStructure, flexible sizing, logical direction, supported content, states, focus behavior, and fallbacksClipping, overlap, incorrect mirroring, lost focus, or an unsupported error stateComponent fixture covering the required locale condition and state
Application policyLocale-specific dates, numbers, currencies, calendars, units, sorting, validation, and input rulesThe component renders supplied data correctly, but the supplied representation is wrongPolicy decision, formatter configuration, input fixture, and expected output
Runtime locale stateActive locale, direction propagation, persistence, switching, hydration, and route stateThe interface shows stale or mixed locale state after navigation or reloadRuntime event or state evidence joined to the rendered observation
Linguistic reviewMeaning, fluency, tone, terminology, cultural fit, and market acceptanceThe UI works technically, but the language is misleading, awkward, or inappropriateReview by an authorized language owner with comments and disposition
Localization correction-ownership matrix

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 caseWhat to inspectLikely owner if it fails
ExpansionA long action, navigation label, badge, alert, and table headingWrapping, truncation, adjacent controls, height growth, and responsive reflowTranslation resource, component contract, or product layout
ContractionShort labels inside balanced layouts or equal-width controlsStranded space, ambiguous abbreviations, alignment, and accidental fixed widthsComponent or product layout
Bidirectional layoutA full RTL fixture with navigation, forms, tables, and directional controlsLogical order, alignment, edge placement, focus sequence, and intentional mirroringComponent, CSS, or application direction state
Mixed-direction contentRTL prose containing an email address, code, identifier, amount, or phone numberSegment order, punctuation, caret behavior, selection, and copy accuracyApplication markup or component contract
Additional scriptA supported locale using a script absent from the default Latin fixtureGlyph coverage, family selection, weight availability, line metrics, and visual hierarchyFont resources or typography mapping
Regional formatsDates, times, numbers, currencies, units, and calendars with meaningful boundary valuesOrdering, separators, symbols, precision, time zone, calendar assumptions, and speech outputApplication policy and formatter configuration
InputsNames, addresses, search, numbers, dates, and validation messagesAccepted characters, input direction, keyboard behavior, parsing, autofill, and error recoveryApplication policy, validation, or component behavior
Icons and imageryBack and forward controls, progress, charts, screenshots, and images containing textWhether direction changes meaning, embedded text remains untranslated, or symbolism becomes misleadingComponent guidance, content, or product design
Interaction statesFocus, hover, active, disabled, selected, loading, empty, and destructive statesState remains perceivable and correctly placed after content or direction changesComponent contract and visual roles
Error and recoveryField errors, banners, interrupted operations, and retry actions with localized copyAnnouncement order, association, available recovery, wrapping, and persistenceComponent, application behavior, or translation
Responsive compositionNarrow container, mobile viewport, zoomed text, and dense data displayReflow, overflow, reading order, touch targets, and hidden informationComponent or consuming layout
Representative localization risks and useful test cases

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. 1

    List supported scope

    Record the locales, scripts, directions, platforms, components, and product consumers included in this release.

  2. 2

    Tag each component risk

    Mark the content expansion, direction, typography, formatting, input, interaction, error, and responsive risks that can affect it.

  3. 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. 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. 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 render

The input primitive in Ambient Sage, across 4 states.

Default

Focus

Disabled

Error

Enter a valid email address.

Use the specimen to identify the visual roles and states entering a localization test. It doesn't demonstrate translated content, script coverage, direction behavior, or consumer adoption.

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 answeredSufficient evidence
DeclaredWhat does the team claim to support?Versioned scope naming the locale, script, direction, component, consumer, states, and environments
ImplementedDoes the required mechanism exist in the relevant artifact or application?Inspectable component behavior, resource wiring, formatter configuration, font declaration, or runtime handling
PopulatedAre 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
ObservedWhat happened in the named consumer under recorded conditions?Screenshots or recordings plus interaction, computed state, logs, or programmatic assertions appropriate to the claim
Linguistically acceptedDoes an authorized reviewer accept the language and cultural result?Reviewer identity or role, review scope, comments, date, and disposition
Evidence states for each component and locale case

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.
Identity Forge editorial checklist

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:
Copyable component-by-locale acceptance record

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. 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. 2

    Check populated resources

    Verify the exact translation, font face, locale data, icon, and content version used by the case.

  3. 3

    Check implementation and distribution

    Confirm that the expected component contract, tokens, resources, and formatter configuration reached the tested build.

  4. 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. 5

    Check runtime state

    Verify the active locale, direction, route, persistence, font selection, loaded content, and timing at the moment of observation.

  6. 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 render

Ambient Sage's actual tokens — the same values its exports use.

Color tokensSemantic roles with HEX / HSL / CMYK

Color tokens

Ambient Sage
light · HEX · HSL · CMYK

Core

#F3F4EF

background

H 72 · C0, 0, 2, 4

#1A1C17

foreground

H 84 · C7, 0, 18, 89

#E5E6E0

card

H 70 · C0, 0, 3, 10

#ECEEE8

muted

H 80 · C1, 0, 3, 7

#D8D9D2

border

H 68.57 · C0, 0, 3, 15

Brand

#FEE951

primary

H 52.72 · C0, 8, 68, 0

#1A1C17

primary-fg

H 84 · C7, 0, 18, 89

#E5E6E0

secondary

H 70 · C0, 0, 3, 10

#F7E464

accent

H 52.24 · C0, 8, 60, 3

#FEE951

ring

H 52.72 · C0, 8, 68, 0

Semantic

#C0392B

destructive

H 5.64 · C0, 70, 78, 25

#FFFFFF

destructive-fg

H 0 · C0, 0, 0, 0

#2D7238

success

H 129.57 · C61, 0, 51, 55

#C97D12

warning

H 35.08 · C0, 38, 91, 21

#545651

muted-fg

H 84 · C2, 0, 6, 66

Charts

#FEE951

chart-1

H 52.72 · C0, 8, 68, 0

#4A8FD4

chart-2

H 210 · C65, 33, 0, 17

#6BBF8A

chart-3

H 142.14 · C44, 0, 28, 25

#E07498

chart-4

H 340 · C0, 48, 32, 12

#E8A24B

chart-5

H 33.25 · C0, 30, 68, 9

Type scaleHeading, body, and mono in the kit's fonts

Typography

Ambient Sage

Scale: compact-product

Density: balanced

Heading · Plus Jakarta Sans · 1.875rem

Ship beautiful product faster

Subheading · Plus Jakarta Sans · 1.375rem

A warm-sage neutral-surface mobile kit with a single vivid yellow accent, flat tonal cards, and oversized display numerals.

Body · Plus Jakarta Sans · 1rem

Ambient Sage uses a near-white warm-sage canvas (#f3f4ef) with card panels distinguished only by a tonal shift to #e5e6e0, never by shadows or borders. A single vivid yellow (#fee951) is the only saturated color and appears sparingly at component scale as orbs, button fills, and focus rings. Primary data values render as oversized bold hero numerals with a small superscript unit. Typography is a friendly rounded geometric (Plus Jakarta Sans) with no uppercase and no tight tracking, while JetBrains Mono is reserved for hex codes and technical strings. Generous rounding and luminance-only contrast give the whole system a calm, minimal feel.

Mono · JetBrains Mono · 0.8125rem

npx shadcn add ambientsage.json

Aa

Plus Jakarta Sans · Heading

400500600700

Aa

Plus Jakarta Sans · Body

400500600700

ABCDEFGHIJKLM NOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789 & @ # % →

Radius & spacingCorner radius, elevation, and spacing steps

Tokens

Ambient Sage primitives
density: balanced

Radius scale

sm · 0.375rem
md · 0.75rem
lg · 1.25rem
xl · 1.75rem

Component radius

button
card
input

Elevation

level 1
level 2
level 3
level 4

Spacing · base 4px

1x
2x
3x
4x
6x
8x
This specimen shows the kit's upstream visual decisions. It doesn't certify script coverage, target-language readability, font delivery, component mapping, bidirectional behavior, or product rendering.

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 whenRequired follow-up
AcceptAll evidence required by the bounded scope supports the recorded expectations, with no unresolved blocking failureRetain evidence and retest when a listed trigger occurs
ReviseThe case has a correctable problem that can remain within the current release workflow without making the supported claim falseAssign the correction, preserve failed evidence, and rerun the affected case before approval
BlockA required task, meaning, direction, format, interaction, or fallback fails, or required evidence contradicts the release claimPrevent the bounded release claim until the owner corrects the first divergent layer and the case passes
DeferThe capability is outside current scope, the test has not run, evidence is unavailable, or an authorized decision is still pendingState the exclusion, owner, prerequisite, and condition for reconsideration
Release dispositions

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