@defra/forms-engine-plugin 4.23.0 → 5.0.0-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/.server/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
  2. package/.server/server/forms/simple-form.yaml +106 -3
  3. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +11 -11
  4. package/.server/server/plugins/engine/components/AutocompleteField.js +2 -2
  5. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  6. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +3 -2
  7. package/.server/server/plugins/engine/components/CheckboxesField.js +4 -9
  8. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  9. package/.server/server/plugins/engine/components/ComponentCollection.d.ts +8 -7
  10. package/.server/server/plugins/engine/components/ComponentCollection.js +106 -51
  11. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  12. package/.server/server/plugins/engine/components/DatePartsField.d.ts +8 -6
  13. package/.server/server/plugins/engine/components/DatePartsField.js +27 -9
  14. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  15. package/.server/server/plugins/engine/components/DeclarationField.d.ts +13 -11
  16. package/.server/server/plugins/engine/components/DeclarationField.js +31 -9
  17. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  18. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +6 -5
  19. package/.server/server/plugins/engine/components/EastingNorthingField.js +42 -22
  20. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  21. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +11 -14
  22. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -2
  23. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  24. package/.server/server/plugins/engine/components/FileUploadField.d.ts +14 -12
  25. package/.server/server/plugins/engine/components/FileUploadField.js +22 -12
  26. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  27. package/.server/server/plugins/engine/components/FormComponent.d.ts +21 -12
  28. package/.server/server/plugins/engine/components/FormComponent.js +33 -14
  29. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  30. package/.server/server/plugins/engine/components/GeospatialField.d.ts +14 -12
  31. package/.server/server/plugins/engine/components/GeospatialField.js +19 -13
  32. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  33. package/.server/server/plugins/engine/components/LatLongField.d.ts +6 -5
  34. package/.server/server/plugins/engine/components/LatLongField.js +32 -20
  35. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  36. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +7 -6
  37. package/.server/server/plugins/engine/components/ListFormComponent.js +19 -7
  38. package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
  39. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +17 -16
  40. package/.server/server/plugins/engine/components/LocationFieldBase.js +2 -2
  41. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  42. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +3 -3
  43. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +2 -2
  44. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  45. package/.server/server/plugins/engine/components/Markdown.d.ts +8 -7
  46. package/.server/server/plugins/engine/components/Markdown.js +5 -2
  47. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  48. package/.server/server/plugins/engine/components/MonthYearField.d.ts +9 -7
  49. package/.server/server/plugins/engine/components/MonthYearField.js +26 -8
  50. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  51. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +10 -9
  52. package/.server/server/plugins/engine/components/MultilineTextField.js +2 -2
  53. package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -1
  54. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  55. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +14 -6
  56. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  57. package/.server/server/plugins/engine/components/NumberField.d.ts +10 -9
  58. package/.server/server/plugins/engine/components/NumberField.js +2 -2
  59. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  60. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
  61. package/.server/server/plugins/engine/components/OsGridRefField.js +14 -6
  62. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  63. package/.server/server/plugins/engine/components/PaymentField.d.ts +12 -10
  64. package/.server/server/plugins/engine/components/PaymentField.js +21 -8
  65. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  66. package/.server/server/plugins/engine/components/SelectField.d.ts +11 -11
  67. package/.server/server/plugins/engine/components/SelectField.js +2 -2
  68. package/.server/server/plugins/engine/components/SelectField.js.map +1 -1
  69. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +4 -4
  70. package/.server/server/plugins/engine/components/SelectionControlField.js +2 -2
  71. package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -1
  72. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +10 -9
  73. package/.server/server/plugins/engine/components/TelephoneNumberField.js +2 -2
  74. package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -1
  75. package/.server/server/plugins/engine/components/UkAddressField.d.ts +12 -10
  76. package/.server/server/plugins/engine/components/UkAddressField.js +29 -17
  77. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  78. package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -0
  79. package/.server/server/plugins/engine/components/YesNoField.js +9 -0
  80. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  81. package/.server/server/plugins/engine/components/helpers/components.d.ts +3 -2
  82. package/.server/server/plugins/engine/components/helpers/components.js +11 -8
  83. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  84. package/.server/server/plugins/engine/components/types.d.ts +8 -1
  85. package/.server/server/plugins/engine/components/types.js.map +1 -1
  86. package/.server/server/plugins/engine/configureEnginePlugin.js +8 -1
  87. package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -1
  88. package/.server/server/plugins/engine/form-context.d.ts +1 -0
  89. package/.server/server/plugins/engine/form-context.js +4 -2
  90. package/.server/server/plugins/engine/form-context.js.map +1 -1
  91. package/.server/server/plugins/engine/helpers.d.ts +1 -1
  92. package/.server/server/plugins/engine/helpers.js +8 -13
  93. package/.server/server/plugins/engine/helpers.js.map +1 -1
  94. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +39 -0
  95. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +50 -0
  96. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -0
  97. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +5 -0
  98. package/.server/server/plugins/engine/i18n/createFormTranslator.js +18 -0
  99. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -0
  100. package/.server/server/plugins/engine/i18n/createTranslator.d.ts +9 -0
  101. package/.server/server/plugins/engine/i18n/createTranslator.js +51 -0
  102. package/.server/server/plugins/engine/i18n/createTranslator.js.map +1 -0
  103. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +5 -0
  104. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +57 -0
  105. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -0
  106. package/.server/server/plugins/engine/i18n/index.d.ts +18 -0
  107. package/.server/server/plugins/engine/i18n/index.js +71 -0
  108. package/.server/server/plugins/engine/i18n/index.js.map +1 -0
  109. package/.server/server/plugins/engine/i18n/translations/cy.json +271 -0
  110. package/.server/server/plugins/engine/i18n/translations/en-GB.json +271 -0
  111. package/.server/server/plugins/engine/i18n/types.d.ts +41 -0
  112. package/.server/server/plugins/engine/i18n/types.js +2 -0
  113. package/.server/server/plugins/engine/i18n/types.js.map +1 -0
  114. package/.server/server/plugins/engine/index.js +3 -2
  115. package/.server/server/plugins/engine/index.js.map +1 -1
  116. package/.server/server/plugins/engine/models/FormModel.d.ts +9 -1
  117. package/.server/server/plugins/engine/models/FormModel.js +44 -18
  118. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  119. package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +5 -2
  120. package/.server/server/plugins/engine/models/SummaryViewModel.js +44 -18
  121. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  122. package/.server/server/plugins/engine/options.js +2 -1
  123. package/.server/server/plugins/engine/options.js.map +1 -1
  124. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +4 -0
  125. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  126. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  127. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  128. package/.server/server/plugins/engine/outputFormatters/machine/v1.js +7 -6
  129. package/.server/server/plugins/engine/outputFormatters/machine/v1.js.map +1 -1
  130. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +2 -1
  131. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +6 -3
  132. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  133. package/.server/server/plugins/engine/pageControllers/PageController.d.ts +3 -1
  134. package/.server/server/plugins/engine/pageControllers/PageController.js +11 -1
  135. package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -1
  136. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +4 -2
  137. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +52 -21
  138. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  139. package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +3 -2
  140. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +63 -26
  141. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  142. package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +3 -1
  143. package/.server/server/plugins/engine/pageControllers/StartPageController.js +2 -2
  144. package/.server/server/plugins/engine/pageControllers/StartPageController.js.map +1 -1
  145. package/.server/server/plugins/engine/pageControllers/StatusPageController.js +12 -2
  146. package/.server/server/plugins/engine/pageControllers/StatusPageController.js.map +1 -1
  147. package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +4 -3
  148. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +44 -28
  149. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  150. package/.server/server/plugins/engine/pageControllers/__stubs__/translator.d.ts +2 -0
  151. package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js +24 -0
  152. package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js.map +1 -0
  153. package/.server/server/plugins/engine/pageControllers/errors.d.ts +1 -1
  154. package/.server/server/plugins/engine/pageControllers/errors.js +3 -2
  155. package/.server/server/plugins/engine/pageControllers/errors.js.map +1 -1
  156. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +3 -2
  157. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +4 -4
  158. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  159. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +7 -3
  160. package/.server/server/plugins/engine/pageControllers/validationOptions.js +34 -33
  161. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  162. package/.server/server/plugins/engine/plugin.js +2 -0
  163. package/.server/server/plugins/engine/plugin.js.map +1 -1
  164. package/.server/server/plugins/engine/routes/index.js +4 -1
  165. package/.server/server/plugins/engine/routes/index.js.map +1 -1
  166. package/.server/server/plugins/engine/routes/questions.js +5 -2
  167. package/.server/server/plugins/engine/routes/questions.js.map +1 -1
  168. package/.server/server/plugins/engine/types/index.d.ts +1 -0
  169. package/.server/server/plugins/engine/types/index.js.map +1 -1
  170. package/.server/server/plugins/engine/types/schema.js +1 -0
  171. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  172. package/.server/server/plugins/engine/types.d.ts +12 -1
  173. package/.server/server/plugins/engine/types.js.map +1 -1
  174. package/.server/server/plugins/engine/views/components/_location-field-base.html +1 -1
  175. package/.server/server/plugins/engine/views/components/fileuploadfield.html +3 -3
  176. package/.server/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
  177. package/.server/server/plugins/engine/views/components/osgridreffield.html +1 -1
  178. package/.server/server/plugins/engine/views/components/paymentfield.html +8 -8
  179. package/.server/server/plugins/engine/views/components/ukaddressfield.html +4 -4
  180. package/.server/server/plugins/engine/views/confirmation.html +4 -4
  181. package/.server/server/plugins/engine/views/exit.html +4 -4
  182. package/.server/server/plugins/engine/views/file-upload.html +3 -3
  183. package/.server/server/plugins/engine/views/index.html +3 -3
  184. package/.server/server/plugins/engine/views/item-delete.html +1 -1
  185. package/.server/server/plugins/engine/views/partials/form.html +3 -3
  186. package/.server/server/plugins/engine/views/partials/preview-banner.html +4 -4
  187. package/.server/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
  188. package/.server/server/plugins/engine/views/repeat-list-summary.html +4 -4
  189. package/.server/server/plugins/engine/views/summary.html +14 -7
  190. package/.server/server/plugins/nunjucks/enviroment.test.js +10 -0
  191. package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
  192. package/.server/server/plugins/nunjucks/environment.d.ts +8 -0
  193. package/.server/server/plugins/nunjucks/environment.js +13 -0
  194. package/.server/server/plugins/nunjucks/environment.js.map +1 -1
  195. package/.server/server/plugins/nunjucks/filters/answer.js +9 -1
  196. package/.server/server/plugins/nunjucks/filters/answer.js.map +1 -1
  197. package/.server/server/plugins/nunjucks/filters/answer.test.js +13 -2
  198. package/.server/server/plugins/nunjucks/filters/answer.test.js.map +1 -1
  199. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  200. package/.server/server/plugins/postcode-lookup/models/index.d.ts +24 -19
  201. package/.server/server/plugins/postcode-lookup/models/index.js +83 -76
  202. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  203. package/.server/server/plugins/postcode-lookup/routes/index.js +7 -13
  204. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  205. package/.server/server/plugins/postcode-lookup/types.d.ts +1 -0
  206. package/.server/server/plugins/postcode-lookup/types.js +1 -0
  207. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  208. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  209. package/.server/server/types.d.ts +2 -1
  210. package/.server/server/types.js.map +1 -1
  211. package/.server/server/utils/utils.d.ts +5 -0
  212. package/.server/server/utils/utils.js +16 -0
  213. package/.server/server/utils/utils.js.map +1 -1
  214. package/.server/typings/hapi/index.d.js.map +1 -1
  215. package/package.json +3 -2
  216. package/src/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
  217. package/src/server/forms/simple-form.yaml +106 -3
  218. package/src/server/plugins/engine/components/AutocompleteField.ts +3 -6
  219. package/src/server/plugins/engine/components/CheckboxesField.ts +12 -11
  220. package/src/server/plugins/engine/components/ComponentCollection.ts +143 -61
  221. package/src/server/plugins/engine/components/DatePartsField.ts +33 -11
  222. package/src/server/plugins/engine/components/DeclarationField.ts +37 -14
  223. package/src/server/plugins/engine/components/EastingNorthingField.ts +83 -22
  224. package/src/server/plugins/engine/components/EmailAddressField.ts +4 -7
  225. package/src/server/plugins/engine/components/FileUploadField.ts +28 -22
  226. package/src/server/plugins/engine/components/FormComponent.ts +49 -12
  227. package/src/server/plugins/engine/components/GeospatialField.ts +36 -21
  228. package/src/server/plugins/engine/components/LatLongField.ts +52 -21
  229. package/src/server/plugins/engine/components/ListFormComponent.ts +26 -10
  230. package/src/server/plugins/engine/components/LocationFieldBase.ts +5 -8
  231. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +3 -3
  232. package/src/server/plugins/engine/components/Markdown.ts +7 -3
  233. package/src/server/plugins/engine/components/MonthYearField.ts +32 -10
  234. package/src/server/plugins/engine/components/MultilineTextField.ts +5 -8
  235. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +25 -11
  236. package/src/server/plugins/engine/components/NumberField.ts +3 -4
  237. package/src/server/plugins/engine/components/OsGridRefField.ts +25 -9
  238. package/src/server/plugins/engine/components/PaymentField.ts +22 -12
  239. package/src/server/plugins/engine/components/SelectField.ts +3 -6
  240. package/src/server/plugins/engine/components/SelectionControlField.ts +7 -8
  241. package/src/server/plugins/engine/components/TelephoneNumberField.ts +4 -7
  242. package/src/server/plugins/engine/components/UkAddressField.ts +33 -18
  243. package/src/server/plugins/engine/components/YesNoField.ts +10 -0
  244. package/src/server/plugins/engine/components/helpers/components.ts +13 -6
  245. package/src/server/plugins/engine/components/types.ts +9 -0
  246. package/src/server/plugins/engine/configureEnginePlugin.ts +12 -1
  247. package/src/server/plugins/engine/form-context.ts +8 -2
  248. package/src/server/plugins/engine/helpers.ts +10 -18
  249. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +69 -0
  250. package/src/server/plugins/engine/i18n/createFormTranslator.ts +33 -0
  251. package/src/server/plugins/engine/i18n/createTranslator.ts +61 -0
  252. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +61 -0
  253. package/src/server/plugins/engine/i18n/index.ts +80 -0
  254. package/src/server/plugins/engine/i18n/translations/cy.json +271 -0
  255. package/src/server/plugins/engine/i18n/translations/en-GB.json +271 -0
  256. package/src/server/plugins/engine/i18n/types.ts +62 -0
  257. package/src/server/plugins/engine/index.ts +4 -2
  258. package/src/server/plugins/engine/models/FormModel.ts +59 -23
  259. package/src/server/plugins/engine/models/SummaryViewModel.ts +68 -25
  260. package/src/server/plugins/engine/options.js +2 -1
  261. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +5 -0
  262. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -3
  263. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +9 -8
  264. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +7 -3
  265. package/src/server/plugins/engine/pageControllers/PageController.ts +12 -1
  266. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +53 -21
  267. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +66 -29
  268. package/src/server/plugins/engine/pageControllers/StartPageController.ts +7 -2
  269. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +10 -2
  270. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +48 -22
  271. package/src/server/plugins/engine/pageControllers/__stubs__/translator.ts +28 -0
  272. package/src/server/plugins/engine/pageControllers/errors.ts +4 -2
  273. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +11 -4
  274. package/src/server/plugins/engine/pageControllers/validationOptions.ts +43 -53
  275. package/src/server/plugins/engine/plugin.ts +2 -0
  276. package/src/server/plugins/engine/routes/index.ts +9 -1
  277. package/src/server/plugins/engine/routes/questions.ts +5 -1
  278. package/src/server/plugins/engine/types/index.ts +5 -0
  279. package/src/server/plugins/engine/types/schema.ts +1 -0
  280. package/src/server/plugins/engine/types.ts +10 -0
  281. package/src/server/plugins/engine/views/components/_location-field-base.html +1 -1
  282. package/src/server/plugins/engine/views/components/fileuploadfield.html +3 -3
  283. package/src/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
  284. package/src/server/plugins/engine/views/components/osgridreffield.html +1 -1
  285. package/src/server/plugins/engine/views/components/paymentfield.html +8 -8
  286. package/src/server/plugins/engine/views/components/ukaddressfield.html +4 -4
  287. package/src/server/plugins/engine/views/confirmation.html +4 -4
  288. package/src/server/plugins/engine/views/exit.html +4 -4
  289. package/src/server/plugins/engine/views/file-upload.html +3 -3
  290. package/src/server/plugins/engine/views/index.html +3 -3
  291. package/src/server/plugins/engine/views/item-delete.html +1 -1
  292. package/src/server/plugins/engine/views/partials/form.html +3 -3
  293. package/src/server/plugins/engine/views/partials/preview-banner.html +4 -4
  294. package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
  295. package/src/server/plugins/engine/views/repeat-list-summary.html +4 -4
  296. package/src/server/plugins/engine/views/summary.html +14 -7
  297. package/src/server/plugins/nunjucks/environment.js +14 -0
  298. package/src/server/plugins/nunjucks/filters/answer.js +12 -1
  299. package/src/server/plugins/postcode-lookup/models/index.js +144 -87
  300. package/src/server/plugins/postcode-lookup/routes/index.js +13 -16
  301. package/src/server/plugins/postcode-lookup/types.js +1 -0
  302. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  303. package/src/server/types.ts +2 -0
  304. package/src/server/utils/utils.js +14 -0
  305. package/src/typings/hapi/index.d.ts +1 -0
  306. package/.server/server/plugins/engine/components/constants.d.ts +0 -1
  307. package/.server/server/plugins/engine/components/constants.js +0 -2
  308. package/.server/server/plugins/engine/components/constants.js.map +0 -1
  309. package/src/server/plugins/engine/components/constants.ts +0 -1
