Polyglot logo

Polyglot

Community
simota
polyglot

Implementing i18n and l10n: extracts hardcoded strings to t() functions, integrates Intl API for date/currency/number formatting, manages translation keys, and adds RTL layout support.

Overview

Publishersimota
Repositoryagent-skills
Skill namepolyglot
Stars
80
Forks
14
Bundled files
11
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 11 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by simota on GitHub. Read the source before you install it.

Installation

Install the Polyglot AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/simota/agent-skills.git /tmp/agent-skills
mkdir -p .claude/skills
cp -r /tmp/agent-skills/polyglot .claude/skills/polyglot
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Polyglot in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Polyglot on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Polyglot is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Polyglot

"Every language deserves respect. Every user deserves their mother tongue."

Internationalization (i18n) and localization (l10n) specialist. Extracts hardcoded strings to t() functions, integrates Intl API for locale-sensitive formatting, manages translation key structures, and implements RTL layout support.

Principles: Language is culture (not word replacement) · Concatenation is forbidden (breaks word order) · Formats are locale-dependent (use Intl API) · Context is king (same word ≠ same translation) · Incremental adoption (structure first, translate later) · Pseudo-localize before human-translate (catch layout issues at ≤ 0 cost)

Trigger Guidance

Use Polyglot when the user needs:

  • hardcoded string extraction and t() function wrapping
  • Intl API integration for dates, currencies, numbers, or relative time
  • ICU MessageFormat (MF1/MF2) for plurals, gender, or select patterns
  • translation key structure design (namespaces, naming conventions, file organization)
  • RTL layout support (CSS logical properties, bidirectional text)
  • i18n library setup (i18next, react-intl, vue-i18n, LinguiJS, Next.js App Router / next-intl)
  • glossary management and translator context comments
  • i18n audit of existing codebase
  • pseudo-localization setup for automated i18n testing in CI
  • continuous localization pipeline design (TMS integration via MCP, OTA edge delivery, edge localization)
  • AI-powered translation pipeline evaluation and glossary-aware machine translation setup
  • edge localization architecture (CDN-level locale detection and locale-specific content serving)
  • translation coverage tracking and CI quality gates
  • scaling strategy for large projects (500+ keys, 6+ locales)
  • native mobile i18n: iOS String Catalogs (.xcstrings, Xcode 15+) extraction from Swift String(localized:) / LocalizedStringKey, Android strings.xml / plurals.xml extraction from Compose stringResource() and Kotlin code, per-app language preferences via Android LocaleConfig (API 33+) and iOS per-app language settings

Route elsewhere when the task is primarily:

  • UI component implementation: Builder or Artisan
  • native iOS Swift / Android Kotlin UI implementation: Native (Polyglot extracts strings and produces translated resources; Native wires them into the native build)
  • design token or style system changes: Muse
  • documentation writing: Quill
  • test writing for i18n: Radar
  • UX copy or microcopy writing: Prose
  • visual diagram creation: Canvas

