i18n-rtl-l10n

i18n-rtl-l10n is a skill for Claude Code from zakariaf/Flutter-Skills. It costs 225 tokens per session (4,781 once invoked), scanned C, original, MIT.

A set of rules for translating Flutter apps and supporting right-to-left languages such as Arabic, Hebrew, and Persian. It defines how text, numbers, dates, layouts, icons, and text direction are handled.

In plain words
What is it for?
Use it when adding locales, translating interface strings, formatting values, supporting Arabic-script languages, or checking bidirectional layouts.
Why use it?
It prevents hardcoded text, missing translations, broken plural forms, and layouts that fail to mirror correctly in right-to-left languages.

Skill for Claude Code

Written for Claude Code: shipped in a Claude Code plugin.

Part of the flutter plugin — 40 skills shipped together

Good fit Use it when adding locales, translating interface strings, formatting values, supporting Arabic-script languages, or checking bidirectional layouts.

Compare 6 skills from other repositories ↓
Install with agentmods
npx agentmods add skills/zakariaf/flutter-skills/i18n-rtl-l10n
Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

Any agent
npx skills add zakariaf/Flutter-Skills --skill i18n-rtl-l10n
Clone the repo
git clone --depth 1 https://github.com/zakariaf/Flutter-Skills

Made for: Claude Code.

Or install flutter, the plugin that ships this one along with the rest of its 40 skills.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for i18n-rtl-l10n