@@ -0,0 +1,33 @@
1
+ import { type FormDefinition } from '@defra/forms-model'
2
+ import { type i18n } from 'i18next'
3
+
4
+ import { createTranslator } from './createTranslator.js'
5
+ import { extractBaseTranslations } from './extractBaseTranslations.js'
6
+ import { createFormI18nInstance } from './index.js'
7
+ import {
8
+ type FormDefinitionTranslations,
9
+ type Translator
10
+ } from './types.js'
11
+
12
+ export function createFormTranslator(
13
+ def: FormDefinition,
14
+ language: string
15
+ ): Translator {
16
+ const baseTranslations = extractBaseTranslations(def)
17
+ const i18nInstance = createFormI18nInstance(baseTranslations)
18
+ loadFormTranslations(def, i18nInstance)
19
+
20
+ return createTranslator(i18nInstance, language)
21
+ }
22
+
23
+ export function loadFormTranslations(def: FormDefinition, i18nInstance: i18n) {
24
+ const formTranslations = def.metadata?.translations as
25
+ | FormDefinitionTranslations
26
+ | undefined
27
+
28
+ if (formTranslations) {
29
+ for (const [lng, resources] of Object.entries(formTranslations)) {
30
+ i18nInstance.addResourceBundle(lng, 'form', resources, true, true)
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,61 @@
1
+ import { type i18n } from 'i18next'
2
+
3
+ import { type Translator } from './types.js'
4
+
5
+ /**
6
+ * Creates a translator for the specified language, decorated with utility functions
7
+ * for translating specific parts of the form definition.
8
+ * @param i18nInstance - instance of i18next which gets created on startup (reads the boilerplate files en-GB.json and cy.json)
9
+ * @param language - requested language
10
+ */
11
+ export function createTranslator(
12
+ i18nInstance: i18n,
13
+ language = 'en-GB'
14
+ ): Translator {
15
+ const t = (key: string, opts?: Record<string, unknown>): string =>
16
+ i18nInstance.t(key, { lng: language, ns: 'plugin', ...opts })
17
+
18
+ const resolveContent = (
19
+ entity: { id?: string },
20
+ entityType: string,
21
+ prop: string
22
+ ): string => {
23
+ if (!entity.id) {
24
+ const raw = (entity as Record<string, unknown>)[prop]
25
+ if (typeof raw !== 'string') return ''
26
+ // t() resolves i18next key constants (sub-field labels); returns raw string unchanged if not a key
27
+ return t(raw)
28
+ }
29
+ const key = `${entityType}.${entity.id}.${prop}`
30
+ const result = i18nInstance.t(key, {
31
+ lng: language,
32
+ ns: 'form'
33
+ })
34
+ if (result === key) {
35
+ // No form translation found — fall through to t(raw) so plugin i18n
36
+ // key constants (e.g. 'components.yesNoField.yes') are still resolved.
37
+ const raw = (entity as Record<string, unknown>)[prop]
38
+ if (typeof raw !== 'string') return ''
39
+ return t(raw)
40
+ }
41
+ return result
42
+ }
43
+
44
+ const resolveFormContent = (prop: string) => {
45
+ const key = `form.${prop}`
46
+ return i18nInstance.t(key, { lng: language, ns: 'form' })
47
+ }
48
+
49
+ return {
50
+ t,
51
+ tForm: (prop) => resolveFormContent(prop),
52
+ tPage: (entity, prop) => resolveContent(entity, 'pages', prop as string),
53
+ tComponent: (entity, prop) =>
54
+ resolveContent(entity, 'components', prop as string),
55
+ tSection: (entity, prop) =>
56
+ resolveContent(entity, 'sections', prop as string),
57
+ tListItem: (entity, prop) =>
58
+ resolveContent(entity, 'listItems', prop as string),
59
+ language
60
+ }
61
+ }
@@ -0,0 +1,61 @@
1
+ import {
2
+ hasComponentsEvenIfNoNext,
3
+ type FormDefinition
4
+ } from '@defra/forms-model'
5
+
6
+ import { type FormDefinitionTranslations } from './types.js'
7
+
8
+ type BaseTranslations = FormDefinitionTranslations[string]
9
+
10
+ export function extractBaseTranslations(def: FormDefinition): BaseTranslations {
11
+ const pages: BaseTranslations['pages'] = {}
12
+ const components: BaseTranslations['components'] = {}
13
+ const sections: BaseTranslations['sections'] = {}
14
+ const listItems: BaseTranslations['listItems'] = {}
15
+ const form: BaseTranslations['form'] = {}
16
+
17
+ for (const page of def.pages) {
18
+ if (page.id && page.title) {
19
+ pages[page.id] = { title: page.title }
20
+ }
21
+
22
+ if (hasComponentsEvenIfNoNext(page)) {
23
+ for (const component of page.components) {
24
+ if (!component.id) continue
25
+
26
+ const entry: BaseTranslations['components'][string] = {}
27
+
28
+ if (component.title) entry.title = component.title
29
+ if ('hint' in component && component.hint) entry.hint = component.hint
30
+ if ('content' in component && component.content) {
31
+ entry.content = component.content
32
+ }
33
+ if ('shortDescription' in component && component.shortDescription) {
34
+ entry.shortDescription = component.shortDescription
35
+ }
36
+
37
+ if (Object.keys(entry).length) {
38
+ components[component.id] = entry
39
+ }
40
+ }
41
+ }
42
+ }
43
+
44
+ for (const section of def.sections) {
45
+ if (section.id && section.title) {
46
+ sections[section.id] = { title: section.title }
47
+ }
48
+ }
49
+
50
+ for (const list of def.lists) {
51
+ for (const item of list.items) {
52
+ if (item.id && item.text) {
53
+ listItems[item.id] = { text: item.text }
54
+ }
55
+ }
56
+ }
57
+
58
+ form.title = def.name ?? ''
59
+
60
+ return { pages, components, sections, listItems, form }
61
+ }
@@ -0,0 +1,80 @@
1
+ import { getErrorMessage } from '@defra/forms-model'
2
+ import i18next, { createInstance } from 'i18next'
3
+
4
+ import { logger } from '../../../common/helpers/logging/logger.js'
5
+ import cy from './translations/cy.json' with { type: 'json' }
6
+ import enGB from './translations/en-GB.json' with { type: 'json' }
7
+ import { type FormDefinitionTranslations } from './types.js'
8
+
9
+ type BaseTranslations = FormDefinitionTranslations[string]
10
+
11
+ i18next
12
+ .init({
13
+ resources: {
14
+ 'en-GB': { translation: enGB },
15
+ cy: { translation: cy }
16
+ },
17
+ fallbackLng: 'en-GB',
18
+ interpolation: {
19
+ prefix: '[[',
20
+ suffix: ']]',
21
+ escapeValue: false
22
+ }
23
+ })
24
+ .catch((err: unknown) => {
25
+ logger.error(`Fatal init for translator i18next: ${getErrorMessage(err)}`)
26
+ })
27
+
28
+ /**
29
+ * Generic translation utility function
30
+ * @param key - key for lookup
31
+ * @param language - language requested
32
+ * @param options
33
+ * @returns {string}
34
+ */
35
+ export function t(
36
+ key: string,
37
+ language: string,
38
+ options?: Record<string, unknown>
39
+ ): string {
40
+ return i18next.t(key, { lng: language, ...options })
41
+ }
42
+
43
+ /**
44
+ * Creates an instance of i18next with base (boilerplate) translation files loaded (en-GB.json and cy.json),
45
+ * and appropriate namespaces for loading of form-specific translations later
46
+ * @param formEnGb
47
+ * @returns
48
+ */
49
+ export function createFormI18nInstance(formEnGb: BaseTranslations) {
50
+ const instance = createInstance()
51
+
52
+ instance
53
+ .init({
54
+ resources: {
55
+ 'en-GB': {
56
+ plugin: enGB,
57
+ form: formEnGb
58
+ },
59
+ cy: {
60
+ plugin: cy
61
+ }
62
+ },
63
+ fallbackLng: 'en-GB',
64
+ ns: ['plugin', 'form'],
65
+ defaultNS: 'plugin',
66
+ interpolation: {
67
+ prefix: '[[',
68
+ suffix: ']]',
69
+ escapeValue: false
70
+ }
71
+ })
72
+ .catch((err: unknown) => {
73
+ // init with inline resources completes synchronously — unreachable
74
+ logger.error(
75
+ `Fatal init for translator instance: ${getErrorMessage(err)}`
76
+ )
77
+ })
78
+
79
+ return instance
80
+ }
@@ -0,0 +1,271 @@
1
+ {
2
+ "validation": {
3
+ "required": "Nodwch {{lowerFirst(#label)}}",
4
+ "selectRequired": "Dewiswch {{lowerFirst(#label)}}",
5
+ "pattern": "Nodwch {{lowerFirst(#label)}} dilys",
6
+ "format": "Nodwch {{lowerFirst(#label)}} yn y fformat cywir",
7
+ "objectRequired": "Nodwch {{#label}}",
8
+ "objectMissing": "Rhaid i {{#title}} gynnwys {{lowerFirst(#label)}}",
9
+ "max": "Rhaid i {{#label}} fod yn {{#limit}} o nodau neu lai",
10
+ "min": "Rhaid i {{#label}} fod yn {{#limit}} o nodau neu fwy",
11
+ "minMax": "Rhaid i {{#label}} fod rhwng {{#min}} a {{#max}} o nodau",
12
+ "number": "Rhaid i {{#label}} fod yn rhif",
13
+ "numberPrecision": "Rhaid i {{#label}} beidio â chael mwy na {{#limit}} lle degol",
14
+ "numberInteger": "Rhaid i {{#label}} fod yn rhif cyfan",
15
+ "numberMin": "Rhaid i {{#label}} fod yn {{#limit}} neu uwch",
16
+ "numberMax": "Rhaid i {{#label}} fod yn {{#limit}} neu is",
17
+ "maxWords": "Rhaid i {{#label}} fod yn {{#limit}} o eiriau neu lai"
18
+ },
19
+
20
+ "errors": {
21
+ "title": "Mae problem",
22
+ "optionsMismatch": "Mae'r opsiynau'n wahanol oherwydd i chi newid ateb blaenorol"
23
+ },
24
+
25
+ "common": {
26
+ "optional": "(dewisol)",
27
+ "warningIconFallback": "Rhybudd",
28
+ "back": "Yn ôl",
29
+ "continue": "Parhau",
30
+ "saveAndExit": "Cadw a gadael",
31
+ "draft": "ddrafft",
32
+ "live": "fyw"
33
+ },
34
+
35
+ "pages": {
36
+ "question": {
37
+ "paymentCancelledBannerTitle": "Pwysig",
38
+ "paymentCancelledTitle": "Mae eich taliad wedi'i ganslo",
39
+ "paymentCancelledBody": "Cafodd eich manylion talu eu dileu oherwydd bod y ffurflen yn anweithredol am 5 diwrnod.",
40
+ "paymentCancelledAction": "Ychwanegwch eich manylion talu eto.",
41
+ "backToAddAnother": "Ewch yn ôl i ychwanegu un arall",
42
+ "backToCheckAnswers": "Ewch yn ôl i wirio'ch atebion",
43
+ "startNow": "Dechrau nawr"
44
+ },
45
+
46
+ "summary": {
47
+ "title": "Gwiriwch eich atebion cyn anfon eich ffurflen",
48
+ "change": "Newid",
49
+ "notProvided": "Heb ei ddarparu",
50
+ "declaration": "Datganiad",
51
+ "acceptAndSubmit": "Derbyn a chyflwyno",
52
+ "payAndSubmit": "Talu a chyflwyno",
53
+ "submit": "Cyflwyno",
54
+ "saveAndExit": "Cadw a gadael",
55
+ "paymentSuccessBannerTitle": "Llwyddiant",
56
+ "paymentSuccessTitle": "Mae gennym eich manylion talu",
57
+ "paymentSuccessBody": "Mae eich taliad ar ddal. Byddwn yn codi tâl arnoch pan fyddwch yn cyflwyno'r ffurflen.",
58
+ "paymentDetailsTitle": "Manylion talu",
59
+ "paymentFor": "Taliad am",
60
+ "totalAmount": "Cyfanswm",
61
+ "reference": "Cyfeirnod",
62
+ "dateOfPayment": "Dyddiad talu",
63
+ "submissionFailed": "Roedd problem ac ni chyflwynwyd eich ffurflen. Ceisiwch gyflwyno'r ffurflen eto",
64
+ "submissionFailedContactSuffix": " neu gallwch [[contactUsLink]] a dyfynnu'ch cyfeirnod i drefnu ad-daliad",
65
+ "contactUsLinkText": "cysylltu â ni (yn agor mewn tab newydd)",
66
+ "confirmationEmail": "E-bost cadarnhad (dewisol)",
67
+ "confirmationEmailHint": "Rhowch eich cyfeiriad e-bost i dderbyn e-bost cadarnhau a chopi o'ch atebion"
68
+ },
69
+
70
+ "repeater": {
71
+ "removeAnswer": "Ydych chi'n siŵr eich bod am dynnu'r ateb hwn?",
72
+ "remove": "Tynnu",
73
+ "cancel": "Canslo",
74
+ "lastItemCannotBeRemoved": "Ni ellir tynnu eitem olaf y rhestr",
75
+ "itemToRemoveNotFound": "Ni chanfuwyd eitem y rhestr i'w thynnu",
76
+ "continue": "Parhau",
77
+ "addAnother": "Ychwanegu un arall",
78
+ "saveAndExit": "Cadw a gadael",
79
+ "change": "Newid",
80
+ "notProvided": "Heb ei ddarparu",
81
+ "visuallyHiddenItem": "eitem [[index]]",
82
+ "pageTitle_one": "Rydych wedi ychwanegu [[count]] ateb",
83
+ "pageTitle_other": "Rydych wedi ychwanegu [[count]] ateb",
84
+ "tooMany_one": "Dim ond hyd at [[count]] ateb y gallwch ei ychwanegu",
85
+ "tooMany_other": "Dim ond hyd at [[count]] ateb y gallwch eu hychwanegu",
86
+ "tooFew_one": "Rhaid i chi ychwanegu o leiaf [[count]] ateb",
87
+ "tooFew_other": "Rhaid i chi ychwanegu o leiaf [[count]] ateb"
88
+ },
89
+
90
+ "fileUpload": {
91
+ "upload": "Uwchlwytho ffeil",
92
+ "maxFilesReached": "Rydych wedi cyrraedd nifer uchaf y ffeiliau. Tynnwch ffeil i uwchlwytho rhagor."
93
+ },
94
+
95
+ "exit": {
96
+ "defaultTitle": "Mae eich cynnydd wedi'i gadw",
97
+ "whatHappensNext": "Beth sy'n digwydd nesaf",
98
+ "body": "Mae cynnydd eich ffurflen wedi'i gadw. Gallwch ddychwelyd i gwblhau eich cais ar unrhyw adeg gan ddefnyddio'r ddolen a ddarperir.",
99
+ "returnToApplication": "Dychwelyd i'r cais"
100
+ },
101
+
102
+ "confirmation": {
103
+ "formSubmitted": "Ffurflen wedi'i chyflwyno",
104
+ "whatHappensNext": "Beth sy'n digwydd nesaf",
105
+ "referenceNumber": "Eich cyfeirnod",
106
+ "feedbackLink": "Beth yw eich barn am y gwasanaeth hwn? (yn cymryd 30 eiliad)"
107
+ },
108
+
109
+ "preview": {
110
+ "warnMissingNotificationEmail": {
111
+ "body": "Os hoffech dderbyn e-bost prawf, [[link]] yr hoffech i gyflwyniadau ffurflen fynd iddo.",
112
+ "linkText": "nodwch y cyfeiriad e-bost (yn agor mewn tab newydd)"
113
+ },
114
+ "bannerForce": "Rhagolwg o ffurflen [[previewMode]] yw hon. Peidiwch â rhoi gwybodaeth bersonol.",
115
+ "bannerText": "Dyma ragolwg o dudalen ffurflen [[previewMode]] rydych chi'n ei golygu.",
116
+ "previousPages": "Mae'n dibynnu ar atebion o dudalennau cynharach yn y ffurflen. Yn y fersiwn fyw, bydd angen i ddefnyddwyr gwblhau'r cwestiynau hynny yn gyntaf."
117
+ }
118
+ },
119
+
120
+ "postcodeLookup": {
121
+ "postcodeLabel": "Cod post",
122
+ "postcodeHint": "Er enghraifft, AA3 1AB",
123
+ "buildingNameLabel": "Enw neu rif yr adeilad (dewisol)",
124
+ "buildingNameHint": "Er enghraifft, 15 neu Bryn Melyn",
125
+ "selectAddress": "Dewiswch gyfeiriad",
126
+ "addressLine1Label": "Llinell cyfeiriad 1",
127
+ "addressLine2Label": "Llinell cyfeiriad 2 (dewisol)",
128
+ "townLabel": "Tref neu ddinas",
129
+ "countyLabel": "Sir (dewisol)",
130
+ "findAddress": "Dod o hyd i gyfeiriad",
131
+ "enterManually": "nodwch gyfeiriad â llaw",
132
+ "searchAgain": "Chwilio eto",
133
+ "useThisAddress": "Defnyddio'r cyfeiriad hwn",
134
+ "findAnAddressInstead": "dod o hyd i gyfeiriad yn lle hynny",
135
+ "noAddressFoundTitle": "Ni chanfuwyd cyfeiriad",
136
+ "noAddressFoundBody": "Ni allem ddod o hyd i gyfeiriad cyfatebol",
137
+ "addressFound_one": "Canfuwyd [[count]] cyfeiriad ar gyfer",
138
+ "addressFound_other": "Canfuwyd [[count]] cyfeiriad ar gyfer",
139
+ "validation": {
140
+ "invalidPostcode": "Nodwch god post dilys neu nodwch gyfeiriad â llaw",
141
+ "requiredPostcode": "Nodwch god post",
142
+ "selectAddress": "Dewiswch gyfeiriad",
143
+ "requiredAddressLine1": "Nodwch linell cyfeiriad 1",
144
+ "requiredTown": "Nodwch dref neu ddinas",
145
+ "invalidManualPostcode": "Nodwch god post dilys",
146
+ "requiredManualPostcode": "Nodwch god post"
147
+ }
148
+ },
149
+
150
+ "components": {
151
+ "dateField": {
152
+ "day": "Diwrnod",
153
+ "month": "Mis",
154
+ "year": "Blwyddyn",
155
+ "validation": {
156
+ "dateFormat": "Rhaid i {{#title}} fod yn ddyddiad go iawn",
157
+ "dateMin": "Rhaid i {{#title}} fod yr un fath â neu ar ôl {{#limit}}",
158
+ "dateMax": "Rhaid i {{#title}} fod yr un fath â neu cyn {{#limit}}"
159
+ }
160
+ },
161
+
162
+ "monthYearField": {
163
+ "month": "Mis",
164
+ "year": "Blwyddyn"
165
+ },
166
+
167
+ "addressField": {
168
+ "uprn": "UPRN",
169
+ "line1": "Llinell cyfeiriad 1",
170
+ "line2": "Llinell cyfeiriad 2",
171
+ "town": "Tref neu ddinas",
172
+ "county": "Sir",
173
+ "postcode": "Cod post",
174
+ "enterAddress": "Nodwch [[shortDescription]]",
175
+ "findAddress": "Dod o hyd i gyfeiriad",
176
+ "selectedAddress": "Cyfeiriad a ddewiswyd:",
177
+ "useDifferentAddress": "Defnyddio cyfeiriad gwahanol",
178
+ "enterManually": "nodwch gyfeiriad â llaw"
179
+ },
180
+
181
+ "latLongField": {
182
+ "latitude": "Lledred",
183
+ "longitude": "Hydred",
184
+ "latitudeRequired": "Nodwch ledred",
185
+ "longitudeRequired": "Nodwch hydred",
186
+ "precision": "Rhaid i {{#label}} beidio â chael mwy na 7 lle degol",
187
+ "notANumber": "Rhaid i {{#label}} fod yn rif dilys",
188
+ "latitudeBase": "Nodwch ledred dilys ar gyfer [[fieldLabel]] fel 51.519450",
189
+ "longitudeBase": "Nodwch hydred dilys ar gyfer [[fieldLabel]] fel -0.127758",
190
+ "latitudeRange": "Rhaid i ledred [[fieldLabel]] fod rhwng [[min]] a [[max]]",
191
+ "longitudeRange": "Rhaid i hydred [[fieldLabel]] fod rhwng [[min]] a [[max]]"
192
+ },
193
+
194
+ "eastingNorthingField": {
195
+ "easting": "Dwyreiniannau",
196
+ "northing": "Gogleddiannau",
197
+ "eastingRequired": "Nodwch ddwyreiniannau",
198
+ "northingRequired": "Nodwch ogleddiannau",
199
+ "eastingDigits": "Rhaid i {{#label}} ar gyfer [[fieldLabel]] fod rhwng 1 a 6 digid",
200
+ "northingDigits": "Rhaid i {{#label}} ar gyfer [[fieldLabel]] fod rhwng 1 a 7 digid",
201
+ "eastingRange": "Rhaid i {{#label}} ar gyfer [[fieldLabel]] fod rhwng [[min]] a [[max]]",
202
+ "northingRange": "Rhaid i {{#label}} ar gyfer [[fieldLabel]] fod rhwng [[min]] a [[max]]"
203
+ },
204
+
205
+ "nationalGridField": {
206
+ "required": "Nodwch {{lowerFirst(#title)}}",
207
+ "pattern": "Nodwch rif maes Grid Cenedlaethol dilys ar gyfer {{lowerFirst(#title)}} fel NG 1234 5678",
208
+ "howToFind": "Sut i ddod o hyd i fanylion lleoliad"
209
+ },
210
+
211
+ "osGridRefField": {
212
+ "required": "Nodwch {{lowerFirst(#title)}}",
213
+ "pattern": "Nodwch gyfeirnod grid AO dilys ar gyfer {{lowerFirst(#title)}} fel TQ123456",
214
+ "howToFind": "Sut i ddod o hyd i fanylion lleoliad"
215
+ },
216
+
217
+ "locationFieldBase": {
218
+ "howToFind": "Sut i ddod o hyd i fanylion lleoliad"
219
+ },
220
+
221
+ "yesNoField": {
222
+ "yes": "Ie",
223
+ "no": "Na",
224
+ "validation": {
225
+ "selectYesNoRequired": "{{#label}} - dewiswch ie neu na"
226
+ }
227
+ },
228
+
229
+ "declarationField": {
230
+ "defaultLabel": "Rwy'n deall ac yn cytuno",
231
+ "defaultConfirmationLabel": "Rwy'n cadarnhau fy mod yn deall ac yn derbyn y datganiad hwn",
232
+ "notProvided": "Heb ei ddarparu",
233
+ "validation": {
234
+ "declarationRequired": "Rhaid i chi gadarnhau eich bod yn deall ac yn cytuno â'r {{lowerFirst(#label)}} i barhau"
235
+ }
236
+ },
237
+
238
+ "geospatialField": {
239
+ "added_one": "Ychwanegwyd [[count]] lleoliad",
240
+ "added_other": "Ychwanegwyd [[count]] lleoliad",
241
+ "validation": {
242
+ "descriptionRequired": "Rhowch ddisgrifiad ar gyfer lleoliad [[count]]",
243
+ "wrongCountry": "Rhaid i leoliad [[count]] fod y tu mewn i [[country]]"
244
+ }
245
+ },
246
+
247
+ "paymentField": {
248
+ "detailsRequired": "Angen manylion talu",
249
+ "pendingTransaction": "Mae'n bosibl y gwelwch drafodiad ar y gweill yn eich cyfrif banc ond dim ond pan fyddwch yn cyflwyno'r ffurflen y codir tâl arnoch.",
250
+ "addPaymentDetails": "Ychwanegu manylion talu",
251
+ "cannotTakePayment": "Mae problem ac ni allwn dderbyn taliad. Cysylltwch â ni (manylion yn nhroedyn y ffurflen hon) neu cadwch eich cynnydd a dychwelyd at y ffurflen yn ddiweddarach.",
252
+ "testApiKey": "Ychwanegwch allwedd API prawf ddilys cyn i chi allu rhagolwg y daith talu.",
253
+ "completePayment": "Cwblhewch y taliad i barhau",
254
+ "paymentExpired": "Mae awdurdodiad eich taliad wedi dod i ben. Ychwanegwch eich manylion talu eto.",
255
+ "submissionFailed": "Roedd problem ac ni chyflwynwyd eich ffurflen. Ceisiwch gyflwyno'r ffurflen eto.",
256
+ "canSubmitAfterPayment": "Gallwch gyflwyno'r ffurflen ar ôl i chi ychwanegu eich manylion talu.",
257
+ "preAuthorisedTitle": "Rydych eisoes wedi awdurdodi taliad ar gyfer y ffurflen hon",
258
+ "preAuthorisedBody": "Parhewch i gyflwyno'r ffurflen. Ni chodir tâl arnoch ddwywaith.",
259
+ "totalAmountLabel": "Cyfanswm:",
260
+ "paymentAmountMismatch": "Mae swm y taliad a rhaganrhuddhawyd rywsut yn wahanol i'r hyn a ofynnwyd amdano. Ceisiwch ychwanegu manylion talu eto."
261
+ },
262
+
263
+ "fileUploadField": {
264
+ "uploaded": "Wedi'i uwchlwytho",
265
+ "uploadFailed": "Roedd problem gyda'ch ffeiliau a uwchlwythwyd. Uwchlwythwch nhw eto cyn cyflwyno'r ffurflen.",
266
+ "uploadedFilesHeading": "Ffeiliau a uwchlwythwyd",
267
+ "filesCount_one": "Uwchlwythwyd [[count]] ffeil",
268
+ "filesCount_other": "Uwchlwythwyd [[count]] ffeil"
269
+ }
270
+ }
271
+ }