mirror of
https://github.com/rudrankriyam/App-Store-Connect-CLI.git
synced 2026-04-25 15:45:48 +03:00
[GH-ISSUE #23] Phase 5: Localization commands (list/download/upload) #3
Labels
No labels
bug
bug
documentation
enhancement
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
starred/App-Store-Connect-CLI#3
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @rudrankriyam on GitHub (Jan 20, 2026).
Original GitHub issue: https://github.com/rudrankriyam/App-Store-Connect-CLI/issues/23
PRD: App Store Connect Localizations Management
Goal
Enable developers and AI agents to manage App Store localization metadata (descriptions, keywords, release notes, app names, privacy URLs) via CLI commands. Support both version-specific localizations (
appStoreVersionLocalizations) and app-level localizations (appInfoLocalizations) with list, download, and upload operations.Background
App Store Connect API provides two localization resource types:
appStoreVersionLocalizations- Version-specific metadata:description- App descriptionkeywords- Search keywordsmarketingUrl- Marketing website URLpromotionalText- Promotional text (170 chars max)supportUrl- Support website URLwhatsNew- Release notes ("What's New")locale- Language tag (e.g., "en-US", "ja")appInfoLocalizations- App-level metadata:name- App name (required for app record)subtitle- App subtitleprivacyPolicyUrl- Privacy policy URLprivacyChoicesUrl- Privacy choices URLprivacyPolicyText- Privacy policy textlocale- Language tagCLI Commands
Command Structure
Subcommands
list- List localizationsLists all localizations for a given app version or app info.
Flags:
--version- App Store Version ID (required for version localizations)--app- App ID (required for app-info localizations)--type- Localization type:version(default) orapp-info--output- Output format:json(default),table,markdown--pretty- Pretty-print JSON output--locale- Filter by locale (e.g., "en-US", "ja")Examples:
Output (JSON):
download- Download localizations to fileDownloads all localizations for a version or app-info to a JSON file.
Flags:
--version- App Store Version ID (required for version localizations)--app- App ID (required for app-info localizations)--type- Localization type:version(default) orapp-info--file- Output file path (default:localizations.jsonorapp-info-localizations.json)--locale- Download specific locale only (optional)Examples:
Output File Format:
upload- Upload localizations from fileUploads or updates localizations from a JSON file. Creates new localizations if locale doesn't exist, updates existing ones if locale exists.
Flags:
--version- App Store Version ID (required for version localizations)--app- App ID (required for app-info localizations)--type- Localization type:version(default) orapp-info--file- Input JSON file path (required)--dry-run- Validate file without uploading--locale- Upload specific locale only (optional, filters file)Examples:
Input File Format:
Note: If a localization with the same locale already exists, the command will update it (PATCH). If it doesn't exist, it will create a new one (POST).
API Endpoints
Version Localizations (
appStoreVersionLocalizations)/v1/appStoreVersions/{id}/appStoreVersionLocalizations/v1/appStoreVersionLocalizations/{id}/v1/appStoreVersionLocalizations/v1/appStoreVersionLocalizations/{id}/v1/appStoreVersionLocalizations/{id}Required Fields (POST):
type:"appStoreVersionLocalizations"attributes.locale: Language tag (e.g., "en-US")relationships.appStoreVersion: Version ID and typeOptional Fields:
description- App descriptionkeywords- Comma-separated keywordsmarketingUrl- Marketing URLpromotionalText- Promotional text (170 chars max)supportUrl- Support URLwhatsNew- Release notesApp Info Localizations (
appInfoLocalizations)/v1/apps/{id}/appInfos/v1/appInfos/{id}/appInfoLocalizations/v1/appInfoLocalizations/{id}/v1/appInfoLocalizations/v1/appInfoLocalizations/{id}/v1/appInfoLocalizations/{id}Required Fields (POST):
type:"appInfoLocalizations"attributes.locale: Language tagrelationships.appInfo: App Info ID and typeOptional Fields:
name- App name (required for app record, but not API request)subtitle- App subtitleprivacyPolicyUrl- Privacy policy URLprivacyChoicesUrl- Privacy choices URLprivacyPolicyText- Privacy policy textRequest/Response Shapes
Create Version Localization (POST)
Request:
Response:
Update Version Localization (PATCH)
Request:
Create App Info Localization (POST)
Request:
Typical Update Flow
List existing localizations:
Download current state:
Edit JSON file (manually or via script)
Upload updates:
Internal Flow:
/v1/apps/{id}/appInfos/v1/appStoreVersions/{id}/appStoreVersionLocalizations?filter[locale]={locale})/v1/appStoreVersionLocalizations/{id}with updated fields/v1/appStoreVersionLocalizationswith new localizationValidation
File Format Validation
localizationsarray must be presentlocalefieldpromotionalText: 170 characters maxkeywords: Typically 100 characters max (comma-separated)description: Typically 4000 characters maxwhatsNew: Typically 4000 characters maxAPI Validation
PREPARE_FOR_SUBMISSION)CLI Validation
--versionor--appmust be provided (depending on type)--filemust exist and be readable (for upload)--typemust beversionorapp-info--versionand--appfor same command--versionor--app(not neither)Error Cases
File Errors
Error: file not found: localizations.jsonError: invalid JSON: unexpected token at line XError: localization at index 0 missing required field 'locale'Error: invalid locale format: 'invalid'. Expected format: 'en-US' or 'ja'API Errors
Error: version not found: abc123Error: version 'abc123' is not in an editable state (current: READY_FOR_SALE)Error: locale 'en-US' already exists for this version. Use update instead.Error: localization not found for locale 'en-US'Error: invalid URL format: 'not-a-url'Error: promotionalText exceeds 170 character limit (current: 200)Error: unauthorized. Check your API credentials.CLI Errors
Error: --version is required for version localizationsError: cannot use both --version and --app. Use --type to specify localization type.Error: --type must be 'version' or 'app-info', got 'invalid'Testing
Unit Tests
File parsing:
localizationsarraylocalein localizationValidation:
API client methods:
ListVersionLocalizations(ctx, versionID, opts...)GetVersionLocalization(ctx, localizationID)CreateVersionLocalization(ctx, versionID, locale, attrs)UpdateVersionLocalization(ctx, localizationID, attrs)DeleteVersionLocalization(ctx, localizationID)Integration Tests
List command:
Download command:
Upload command:
CLI Tests
Command parsing:
Output formats:
Error handling:
References
Official Documentation
App Store Version Localizations:
App Info Localizations:
General:
Related Resources
Implementation Notes
Resource Type Detection:
--typeflag to distinguish between version and app-info localizationsversionif not specifiedLocale Handling:
Update vs Create:
File Format:
Error Recovery:
Performance:
@rudrankriyam commented on GitHub (Jan 21, 2026):
Implemented in #28 (localization commands) and merged.