i18n.yml, bucket paths resolve relative to the config file for monorepo workflows, and extract is faster on large React Intl catalogs.
View the GitHub release · Full changelog
Breaking changes
None.Features
- Add an optional
versionfield toi18n.yml(for examplehyperlocalise@1.10.0) so projects can pin the CLI version, similar topackageManagerinpackage.json. Commands fail with a clear error when the running binary does not match the pin. GitHub Actions can install the pinned version withhyperlocalise-version: config. (#2171) - Expand
hyperlocalise crowdinwith discovery and resource commands:branch list/branch add,config sources/config translations,file list,language list,glossary list/glossary upload(TBX), andtm list/tm upload(TMX) with import polling and interruptible long imports. (#2124) - Add
crowdin string listfor source strings, path-basedcrowdin file upload/file download/file delete, and TM-onlycrowdin auto-translate(aliaspre-translate) with async status polling. Machine translation and AI pre-translate remain deferred. (#2137)
Fixes
check,status,pack,sync, andrunnow resolve bucket file paths relative to the i18n config file’s directory instead of the process working directory. This fixes failures when running from a monorepo root against a nested project config (for examplenested-app/i18n.jsoncwithsrc/locales/en/common.json). (#2170)- Reject i18n glob matches that escape the config root via directory symlinks, so
status,check,pack, andruncannot read or rewrite files outside the project. (#2226) - Reject out-of-range PHP octal escapes (for example
\400) instead of silently wrapping to NUL during locale file parsing. Valid escapes such as\377still decode. (#2225)
Performance
- React Intl
extractis about 28% faster on glob file resolution (1.77 ms → 1.28 ms), with 53% fewer allocations (5,266 → 2,466 allocs/op) and 33% less memory (326 KB → 217 KB/op). Message extraction is about 13% faster (684 µs → 592 µs); end-to-endextractis about 9% faster with 240 fewer allocations per operation. (#2177, #2199) - CSV marshaling saves about 163 KB per operation when no extra keys are present by skipping slice allocation and sorting. (#2162)
- Eval scoring reuses cached
language.Parseresults and avoids intermediate match slices during tag token counting (81 → 75–78 allocs/op inBenchmarkEvaluatorEvaluate). (#2127, #2144, #2224)
Tests
- Version pin enforcement across CLI commands, YAML loading, and
runsvcintegration. - Config-relative path resolution for
check,status,pack, andrun --dry-runfrom a foreign CWD. - Crowdin string list, file resolve/upload/download/delete, TM pre-translate polling, import edges, and file/directory/string pagination.
- Glob and directory-symlink escape regression for
status,check,pack, andrun.

