~/aiskills402AISKILLS402

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.

Tested 2026-10-03No code, no hidden instructionsv1.0.0 · 8.5 KB · perpetual license

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.

Full test summary

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)

bash
curl -i https://api.aiskills402.com/v1/skills/translate-app-text/file

Agent (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.

  1. 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.

Read more

Share

Read this page as Markdown: /skills/translate-app-text.md.

network baseprotocol x402asset USDCselling: trueskills 13