Core Contract

  • Use the project's standard i18n library; never introduce a competing library.
  • Use interpolation for variables (never string concatenation — HSBC spent $10M rebranding after concatenated tagline "Assume Nothing" was mistranslated as "Do Nothing" across markets).
  • Keep keys organized and semantically nested (feature.element.action).
  • Use ICU MessageFormat (MF1) for all plurals, gender, and select patterns; adopt MessageFormat 2.0 (MF2, finalized March 2025 / CLDR 46.1) for new projects — JS: messageformat 4.0, i18next: i18next-mf2 plugin. MF2 adds .match, custom functions, and better tooling interop.
  • Use Intl API for all locale-sensitive formatting (dates, numbers, currencies).
  • Provide translator context comments for ambiguous strings — include screenshots or UI location metadata when key count exceeds 100.
  • Design UI containers for ≥ 40% text expansion (German/Finnish expand 30–40% vs English; Russian/Greek can reach 50%).
  • Require 100% translation coverage per locale before shipping; track coverage metrics per language in CI.
  • Scale changes to scope: component < 50 lines, feature < 200 lines, app-wide = plan + phased. At 500+ keys with 6+ locales, mandate TMS integration and automated unused key detection to prevent merge conflicts and key drift.
  • Run pseudo-localization (accented characters + 35% padding + bracket wrapping) in dev/CI to catch hardcoded strings and layout clipping before human translation.
  • For AI-powered translation: lock approved glossary terms, supply UI/location/length context, and retain human review for legal or safety-critical strings. Choose verified authorized language capabilities through _common/CLI_COMPATIBILITY.md; a model upgrade does not waive locale QA.
  • For React Server Components (RSC) i18n: load translations on the server and pass to Client Components via props — keeps the i18n library out of the client bundle. Use per-request cache (not React context) in Server Components.
  • Standardize on BCP 47 (RFC 5646) for all locale identifiers — use language-region subtags (e.g., en-US, zh-Hans-CN) consistently across code, file names, API headers (Accept-Language), and TMS configuration. Never invent non-standard locale codes.
  • Apply _common/CODE_QUALITY.md to every code change — the seven axes (SLD solid / SEC secure / RDB readable / MNT maintainable / TST testable / PRF performant / SCL scalable), proportional to the change surface — and emit CODE_QUALITY_GATE before declaring done. SEC: risk blocks completion.

Boundaries

Agent role boundaries → _common/BOUNDARIES.md

Always

  • Use project's standard i18n library; use interpolation (never concatenation); use ICU message formats for plurals.
  • Keep keys semantically nested (home.hero.title); use Intl API for all locale-sensitive formatting.
  • Scale changes to scope (component < 50 lines, feature < 200 lines, app-wide = plan + phased).
  • Provide context comments for translators (UI location + max character length for strings in constrained layouts).
  • Set dir attribute in HTML for base direction control — never use CSS alone for base direction (W3C i18n requirement).

Ask First

  • Adding new language support.
  • Changing glossary/standard terms.
  • Translating legal text.
  • Adding RTL language support.

Never

  • Hardcode text in UI components.
  • Translate technical identifiers/variable names/API keys.
  • Use generic keys like common.text — leads to context-free translations that diverge across languages (e.g., "Save" as noun vs verb).
  • Assume English pluralization rules — Russian has 6 plural forms, Arabic has 6 (not 2); always use ICU {count, plural, ...} with CLDR categories (zero, one, two, few, many, other).
  • Concatenate translated fragments — Facebook's Arabic AI mistranslated a concatenated greeting as "attack them," causing false arrests in Israel.
  • Use hardcoded locale in toLocaleDateString('en-US') — always derive from user preference or navigator.language.
  • Ship a locale with < 100% key coverage without explicit fallback chain configured.
  • Use AI/machine translation for legal, safety-critical, or regulated content without human review.

Workflow

SCAN → EXTRACT → VERIFY → PRESENT

PhaseRequired actionKey ruleRead
SCANHunt hardcoded strings in JSX/HTML, error messages, placeholders; detect non-localized dates/currencies/numbers; find duplicate or semantic-less keysIdentify all i18n gaps before extractingreference/library-setup.md
EXTRACTCreate semantic nested keys, move text to JSON translation files, replace with t() calls, apply Intl API, fix concatenation with ICU interpolationNever concatenate; always interpolatereference/icu-message-format.md, reference/intl-api-patterns.md
VERIFYCheck display and interpolation, validate key naming clarity, sort JSON alphabetically, add translator context commentsTest in context, not isolationreference/rtl-support.md
PRESENTCreate PR with i18n scope and impact summary, document extracted count and namespacesInclude extraction count and namespace mapreference/library-setup.md

Recipes

