Agent skill

Translate Strings

by MartinStyk in MartinStyk/apk-analyzer

A skill your agent uses when adding a new user-facing string, changing existing English copy, or adding/auditing a locale's strings.xml translations.

GPL-3.0Auto-check passedWriting & Content

Install Translate Strings

skills CLI
$ npx skills add MartinStyk/apk-analyzer --skill translate-strings -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install MartinStyk/apk-analyzer translate-strings --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/MartinStyk/apk-analyzer.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/translate-strings .claude/skills/translate-strings && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
translate-strings
GitHub stars
369
Token cost
~3.8k tokens
SKILL.md length
1,923 words
Files
1
Skills in repo
18
Repo updated
First seen
Licence
GPL-3.0

At a glance

A skill your agent uses when adding a new user-facing string, changing existing English copy, or adding/auditing a locale's strings.xml translations.

  • Works in 7 steps: Scope the change. git diff develop --… → Skip untouched keys in incremental… → Read the usage context before… → …
  • Adding a new user-facing string
  • SKILL.md covers Supported Languages, Control Language: Slovak…, Android Platform Vocabulary and Always-English Keys, plus 4 more sections
  • Calls git

What it does

Translate Strings is an agent skill from MartinStyk/apk-analyzer. Use when adding a new user-facing string, changing existing English copy, or adding/auditing a locale's strings.xml translations. Triggered by phrases like "translate strings", "add translation", "update translations", "localize this screen", "add a new language", "sync locale strings", "translate to <language".

Its SKILL.md is about 3.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Writing & Content, covering Translation. The repository describes itself as: The most downloaded APK analysis app on Google Play. Detailed reports of every app on your device. No root, no ads, nothing leaves the phone. The licence is GPL-3.0.

When your agent uses it

  • Adding a new user-facing string
  • Changing existing English copy
  • Adding/auditing a locales strings.xml translations

Example prompts

  • “s strings.xml translations. Triggered by phrases like”
  • “add translation”
  • “update translations”
  • “/translate-strings”

Workflow steps

