@dev.smartpricing/message-composer-layer 1.0.1

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 (169) hide show
  1. package/README.md +75 -0
  2. package/app/api/ai.ts +28 -0
  3. package/app/api/brands.ts +54 -0
  4. package/app/api/client.ts +56 -0
  5. package/app/api/compilation.ts +34 -0
  6. package/app/api/dynamicValues.ts +11 -0
  7. package/app/api/index.ts +11 -0
  8. package/app/api/languages.ts +6 -0
  9. package/app/api/media.ts +26 -0
  10. package/app/api/messageGroups.ts +49 -0
  11. package/app/api/messages.ts +22 -0
  12. package/app/api/meta.ts +18 -0
  13. package/app/api/tracking.ts +9 -0
  14. package/app/components/Brand/BrandDrawer.vue +281 -0
  15. package/app/components/Brand/BrandPreview.vue +137 -0
  16. package/app/components/Brand/Steps/BrandStepGeneral.vue +37 -0
  17. package/app/components/Brand/Steps/BrandStepSocials.vue +48 -0
  18. package/app/components/Brand/Steps/BrandStepVisual.vue +214 -0
  19. package/app/components/Common/BrandColorSwatches.vue +37 -0
  20. package/app/components/Common/ColorInput.vue +144 -0
  21. package/app/components/Common/EmojiPickerButton.vue +35 -0
  22. package/app/components/Common/FontFamilySelect.vue +39 -0
  23. package/app/components/Common/HtmlPreviewIframe.vue +68 -0
  24. package/app/components/Common/IncompleteTranslationsDialog.vue +97 -0
  25. package/app/components/Common/LanguageList.vue +356 -0
  26. package/app/components/Common/LoadingOverlay.vue +12 -0
  27. package/app/components/Common/MediaUploadOrSelect.vue +299 -0
  28. package/app/components/Common/MessagePreviewSlideover.vue +88 -0
  29. package/app/components/Common/MonacoEditor.vue +110 -0
  30. package/app/components/Common/PhoneInput.vue +804 -0
  31. package/app/components/Common/SectionHeader.vue +26 -0
  32. package/app/components/Common/TranslationActionBar.vue +139 -0
  33. package/app/components/Common/ViewLessMore.vue +40 -0
  34. package/app/components/CreateTemplateButton.vue +59 -0
  35. package/app/components/DynamicDataButton.vue +75 -0
  36. package/app/components/DynamicDataSlideover.vue +149 -0
  37. package/app/components/Editor/AiGenerateSlideover.vue +292 -0
  38. package/app/components/Editor/EditorLinkPopover.vue +154 -0
  39. package/app/components/Editor/RichTextEditor.vue +495 -0
  40. package/app/components/Email/Editor/BlockLibrary.vue +89 -0
  41. package/app/components/Email/Editor/BlockSettings.vue +60 -0
  42. package/app/components/Email/Editor/Blocks/ButtonBlock.vue +117 -0
  43. package/app/components/Email/Editor/Blocks/ButtonSettings.vue +228 -0
  44. package/app/components/Email/Editor/Blocks/DiscountCodeBlock.vue +74 -0
  45. package/app/components/Email/Editor/Blocks/DiscountCodeSettings.vue +162 -0
  46. package/app/components/Email/Editor/Blocks/DividerBlock.vue +31 -0
  47. package/app/components/Email/Editor/Blocks/DividerSettings.vue +108 -0
  48. package/app/components/Email/Editor/Blocks/FooterBlock.vue +61 -0
  49. package/app/components/Email/Editor/Blocks/FooterSettings.vue +123 -0
  50. package/app/components/Email/Editor/Blocks/GridBlock.vue +128 -0
  51. package/app/components/Email/Editor/Blocks/GridSettings.vue +109 -0
  52. package/app/components/Email/Editor/Blocks/HTMLBlock.vue +31 -0
  53. package/app/components/Email/Editor/Blocks/HTMLSettings.vue +85 -0
  54. package/app/components/Email/Editor/Blocks/HeaderBlock.vue +53 -0
  55. package/app/components/Email/Editor/Blocks/HeaderSettings.vue +113 -0
  56. package/app/components/Email/Editor/Blocks/HeadingBlock.vue +61 -0
  57. package/app/components/Email/Editor/Blocks/HeadingSettings.vue +156 -0
  58. package/app/components/Email/Editor/Blocks/ImageBlock.vue +49 -0
  59. package/app/components/Email/Editor/Blocks/ImageSettings.vue +53 -0
  60. package/app/components/Email/Editor/Blocks/IndexBlock.vue +155 -0
  61. package/app/components/Email/Editor/Blocks/ParagraphBlock.vue +61 -0
  62. package/app/components/Email/Editor/Blocks/ParagraphSettings.vue +157 -0
  63. package/app/components/Email/Editor/Blocks/SocialsBlock.vue +63 -0
  64. package/app/components/Email/Editor/Blocks/SocialsSettings.vue +117 -0
  65. package/app/components/Email/Editor/Blocks/SpacerBlock.vue +37 -0
  66. package/app/components/Email/Editor/Blocks/SpacerSettings.vue +95 -0
  67. package/app/components/Email/Editor/Blocks/TopProductsBlock.vue +47 -0
  68. package/app/components/Email/Editor/Blocks/TopProductsSettings.vue +87 -0
  69. package/app/components/Email/Editor/Blocks/UnsubscribeLinkBlock.vue +61 -0
  70. package/app/components/Email/Editor/Blocks/UnsubscribeLinkSettings.vue +123 -0
  71. package/app/components/Email/Editor/Canvas.vue +143 -0
  72. package/app/components/Email/Editor/GeneralStyleSettings.vue +125 -0
  73. package/app/components/Email/Editor/Index.vue +77 -0
  74. package/app/components/Email/Editor/LeftSidebar.vue +95 -0
  75. package/app/components/Email/InlinePreview.vue +124 -0
  76. package/app/components/Email/Preview.vue +126 -0
  77. package/app/components/Email/PreviewPanel.vue +57 -0
  78. package/app/components/Email/SendTestEmailModal.vue +121 -0
  79. package/app/components/Email/TranslationEditor.vue +198 -0
  80. package/app/components/Email/Translator/Button.vue +101 -0
  81. package/app/components/Email/Translator/Discount.vue +60 -0
  82. package/app/components/Email/Translator/Footer.vue +66 -0
  83. package/app/components/Email/Translator/Grid.vue +127 -0
  84. package/app/components/Email/Translator/Header.vue +90 -0
  85. package/app/components/Email/Translator/Heading.vue +66 -0
  86. package/app/components/Email/Translator/Image.vue +91 -0
  87. package/app/components/Email/Translator/Index.vue +138 -0
  88. package/app/components/Email/Translator/Paragraph.vue +66 -0
  89. package/app/components/Email/Translator/RawHtml.vue +64 -0
  90. package/app/components/Email/Translator/UnsubscribeLink.vue +59 -0
  91. package/app/components/TemplateList/BaseTable.vue +354 -0
  92. package/app/components/TemplateList/StatusCell.vue +67 -0
  93. package/app/components/Whatsapp/CategoryChanger.vue +63 -0
  94. package/app/components/Whatsapp/Editor/Body.vue +53 -0
  95. package/app/components/Whatsapp/Editor/Buttons.vue +341 -0
  96. package/app/components/Whatsapp/Editor/Footer.vue +70 -0
  97. package/app/components/Whatsapp/Editor/Header.vue +156 -0
  98. package/app/components/Whatsapp/Editor/Index.vue +89 -0
  99. package/app/components/Whatsapp/Editor/SyncWrapper.vue +166 -0
  100. package/app/components/Whatsapp/Preview.vue +197 -0
  101. package/app/components/Whatsapp/PreviewPanel.vue +24 -0
  102. package/app/components/Whatsapp/TranslationEditor.vue +150 -0
  103. package/app/components/Whatsapp/Translator/Body.vue +61 -0
  104. package/app/components/Whatsapp/Translator/Button.vue +209 -0
  105. package/app/components/Whatsapp/Translator/Footer.vue +56 -0
  106. package/app/components/Whatsapp/Translator/Header.vue +61 -0
  107. package/app/components/Whatsapp/Translator/HeaderMedia.vue +117 -0
  108. package/app/components/Whatsapp/Translator/Index.vue +159 -0
  109. package/app/composables/composerContext.ts +35 -0
  110. package/app/composables/useAutoTranslate.ts +242 -0
  111. package/app/composables/useAutoTranslateEmail.ts +294 -0
  112. package/app/composables/useChangeTracking.ts +212 -0
  113. package/app/composables/useChangeTrackingEmail.ts +227 -0
  114. package/app/composables/useChannels.ts +36 -0
  115. package/app/composables/useEmailBlockContext.ts +43 -0
  116. package/app/composables/useExitConfirmation.ts +39 -0
  117. package/app/composables/useGoBack.ts +15 -0
  118. package/app/composables/useIncompleteTranslations.ts +55 -0
  119. package/app/composables/useIncompleteTranslationsEmail.ts +56 -0
  120. package/app/composables/useMediaLimits.ts +42 -0
  121. package/app/composables/useTemplateFormValidation.ts +109 -0
  122. package/app/composables/useTemplateOperations.ts +147 -0
  123. package/app/composables/useTracking.ts +39 -0
  124. package/app/composables/useTranslationFilters.ts +176 -0
  125. package/app/composables/useTranslationFiltersEmail.ts +244 -0
  126. package/app/composables/useWhatsappTemplateBehaviors.ts +58 -0
  127. package/app/middleware/channel-guard.ts +13 -0
  128. package/app/pages/brands.vue +195 -0
  129. package/app/pages/images.vue +141 -0
  130. package/app/pages/index.vue +198 -0
  131. package/app/pages/preview/[id].vue +47 -0
  132. package/app/pages/template/email/[id].vue +596 -0
  133. package/app/pages/template/email/create.vue +562 -0
  134. package/app/pages/template/whatsapp/[id].vue +561 -0
  135. package/app/pages/template/whatsapp/create.vue +468 -0
  136. package/app/plugins/admin-shortcut.client.ts +7 -0
  137. package/app/plugins/tracking.client.ts +12 -0
  138. package/app/queries/ai.ts +20 -0
  139. package/app/queries/brands.ts +75 -0
  140. package/app/queries/compilation.ts +37 -0
  141. package/app/queries/dynamicValues.ts +13 -0
  142. package/app/queries/index.ts +9 -0
  143. package/app/queries/languages.ts +10 -0
  144. package/app/queries/media.ts +27 -0
  145. package/app/queries/messageGroups.ts +112 -0
  146. package/app/queries/messages.ts +42 -0
  147. package/app/queries/meta.ts +13 -0
  148. package/app/stores/adminStore.ts +50 -0
  149. package/app/stores/appContext.ts +99 -0
  150. package/app/stores/emailEditor.ts +220 -0
  151. package/app/stores/main.ts +3 -0
  152. package/app/stores/metaSubmission.ts +116 -0
  153. package/app/types/app-config.d.ts +14 -0
  154. package/app/types/hooks.d.ts +9 -0
  155. package/app/types/tracking.ts +148 -0
  156. package/app/utils/locale.ts +17 -0
  157. package/app/utils/notifyParent.ts +7 -0
  158. package/app/utils/resolveDefaultLanguage.ts +14 -0
  159. package/app/utils/socialDefaults.ts +42 -0
  160. package/app/utils/testIds.const.ts +728 -0
  161. package/app.config.ts +5 -0
  162. package/i18n/check-translations.ts +56 -0
  163. package/i18n/locales/de.ts +834 -0
  164. package/i18n/locales/en.ts +826 -0
  165. package/i18n/locales/es.ts +833 -0
  166. package/i18n/locales/fr.ts +837 -0
  167. package/i18n/locales/it.ts +831 -0
  168. package/nuxt.config.ts +65 -0
  169. package/package.json +64 -0
