hyperlocalise phrase to push source files, wait for uploads, and pull
translations from Phrase Strings using supported .phrase.yml settings. Phrase
Strings workflows share one executable with local AI translation, checks, and
other TMS commands in the all-in-one localization CLI.
This command family targets Phrase Strings. It does not establish compatibility
with Phrase TMS projects or every product in the Phrase suite.
Start with a Phrase Strings push and pull
Install Hyperlocalise, setPHRASE_ACCESS_TOKEN
in your shell or CI secret manager, and prepare .phrase.yml with source and
target mappings. Replace a literal access_token secret in the config with
$PHRASE_ACCESS_TOKEN. Use a project where your token can upload and download files.
Hyperlocalise vs the official Phrase Strings CLI
Hyperlocalise is a Phrase Strings CLI alternative for supported file workflows. Both usepush and pull with .phrase.yml; Hyperlocalise adds other TMS commands
and local translation under one executable. Supported configuration is a subset,
so validate behavior as well as syntax when migrating.
See official Phrase Strings CLI documentation
for operations outside this command family.
Command reference
tm also accepts the alias translation-memory.
What this command family does
These commands operate on Phrase Strings file mode with.phrase.yml (or explicit flags).
They are separate from Hyperlocalise native i18n.yml and sync push / sync pull workflows. Use shared TMS sync when you want Hyperlocalise-managed entry sync through the Phrase adapter. Use this surface when you want a closer replacement for Phrase Strings CLI file workflows.
Use them for:
- scaffold a non-interactive
.phrase.ymlwithphrase init - source-file upload from
phrase.push.sources(pushis an alias ofupload sources) - translation download into
phrase.pull.targets(pullis an alias ofdownload translations) - locale listing from the Phrase project
- source download with explicit flags (no config-file mode)
- glossary and translation-memory download (CSV/TMX)
- config validation against
.phrase.yml
phrase init refuses to overwrite an existing .phrase.yml unless you pass --force. When --project-id is set and PHRASE_ACCESS_TOKEN or PHRASE_API_TOKEN is available, init calls Phrase to set phrase.push.sources[].params.locale_id to the project default locale; otherwise it falls back to en. Pass --source-locale to override. Do not commit a generated config that contains secrets.
Config lookup
If--config is omitted, Hyperlocalise checks PHRASEAPP_CONFIG, then .phrase.yml in the current directory, then $HOME/.phrase.yml.
In config mode, Hyperlocalise resolves the token in this order:
phrase.access_tokenas a literal value, or as$VAR/${VAR}from that named environment variablePHRASE_ACCESS_TOKEN, thenPHRASE_API_TOKEN, only whenphrase.access_tokenis omitted or empty
phrase.access_token is an environment reference ($VAR / ${VAR}), Hyperlocalise uses that variable only. An unset or empty reference does not fall through to PHRASE_ACCESS_TOKEN or PHRASE_API_TOKEN. Set the referenced variable, or omit access_token so the default env vars apply.
Manual flag commands (and config mode when you pass --token-env) read --token-env (default PHRASE_API_TOKEN). If you set a custom --token-env and it is empty, Hyperlocalise then tries PHRASE_API_TOKEN. --api-base-url overrides phrase.host.
upload sources and download translations use config mode when you pass --config, or when a config file resolves and you do not set --project-id, --format, or (for upload) --file / (for download) --output. download sources, glossary download, and tm download are flag-only.
Supported config fields
These drive Hyperlocalise Phrase file mode under thephrase: key:
access_tokenproject_idfile_formathostlocale_mappingpush.sources[].filepush.sources[].project_idpush.sources[].params.locale_idpush.sources[].params.file_formatpush.sources[].params.branchpush.sources[].params.tagspush.sources[].params.update_translationspush.sources[].params.update_translation_keyspush.sources[].params.update_descriptionspush.sources[].params.skip_upload_tagspush.sources[].params.skip_unverificationpush.sources[].params.file_encodingpush.sources[].params.locale_mappingpush.sources[].params.format_optionspush.sources[].params.autotranslatepush.sources[].params.mark_reviewedpull.targets[].filepull.targets[].project_idpull.targets[].params.locale_idpull.targets[].params.file_formatpull.targets[].params.branchpull.targets[].params.tagspull.targets[].params.include_empty_translationspull.targets[].params.exclude_empty_zero_formspull.targets[].params.include_translated_keyspull.targets[].params.keep_notranslate_tagspull.targets[].params.encodingpull.targets[].params.include_unverified_translationspull.targets[].params.use_last_reviewed_versionpull.targets[].params.fallback_locale_idpull.targets[].params.format_optionspull.targets[].params.source_locale_idpull.targets[].params.translation_key_prefixpull.targets[].params.filter_by_prefixpull.targets[].params.use_locale_fallbackpull.targets[].params.skip_unverified_translations
file values: <locale_name>, <locale_code>, <tag>, <tags>.
Unlike Crowdin file mode, unknown top-level YAML keys under .phrase.yml are silently dropped. Only fields listed above are applied.
These push.sources[].params and pull.targets[].params values apply in config mode only. Manual flag mode exposes a smaller set (--update-translations, --skip-upload-tags, --branch, --tag).
--dry-run with locale placeholders in config may require --source-locale or --target-locale because dry-run cannot call Phrase to enumerate locales.
Strings CLI gap inventory
Examples
download sources does not read .phrase.yml. Credentials come from --token-env (default PHRASE_API_TOKEN) or PHRASE_API_TOKEN.
Download one locale with flags. Use %locale% in --output when you pass more than one --target-locale:
.phrase.yml:
Live smoke (throwaway Phrase project)
Use a dedicated throwaway Strings project, not production. Cleanup deletes keys, not only translations.- In Phrase, create a Strings project with source locale
enand at least one target (for examplefr). - Create an access token (read/write). Do not commit it. In PowerShell:
export PHRASE_ACCESS_TOKEN=<token>.
- In an empty temp directory (set the token first so
initcan resolve the project default locale):
locale_id defaults to en; edit .phrase.yml or rerun init --force after exporting PHRASE_ACCESS_TOKEN. Use Phrase JSON ({"key":{"message":"..."}}) when the project expects structured JSON, not flat {"key":"value"}.
Confirm the last command prints upload_id=... and state=success (not processing). Copy the upload id.
- Pull:
locales/ (or the path in .phrase.yml).
- Cleanup dry-run, then skip or run for real only if this project is disposable:
.phrase.yml. Official phrase CLI is optional for comparison (phrase push --wait); Hyperlocalise’s commands are go run ./apps/cli phrase ....

