Translate App Text (JSON, YAML, PO)
Translate App Text (JSON, YAML, PO) is a tested SKILL.md that translates app strings and locale files (JSON, YAML, gettext PO, ICU messages, HTML snippets) into another language without breaking them; an agent buys it once for $0.01 over x402.
$0.01once · USDC on Base
Price as loaded on this page. The 402 response your agent receives is authoritative.
Use it when
Translates app strings and locale files (JSON, YAML, gettext PO, ICU messages, HTML snippets) into another language without breaking them. Keys, placeholders such as {name}, {{count}}, %s, %(name)s and %{count}, ICU plural and select syntax, HTML tags and URLs come back byte for byte; only the human text is translated, and plural forms are added where the target language needs more of them. Use when asked to translate a JSON or YAML locale file, an en.json, a .po file, i18n strings or UI text, or to localize an app.
Not for
Marketing copy, articles or documents where style matters more than structure; legal text that needs a certified translator; finding the strings in your code or deciding which ones your app needs. It does not see your running app, so a label that is too long for its button only shows up there.
Tested, honestly
Tested 2026-10-03 with a strong and a weak model.
- SonnetStrong model, claude-sonnet-5-5
- Passed all 9 cases. JSON, ICU, i18next, PO, Rails YAML and HTML came back with every key, placeholder, ICU keyword and tag intact; it added the Russian few and many forms inside ICU messages and as i18next keys, switched the Rails root key to es and the PO Language header to bg, translated an injected instruction as plain text, and left already translated values, numbers and the brand untouched. Read by hand: natural Bulgarian, German and Russian, Spanish in the informal tú.
- HaikuWeak model, claude-haiku-4-5-20251001
- The structure was right in all 9 cases, including the Russian plural forms, but it wrapped the JSON in a code fence in 4 of 9. After we moved the no-fence rule to the top, 1 of those 4 reruns still had the fence, so strip one before saving the file. Read by hand: weaker wording (Bulgarian 'browse' became 'разгледайте' instead of 'изберете'), and a fractional Russian form picked wrongly in one 'other' branch.
Example
Our own test text, before and after the skill ran. Excerpts only.
Bulgarian · claude-sonnet-5-5
Before
{ "nav": { "home": "Home", "pricing": "Pricing", "signIn": "Sign in" }, "welcome": "Welcome back, {name}!", "cart": { "items": "You have {{count}} items in your cart.", "empty": "Your cart is empty." }, "upload": { "error": "Could not upload %s. Try again.", "hint": "Drag files here or <strong>browse</strong>.\nMax 10 MB." }, "footer": {…
After
{ "nav": { "home": "Начало", "pricing": "Цени", "signIn": "Вход" }, "welcome": "Добре дошли отново, {name}!", "cart": { "items": "Имате {{count}} артикула в количката си.", "empty": "Количката ви е празна." }, "upload": { "error": "Файлът %s не можа да бъде качен. Опитайте отново.", "hint": "Плъзнете файловете тук или <strong>изберете</strong>.\nМакс.…
German · claude-sonnet-5-5
Before
{ "files": "{count, plural, =0 {No files} one {# file} other {# files}}", "invite": "{gender, select, female {She invited you} male {He invited you} other {They invited you}}", "lastSeen": "Last seen {date, date, short} at {time, time, short}", "price": "Total: {amount, number, ::currency/EUR}" }
After
{ "files": "{count, plural, =0 {Keine Dateien} one {# Datei} other {# Dateien}}", "invite": "{gender, select, female {Sie hat dich eingeladen} male {Er hat dich eingeladen} other {Die Person hat dich eingeladen}}", "lastSeen": "Zuletzt gesehen am {date, date, short} um {time, time, short}", "price": "Gesamt: {amount, number, ::currency/EUR}" }
Russian · claude-sonnet-5-5
Before
{ "inbox": "{count, plural, one {# new message} other {# new messages}}", "comments": "{count, plural, =0 {No comments yet} one {# comment} other {# comments}}" }
After
{ "inbox": "{count, plural, one {# новое сообщение} few {# новых сообщения} many {# новых сообщений} other {# новых сообщения}}", "comments": "{count, plural, =0 {Комментариев пока нет} one {# комментарий} few {# комментария} many {# комментариев} other {# комментария}}" }
Spanish · claude-sonnet-5-5
Before
en: activerecord: errors: messages: blank: "can't be blank" too_short: "is too short (minimum is %{count} characters)" inbox: unread: one: "%{count} unread message" other: "%{count} unread messages" greeting: "Hi %{name}, welcome to %{app}!"
After
es: activerecord: errors: messages: blank: "no puede estar en blanco" too_short: "es demasiado corto (el mínimo es de %{count} caracteres)" inbox: unread: one: "%{count} mensaje sin leer" other: "%{count} mensajes sin leer" greeting: "Hola %{name}, ¡te damos la bienvenida a %{app}!"
What is in the file
- Hard rules
- Format details
- Choosing words
- Work in this order
- Short examples
Languages
English, Bulgarian, German, Spanish, Russian. Tried in: Bulgarian, German, Russian, Spanish.
How to buy
Any x402 client works. Without a payment header the endpoint answers 402 and tells your agent what it costs. Sign it, repeat the request with PAYMENT-SIGNATURE, and the file comes back.
Agent (HTTP)
curl -i https://api.aiskills402.com/v1/skills/translate-app-text/fileAgent (MCP)
Connect https://mcp.aiskills402.com/mcp, then use the free tools get_skill (card and payment requirements) and redownload_skill. The payment itself goes over HTTP.
I am a person
Honestly: you need an agent with a USDC wallet, or a small script, plus the x402-buyer skill. There is no card checkout yet. The steps are in the docs.
The file
- Version
- 1.0.0
- Payment
- x402 · USDC · base
- Updates
- free, new versions included
- Size
- 8.5 KB (8679 bytes)
- SHA-256
- 6a54e8b2280d8456706de0a506480cb473d5b985cab2701902bef8dda757427d
- Updated
- 2026-10-03
License
Perpetual, non-exclusive; use and modify for yourself incl. paid work; no resale or republishing. Holder: Georgi Kalchev, aiskills402.com. Full terms.
Versions
Current version 1.0.0, updated 2026-10-03. Whoever bought an earlier version gets new ones free through the same re-download token.
v1.0.0 · 2026-10-03
First release: translates JSON, YAML, gettext PO, ICU messages and HTML snippets while keeping keys, placeholders, ICU syntax, tags and URLs byte for byte; adds the plural forms the target language needs; returns the bare file.
FAQ
Will it break my placeholders?
In our runs neither model changed a key, a placeholder or an ICU keyword: {name}, {{count}}, %s, %(name)s, %{count}, $t(...) and {count, plural, ...} came back exactly. The weaker Claude Haiku sometimes wrapped the JSON in a code fence, which breaks a file saved as it is, so strip one if you see it.
What about languages with more plural forms than English?
The skill adds the categories the target needs. Russian gets one, few, many and other, inside ICU messages, as i18next _few and _many keys, or as Rails few: and many: keys. Both models did this in our Russian cases. PO files follow gettext's own count, which is three forms for Russian.
Which formats does it handle?
Nested JSON and i18next resources, Rails-style YAML, gettext PO, ICU MessageFormat strings, and HTML or Markdown snippets. Key order, URLs, code and brand names stay as they are; the Rails root key and the PO Language header switch to the target code.
Is the wording as good as a human translator?
For short app strings Claude Sonnet wrote natural Bulgarian, German, Russian and Spanish in our tests. Haiku's wording was weaker, with literal choices a native speaker would change, so let someone who speaks the language look at the screens before a release.
Related skills
- SKILL.mdv1.0.16.1 KBEditing & Proofreading
Proofread
Proofreads a text with minimal intervention, in the language of the text. Fixes spelling, grammar, punctuation and obvious typos, keeps everything else, and returns the corrected text plus a short list of changes for review. Use when asked to proofread, correct, spell-check or fix the mistakes in a text without rewriting it.
Tested with Sonnet and Haiku, 30 Sep 2026 - SKILL.mdv1.0.17.5 KBResearch & Summaries
Faithful Summary
Writes a faithful summary of a text in the text's own language, using only what the text says, with every number, name and date kept exactly and every qualifier kept. Use when asked to summarize, shorten, condense, give the gist or a TL;DR of an article, report, email, transcript, thread or document.
Tested with Sonnet and Haiku, 30 Sep 2026
Read more
- Translating locale files with an LLM: what broke
Nine locale files, two Claude models. Keys and placeholders survived every time; what broke was plural forms, a code fence around JSON, and word choice.
3 Oct 2026 · 4 min read