@@ -0,0 +1,826 @@
1
+ export default {
2
+ language: {
3
+ en: 'English',
4
+ de: 'German',
5
+ fr: 'French',
6
+ it: 'Italian',
7
+ es: 'Spanish',
8
+ },
9
+ message: {
10
+ render_type: {
11
+ whatsapp_v1: 'Whatsapp',
12
+ email_v1: 'Email',
13
+ },
14
+ },
15
+ status: {
16
+ pending: 'Pending',
17
+ draft: 'Draft',
18
+ rejected: 'Rejected',
19
+ approved: 'Approved',
20
+ },
21
+ categories: {
22
+ marketing: 'Marketing',
23
+ utility: 'Utility',
24
+ },
25
+ common: {
26
+ search: 'Search...',
27
+ all: 'All',
28
+ view_less: 'View less',
29
+ view_more: 'View more',
30
+ copy: 'Copy',
31
+ success: 'Success',
32
+ error: 'Error',
33
+ errore: 'Error',
34
+ mobile: 'Mobile',
35
+ desktop: 'Desktop',
36
+ actions: {
37
+ edit: 'Edit',
38
+ delete: 'Delete',
39
+ duplicate: 'Duplicate',
40
+ cancel: 'Cancel',
41
+ publish: 'Publish',
42
+ unpublish: 'Unpublish',
43
+ save: 'Save',
44
+ remove: 'Remove',
45
+ reset_defaults: 'Reset to defaults',
46
+ },
47
+ internal: 'Internal',
48
+ imageUpload: {
49
+ upload: 'Upload',
50
+ uploading: 'Uploading...',
51
+ selectFromLibrary: 'Select from library',
52
+ selectImage: 'Select an image',
53
+ searchPlaceholder: 'Search by name...',
54
+ noImages: 'No images available',
55
+ noResults: 'No images match your search',
56
+ videoMp4Only: 'Only MP4 and 3GPP video files are supported.',
57
+ imageJpgPngOnly: 'Only JPG and PNG image files are supported.',
58
+ mediaFileTooLarge: 'File is too large. Maximum size: {maxSize}MB.',
59
+ mediaInvalidType: 'Unsupported file type.',
60
+ mediaLimitations: {
61
+ image: 'JPG, PNG only. Max {maxSize}MB.',
62
+ video: 'MP4, 3GPP only. Max {maxSize}MB.',
63
+ document: 'PDF only. Max {maxSize}MB.',
64
+ },
65
+ },
66
+ copy_of: 'Copy of {name}',
67
+ preview: 'Preview',
68
+ translation_failed: 'Translation failed',
69
+ },
70
+ documentation: {
71
+ whatsapp_category: {
72
+ category: 'Message',
73
+ title: 'Choose the correct category',
74
+ description:
75
+ 'To ensure effective and efficient conversations, whatsapp has <b>defined specific guidelines</b> for the messages businesses can send to their customers.',
76
+ info: 'Any message that combines marketing and utility content will be classified as a marketing message.',
77
+ content: {
78
+ marketing: `
79
+ # Marketing
80
+
81
+ Marketing messages offer maximum flexibility: they’re not tied to a specific transaction but can **promote the business**, its **products**, or **services**.
82
+
83
+ &nbsp;
84
+
85
+ They may include, for example:
86
+ - promotional offers or commercial messages;
87
+ - welcome or follow-up messages;
88
+ - invitations, updates, or personalized suggestions;
89
+ - requests for interaction or to start a new transaction
90
+ `,
91
+ utility: `
92
+ # Utility
93
+
94
+ Utility messages are designed to support operational interactions between a business and its customers, related to existing transactions or services.
95
+
96
+ &nbsp;
97
+
98
+ They may include, for example:
99
+ - confirmations, suspensions, or changes to an existing booking or subscription;
100
+ - notifications related to accounts, billing, or payments.
101
+
102
+ &nbsp;
103
+
104
+ These messages must be functional, not promotional.
105
+ `,
106
+ },
107
+ },
108
+ },
109
+ dialogs: {
110
+ unsaved_changes: {
111
+ title: 'You have unsaved changes',
112
+ category: 'Message',
113
+ message:
114
+ 'Are you sure you want to leave this page? You will lose all the changes made so far.',
115
+ cancel: 'Cancel',
116
+ leave: 'Yes, leave this page',
117
+ },
118
+ delete_message_group: {
119
+ title: 'Delete',
120
+ message: "This action can't be undone. Are you sure you want to delete {name}?",
121
+ success: '{name} has been successfully deleted.',
122
+ },
123
+ publish_message_group: {
124
+ title: 'Publish message',
125
+ message: 'Publish "{name}" to make it visible to clients?',
126
+ success: '"{name}" has been published.',
127
+ },
128
+ unpublish_message_group: {
129
+ title: 'Unpublish message',
130
+ message: 'Unpublish "{name}"? It will no longer be visible to clients.',
131
+ success: '"{name}" has been unpublished.',
132
+ },
133
+ delete_message: {
134
+ title: 'Delete',
135
+ message: "This action can't be undone. Are you sure you want to delete {name}?",
136
+ success: '{name} has been successfully deleted.',
137
+ },
138
+ incomplete_translations: {
139
+ title: 'Missing translations',
140
+ description:
141
+ 'You are about to save a message that contains missing translations. To use it correctly, we recommend completing the missing translations.',
142
+ note: 'If you no longer need certain languages, you can remove them from the list in the left panel using the dedicated button.',
143
+ go_to_translations: 'Go to translations',
144
+ save_without_translating: 'Save without translating',
145
+ translate_and_save: 'Translate automatically and save',
146
+ },
147
+ whatsapp_change_category: {
148
+ title: 'Change category',
149
+ category: 'Message',
150
+ message: 'You are about to change the category from {0} to <b>{1}</b>.',
151
+ fields_may_change:
152
+ 'By changing the category, <b>some fields may change</b>. The category change will be applied to all languages.',
153
+ cancel: 'Cancel',
154
+ change_to: 'Change to {0}',
155
+ },
156
+ grid_reduce_columns: {
157
+ title: 'Edit number of columns',
158
+ message: 'Some elements may be lost and cannot be recovered.',
159
+ confirm: 'Confirm',
160
+ },
161
+ },
162
+ modals: {
163
+ dynamic_data_modal: {
164
+ category: 'Body content',
165
+ title: 'Add dynamic field',
166
+ description:
167
+ 'There is no limit to how many you can use. If you end a sentence with a dynamic value, make sure to add a dot (“.”) at the end.',
168
+ select_value: 'Select a value',
169
+ will_display: 'The text field will display &#123;&#123;{value}&#125;&#125;',
170
+ search_placeholder: 'Search fields...',
171
+ info: 'Dynamic fields are placeholders that will be replaced with real data (e.g., guest name) when the message is sent. If a field has no data, it will be skipped.',
172
+ no_values: 'No dynamic values available for this product.',
173
+ tabs: {
174
+ newsletter: 'Newsletter',
175
+ 'guest-automation': 'Guest Automation',
176
+ 'reservation-automation': 'Reservation Automation',
177
+ default: 'Default',
178
+ },
179
+ },
180
+ },
181
+ pages: {
182
+ message_library: {
183
+ add_message_group: 'New message',
184
+ title: 'Messages',
185
+ search_placeholder: 'Search',
186
+ category_placeholder: 'Select category',
187
+ status_placeholder: 'Select status',
188
+ tags_placeholder: 'Filter by tags',
189
+ render_type_placeholder: 'Select render type',
190
+ headers: {
191
+ name: 'Name',
192
+ category: 'Category',
193
+ preview: 'Preview',
194
+ status: 'Status',
195
+ tags: 'Tags',
196
+ updated_at: 'Updated at',
197
+ },
198
+ },
199
+ whatsapp: {
200
+ tabs: {
201
+ content: 'Message',
202
+ translations: 'Translations',
203
+ },
204
+ create_message_group: {
205
+ title: 'Create message',
206
+ save_draft: 'Save draft',
207
+ save_as_new: 'Save as new',
208
+ request_approval: 'Request approval',
209
+ name: 'Name',
210
+ name_placeholder: 'Message name',
211
+ category: 'Category',
212
+ category_placeholder: 'Select category',
213
+ message_content: 'Message content',
214
+ add_language: 'Add language',
215
+ },
216
+ edit_message_group: {
217
+ title: 'Edit whatsapp message',
218
+ save_draft: 'Save draft',
219
+ save_as_new: 'Save as new',
220
+ request_approval: 'Request approval',
221
+ name: 'Name',
222
+ name_placeholder: 'Message name',
223
+ category: 'Category',
224
+ category_placeholder: 'Select category',
225
+ message_content: 'Message content',
226
+ add_language: 'Add language',
227
+ },
228
+ },
229
+ email: {
230
+ send_test: 'Send test',
231
+ send_test_success: 'Test email sent successfully.',
232
+ test_email_to_placeholder: 'Recipient email(s), separated by ;',
233
+ create_message_group: {
234
+ title: 'Create message',
235
+ save: 'Save',
236
+ save_as_draft: 'Save draft',
237
+ save_message: 'Save',
238
+ name: 'Name',
239
+ name_placeholder: 'Message name',
240
+ subject: 'Subject',
241
+ subject_placeholder: 'Email subject line',
242
+ tab_content: 'Message',
243
+ tab_translations: 'Translations',
244
+ },
245
+ edit_message_group: {
246
+ title: 'Edit email message',
247
+ save: 'Save',
248
+ save_as_draft: 'Save draft',
249
+ save_message: 'Save',
250
+ save_as_new: 'Save as new',
251
+ name: 'Name',
252
+ name_placeholder: 'Message name',
253
+ subject: 'Subject',
254
+ subject_placeholder: 'Email subject line',
255
+ tab_content: 'Message',
256
+ tab_translations: 'Translations',
257
+ },
258
+ },
259
+ brands: {
260
+ title: 'Brands',
261
+ new_brand: 'New brand',
262
+ edit_brand: 'Edit brand',
263
+ no_brands: 'No brands created yet',
264
+ search_placeholder: 'Search brands...',
265
+ column_name: 'Name',
266
+ column_created: 'Created',
267
+ column_actions: 'Actions',
268
+ delete_confirm_title: 'Delete brand',
269
+ delete_confirm_message: 'Are you sure you want to delete "{name}"? This cannot be undone.',
270
+ brand_deleted: '"{name}" has been deleted.',
271
+ brand_created: 'Brand created successfully.',
272
+ brand_updated: 'Brand updated successfully.',
273
+ save_error: 'Failed to save brand. Please try again.',
274
+ steps: {
275
+ general: 'General',
276
+ visual_style: 'Visual style',
277
+ socials: 'Socials',
278
+ },
279
+ fields: {
280
+ name: 'Brand name',
281
+ name_placeholder: 'E.g. Smartness',
282
+ properties: 'Properties',
283
+ properties_placeholder: 'Select properties',
284
+ logo: 'Logo',
285
+ upload_logo: 'Upload logo',
286
+ change_logo: 'Change logo',
287
+ colors: 'Brand colors',
288
+ add_color: 'Add color',
289
+ extracting_colors: 'Extracting colors from logo...',
290
+ default_email_colors: 'Default email colors',
291
+ email_bg_color: 'Background',
292
+ email_content_bg_color: 'Content background',
293
+ email_text_color: 'Text',
294
+ default_button_colors: 'Default button colors',
295
+ button_text_color: 'Text',
296
+ button_bg_color: 'Background',
297
+ default_font: 'Default font',
298
+ },
299
+ actions: {
300
+ back: 'Back',
301
+ next: 'Next',
302
+ create: 'Create brand',
303
+ },
304
+ validation: {
305
+ name_required: 'Brand name is required',
306
+ invalid_social_url: 'One or more social URLs are invalid',
307
+ },
308
+ preview: {
309
+ title: 'Preview',
310
+ empty: 'Preview will appear here',
311
+ },
312
+ },
313
+ images: {
314
+ title: 'Images',
315
+ no_images_uploaded: 'No images uploaded',
316
+ meta_access_token_not_configured: 'Meta access token not configured',
317
+ image_uploaded_to_meta: 'Image uploaded to meta',
318
+ image_deleted: 'Image deleted',
319
+ delete_confirm: 'Delete {name}?',
320
+ meta: 'Meta',
321
+ no_meta: 'No meta',
322
+ type_label: 'Type:',
323
+ created_label: 'Created:',
324
+ handle_label: 'Handle:',
325
+ upload_to_meta: 'Upload to meta',
326
+ },
327
+ },
328
+ editor: {
329
+ actions: {
330
+ improve_text: 'Improve message',
331
+ refining: 'We are improving your text...',
332
+ generate_text: 'Generate',
333
+ },
334
+ generate: {
335
+ title: 'Generate content',
336
+ description: 'Provide a clear and concise description for the best results.',
337
+ placeholder: 'Start typing here...',
338
+ disclaimer: 'Artificial intelligence can produce inaccurate content.',
339
+ cancel: 'Cancel',
340
+ submit: 'Generate content',
341
+ your_request: 'Your request',
342
+ choose_option: 'Choose an option',
343
+ use_it: 'Use it',
344
+ create_new: 'Create new content',
345
+ loading: 'Generating suggestions...',
346
+ error: 'Failed to generate content. Please try again.',
347
+ retry: 'Try again',
348
+ char_count: '{count}/{max}',
349
+ },
350
+ toolbar: {
351
+ bold: 'Bold',
352
+ italic: 'Italic',
353
+ underline: 'Underline',
354
+ bullet_list: 'Bullet list',
355
+ ordered_list: 'Ordered list',
356
+ text_align: 'Text align',
357
+ align_left: 'Align left',
358
+ align_center: 'Align center',
359
+ align_right: 'Align right',
360
+ align_justify: 'Justify',
361
+ link: 'Link',
362
+ link_placeholder: 'Paste a link...',
363
+ link_apply: 'Apply link',
364
+ link_open: 'Open in new window',
365
+ link_remove: 'Remove link',
366
+ horizontal_rule: 'Horizontal line',
367
+ emoji: 'Emoji',
368
+ dynamic_data: 'Dynamic data',
369
+ },
370
+ placeholder: {
371
+ insert_text: 'Insert text',
372
+ },
373
+ validation: {
374
+ character_limit: 'This field has a character limit.',
375
+ invalid_phone_number: 'Invalid phone number',
376
+ error: {
377
+ title: 'Please fix the following errors',
378
+ invalidRenderType: 'Invalid message type',
379
+ bodyRequired: 'Message body is required',
380
+ bodyEmpty: 'Message body cannot be empty',
381
+ maxButtons: 'Maximum 10 buttons allowed',
382
+ maxLinkButtons: 'Maximum 1 link button allowed',
383
+ maxPhoneButtons: 'Maximum 1 phone button allowed',
384
+ maxUnsubscribeButtons: 'Maximum 1 unsubscribe button allowed',
385
+ maxQuickReplyButtons: 'Maximum 3 quick reply buttons allowed',
386
+ phoneRequired: 'Phone number is required for phone button',
387
+ phoneInvalid: 'Invalid phone number format. Use international format (e.g., +1234567890)',
388
+ urlRequired: 'Url is required for link button',
389
+ urlInvalid: 'Invalid url format. Use https:// or http:// at the beginning.',
390
+ emailInvalid: "Invalid email format. Use email format (e.g., example{'@'}example.com)",
391
+ emailRequired: 'Please enter a valid email address',
392
+ nameRequired: 'Name is required',
393
+ messageRequired: 'English message is required',
394
+ headerTooLong: 'Header text exceeds 60 characters',
395
+ headerMediaRequired: 'Header media file is required',
396
+ bodyTooLong: 'Body text exceeds 1024 characters',
397
+ footerTooLong: 'Footer text exceeds 60 characters',
398
+ buttonTextTooLong: 'Button text exceeds 20 characters',
399
+ textTooLong: 'Text exceeds maximum length',
400
+ // Email validation errors
401
+ subjectRequired: 'Email subject is required',
402
+ atLeastOneBlockRequired: 'At least one content block is required',
403
+ spacerHeightInvalid: 'Spacer height must be between 8 and 200 pixels',
404
+ dividerThicknessInvalid: 'Divider thickness must be between 1 and 20 pixels',
405
+ dividerWidthInvalid: 'Divider width must be between 10% and 100%',
406
+ headingFontSizeInvalid: 'Heading font size must be between 16 and 48 pixels',
407
+ paragraphFontSizeInvalid: 'Paragraph font size must be between 10 and 32 pixels',
408
+ imageWidthInvalid: 'Image width must be between 50 and 600 pixels',
409
+ buttonFontSizeInvalid: 'Button font size must be between 12 and 32 pixels',
410
+ discountFontSizeInvalid: 'Discount font size must be between 12 and 48 pixels',
411
+ unsubscribeBlockMissing: 'An unsubscribe link block is required',
412
+ unsubscribeLinkRequired: 'Unsubscribe block must contain the unsubscribe dynamic value',
413
+ imageSourceRequired: 'Image block requires an image',
414
+ headerLogoRequired: 'Header block requires a logo',
415
+ socialsNoEnabled: 'At least one social link must be enabled',
416
+ socialsUrlRequired: 'Enabled social links must have a URL or a brand default',
417
+ topProductsStoreIdRequired: 'Top products block requires a store ID',
418
+ buttonTextRequired: 'Button text is required',
419
+ gridColumnEmpty: 'Grid column cannot be empty',
420
+ htmlMaxLength: 'HTML block exceeds maximum character limit',
421
+ },
422
+ },
423
+ whatsapp: {
424
+ header: {
425
+ title: 'Header',
426
+
427
+ type_placeholder: 'Select type',
428
+ types: {
429
+ none: 'None',
430
+ text: 'Text',
431
+ video: 'Video',
432
+ document: 'Document',
433
+ image: 'Image',
434
+ },
435
+ },
436
+ body: {
437
+ title: 'Body',
438
+ description_main:
439
+ 'It is the <b>main part of the message</b>, the content you want to communicate to the customer. You can include in the text:',
440
+ description_link:
441
+ '<b>links</b> by pasting the full url directly. To make them clickable, make sure to include https:// or http:// at the beginning. Avoid shortened links (e.g. bit.ly, tinyurl) as they might look like spam and cause the message to be rejected.',
442
+ description_dynamic_values:
443
+ '<b>Dynamic values</b>, with no limit on how many you use. If you end a sentence with a dynamic value, make sure to add a period at the end.',
444
+ },
445
+ footer: {
446
+ title: 'Footer (optional)',
447
+ description_main:
448
+ "It's meant to provide <b>context and support</b> without interfering with the main message.",
449
+ placeholder: 'Footer',
450
+ },
451
+ buttons: {
452
+ title: 'Buttons (optional)',
453
+ description_main:
454
+ 'Some guidelines <b>to ensure your message gets approved</b> and works properly:',
455
+ description_unsubscribe:
456
+ "<b>Unsubscribe</b> button lets users opt out of receiving future messages from your business. It's strongly recommended for marketing messages.",
457
+ description_phone:
458
+ '<b>Phone</b> button allows users to start a phone call from their device with a single tap. Only one button is allowed per message',
459
+ description_link:
460
+ '<b>Link</b> button lets users open an external link directly from the chat interface. You can include up to two link buttons per message',
461
+ description_quick_reply:
462
+ '<b>Quick reply</b> button lets users choose between one or more predefined options without having to type text, making the conversation more fluid and guided.',
463
+ add_button: 'Add',
464
+ button_types: {
465
+ phone: 'Phone',
466
+ unsubscribe: 'Unsubscribe',
467
+ link: 'Link',
468
+ quick_reply: 'Quick reply',
469
+ },
470
+ placeholders: {
471
+ text: 'Button text',
472
+ phone: 'Phone number',
473
+ url: 'Url',
474
+ },
475
+ default_text: {
476
+ phone: 'Call us',
477
+ link: '',
478
+ unsubscribe: 'Unsubscribe',
479
+ },
480
+ },
481
+ translations: {
482
+ placeholder: 'Add translation',
483
+ },
484
+ translator: {
485
+ header: 'Header',
486
+ body: 'Body',
487
+ footer: 'Footer',
488
+ button: 'Button',
489
+ reset_to_main: 'Reset to main language',
490
+ },
491
+ preview: {
492
+ header_image_alt: 'Header image',
493
+ document_link: 'Document',
494
+ },
495
+ },
496
+ languages: {
497
+ title: 'Language',
498
+ add: 'Add new',
499
+ recommended: 'Recommended languages',
500
+ all_languages: 'All languages',
501
+ },
502
+ email: {
503
+ common: {
504
+ reset: 'Reset',
505
+ },
506
+ canvas: {
507
+ title: 'Email canvas',
508
+ empty: 'No blocks yet',
509
+ emptyHint: 'Drag blocks from the library to start building your email',
510
+ blockNotImplemented: 'Block type "{type}" not yet implemented',
511
+ dropHere: 'Drop blocks here to add them to your email',
512
+ },
513
+ sidebar: {
514
+ elementsTab: 'Elements',
515
+ generalStyleTab: 'General style',
516
+ library: 'Block library',
517
+ settings: 'Block settings',
518
+ backToLibrary: 'Back to library',
519
+ settingsPlaceholder: 'Select a block to edit its settings',
520
+ settingsNotAvailable: 'Settings not available for block type: {type}',
521
+ },
522
+ generalStyle: {
523
+ instruction: 'Customize page elements',
524
+ brandSection: 'Brand',
525
+ selectBrand: 'Select a brand',
526
+ fromColorList: 'From color list',
527
+ typographySection: 'Typography',
528
+ font: 'Font',
529
+ colorsSection: 'Colors',
530
+ textColor: 'Text',
531
+ backgroundColor: 'Background',
532
+ bodyColor: 'Body',
533
+ spacingSection: 'Spacing',
534
+ verticalSpacing: 'Vertical',
535
+ horizontalSpacing: 'Horizontal',
536
+ reset: 'Reset all to defaults',
537
+ },
538
+ blockLibrary: {
539
+ description: 'Drag and combine elements to create content and customize your email.',
540
+ },
541
+ blocks: {
542
+ text_types: {
543
+ p: 'Paragraph',
544
+ h1: 'Heading 1',
545
+ h2: 'Heading 2',
546
+ h3: 'Heading 3',
547
+ h4: 'Heading 4',
548
+ h5: 'Heading 5',
549
+ h6: 'Heading 6',
550
+ },
551
+ spacer: {
552
+ name: 'Spacer',
553
+ description: 'Add vertical spacing between blocks',
554
+ label: '{height}px spacer',
555
+ settings: {
556
+ size: 'Size',
557
+ customSize: 'Custom Size',
558
+ height: 'Height',
559
+ heightHint: 'Height between {min}px and {max}px',
560
+ backgroundColor: 'Color',
561
+ sizePresets: {
562
+ small: 'Small',
563
+ medium: 'Medium',
564
+ large: 'Large',
565
+ extra_large: 'Extra Large',
566
+ },
567
+ },
568
+ },
569
+ divider: {
570
+ name: 'Divider',
571
+ description: 'Add a horizontal line to separate content',
572
+ settings: {
573
+ style: 'Style',
574
+ thickness: 'Thickness',
575
+ thicknessHint: 'Thickness between {min}px and {max}px',
576
+ width: 'Width',
577
+ widthHint: 'Width as percentage (10-100%)',
578
+ color: 'Color',
579
+ backgroundColor: 'Background color',
580
+ },
581
+ },
582
+ paragraph: {
583
+ name: 'Paragraph',
584
+ description: 'Add rich text content with formatting',
585
+ settings: {
586
+ type: 'Type',
587
+ fontFamily: 'Font family',
588
+ fontSize: 'Font size',
589
+ fontSizeHint: 'Font size between {min}px and {max}px',
590
+ textColor: 'Text color',
591
+ backgroundColor: 'Background color',
592
+ },
593
+ },
594
+ heading: {
595
+ name: 'Heading',
596
+ description: 'Title and section headers',
597
+ settings: {
598
+ content: 'Content',
599
+ textStyle: 'Text style',
600
+ type: 'Type',
601
+ font: 'Font',
602
+ size: 'Size',
603
+ alignment: 'Alignment',
604
+ color: 'Color',
605
+ text: 'Text',
606
+ backgroundBlock: 'Background block',
607
+ },
608
+ types: {
609
+ heading_1: 'Heading 1',
610
+ heading_2: 'Heading 2',
611
+ heading_3: 'Heading 3',
612
+ heading_4: 'Heading 4',
613
+ heading_5: 'Heading 5',
614
+ heading_6: 'Heading 6',
615
+ },
616
+ },
617
+ raw_html: {
618
+ name: 'Html',
619
+ description: 'Custom HTML code',
620
+ placeholder: 'Insert html code',
621
+ settings: {
622
+ html: 'Html content',
623
+ characterCount: '{count} / {max} characters',
624
+ },
625
+ warning: {
626
+ title: 'Note:',
627
+ message:
628
+ "Most email clients only support basic html. Interactive elements like javascript or flash won't be saved.",
629
+ learnMore: 'Learn more about HTML in content blocks',
630
+ },
631
+ },
632
+ image: {
633
+ name: 'Image',
634
+ description: 'Add photos and graphics',
635
+ no_image: 'No image selected',
636
+ upload: 'Upload',
637
+ select_from_library: 'Select from library',
638
+ select_image: 'Select an image',
639
+ no_images: 'No images available',
640
+ alt_placeholder: 'Describe the image...',
641
+ alt_help: 'Alternative text improves accessibility',
642
+ href_help: 'Optional link when image is clicked',
643
+ settings: {
644
+ source: 'Image source',
645
+ alt: 'Alt text',
646
+ size_layout: 'Size & layout',
647
+ width_mode: 'Width mode',
648
+ width: 'Width',
649
+ align: 'Alignment',
650
+ border_radius: 'Border radius',
651
+ link: 'Link',
652
+ href_placeholder: 'https://example.com',
653
+ padding: 'Padding',
654
+ padding_top: 'Top',
655
+ padding_right: 'Right',
656
+ padding_bottom: 'Bottom',
657
+ padding_left: 'Left',
658
+ },
659
+ },
660
+ button: {
661
+ name: 'Button',
662
+ description: 'Call-to-action button',
663
+ placeholder: 'Add text button',
664
+ settings: {
665
+ content: 'Content',
666
+ link_type: 'Link type',
667
+ text_type: 'Text type',
668
+ font: 'Font',
669
+ size: 'Size',
670
+ style: 'Style',
671
+ colors: 'Colors',
672
+ text: 'Text',
673
+ background: 'Background',
674
+ background_block: 'Background block',
675
+ },
676
+ link_types: {
677
+ web: 'Web',
678
+ email: 'Email',
679
+ phone: 'Phone',
680
+ },
681
+ shapes: {
682
+ square: 'Square',
683
+ rounded: 'Rounded',
684
+ pill: 'Pill',
685
+ },
686
+ widths: {
687
+ fit_to_text: 'Fit to text',
688
+ full_width: 'Full width',
689
+ },
690
+ },
691
+ discount: {
692
+ name: 'Discount code',
693
+ description: 'Promo code display',
694
+ placeholder: 'Add your discount code',
695
+ settings: {
696
+ discount_code: 'Discount code',
697
+ text_type: 'Text type',
698
+ type: 'Type',
699
+ font: 'Font',
700
+ size: 'Size',
701
+ style: 'Style',
702
+ colors: 'Colors',
703
+ text: 'Text',
704
+ background_component: 'Background component',
705
+ background_block: 'Background block',
706
+ },
707
+ styles: {
708
+ square: 'Square',
709
+ rounded: 'Rounded',
710
+ pill: 'Pill',
711
+ },
712
+ },
713
+ grid: {
714
+ name: 'Grid',
715
+ description: 'Multi-column layout',
716
+ add_element: 'Add element',
717
+ settings: {
718
+ columns: 'Columns',
719
+ color: 'Color',
720
+ background_block: 'Background block',
721
+ },
722
+ },
723
+ header: {
724
+ name: 'Header',
725
+ description: 'Add your property logo',
726
+ no_logo: 'No logo selected',
727
+ settings: {
728
+ source: 'Logo',
729
+ alt: 'Alt text',
730
+ alt_placeholder: 'Describe the logo...',
731
+ style: 'Style',
732
+ width: 'Logo width',
733
+ alignment: 'Alignment',
734
+ background: 'Background color',
735
+ reset: 'Reset to default',
736
+ },
737
+ },
738
+ footer: {
739
+ name: 'Footer',
740
+ description: 'Legal & contact info',
741
+ },
742
+ unsubscribe_link: {
743
+ name: 'Unsubscribe link',
744
+ description: 'Opt-out link for recipients',
745
+ },
746
+ socials: {
747
+ name: 'Socials',
748
+ description: 'Social media links',
749
+ placeholder: 'Configure social links in settings',
750
+ settings: {
751
+ links: 'Social links',
752
+ from_brand: 'Using {url} from brand',
753
+ },
754
+ platforms: {
755
+ facebook: 'Facebook',
756
+ instagram: 'Instagram',
757
+ tripadvisor: 'Tripadvisor',
758
+ tiktok: 'Tiktok',
759
+ google: 'Google',
760
+ },
761
+ },
762
+ top_products: {
763
+ name: 'Top Products',
764
+ description: 'Display upselling products from the API',
765
+ no_store_id: 'Set a store ID to display products',
766
+ settings: {
767
+ store_id: 'Store ID',
768
+ store_id_help:
769
+ 'Your Smartconnect store ID, the part after commerce.smartness.com/ (e.g. abhotel)',
770
+ store_id_placeholder: 'Enter store ID',
771
+ style: 'Style',
772
+ max_products: 'Max products',
773
+ background: 'Background color',
774
+ },
775
+ },
776
+ },
777
+ actions: {
778
+ duplicate: 'Duplicate',
779
+ delete: 'Delete',
780
+ },
781
+ },
782
+ },
783
+ translation_action_bar: {
784
+ search_placeholder: 'Search text...',
785
+ show_missing: 'Show missing translations',
786
+ show_changes: 'Show changes',
787
+ auto_translate: 'Auto translate',
788
+ auto_translate_button: 'Auto translate',
789
+ preview: 'Preview',
790
+ preview_button: 'Preview',
791
+ translating: 'Translating...',
792
+ translation_success: 'Translation completed successfully',
793
+ translation_error: 'Failed to translate. Please try again.',
794
+ no_sections_found: 'No sections match the current filters',
795
+ clear_filters: 'Clear filters',
796
+ email_preview_coming_soon: 'Email preview coming soon',
797
+ unsupported_preview_type: 'Unsupported preview type',
798
+ render_type: 'Render type',
799
+ no_message_to_preview: 'No message to preview',
800
+ },
801
+ language_list: {
802
+ unsaved_changes: 'This translation has unsaved changes',
803
+ changes_count: '{count} changes',
804
+ change: 'change',
805
+ changes: 'changes',
806
+ translated_percentage: '{percentage}% translated',
807
+ },
808
+ meta_submission: {
809
+ success: 'Messages submitted to Meta',
810
+ error: 'Meta submission completed with errors',
811
+ failed_count: 'Failed messages: {count}',
812
+ },
813
+ email_preview: {
814
+ no_preview: 'No preview available',
815
+ subject: 'Subject',
816
+ },
817
+ public: {
818
+ select_message: {
819
+ choose_message: 'Choose a message...',
820
+ search_placeholder: 'Search by name or category...',
821
+ choose_language: 'Choose a language...',
822
+ enter_field: 'Enter {field}',
823
+ send_message: 'Send message',
824
+ },
825
+ },
826
+ } as const