@sdcorejs/angular 21.1.5 → 21.2.0

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 (208) hide show
  1. package/README.md +12 -4
  2. package/assets/scss/core/menu.scss +18 -0
  3. package/assets/scss/core/utilities/_misc.scss +15 -0
  4. package/assets/scss/sd-core.scss +1 -0
  5. package/fesm2022/sdcorejs-angular-components-anchor.mjs +37 -13
  6. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  7. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
  8. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  9. package/fesm2022/sdcorejs-angular-components-badge.mjs +15 -2
  10. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  11. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  12. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  13. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
  14. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  15. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
  16. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  17. package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
  18. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
  19. package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
  20. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  21. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
  22. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  23. package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
  24. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  25. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
  26. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  27. package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
  28. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  29. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
  30. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  31. package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
  32. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  33. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
  34. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  35. package/fesm2022/sdcorejs-angular-components-preview.mjs +58 -19
  36. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  37. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
  38. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  39. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
  40. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  41. package/fesm2022/sdcorejs-angular-components-section.mjs +16 -2
  42. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  43. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
  44. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  45. package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
  46. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  47. package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
  48. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  49. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
  50. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  51. package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
  52. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  53. package/fesm2022/sdcorejs-angular-components-table.mjs +557 -255
  54. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  55. package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
  56. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  57. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
  58. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  59. package/fesm2022/sdcorejs-angular-components.mjs +6 -1
  60. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  61. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
  63. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
  65. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
  67. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
  69. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
  71. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +234 -64
  73. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-forms-date.mjs +209 -42
  75. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +131 -27
  77. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +40 -16
  79. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
  81. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  82. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
  83. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
  85. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-forms-models.mjs +279 -6
  87. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
  89. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-forms-select.mjs +136 -38
  91. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
  93. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
  95. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
  97. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
  99. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
  100. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
  101. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
  102. package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
  103. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
  105. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-i18n.mjs +510 -68
  107. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
  109. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
  111. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
  113. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  114. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
  115. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  116. package/fesm2022/sdcorejs-angular-modules-layout.mjs +441 -135
  117. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
  119. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
  121. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  122. package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
  123. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
  125. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
  127. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  128. package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
  129. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  130. package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
  131. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  132. package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
  133. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  134. package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
  135. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  136. package/fesm2022/sdcorejs-angular-services.mjs +0 -1
  137. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  138. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
  139. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  140. package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
  141. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  142. package/fesm2022/sdcorejs-angular.mjs +17 -10
  143. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  144. package/package.json +40 -25
  145. package/types/sdcorejs-angular-components-anchor.d.ts +3 -1
  146. package/types/sdcorejs-angular-components-badge.d.ts +1 -0
  147. package/types/sdcorejs-angular-components-ckeditor-styles.d.ts +1 -1
  148. package/types/sdcorejs-angular-components-form-generic.d.ts +44 -33
  149. package/types/sdcorejs-angular-components-import-excel.d.ts +1 -0
  150. package/types/sdcorejs-angular-components-mini-editor.d.ts +1 -1
  151. package/types/sdcorejs-angular-components-modal-resizable.d.ts +92 -0
  152. package/types/sdcorejs-angular-components-modal.d.ts +3 -2
  153. package/types/sdcorejs-angular-components-org-chart.d.ts +6 -0
  154. package/types/sdcorejs-angular-components-preview.d.ts +1 -0
  155. package/types/sdcorejs-angular-components-query-bar.d.ts +55 -17
  156. package/types/sdcorejs-angular-components-query-builder.d.ts +150 -98
  157. package/types/sdcorejs-angular-components-section.d.ts +3 -0
  158. package/types/sdcorejs-angular-components-tab-router.d.ts +19 -19
  159. package/types/sdcorejs-angular-components-table.d.ts +252 -110
  160. package/types/sdcorejs-angular-components-tree.d.ts +48 -30
  161. package/types/sdcorejs-angular-components-upload-file.d.ts +6 -3
  162. package/types/sdcorejs-angular-components.d.ts +6 -1
  163. package/types/sdcorejs-angular-configurations.d.ts +1 -2
  164. package/types/sdcorejs-angular-forms-autocomplete.d.ts +5 -2
  165. package/types/sdcorejs-angular-forms-chip-calendar.d.ts +10 -0
  166. package/types/sdcorejs-angular-forms-date-range.d.ts +14 -2
  167. package/types/sdcorejs-angular-forms-date.d.ts +21 -3
  168. package/types/sdcorejs-angular-forms-datetime.d.ts +13 -2
  169. package/types/sdcorejs-angular-forms-entity-picker.d.ts +9 -3
  170. package/types/sdcorejs-angular-forms-input-color.d.ts +4 -0
  171. package/types/sdcorejs-angular-forms-input-number.d.ts +3 -0
  172. package/types/sdcorejs-angular-forms-input.d.ts +3 -0
  173. package/types/sdcorejs-angular-forms-models.d.ts +146 -5
  174. package/types/sdcorejs-angular-forms-select.d.ts +27 -4
  175. package/types/sdcorejs-angular-forms-switch.d.ts +7 -1
  176. package/types/sdcorejs-angular-forms-textarea.d.ts +5 -3
  177. package/types/sdcorejs-angular-forms-time-range.d.ts +22 -1
  178. package/types/sdcorejs-angular-forms-tree-select.d.ts +36 -5
  179. package/types/sdcorejs-angular-forms.d.ts +22 -13
  180. package/types/sdcorejs-angular-i18n.d.ts +99 -16
  181. package/types/sdcorejs-angular-interceptors.d.ts +13 -3
  182. package/types/sdcorejs-angular-modules-auth.d.ts +1 -1
  183. package/types/sdcorejs-angular-modules-keycloak.d.ts +1 -0
  184. package/types/sdcorejs-angular-modules-layout.d.ts +103 -28
  185. package/types/sdcorejs-angular-modules-permission.d.ts +66 -4
  186. package/types/sdcorejs-angular-pipes.d.ts +27 -5
  187. package/types/sdcorejs-angular-services-api.d.ts +21 -1
  188. package/types/sdcorejs-angular-services-cache.d.ts +11 -1
  189. package/types/sdcorejs-angular-services-notify.d.ts +1 -1
  190. package/types/sdcorejs-angular-services.d.ts +0 -1
  191. package/types/sdcorejs-angular-utilities-extensions.d.ts +83 -61
  192. package/types/sdcorejs-angular-utilities-models.d.ts +2 -76
  193. package/types/sdcorejs-angular.d.ts +11 -2
  194. package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
  195. package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
  196. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
  197. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
  198. package/fesm2022/sdcorejs-angular-models.mjs +0 -6
  199. package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
  200. package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
  201. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
  202. package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
  203. package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
  204. package/types/sdcorejs-angular-components-base.d.ts +0 -11
  205. package/types/sdcorejs-angular-components-document-builder.d.ts +0 -252
  206. package/types/sdcorejs-angular-models.d.ts +0 -2
  207. package/types/sdcorejs-angular-services-docx.d.ts +0 -27
  208. package/types/sdcorejs-angular-services-license.d.ts +0 -12
@@ -1,8 +1,7 @@
1
- import { SUPPORTED_LANGUAGES } from '@sdcorejs/angular/models';
2
- export { SUPPORTED_LANGUAGES } from '@sdcorejs/angular/models';
3
1
  import * as i0 from '@angular/core';
4
2
  import { inject, signal, computed, Injectable, Pipe } from '@angular/core';
5
3
  import { SD_CORE_CONFIGURATION } from '@sdcorejs/angular/configurations';
4
+ import { SUPPORTED_LANGUAGES } from '@sdcorejs/utils/constants';
6
5
 
7
6
  const I18N_STORAGE_KEY = 'sd-core.language';
8
7
 