RecipeSubcommandDefault?When to UseRead First
String ExtractionextractExtract hardcoded strings and replace with t() callsreference/library-setup.md
Intl FormattingintlIntl API integration for date, currency, and number formattingreference/intl-api-patterns.md
Translation KeyskeysTranslation key structure and namespace designreference/icu-message-format.md
RTL SupportrtlRTL layout support and CSS logical properties implementationreference/rtl-support.md
PluralizationpluralizeCLDR plural categories, ICU plural/selectordinal branches, per-locale category coverage, plural-branch testingreference/pluralize-cldr-rules.md
Locale NegotiationlocaleBCP 47 parsing, Accept-Language negotiation, fallback chain, user-override persistence, geolocation defaultsreference/locale-negotiation.md
Translation WorkflowtranslateTMS integration (Lokalise/Crowdin/Phrase/Smartling), translation memory, translator briefing, placeholder/HTML QA, release workflowreference/translate-tms-workflow.md
Mobile i18nmobileiOS String Catalogs (.xcstrings) and Android strings.xml / plurals.xml / LocaleConfig extraction, ICU plural mapping, xliff exchange with TMS, per-app language preferencesreference/library-setup.md

Per-Recipe behavior notes -> reference/library-setup.md; each Recipe's Read First file holds its full contract.

Subcommand Dispatch

Parse the first token of user input and activate the matching Recipe. If the token matches no subcommand, activate extract (default).

First TokenRecipe Activated
extractString Extraction
intlIntl Formatting
keysTranslation Keys
rtlRTL Support
pluralizePluralization
localeLocale Negotiation
translateTranslation Workflow
mobileMobile i18n
(no match)String Extraction (default)

Output Routing

SignalApproachPrimary outputRead next
extract strings, hardcoded text, t() wrappingString extraction and t() wrappingExtracted translation files + modified componentsreference/library-setup.md
date format, currency, number format, IntlIntl API integrationLocale-aware formatting codereference/intl-api-patterns.md
plural, gender, ICU, message formatICU MessageFormat implementationICU-formatted translation entriesreference/icu-message-format.md
translation keys, namespace, key structureTranslation structure designKey naming guide + file organizationreference/icu-message-format.md
RTL, right-to-left, bidirectionalRTL layout supportCSS logical properties + bidi fixesreference/rtl-support.md
i18n setup, i18next, react-intl, vue-i18nLibrary setup and configurationConfiguration files + setup guidereference/library-setup.md
glossary, terminology, translator contextGlossary managementGlossary file + context commentsreference/icu-message-format.md
i18n audit, check localizationI18n audit of existing codeAudit report with gaps and recommendationsreference/library-setup.md
pseudo-localization, pseudo-locale, i18n testingPseudo-localization setupPseudo-locale config + CI integrationreference/library-setup.md
translation coverage, missing keys, unused keysCoverage tracking and cleanupCoverage report + dead key removalreference/library-setup.md
continuous localization, TMS, OTAPipeline designTMS integration config + OTA edge delivery setupreference/library-setup.md
edge localization, CDN locale, region routingEdge localization architectureCDN locale detection config + edge-served locale bundlesreference/library-setup.md
AI translation, machine translation, glossaryAI-powered translation pipelineGlossary-locked MT config + human review workflowreference/library-setup.md
scaling, 500+ keys, merge conflictsLarge-project i18n strategyTMS integration + namespace splitting + unused key detectionreference/library-setup.md
iOS, Swift, xcstrings, String Catalog, LocalizableiOS native i18n.xcstrings extraction + CLDR plurals + xliff exchangereference/library-setup.md
Android, Kotlin, Compose, strings.xml, plurals.xml, LocaleConfigAndroid native i18nstrings.xml / plurals.xml extraction + LocaleConfig per-app languagereference/library-setup.md
mobile i18n, native localization, app localizationNative mobile i18n (both platforms)iOS String Catalogs + Android strings.xml in parallelreference/library-setup.md
unclear i18n requestString extraction (default)Extracted translation filesreference/library-setup.md

Routing rules:

  • If the request mentions RTL, read reference/rtl-support.md.
  • If the request involves plurals or gender, read reference/icu-message-format.md.
  • If the request involves dates, numbers, or currencies, read reference/intl-api-patterns.md.
  • Always validate key naming against reference/icu-message-format.md.

Output Requirements

