diff --git a/apps/web/i18n.lock b/apps/web/i18n.lock
index 431aed6999..a3fde64a9a 100644
--- a/apps/web/i18n.lock
+++ b/apps/web/i18n.lock
@@ -570,6 +570,7 @@ checksums:
environments/connect/insert_this_code_into_the_head_tag_of_your_website: c4bec1089168efe0fa565397bd7cb115
environments/connect/subtitle: d913df50a1c6b7acc283484195f3732a
environments/connect/waiting_for_your_signal: 9b0a62d5b61c04674596643d2f9f5c09
+ environments/contacts/add_attribute: 70f153afc5c400527ffccfb2eec58ae9
environments/contacts/attribute_created_successfully: e9f90d366d817f2f1c81fb819c0e2f05
environments/contacts/attribute_description: e17686a22ffad04cc7bb70524ed4478b
environments/contacts/attribute_description_placeholder: 05af83e4cfc6328476ef9719581e47af
@@ -582,6 +583,8 @@ checksums:
environments/contacts/attribute_label: a5c71bf158481233f8215dbd38cc196b
environments/contacts/attribute_label_placeholder: bf5106cb14d2ec0c21e7d8b4ab1f3a93
environments/contacts/attribute_updated_successfully: 0e64422156c29940cd4dab2f9d1f40b2
+ environments/contacts/attribute_value: 34b0eaa85808b15cbc4be94c64d0146b
+ environments/contacts/attribute_value_placeholder: 90fb17015de807031304d7a650a6cb8c
environments/contacts/contact_deleted_successfully: c5b64a42a50e055f9e27ec49e20e03fa
environments/contacts/contact_not_found: 045396f0b13fafd43612a286263737c0
environments/contacts/contacts_table_refresh: 6a959475991dd4ab28ad881bae569a09
@@ -593,8 +596,11 @@ checksums:
environments/contacts/delete_attribute_confirmation: 01d99b89eb3d27ff468d0db1b4aeb394
environments/contacts/delete_contact_confirmation: 4304d36277daa205b4aa09f5e0d494ab
environments/contacts/delete_contact_confirmation_with_quotas: 7c0e2e223ca55101270ac2988c53e616
- environments/contacts/edit_attribute: a53676332a19e6470239bf5bdff19851
+ environments/contacts/edit_attribute: 92a83c96a5d850e7d39002e8fd5898f4
environments/contacts/edit_attribute_description: 073a3084bb2f3b34ed1320ed1cd6db3c
+ environments/contacts/edit_attribute_values: 44e4e7a661cc1b59200bb07c710072a7
+ environments/contacts/edit_attribute_values_description: 21593dfaf4cad965ffc17685bc005509
+ environments/contacts/edit_attributes_success: 39f93b1a6f1605bc5951f4da5847bb22
environments/contacts/generate_personal_link: 9ac0865f6876d40fe858f94eae781eb8
environments/contacts/generate_personal_link_description: b9dbaf9e2d8362505b7e3cfa40f415a6
environments/contacts/no_published_link_surveys_available: 9c1abc5b21aba827443cdf87dd6c8bfe
diff --git a/apps/web/locales/de-DE.json b/apps/web/locales/de-DE.json
index 5c7ad0f8a2..aa5b96f99a 100644
--- a/apps/web/locales/de-DE.json
+++ b/apps/web/locales/de-DE.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "Warte auf ein Signal von dir..."
},
"contacts": {
+ "add_attribute": "Attribut hinzufügen",
"attribute_created_successfully": "Attribut erfolgreich erstellt",
"attribute_description": "Beschreibung",
"attribute_description_placeholder": "Kurze Beschreibung",
@@ -618,6 +619,8 @@
"attribute_label": "Bezeichnung",
"attribute_label_placeholder": "z. B. Geburtsdatum",
"attribute_updated_successfully": "Attribut erfolgreich aktualisiert",
+ "attribute_value": "Wert",
+ "attribute_value_placeholder": "Attributwert",
"contact_deleted_successfully": "Kontakt erfolgreich gelöscht",
"contact_not_found": "Kein solcher Kontakt gefunden",
"contacts_table_refresh": "Kontakte aktualisieren",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, one {Dies wird alle Umfrageantworten und Kontaktattribute löschen, die mit diesem Kontakt verbunden sind. Jegliche zielgerichtete Kommunikation und Personalisierung basierend auf den Daten dieses Kontakts gehen verloren. Wenn dieser Kontakt Antworten hat, die zu den Umfragequoten zählen, werden die Quotenstände reduziert, aber die Quotenlimits bleiben unverändert.} other {Dies wird alle Umfrageantworten und Kontaktattribute löschen, die mit diesen Kontakten verbunden sind. Jegliche zielgerichtete Kommunikation und Personalisierung basierend auf den Daten dieses Kontakts gehen verloren. Wenn diesen Kontakten Antworten haben, die zu den Umfragequoten zählen, werden die Quotenstände reduziert, aber die Quotenlimits bleiben unverändert.}}",
"edit_attribute": "Attribut bearbeiten",
"edit_attribute_description": "Aktualisieren Sie die Bezeichnung und Beschreibung für dieses Attribut.",
+ "edit_attribute_values": "Attribute bearbeiten",
+ "edit_attribute_values_description": "Ändern Sie die Werte für bestimmte Attribute dieses Kontakts.",
+ "edit_attributes_success": "Kontaktattribute erfolgreich aktualisiert",
"generate_personal_link": "Persönlichen Link generieren",
"generate_personal_link_description": "Wähle eine veröffentlichte Umfrage aus, um einen personalisierten Link für diesen Kontakt zu generieren.",
"no_published_link_surveys_available": "Keine veröffentlichten Link-Umfragen verfügbar. Bitte veröffentliche zuerst eine Link-Umfrage.",
diff --git a/apps/web/locales/en-US.json b/apps/web/locales/en-US.json
index 6db71eb9a6..b34c5526a4 100644
--- a/apps/web/locales/en-US.json
+++ b/apps/web/locales/en-US.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "Waiting for your signal..."
},
"contacts": {
+ "add_attribute": "Add Attribute",
"attribute_created_successfully": "Attribute created successfully",
"attribute_description": "Description",
"attribute_description_placeholder": "Short description",
@@ -618,6 +619,8 @@
"attribute_label": "Label",
"attribute_label_placeholder": "e.g. Date of Birth",
"attribute_updated_successfully": "Attribute updated successfully",
+ "attribute_value": "Value",
+ "attribute_value_placeholder": "Attribute Value",
"contact_deleted_successfully": "Contact deleted successfully",
"contact_not_found": "No such contact found",
"contacts_table_refresh": "Refresh contacts",
@@ -629,8 +632,11 @@
"delete_attribute_confirmation": "{value, plural, one {This will delete the selected attribute. Any contact data associated with this attribute will be lost.} other {This will delete the selected attributes. Any contact data associated with these attributes will be lost.}}",
"delete_contact_confirmation": "This will delete all survey responses and contact attributes associated with this contact. Any targeting and personalization based on this contact's data will be lost.",
"delete_contact_confirmation_with_quotas": "{value, plural, one {This will delete all survey responses and contact attributes associated with this contact. Any targeting and personalization based on this contact's data will be lost. If this contact has responses that count towards survey quotas, the quota counts will be reduced but the quota limits will remain unchanged.} other {This will delete all survey responses and contact attributes associated with these contacts. Any targeting and personalization based on these contacts' data will be lost. If these contacts have responses that count towards survey quotas, the quota counts will be reduced but the quota limits will remain unchanged.}}",
- "edit_attribute": "Edit Attribute",
+ "edit_attribute": "Edit attribute",
"edit_attribute_description": "Update the label and description for this attribute.",
+ "edit_attribute_values": "Edit attributes",
+ "edit_attribute_values_description": "Change the values for specific attributes for this contact.",
+ "edit_attributes_success": "Contact attributes updated successfully",
"generate_personal_link": "Generate Personal Link",
"generate_personal_link_description": "Select a published survey to generate a personalized link for this contact.",
"no_published_link_surveys_available": "No published link surveys available. Please publish a link survey first.",
diff --git a/apps/web/locales/es-ES.json b/apps/web/locales/es-ES.json
index 16a45f4181..2a40291b20 100644
--- a/apps/web/locales/es-ES.json
+++ b/apps/web/locales/es-ES.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "Esperando tu señal..."
},
"contacts": {
+ "add_attribute": "Añadir atributo",
"attribute_created_successfully": "Atributo creado con éxito",
"attribute_description": "Descripción",
"attribute_description_placeholder": "Descripción breve",
@@ -618,6 +619,8 @@
"attribute_label": "Etiqueta",
"attribute_label_placeholder": "p. ej. fecha de nacimiento",
"attribute_updated_successfully": "Atributo actualizado con éxito",
+ "attribute_value": "Valor",
+ "attribute_value_placeholder": "Valor del atributo",
"contact_deleted_successfully": "Contacto eliminado correctamente",
"contact_not_found": "No se ha encontrado dicho contacto",
"contacts_table_refresh": "Actualizar contactos",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, one {Esto eliminará todas las respuestas de encuestas y atributos de contacto asociados con este contacto. Cualquier segmentación y personalización basada en los datos de este contacto se perderá. Si este contacto tiene respuestas que cuentan para las cuotas de encuesta, los recuentos de cuota se reducirán pero los límites de cuota permanecerán sin cambios.} other {Esto eliminará todas las respuestas de encuestas y atributos de contacto asociados con estos contactos. Cualquier segmentación y personalización basada en los datos de estos contactos se perderá. Si estos contactos tienen respuestas que cuentan para las cuotas de encuesta, los recuentos de cuota se reducirán pero los límites de cuota permanecerán sin cambios.}}",
"edit_attribute": "Editar atributo",
"edit_attribute_description": "Actualiza la etiqueta y la descripción de este atributo.",
+ "edit_attribute_values": "Editar atributos",
+ "edit_attribute_values_description": "Cambia los valores de atributos específicos para este contacto.",
+ "edit_attributes_success": "Atributos del contacto actualizados correctamente",
"generate_personal_link": "Generar enlace personal",
"generate_personal_link_description": "Selecciona una encuesta publicada para generar un enlace personalizado para este contacto.",
"no_published_link_surveys_available": "No hay encuestas de enlace publicadas disponibles. Por favor, publica primero una encuesta de enlace.",
diff --git a/apps/web/locales/fr-FR.json b/apps/web/locales/fr-FR.json
index 291f627ef4..cb7ebfdee0 100644
--- a/apps/web/locales/fr-FR.json
+++ b/apps/web/locales/fr-FR.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "En attente de votre signal..."
},
"contacts": {
+ "add_attribute": "Ajouter un attribut",
"attribute_created_successfully": "Attribut créé avec succès",
"attribute_description": "Description",
"attribute_description_placeholder": "Brève description",
@@ -618,6 +619,8 @@
"attribute_label": "Étiquette",
"attribute_label_placeholder": "ex. Date de naissance",
"attribute_updated_successfully": "Attribut mis à jour avec succès",
+ "attribute_value": "Valeur",
+ "attribute_value_placeholder": "Valeur d'attribut",
"contact_deleted_successfully": "Contact supprimé avec succès",
"contact_not_found": "Aucun contact trouvé",
"contacts_table_refresh": "Actualiser les contacts",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, other {Cela supprimera toutes les réponses aux enquêtes et les attributs de contact associés à ce contact. Toute la personnalisation et le ciblage basés sur les données de ce contact seront perdus. Si ce contact a des réponses qui comptent dans les quotas de l'enquête, les comptes de quotas seront réduits mais les limites de quota resteront inchangées.}}",
"edit_attribute": "Modifier l'attribut",
"edit_attribute_description": "Mettez à jour l'étiquette et la description de cet attribut.",
+ "edit_attribute_values": "Modifier les attributs",
+ "edit_attribute_values_description": "Modifiez les valeurs d'attributs spécifiques pour ce contact.",
+ "edit_attributes_success": "Attributs du contact mis à jour avec succès",
"generate_personal_link": "Générer un lien personnel",
"generate_personal_link_description": "Sélectionnez une enquête publiée pour générer un lien personnalisé pour ce contact.",
"no_published_link_surveys_available": "Aucune enquête par lien publiée n'est disponible. Veuillez d'abord publier une enquête par lien.",
diff --git a/apps/web/locales/ja-JP.json b/apps/web/locales/ja-JP.json
index 36bede0d1d..4c568ed411 100644
--- a/apps/web/locales/ja-JP.json
+++ b/apps/web/locales/ja-JP.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "あなたの信号を待っています..."
},
"contacts": {
+ "add_attribute": "属性を追加",
"attribute_created_successfully": "属性を作成しました",
"attribute_description": "説明",
"attribute_description_placeholder": "簡単な説明",
@@ -618,6 +619,8 @@
"attribute_label": "ラベル",
"attribute_label_placeholder": "例: 生年月日",
"attribute_updated_successfully": "属性を更新しました",
+ "attribute_value": "値",
+ "attribute_value_placeholder": "属性値",
"contact_deleted_successfully": "連絡先を正常に削除しました",
"contact_not_found": "そのような連絡先は見つかりません",
"contacts_table_refresh": "連絡先を更新",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, one {これにより この連絡先に関連するすべてのアンケート応答と連絡先属性が削除されます。この連絡先のデータに基づくターゲティングとパーソナライゼーションが失われます。この連絡先がアンケートの割当量を考慮した回答を持っている場合、割当量カウントは減少しますが、割当量の制限は変更されません。} other {これにより これらの連絡先に関連するすべてのアンケート応答と連絡先属性が削除されます。これらの連絡先のデータに基づくターゲティングとパーソナライゼーションが失われます。これらの連絡先がアンケートの割当量を考慮した回答を持っている場合、割当量カウントは減少しますが、割当量の制限は変更されません。}}",
"edit_attribute": "属性を編集",
"edit_attribute_description": "この属性のラベルと説明を更新します。",
+ "edit_attribute_values": "属性を編集",
+ "edit_attribute_values_description": "この連絡先の特定の属性の値を変更します。",
+ "edit_attributes_success": "連絡先属性が正常に更新されました",
"generate_personal_link": "個人リンクを生成",
"generate_personal_link_description": "公開されたフォームを選択して、この連絡先用のパーソナライズされたリンクを生成します。",
"no_published_link_surveys_available": "公開されたリンクフォームはありません。まずリンクフォームを公開してください。",
diff --git a/apps/web/locales/nl-NL.json b/apps/web/locales/nl-NL.json
index 44cb009953..c663dbf4d1 100644
--- a/apps/web/locales/nl-NL.json
+++ b/apps/web/locales/nl-NL.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "Wachten op uw signaal..."
},
"contacts": {
+ "add_attribute": "Attribuut toevoegen",
"attribute_created_successfully": "Attribuut succesvol aangemaakt",
"attribute_description": "Beschrijving",
"attribute_description_placeholder": "Korte beschrijving",
@@ -618,6 +619,8 @@
"attribute_label": "Label",
"attribute_label_placeholder": "bijv. Geboortedatum",
"attribute_updated_successfully": "Attribuut succesvol bijgewerkt",
+ "attribute_value": "Waarde",
+ "attribute_value_placeholder": "Attribuutwaarde",
"contact_deleted_successfully": "Contact succesvol verwijderd",
"contact_not_found": "Er is geen dergelijk contact gevonden",
"contacts_table_refresh": "Vernieuw contacten",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, one {Dit verwijdert alle enquêteresultaten en contactattributen die aan dit contact zijn gekoppeld. Alle targeting en personalisatie op basis van de gegevens van dit contact gaan verloren. Als dit contact reacties heeft die meetellen voor enquêtekvota, worden de quotawaarden verlaagd maar blijven de limieten ongewijzigd.} other {Dit verwijdert alle enquêteresultaten en contactattributen die aan deze contacten zijn gekoppeld. Alle targeting en personalisatie op basis van de gegevens van deze contacten gaan verloren. Als deze contacten reacties hebben die meetellen voor enquêtekvota, worden de quotawaarden verlaagd maar blijven de limieten ongewijzigd.}}",
"edit_attribute": "Attribuut bewerken",
"edit_attribute_description": "Werk het label en de beschrijving voor dit attribuut bij.",
+ "edit_attribute_values": "Attributen bewerken",
+ "edit_attribute_values_description": "Wijzig de waarden voor specifieke attributen voor dit contact.",
+ "edit_attributes_success": "Contactattributen succesvol bijgewerkt",
"generate_personal_link": "Persoonlijke link genereren",
"generate_personal_link_description": "Selecteer een gepubliceerde enquête om een gepersonaliseerde link voor dit contact te genereren.",
"no_published_link_surveys_available": "Geen gepubliceerde link-enquêtes beschikbaar. Publiceer eerst een link-enquête.",
diff --git a/apps/web/locales/pt-BR.json b/apps/web/locales/pt-BR.json
index 4103533f50..e1f9db7c22 100644
--- a/apps/web/locales/pt-BR.json
+++ b/apps/web/locales/pt-BR.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "Esperando seu sinal..."
},
"contacts": {
+ "add_attribute": "Adicionar atributo",
"attribute_created_successfully": "Atributo criado com sucesso",
"attribute_description": "Descrição",
"attribute_description_placeholder": "Descrição curta",
@@ -618,6 +619,8 @@
"attribute_label": "Etiqueta",
"attribute_label_placeholder": "ex: Data de nascimento",
"attribute_updated_successfully": "Atributo atualizado com sucesso",
+ "attribute_value": "Valor",
+ "attribute_value_placeholder": "Valor do atributo",
"contact_deleted_successfully": "Contato excluído com sucesso",
"contact_not_found": "Nenhum contato encontrado",
"contacts_table_refresh": "Atualizar contatos",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, other {Isso irá apagar todas as respostas da pesquisa e atributos de contato associados a este contato. Qualquer direcionamento e personalização baseados nos dados deste contato serão perdidos. Se este contato tiver respostas que contam para cotas da pesquisa, as contagens das cotas serão reduzidas, mas os limites das cotas permanecerão inalterados.}}",
"edit_attribute": "Editar atributo",
"edit_attribute_description": "Atualize a etiqueta e a descrição deste atributo.",
+ "edit_attribute_values": "Editar atributos",
+ "edit_attribute_values_description": "Altere os valores de atributos específicos para este contato.",
+ "edit_attributes_success": "Atributos do contato atualizados com sucesso",
"generate_personal_link": "Gerar link pessoal",
"generate_personal_link_description": "Selecione uma pesquisa publicada para gerar um link personalizado para este contato.",
"no_published_link_surveys_available": "Não há pesquisas de link publicadas disponíveis. Por favor, publique uma pesquisa de link primeiro.",
diff --git a/apps/web/locales/pt-PT.json b/apps/web/locales/pt-PT.json
index aa012e190e..f0ee4274c1 100644
--- a/apps/web/locales/pt-PT.json
+++ b/apps/web/locales/pt-PT.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "À espera do seu sinal..."
},
"contacts": {
+ "add_attribute": "Adicionar atributo",
"attribute_created_successfully": "Atributo criado com sucesso",
"attribute_description": "Descrição",
"attribute_description_placeholder": "Descrição breve",
@@ -618,6 +619,8 @@
"attribute_label": "Etiqueta",
"attribute_label_placeholder": "ex. Data de nascimento",
"attribute_updated_successfully": "Atributo atualizado com sucesso",
+ "attribute_value": "Valor",
+ "attribute_value_placeholder": "Valor do atributo",
"contact_deleted_successfully": "Contacto eliminado com sucesso",
"contact_not_found": "Nenhum contacto encontrado",
"contacts_table_refresh": "Atualizar contactos",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, other {Isto irá eliminar todas as respostas das pesquisas e os atributos de contacto associados a este contacto. Qualquer segmentação e personalização baseados nos dados deste contacto serão perdidos. Se este contacto tiver respostas que contribuam para as quotas das pesquisas, as contagens de quotas serão reduzidas, mas os limites das quotas permanecerão inalterados.}}",
"edit_attribute": "Editar atributo",
"edit_attribute_description": "Atualize a etiqueta e a descrição deste atributo.",
+ "edit_attribute_values": "Editar atributos",
+ "edit_attribute_values_description": "Altere os valores de atributos específicos para este contacto.",
+ "edit_attributes_success": "Atributos do contacto atualizados com sucesso",
"generate_personal_link": "Gerar Link Pessoal",
"generate_personal_link_description": "Selecione um inquérito publicado para gerar um link personalizado para este contacto.",
"no_published_link_surveys_available": "Não existem inquéritos de link publicados disponíveis. Por favor, publique primeiro um inquérito de link.",
diff --git a/apps/web/locales/ro-RO.json b/apps/web/locales/ro-RO.json
index 754ad34641..3b31048417 100644
--- a/apps/web/locales/ro-RO.json
+++ b/apps/web/locales/ro-RO.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "Așteptăm semnalul dumneavoastră..."
},
"contacts": {
+ "add_attribute": "Adaugă atribut",
"attribute_created_successfully": "Atribut creat cu succes",
"attribute_description": "Descriere",
"attribute_description_placeholder": "Descriere scurtă",
@@ -618,6 +619,8 @@
"attribute_label": "Etichetă",
"attribute_label_placeholder": "ex: Data nașterii",
"attribute_updated_successfully": "Atribut actualizat cu succes",
+ "attribute_value": "Valoare",
+ "attribute_value_placeholder": "Valoare atribut",
"contact_deleted_successfully": "Contact șters cu succes",
"contact_not_found": "Nu a fost găsit niciun contact",
"contacts_table_refresh": "Reîmprospătare contacte",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, one {Această acțiune va șterge toate răspunsurile chestionarului și atributele de contact asociate cu acest contact. Orice țintire și personalizare bazată pe datele acestui contact vor fi pierdute. Dacă acest contact are răspunsuri care contează pentru cotele chestionarului, numărul cotelor va fi redus, dar limitele cotelor vor rămâne neschimbate.} other {Aceste acțiuni vor șterge toate răspunsurile chestionarului și atributele de contact asociate cu acești contacți. Orice țintire și personalizare bazată pe datele acestor contacți vor fi pierdute. Dacă acești contacți au răspunsuri care contează pentru cotele chestionarului, numărul cotelor va fi redus, dar limitele cotelor vor rămâne neschimbate.} }",
"edit_attribute": "Editează atributul",
"edit_attribute_description": "Actualizează eticheta și descrierea acestui atribut.",
+ "edit_attribute_values": "Editează atributele",
+ "edit_attribute_values_description": "Modifică valorile anumitor atribute pentru acest contact.",
+ "edit_attributes_success": "Atributele contactului au fost actualizate cu succes",
"generate_personal_link": "Generează link personal",
"generate_personal_link_description": "Selectați un sondaj publicat pentru a genera un link personalizat pentru acest contact.",
"no_published_link_surveys_available": "Nu există sondaje publicate pentru linkuri disponibile. Vă rugăm să publicați mai întâi un sondaj pentru linkuri.",
diff --git a/apps/web/locales/ru-RU.json b/apps/web/locales/ru-RU.json
index cc1fabd0c1..61f2e710e8 100644
--- a/apps/web/locales/ru-RU.json
+++ b/apps/web/locales/ru-RU.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "Ожидание вашего сигнала..."
},
"contacts": {
+ "add_attribute": "Добавить атрибут",
"attribute_created_successfully": "Атрибут успешно создан",
"attribute_description": "Описание",
"attribute_description_placeholder": "Краткое описание",
@@ -618,6 +619,8 @@
"attribute_label": "Метка",
"attribute_label_placeholder": "например, дата рождения",
"attribute_updated_successfully": "Атрибут успешно обновлён",
+ "attribute_value": "Значение",
+ "attribute_value_placeholder": "Значение атрибута",
"contact_deleted_successfully": "Контакт успешно удалён",
"contact_not_found": "Такой контакт не найден",
"contacts_table_refresh": "Обновить контакты",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, one {Это удалит все ответы на опросы и атрибуты контакта, связанные с этим контактом. Любая таргетинг и персонализация на основе данных этого контакта будут потеряны. Если у этого контакта есть ответы, которые учитываются в квотах опроса, количество по квотам будет уменьшено, но лимиты квот останутся без изменений.} few {Это удалит все ответы на опросы и атрибуты контактов, связанные с этими контактами. Любая таргетинг и персонализация на основе данных этих контактов будут потеряны. Если у этих контактов есть ответы, которые учитываются в квотах опроса, количество по квотам будет уменьшено, но лимиты квот останутся без изменений.} many {Это удалит все ответы на опросы и атрибуты контактов, связанные с этими контактами. Любая таргетинг и персонализация на основе данных этих контактов будут потеряны. Если у этих контактов есть ответы, которые учитываются в квотах опроса, количество по квотам будет уменьшено, но лимиты квот останутся без изменений.} other {Это удалит все ответы на опросы и атрибуты контактов, связанные с этими контактами. Любая таргетинг и персонализация на основе данных этих контактов будут потеряны. Если у этих контактов есть ответы, которые учитываются в квотах опроса, количество по квотам будет уменьшено, но лимиты квот останутся без изменений.}}",
"edit_attribute": "Редактировать атрибут",
"edit_attribute_description": "Обновите метку и описание для этого атрибута.",
+ "edit_attribute_values": "Редактировать атрибуты",
+ "edit_attribute_values_description": "Измените значения определённых атрибутов для этого контакта.",
+ "edit_attributes_success": "Атрибуты контакта успешно обновлены",
"generate_personal_link": "Сгенерировать персональную ссылку",
"generate_personal_link_description": "Выберите опубликованный опрос, чтобы сгенерировать персональную ссылку для этого контакта.",
"no_published_link_surveys_available": "Нет доступных опубликованных опросов-ссылок. Пожалуйста, сначала опубликуйте опрос-ссылку.",
diff --git a/apps/web/locales/sv-SE.json b/apps/web/locales/sv-SE.json
index 4773782b47..5af6c2428b 100644
--- a/apps/web/locales/sv-SE.json
+++ b/apps/web/locales/sv-SE.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "Väntar på din signal..."
},
"contacts": {
+ "add_attribute": "Lägg till attribut",
"attribute_created_successfully": "Attributet har skapats",
"attribute_description": "Beskrivning",
"attribute_description_placeholder": "Kort beskrivning",
@@ -618,6 +619,8 @@
"attribute_label": "Etikett",
"attribute_label_placeholder": "t.ex. Födelsedatum",
"attribute_updated_successfully": "Attributet har uppdaterats",
+ "attribute_value": "Värde",
+ "attribute_value_placeholder": "Attributvärde",
"contact_deleted_successfully": "Kontakt borttagen",
"contact_not_found": "Ingen sådan kontakt hittades",
"contacts_table_refresh": "Uppdatera kontakter",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, one {Detta kommer att ta bort alla enkätsvar och kontaktattribut som är kopplade till denna kontakt. All målgruppsinriktning och personalisering baserad på denna kontakts data kommer att gå förlorad. Om denna kontakt har svar som räknas mot enkätkvoter, kommer kvotantalet att minskas men kvotgränserna förblir oförändrade.} other {Detta kommer att ta bort alla enkätsvar och kontaktattribut som är kopplade till dessa kontakter. All målgruppsinriktning och personalisering baserad på dessa kontakters data kommer att gå förlorad. Om dessa kontakter har svar som räknas mot enkätkvoter, kommer kvotantalet att minskas men kvotgränserna förblir oförändrade.}}",
"edit_attribute": "Redigera attribut",
"edit_attribute_description": "Uppdatera etikett och beskrivning för detta attribut.",
+ "edit_attribute_values": "Redigera attribut",
+ "edit_attribute_values_description": "Ändra värdena för specifika attribut för denna kontakt.",
+ "edit_attributes_success": "Kontaktens attribut har uppdaterats",
"generate_personal_link": "Generera personlig länk",
"generate_personal_link_description": "Välj en publicerad enkät för att generera en personlig länk för denna kontakt.",
"no_published_link_surveys_available": "Inga publicerade länkenkäter tillgängliga. Vänligen publicera en länkenkät först.",
diff --git a/apps/web/locales/zh-Hans-CN.json b/apps/web/locales/zh-Hans-CN.json
index 462a5b7ec5..45f6370453 100644
--- a/apps/web/locales/zh-Hans-CN.json
+++ b/apps/web/locales/zh-Hans-CN.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "等待 您的 信号..."
},
"contacts": {
+ "add_attribute": "添加属性",
"attribute_created_successfully": "属性创建成功",
"attribute_description": "描述",
"attribute_description_placeholder": "简短描述",
@@ -618,6 +619,8 @@
"attribute_label": "标签",
"attribute_label_placeholder": "例如:出生日期",
"attribute_updated_successfully": "属性更新成功",
+ "attribute_value": "值",
+ "attribute_value_placeholder": "属性值",
"contact_deleted_successfully": "联系人 删除 成功",
"contact_not_found": "未找到此 联系人",
"contacts_table_refresh": "刷新 联系人",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, one {这将删除与此联系人相关的所有调查回复和联系人属性。基于此联系人数据的任何定位和个性化将丢失。如果此联系人有影响调查配额的回复,配额数量将减少,但配额限制将保持不变。} other {这将删除与这些联系人相关的所有调查回复和联系人属性。基于这些联系人数据的任何定位和个性化将丢失。如果这些联系人有影响调查配额的回复,配额数量将减少,但配额限制将保持不变。}}",
"edit_attribute": "编辑属性",
"edit_attribute_description": "更新此属性的标签和描述。",
+ "edit_attribute_values": "编辑属性",
+ "edit_attribute_values_description": "更改此联系人的特定属性值。",
+ "edit_attributes_success": "联系人属性更新成功",
"generate_personal_link": "生成个人链接",
"generate_personal_link_description": "选择一个已发布的调查,为此联系人生成个性化链接。",
"no_published_link_surveys_available": "没有可用的已发布链接调查。请先发布一个链接调查。",
diff --git a/apps/web/locales/zh-Hant-TW.json b/apps/web/locales/zh-Hant-TW.json
index ba167a0c27..aebedba7bf 100644
--- a/apps/web/locales/zh-Hant-TW.json
+++ b/apps/web/locales/zh-Hant-TW.json
@@ -606,6 +606,7 @@
"waiting_for_your_signal": "正在等待您的訊號..."
},
"contacts": {
+ "add_attribute": "新增屬性",
"attribute_created_successfully": "屬性建立成功",
"attribute_description": "描述",
"attribute_description_placeholder": "簡短描述",
@@ -618,6 +619,8 @@
"attribute_label": "標籤",
"attribute_label_placeholder": "例如:出生日期",
"attribute_updated_successfully": "屬性更新成功",
+ "attribute_value": "值",
+ "attribute_value_placeholder": "屬性值",
"contact_deleted_successfully": "聯絡人已成功刪除",
"contact_not_found": "找不到此聯絡人",
"contacts_table_refresh": "重新整理聯絡人",
@@ -631,6 +634,9 @@
"delete_contact_confirmation_with_quotas": "{value, plural, one {這將刪除與這個 contact 相關的所有調查響應和聯繫人屬性。基於這個 contact 數據的任何定向和個性化功能將會丟失。如果這個 contact 有作為調查配額依據的響應,配額計數將會減少,但配額限制將保持不變。} other {這將刪除與這些 contacts 相關的所有調查響應和聯繫人屬性。基於這些 contacts 數據的任何定向和個性化功能將會丟失。如果這些 contacts 有作為調查配額依據的響應,配額計數將會減少,但配額限制將保持不變。}}",
"edit_attribute": "編輯屬性",
"edit_attribute_description": "更新此屬性的標籤與描述。",
+ "edit_attribute_values": "編輯屬性",
+ "edit_attribute_values_description": "變更此聯絡人特定屬性的值。",
+ "edit_attributes_success": "聯絡人屬性已成功更新",
"generate_personal_link": "產生個人連結",
"generate_personal_link_description": "選擇一個已發佈的問卷,為此聯絡人產生個人化連結。",
"no_published_link_surveys_available": "沒有可用的已發佈連結問卷。請先發佈一個連結問卷。",
diff --git a/apps/web/modules/api/v2/management/contact-attribute-keys/types/contact-attribute-keys.ts b/apps/web/modules/api/v2/management/contact-attribute-keys/types/contact-attribute-keys.ts
index 943938bfd2..a1f26aa806 100644
--- a/apps/web/modules/api/v2/management/contact-attribute-keys/types/contact-attribute-keys.ts
+++ b/apps/web/modules/api/v2/management/contact-attribute-keys/types/contact-attribute-keys.ts
@@ -1,8 +1,8 @@
import { z } from "zod";
import { extendZodWithOpenApi } from "zod-openapi";
import { ZContactAttributeKey } from "@formbricks/database/zod/contact-attribute-keys";
-import { ZGetFilter } from "@/modules/api/v2/types/api-filter";
import { isSafeIdentifier } from "@/lib/utils/safe-identifier";
+import { ZGetFilter } from "@/modules/api/v2/types/api-filter";
extendZodWithOpenApi(z);
diff --git a/apps/web/modules/ee/contacts/[contactId]/components/contact-control-bar.tsx b/apps/web/modules/ee/contacts/[contactId]/components/contact-control-bar.tsx
index d90d7caead..87e3af8157 100644
--- a/apps/web/modules/ee/contacts/[contactId]/components/contact-control-bar.tsx
+++ b/apps/web/modules/ee/contacts/[contactId]/components/contact-control-bar.tsx
@@ -1,12 +1,15 @@
"use client";
-import { LinkIcon, TrashIcon } from "lucide-react";
+import { LinkIcon, PencilIcon, TrashIcon } from "lucide-react";
import { useRouter } from "next/navigation";
import { useState } from "react";
import toast from "react-hot-toast";
import { useTranslation } from "react-i18next";
+import { TContactAttributes } from "@formbricks/types/contact-attribute";
+import { TContactAttributeKey } from "@formbricks/types/contact-attribute-key";
import { getFormattedErrorMessage } from "@/lib/utils/helper";
import { deleteContactAction } from "@/modules/ee/contacts/actions";
+import { EditContactAttributesModal } from "@/modules/ee/contacts/components/edit-contact-attributes-modal";
import { PublishedLinkSurvey } from "@/modules/ee/contacts/lib/surveys";
import { DeleteDialog } from "@/modules/ui/components/delete-dialog";
import { IconBar } from "@/modules/ui/components/iconbar";
@@ -18,6 +21,8 @@ interface ContactControlBarProps {
isReadOnly: boolean;
isQuotasAllowed: boolean;
publishedLinkSurveys: PublishedLinkSurvey[];
+ currentAttributes: TContactAttributes;
+ attributeKeys: TContactAttributeKey[];
}
export const ContactControlBar = ({
@@ -26,12 +31,15 @@ export const ContactControlBar = ({
isReadOnly,
isQuotasAllowed,
publishedLinkSurveys,
+ currentAttributes,
+ attributeKeys,
}: ContactControlBarProps) => {
const router = useRouter();
const { t } = useTranslation();
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const [isDeletingPerson, setIsDeletingPerson] = useState(false);
const [isGenerateLinkModalOpen, setIsGenerateLinkModalOpen] = useState(false);
+ const [isEditAttributesModalOpen, setIsEditAttributesModalOpen] = useState(false);
const handleDeletePerson = async () => {
setIsDeletingPerson(true);
@@ -53,6 +61,14 @@ export const ContactControlBar = ({
}
const iconActions = [
+ {
+ icon: PencilIcon,
+ tooltip: t("environments.contacts.edit_attribute_values"),
+ onClick: () => {
+ setIsEditAttributesModalOpen(true);
+ },
+ isVisible: true,
+ },
{
icon: LinkIcon,
tooltip: t("environments.contacts.generate_personal_link"),
@@ -94,6 +110,13 @@ export const ContactControlBar = ({
contactId={contactId}
publishedLinkSurveys={publishedLinkSurveys}
/>
+
>
);
};
diff --git a/apps/web/modules/ee/contacts/[contactId]/page.tsx b/apps/web/modules/ee/contacts/[contactId]/page.tsx
index dc4259f2b7..280e41fa8e 100644
--- a/apps/web/modules/ee/contacts/[contactId]/page.tsx
+++ b/apps/web/modules/ee/contacts/[contactId]/page.tsx
@@ -2,6 +2,7 @@ import { getTagsByEnvironmentId } from "@/lib/tag/service";
import { getTranslate } from "@/lingodotdev/server";
import { AttributesSection } from "@/modules/ee/contacts/[contactId]/components/attributes-section";
import { ContactControlBar } from "@/modules/ee/contacts/[contactId]/components/contact-control-bar";
+import { getContactAttributeKeys } from "@/modules/ee/contacts/lib/contact-attribute-keys";
import { getContactAttributes } from "@/modules/ee/contacts/lib/contact-attributes";
import { getContact } from "@/modules/ee/contacts/lib/contacts";
import { getPublishedLinkSurveys } from "@/modules/ee/contacts/lib/surveys";
@@ -21,12 +22,14 @@ export const SingleContactPage = async (props: {
const { environment, isReadOnly, organization } = await getEnvironmentAuth(params.environmentId);
- const [environmentTags, contact, contactAttributes, publishedLinkSurveys] = await Promise.all([
- getTagsByEnvironmentId(params.environmentId),
- getContact(params.contactId),
- getContactAttributes(params.contactId),
- getPublishedLinkSurveys(params.environmentId),
- ]);
+ const [environmentTags, contact, contactAttributes, publishedLinkSurveys, contactAttributeKeys] =
+ await Promise.all([
+ getTagsByEnvironmentId(params.environmentId),
+ getContact(params.contactId),
+ getContactAttributes(params.contactId),
+ getPublishedLinkSurveys(params.environmentId),
+ getContactAttributeKeys(params.environmentId),
+ ]);
if (!contact) {
throw new Error(t("environments.contacts.contact_not_found"));
@@ -42,6 +45,8 @@ export const SingleContactPage = async (props: {
isReadOnly={isReadOnly}
isQuotasAllowed={isQuotasAllowed}
publishedLinkSurveys={publishedLinkSurveys}
+ currentAttributes={contactAttributes}
+ attributeKeys={contactAttributeKeys}
/>
);
};
@@ -50,7 +55,7 @@ export const SingleContactPage = async (props: {
-
+