langcodec-cli (Command Line)
Universal CLI for converting, inspecting, merging, and editing localization files.
- Formats: Apple
.strings,.xcstrings, Androidstrings.xml, CSV, TSV - Commands: convert, diff, merge, sync, view, stats, debug, edit, normalize
Install
Commands
convert
Auto-detects formats from extensions. For JSON/YAML custom formats, see --input-format in the root README.
merge
diff
Compare source file A against target file B.
Outputs added/removed/changed keys by language.
sync
Sync values from source file A into existing keys in target file B. This command updates only keys that already exist in target.
Matching rules:
- key-to-key match first
- fallback: use
--match-langtranslation (default inferred/en) to match source entries - never adds new keys to target
CI-oriented options:
--report-json <path>write sync summary as JSON--fail-on-unmatchedreturn non-zero when unmatched entries exist--fail-on-ambiguousreturn non-zero when fallback matching is ambiguous
view
Prints entries. Plurals are labeled with Type: Plural and show categories.
View options:
--status: Filter by one or more statuses (translated|needs_review|new|do_not_translate|stale), comma-separated.--keys-only: Print only keys in text mode (lang<TAB>keywhen--langis not set).--json: Output machine-readable JSON (summary+entriesorkeyspayload).--lang: Restrict results to a specific language before status filtering.--strict: With--status, requires explicit status metadata (supported in v1:.xcstrings).
stats
Shows per-language totals, counts by status, and completion percent (excludes DoNotTranslate). Use --json for machine-readable output.
debug
edit
Unified in-place editing (add/update/remove) across one or many files.
Basics:
# Add or update a key
# Remove a key (omit or empty value)
# Multiple files or globs (quote patterns)
# Preview only
# Write to a different file (single input only)
Options:
- --inputs/-i: One or more input files. Supports glob patterns when quoted.
- --lang/-l: Language code (required when an input contains multiple languages).
- --key/-k: Entry key to modify.
- --value/-v: New value. If omitted or empty, the entry is removed.
- --comment: Optional translator note.
- --status: translated|needs_review|new|do_not_translate|stale.
- --output/-o: Optional output path. Not allowed with multiple inputs.
- --dry-run: Print what would change and exit without writing.
- --continue-on-error: Process all inputs; report failures at the end (non-zero exit if any fail).
Supported formats: .strings, .xml (Android), .xcstrings, .csv, .tsv. Custom JSON/YAML/.langcodec edit is currently not enabled.
normalize
Normalize localization files in-place (or to --output in single-input mode).
# Normalize in-place
# CI drift check (non-zero if any file would change)
# Preview without writing
# Disable placeholder normalization and rename keys to snake_case
# Keep processing remaining files and summarize failures at the end
Options and behavior:
- --check: Detects normalization drift and exits non-zero when a file would change.
- --dry-run: Prints what would change and exits without writing files.
- --no-placeholders: Skips placeholder canonicalization (for example
%@→%s). - --key-style: Renames keys during normalization. Values:
none(default),snake,kebab,camel. - --output/-o: Single-input mode only. If multiple inputs are provided,
--outputis rejected. - --continue-on-error: Continues processing all matched inputs, prints a summary, and exits non-zero if any file failed.
- --inputs/-i: One or more files, including quoted glob patterns.
Supported normalize formats: .strings, Android strings.xml, .csv, .tsv, .xcstrings.
Notes
- Android plurals
<plurals>are supported. - Language inference:
en.lproj/Localizable.strings,values-es/strings.xml, basevalues/→enby default. - Globbing: use quotes for patterns in merge and edit (e.g.,
'**/*.xml'). - Global strict mode: add
--strictbefore any subcommand to disable parser fallbacks and enforce stricter failures.
License
MIT