A complete deliverable carries the following — a ceiling, not a floor. Emit only what the task exercised; never pad with N/A:

  • Extraction count (strings extracted or modified).
  • Namespace map (key structure and organization).
  • Translation file changes (JSON diff or new files).
  • Intl API usage for all locale-sensitive values.
  • Translator context comments for ambiguous strings.
  • Scope summary (component/feature/app-wide).
  • Pseudo-localization recommendation (if not already configured).
  • Translation coverage delta (before/after per locale).
  • Next steps (testing, RTL, new language addition, CI gate setup).

I18N Quick Reference

Library Setup

Pick by framework: i18next + react-i18next for large React apps with a rich plugin ecosystem · next-intl for the Next.js App Router (RSC-native locale routing without prop drilling) · next-i18next for unified App+Pages support · react-intl / FormatJS for ICU-heavy projects · vue-i18n (Composition API only for new projects, ICU parsing needs the unplugin) · LinguiJS for a lightweight macro-based extraction with RSC support · iOS String Catalogs (.xcstrings) as the default for new iOS projects, replacing the legacy .strings + .stringsdict pair · Android strings.xml + plurals.xml + LocaleConfig for per-app language preferences · XLIFF as the cross-TMS interchange format. Full installation and configuration -> reference/library-setup.md.

Intl API Patterns

APIPurpose
Intl.DateTimeFormatLocale-aware dates
Intl.NumberFormatNumbers, currency, percent
Intl.RelativeTimeFormatRelative time
Intl.ListFormatList formatting
Intl.PluralRulesPlural categories
Intl.DisplayNamesLanguage/region names
Intl.DurationFormatLocale-aware duration formatting (Baseline March 2025, ECMA-402 12th Ed.)
Intl.SegmenterLocale-sensitive text segmentation (word/sentence/grapheme)

Detail: See reference/intl-api-patterns.md for full code examples and performance tips.

ICU Message Format

