File overview
i18n.yml controls locales, file mapping, model profiles, and optional advanced routing. i18n.jsonc is still supported for compatibility.
Starter config
hyperlocalise init.
When groups is omitted, Hyperlocalise automatically uses one implicit default group with:
- all locales from
locales.targets - all bucket names from
buckets
Locales
locales.source: source locale.locales.targets: list of target locales.- optional
locales.fallbacks: fallback order per locale.
Buckets
buckets map source files to target output templates.
Each file mapping uses:
from: source path templateto: target path template
{{source}}, {{target}}, and {{localeDir}} in templates. {{localeDir}} resolves to an empty segment when target equals source, and to the target locale otherwise.
PHP array locale mapping patterns
Laravel-style locale arrays can be mapped directly when each file returns one static PHP array.<?php and return a static [...] or array(...) literal. Hyperlocalise translates string leaves, flattens nested keys with dotted paths, and preserves comments, ordering, and array syntax when writing. Dynamic PHP such as variables, function calls, constants, declare(...), or interpolated double-quoted strings is intentionally rejected.
Supported locale file extensions include .json, .jsonc, .yaml, .yml, .php, .xml, .resx, .arb, .xlf, .xlif, .xliff, .po, .html, .liquid, .md, .mdx, .strings, .stringsdict, and .csv.
YAML/YML locale files should be mapping-shaped files with string leaves. Nested mappings become dotted keys, sequences become [index] keys, and writeback rewrites existing string leaves while preserving key order/comments where possible. Mapping keys cannot contain ., [, or ] because those characters are reserved for flattened paths. Non-string scalar leaves such as numbers, booleans, nulls, timestamps, anchors, and aliases are rejected to avoid silently corrupting metadata.
key, id, or name, or nested path-shaped leaves. Android <resources> files, mixed-content XML, and CDATA-preserving writeback are not handled by the generic XML parser.
CSV file mapping patterns
Use bucket file mappings to model CSV workflows. Per-locale files:run can update consistently.
Fluent file mapping patterns
Use.ftl mappings for Mozilla Fluent locale files:
brand.title. Fluent terms are not supported and fail during parsing.
JS/TS locale module patterns
Use JavaScript or TypeScript locale module mappings when your app imports locale objects directly:Apple string catalog mapping patterns
Use.xcstrings mappings for Xcode string catalogs:
localizations[targetLocale] and preserves catalog metadata. status and check read the requested target locale from the catalog. Variant and substitution source entries must include a source-language localization so Hyperlocalise can extract the source forms safely.
Android XML string resource mappings
Android XML support is intentionally scoped to string resource files namedstrings.xml under res/values* directories. Use Android locale qualifier names in your target paths:
<string name="..."> and <plurals name="..."><item quantity="...">. Resources marked translatable="false" are preserved and skipped. Unsupported translatable resource shapes such as <string-array> fail closed so they are not silently dropped.
Java properties file mapping patterns
Use.properties mappings for Java resource bundles with one file per locale:
.properties values.
Groups
groups.<name> defines what to process together.
targets: subset oflocales.targetsbuckets: list of bucket names
groups is optional for beginner configs. Add it when you want to split execution by locale or file set.
LLM profiles
llm.profiles.<name> fields:
provider:openai,azure_openai,anthropic,gemini,bedrock,lmstudio,groq,mistral, orollamamodel: provider model idsystem_prompt(optional): explicit system-message templateuser_prompt(optional): explicit user-message templateprompt(deprecated, optional): legacy prompt template used as system fallback
{{source}}{{target}}{{input}}
Rules
llm.rules choose profile per group.
priority: higher winsgroup: group nameprofile: profile name
llm.rules is optional. When no rule matches a group, Hyperlocalise falls back to llm.profiles.default.
Cache
cache configures the remote caching client.
enabled(optional): enable remote caching forrun.endpoint(optional unlessenabled=true): remote cache service endpoint.project_key_env(optional unlessenabled=true): environment variable that contains the project cache key.timeout_seconds(optional): remote cache request timeout in seconds.
Advanced example
Generate a starter
i18n.yml for your project.
Validation tips
- If you omit
groups, every bucket runs for every target locale. - Keep group targets inside
locales.targets. - Keep group buckets aligned with
bucketskeys. - Keep profile names consistent between
profilesandrules. - Use
hyperlocaliseforsync pushandsync pulljobs. - Keep
storagefor provider-specific TMS adapter configuration.