Onboarding configuration
esc
Country
Forms
↑↓ navigate↵ open40 results

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 entriesloaded by the service
frsrc/Modules/FormEngine/OmniDos.FormEngine/Locales/fr.json886 entriesloaded by the service
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.actionTitle
form: account_opening
accountOpening.statusPage.pageTitle
form: account_opening
accountOpening.statusPage.subtitle
form: account_opening
accountOpening.statusPage.title
form: account_opening
address.address.label
form: address
address.address.placeholder
form: address
address.cell.label
RW overlay: address
address.cell.placeholder
RW overlay: address
address.city.label
UG overlay: addressform: address
address.city.placeholder
UG overlay: addressform: address
address.cityTown.label
KE overlay: address
address.cityTown.placeholder
KE overlay: address
address.countryOfResidence.label
KE overlay: basic_infoRW overlay: basic_info+3 more
address.countryOfResidence.placeholder
KE overlay: basic_infoRW overlay: basic_info+3 more
address.county.label
KE overlay: address
address.county.placeholder
KE overlay: address
address.district.label
RW overlay: address
address.district.placeholder
RW overlay: address
address.error.address.maxLength
form: address
address.error.address.minLength
form: address
address.error.address.required
form: address
address.error.address.type
form: address
address.error.cell.maxLength
RW overlay: address
address.error.cell.minLength
RW overlay: address
address.error.cell.required
RW overlay: address
address.error.cell.type
RW overlay: address
address.error.city.maxLength
form: address
address.error.city.minLength
form: address
address.error.city.required
form: address
address.error.city.type
form: address
address.error.cityTown.maxLength
UG overlay: address
address.error.cityTown.minLength
UG overlay: address
address.error.cityTown.required
UG overlay: address
address.error.cityTown.type
UG overlay: address
address.error.countryOfResidence.maxLength
KE overlay: basic_infoRW overlay: basic_info+3 more
address.error.countryOfResidence.minLength
KE overlay: basic_infoRW overlay: basic_info+3 more
address.error.countryOfResidence.pattern
KE overlay: basic_infoRW overlay: basic_info+3 more
address.error.countryOfResidence.required
KE overlay: basic_infoRW overlay: basic_info+3 more
address.error.countryOfResidence.type
KE overlay: basic_infoRW overlay: basic_info+3 more
address.error.county.maxLength
orphan
address.error.county.minLength
orphan
address.error.county.required
orphan
address.error.county.type
orphan
address.error.district.maxLength
RW overlay: address
address.error.district.minLength
RW overlay: address
address.error.district.required
RW overlay: address
address.error.district.type
RW overlay: address
address.error.postalAddress.maxLength
RW overlay: address
address.error.postalAddress.minLength
RW overlay: address
address.error.postalAddress.required
RW 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.