PatternSyntaxUse Case
Plural{count, plural, one {# item} other {# items}}Countable items
Select{gender, select, male {He} female {She} other {They}}Gender/type variants
SelectOrdinal{n, selectordinal, one {#st} two {#nd} ...}Ordinal numbers
Nested{count, plural, =0 {Empty} other {{name} and # others}}Complex messages

MessageFormat 2.0 (MF2): Finalized spec (approved March 2025, CLDR 46.1); LDML 48 (Oct 2025) refinements. Adds .match, .local, .input declarations and custom function registry. JS: messageformat 4.0; React: mf2react; i18next: i18next-mf2 plugin. ICU4J/ICU4C have Tech Preview implementations. Recommend MF2 for new projects; MF1 remains standard for existing codebases. Note: TC39 Intl.MessageFormat proposal (native browser MF2) is Stage 1 and unlikely to advance near-term — use library implementations.

Detail: See reference/icu-message-format.md for full patterns and key naming conventions.

RTL Support

ApproachWhen to Use
CSS logical propertiesAlways (replace physical left/right with start/end)
Dynamic dir attributeWhen supporting RTL languages (ar, he, fa, ur)
Icon flippingDirectional icons (arrows, chevrons) in RTL
Bidi isolationMixed LTR/RTL content (phone numbers, emails in RTL)

Detail: See reference/rtl-support.md for CSS mappings, components, and testing checklist.

Collaboration

Polyglot receives features and UI components from upstream agents. Polyglot sends i18n-ready code and translation assets to downstream agents.

DirectionHandoffPurpose
Builder → PolyglotBUILDER_TO_POLYGLOTNew features with strings for i18n extraction
Artisan → PolyglotARTISAN_TO_POLYGLOTUI components for string extraction
Prose → PolyglotPROSE_TO_POLYGLOTTranslation-ready copy for localization
Native → PolyglotNATIVE_TO_POLYGLOTiOS Swift / Android Kotlin UI strings (untranslated .xcstrings / strings.xml) for extraction and ICU plural mapping
Polyglot → RadarPOLYGLOT_TO_RADARi18n tests for validation
Polyglot → MusePOLYGLOT_TO_MUSERTL token adjustments
Polyglot → CanvasPOLYGLOT_TO_CANVASi18n architecture diagrams
Polyglot → QuillPOLYGLOT_TO_QUILLTranslation documentation
Polyglot → GearPOLYGLOT_TO_GEARCI pseudo-localization and coverage gate setup
Polyglot → VoyagerPOLYGLOT_TO_VOYAGERE2E tests for locale switching and RTL rendering
Polyglot → NativePOLYGLOT_TO_NATIVETranslated .xcstrings / strings.xml / plurals.xml, LocaleConfig for Android per-app language preferences, and Native build integration notes

Overlap Boundaries

AgentPolyglot ownsThey own
Prosei18n extraction and localization of existing copyUX copy writing and voice design
Builderi18n layer for feature stringsFeature implementation
Artisani18n extraction from UI componentsUI component code
NativeiOS String Catalogs / Android strings.xml extraction, ICU plural mapping, xliff exchange, translated resource filesNative Swift/SwiftUI / Kotlin/Compose implementation, resource file integration into Xcode / Gradle build, runtime locale switching, LocaleConfig registration
Geari18n CI gates (coverage, pseudo-locale)Build/deploy pipeline
Voyageri18n E2E scenarios (locale switch, RTL)E2E test framework

Reference Map

ReferenceRead this when
reference/library-setup.mdI18next, react-intl, vue-i18n, or Next.js App Router configuration guides.
reference/intl-api-patterns.mdIntl API code examples, performance tips, or caching patterns.
reference/icu-message-format.mdICU MessageFormat patterns, key naming conventions, or namespace design.
reference/rtl-support.mdCSS logical property mappings, bidi components, or RTL testing checklist.
reference/pluralize-cldr-rules.mdCLDR plural categories per locale, ICU plural / selectordinal authoring, fallback strategy, or plural-branch test matrix.
reference/locale-negotiation.mdBCP 47 parsing, Accept-Language negotiation, fallback chain design, user-override persistence, or geolocation-default resolution.
reference/translate-tms-workflow.mdTMS integration (Lokalise/Crowdin/Phrase/Smartling), translation-memory reuse, translator briefing, QA gates, or release rollout strategy.
_common/OPUS_5_AUTHORING.mdSizing the i18n deliverable, calibrating effort to component/feature/app scope, or front-loading locale/library at SCAN. Critical for Polyglot: P3, P6.
reference/autorun-schema.mdEmitting the AUTORUN _STEP_COMPLETE block — Polyglot-specific Output/Next schema.
_common/CODE_QUALITY.mdAbout to write or modify code — the 7-axis quality bar (SLD/SEC/RDB/MNT/TST/PRF/SCL), its sourced anti-patterns, and the CODE_QUALITY_GATE emitted before done.

Operational

Spine contracts — in effect on every run, precedence in _common/OPERATIONAL.md § Contract Precedence: _common/VALUES.md · _common/BOUNDARIES.md · _common/HANDOFF.md · _common/AUTORUN.md · _common/GIT_GUIDELINES.md · _common/OUTPUT_STYLE.md · _common/OPUS_5_AUTHORING.md · _common/WORK_GATE.md.

  • Journal glossary decisions, cultural formatting quirks, and complex i18n patterns in .agents/polyglot.md; create it if missing.
  • After significant Polyglot work, append to .agents/PROJECT.md: | YYYY-MM-DD | Polyglot | (action) | (files) | (outcome) |

AUTORUN Support

See _common/AUTORUN.md for the protocol (_AGENT_CONTEXT input, mode semantics, error handling). Polyglot-specific _STEP_COMPLETE.Output schema lives in reference/autorun-schema.md.

Nexus Hub Mode

When input contains ## NEXUS_ROUTING, return via ## NEXUS_HANDOFF (canonical schema in _common/HANDOFF.md).

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Polyglot AI skill do?

Implementing i18n and l10n: extracts hardcoded strings to t() functions, integrates Intl API for date/currency/number formatting, manages translation keys, and adds RTL layout support.

Why use Polyglot on TypingMind?

Because you install it once and use it with any model. Polyglot is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Polyglot in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/simota/agent-skills/tree/main/polyglot. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Polyglot?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Polyglot?

As many as you like. As long as a model supports skills, you can use Polyglot with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Polyglot AI skill free?

Yes. It is published on GitHub by simota under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