@@ -92,10 +91,6 @@ const EN_MESSAGES = {
92
91
  // ---- Service: excel ----
93
92
  'core.excel.cannot-read-file': 'Could not read file content',
94
93
  'core.excel.no-sheet': 'Excel file has no data sheet',
95
- // ---- Service: docx ----
96
- 'core.docx.invalid-format': 'Invalid format. Please select a template in DOC or DOCX format',
97
- 'core.docx.size-exceeded': 'Template file size exceeds the supported limit. Please try again',
98
- 'core.docx.convert-error': 'An error occurred while converting the DOCX file',
99
94
  // ---- Service: notify (toast) ----
100
95
  'core.notify.type.success': 'Success',
101
96
  'core.notify.type.info': 'Information',
@@ -205,7 +200,6 @@ const EN_MESSAGES = {
205
200
  'core.form.time-range.step': 'Times must align to a {step}-minute interval',
206
201
  'core.form.time-range.from': 'From',
207
202
  'core.form.time-range.to': 'To',
208
- 'core.form.time-range.clear': 'Clear time range',
209
203
  // ---- Forms: time-spinner ----
210
204
  'core.form.time-spinner.hour': 'Hour',
211
205
  'core.form.time-spinner.minute': 'Minute',
@@ -230,6 +224,7 @@ const EN_MESSAGES = {
230
224
  'core.form.checkbox.unchecked': 'No',
231
225
  // ---- Forms: select ----
232
226
  'core.form.select.required': 'Please enter information',
227
+ 'core.form.select.selectAll': 'All',
233
228
  // ---- Forms: textarea ----
234
229
  'core.form.textarea.required': 'Please enter information',
235
230
  'core.form.textarea.maxlength': 'Maximum characters: {max}',
@@ -245,13 +240,6 @@ const EN_MESSAGES = {
245
240
  'core.component.editor.image.max-width': 'Image width {width}px exceeds the limit of {max}px',
246
241
  'core.component.editor.image.max-height': 'Image height {height}px exceeds the limit of {max}px',
247
242
  'core.component.editor.image.max-per-selection': 'You can select at most {max} images per selection',
248
- // ---- Component: document-builder ----
249
- 'core.component.document-builder.page-number.current': 'Current page number',
250
- 'core.component.document-builder.page-number.total': 'Total pages',
251
- 'core.component.document-builder.ck-comment.label': 'Comment',
252
- 'core.component.document-builder.ck-comment.text-too-long': 'Text too long ({length} characters). Maximum {max} characters.',
253
- 'core.component.document-builder.variable.not-allowed': 'Adding variable to the text is not allowed',
254
- 'core.component.document-builder.variable.invalid-data': 'Invalid variable data',
255
243
  // ---- Component: form-builder ----
256
244
  'core.component.form-builder.field-key': 'Field key',
257
245
  'core.component.form-builder.display': 'Display',
@@ -266,6 +254,7 @@ const EN_MESSAGES = {
266
254
  'core.component.form-builder.required-when': 'Required when',
267
255
  'core.component.form-builder.confirm': 'Confirm',
268
256
  'core.component.form-builder.delete': 'Delete',
257
+ 'core.component.form-builder.select-item': 'Select to edit',
269
258
  'core.component.form-builder.save': 'Save',
270
259
  'core.component.form-builder.hint': 'Hint',
271
260
  'core.component.form-builder.parameter': 'Parameters',
@@ -337,9 +326,13 @@ const EN_MESSAGES = {
337
326
  'core.component.form-builder.display-label': 'Display label',
338
327
  'core.component.form-builder.attribute': 'Attribute',
339
328
  'core.component.form-builder.add-variable': 'Add variable',
329
+ 'core.component.form-builder.no-variable': 'No variables yet. Add one to use it in condition expressions.',
330
+ 'core.component.form-builder.no-validation': 'No validations yet. Add one to show a warning or an error on a condition.',
340
331
  'core.component.form-builder.add-new': 'Add new',
341
332
  'core.component.form-builder.detail': 'Details',
342
333
  'core.component.form-builder.create-update': 'Create/update',
334
+ 'core.component.form-builder.update-row': 'Update row',
335
+ 'core.component.form-builder.add-row': 'Add row',
343
336
  'core.component.form-builder.default': 'Default',
344
337
  'core.component.form-builder.show-more': 'Show more',
345
338
  'core.component.form-builder.show-less': 'Show less',
@@ -503,6 +496,8 @@ const EN_MESSAGES = {
503
496
  'core.component.table.choose-filter-hint': 'Please choose a filter to start',
504
497
  'core.component.table.no-data': 'No data',
505
498
  'core.component.table.export-excel': 'Export Excel',
499
+ 'core.component.table.exporting': 'Exporting...{percent}%',
500
+ 'core.component.table.export': 'Export',
506
501
  'core.component.table.export-csv': 'Export CSV',
507
502
  'core.component.table.showing': 'Showing:',
508
503
  'core.component.table.paginator.first-page': 'First page',
@@ -513,6 +508,8 @@ const EN_MESSAGES = {
513
508
  'core.component.table.error-occurred': 'An error occurred',
514
509
  'core.component.table.not-an-array': 'Data is not an array',
515
510
  'core.component.table.config.confirm-reset': 'Confirm reset all settings to defaults',
511
+ 'core.component.table.config.drag-hint': 'Drag the ⠿ handle to reorder columns',
512
+ 'core.component.table.config.drag-handle': 'Drag to reorder column',
516
513
  'core.component.table.popup-export.select-columns': 'Please select columns to export',
517
514
  'core.component.table.selector-action.default-msg': 'items selected',
518
515
  'core.component.tab-router.too-many-tabs': 'You have opened too many tabs.',
@@ -543,6 +540,13 @@ const EN_MESSAGES = {
543
540
  'core.module.layout.user.notification': 'Notifications',
544
541
  'core.module.layout.sidebar.search': 'Search',
545
542
  'core.module.layout.sidebar.toggle': 'Toggle sidebar',
543
+ 'core.module.layout.sidebar.menu-groups': 'Menu groups',
544
+ 'core.module.layout.sidebar.close-menu': 'Close menu',
545
+ 'core.module.layout.sidebar.search-in-group': 'Search this group',
546
+ 'core.module.layout.sidebar.primary-nav': 'Primary navigation',
547
+ 'core.module.layout.sidebar.more-menu': 'More menus',
548
+ 'core.module.layout.sidebar.more': 'More',
549
+ 'core.module.layout.sidebar.search-in-menu': 'Search menus',
546
550
  // ---- Module: layout (greeting + weekday) ----
547
551
  'core.module.layout.greeting.hello': 'Hello, {name}',
548
552
  'core.module.layout.weekday.0': 'Sunday',
@@ -563,6 +567,8 @@ const EN_MESSAGES = {
563
567
  'core.module.layout.not-found.back': 'Go back',
564
568
  // ---- Module: layout (home page) ----
565
569
  'core.module.layout.home.tab-name': 'Home',
570
+ 'core.module.layout.not-found.tab-name': 'Page Not Found',
571
+ 'core.module.layout.forbidden.tab-name': 'Access Denied',
566
572
  'core.module.layout.home.feature.data': 'Data',
567
573
  'core.module.layout.home.feature.reports': 'Reports',
568
574
  'core.module.layout.home.feature.users': 'Users',
@@ -573,6 +579,87 @@ const EN_MESSAGES = {
573
579
  'core.module.layout.mock.user.full-name': 'Demo User',
574
580
  // ---- Module: generic (generic-select) ----
575
581
  'core.module.generic.generic-select.detail-link': 'details',
582
+ // ---- Component: query-bar ----
583
+ 'core.component.query-bar.search-placeholder': 'Search...',
584
+ 'core.component.query-bar.no-fields': 'No fields configured',
585
+ 'core.component.query-bar.add-filter': 'Add filter',
586
+ 'core.component.query-bar.clear-all': 'Clear all ({count})',
587
+ 'core.component.query-bar.search': 'Search',
588
+ 'core.component.query-bar.logic-operator': 'Logic operator',
589
+ 'core.component.query-bar.boolean.true': 'Yes',
590
+ 'core.component.query-bar.boolean.false': 'No',
591
+ 'core.component.query-bar.placeholder.value': 'value',
592
+ 'core.component.query-bar.placeholder.text': 'type…',
593
+ 'core.component.query-bar.placeholder.from-number': 'From',
594
+ 'core.component.query-bar.placeholder.to-number': 'To',
595
+ 'core.component.query-bar.placeholder.from-text': 'from…',
596
+ 'core.component.query-bar.placeholder.to-text': 'to…',
597
+ 'core.component.query-bar.swap-field': 'Swap field',
598
+ 'core.component.query-bar.placeholder.select-value': 'Select value',
599
+ 'core.component.query-bar.placeholder.enter-value': 'Enter value',
600
+ 'core.component.query-bar.loading-values': 'Loading...',
601
+ 'core.component.query-bar.field-empty': 'No fields configured yet.',
602
+ 'core.component.query-bar.saved-filters.tooltip': 'Saved filters',
603
+ 'core.component.query-bar.saved-filters.tooltip-disabled': 'Requires [savedFiltersKey] to enable',
604
+ 'core.component.query-bar.saved-filters.delete': 'Delete filter',
605
+ 'core.component.query-bar.saved-filters.empty': 'No saved filters yet.',
606
+ 'core.component.query-bar.saved-filters.save': 'Save current filter',
607
+ 'core.component.query-bar.saved-filters.name-label': 'Filter name',
608
+ // ---- Component: query-builder ----
609
+ 'core.component.query-builder.date-mode.absolute': 'Specific date',
610
+ 'core.component.query-builder.date-mode.now': 'Today',
611
+ 'core.component.query-builder.date-mode.relative': 'Relative',
612
+ 'core.component.query-builder.value-source.literal': 'Enter a value',
613
+ 'core.component.query-builder.value-source.field': 'Compare with field',
614
+ 'core.component.query-builder.relative.hour-previous': 'hours ago',
615
+ 'core.component.query-builder.relative.hour-next': 'hours from now',
616
+ 'core.component.query-builder.relative.day-previous': 'days ago',
617
+ 'core.component.query-builder.relative.day-next': 'days from now',
618
+ 'core.component.query-builder.relative.week-previous': 'weeks ago',
619
+ 'core.component.query-builder.relative.week-next': 'weeks from now',
620
+ 'core.component.query-builder.relative.month-previous': 'months ago',
621
+ 'core.component.query-builder.relative.month-next': 'months from now',
622
+ 'core.component.query-builder.relative.format': '{amount} {phrase}',
623
+ 'core.component.query-builder.add': 'Add',
624
+ 'core.component.query-builder.add-node': 'Add a condition or group',
625
+ 'core.component.query-builder.condition': 'Condition',
626
+ 'core.component.query-builder.group': 'Group',
627
+ 'core.component.query-builder.remove-group': 'Remove group',
628
+ 'core.component.query-builder.remove-condition': 'Remove condition',
629
+ 'core.component.query-builder.empty': 'No conditions yet',
630
+ 'core.component.query-builder.select-field': 'Select field',
631
+ 'core.component.query-builder.value': 'Value',
632
+ 'core.component.query-builder.from': 'From',
633
+ 'core.component.query-builder.to': 'To',
634
+ 'core.component.query-builder.boolean.true': 'Yes',
635
+ 'core.component.query-builder.boolean.false': 'No',
636
+ // ---- Component: tree ----
637
+ 'core.component.tree.selected-count': '{count} item(s) selected',
638
+ 'core.component.tree.expand': 'Expand tree item',
639
+ 'core.component.tree.collapse': 'Collapse tree item',
640
+ 'core.component.tree.retry-item': 'Retry loading tree item',
641
+ 'core.component.tree.load-error': 'Unable to load tree data',
642
+ // ---- Directive: hover-copy ----
643
+ 'core.directive.hover-copy.copied': 'Copied',
644
+ // ---- Module: layout (sidebar sections + pin) ----
645
+ 'core.module.layout.sidebar.pinned': 'Pinned',
646
+ 'core.module.layout.sidebar.recent': 'Recent',
647
+ 'core.module.layout.sidebar.all-menu': 'All menus',
648
+ 'core.module.layout.menu.pin': 'Pin {title}',
649
+ 'core.module.layout.menu.unpin': 'Unpin {title}',
650
+ // ---- Per-control accessible names (replacing borrowed keys) ----
651
+ 'core.form.date.open-picker': 'Open calendar',
652
+ 'core.form.datetime.open-picker': 'Open calendar',
653
+ 'core.form.date-range.open-picker': 'Open calendar',
654
+ 'core.form.date-range.clear': 'Clear date range',
655
+ 'core.form.select.search': 'Search',
656
+ 'core.component.table.loading': 'Loading table data',
657
+ 'core.component.upload-file.loading': 'Uploading file',
658
+ 'core.component.import-excel.loading': 'Loading data',
659
+ 'core.component.upload-file.remove': 'Remove file',
660
+ 'core.component.upload-file.zoom': 'Zoom image',
661
+ 'core.component.upload-file.view-all': 'View all images',
662
+ 'core.component.form-builder.canvas': 'Form design canvas',
576
663
  };
577
664
 
578
665
  const JA_MESSAGES = {
@@ -661,10 +748,6 @@ const JA_MESSAGES = {
661
748
  // ---- Service: excel ----
662
749
  'core.excel.cannot-read-file': 'ファイルの内容を読み取れませんでした',
663
750
  'core.excel.no-sheet': 'Excelファイルにデータシートがありません',
664
- // ---- Service: docx ----
665
- 'core.docx.invalid-format': '形式が正しくありません。DOCまたはDOCX形式のテンプレートを選択してください',
666
- 'core.docx.size-exceeded': 'テンプレートファイルのサイズが上限を超えています。もう一度お試しください',
667
- 'core.docx.convert-error': 'DOCXファイルの変換中にエラーが発生しました',
668
751
  // ---- Service: notify (toast) ----
669
752
  'core.notify.type.success': '成功',
670
753
  'core.notify.type.info': '情報',
@@ -774,7 +857,6 @@ const JA_MESSAGES = {
774
857
  'core.form.time-range.step': '時刻は{step}分間隔で入力してください',
775
858
  'core.form.time-range.from': '開始',
776
859
  'core.form.time-range.to': '終了',
777
- 'core.form.time-range.clear': '時間範囲をクリア',
778
860
  // ---- Forms: time-spinner ----
779
861
  'core.form.time-spinner.hour': '時',
780
862
  'core.form.time-spinner.minute': '分',
@@ -799,6 +881,7 @@ const JA_MESSAGES = {
799
881
  'core.form.checkbox.unchecked': 'いいえ',
800
882
  // ---- Forms: select ----
801
883
  'core.form.select.required': '選択してください',
884
+ 'core.form.select.selectAll': 'すべて',
802
885
  // ---- Forms: textarea ----
803
886
  'core.form.textarea.required': '入力してください',
804
887
  'core.form.textarea.maxlength': '最大文字数: {max}',
@@ -814,13 +897,6 @@ const JA_MESSAGES = {
814
897
  'core.component.editor.image.max-width': '画像の幅 {width}px は上限 {max}px を超えています',
815
898
  'core.component.editor.image.max-height': '画像の高さ {height}px は上限 {max}px を超えています',
816
899
  'core.component.editor.image.max-per-selection': '一度に選択できる画像は最大{max}枚です',
817
- // ---- Component: document-builder ----
818
- 'core.component.document-builder.page-number.current': '現在のページ番号',
819
- 'core.component.document-builder.page-number.total': '総ページ数',
820
- 'core.component.document-builder.ck-comment.label': 'コメント',
821
- 'core.component.document-builder.ck-comment.text-too-long': 'テキストが長すぎます({length}文字)。最大{max}文字です。',
822
- 'core.component.document-builder.variable.not-allowed': 'テキストへの変数の追加は許可されていません',
823
- 'core.component.document-builder.variable.invalid-data': '変数データが正しくありません',
824
900
  // ---- Component: form-builder ----
825
901
  'core.component.form-builder.field-key': 'フィールドキー',
826
902
  'core.component.form-builder.display': '表示',
@@ -835,6 +911,7 @@ const JA_MESSAGES = {
835
911
  'core.component.form-builder.required-when': '必須条件',
836
912
  'core.component.form-builder.confirm': '確認',
837
913
  'core.component.form-builder.delete': '削除',
914
+ 'core.component.form-builder.select-item': '選択して編集',
838
915
  'core.component.form-builder.save': '保存',
839
916
  'core.component.form-builder.hint': 'ヒント',
840
917
  'core.component.form-builder.parameter': 'パラメータ',
@@ -906,9 +983,13 @@ const JA_MESSAGES = {
906
983
  'core.component.form-builder.display-label': '表示ラベル',
907
984
  'core.component.form-builder.attribute': '属性',
908
985
  'core.component.form-builder.add-variable': '変数を追加',
986
+ 'core.component.form-builder.no-variable': '変数がまだありません。追加すると条件式で使用できます。',
987
+ 'core.component.form-builder.no-validation': '検証がまだありません。追加すると条件に応じて警告やエラーを表示できます。',
909
988
  'core.component.form-builder.add-new': '新規追加',
910
989
  'core.component.form-builder.detail': '詳細',
911
990
  'core.component.form-builder.create-update': '作成/更新',
991
+ 'core.component.form-builder.update-row': '行を更新',
992
+ 'core.component.form-builder.add-row': '行を追加',
912
993
  'core.component.form-builder.default': 'デフォルト',
913
994
  'core.component.form-builder.show-more': 'もっと見る',
914
995
  'core.component.form-builder.show-less': '折りたたむ',
@@ -1072,6 +1153,8 @@ const JA_MESSAGES = {
1072
1153
  'core.component.table.choose-filter-hint': 'まずフィルターを選択してください',
1073
1154
  'core.component.table.no-data': 'データがありません',
1074
1155
  'core.component.table.export-excel': 'Excelエクスポート',
1156
+ 'core.component.table.exporting': 'エクスポート中...{percent}%',
1157
+ 'core.component.table.export': 'エクスポート',
1075
1158
  'core.component.table.export-csv': 'CSVエクスポート',
1076
1159
  'core.component.table.showing': '表示中:',
1077
1160
  'core.component.table.paginator.first-page': '最初のページ',
@@ -1082,6 +1165,8 @@ const JA_MESSAGES = {
1082
1165
  'core.component.table.error-occurred': 'エラーが発生しました',
1083
1166
  'core.component.table.not-an-array': 'データが配列ではありません',
1084
1167
  'core.component.table.config.confirm-reset': 'すべての設定をデフォルトに戻しますか',
1168
+ 'core.component.table.config.drag-hint': '⠿ アイコンをドラッグして列の順序を変更できます',
1169
+ 'core.component.table.config.drag-handle': 'ドラッグして列の順序を変更',
1085
1170
  'core.component.table.popup-export.select-columns': 'エクスポートする列を選択してください',
1086
1171
  'core.component.table.selector-action.default-msg': '件選択中',
1087
1172
  'core.component.tab-router.too-many-tabs': 'タブを開きすぎています。',
@@ -1112,6 +1197,13 @@ const JA_MESSAGES = {
1112
1197
  'core.module.layout.user.notification': '通知',
1113
1198
  'core.module.layout.sidebar.search': '検索',
1114
1199
  'core.module.layout.sidebar.toggle': 'サイドバーを切り替える',
1200
+ 'core.module.layout.sidebar.menu-groups': 'メニューグループ',
1201
+ 'core.module.layout.sidebar.close-menu': 'メニューを閉じる',
1202
+ 'core.module.layout.sidebar.search-in-group': 'グループ内を検索',
1203
+ 'core.module.layout.sidebar.primary-nav': 'メイン ナビゲーション',
1204
+ 'core.module.layout.sidebar.more-menu': 'その他のメニュー',
1205
+ 'core.module.layout.sidebar.more': 'その他',
1206
+ 'core.module.layout.sidebar.search-in-menu': 'メニューを検索',
1115
1207
  // ---- Module: layout (greeting + weekday) ----
1116
1208
  'core.module.layout.greeting.hello': 'こんにちは、{name}さん',
1117
1209
  'core.module.layout.weekday.0': '日曜日',
@@ -1132,6 +1224,8 @@ const JA_MESSAGES = {
1132
1224
  'core.module.layout.not-found.back': '戻る',
1133
1225
  // ---- Module: layout (home page) ----
1134
1226
  'core.module.layout.home.tab-name': 'ホーム',
1227
+ 'core.module.layout.not-found.tab-name': 'ページが見つかりません',
1228
+ 'core.module.layout.forbidden.tab-name': 'アクセス拒否',
1135
1229
  'core.module.layout.home.feature.data': 'データ',
1136
1230
  'core.module.layout.home.feature.reports': 'レポート',
1137
1231
  'core.module.layout.home.feature.users': 'ユーザー',
@@ -1142,6 +1236,87 @@ const JA_MESSAGES = {
1142
1236
  'core.module.layout.mock.user.full-name': 'デモユーザー',
1143
1237
  // ---- Module: generic (generic-select) ----
1144
1238
  'core.module.generic.generic-select.detail-link': '詳細',
1239
+ // ---- Component: query-bar ----
1240
+ 'core.component.query-bar.search-placeholder': '検索...',
1241
+ 'core.component.query-bar.no-fields': 'フィールドが設定されていません',
1242
+ 'core.component.query-bar.add-filter': 'フィルターを追加',
1243
+ 'core.component.query-bar.clear-all': 'すべてクリア ({count})',
1244
+ 'core.component.query-bar.search': '検索',
1245
+ 'core.component.query-bar.logic-operator': '論理演算子',
1246
+ 'core.component.query-bar.boolean.true': 'はい',
1247
+ 'core.component.query-bar.boolean.false': 'いいえ',
1248
+ 'core.component.query-bar.placeholder.value': '値',
1249
+ 'core.component.query-bar.placeholder.text': '入力…',
1250
+ 'core.component.query-bar.placeholder.from-number': '開始',
1251
+ 'core.component.query-bar.placeholder.to-number': '終了',
1252
+ 'core.component.query-bar.placeholder.from-text': '開始…',
1253
+ 'core.component.query-bar.placeholder.to-text': '終了…',
1254
+ 'core.component.query-bar.swap-field': 'フィールドを変更',
1255
+ 'core.component.query-bar.placeholder.select-value': '値を選択',
1256
+ 'core.component.query-bar.placeholder.enter-value': '値を入力',
1257
+ 'core.component.query-bar.loading-values': '読み込み中...',
1258
+ 'core.component.query-bar.field-empty': 'フィールドが設定されていません。',
1259
+ 'core.component.query-bar.saved-filters.tooltip': '保存済みフィルター',
1260
+ 'core.component.query-bar.saved-filters.tooltip-disabled': '[savedFiltersKey] が必要です',
1261
+ 'core.component.query-bar.saved-filters.delete': 'フィルターを削除',
1262
+ 'core.component.query-bar.saved-filters.empty': '保存済みフィルターはありません。',
1263
+ 'core.component.query-bar.saved-filters.save': '現在のフィルターを保存',
1264
+ 'core.component.query-bar.saved-filters.name-label': 'フィルター名',
1265
+ // ---- Component: query-builder ----
1266
+ 'core.component.query-builder.date-mode.absolute': '指定した日付',
1267
+ 'core.component.query-builder.date-mode.now': '今日',
1268
+ 'core.component.query-builder.date-mode.relative': '相対',
1269
+ 'core.component.query-builder.value-source.literal': '値を入力',
1270
+ 'core.component.query-builder.value-source.field': 'フィールドと比較',
1271
+ 'core.component.query-builder.relative.hour-previous': '時間前',
1272
+ 'core.component.query-builder.relative.hour-next': '時間後',
1273
+ 'core.component.query-builder.relative.day-previous': '日前',
1274
+ 'core.component.query-builder.relative.day-next': '日後',
1275
+ 'core.component.query-builder.relative.week-previous': '週間前',
1276
+ 'core.component.query-builder.relative.week-next': '週間後',
1277
+ 'core.component.query-builder.relative.month-previous': 'ヶ月前',
1278
+ 'core.component.query-builder.relative.month-next': 'ヶ月後',
1279
+ 'core.component.query-builder.relative.format': '{amount}{phrase}',
1280
+ 'core.component.query-builder.add': '追加',
1281
+ 'core.component.query-builder.add-node': '条件またはグループを追加',
1282
+ 'core.component.query-builder.condition': '条件',
1283
+ 'core.component.query-builder.group': 'グループ',
1284
+ 'core.component.query-builder.remove-group': 'グループを削除',
1285
+ 'core.component.query-builder.remove-condition': '条件を削除',
1286
+ 'core.component.query-builder.empty': '条件がまだありません',
1287
+ 'core.component.query-builder.select-field': 'フィールドを選択',
1288
+ 'core.component.query-builder.value': '値',
1289
+ 'core.component.query-builder.from': '開始',
1290
+ 'core.component.query-builder.to': '終了',
1291
+ 'core.component.query-builder.boolean.true': 'はい',
1292
+ 'core.component.query-builder.boolean.false': 'いいえ',
1293
+ // ---- Component: tree ----
1294
+ 'core.component.tree.selected-count': '{count} 件選択中',
1295
+ 'core.component.tree.expand': 'ツリー項目を展開',
1296
+ 'core.component.tree.collapse': 'ツリー項目を折りたたむ',
1297
+ 'core.component.tree.retry-item': 'ツリー項目を再読み込み',
1298
+ 'core.component.tree.load-error': 'ツリーデータを読み込めません',
1299
+ // ---- Directive: hover-copy ----
1300
+ 'core.directive.hover-copy.copied': 'コピーしました',
1301
+ // ---- Module: layout (sidebar sections + pin) ----
1302
+ 'core.module.layout.sidebar.pinned': 'ピン留め済み',
1303
+ 'core.module.layout.sidebar.recent': '最近',
1304
+ 'core.module.layout.sidebar.all-menu': 'すべてのメニュー',
1305
+ 'core.module.layout.menu.pin': '{title} をピン留め',
1306
+ 'core.module.layout.menu.unpin': '{title} のピン留めを解除',
1307
+ // ---- Per-control accessible names (replacing borrowed keys) ----
1308
+ 'core.form.date.open-picker': 'カレンダーを開く',
1309
+ 'core.form.datetime.open-picker': 'カレンダーを開く',
1310
+ 'core.form.date-range.open-picker': 'カレンダーを開く',
1311
+ 'core.form.date-range.clear': '日付範囲をクリア',
1312
+ 'core.form.select.search': '検索',
1313
+ 'core.component.table.loading': 'テーブルデータを読み込み中',
1314
+ 'core.component.upload-file.loading': 'ファイルをアップロード中',
1315
+ 'core.component.import-excel.loading': 'データを読み込み中',
1316
+ 'core.component.upload-file.remove': 'ファイルを削除',
1317
+ 'core.component.upload-file.zoom': '画像を拡大',
1318
+ 'core.component.upload-file.view-all': 'すべての画像を表示',
1319
+ 'core.component.form-builder.canvas': 'フォーム設計キャンバス',
1145
1320
  };
1146
1321
 
1147
1322
  const KO_MESSAGES = {
@@ -1230,10 +1405,6 @@ const KO_MESSAGES = {
1230
1405
  // ---- Service: excel ----
1231
1406
  'core.excel.cannot-read-file': '파일 내용을 읽을 수 없습니다',
1232
1407
  'core.excel.no-sheet': 'Excel 파일에 데이터 시트가 없습니다',
1233
- // ---- Service: docx ----
1234
- 'core.docx.invalid-format': '형식이 올바르지 않습니다. DOC 또는 DOCX 형식의 템플릿을 선택해 주세요',
1235
- 'core.docx.size-exceeded': '템플릿 파일 크기가 지원 한도를 초과했습니다. 다시 시도해 주세요',
1236
- 'core.docx.convert-error': 'DOCX 파일 변환 중 오류가 발생했습니다',
1237
1408
  // ---- Service: notify (toast) ----
1238
1409
  'core.notify.type.success': '성공',
1239
1410
  'core.notify.type.info': '정보',
@@ -1343,7 +1514,6 @@ const KO_MESSAGES = {
1343
1514
  'core.form.time-range.step': '시간은 {step}분 간격에 맞아야 합니다',
1344
1515
  'core.form.time-range.from': '시작',
1345
1516
  'core.form.time-range.to': '종료',
1346
- 'core.form.time-range.clear': '시간 범위 지우기',
1347
1517
  // ---- Forms: time-spinner ----
1348
1518
  'core.form.time-spinner.hour': '시',
1349
1519
  'core.form.time-spinner.minute': '분',
@@ -1368,6 +1538,7 @@ const KO_MESSAGES = {
1368
1538
  'core.form.checkbox.unchecked': '아니오',
1369
1539
  // ---- Forms: select ----
1370
1540
  'core.form.select.required': '선택해 주세요',
1541
+ 'core.form.select.selectAll': '전체',
1371
1542
  // ---- Forms: textarea ----
1372
1543
  'core.form.textarea.required': '정보를 입력해 주세요',
1373
1544
  'core.form.textarea.maxlength': '최대 글자수: {max}',
@@ -1383,13 +1554,6 @@ const KO_MESSAGES = {
1383
1554
  'core.component.editor.image.max-width': '이미지 너비 {width}px가 한도 {max}px를 초과합니다',
1384
1555
  'core.component.editor.image.max-height': '이미지 높이 {height}px가 한도 {max}px를 초과합니다',
1385
1556
  'core.component.editor.image.max-per-selection': '한 번에 최대 {max}장의 이미지를 선택할 수 있습니다',
1386
- // ---- Component: document-builder ----
1387
- 'core.component.document-builder.page-number.current': '현재 페이지 번호',
1388
- 'core.component.document-builder.page-number.total': '전체 페이지 수',
1389
- 'core.component.document-builder.ck-comment.label': '댓글',
1390
- 'core.component.document-builder.ck-comment.text-too-long': '텍스트가 너무 깁니다 ({length}자). 최대 {max}자입니다.',
1391
- 'core.component.document-builder.variable.not-allowed': '텍스트에 변수를 추가할 수 없습니다',
1392
- 'core.component.document-builder.variable.invalid-data': '변수 데이터가 올바르지 않습니다',
1393
1557
  // ---- Component: form-builder ----
1394
1558
  'core.component.form-builder.field-key': '필드 키',
1395
1559
  'core.component.form-builder.display': '표시',
@@ -1404,6 +1568,7 @@ const KO_MESSAGES = {
1404
1568
  'core.component.form-builder.required-when': '필수 조건',
1405
1569
  'core.component.form-builder.confirm': '확인',
1406
1570
  'core.component.form-builder.delete': '삭제',
1571
+ 'core.component.form-builder.select-item': '선택하여 편집',
1407
1572
  'core.component.form-builder.save': '저장',
1408
1573
  'core.component.form-builder.hint': '힌트',
1409
1574
  'core.component.form-builder.parameter': '매개변수',
@@ -1475,9 +1640,13 @@ const KO_MESSAGES = {
1475
1640
  'core.component.form-builder.display-label': '표시 라벨',
1476
1641
  'core.component.form-builder.attribute': '속성',
1477
1642
  'core.component.form-builder.add-variable': '변수 추가',
1643
+ 'core.component.form-builder.no-variable': '아직 변수가 없습니다. 추가하면 조건식에서 사용할 수 있습니다.',
1644
+ 'core.component.form-builder.no-validation': '아직 검증이 없습니다. 추가하면 조건에 따라 경고나 오류를 표시할 수 있습니다.',
1478
1645
  'core.component.form-builder.add-new': '새로 추가',
1479
1646
  'core.component.form-builder.detail': '상세',
1480
1647
  'core.component.form-builder.create-update': '생성/수정',
1648
+ 'core.component.form-builder.update-row': '행 수정',
1649
+ 'core.component.form-builder.add-row': '행 추가',
1481
1650
  'core.component.form-builder.default': '기본',
1482
1651
  'core.component.form-builder.show-more': '더 보기',
1483
1652
  'core.component.form-builder.show-less': '접기',
@@ -1641,6 +1810,8 @@ const KO_MESSAGES = {
1641
1810
  'core.component.table.choose-filter-hint': '시작하려면 필터를 선택해 주세요',
1642
1811
  'core.component.table.no-data': '데이터가 없습니다',
1643
1812
  'core.component.table.export-excel': 'Excel 내보내기',
1813
+ 'core.component.table.exporting': '내보내는 중...{percent}%',
1814
+ 'core.component.table.export': '내보내기',
1644
1815
  'core.component.table.export-csv': 'CSV 내보내기',
1645
1816
  'core.component.table.showing': '표시 중:',
1646
1817
  'core.component.table.paginator.first-page': '첫 페이지',
@@ -1651,6 +1822,8 @@ const KO_MESSAGES = {
1651
1822
  'core.component.table.error-occurred': '오류가 발생했습니다',
1652
1823
  'core.component.table.not-an-array': '데이터가 배열이 아닙니다',
1653
1824
  'core.component.table.config.confirm-reset': '모든 설정을 기본값으로 초기화하시겠습니까',
1825
+ 'core.component.table.config.drag-hint': '⠿ 아이콘을 끌어 열 순서를 변경하세요',
1826
+ 'core.component.table.config.drag-handle': '끌어서 열 순서 변경',
1654
1827
  'core.component.table.popup-export.select-columns': '내보낼 열을 선택해 주세요',
1655
1828
  'core.component.table.selector-action.default-msg': '개 선택됨',
1656
1829
  'core.component.tab-router.too-many-tabs': '너무 많은 탭이 열려 있습니다.',
@@ -1681,6 +1854,13 @@ const KO_MESSAGES = {
1681
1854
  'core.module.layout.user.notification': '알림',
1682
1855
  'core.module.layout.sidebar.search': '검색',
1683
1856
  'core.module.layout.sidebar.toggle': '사이드바 전환',
1857
+ 'core.module.layout.sidebar.menu-groups': '메뉴 그룹',
1858
+ 'core.module.layout.sidebar.close-menu': '메뉴 닫기',
1859
+ 'core.module.layout.sidebar.search-in-group': '그룹 내 검색',
1860
+ 'core.module.layout.sidebar.primary-nav': '기본 탐색',
1861
+ 'core.module.layout.sidebar.more-menu': '더 보기 메뉴',
1862
+ 'core.module.layout.sidebar.more': '더 보기',
1863
+ 'core.module.layout.sidebar.search-in-menu': '메뉴 검색',
1684
1864
  // ---- Module: layout (greeting + weekday) ----
1685
1865
  'core.module.layout.greeting.hello': '안녕하세요, {name}님',
1686
1866
  'core.module.layout.weekday.0': '일요일',
@@ -1701,6 +1881,8 @@ const KO_MESSAGES = {
1701
1881
  'core.module.layout.not-found.back': '돌아가기',
1702
1882
  // ---- Module: layout (home page) ----
1703
1883
  'core.module.layout.home.tab-name': '홈',
1884
+ 'core.module.layout.not-found.tab-name': '페이지를 찾을 수 없음',
1885
+ 'core.module.layout.forbidden.tab-name': '접근 거부',
1704
1886
  'core.module.layout.home.feature.data': '데이터',
1705
1887
  'core.module.layout.home.feature.reports': '리포트',
1706
1888
  'core.module.layout.home.feature.users': '사용자',
@@ -1711,6 +1893,87 @@ const KO_MESSAGES = {
1711
1893
  'core.module.layout.mock.user.full-name': '데모 사용자',
1712
1894
  // ---- Module: generic (generic-select) ----
1713
1895
  'core.module.generic.generic-select.detail-link': '상세',
1896
+ // ---- Component: query-bar ----
1897
+ 'core.component.query-bar.search-placeholder': '검색...',
1898
+ 'core.component.query-bar.no-fields': '필드가 설정되지 않았습니다',
1899
+ 'core.component.query-bar.add-filter': '필터 추가',
1900
+ 'core.component.query-bar.clear-all': '전체 지우기 ({count})',
1901
+ 'core.component.query-bar.search': '검색',
1902
+ 'core.component.query-bar.logic-operator': '논리 연산자',
1903
+ 'core.component.query-bar.boolean.true': '예',
1904
+ 'core.component.query-bar.boolean.false': '아니오',
1905
+ 'core.component.query-bar.placeholder.value': '값',
1906
+ 'core.component.query-bar.placeholder.text': '입력…',
1907
+ 'core.component.query-bar.placeholder.from-number': '시작',
1908
+ 'core.component.query-bar.placeholder.to-number': '종료',
1909
+ 'core.component.query-bar.placeholder.from-text': '시작…',
1910
+ 'core.component.query-bar.placeholder.to-text': '종료…',
1911
+ 'core.component.query-bar.swap-field': '필드 변경',
1912
+ 'core.component.query-bar.placeholder.select-value': '값 선택',
1913
+ 'core.component.query-bar.placeholder.enter-value': '값 입력',
1914
+ 'core.component.query-bar.loading-values': '로딩 중...',
1915
+ 'core.component.query-bar.field-empty': '설정된 필드가 없습니다.',
1916
+ 'core.component.query-bar.saved-filters.tooltip': '저장된 필터',
1917
+ 'core.component.query-bar.saved-filters.tooltip-disabled': '[savedFiltersKey]가 필요합니다',
1918
+ 'core.component.query-bar.saved-filters.delete': '필터 삭제',
1919
+ 'core.component.query-bar.saved-filters.empty': '저장된 필터가 없습니다.',
1920
+ 'core.component.query-bar.saved-filters.save': '현재 필터 저장',
1921
+ 'core.component.query-bar.saved-filters.name-label': '필터 이름',
1922
+ // ---- Component: query-builder ----
1923
+ 'core.component.query-builder.date-mode.absolute': '특정 날짜',
1924
+ 'core.component.query-builder.date-mode.now': '오늘',
1925
+ 'core.component.query-builder.date-mode.relative': '상대',
1926
+ 'core.component.query-builder.value-source.literal': '값 입력',
1927
+ 'core.component.query-builder.value-source.field': '필드와 비교',
1928
+ 'core.component.query-builder.relative.hour-previous': '시간 전',
1929
+ 'core.component.query-builder.relative.hour-next': '시간 후',
1930
+ 'core.component.query-builder.relative.day-previous': '일 전',
1931
+ 'core.component.query-builder.relative.day-next': '일 후',
1932
+ 'core.component.query-builder.relative.week-previous': '주 전',
1933
+ 'core.component.query-builder.relative.week-next': '주 후',
1934
+ 'core.component.query-builder.relative.month-previous': '개월 전',
1935
+ 'core.component.query-builder.relative.month-next': '개월 후',
1936
+ 'core.component.query-builder.relative.format': '{amount}{phrase}',
1937
+ 'core.component.query-builder.add': '추가',
1938
+ 'core.component.query-builder.add-node': '조건 또는 그룹 추가',
1939
+ 'core.component.query-builder.condition': '조건',
1940
+ 'core.component.query-builder.group': '그룹',
1941
+ 'core.component.query-builder.remove-group': '그룹 삭제',
1942
+ 'core.component.query-builder.remove-condition': '조건 삭제',
1943
+ 'core.component.query-builder.empty': '아직 조건이 없습니다',
1944
+ 'core.component.query-builder.select-field': '필드 선택',
1945
+ 'core.component.query-builder.value': '값',
1946
+ 'core.component.query-builder.from': '시작',
1947
+ 'core.component.query-builder.to': '종료',
1948
+ 'core.component.query-builder.boolean.true': '예',
1949
+ 'core.component.query-builder.boolean.false': '아니오',
1950
+ // ---- Component: tree ----
1951
+ 'core.component.tree.selected-count': '{count}개 선택됨',
1952
+ 'core.component.tree.expand': '트리 항목 펼치기',
1953
+ 'core.component.tree.collapse': '트리 항목 접기',
1954
+ 'core.component.tree.retry-item': '트리 항목 다시 불러오기',
1955
+ 'core.component.tree.load-error': '트리 데이터를 불러올 수 없습니다',
1956
+ // ---- Directive: hover-copy ----
1957
+ 'core.directive.hover-copy.copied': '복사되었습니다',
1958
+ // ---- Module: layout (sidebar sections + pin) ----
1959
+ 'core.module.layout.sidebar.pinned': '고정됨',
1960
+ 'core.module.layout.sidebar.recent': '최근',
1961
+ 'core.module.layout.sidebar.all-menu': '전체 메뉴',
1962
+ 'core.module.layout.menu.pin': '{title} 고정',
1963
+ 'core.module.layout.menu.unpin': '{title} 고정 해제',
1964
+ // ---- Per-control accessible names (replacing borrowed keys) ----
1965
+ 'core.form.date.open-picker': '달력 열기',
1966
+ 'core.form.datetime.open-picker': '달력 열기',
1967
+ 'core.form.date-range.open-picker': '달력 열기',
1968
+ 'core.form.date-range.clear': '날짜 범위 지우기',
1969
+ 'core.form.select.search': '검색',
1970
+ 'core.component.table.loading': '표 데이터를 불러오는 중',
1971
+ 'core.component.upload-file.loading': '파일 업로드 중',
1972
+ 'core.component.import-excel.loading': '데이터를 불러오는 중',
1973
+ 'core.component.upload-file.remove': '파일 삭제',
1974
+ 'core.component.upload-file.zoom': '이미지 확대',
1975
+ 'core.component.upload-file.view-all': '모든 이미지 보기',
1976
+ 'core.component.form-builder.canvas': '폼 디자인 캔버스',
1714
1977
  };
1715
1978
 
1716
1979
  const VI_MESSAGES = {
@@ -1799,10 +2062,6 @@ const VI_MESSAGES = {
1799
2062
  // ---- Service: excel ----
1800
2063
  'core.excel.cannot-read-file': 'Không đọc được nội dung file',
1801
2064
  'core.excel.no-sheet': 'File Excel không có sheet dữ liệu',
1802
- // ---- Service: docx ----
1803
- 'core.docx.invalid-format': 'Định dạng không hợp lệ. Vui lòng chọn Mẫu có định dạng DOC hoặc DOCX',
1804
- 'core.docx.size-exceeded': 'Kích thước tệp mẫu vượt quá tiêu chuẩn hỗ trợ của hệ thống. Vui lòng thử lại',
1805
- 'core.docx.convert-error': 'Có lỗi xảy ra khi chuyển đổi file DOCX',
1806
2065
  // ---- Service: notify (toast) ----
1807
2066
  'core.notify.type.success': 'Thành công',
1808
2067
  'core.notify.type.info': 'Thông tin',
@@ -1912,7 +2171,6 @@ const VI_MESSAGES = {
1912
2171
  'core.form.time-range.step': 'Các mốc giờ phải theo khoảng {step} phút',
1913
2172
  'core.form.time-range.from': 'Từ',
1914
2173
  'core.form.time-range.to': 'Đến',
1915
- 'core.form.time-range.clear': 'Xóa khoảng giờ',
1916
2174
  // ---- Forms: time-spinner ----
1917
2175
  'core.form.time-spinner.hour': 'Giờ',
1918
2176
  'core.form.time-spinner.minute': 'Phút',
@@ -1937,6 +2195,7 @@ const VI_MESSAGES = {
1937
2195
  'core.form.checkbox.unchecked': 'Không',
1938
2196
  // ---- Forms: select ----
1939
2197
  'core.form.select.required': 'Vui lòng nhập thông tin',
2198
+ 'core.form.select.selectAll': 'Tất cả',
1940
2199
  // ---- Forms: textarea ----
1941
2200
  'core.form.textarea.required': 'Vui lòng nhập thông tin',
1942
2201
  'core.form.textarea.maxlength': 'Số ký tự tối đa: {max}',
@@ -1952,13 +2211,6 @@ const VI_MESSAGES = {
1952
2211
  'core.component.editor.image.max-width': 'Chiều rộng ảnh {width}px vượt quá giới hạn {max}px',
1953
2212
  'core.component.editor.image.max-height': 'Chiều cao ảnh {height}px vượt quá giới hạn {max}px',
1954
2213
  'core.component.editor.image.max-per-selection': 'Chỉ được phép chọn tối đa {max} ảnh mỗi lần',
1955
- // ---- Component: document-builder ----
1956
- 'core.component.document-builder.page-number.current': 'Số trang hiện tại',
1957
- 'core.component.document-builder.page-number.total': 'Tổng số trang',
1958
- 'core.component.document-builder.ck-comment.label': 'Bình luận',
1959
- 'core.component.document-builder.ck-comment.text-too-long': 'Văn bản quá dài ({length} ký tự). Tối đa {max} ký tự.',
1960
- 'core.component.document-builder.variable.not-allowed': 'Không cho phép thêm variable vào văn bản',
1961
- 'core.component.document-builder.variable.invalid-data': 'Dữ liệu variable không hợp lệ',
1962
2214
  // ---- Component: form-builder ----
1963
2215
  'core.component.form-builder.field-key': 'Trường dữ liệu',
1964
2216
  'core.component.form-builder.display': 'Hiển thị',
@@ -1973,6 +2225,7 @@ const VI_MESSAGES = {
1973
2225
  'core.component.form-builder.required-when': 'Bắt buộc khi',
1974
2226
  'core.component.form-builder.confirm': 'Xác nhận',
1975
2227
  'core.component.form-builder.delete': 'Xóa',
2228
+ 'core.component.form-builder.select-item': 'Chọn để sửa',
1976
2229
  'core.component.form-builder.save': 'Lưu',
1977
2230
  'core.component.form-builder.hint': 'Gợi ý',
1978
2231
  'core.component.form-builder.parameter': 'Tham số',
@@ -2044,9 +2297,13 @@ const VI_MESSAGES = {
2044
2297
  'core.component.form-builder.display-label': 'Nhãn hiển thị',
2045
2298
  'core.component.form-builder.attribute': 'Thuộc tính',
2046
2299
  'core.component.form-builder.add-variable': 'Thêm biến',
2300
+ 'core.component.form-builder.no-variable': 'Chưa có biến nào. Thêm biến để dùng trong biểu thức điều kiện.',
2301
+ 'core.component.form-builder.no-validation': 'Chưa có xác thực nào. Thêm xác thực để hiện cảnh báo hoặc lỗi theo điều kiện.',
2047
2302
  'core.component.form-builder.add-new': 'Thêm mới',
2048
2303
  'core.component.form-builder.detail': 'Chi tiết',
2049
2304
  'core.component.form-builder.create-update': 'Tạo mới/cập nhật',
2305
+ 'core.component.form-builder.update-row': 'Cập nhật dòng',
2306
+ 'core.component.form-builder.add-row': 'Thêm dòng',
2050
2307
  'core.component.form-builder.default': 'Mặc định',
2051
2308
  'core.component.form-builder.show-more': 'Xem thêm',
2052
2309
  'core.component.form-builder.show-less': 'Thu gọn',
@@ -2210,6 +2467,8 @@ const VI_MESSAGES = {
2210
2467
  'core.component.table.choose-filter-hint': 'Vui lòng chọn bộ lọc để bắt đầu',
2211
2468
  'core.component.table.no-data': 'Chưa có dữ liệu',
2212
2469
  'core.component.table.export-excel': 'Xuất excel',
2470
+ 'core.component.table.exporting': 'Đang xuất...{percent}%',
2471
+ 'core.component.table.export': 'Xuất dữ liệu',
2213
2472
  'core.component.table.export-csv': 'Xuất CSV',
2214
2473
  'core.component.table.showing': 'Đang hiển thị:',
2215
2474
  'core.component.table.paginator.first-page': 'Trang đầu',
@@ -2220,6 +2479,8 @@ const VI_MESSAGES = {
2220
2479
  'core.component.table.error-occurred': 'Có lỗi xảy ra',
2221
2480
  'core.component.table.not-an-array': 'Dữ liệu không phải là một mảng',
2222
2481
  'core.component.table.config.confirm-reset': 'Xác nhận đưa tất cả thiết lập về mặc định',
2482
+ 'core.component.table.config.drag-hint': 'Kéo biểu tượng ⠿ để sắp xếp lại thứ tự cột',
2483
+ 'core.component.table.config.drag-handle': 'Kéo để đổi thứ tự cột',
2223
2484
  'core.component.table.popup-export.select-columns': 'Vui lòng chọn cột dữ liệu để xuất',
2224
2485
  'core.component.table.selector-action.default-msg': 'dữ liệu được chọn',
2225
2486
  'core.component.tab-router.too-many-tabs': 'Bạn đã mở quá nhiều tab.',
@@ -2250,6 +2511,13 @@ const VI_MESSAGES = {
2250
2511
  'core.module.layout.user.notification': 'Thông báo',
2251
2512
  'core.module.layout.sidebar.search': 'Tìm kiếm',
2252
2513
  'core.module.layout.sidebar.toggle': 'Thu gọn hoặc mở rộng thanh điều hướng',
2514
+ 'core.module.layout.sidebar.menu-groups': 'Nhóm menu',
2515
+ 'core.module.layout.sidebar.close-menu': 'Đóng menu',
2516
+ 'core.module.layout.sidebar.search-in-group': 'Tìm trong nhóm',
2517
+ 'core.module.layout.sidebar.primary-nav': 'Điều hướng chính',
2518
+ 'core.module.layout.sidebar.more-menu': 'Thêm menu',
2519
+ 'core.module.layout.sidebar.more': 'Thêm',
2520
+ 'core.module.layout.sidebar.search-in-menu': 'Tìm trong menu',
2253
2521
  // ---- Module: layout (greeting + weekday) ----
2254
2522
  'core.module.layout.greeting.hello': 'Xin chào, {name}',
2255
2523
  'core.module.layout.weekday.0': 'Chủ Nhật',
@@ -2270,6 +2538,8 @@ const VI_MESSAGES = {
2270
2538
  'core.module.layout.not-found.back': 'Quay trở lại',
2271
2539
  // ---- Module: layout (home page) ----
2272
2540
  'core.module.layout.home.tab-name': 'Trang chủ',
2541
+ 'core.module.layout.not-found.tab-name': 'Không tìm thấy trang',
2542
+ 'core.module.layout.forbidden.tab-name': 'Không có quyền',
2273
2543
  'core.module.layout.home.feature.data': 'Dữ liệu',
2274
2544
  'core.module.layout.home.feature.reports': 'Báo cáo',
2275
2545
  'core.module.layout.home.feature.users': 'Người dùng',
@@ -2280,6 +2550,87 @@ const VI_MESSAGES = {
2280
2550
  'core.module.layout.mock.user.full-name': 'Người dùng demo',
2281
2551
  // ---- Module: generic (generic-select) ----
2282
2552
  'core.module.generic.generic-select.detail-link': 'chi tiết',
2553
+ // ---- Component: query-bar ----
2554
+ 'core.component.query-bar.search-placeholder': 'Tìm kiếm...',
2555
+ 'core.component.query-bar.no-fields': 'Chưa cấu hình fields',
2556
+ 'core.component.query-bar.add-filter': 'Thêm filter',
2557
+ 'core.component.query-bar.clear-all': 'Xóa tất cả ({count})',
2558
+ 'core.component.query-bar.search': 'Tìm kiếm',
2559
+ 'core.component.query-bar.logic-operator': 'Toán tử logic',
2560
+ 'core.component.query-bar.boolean.true': 'Có',
2561
+ 'core.component.query-bar.boolean.false': 'Không',
2562
+ 'core.component.query-bar.placeholder.value': 'giá trị',
2563
+ 'core.component.query-bar.placeholder.text': 'nhập…',
2564
+ 'core.component.query-bar.placeholder.from-number': 'Từ',
2565
+ 'core.component.query-bar.placeholder.to-number': 'Đến',
2566
+ 'core.component.query-bar.placeholder.from-text': 'từ…',
2567
+ 'core.component.query-bar.placeholder.to-text': 'đến…',
2568
+ 'core.component.query-bar.swap-field': 'Đổi field',
2569
+ 'core.component.query-bar.placeholder.select-value': 'Chọn giá trị',
2570
+ 'core.component.query-bar.placeholder.enter-value': 'Nhập giá trị',
2571
+ 'core.component.query-bar.loading-values': 'Đang tải...',
2572
+ 'core.component.query-bar.field-empty': 'Chưa có field nào được cấu hình.',
2573
+ 'core.component.query-bar.saved-filters.tooltip': 'Bộ lọc đã lưu',
2574
+ 'core.component.query-bar.saved-filters.tooltip-disabled': 'Cần [savedFiltersKey] để bật',
2575
+ 'core.component.query-bar.saved-filters.delete': 'Xoá bộ lọc',
2576
+ 'core.component.query-bar.saved-filters.empty': 'Chưa có bộ lọc nào.',
2577
+ 'core.component.query-bar.saved-filters.save': 'Lưu bộ lọc hiện tại',
2578
+ 'core.component.query-bar.saved-filters.name-label': 'Tên bộ lọc',
2579
+ // ---- Component: query-builder ----
2580
+ 'core.component.query-builder.date-mode.absolute': 'Ngày cụ thể',
2581
+ 'core.component.query-builder.date-mode.now': 'Hôm nay',
2582
+ 'core.component.query-builder.date-mode.relative': 'Tương đối',
2583
+ 'core.component.query-builder.value-source.literal': 'Nhập giá trị',
2584
+ 'core.component.query-builder.value-source.field': 'Chọn trường',
2585
+ 'core.component.query-builder.relative.hour-previous': 'giờ trước',
2586
+ 'core.component.query-builder.relative.hour-next': 'giờ tới',
2587
+ 'core.component.query-builder.relative.day-previous': 'ngày trước',
2588
+ 'core.component.query-builder.relative.day-next': 'ngày tới',
2589
+ 'core.component.query-builder.relative.week-previous': 'tuần trước',
2590
+ 'core.component.query-builder.relative.week-next': 'tuần tới',
2591
+ 'core.component.query-builder.relative.month-previous': 'tháng trước',
2592
+ 'core.component.query-builder.relative.month-next': 'tháng tới',
2593
+ 'core.component.query-builder.relative.format': '{amount} {phrase}',
2594
+ 'core.component.query-builder.add': 'Thêm',
2595
+ 'core.component.query-builder.add-node': 'Thêm điều kiện hoặc nhóm',
2596
+ 'core.component.query-builder.condition': 'Điều kiện',
2597
+ 'core.component.query-builder.group': 'Nhóm',
2598
+ 'core.component.query-builder.remove-group': 'Xoá nhóm',
2599
+ 'core.component.query-builder.remove-condition': 'Xoá điều kiện',
2600
+ 'core.component.query-builder.empty': 'Chưa có điều kiện',
2601
+ 'core.component.query-builder.select-field': 'Chọn trường',
2602
+ 'core.component.query-builder.value': 'Giá trị',
2603
+ 'core.component.query-builder.from': 'Từ',
2604
+ 'core.component.query-builder.to': 'Đến',
2605
+ 'core.component.query-builder.boolean.true': 'Có',
2606
+ 'core.component.query-builder.boolean.false': 'Không',
2607
+ // ---- Component: tree ----
2608
+ 'core.component.tree.selected-count': 'Đã chọn {count} mục',
2609
+ 'core.component.tree.expand': 'Mở rộng mục',
2610
+ 'core.component.tree.collapse': 'Thu gọn mục',
2611
+ 'core.component.tree.retry-item': 'Tải lại mục',
2612
+ 'core.component.tree.load-error': 'Không tải được dữ liệu cây',
2613
+ // ---- Directive: hover-copy ----
2614
+ 'core.directive.hover-copy.copied': 'Đã sao chép',
2615
+ // ---- Module: layout (sidebar sections + pin) ----
2616
+ 'core.module.layout.sidebar.pinned': 'Đã ghim',
2617
+ 'core.module.layout.sidebar.recent': 'Gần đây',
2618
+ 'core.module.layout.sidebar.all-menu': 'Tất cả menu',
2619
+ 'core.module.layout.menu.pin': 'Ghim {title}',
2620
+ 'core.module.layout.menu.unpin': 'Bỏ ghim {title}',
2621
+ // ---- Nhãn khả truy cập riêng cho từng control (thay cho key mượn tạm) ----
2622
+ 'core.form.date.open-picker': 'Mở lịch',
2623
+ 'core.form.datetime.open-picker': 'Mở lịch',
2624
+ 'core.form.date-range.open-picker': 'Mở lịch',
2625
+ 'core.form.date-range.clear': 'Xóa khoảng ngày',
2626
+ 'core.form.select.search': 'Tìm kiếm',
2627
+ 'core.component.table.loading': 'Đang tải dữ liệu bảng',
2628
+ 'core.component.upload-file.loading': 'Đang tải tệp lên',
2629
+ 'core.component.import-excel.loading': 'Đang tải dữ liệu',
2630
+ 'core.component.upload-file.remove': 'Xóa tệp',
2631
+ 'core.component.upload-file.zoom': 'Phóng to ảnh',
2632
+ 'core.component.upload-file.view-all': 'Xem tất cả ảnh',
2633
+ 'core.component.form-builder.canvas': 'Khu vực thiết kế form',
2283
2634
  };
2284
2635
 
2285
2636
  const ZH_MESSAGES = {
@@ -2368,10 +2719,6 @@ const ZH_MESSAGES = {
2368
2719
  // ---- Service: excel ----
2369
2720
  'core.excel.cannot-read-file': '无法读取文件内容',
2370
2721
  'core.excel.no-sheet': 'Excel 文件没有数据表',
2371
- // ---- Service: docx ----
2372
- 'core.docx.invalid-format': '格式不正确,请选择 DOC 或 DOCX 格式的模板',
2373
- 'core.docx.size-exceeded': '模板文件大小超出支持范围,请重试',
2374
- 'core.docx.convert-error': '转换 DOCX 文件时发生错误',
2375
2722
  // ---- Service: notify (toast) ----
2376
2723
  'core.notify.type.success': '成功',
2377
2724
  'core.notify.type.info': '信息',
@@ -2481,7 +2828,6 @@ const ZH_MESSAGES = {
2481
2828
  'core.form.time-range.step': '时间必须符合 {step} 分钟间隔',
2482
2829
  'core.form.time-range.from': '开始',
2483
2830
  'core.form.time-range.to': '结束',
2484
- 'core.form.time-range.clear': '清除时间范围',
2485
2831
  // ---- Forms: time-spinner ----
2486
2832
  'core.form.time-spinner.hour': '时',
2487
2833
  'core.form.time-spinner.minute': '分',
@@ -2506,6 +2852,7 @@ const ZH_MESSAGES = {
2506
2852
  'core.form.checkbox.unchecked': '否',
2507
2853
  // ---- Forms: select ----
2508
2854
  'core.form.select.required': '请选择',
2855
+ 'core.form.select.selectAll': '全部',
2509
2856
  // ---- Forms: textarea ----
2510
2857
  'core.form.textarea.required': '请输入内容',
2511
2858
  'core.form.textarea.maxlength': '最大字符数: {max}',
@@ -2521,13 +2868,6 @@ const ZH_MESSAGES = {
2521
2868
  'core.component.editor.image.max-width': '图片宽度 {width}px 超过限制 {max}px',
2522
2869
  'core.component.editor.image.max-height': '图片高度 {height}px 超过限制 {max}px',
2523
2870
  'core.component.editor.image.max-per-selection': '每次最多选择 {max} 张图片',
2524
- // ---- Component: document-builder ----
2525
- 'core.component.document-builder.page-number.current': '当前页码',
2526
- 'core.component.document-builder.page-number.total': '总页数',
2527
- 'core.component.document-builder.ck-comment.label': '评论',
2528
- 'core.component.document-builder.ck-comment.text-too-long': '文本过长({length} 字符)。最多 {max} 字符。',
2529
- 'core.component.document-builder.variable.not-allowed': '不允许在文本中添加变量',
2530
- 'core.component.document-builder.variable.invalid-data': '变量数据无效',
2531
2871
  // ---- Component: form-builder ----
2532
2872
  'core.component.form-builder.field-key': '字段键',
2533
2873
  'core.component.form-builder.display': '显示',
@@ -2542,6 +2882,7 @@ const ZH_MESSAGES = {
2542
2882
  'core.component.form-builder.required-when': '必填条件',
2543
2883
  'core.component.form-builder.confirm': '确认',
2544
2884
  'core.component.form-builder.delete': '删除',
2885
+ 'core.component.form-builder.select-item': '选择以编辑',
2545
2886
  'core.component.form-builder.save': '保存',
2546
2887
  'core.component.form-builder.hint': '提示',
2547
2888
  'core.component.form-builder.parameter': '参数',
@@ -2613,9 +2954,13 @@ const ZH_MESSAGES = {
2613
2954
  'core.component.form-builder.display-label': '显示标签',
2614
2955
  'core.component.form-builder.attribute': '属性',
2615
2956
  'core.component.form-builder.add-variable': '添加变量',
2957
+ 'core.component.form-builder.no-variable': '尚无变量。添加变量后可在条件表达式中使用。',
2958
+ 'core.component.form-builder.no-validation': '尚无验证。添加验证以按条件显示警告或错误。',
2616
2959
  'core.component.form-builder.add-new': '新增',
2617
2960
  'core.component.form-builder.detail': '详情',
2618
2961
  'core.component.form-builder.create-update': '新建/更新',
2962
+ 'core.component.form-builder.update-row': '更新行',
2963
+ 'core.component.form-builder.add-row': '添加行',
2619
2964
  'core.component.form-builder.default': '默认',
2620
2965
  'core.component.form-builder.show-more': '查看更多',
2621
2966
  'core.component.form-builder.show-less': '收起',
@@ -2779,6 +3124,8 @@ const ZH_MESSAGES = {
2779
3124
  'core.component.table.choose-filter-hint': '请先选择筛选条件',
2780
3125
  'core.component.table.no-data': '暂无数据',
2781
3126
  'core.component.table.export-excel': '导出 Excel',
3127
+ 'core.component.table.exporting': '正在导出...{percent}%',
3128
+ 'core.component.table.export': '导出数据',
2782
3129
  'core.component.table.export-csv': '导出 CSV',
2783
3130
  'core.component.table.showing': '显示:',
2784
3131
  'core.component.table.paginator.first-page': '首页',
@@ -2789,6 +3136,8 @@ const ZH_MESSAGES = {
2789
3136
  'core.component.table.error-occurred': '发生错误',
2790
3137
  'core.component.table.not-an-array': '数据不是数组',
2791
3138
  'core.component.table.config.confirm-reset': '确认将所有设置恢复为默认值',
3139
+ 'core.component.table.config.drag-hint': '拖动 ⠿ 图标可重新排列列顺序',
3140
+ 'core.component.table.config.drag-handle': '拖动以调整列顺序',
2792
3141
  'core.component.table.popup-export.select-columns': '请选择要导出的列',
2793
3142
  'core.component.table.selector-action.default-msg': '项已选择',
2794
3143
  'core.component.tab-router.too-many-tabs': '您已打开过多标签页。',
@@ -2819,6 +3168,13 @@ const ZH_MESSAGES = {
2819
3168
  'core.module.layout.user.notification': '通知',
2820
3169
  'core.module.layout.sidebar.search': '搜索',
2821
3170
  'core.module.layout.sidebar.toggle': '切换侧边栏',
3171
+ 'core.module.layout.sidebar.menu-groups': '菜单分组',
3172
+ 'core.module.layout.sidebar.close-menu': '关闭菜单',
3173
+ 'core.module.layout.sidebar.search-in-group': '在分组内搜索',
3174
+ 'core.module.layout.sidebar.primary-nav': '主导航',
3175
+ 'core.module.layout.sidebar.more-menu': '更多菜单',
3176
+ 'core.module.layout.sidebar.more': '更多',
3177
+ 'core.module.layout.sidebar.search-in-menu': '搜索菜单',
2822
3178
  // ---- Module: layout (greeting + weekday) ----
2823
3179
  'core.module.layout.greeting.hello': '你好,{name}',
2824
3180
  'core.module.layout.weekday.0': '星期日',
@@ -2839,6 +3195,8 @@ const ZH_MESSAGES = {
2839
3195
  'core.module.layout.not-found.back': '返回',
2840
3196
  // ---- Module: layout (home page) ----
2841
3197
  'core.module.layout.home.tab-name': '首页',
3198
+ 'core.module.layout.not-found.tab-name': '页面未找到',
3199
+ 'core.module.layout.forbidden.tab-name': '拒绝访问',
2842
3200
  'core.module.layout.home.feature.data': '数据',
2843
3201
  'core.module.layout.home.feature.reports': '报表',
2844
3202
  'core.module.layout.home.feature.users': '用户',
@@ -2849,6 +3207,87 @@ const ZH_MESSAGES = {
2849
3207
  'core.module.layout.mock.user.full-name': '演示用户',
2850
3208
  // ---- Module: generic (generic-select) ----
2851
3209
  'core.module.generic.generic-select.detail-link': '详情',
3210
+ // ---- Component: query-bar ----
3211
+ 'core.component.query-bar.search-placeholder': '搜索...',
3212
+ 'core.component.query-bar.no-fields': '尚未配置字段',
3213
+ 'core.component.query-bar.add-filter': '添加筛选',
3214
+ 'core.component.query-bar.clear-all': '清除全部 ({count})',
3215
+ 'core.component.query-bar.search': '搜索',
3216
+ 'core.component.query-bar.logic-operator': '逻辑运算符',
3217
+ 'core.component.query-bar.boolean.true': '是',
3218
+ 'core.component.query-bar.boolean.false': '否',
3219
+ 'core.component.query-bar.placeholder.value': '值',
3220
+ 'core.component.query-bar.placeholder.text': '输入…',
3221
+ 'core.component.query-bar.placeholder.from-number': '起始',
3222
+ 'core.component.query-bar.placeholder.to-number': '结束',
3223
+ 'core.component.query-bar.placeholder.from-text': '起始…',
3224
+ 'core.component.query-bar.placeholder.to-text': '结束…',
3225
+ 'core.component.query-bar.swap-field': '更改字段',
3226
+ 'core.component.query-bar.placeholder.select-value': '选择值',
3227
+ 'core.component.query-bar.placeholder.enter-value': '输入值',
3228
+ 'core.component.query-bar.loading-values': '加载中...',
3229
+ 'core.component.query-bar.field-empty': '尚未配置任何字段。',
3230
+ 'core.component.query-bar.saved-filters.tooltip': '已保存的筛选',
3231
+ 'core.component.query-bar.saved-filters.tooltip-disabled': '需要 [savedFiltersKey] 才能启用',
3232
+ 'core.component.query-bar.saved-filters.delete': '删除筛选',
3233
+ 'core.component.query-bar.saved-filters.empty': '暂无已保存的筛选。',
3234
+ 'core.component.query-bar.saved-filters.save': '保存当前筛选',
3235
+ 'core.component.query-bar.saved-filters.name-label': '筛选名称',
3236
+ // ---- Component: query-builder ----
3237
+ 'core.component.query-builder.date-mode.absolute': '指定日期',
3238
+ 'core.component.query-builder.date-mode.now': '今天',
3239
+ 'core.component.query-builder.date-mode.relative': '相对',
3240
+ 'core.component.query-builder.value-source.literal': '输入值',
3241
+ 'core.component.query-builder.value-source.field': '与字段比较',
3242
+ 'core.component.query-builder.relative.hour-previous': '小时前',
3243
+ 'core.component.query-builder.relative.hour-next': '小时后',
3244
+ 'core.component.query-builder.relative.day-previous': '天前',
3245
+ 'core.component.query-builder.relative.day-next': '天后',
3246
+ 'core.component.query-builder.relative.week-previous': '周前',
3247
+ 'core.component.query-builder.relative.week-next': '周后',
3248
+ 'core.component.query-builder.relative.month-previous': '个月前',
3249
+ 'core.component.query-builder.relative.month-next': '个月后',
3250
+ 'core.component.query-builder.relative.format': '{amount}{phrase}',
3251
+ 'core.component.query-builder.add': '添加',
3252
+ 'core.component.query-builder.add-node': '添加条件或分组',
3253
+ 'core.component.query-builder.condition': '条件',
3254
+ 'core.component.query-builder.group': '分组',
3255
+ 'core.component.query-builder.remove-group': '删除分组',
3256
+ 'core.component.query-builder.remove-condition': '删除条件',
3257
+ 'core.component.query-builder.empty': '暂无条件',
3258
+ 'core.component.query-builder.select-field': '选择字段',
3259
+ 'core.component.query-builder.value': '值',
3260
+ 'core.component.query-builder.from': '起始',
3261
+ 'core.component.query-builder.to': '结束',
3262
+ 'core.component.query-builder.boolean.true': '是',
3263
+ 'core.component.query-builder.boolean.false': '否',
3264
+ // ---- Component: tree ----
3265
+ 'core.component.tree.selected-count': '已选择 {count} 项',
3266
+ 'core.component.tree.expand': '展开树节点',
3267
+ 'core.component.tree.collapse': '折叠树节点',
3268
+ 'core.component.tree.retry-item': '重新加载树节点',
3269
+ 'core.component.tree.load-error': '无法加载树数据',
3270
+ // ---- Directive: hover-copy ----
3271
+ 'core.directive.hover-copy.copied': '已复制',
3272
+ // ---- Module: layout (sidebar sections + pin) ----
3273
+ 'core.module.layout.sidebar.pinned': '已固定',
3274
+ 'core.module.layout.sidebar.recent': '最近',
3275
+ 'core.module.layout.sidebar.all-menu': '全部菜单',
3276
+ 'core.module.layout.menu.pin': '固定 {title}',
3277
+ 'core.module.layout.menu.unpin': '取消固定 {title}',
3278
+ // ---- Per-control accessible names (replacing borrowed keys) ----
3279
+ 'core.form.date.open-picker': '打开日历',
3280
+ 'core.form.datetime.open-picker': '打开日历',
3281
+ 'core.form.date-range.open-picker': '打开日历',
3282
+ 'core.form.date-range.clear': '清除日期范围',
3283
+ 'core.form.select.search': '搜索',
3284
+ 'core.component.table.loading': '正在加载表格数据',
3285
+ 'core.component.upload-file.loading': '正在上传文件',
3286
+ 'core.component.import-excel.loading': '正在加载数据',
3287
+ 'core.component.upload-file.remove': '删除文件',
3288
+ 'core.component.upload-file.zoom': '放大图片',
3289
+ 'core.component.upload-file.view-all': '查看全部图片',
3290
+ 'core.component.form-builder.canvas': '表单设计画布',
2852
3291
  };
2853
3292
 
2854
3293
  const I18N_MESSAGES = {
@@ -2960,22 +3399,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
2960
3399
  args: [{ providedIn: 'root' }]
2961
3400
  }] });
2962
3401
 
2963
- class TranslatePipe {
3402
+ // why: tên pipe cũ `translate` đụng trực diện với pipe cùng tên của `@ngx-translate/core`. Cả hai đều
3403
+ // standalone nên consumer dùng song song KHÔNG thể import chung vào một component (Angular báo lỗi
3404
+ // trùng tên pipe trong cùng scope). Đổi sang `sdTranslate` để tên pipe nằm trong namespace `sd` của lib.
3405
+ class SdTranslatePipe {
2964
3406
  #i18n = inject(I18nService);
2965
3407
  transform(key, params) {
2966
3408
  return this.#i18n.t(key, params);
2967
3409
  }
2968
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TranslatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
2969
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: TranslatePipe, isStandalone: true, name: "translate" });
3410
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdTranslatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
3411
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: SdTranslatePipe, isStandalone: true, name: "sdTranslate" });
2970
3412
  }
2971
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TranslatePipe, decorators: [{
3413
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdTranslatePipe, decorators: [{
2972
3414
  type: Pipe,
2973
- args: [{ name: 'translate', standalone: true }]
3415
+ args: [{ name: 'sdTranslate', standalone: true }]
2974
3416
  }] });
2975
3417
 
2976
3418
  /**
2977
3419
  * Generated bundle index. Do not edit.
2978
3420
  */
2979
3421
 
2980
- export { I18N_MESSAGES, I18N_STORAGE_KEY, I18nService, TranslatePipe };
3422
+ export { I18N_MESSAGES, I18N_STORAGE_KEY, I18nService, SdTranslatePipe };
2981
3423
  //# sourceMappingURL=sdcorejs-angular-i18n.mjs.map