What This Template Is For
Before you can localize a product for new markets, your codebase, design system, and content pipeline must support multiple languages and locales. This is internationalization (i18n): the engineering and design groundwork that makes localization possible. Skipping this step leads to hardcoded strings surfacing in production, layouts that break with longer translations, and date formats that confuse users in every market except the US.
This checklist helps product and engineering teams audit their i18n readiness across three domains: code, design, and content. Use it before kicking off your first localization project. If you discover gaps, feed them into your product roadmap as prerequisites for any market expansion work.
How to Use This Template
- Copy this checklist into your project management tool (Jira, Linear, Notion).
- Assign each section to the relevant team lead: engineering for code, design for UI, content for docs.
- Walk through each item. Mark items as complete, in progress, or not started.
- Items marked "not started" become engineering tasks that must be completed before localization begins.
- Re-run this audit before each new market launch to catch regressions.
The Template
Code Readiness
String Externalization
- ☐ All user-facing strings are extracted into resource files (JSON, XLIFF, or equivalent)
- ☐ No hardcoded strings remain in source code (UI components, error messages, notifications)
- ☐ String keys follow a consistent naming convention (e.g.,
module.component.label) - ☐ Pluralization rules are handled by the i18n library, not with if/else logic
- ☐ String concatenation is not used to build sentences (translations require different word order)
- ☐ Variables in strings use named placeholders, not positional (
{userName}not%s)
Locale Handling
- ☐ Date formatting uses locale-aware libraries (Intl.DateTimeFormat, date-fns locale)
- ☐ Number formatting respects locale conventions (comma vs. period for decimals)
- ☐ Currency display uses locale-appropriate symbols and positioning
- ☐ Time zones are handled correctly for display and storage
- ☐ Sorting and collation account for locale-specific alphabetical order
- ☐ Phone number input and display support international formats
Character Encoding and Text
- ☐ All text storage and transmission uses UTF-8
- ☐ Database columns support multi-byte characters (utf8mb4 for MySQL)
- ☐ Search and filtering work with non-Latin scripts (CJK, Arabic, Cyrillic)
- ☐ Text truncation is character-aware, not byte-aware
- ☐ Email templates support multi-byte characters in subject lines and body
Build and Deployment
- ☐ Locale detection is implemented (browser language, user profile, URL path)
- ☐ Locale switching works without a full page reload
- ☐ Translation files can be updated without a code deployment
- ☐ A translation management system (TMS) integration exists or is planned
- ☐ CI/CD pipeline validates that all string keys have translations in every target locale
Design Readiness
Layout Flexibility
- ☐ UI layouts handle text expansion (German is 30% longer than English on average)
- ☐ Buttons, labels, and navigation items use flexible widths, not fixed pixel widths
- ☐ Tables and data grids accommodate varying column content lengths
- ☐ Forms handle long input labels without breaking alignment
- ☐ Modal and dialog sizing adapts to content length
Typography and Scripts
- ☐ Font stack includes fallbacks for CJK, Arabic, Devanagari, and other target scripts
- ☐ Line heights and letter spacing work across scripts (CJK needs more vertical space)
- ☐ Font sizes remain legible for scripts with complex characters (e.g., Japanese kanji)
- ☐ Bold/italic alternatives exist for scripts that do not support them (CJK typically avoids italic)
Bidirectional (RTL) Support
- ☐ CSS logical properties are used (
margin-inline-startinstead ofmargin-left) - ☐ Icons with directional meaning (arrows, progress bars) flip for RTL languages
- ☐ Text alignment defaults to
startrather thanleft - ☐ Navigation order reverses for RTL layouts
- ☐ RTL layout has been tested with real Arabic or Hebrew content, not placeholder text
Images, Icons, and Media
- ☐ Images containing text are flagged for localization or replaced with CSS/SVG text
- ☐ Icons avoid culturally specific symbols (mailbox styles, hand gestures, religious symbols)
- ☐ Screenshots in help docs are tagged for replacement per locale
- ☐ Alt text and ARIA labels are included in the translation pipeline
Content Readiness
Documentation and Help
- ☐ Help center articles are stored in a CMS that supports multiple languages
- ☐ Top 20 help articles (by traffic) are identified and prioritized for translation
- ☐ Embedded screenshots have a replacement workflow for localized versions
- ☐ Content style guide includes localization instructions (tone, formality level per market)
In-Product Content
- ☐ Onboarding flows use externalized strings, not hardcoded copy
- ☐ Empty states, error messages, and tooltips are included in translation scope
- ☐ Legal content (terms of service, privacy policy) has a localization and legal review plan
- ☐ Transactional emails (welcome, password reset, invoices) are in the translation pipeline
Marketing and SEO
- ☐ Marketing site supports hreflang tags for localized pages
- ☐ URL structure supports locale prefixes or subdomains (
/de/,de.example.com) - ☐ SEO metadata (title, description) is translated, not just the page body
- ☐ Social sharing metadata (OG tags) is locale-aware
Process Readiness
- ☐ Translation workflow is documented (who requests, who translates, who reviews, who deploys)
- ☐ Glossary of product-specific terms exists for translator reference
- ☐ Context screenshots or descriptions are provided with translation requests
- ☐ Linguistic QA process is defined (in-context review by native speakers)
- ☐ Feedback loop exists for translators to flag ambiguous source strings
Filled Example: SaaS Project Management Tool
Code Readiness Summary
| Area | Status | Notes |
|---|---|---|
| String externalization | In Progress | 82% of UI strings extracted to JSON. 340 hardcoded strings remain in legacy modules. |
| Pluralization | Not Started | Currently uses ternary logic (count === 1 ? "item" : "items"). Need to adopt ICU MessageFormat. |
| Date/number formatting | Complete | Using Intl API throughout. |
| UTF-8 encoding | Complete | Database migrated to utf8mb4 in Q3 2025. |
| Locale detection | In Progress | Browser language detection works. User profile language preference not yet stored. |
| TMS integration | Not Started | Evaluating Crowdin and Lokalise. Decision needed by end of sprint. |
Design Readiness Summary
| Area | Status | Notes |
|---|---|---|
| Text expansion | Partial | Main navigation handles expansion. 14 modals have fixed widths that will break with DE/FR text. |
| RTL support | Not Started | CSS uses physical properties throughout. Estimated 3-week refactor to logical properties. |
| Font stack | Complete | Added Noto Sans CJK and Noto Sans Arabic fallbacks. |
| Images with text | In Progress | 23 onboarding illustrations contain English text. Redesigning as text-free SVGs. |
Priority Actions (Feed Into Sprint Backlog)
- Extract remaining 340 hardcoded strings (2 sprints, assigned to FE team)
- Replace ternary pluralization with ICU MessageFormat (1 sprint)
- Fix 14 fixed-width modals to use flexible sizing (1 sprint)
- Select and integrate TMS (Crowdin vs. Lokalise decision by March 15)
- Add user language preference to profile settings (0.5 sprint)
Key Takeaways
- I18n is the prerequisite for localization. Do not start translating until your codebase is ready
- String externalization is the single biggest task. Audit your codebase early and estimate the effort honestly
- Design for text expansion from the start. German text is 30% longer than English on average
- Use CSS logical properties instead of physical properties to get RTL support for free
- Integrate a TMS before your second language. Spreadsheet-based translation does not scale
About This Template
Created by: Tim Adair
Last Updated: 3/4/2026
Version: 1.0.0
License: Free for personal and commercial use
