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.
npx skills add zakariaf/Flutter-Skills --skill i18n-rtl-l10ngit clone --depth 1 https://github.com/zakariaf/Flutter-SkillsWrote 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.
[](https://agentmods.dev/skills/zakariaf/flutter-skills/i18n-rtl-l10n)<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.
<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>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.
| Model | Per session | Once 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 |
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.
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 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 localeflutter_localizationshas 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
- Every user-facing string goes through gen-l10n. Add the key to the template
app_en.arbfirst, then read it viaAppLocalizations.of(context). Setnullable-getter: falseinl10n.yamlso the getter is non-null and a missing/typo key is a compile error, not a silent empty widget. Never hardcode a literal inText,tooltip:,label:,hint:, orsemanticsLabel:. Never callAppLocalizations.ofabove theLocalizationsscope (e.g. inmain()beforerunApp). - 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.shgates it. - 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. - Direction is a locale consequence, never hardcoded. Wire
localizationsDelegates+supportedLocalesonMaterialAppand drive the active locale from state. A rootDirectionality(TextDirection.rtl)hides physical-side bugs and breaks LTR islands. RTL follows the resolved locale viaGlobalWidgetsLocalizationswith zero per-widget code — but only for localesflutter_localizationsactually ships (rule 10). For any other, direction silently falls back to LTR. AssertDirectionality.ofper locale rather than assuming. - Directional-only geometry from the first commit. Use
EdgeInsetsDirectional,AlignmentDirectional,PositionedDirectional,TextAlign.start/end,MainAxisAlignment.start/end,BorderRadiusDirectional,Icons.adaptive.*. NeverEdgeInsets.only(left/right),Alignment.centerLeft/Right,Positioned(left/right:),TextAlign.left/right, orIcons.arrow_back. A grep gate rejects the PR. - Store canonical: UTC epoch + ASCII digits. Persist
dateTime.toUtc().millisecondsSinceEpochand 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. - Normalize every numeric input to ASCII before parse or storage — digits AND separators. Use
double.parse(normalizeToAscii(text)); neverint.parse(text)on raw input (a Persian/Arabic soft keyboard yields۱۲۳/١٢٣and1٫5). - 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+2066–U+2069) reach storage, search, or export — strip at the boundary. - Bundle fonts that cover your scripts, with fallback; no runtime font fetch. Set a theme
fontFamilyplusfontFamilyFallbackso Arabic/Persian glyphs never tofu. Avoidgoogle_fontsin an offline/no-telemetry app — it fetches at runtime. Prove coverage from the font's owncmap, 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. - A locale
flutter_localizationsdoes not ship needs three vendored delegates, ordered first. gen-l10n localizes your strings; Flutter's own chrome and the ambientTextDirectioncome from a different catalog. VendorMaterialLocalizations,CupertinoLocalizationsandWidgetsLocalizationsborrowing a script neighbour, each claiming only that language code, and place them ahead of theGlobal*delegates — whichAppLocalizations.localizationsDelegatesalready contains. WHY: the missing Material delegate asserts on the firstTooltip, and the Widgets fallback claims every locale while hardcodingTextDirection.ltr, so fixing only the Material half yields an RTL app that reads backwards and never crashes. Seereferences/unsupported-locales.md.
What ships with it
9 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
- examples/directional_widget.dart 3.8 KB
- examples/numeral_normalizer.dart 3.8 KB
- examples/unsupported_locale_delegates.dart 6.7 KB
- references/arb-and-icu.md 6.4 KB
- references/numerals-and-calendars.md 7.0 KB
- references/rtl-and-bidi.md 6.4 KB
- references/unsupported-locales.md 9.7 KB
- scripts/check_arb_parity.sh 2.9 KB runs code
- scripts/check_i18n_bans.sh 2.4 KB runs code
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.
- 11d ago First seen · 303 lines · 225 tokens per session scan C 3281449560aa
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.
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…
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…
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.
keyboard-layout-decoder
Decode garbled Russian/English wrong-keyboard-layout text (ЙЦУКЕН/QWERTY).
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…
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…