Install
$ agentstack add skill-ikhattab-l10n-skill-localization ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
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
- 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.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: ikhattab
- Source: ikhattab/l10n-skill
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.