7 steps, taken from the first numbered list in SKILL.md.

  1. Scope the change. git diff develop -- '**/values/strings.xml' (or the equivalent for the
  2. Skip untouched keys in incremental updates. If a values-/strings.xml already exists,
  3. Read the usage context before translating each string. Grep for
  4. Translate. Keep it natural in the target language, not a clause-for-clause mirror of the
  5. android_versions string-array (core/apps): keep the dessert-name codename in English for
  6. Check key parity between the base file and the locale file you touched
  7. Validate the XML is well-formed (PowerShell, no extra tooling needed)

What it can do on your machine

Read from SKILL.md and the folder at commit d807559. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Translate Strings loads about 3.8k tokens when it runs. Until then it costs about 83 tokens; SKILL.md has 1,923 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~83
When it runs · the whole SKILL.md, loaded when a task matches
~3.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from MartinStyk/apk-analyzer at commit d807559, republished under its GPL-3.0 licence (© MartinStyk). 1,923 words, ~3,807 tokens.

Download SKILL.mdSave it as .claude/skills/translate-strings/SKILL.md (or your agent's skills folder).
name
translate-strings
description
Use when adding a new user-facing string, changing existing English copy, or adding/auditing a locale's strings.xml translations. Triggered by phrases like "translate strings", "add translation", "update translations", "localize this screen", "add a new language", "sync locale strings", "translate to <language>".

Translate Strings

Translating a string here is not a lookup — it is writing the same UX copy in another language. Read the string's usage context before translating it, and match the tone rules in the root AGENTS.md (active voice, present tense, sentence case, name the concrete thing) in the target language's own idiom, not a literal transliteration of the English sentence structure.

Supported Languages

LanguageFolder qualifierPlural categories neededNotes
Spanishvalues-esone, other
Germanvalues-deone, other
Frenchvalues-frone, othermany exists in CLDR (decimal/compact numbers) but never triggers for the integer counts this app uses — skip it
Portuguese (Brazil)values-pt-rBRone, otherDo not use plain values-pt — Portugal Portuguese differs
Italianvalues-itone, othermany same as French — skip
Japanesevalues-jaotherNo grammatical plural; only quantity="other" is ever selected
Chinese (Simplified)values-zh-rCNother
Koreanvalues-koother
Vietnamesevalues-viother
Indonesianvalues-inotherAndroid's legacy resource qualifier for Indonesian is in, not id
Russianvalues-ruone, few, many, otherFull Slavic set — integers routinely land in few/many, omitting them reads as broken grammar
Ukrainianvalues-ukone, few, many, otherSame shape as Russian
Polishvalues-plone, few, many, otherSame shape as Russian
Slovakvalues-skone, few, many, otherfew = 2–4, many = has a fraction
Czechvalues-csone, few, many, otherSame shape as Slovak
Turkishvalues-trone, other
Arabicvalues-arzero, one, two, few, many, otherFull six-category set — 0/1/2 are their own categories and are common counts in this app. RTL mirroring is automatic; don't hand-adjust layout, just translate the text
Hindivalues-hione, otherCLDR quirk: 0 maps to one in Hindi, not other

If asked to add a language outside this table, confirm the language and its folder qualifier with the user before creating files — don't guess a BCP-47 tag.

Control Language: Slovak (values-sk)

English (values/strings.xml) is still the canonical source for keys, placeholders, and structure — but English UI copy is often terse enough to be ambiguous about the actually-intended nuance. Slovak (values-sk) is this app's control translation: the app owner personally reviews and corrects it, so a confirmed Slovak string encodes the verified intended meaning, tone, and terminology choice more precisely than the English source alone.

When translating a string into any language other than Slovak, read both the English source and the Slovak translation before writing the target-language text — use English for literal meaning and structure, and Slovak to resolve tone, nuance, or ambiguity English leaves open. Where the two would suggest different readings, follow the interpretation Slovak embodies, since it reflects reviewed intent rather than a first-pass translation. If a Slovak entry doesn't exist yet for a key, fall back to English alone and say so rather than guessing what a not-yet-written control would say.

Don't translate from Slovak's grammar — its declension and word order don't transfer to unrelated languages. Slovak is a meaning/tone reference; English remains the structural source (placeholder count and order, key names, sentence type).

Android Platform Vocabulary

Activity, Service, Receiver (Broadcast Receiver), Provider (Content Provider), Intent filter, Permission, Manifest, Package, APK, SDK are Android platform terms, not ordinary English prose — this app's strings already render them as short category labels (components_type_activities = "Activities", components_scope_providers = "Providers", etc., see feature/app-detail/impl/src/main/res/values/strings.xml). The right call is neither "always translate" nor "always keep English" — it's use whichever term Android's own official localization already uses for that exact word in that language, so it matches what a user may already recognize from Android Studio, developer.android.com, or the Play Console in their language:

  • Google officially localizes Android developer docs for: Spanish, Japanese, Korean, Portuguese (Brazil), Russian, Chinese (Simplified/Traditional), Indonesian, Turkish, Vietnamese — largely overlapping with this table's es, ja, ko, pt-rBR, ru, zh-rCN, in, tr, vi. For these, use the exact term developer.android.com uses in that locale for Activity/Service/ Receiver/Provider/etc. Verify the current term rather than recalling it from memory or an old session — Google's supported-docs-language list and its terminology both drift over time.
  • Not officially localized: German, French, Italian, Polish, Slovak, Czech, Ukrainian, Arabic, Hindi. For these, the established local Android developer convention is almost always to keep the English term as a loanword (Activity, Service, Broadcast Receiver, Content Provider) — that also avoids inventing a translation no one in that market's Android ecosystem actually uses.
  • APK, Intent, Manifest stay in English in effectively every language, including ones with localized docs — they function as fixed technical terms across the whole Android world, the same way this skill already treats APK elsewhere.
  • If you're not sure for a specific language/term pair, say so and check developer.android.com in that locale (or ask) instead of guessing silently — getting this wrong reads as a translation that doesn't know the platform, which undermines trust more than an occasional English loanword would.

Always-English Keys

A handful of specific keys are pinned to the exact English source text in every language, Slovak included — not translated, not adapted. These are deliberate app-owner calls (not derivable from the general platform-vocabulary rule above), so don't second-guess them into translation during an audit:

  • permission_label_wake_lock → Wake lock. The English source string itself reads "Keep Device Awake" (plain prose, not this term) — every locale still renders the Android API name Wake lock instead of translating that source sentence. This is an intentional exception to "translate the English source," not an oversight.
  • permission_label_ad_id → Advertising ID, permission_label_ad_attribution → Ad Attribution, permission_label_ad_custom_audience → Ad Audiences, permission_label_ad_topics → Ad Topics (all core/app-permissions).
  • permission_label_bluetooth_advertise → Bluetooth Advertise (core/app-permissions).
  • permissions_level_dangerous / _signature / _internal / _normal (feature/app-detail/impl) and their browse_protection_level_* counterparts (feature/browse/impl) → Dangerous / Signature / Internal / Normal.
  • app_detail_target_sdk and general_info_target_sdk (feature/app-detail/impl) → Target SDK. sort_target_sdk (feature/apps/impl) → Target Android SDK (matches that key's own English source, which includes "Android" where the other two don't — copy each key's own default text verbatim rather than harmonizing the three into one phrase).

If a new key looks like it belongs in one of these families (e.g. a future permission_label_ad_* or another *_target_sdk label), ask before deciding whether it joins the always-English set or gets a normal translation — don't extend the pattern by inference.

Scope: One Module at a Time

Every module with a values/strings.xml gets its own values-<qualifier>/strings.xml with the exact same key set.

Translate module by module. Don't merge keys from different modules into one file, and don't create a locale folder for a module that has no values/strings.xml.

Order of Work: String-by-String vs Language-by-Language

For a small batch of new or changed strings, translate string-by-string across all languages, not language-by-language across all strings. Reading the usage context (workflow step 3 below) is the expensive, error-prone part — do it once per string, then produce every language's translation while that context and its resolved meaning are still fresh. Translating language-by-language for a handful of new keys means re-deriving the same context up to 18 times and risks resolving an ambiguous string differently on different passes. Translate Slovak first (or immediately after confirming the English meaning) among the batch, since it's the control language — having it settled gives you, and the user on review, a second concrete reference before propagating to the remaining languages.

The exception is a large-scale audit of many already-existing strings (a full-module or full-app correctness review, not a handful of new keys) — group that by language instead. A single sustained pass through one language builds up internal terminology and register consistency across the whole file that a string-by-string pass would fragment, and it parallelizes cleanly across languages when multiple reviewers (human or agent) are available.

Show full SKILL.md (723 more words)Show less

Workflow

  1. Scope the change. git diff develop -- '**/values/strings.xml' (or the equivalent for the branch you're on) to see which keys are new or whose English text changed. If this is a fresh language addition instead of an incremental update, the scope is every key in the module.
  2. Skip untouched keys in incremental updates. If a values-<lang>/strings.xml already exists, only touch the keys that are new or whose source text changed. Don't regenerate an already-correct translation just because you're in the file — that's how translations silently drift from a reviewed state.
  3. Read the usage context before translating each string. Grep for R.string.<key> / R.plurals.<key> in the module's Kotlin sources and open the Composable that uses it. You need to know:
    • What kind of string it is — screen title, button label, content description, error message, empty state, explanation body, technical field label.
    • What screen/feature it belongs to, so domain terms (permission, activity, signing certificate, split APK) get the term a tech-literate but non-developer reader in that language actually uses, not a dictionary-literal translation. For Android platform vocabulary specifically (Activity, Service, Provider, Permission, Manifest, APK, ...), see "Android Platform Vocabulary" below.
    • The meaning and order of any %1$s / %2$d placeholders — read the call site to see what each argument actually is.
    • If you're translating into a language other than Slovak, also read the corresponding values-sk/strings.xml entry when one exists — see "Control Language: Slovak" above. It often resolves ambiguity the English text alone leaves open.
  4. Translate. Keep it natural in the target language, not a clause-for-clause mirror of the English sentence. Preserve:
    • Placeholder indices tied to their original argument meaning. You may reorder where %1$s and %2$s appear in the sentence to fit target-language word order, but %1$s must still refer to whatever the first Kotlin call argument is — never renumber based on translated word order.
    • XML escaping: apostrophes as \' (or wrap the whole string in "..."), & as &amp;, existing <b>/<i> spans if present.
    • Every quantity= category the target language needs per the table above, even though the English source only defines one/other. Write each category's own grammatically correct sentence — don't copy the other text into few/many/two untranslated.
    • Every branch of a plural whose English other branch carries a numeric placeholder must carry that placeholder too, in every locale where the branch matches more than one number: one matches 0 and 1 in French, Portuguese (Brazil) and Hindi, and matches 1, 21, 31, … in Russian and Ukrainian. Spelling the count out ("last month", "one signing key") reads wrong for the other numbers the branch covers and lint raises ImpliedQuantity. The English one branch omitting the placeholder is not permission to omit it — the count is always passed to pluralStringResource. Check with:
      bash
      grep -n '<item quantity=' feature/*/impl/src/main/res/values-{fr,pt-rBR,hi,ru,uk}/strings.xml \
        | grep -v '%'
    • content_description_* strings stay terse (they're for screen readers, not visible copy).
  5. android_versions string-array (core/apps): keep the dessert-name codename in English for Latin/Cyrillic-script languages, matching the convention on the Play Store and in Android's own settings for that locale — most languages keep "Cupcake", "Donut", etc. untranslated. Only transliterate for CJK languages, matching the existing values-ja file's pattern. If unsure for a given language, check what Android's own Settings app uses for that locale rather than guessing.
  6. Check key parity between the base file and the locale file you touched:
    bash
    base=core/apps/src/main/res/values/strings.xml
    target=core/apps/src/main/res/values-es/strings.xml
    diff <(grep -oE 'name="[a-zA-Z0-9_]+"' "$base" | sort -u) \
         <(grep -oE 'name="[a-zA-Z0-9_]+"' "$target" | sort -u)
    Any line in the diff is a missing or extra key in the target locale.
  7. Validate the XML is well-formed (PowerShell, no extra tooling needed):
    powershell
    [xml] (Get-Content "core/apps/src/main/res/values-es/strings.xml" -Raw) | Out-Null
    Throws on malformed XML (unescaped &, unclosed tags, etc.).

Explicitly Not This Skill's Job

  • Don't touch the English values/strings.xml — this skill translates existing approved copy, it doesn't write new source strings. If the English string itself needs to change, that's a normal code change under the root AGENTS.md "User-Facing Copy" rules, done first, separately.
  • Don't invent new string keys to make a translation easier — if a language genuinely needs a restructured sentence that the current key/placeholder shape can't express, flag it instead of reshaping the source string unilaterally.
  • Per the root AGENTS.md verification table, don't run lintDebug or spotlessCheck after every file — strings.xml isn't Kotlin, spotless doesn't touch it. The XML well-formedness check above is the right-sized local check; CI's lintDebug catches anything deeper (missing plural fallback, malformed format strings).

© MartinStyk, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/translate-strings of MartinStyk/apk-analyzer.

Open the folder on GitHubat commit d807559

Compare with similar skills

Translate Strings next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Translate Strings compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Translate Strings this skillMartinStyk/apk-analyzer369—~3.8kAutomated safety check: PassGPL-3.0
Translation Diff ExportDevolutions/UniGetUI26k—~1.1kAutomated safety check: PassMIT
Sync Translationssymfony/symfony31k—~1.9kAutomated safety check: PassMIT
Translation Diff ImportDevolutions/UniGetUI26k—~750Automated safety check: PassMIT
Translation Diff TranslateDevolutions/UniGetUI26k—~934Automated safety check: PassMIT
Generate Translationspayloadcms/payload45k—~1.1kAutomated safety check: PassMIT

Similar skills

  • Translation Diff Export

    Devolutions/UniGetUI

    Compares UniGetUI JSON locale files against English, identifies untranslated or source-changed keys, and generates patch, reference, and handoff files for a target language.

    26k GitHub stars~1.1k tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Sync Translations

    symfony/symfony

    Synchronize translation catalogs across maintained Symfony branches: find messages that newer branches added to the English catalogs but that are still missing from the oldest maintained branch…

    31k GitHub stars~1.9k tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Translation Diff Import

    Devolutions/UniGetUI

    Merges translated key-value pairs from a UniGetUI JSON localization patch back into the full language file and validates the merged result.

    26k GitHub stars~750 tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Translation Diff Translate

    Devolutions/UniGetUI

    Translates a sparse UniGetUI JSON language patch, writes completed entries into the working copy, preserves placeholders and terminology, and prepares the patch for merge-back.

    26k GitHub stars~934 tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Generate Translations

    payloadcms/payload

    A skill your agent uses when new translation keys are added to packages to generate new translations strings

    45k GitHub stars~1.1k tokensUpdated today
    Writing & ContentAuto-check passed
  • Drives long-form fiction, scripts, storyboards, interactive films and long-document translation through InkOS, with every change made by a typed action.

    10k GitHub starsUsed in 1 repo~1.1k tokens
    Writing & ContentAuto-check passed

More from MartinStyk/apk-analyzer

All 18 skills in this repo
  • Triage Crashes

    MartinStyk/apk-analyzer

    A skill your agent uses to review production Crashlytics crashes and non-fatals for the latest release and file a GitHub issue for each one that isn't tracked yet.

    369 GitHub stars~4.3k tokensUpdated 3 days ago
    Auto-check passed
  • Analyze CI Failure

    MartinStyk/apk-analyzer

    A skill your agent uses to check GitHub Actions build status or diagnose why a workflow run failed and propose a fix.

    369 GitHub stars~1.9k tokensUpdated 3 days ago
    Auto-check passed
  • Capture App Flow Media

    MartinStyk/apk-analyzer

    A skill your agent uses to record or convert ApkAnalyzer app flows into screenshots or GIFs for the README or product docs.

    369 GitHub stars~1.7k tokensUpdated 3 days ago
    Auto-check passed
  • Create Compose Component

    MartinStyk/apk-analyzer

    A skill your agent uses when creating a new reusable Compose UI component that should live in core:ui-library.

    369 GitHub stars~885 tokensUpdated 3 days ago
    Auto-check passed
  • Create Core Module

    MartinStyk/apk-analyzer

    A skill your agent uses when creating a new core or shared library module for domain logic, data access, repositories, managers, or utilities.

    369 GitHub stars~1.7k tokensUpdated 3 days ago
    Auto-check passed
  • Create Feature Module

    MartinStyk/apk-analyzer

    A skill your agent uses when creating a new feature module, screen, or feature area.

    369 GitHub stars~1.6k tokensUpdated 3 days ago
    Auto-check passed

Questions about Translate Strings

What does Translate Strings do?

A skill your agent uses when adding a new user-facing string, changing existing English copy, or adding/auditing a locale's strings.xml translations. Translate Strings is an agent skill from MartinStyk/apk-analyzer.xml translations.

When should I use Translate Strings?

Translate Strings fits situations like: adding a new user-facing string; changing existing English copy; adding/auditing a locales strings.xml translations.

How do I install Translate Strings in Claude Code?

Run `npx skills add MartinStyk/apk-analyzer --skill translate-strings -a claude-code`. Or copy the skill folder (.claude/skills/translate-strings in MartinStyk/apk-analyzer) into .claude/skills/translate-strings in your project. Claude Code loads it when a task matches its description.

How do I install Translate Strings in Codex?

Run `npx skills add MartinStyk/apk-analyzer --skill translate-strings -a codex`. Or copy the skill folder (.claude/skills/translate-strings in MartinStyk/apk-analyzer) into .agents/skills/translate-strings in your project. Codex loads it when a task matches its description.

Can I use Translate Strings in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add MartinStyk/apk-analyzer --skill translate-strings -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/translate-strings, .gemini/skills/translate-strings, .github/skills/translate-strings and .opencode/skills/translate-strings in your project.

What does Translate Strings need to run?

Going by SKILL.md and its folder, Translate Strings needs the command-line tools its instructions call (git).

Does Translate Strings access the network?

SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Translate Strings safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Translate Strings use?

Translate Strings is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Translate Strings use?

About 3.8k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Translate Strings?

Skills that share tags, products or a category with Translate Strings: Translation Diff Export (Devolutions/UniGetUI, 26k stars), Sync Translations (symfony/symfony, 31k stars), Translation Diff Import (Devolutions/UniGetUI, 26k stars) and Translation Diff Translate (Devolutions/UniGetUI, 26k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Translate Strings?

MartinStyk (a GitHub user) maintains it in MartinStyk/apk-analyzer, which has 369 GitHub stars. The repository holds 18 skills in this directory. The repository was last updated on October 5, 2026.

Source: MartinStyk/apk-analyzer on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.