Localization
CLDR-based Agent Skill for formatting currency, dates, numbers, units, and addresses across 20+ locales. Works with Cursor, Claude Code, and Codex.
npx -y skills add ikhattab/l10n-skill --skill localizationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use this skill whenever a task involves locale-aware formatting, validation, or display of any of the following: currency (symbol position, decimal/thousands separators), dates and times (order, separators, 12/24h), numbers (grouping, decimal mark), units of measurement (metric/imperial/regional), or addresses and phone numbers (field order, postal code format). Trigger on any of: "format for [locale/country]", "localize this", "how is X written in Y", "is this format correct for Z", "display price/date/address for [country]", or whenever user-facing content needs adapting to a specific region or locale code (e.g. de-DE, fr-CA, ja-JP). Also trigger when validating or fixing existing formatted values, generating locale-aware code snippets, or explaining regional formatting differences.
SKILL.md
7.8 KB, as published. Nobody here has run it
Localization Skill
Helps AI agents correctly format, validate, and explain locale-specific conventions for currency, dates, numbers, units of measurement, and addresses — based on Unicode CLDR standards and real postal/regulatory rules.
Workflow
-
Identify the locale — Use a BCP 47 locale tag when possible (e.g.
de-DE,fr-CA,pt-BR). If only a country name is given, infer the primary locale. If ambiguous (e.g. "Canada"), ask: English or French? -
Identify the domain(s) — What needs formatting/validating?
- Currency → read
references/currency.md - Date / Time → read
references/datetime.md - Numbers → read
references/numbers.md - Units of measurement → read
references/units.md - Address / Phone → read
references/addresses.md
- Currency → read
-
Apply rules — Use the locale data to:
- Format: produce a correctly formatted string from raw values
- Validate: check whether an existing formatted value matches the locale's conventions
- Fix: reformat an incorrectly formatted value
- Explain: describe the difference between two locales
-
Output — Respond with the formatted result + a brief note on the rule applied (so the human or downstream agent can understand why, not just what).
Quick-Reference: Most Common Locales
For full data including edge cases, separators, and address templates, always consult the relevant reference file.
Currency (symbol position · decimal · thousands)
| Locale | Country | Example | Symbol | Decimal | Thousands |
|---|---|---|---|---|---|
| en-US | USA | $1,234.56 | before | . | , |
| en-GB | UK | £1,234.56 | before | . | , |
| de-DE | Germany | 1.234,56 € | after | , | . |
| nl-NL | Netherlands | € 1.234,56 | before | , | . |
| fr-FR | France | 1 234,56 € | after | , | (nb) |
| fr-CA | Canada (FR) | 1 234,56 $ | after | , | (nb) |
| es-ES | Spain | 1.234,56 € | after | , | . |
| pt-BR | Brazil | R$ 1.234,56 | before | , | . |
| ru-RU | Russia | 1 234,56 ₽ | after | , | (nb) |
| tr-TR | Turkey | ₺1.234,56 | before | , | . |
| ja-JP | Japan | ¥1,234 | before | — | , |
| zh-CN | China | ¥1,234.56 | before | . | , |
| ko-KR | South Korea | ₩1,234 | before | — | , |
| hi-IN | India | ₹12,34,567.00 | before | . | lakh |
| ar-SA | Saudi Arabia | 1,234.56 ر.س | after | . | , |
(nb) = narrow no-break space U+202F
Date format (short numeric)
| Locale | Format | Example | Time |
|---|---|---|---|
| en-US | M/D/YYYY | 6/5/2026 | 12 h |
| en-GB | DD/MM/YYYY | 05/06/2026 | 24 h |
| de-DE | DD.MM.YYYY | 05.06.2026 | 24 h |
| nl-NL | DD-MM-YYYY | 05-06-2026 | 24 h |
| fr-FR | DD/MM/YYYY | 05/06/2026 | 24 h |
| es-ES | DD/MM/YYYY | 05/06/2026 | 24 h |
| pt-BR | DD/MM/YYYY | 05/06/2026 | 24 h |
| ru-RU | DD.MM.YYYY | 05.06.2026 | 24 h |
| ja-JP | YYYY/MM/DD | 2026/06/05 | 24 h |
| zh-CN | YYYY/M/D | 2026/6/5 | 24 h |
| ko-KR | YYYY.MM.DD | 2026.06.05 | 24 h |
| ar-SA | DD/MM/YYYY | 05/06/2026 | 12 h |
Measurement system
| Region | Distance | Temperature | Weight | Volume |
|---|---|---|---|---|
| USA | miles | °F | lb/oz | fl oz / gal |
| UK | miles* | °C | kg / st | pints (beer), liters (fuel) |
| Canada | km | °C | kg | liters |
| Most of world | km | °C | kg | liters |
| Myanmar / Liberia | mixed | °C | mixed | mixed |
*UK uses miles for road signs but km in most other contexts
Common Pitfalls to Catch
- Germany vs Netherlands: both use EUR but symbol position is opposite
- France/Russia: thousands separator is narrow no-break space (U+202F), not a regular space
- India: uses lakh/crore grouping —
12,34,567not1,234,567 - Japan/Korea: no decimal places for native currencies (¥, ₩)
- US date 06/05: means June 5th — in Europe it means May 6th
- UK mixed units: road distances in miles, most other distances in km; both °C and stones/pounds coexist
- Brazil currency:
R$with a space before the number — notR$1.234, it'sR$ 1.234 - Japanese address order: reversed from Western — starts with postal code → prefecture → city → ward → block → building → recipient name
Reference Files
Load these on-demand based on which domain(s) apply:
| Domain | File | When to read |
|---|---|---|
| Currency | references/currency.md | Formatting prices, invoice amounts, currency input fields |
| Date & Time | references/datetime.md | Displaying or parsing dates, timestamps, durations |
| Numbers | references/numbers.md | Non-currency numbers, percentages, large numbers |
| Units | references/units.md | Distances, temperatures, weights, volumes |
| Addresses | references/addresses.md | Address forms, mailing labels, postal validation |
Output Format Guidelines
When formatting for agents / downstream use:
Locale: de-DE
Domain: currency
Input: 1234.56 EUR
Output: 1.234,56 €
Rule: Symbol after amount with space; comma decimal separator; dot thousands separator
When explaining differences for humans:
In Germany (de-DE), the euro sign comes after the number with a space:
1.234,56 €. In the Netherlands (nl-NL), the same amount is written with the euro sign before:€ 1.234,56. Both use a comma as the decimal separator and a dot for thousands.
When generating code, prefer using the platform's built-in i18n APIs:
- JS/TS:
Intl.NumberFormat,Intl.DateTimeFormat - Python:
babellibrary orlocalemodule - Java/Kotlin:
java.text.NumberFormat,java.time.format.DateTimeFormatter - Swift:
NumberFormatter,DateFormatterwith.locale
Attribution
Inspired by @MostafaNageeb, who pointed out that trivial-looking formatting differences — like the € sign coming after the number in Germany (14 €) but before in the Netherlands (€ 14) — have a real impact on user trust. These details feel minor until a user notices them.