$npx -y skills add rorkai/app-store-connect-cli-skills --skill asc-localize-metadataAutomatically translate and sync App Store metadata (description, keywords, what's new, subtitle) to multiple languages using LLM translation and asc CLI. Use when asked to localize an app's App Store listing, translate app descriptions, or add new languages to App Store Connect.
| 1 | # asc localize metadata |
| 2 | |
| 3 | Use this skill to pull English (or any source locale) App Store metadata, translate it with LLM, and push translations back to App Store Connect — all automated. |
| 4 | |
| 5 | ## Command discovery and output conventions |
| 6 | |
| 7 | - Always confirm flags with `--help` for the exact `asc` version: |
| 8 | - `asc localizations --help` |
| 9 | - `asc localizations download --help` |
| 10 | - `asc localizations upload --help` |
| 11 | - `asc apps info edit --help` |
| 12 | - Prefer explicit long flags (`--app`, `--version`, `--version-id`, `--type`, `--app-info`). |
| 13 | - Default output is JSON; use `--output table` only for human verification steps. |
| 14 | - Prefer deterministic ID-based operations. Do not "pick the first row" via `head -1` unless the user explicitly agrees. |
| 15 | |
| 16 | ## Preconditions |
| 17 | - Auth configured (`asc auth login` or `ASC_*` env vars) |
| 18 | - Know your app ID (`asc apps list` to find it) |
| 19 | - At least one locale (typically en-US) already has metadata in App Store Connect |
| 20 | |
| 21 | ## Supported Locales |
| 22 | |
| 23 | App Store Connect locales for version and app-info localizations: |
| 24 | ``` |
| 25 | ar-SA, ca, cs, da, de-DE, el, en-AU, en-CA, en-GB, en-US, |
| 26 | es-ES, es-MX, fi, fr-CA, fr-FR, he, hi, hr, hu, id, it, |
| 27 | ja, ko, ms, nl-NL, no, pl, pt-BR, pt-PT, ro, ru, sk, |
| 28 | sv, th, tr, uk, vi, zh-Hans, zh-Hant |
| 29 | ``` |
| 30 | |
| 31 | ## Two Types of Metadata |
| 32 | |
| 33 | ### Version Localizations (per-release) |
| 34 | Fields: `description`, `keywords`, `whatsNew`, `supportUrl`, `marketingUrl`, `promotionalText` |
| 35 | |
| 36 | ### App Info Localizations (app-level, persistent) |
| 37 | Fields: `name`, `subtitle`, `privacyPolicyUrl`, `privacyChoicesUrl`, `privacyPolicyText` |
| 38 | |
| 39 | ## Workflow |
| 40 | |
| 41 | ### Step 1: Resolve IDs |
| 42 | |
| 43 | ```bash |
| 44 | # Find app ID |
| 45 | asc apps list --output table |
| 46 | |
| 47 | # Find latest version ID |
| 48 | asc versions list --app "APP_ID" --state READY_FOR_DISTRIBUTION --output table |
| 49 | # or for editable version: |
| 50 | asc versions list --app "APP_ID" --state PREPARE_FOR_SUBMISSION --output table |
| 51 | |
| 52 | # Find app info ID (for app-level fields like name/subtitle) |
| 53 | asc apps info list --app "APP_ID" --output table |
| 54 | ``` |
| 55 | |
| 56 | Notes: |
| 57 | - Version-localization fields (description, keywords, whatsNew, etc.) are per-version. |
| 58 | - App-info fields (name, subtitle, privacy URLs/text) are app-level and use `--type app-info`. |
| 59 | - If you only have names (app name, version string) and need IDs deterministically, use `asc-id-resolver`. |
| 60 | |
| 61 | ### Step 2: Download source locale |
| 62 | |
| 63 | ```bash |
| 64 | # Download version localizations to local .strings files |
| 65 | # (description, keywords, whatsNew, promotionalText, supportUrl, marketingUrl, ...) |
| 66 | asc localizations download --version "VERSION_ID" --path "./localizations" |
| 67 | |
| 68 | # Download app-info localizations to local .strings files |
| 69 | # (name, subtitle, privacyPolicyUrl, privacyChoicesUrl, privacyPolicyText, ...) |
| 70 | asc localizations download --app "APP_ID" --type app-info --app-info "APP_INFO_ID" --path "./app-info-localizations" |
| 71 | ``` |
| 72 | |
| 73 | This creates files like `./localizations/en-US.strings` and `./app-info-localizations/en-US.strings`. If download is unavailable, read fields individually: |
| 74 | |
| 75 | ```bash |
| 76 | # List version localizations to see existing locales and their content |
| 77 | asc localizations list --version "VERSION_ID" --output table |
| 78 | ``` |
| 79 | |
| 80 | ### Step 3: Translate with LLM |
| 81 | |
| 82 | For each target locale, translate the source text. Follow these rules: |
| 83 | |
| 84 | #### Translation Guidelines |
| 85 | - **Tone & Register**: Always use formal, polite language. Use formal "you" forms where the language distinguishes them (Russian: «вы», German: «Sie», French: «vous», Spanish: «usted», Dutch: «u», Italian: «Lei», Portuguese: «você» formal, etc.). App Store descriptions are professional marketing copy — never use casual or informal register. |
| 86 | - **description**: Translate naturally, adapt tone to local market. Keep formatting (line breaks, bullet points, emoji). Stay within 4000 chars. |
| 87 | - **keywords**: Do NOT literally translate. Research what users in that locale would search for. Comma-separated, max 100 chars total. No duplicates, no app name (Apple adds it automatically). |
| 88 | - **whatsNew**: Translate release notes. Keep it concise. Max 4000 chars. |
| 89 | - **promotionalText**: Translate marketing hook. Max 170 chars. This can be updated without a new version. |
| 90 | - **subtitle**: Translate or adapt tagline. Max 30 chars — this is very tight, may need creative adaptation. |
| 91 | - **name**: Usually keep the original app name. Only translate if the user explicitly asks. Max 30 chars. |
| 92 | |
| 93 | #### LLM Translation Prompt Template |
| 94 | |
| 95 | For each target locale, use this approach: |
| 96 | |
| 97 | ``` |
| 98 | Translate the following App Store metadata from {source_locale} to {target_locale}. |
| 99 | |
| 100 | Rules: |
| 101 | - description: Natural, fluent translation. Preserve formatting (line breaks, bullets, emoji). Max 4000 chars. |
| 102 | - keywords: Do NOT literally translate. Choose keywords native speakers would search for |