asc localize metadata
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.
Command discovery and output conventions
- Always confirm flags with
--helpfor the exactascversion:asc localizations --helpasc localizations download --helpasc localizations upload --helpasc apps info edit --help
- Prefer explicit long flags (
--app,--version,--version-id,--type,--app-info). - Output defaults are TTY-aware: table in interactive terminals and JSON in CI or other non-interactive contexts. Use explicit
--outputwhen the format matters. - Prefer deterministic ID-based operations. Do not "pick the first row" via
head -1unless the user explicitly agrees.
Preconditions
- Auth configured (
asc auth loginorASC_*env vars) - Know your app ID (
asc apps listto find it) - At least one locale (typically en-US) already has metadata in App Store Connect
Supported Locales
App Store Connect locales for version and app-info localizations:
Two Types of Metadata
Version Localizations (per-release)
Fields: description, keywords, whatsNew, supportUrl, marketingUrl, promotionalText
App Info Localizations (app-level, persistent)
Fields: name, subtitle, privacyPolicyUrl, privacyChoicesUrl, privacyPolicyText
Workflow
Step 1: Resolve IDs
Notes:
- Version-localization fields (description, keywords, whatsNew, etc.) are per-version.
- App-info fields (name, subtitle, privacy URLs/text) are app-level and use
--type app-info. - If you only have names (app name, version string) and need IDs deterministically, use
asc-id-resolver.
Step 2: Download source locale
This creates files like ./localizations/en-US.strings and ./app-info-localizations/en-US.strings. If download is unavailable, read fields individually:
Step 3: Translate with LLM
For each target locale, translate the source text. Follow these rules:
Translation Guidelines
- 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.
- description: Translate naturally, adapt tone to local market. Keep formatting (line breaks, bullet points, emoji). Stay within 4000 chars.
- 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).
- whatsNew: Translate release notes. Keep it concise. Max 4000 chars.
- promotionalText: Translate marketing hook. Max 170 chars. This can be updated without a new version.
- subtitle: Translate or adapt tagline. Max 30 chars — this is very tight, may need creative adaptation.
- name: Usually keep the original app name. Only translate if the user explicitly asks. Max 30 chars.
LLM Translation Prompt Template
For each target locale, use this approach:
Step 4: Upload translations
Option A: Via .strings files (bulk)
Create a .strings file per locale in the appropriate directory.
Version localization example:
Then upload version localizations:
App-info localization example:
Then upload app-info localizations:
Option B: Via individual commands (fine control)
For app-level fields:
Step 5: Verify
Character Limits (enforce before upload!)
Always validate translated text fits within limits before uploading. Truncated text looks unprofessional. If translation exceeds the limit, shorten it — do not truncate mid-sentence.
Full Example: Add nl-NL and ru to Roxy Math
Agent Behavior
- Always start by reading the source locale — never translate from memory or assumptions.
- Check existing localizations first — don't overwrite existing translations unless the user asks to update them.
- Version vs app-info is different — version fields live under
--version "VERSION_ID"; subtitle/name/privacy live under--app ... --type app-info. - Prefer deterministic IDs — do not select IDs via
head -1unless explicitly requested; use--output tablefor selection orasc-id-resolver. - Validate character limits before uploading. Count characters for each field. If over limit, re-translate shorter.
- Keywords are special — do not literally translate. Research locale-appropriate search terms. Think like a user searching the App Store in that language.
- Show the user translations before uploading — present a summary table of all fields × locales for approval. Do not push without confirmation.
- Process one locale at a time if translating many languages — easier to review and catch errors.
- If upload fails for a locale, log the error, continue with other locales, report all failures at the end.
- For updates to existing localizations — download current, show diff of what will change, get approval, then upload.
Notes
- Version localizations are tied to a specific version. Create the version first if it doesn't exist.
promotionalTextcan be updated anytime without a new version submission.whatsNewis only relevant for updates, not the first version.- Use
asc-id-resolverskill if you only have app/version names instead of IDs. - Use
asc-metadata-syncskill for non-translation metadata operations. - For subscription/IAP display name localization, use
asc-subscription-localizationskill instead.