README.md
[![agentmods](https://agentmods.dev/badge/skills/zakariaf/flutter-skills/i18n-rtl-l10n/github.svg)](https://agentmods.dev/skills/zakariaf/flutter-skills/i18n-rtl-l10n)
Your own site
<a href="https://agentmods.dev/skills/zakariaf/flutter-skills/i18n-rtl-l10n"><img src="https://agentmods.dev/badge/skills/zakariaf/flutter-skills/i18n-rtl-l10n/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for i18n-rtl-l10n

Your own site · 80×15
<a href="https://agentmods.dev/skills/zakariaf/flutter-skills/i18n-rtl-l10n"><img src="https://agentmods.dev/badge/skills/zakariaf/flutter-skills/i18n-rtl-l10n.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 225 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 4,781 The whole file, excluding the scripts and references it only reads on demand.
Security scan C 1 finding. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00225 $0.04781
Opus 5 $0.00112 $0.02390
Sonnet 5 $0.00045 $0.00956
Haiku 4.5 $0.00022 $0.00478

Measured 11d ago against content hash 3281449560aa, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-11, from the pricing page.

Security

Grade C, and why

i18n-rtl-l10n scanned grade C with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.

The scan reads SKILL.md. This mod also ships 2 executable files (scripts/check_arb_parity.sh, scripts/check_i18n_bans.sh), listed below but not scanned — reading those needs a real analyzer, not pattern matching.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Hidden instructionshighPrompt injection

Directives inside HTML comments, invisible characters or bidirectional overrides are read by the model and not by the person reviewing the file.

const _lri = '⁦'; // LEFT-TO-RIGHT ISOLATE
skills/i18n-rtl-l10n/SKILL.md · 303 lines

How it starts

The opening of the file, as written. The whole thing — 303 lines — stays where its author put it; the contents beside it link to each section on GitHub.

i18n, RTL & Localization

One contract: store canonical, localize at render. Every conversion and formatting lives in one l10n layer; feature widgets receive value objects and already-localized strings, never raw formatting logic. RTL is a layout discipline, not a translation task — author with logical geometry so it mirrors by construction. Applies to any app that ships more than one locale or any RTL locale (Arabic, Persian, Hebrew, Sorani Kurdish, Urdu).

Read the reference for the task at hand:

  • references/arb-and-icu.md — the ARB add/translate workflow, l10n.yaml, ICU plural/select, placeholder typing.
  • references/rtl-and-bidi.md — the directional-geometry allow/ban table, icon mirroring, bidi isolation, CustomPainter pinned LTR, RTL charts.
  • references/numerals-and-calendars.md — digit systems, separator traps, format/parse, calendar projection.
  • references/unsupported-locales.md — shipping a locale flutter_localizations has no data for: the probe, the vendored delegate trio, delegate ordering, font coverage.

Run scripts/check_arb_parity.sh and scripts/check_i18n_bans.sh before a PR.

Non-negotiable rules

  1. Every user-facing string goes through gen-l10n. Add the key to the template app_en.arb first, then read it via AppLocalizations.of(context). Set nullable-getter: false in l10n.yaml so the getter is non-null and a missing/typo key is a compile error, not a silent empty widget. Never hardcode a literal in Text, tooltip:, label:, hint:, or semanticsLabel:. Never call AppLocalizations.of above the Localizations scope (e.g. in main() before runApp).
  2. Key + placeholder parity across all locales. A key present in the template but missing in a locale silently ships the template language; a renamed placeholder breaks that translation at runtime. Keep every key and every {placeholder} name identical — check_arb_parity.sh gates it.
  3. Build sentences and plurals with ICU, never concatenation. Use {count, plural, ...} and {x, select, ...} in the ARB. Word order and plural categories differ per language (Arabic has six CLDR forms: zero/one/two/few/many/other). Concatenation produces grammatically wrong output and can't survive RTL reordering.
  4. Direction is a locale consequence, never hardcoded. Wire localizationsDelegates + supportedLocales on MaterialApp and drive the active locale from state. A root Directionality(TextDirection.rtl) hides physical-side bugs and breaks LTR islands. RTL follows the resolved locale via GlobalWidgetsLocalizations with zero per-widget code — but only for locales flutter_localizations actually ships (rule 10). For any other, direction silently falls back to LTR. Assert Directionality.of per locale rather than assuming.
  5. Directional-only geometry from the first commit. Use EdgeInsetsDirectional, AlignmentDirectional, PositionedDirectional, TextAlign.start/end, MainAxisAlignment.start/end, BorderRadiusDirectional, Icons.adaptive.*. Never EdgeInsets.only(left/right), Alignment.centerLeft/Right, Positioned(left/right:), TextAlign.left/right, or Icons.arrow_back. A grep gate rejects the PR.
  6. Store canonical: UTC epoch + ASCII digits. Persist dateTime.toUtc().millisecondsSinceEpoch and Western/Latin digits. Calendars and numeral systems are pure display projections. Schedule off the epoch/DateTime, never off Jalali/Hijri arithmetic — leap/month-length quirks stay calendar-independent.
  7. Normalize every numeric input to ASCII before parse or storage — digits AND separators. Use double.parse(normalizeToAscii(text)); never int.parse(text) on raw input (a Persian/Arabic soft keyboard yields ۱۲۳ / ١٢٣ and 1٫5).
  8. Isolate strong-LTR technical runs (account/order/reference numbers, phone, email, URL, product codes) with one FSI/PDI helper at the view layer only. Never let isolate characters (U+2066U+2069) reach storage, search, or export — strip at the boundary.
  9. Bundle fonts that cover your scripts, with fallback; no runtime font fetch. Set a theme fontFamily plus fontFamilyFallback so Arabic/Persian glyphs never tofu. Avoid google_fonts in an offline/no-telemetry app — it fetches at runtime. Prove coverage from the font's own cmap, not a specimen: script coverage is not language coverage — a face that draws Persian can be missing the seven letters Sorani adds, and a specimen set in Arabic never shows it.
  10. A locale flutter_localizations does not ship needs three vendored delegates, ordered first. gen-l10n localizes your strings; Flutter's own chrome and the ambient TextDirection come from a different catalog. Vendor MaterialLocalizations, CupertinoLocalizations and WidgetsLocalizations borrowing a script neighbour, each claiming only that language code, and place them ahead of the Global* delegates — which AppLocalizations.localizationsDelegates already contains. WHY: the missing Material delegate asserts on the first Tooltip, and the Widgets fallback claims every locale while hardcoding TextDirection.ltr, so fixing only the Material half yields an RTL app that reads backwards and never crashes. See references/unsupported-locales.md.

Read the full file on GitHub · 303 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 11d ago First seen · 303 lines · 225 tokens per session scan C 3281449560aa

Subscribe to this mod's changes

i18n-rtl-l10n is a skill published in the GitHub repository zakariaf/Flutter-Skills (2 stars, last pushed 13d ago), licensed MIT. It adds 225 tokens to every session and 4,781 once invoked, about $0.0011 per session on Opus 5. A static security scan graded it C with 1 finding (hidden instructions). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.

Related

Other skills, from other repositories

internationalization

Best practices for internationalization (i18n) and localization (l10n) in Flutter, using the built-in flutterlocalizations and intl setup with ARB files as the single source of truth. Use when adding, modifying, or reviewing ARB translations, locale setup (l10n.yaml, generate: true in pubspec.yaml, flutter gen-l10n…

VeryGoodOpenSource/vgv-ai-flutter-plugin · 143 tokens

android-resources

Organize Android strings, drawables, fonts, themes, localization, and concrete resource-backed Compose values such as MaterialTheme colors. Use for resource declarations and their direct UI lookup; defer design-system token architecture, network image loading, lint-rule configuration, and general Compose…

HoangNguyen0403/agent-skills-standard · 59 tokens

guide-recap

Transform CHANGELOG entries into social content (LinkedIn, Twitter/X, Newsletter, Slack) in FR + EN. Use after releases or weekly to generate ready-to-post content from guide updates.

FlorianBruniaux/claude-code-ultimate-guide · 42 tokens

keyboard-layout-decoder

Decode garbled Russian/English wrong-keyboard-layout text (ЙЦУКЕН/QWERTY).

dannote/dot-pi · 27 tokens

ecom-multilingual-listing

Optimize multilingual product listings for international e-commerce including SEO localization, machine translation workflows, and cultural adaptation. Use this skill when the user needs to create product listings in multiple languages, optimize for local search, or adapt marketing content for different markets — even…

asgard-ai-platform/skills · 87 tokens

ecom-sea-strategy

Develop e-commerce strategy for Southeast Asian markets including platform selection, payment infrastructure, logistics challenges, and localization requirements. Use this skill when the user is expanding e-commerce to SEA, evaluating Shopee vs Lazada vs Tokopedia, or needs to understand SEA market differences — even…

asgard-ai-platform/skills · 90 tokens