Skip to content

Commit 2625067

Browse files
author
Deathgiver
committed
feat(dynamic-images): add dynamic image template feature
Lets workspaces create image templates (text, image, and QR code layers) that render personalized images per-contact via a public URL, so flows and broadcasts can send dynamically generated images.
1 parent 9702b69 commit 2625067

87 files changed

Lines changed: 42259 additions & 13 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/builder/messages/ar.json

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,9 @@
870870
"qrCode": {
871871
"label": "رمز QR"
872872
},
873+
"dynamicImage": {
874+
"label": "صورة ديناميكية"
875+
},
873876
"savePayloadToCustomField": {
874877
"label": "حفظ الحمولة في حقل مخصص"
875878
},
@@ -2054,6 +2057,9 @@
20542057
"label": "الأحداث",
20552058
"placeholder": "اكتب اسم حدث واضغط Enter",
20562059
"description": "أضف اسم حدث واحدًا أو أكثر. عندما يربط n8n خطاف ويب بأحد هذه الأحداث، تُرسل إليه البيانات عند تشغيل هذه الخطوة."
2060+
},
2061+
"enabled": {
2062+
"label": "مفعّل"
20572063
}
20582064
},
20592065
"flows": {
@@ -3533,6 +3539,67 @@
35333539
"title": "رموز QR",
35343540
"description": "أنشئ رموز QR مرتبطة بمسارات البوت."
35353541
},
3542+
"dynamicImages": {
3543+
"title": "الصور الديناميكية",
3544+
"description": "أنشئ صورًا مخصصة لكل جهة اتصال من خلفية وطبقات نص/صورة/رمز QR.",
3545+
"publicUrl": {
3546+
"label": "الرابط العام",
3547+
"hint": "انسخ الرابط والصقه في المسار أو البث أو التسلسل الخاص بك لإرسال صور مخصصة."
3548+
},
3549+
"editor": {
3550+
"addElement": "إضافة عنصر",
3551+
"addImage": "إضافة صورة",
3552+
"addText": "إضافة نص",
3553+
"addQrCode": "إضافة رمز QR",
3554+
"template": "قالب",
3555+
"templateDialogTitle": "اختر قالبًا",
3556+
"templateDialogDescription": "اختيار قالب سيستبدل جميع الطبقات الحالية.",
3557+
"layers": "الطبقات",
3558+
"noLayers": "لا توجد طبقات بعد. أضف عنصرًا للبدء.",
3559+
"deleteLayer": "حذف الطبقة",
3560+
"layerNameImage": "صورة",
3561+
"layerNameText": "نص",
3562+
"layerNameQrCode": "رمز QR",
3563+
"editElement": "تعديل العنصر",
3564+
"selectElementHint": "حدد عنصرًا في اللوحة لتعديل خصائصه.",
3565+
"width": "العرض",
3566+
"height": "الارتفاع",
3567+
"priority": "الأولوية",
3568+
"imageType": "نوع الصورة",
3569+
"imageTypeUrl": "رابط الصورة",
3570+
"imageTypeAvatarUser": "صورة جهة الاتصال",
3571+
"imageTypeCustomField": "حقل مخصص",
3572+
"imageUrl": "رابط الصورة",
3573+
"uploadImage": "رفع صورة",
3574+
"customField": "حقل مخصص",
3575+
"imageStyle": "نمط الصورة",
3576+
"imageStyleSquare": "مربع",
3577+
"imageStyleCircle": "دائري",
3578+
"qrText": "محتوى رمز QR",
3579+
"qrSize": "الحجم",
3580+
"qrColor": "اللون",
3581+
"qrLogo": "الشعار",
3582+
"uploadLogo": "رفع شعار",
3583+
"textContent": "محتوى النص",
3584+
"fontSize": "حجم الخط",
3585+
"fontFamily": "نوع الخط",
3586+
"fontFamilyArial": "Arial",
3587+
"fontFamilySerif": "Serif",
3588+
"fontFamilyRoboto": "Roboto",
3589+
"fontFamilyGreatVibes": "Great Vibes",
3590+
"align": "المحاذاة",
3591+
"alignLeft": "يسار",
3592+
"alignCenter": "وسط",
3593+
"alignRight": "يمين",
3594+
"color": "اللون",
3595+
"bold": "غامق",
3596+
"italic": "مائل",
3597+
"uppercase": "أحرف كبيرة"
3598+
},
3599+
"preview": {
3600+
"error": "فشل تحميل الصورة الديناميكية المرتبطة. ربما تم حذفها."
3601+
}
3602+
},
35363603
"magicLinks": {
35373604
"title": "الروابط السحرية",
35383605
"description": "أنشئ روابط عميقة تعيد التوجيه إلى عنوان URL الخاص بك مع معاملات الاستعلام."

apps/builder/messages/da.json

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,9 @@
796796
"qrCode": {
797797
"label": "QR Kode"
798798
},
799+
"dynamicImage": {
800+
"label": "Dynamisk billede"
801+
},
799802
"savePayloadToCustomField": {
800803
"label": "Gem payload til brugerdefineret felt"
801804
},
@@ -1980,6 +1983,9 @@
19801983
"label": "Hændelser",
19811984
"placeholder": "Skriv et hændelsenavn og tryk på Enter",
19821985
"description": "Tilføj et eller flere hændelsenavne. Når n8n tilføjer et webhook for en af disse hændelser, sendes data til det, når dette trin køres."
1986+
},
1987+
"enabled": {
1988+
"label": "Aktiveret"
19831989
}
19841990
},
19851991
"flows": {
@@ -3533,6 +3539,67 @@
35333539
"title": "QR-koder",
35343540
"description": "Opret QR codes at link til din chatbot flows."
35353541
},
3542+
"dynamicImages": {
3543+
"title": "Dynamiske billeder",
3544+
"description": "Generer personaliserede billeder pr. kontakt fra en baggrund og tekst-/billede-/QR-lag.",
3545+
"publicUrl": {
3546+
"label": "Offentlig URL",
3547+
"hint": "Kopiér og indsæt URL'en i dit flow, din udsendelse eller sekvens for at sende personaliserede billeder."
3548+
},
3549+
"editor": {
3550+
"addElement": "Tilføj element",
3551+
"addImage": "Tilføj billede",
3552+
"addText": "Tilføj tekst",
3553+
"addQrCode": "Tilføj QR-kode",
3554+
"template": "Skabelon",
3555+
"templateDialogTitle": "Vælg en skabelon",
3556+
"templateDialogDescription": "Valg af en skabelon udskifter alle nuværende lag.",
3557+
"layers": "Lag",
3558+
"noLayers": "Ingen lag endnu. Tilføj et element for at komme i gang.",
3559+
"deleteLayer": "Slet lag",
3560+
"layerNameImage": "Billede",
3561+
"layerNameText": "Tekst",
3562+
"layerNameQrCode": "QR-kode",
3563+
"editElement": "Rediger element",
3564+
"selectElementHint": "Vælg et element på canvasset for at redigere dets egenskaber.",
3565+
"width": "Bredde",
3566+
"height": "Højde",
3567+
"priority": "Prioritet",
3568+
"imageType": "Billedtype",
3569+
"imageTypeUrl": "Billed-URL",
3570+
"imageTypeAvatarUser": "Kontaktens profilbillede",
3571+
"imageTypeCustomField": "Brugerdefineret felt",
3572+
"imageUrl": "Billed-URL",
3573+
"uploadImage": "Upload billede",
3574+
"customField": "Brugerdefineret felt",
3575+
"imageStyle": "Billedstil",
3576+
"imageStyleSquare": "Kvadratisk",
3577+
"imageStyleCircle": "Cirkel",
3578+
"qrText": "QR-kodeindhold",
3579+
"qrSize": "Størrelse",
3580+
"qrColor": "Farve",
3581+
"qrLogo": "Logo",
3582+
"uploadLogo": "Upload logo",
3583+
"textContent": "Tekstindhold",
3584+
"fontSize": "Skriftstørrelse",
3585+
"fontFamily": "Skrifttype",
3586+
"fontFamilyArial": "Arial",
3587+
"fontFamilySerif": "Serif",
3588+
"fontFamilyRoboto": "Roboto",
3589+
"fontFamilyGreatVibes": "Great Vibes",
3590+
"align": "Justering",
3591+
"alignLeft": "Venstre",
3592+
"alignCenter": "Centreret",
3593+
"alignRight": "Højre",
3594+
"color": "Farve",
3595+
"bold": "Fed",
3596+
"italic": "Kursiv",
3597+
"uppercase": "Store bogstaver"
3598+
},
3599+
"preview": {
3600+
"error": "Kunne ikke indlæse det tilknyttede dynamiske billede. Det er muligvis blevet slettet."
3601+
}
3602+
},
35363603
"magicLinks": {
35373604
"title": "Magic Links",
35383605
"description": "Opret deep links at redirect til din URL med query parameters."

apps/builder/messages/de.json

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,9 @@
796796
"qrCode": {
797797
"label": "QR-Code"
798798
},
799+
"dynamicImage": {
800+
"label": "Dynamisches Bild"
801+
},
799802
"savePayloadToCustomField": {
800803
"label": "Nutzdaten in benutzerdefiniertem Feld speichern"
801804
},
@@ -1980,6 +1983,9 @@
19801983
"label": "Ereignisse",
19811984
"placeholder": "Ereignisnamen eingeben und Enter drücken",
19821985
"description": "Fügen Sie einen oder mehrere Ereignisnamen hinzu. Wenn n8n einen Webhook mit einem dieser Ereignisse verknüpft, werden beim Ausführen dieses Schritts Daten an ihn gesendet."
1986+
},
1987+
"enabled": {
1988+
"label": "Aktiviert"
19831989
}
19841990
},
19851991
"flows": {
@@ -3533,6 +3539,67 @@
35333539
"title": "QR-Codes",
35343540
"description": "Erstellen Sie QR-Codes, die auf Ihre Chatbot-Flows verweisen."
35353541
},
3542+
"dynamicImages": {
3543+
"title": "Dynamische Bilder",
3544+
"description": "Generieren Sie personalisierte Bilder pro Kontakt aus einem Hintergrund und Text-/Bild-/QR-Ebenen.",
3545+
"publicUrl": {
3546+
"label": "Öffentliche URL",
3547+
"hint": "Kopieren Sie die URL und fügen Sie sie in Ihren Flow, Broadcast oder Ihre Sequenz ein, um personalisierte Bilder zu senden."
3548+
},
3549+
"editor": {
3550+
"addElement": "Element hinzufügen",
3551+
"addImage": "Bild hinzufügen",
3552+
"addText": "Text hinzufügen",
3553+
"addQrCode": "QR-Code hinzufügen",
3554+
"template": "Vorlage",
3555+
"templateDialogTitle": "Vorlage auswählen",
3556+
"templateDialogDescription": "Die Auswahl einer Vorlage ersetzt alle aktuellen Ebenen.",
3557+
"layers": "Ebenen",
3558+
"noLayers": "Noch keine Ebenen. Fügen Sie ein Element hinzu, um zu beginnen.",
3559+
"deleteLayer": "Ebene löschen",
3560+
"layerNameImage": "Bild",
3561+
"layerNameText": "Text",
3562+
"layerNameQrCode": "QR-Code",
3563+
"editElement": "Element bearbeiten",
3564+
"selectElementHint": "Wählen Sie ein Element auf der Zeichenfläche aus, um seine Eigenschaften zu bearbeiten.",
3565+
"width": "Breite",
3566+
"height": "Höhe",
3567+
"priority": "Priorität",
3568+
"imageType": "Bildtyp",
3569+
"imageTypeUrl": "Bild-URL",
3570+
"imageTypeAvatarUser": "Kontakt-Avatar",
3571+
"imageTypeCustomField": "Benutzerdefiniertes Feld",
3572+
"imageUrl": "Bild-URL",
3573+
"uploadImage": "Bild hochladen",
3574+
"customField": "Benutzerdefiniertes Feld",
3575+
"imageStyle": "Bildstil",
3576+
"imageStyleSquare": "Quadratisch",
3577+
"imageStyleCircle": "Kreis",
3578+
"qrText": "QR-Code-Inhalt",
3579+
"qrSize": "Größe",
3580+
"qrColor": "Farbe",
3581+
"qrLogo": "Logo",
3582+
"uploadLogo": "Logo hochladen",
3583+
"textContent": "Textinhalt",
3584+
"fontSize": "Schriftgröße",
3585+
"fontFamily": "Schriftart",
3586+
"fontFamilyArial": "Arial",
3587+
"fontFamilySerif": "Serif",
3588+
"fontFamilyRoboto": "Roboto",
3589+
"fontFamilyGreatVibes": "Great Vibes",
3590+
"align": "Ausrichtung",
3591+
"alignLeft": "Links",
3592+
"alignCenter": "Zentriert",
3593+
"alignRight": "Rechts",
3594+
"color": "Farbe",
3595+
"bold": "Fett",
3596+
"italic": "Kursiv",
3597+
"uppercase": "Großbuchstaben"
3598+
},
3599+
"preview": {
3600+
"error": "Das verknüpfte dynamische Bild konnte nicht geladen werden. Es wurde möglicherweise gelöscht."
3601+
}
3602+
},
35363603
"magicLinks": {
35373604
"title": "Magic Links",
35383605
"description": "Erstellen Sie Deep Links, die mit Query-Parametern zu Ihrer URL weiterleiten."

apps/builder/messages/en.json

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,9 @@
870870
"qrCode": {
871871
"label": "QR Code"
872872
},
873+
"dynamicImage": {
874+
"label": "Dynamic Image"
875+
},
873876
"savePayloadToCustomField": {
874877
"label": "Save payload to custom field"
875878
},
@@ -2054,6 +2057,9 @@
20542057
"label": "Events",
20552058
"placeholder": "Type an event name and press Enter",
20562059
"description": "Add one or more event names. When n8n attaches a webhook for one of these events, data is sent to it when this step runs."
2060+
},
2061+
"enabled": {
2062+
"label": "Enabled"
20572063
}
20582064
},
20592065
"metaConversions": {
@@ -3629,6 +3635,67 @@
36293635
"title": "QR Codes",
36303636
"description": "Create QR codes that link to your chatbot flows."
36313637
},
3638+
"dynamicImages": {
3639+
"title": "Dynamic Images",
3640+
"description": "Generate personalized images per contact from a background and text/image/QR layers.",
3641+
"publicUrl": {
3642+
"label": "Public URL",
3643+
"hint": "Copy and paste the URL into your flow, broadcast, or sequence to send personalized images."
3644+
},
3645+
"editor": {
3646+
"addElement": "Add element",
3647+
"addImage": "Add image",
3648+
"addText": "Add text",
3649+
"addQrCode": "Add QR code",
3650+
"template": "Template",
3651+
"templateDialogTitle": "Choose a template",
3652+
"templateDialogDescription": "Selecting a template replaces all current layers.",
3653+
"layers": "Layers",
3654+
"noLayers": "No layers yet. Add an element to get started.",
3655+
"deleteLayer": "Delete layer",
3656+
"layerNameImage": "Image",
3657+
"layerNameText": "Text",
3658+
"layerNameQrCode": "QR code",
3659+
"editElement": "Edit element",
3660+
"selectElementHint": "Select an element on the canvas to edit its properties.",
3661+
"width": "Width",
3662+
"height": "Height",
3663+
"priority": "Priority",
3664+
"imageType": "Image type",
3665+
"imageTypeUrl": "Image URL",
3666+
"imageTypeAvatarUser": "Contact avatar",
3667+
"imageTypeCustomField": "Custom field",
3668+
"imageUrl": "Image URL",
3669+
"uploadImage": "Upload image",
3670+
"customField": "Custom field",
3671+
"imageStyle": "Image style",
3672+
"imageStyleSquare": "Square",
3673+
"imageStyleCircle": "Circle",
3674+
"qrText": "QR code content",
3675+
"qrSize": "Size",
3676+
"qrColor": "Color",
3677+
"qrLogo": "Logo",
3678+
"uploadLogo": "Upload logo",
3679+
"textContent": "Text content",
3680+
"fontSize": "Font size",
3681+
"fontFamily": "Font family",
3682+
"fontFamilyArial": "Arial",
3683+
"fontFamilySerif": "Serif",
3684+
"fontFamilyRoboto": "Roboto",
3685+
"fontFamilyGreatVibes": "Great Vibes",
3686+
"align": "Alignment",
3687+
"alignLeft": "Left",
3688+
"alignCenter": "Center",
3689+
"alignRight": "Right",
3690+
"color": "Color",
3691+
"bold": "Bold",
3692+
"italic": "Italic",
3693+
"uppercase": "Uppercase"
3694+
},
3695+
"preview": {
3696+
"error": "Failed to load the linked dynamic image. It may have been deleted."
3697+
}
3698+
},
36323699
"magicLinks": {
36333700
"title": "Magic Links",
36343701
"description": "Create deep links that redirect to your URL with query parameters."

0 commit comments

Comments
 (0)