Translations
Every visible string in a form or journey is a key. This is the one store behind them — { key: { en, fr, … } }. The service substitutes the text when it answers a request, reading one flat catalogue per language; those are generated from here. A key with no text reaches the customer as the raw key.
943
Keys in use
2
Languages
154
No text at all
161
Orphans
Coverage of keys in use
en 789 / 943 · 84%
fr 730 / 943 · 77%
What the service will serve
ensrc/Modules/FormEngine/OmniDos.FormEngine/Locales/en.json950 entriesfrsrc/Modules/FormEngine/OmniDos.FormEngine/Locales/fr.json886 entries 154 key(s) in use have no en text.
The service falls back to en and then to the key itself, so these reach the customer as raw dotted strings in every language.
address_details.building.label, address_details.building.placeholder, address_details.ke.title, address_details.street.label, address_details.street.placeholder, biometric.leftHandData.helpText +148 more
59 key(s) have no fr text.
Requests with Accept-Language: fr get the en text for these, which is a mixed-language screen rather than a broken one.
address.cell.label, address.cell.placeholder, address.district.label, address.district.placeholder, address.error.cell.maxLength, address.error.cell.minLength +53 more
5 key(s) sit in helpText, which the service does not translate.
FormCopyTranslator visits a fixed set of properties; helpText is not among them, so this text is served as the raw key however well it is translated here. Add the property to FormCopyTranslator in the service.
biometric.leftHandData.helpText, biometric.rightHandData.helpText, occupation.employmentStatus.tz.helpText, occupation.profession.tz.helpText, occupation.sourceOfIncome.helpText
1104 keys · page 1 of 23
| Key | en | fr | |
|---|---|---|---|
accountOpening.statusPage.actionTitleform: account_opening | |||
accountOpening.statusPage.pageTitleform: account_opening | |||
accountOpening.statusPage.subtitleform: account_opening | |||
accountOpening.statusPage.titleform: account_opening | |||
address.address.labelform: address | |||
address.address.placeholderform: address | |||
address.cell.labelRW overlay: address | |||
address.cell.placeholderRW overlay: address | |||
address.city.labelUG overlay: addressform: address | |||
address.city.placeholderUG overlay: addressform: address | |||
address.cityTown.labelKE overlay: address | |||
address.cityTown.placeholderKE overlay: address | |||
address.countryOfResidence.labelKE overlay: basic_infoRW overlay: basic_info+3 more | |||
address.countryOfResidence.placeholderKE overlay: basic_infoRW overlay: basic_info+3 more | |||
address.county.labelKE overlay: address | |||
address.county.placeholderKE overlay: address | |||
address.district.labelRW overlay: address | |||
address.district.placeholderRW overlay: address | |||
address.error.address.maxLengthform: address | |||
address.error.address.minLengthform: address | |||
address.error.address.requiredform: address | |||
address.error.address.typeform: address | |||
address.error.cell.maxLengthRW overlay: address | |||
address.error.cell.minLengthRW overlay: address | |||
address.error.cell.requiredRW overlay: address | |||
address.error.cell.typeRW overlay: address | |||
address.error.city.maxLengthform: address | |||
address.error.city.minLengthform: address | |||
address.error.city.requiredform: address | |||
address.error.city.typeform: address | |||
address.error.cityTown.maxLengthUG overlay: address | |||
address.error.cityTown.minLengthUG overlay: address | |||
address.error.cityTown.requiredUG overlay: address | |||
address.error.cityTown.typeUG overlay: address | |||
address.error.countryOfResidence.maxLengthKE overlay: basic_infoRW overlay: basic_info+3 more | |||
address.error.countryOfResidence.minLengthKE overlay: basic_infoRW overlay: basic_info+3 more | |||
address.error.countryOfResidence.patternKE overlay: basic_infoRW overlay: basic_info+3 more | |||
address.error.countryOfResidence.requiredKE overlay: basic_infoRW overlay: basic_info+3 more | |||
address.error.countryOfResidence.typeKE overlay: basic_infoRW overlay: basic_info+3 more | |||
address.error.county.maxLength | |||
address.error.county.minLength | |||
address.error.county.required | |||
address.error.county.type | |||
address.error.district.maxLengthRW overlay: address | |||
address.error.district.minLengthRW overlay: address | |||
address.error.district.requiredRW overlay: address | |||
address.error.district.typeRW overlay: address | |||
address.error.postalAddress.maxLengthRW overlay: address | |||
address.error.postalAddress.minLengthRW overlay: address | |||
address.error.postalAddress.requiredRW overlay: address |
161 orphan keys — text with nothing referencing it, usually left behind when a field was renamed or removed. Filter to Orphans (unused) to review and delete them. Harmless, but they make coverage look worse than it is.
Send to a translator
A spreadsheet of key, en, fr — the English source alongside the column to fill in.
fr.json is the service's own catalogue format — the same file you'd find under Locales/, useful for handing to someone working in the backend repo.
154 key(s) have no text in any language, so they carry no English source to translate from. so they appear in exports.
Bring translations back
Paste the returned CSV (key column plus one column per language), the store's JSON, or one of the service's flat catalogues (Locales/fr.json). Existing text is kept unless you say otherwise.
No changes yet · 3 files
- +
translations/translations.json - +
src/Modules/FormEngine/OmniDos.FormEngine/Locales/en.json - +
src/Modules/FormEngine/OmniDos.FormEngine/Locales/fr.json
The store keeps every language for a key together, because that is what a person can edit; the service reads the transpose of it — one flat catalogue per language, embedded in
OmniDos.FormEngine — so both are written from here and ship in the same PR as the config that introduced the keys. The catalogues are whole-file replacements: they are written from the entire store, so apply them as they come rather than merging by hand. Per-form editing lives in each form's Translations tab; both write to this same store.