fix: improve blocked state explanations across UI

Replace tooltip-only feedback with inline alerts that explain why an
action is unavailable and link to the relevant settings or docs:

- AI query section: show alert with reason-specific message and a
  link to organization settings or billing when AI is unavailable
- Feedback directory settings: explain when no unassigned workspaces
  are available and list the conflicting assignments
- Feedback directory unarchive: assert workspaces are not already
  assigned to another directory before restoring
- Create connector modal: surface API ingestion setup details in an
  inline alert on the selection step
This commit is contained in:
Javi Aguilar
2026-05-18 10:29:20 +02:00
parent eea7df81b4
commit 8a1079d19d
23 changed files with 300 additions and 87 deletions
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Filter hinzufügen",
"add_to_dashboard": "Zum Dashboard hinzufügen",
"advanced_chart_builder_config_prompt": "Konfiguriere dein Diagramm und klicke auf \"Abfrage ausführen\", um eine Vorschau zu sehen",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "KI ist auf dieser Instanz nicht konfiguriert. Kontaktiere deinen Administrator.",
"ai_not_available": "KI-Datenanalyse ist nicht verfügbar.",
"ai_not_enabled": "KI-Datenanalyse ist für diese Organisation deaktiviert. Aktiviere sie in den Organisationseinstellungen.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "z.B. Wie viele Nutzer haben sich letzte Woche angemeldet?",
"ai_query_section_description": "Beschreibe, was du sehen möchtest, und lass die KI das Diagramm erstellen.",
"ai_query_section_title": "Frag deine Daten",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Bereits im Dashboard",
"and_filter_logic": "UND",
"apply_changes": "Änderungen übernehmen",
@@ -2591,16 +2593,19 @@
"nav_label": "Feedback-Verzeichnisse",
"no_access": "Du hast keine Berechtigung, Feedback-Verzeichnisse zu verwalten.",
"no_connectors": "Noch keine Feedback-Quellen mit diesem Verzeichnis verknüpft.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Wenn du diese Feedback-Quellen pausierst, werden keine neuen Einträge mehr hinzugefügt.",
"pause_connectors_confirmation_title": "Verknüpfte Feedback-Quellen pausieren?",
"select_workspaces_placeholder": "Workspaces auswählen...",
"show_archived": "Archivierte anzeigen",
"title": "Feedback-Verzeichnisse",
"unarchive": "Aus Archiv wiederherstellen",
"unarchive_workspace_conflict": "Dieses Verzeichnis kann nicht wiederhergestellt werden, weil ein oder mehrere zugewiesene Workspaces archiviert sind.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Organisiere Feedback-Datensätze in Verzeichnissen und leite Daten zum richtigen Workspace weiter. Verfügbar in den Pro- und Scale-Plänen.",
"upgrade_prompt_title": "Upgrade durchführen, um Feedback-Datensatz-Verzeichnisse freizuschalten",
"workspace_access": "Workspace-Zugriff",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Bereits verknüpfte Workspaces",
"workspaces_being_added": "Workspaces, denen Zugriff gewährt wird"
},
@@ -3675,6 +3680,8 @@
"add_source": "Quelle hinzufügen",
"allowed_values": "Zulässige Werte: {values}",
"api_ingestion": "API-Erfassung",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Sende Feedback-Datensätze über die Management-API.",
"auto_generated": "Automatisch generiert",
"change_file": "Datei ändern",
@@ -3865,7 +3872,8 @@
"value_boolean": "Wert (Boolescher Wert)",
"value_date": "Wert (Datum)",
"value_number": "Wert (Anzahl)",
"value_text": "Wert (Text)"
"value_text": "Wert (Text)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Add filter",
"add_to_dashboard": "Add to Dashboard",
"advanced_chart_builder_config_prompt": "Configure your chart and click \"Run Query\" to preview",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "AI is not configured on this instance. Contact your administrator.",
"ai_not_available": "AI data analysis is not available.",
"ai_not_enabled": "AI data analysis is disabled for this organization. Enable it in organization settings.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "e.g. How many users signed up last week?",
"ai_query_section_description": "Describe what you want to see and let AI build the chart.",
"ai_query_section_title": "Ask your data",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Already on dashboard",
"and_filter_logic": "AND",
"apply_changes": "Apply Changes",
@@ -2591,16 +2593,19 @@
"nav_label": "Feedback Directories",
"no_access": "You do not have permission to manage feedback directories.",
"no_connectors": "No feedback sources linked to this directory yet.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Pausing these feedback sources will stop new records from being added.",
"pause_connectors_confirmation_title": "Pause linked feedback sources?",
"select_workspaces_placeholder": "Select workspaces...",
"show_archived": "Show archived",
"title": "Feedback Directories",
"unarchive": "Unarchive",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces are archived.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Organize feedback records into directories and route data to the right workspace. Available on the Pro and Scale plans.",
"upgrade_prompt_title": "Upgrade to unlock Feedback Directories",
"workspace_access": "Workspace access",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Already linked workspaces",
"workspaces_being_added": "Workspaces being granted access"
},
@@ -3675,6 +3680,8 @@
"add_source": "Add source",
"allowed_values": "Allowed values: {values}",
"api_ingestion": "API ingestion",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Send feedback records using the Management API.",
"auto_generated": "Auto-generated",
"change_file": "Change file",
@@ -3865,7 +3872,8 @@
"value_boolean": "Value (Boolean)",
"value_date": "Value (Date)",
"value_number": "Value (Number)",
"value_text": "Value (Text)"
"value_text": "Value (Text)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Añadir filtro",
"add_to_dashboard": "Añadir al panel de control",
"advanced_chart_builder_config_prompt": "Configura tu gráfico y haz clic en \"Ejecutar consulta\" para previsualizar",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "La IA no está configurada en esta instancia. Contacta con tu administrador.",
"ai_not_available": "El análisis de datos con IA no está disponible.",
"ai_not_enabled": "El análisis de datos con IA está desactivado para esta organización. Actívalo en la configuración de la organización.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "p. ej. ¿Cuántos usuarios se registraron la semana pasada?",
"ai_query_section_description": "Describe lo que quieres ver y deja que la IA construya el gráfico.",
"ai_query_section_title": "Pregunta a tus datos",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Ya está en el panel",
"and_filter_logic": "Y",
"apply_changes": "Aplicar cambios",
@@ -2591,16 +2593,19 @@
"nav_label": "Directorios de Feedback",
"no_access": "No tienes permiso para gestionar directorios de feedback.",
"no_connectors": "Aún no hay fuentes de comentarios vinculadas a este directorio.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Pausar estas fuentes de comentarios detendrá la adición de nuevos registros.",
"pause_connectors_confirmation_title": "¿Pausar las fuentes de comentarios vinculadas?",
"select_workspaces_placeholder": "Selecciona espacios de trabajo...",
"show_archived": "Mostrar archivados",
"title": "Directorios de feedback",
"unarchive": "Desarchivar",
"unarchive_workspace_conflict": "No se puede desarchivar este directorio porque uno o más espacios de trabajo asignados están archivados.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Organiza los registros de feedback en directorios y dirige los datos al espacio de trabajo adecuado. Disponible en los planes Pro y Scale.",
"upgrade_prompt_title": "Mejora tu plan para desbloquear los Directorios de Registros de Feedback",
"workspace_access": "Acceso al espacio de trabajo",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Espacios de trabajo ya vinculados",
"workspaces_being_added": "Espacios de trabajo a los que se concede acceso"
},
@@ -3675,6 +3680,8 @@
"add_source": "Añadir fuente",
"allowed_values": "Valores permitidos: {values}",
"api_ingestion": "Ingesta de API",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Envía registros de feedback mediante la API de gestión.",
"auto_generated": "Generado automáticamente",
"change_file": "Cambiar archivo",
@@ -3865,7 +3872,8 @@
"value_boolean": "Valor (booleano)",
"value_date": "Valor (Fecha)",
"value_number": "Valor (Número)",
"value_text": "Valor (Texto)"
"value_text": "Valor (Texto)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Ajouter un filtre",
"add_to_dashboard": "Ajouter au tableau de bord",
"advanced_chart_builder_config_prompt": "Configurez votre graphique et cliquez sur « Exécuter la requête » pour prévisualiser",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "L'IA n'est pas configurée sur cette instance. Contacte ton administrateur.",
"ai_not_available": "L'analyse de données par IA n'est pas disponible.",
"ai_not_enabled": "L'analyse de données par IA est désactivée pour cette organisation. Active-la dans les paramètres de l'organisation.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "ex. Combien d'utilisateurs se sont inscrits la semaine dernière?",
"ai_query_section_description": "Décrivez ce que vous souhaitez voir et laissez l'IA créer le graphique.",
"ai_query_section_title": "Interrogez vos données",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Déjà sur le tableau de bord",
"and_filter_logic": "ET",
"apply_changes": "Appliquer les modifications",
@@ -2591,16 +2593,19 @@
"nav_label": "Répertoires de feedback",
"no_access": "Tu n'as pas la permission de gérer les répertoires de retours.",
"no_connectors": "Aucune source de retours liée à ce répertoire pour le moment.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Mettre en pause ces sources de retours empêchera l'ajout de nouveaux enregistrements.",
"pause_connectors_confirmation_title": "Mettre en pause les sources de retours liées ?",
"select_workspaces_placeholder": "Sélectionner des espaces de travail...",
"show_archived": "Afficher les éléments archivés",
"title": "Répertoires de retours",
"unarchive": "Désarchiver",
"unarchive_workspace_conflict": "Impossible de désarchiver ce répertoire, car un ou plusieurs espaces de travail attribués sont archivés.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Organisez les enregistrements de feedback dans des répertoires et dirigez les données vers le bon espace de travail. Disponible avec les forfaits Pro et Scale.",
"upgrade_prompt_title": "Passez à un forfait supérieur pour débloquer les Répertoires d'enregistrements de feedback",
"workspace_access": "Accès à lespace de travail",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Espaces de travail déjà liés",
"workspaces_being_added": "Espaces de travail en cours d'ajout"
},
@@ -3675,6 +3680,8 @@
"add_source": "Ajouter une source",
"allowed_values": "Valeurs autorisées: {values}",
"api_ingestion": "Ingestion par API",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Envoyer des enregistrements de feedback via l'API de gestion.",
"auto_generated": "Généré automatiquement",
"change_file": "Changer de fichier",
@@ -3865,7 +3872,8 @@
"value_boolean": "Valeur (booléenne)",
"value_date": "Valeur (Date)",
"value_number": "Valeur (Nombre)",
"value_text": "Valeur (texte)"
"value_text": "Valeur (texte)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Szűrő hozzáadása",
"add_to_dashboard": "Hozzáadás a vezérlőpulthoz",
"advanced_chart_builder_config_prompt": "Állítsd be a diagramot, és kattints a \"Lekérdezés futtatása\" gombra az előnézethez",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "Az AI nincs konfigurálva ezen a példányon. Kérjük, lépjen kapcsolatba a rendszergazdával.",
"ai_not_available": "Az AI adatelemzés nem elérhető.",
"ai_not_enabled": "Az AI adatelemzés le van tiltva ezen szervezet számára. Kérjük, engedélyezze a szervezeti beállításokban.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "pl. Hány felhasználó regisztrált a múlt héten?",
"ai_query_section_description": "Írd le, mit szeretnél látni, és hagyd, hogy az AI elkészítse a diagramot.",
"ai_query_section_title": "Kérdezd meg az adataidat",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Már a vezérlőpulton van",
"and_filter_logic": "ÉS",
"apply_changes": "Módosítások alkalmazása",
@@ -2591,16 +2593,19 @@
"nav_label": "Visszajelzési könyvtárak",
"no_access": "Önnek nincs jogosultsága a visszajelzési könyvtárak kezeléséhez.",
"no_connectors": "Még nincsenek visszajelzési források kapcsolva ehhez a könyvtárhoz.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Ezen visszajelzési források szüneteltetése megállítja az új rekordok hozzáadását.",
"pause_connectors_confirmation_title": "Szünetelteti a kapcsolódó visszajelzési forrásokat?",
"select_workspaces_placeholder": "Munkaterületek kiválasztása...",
"show_archived": "Archivált elemek megjelenítése",
"title": "Visszajelzési könyvtárak",
"unarchive": "Archiválás visszavonása",
"unarchive_workspace_conflict": "A könyvtár nem állítható vissza, mert egy vagy több hozzárendelt munkaterület archiválva van.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Szervezze a visszajelzési rekordokat könyvtárakba, és irányítsa az adatokat a megfelelő munkaterületre. A Pro és Scale csomagokban érhető el.",
"upgrade_prompt_title": "Frissítsen a csomagon, hogy feloldja a Visszajelzési Rekord Könyvtárakat",
"workspace_access": "Munkaterület-hozzáférés",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Már kapcsolt munkaterületek",
"workspaces_being_added": "Hozzáférést kapó munkaterületek"
},
@@ -3675,6 +3680,8 @@
"add_source": "Forrás hozzáadása",
"allowed_values": "Engedélyezett értékek: {values}",
"api_ingestion": "API betöltés",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Visszajelzési rekordok küldése a Management API használatával.",
"auto_generated": "Automatikusan generált",
"change_file": "Fájl módosítása",
@@ -3865,7 +3872,8 @@
"value_boolean": "Érték (logikai)",
"value_date": "Érték (dátum)",
"value_number": "Érték (szám)",
"value_text": "Érték (szöveg)"
"value_text": "Érték (szöveg)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "フィルターを追加",
"add_to_dashboard": "ダッシュボードに追加",
"advanced_chart_builder_config_prompt": "チャートを設定して「クエリを実行」をクリックしてプレビューを表示",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "このインスタンスではAIが設定されていません。管理者にお問い合わせください。",
"ai_not_available": "AIデータ分析は利用できません。",
"ai_not_enabled": "この組織ではAIデータ分析が無効になっています。組織設定で有効にしてください。",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "例: 先週何人のユーザーが登録しましたか?",
"ai_query_section_description": "表示したい内容を説明すると、AIがチャートを作成します。",
"ai_query_section_title": "データに質問する",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "すでにダッシュボードに追加済み",
"and_filter_logic": "AND",
"apply_changes": "変更を適用",
@@ -2591,16 +2593,19 @@
"nav_label": "フィードバックディレクトリ",
"no_access": "フィードバックディレクトリを管理する権限がありません。",
"no_connectors": "このディレクトリにリンクされたフィードバックソースがまだありません。",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "これらのフィードバックソースを一時停止すると、新しいレコードの追加が停止されます。",
"pause_connectors_confirmation_title": "リンクされたフィードバックソースを一時停止しますか?",
"select_workspaces_placeholder": "ワークスペースを選択...",
"show_archived": "アーカイブ済みを表示",
"title": "フィードバックディレクトリ",
"unarchive": "アーカイブ解除",
"unarchive_workspace_conflict": "割り当てられているワークスペースの1つ以上がアーカイブされているため、このディレクトリをアーカイブ解除できません。",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "フィードバックレコードをディレクトリで整理し、適切なワークスペースにデータを振り分けられます。ProプランおよびScaleプランでご利用いただけます。",
"upgrade_prompt_title": "アップグレードしてフィードバックレコードディレクトリを利用",
"workspace_access": "ワークスペースアクセス",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "既にリンクされているワークスペース",
"workspaces_being_added": "アクセス権が付与されるワークスペース"
},
@@ -3675,6 +3680,8 @@
"add_source": "ソースを追加",
"allowed_values": "許可される値: {values}",
"api_ingestion": "API取り込み",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "管理APIを使用してフィードバックレコードを送信します。",
"auto_generated": "自動生成",
"change_file": "ファイルを変更",
@@ -3865,7 +3872,8 @@
"value_boolean": "値 (ブール値)",
"value_date": "値 (日付)",
"value_number": "値(数値)",
"value_text": "値 (テキスト)"
"value_text": "値 (テキスト)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Filter toevoegen",
"add_to_dashboard": "Toevoegen aan dashboard",
"advanced_chart_builder_config_prompt": "Configureer je grafiek en klik op \"Query uitvoeren\" om een voorbeeld te zien",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "AI is niet geconfigureerd op deze instantie. Neem contact op met je beheerder.",
"ai_not_available": "AI-data-analyse is niet beschikbaar.",
"ai_not_enabled": "AI-data-analyse is uitgeschakeld voor deze organisatie. Schakel het in bij de organisatie-instellingen.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "bijv. Hoeveel gebruikers hebben zich vorige week aangemeld?",
"ai_query_section_description": "Beschrijf wat je wilt zien en laat AI de grafiek bouwen.",
"ai_query_section_title": "Vraag het aan je data",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Al op dashboard",
"and_filter_logic": "EN",
"apply_changes": "Wijzigingen toepassen",
@@ -2591,16 +2593,19 @@
"nav_label": "Feedbackmappen",
"no_access": "Je hebt geen toestemming om feedbackmappen te beheren.",
"no_connectors": "Nog geen feedbackbronnen gekoppeld aan deze directory.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Het pauzeren van deze feedbackbronnen stopt het toevoegen van nieuwe gegevens.",
"pause_connectors_confirmation_title": "Gekoppelde feedbackbronnen pauzeren?",
"select_workspaces_placeholder": "Selecteer werkruimtes...",
"show_archived": "Gearchiveerde weergeven",
"title": "Feedbackmappen",
"unarchive": "Dearchiveren",
"unarchive_workspace_conflict": "Deze map kan niet worden gedearchiveerd omdat een of meer toegewezen workspaces zijn gearchiveerd.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Organiseer feedbackrecords in mappen en routeer gegevens naar de juiste workspace. Beschikbaar op de Pro- en Scale-abonnementen.",
"upgrade_prompt_title": "Upgrade om Feedbackrecord Mappen te ontgrendelen",
"workspace_access": "Workspace-toegang",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Reeds gekoppelde werkruimtes",
"workspaces_being_added": "Werkruimtes die toegang krijgen"
},
@@ -3675,6 +3680,8 @@
"add_source": "Bron toevoegen",
"allowed_values": "Toegestane waarden: {values}",
"api_ingestion": "API-inname",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Verstuur feedbackrecords via de Management API.",
"auto_generated": "Automatisch gegenereerd",
"change_file": "Bestand wijzigen",
@@ -3865,7 +3872,8 @@
"value_boolean": "Waarde (Booleaans)",
"value_date": "Waarde (datum)",
"value_number": "Waarde (getal)",
"value_text": "Waarde (tekst)"
"value_text": "Waarde (tekst)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Adicionar filtro",
"add_to_dashboard": "Adicionar ao painel",
"advanced_chart_builder_config_prompt": "Configure seu gráfico e clique em \"Executar consulta\" para visualizar",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "A IA não está configurada nesta instância. Entre em contato com seu administrador.",
"ai_not_available": "A análise de dados com IA não está disponível.",
"ai_not_enabled": "A análise de dados com IA está desabilitada para esta organização. Habilite nas configurações da organização.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "ex: Quantos usuários se cadastraram na semana passada?",
"ai_query_section_description": "Descreva o que você quer ver e deixe a IA construir o gráfico.",
"ai_query_section_title": "Pergunte aos seus dados",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Já está no painel",
"and_filter_logic": "E",
"apply_changes": "Aplicar alterações",
@@ -2591,16 +2593,19 @@
"nav_label": "Diretórios de Feedback",
"no_access": "Você não tem permissão para gerenciar diretórios de feedback.",
"no_connectors": "Nenhuma fonte de feedback vinculada a este diretório ainda.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Pausar essas fontes de feedback impedirá que novos registros sejam adicionados.",
"pause_connectors_confirmation_title": "Pausar fontes de feedback vinculadas?",
"select_workspaces_placeholder": "Selecionar espaços de trabalho...",
"show_archived": "Mostrar arquivados",
"title": "Diretórios de Feedback",
"unarchive": "Desarquivar",
"unarchive_workspace_conflict": "Não é possível desarquivar este diretório porque um ou mais workspaces atribuídos estão arquivados.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Organize registros de feedback em diretórios e direcione dados para o workspace certo. Disponível nos planos Pro e Scale.",
"upgrade_prompt_title": "Faça upgrade para desbloquear Diretórios de Registros de Feedback",
"workspace_access": "Acesso ao workspace",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Workspaces já vinculados",
"workspaces_being_added": "Workspaces recebendo acesso"
},
@@ -3675,6 +3680,8 @@
"add_source": "Adicionar fonte",
"allowed_values": "Valores permitidos: {values}",
"api_ingestion": "Ingestão de API",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Envie registros de feedback usando a API de Gerenciamento.",
"auto_generated": "Gerado automaticamente",
"change_file": "Alterar arquivo",
@@ -3865,7 +3872,8 @@
"value_boolean": "Valor (Booleano)",
"value_date": "Valor (Data)",
"value_number": "Valor (Número)",
"value_text": "Valor (Texto)"
"value_text": "Valor (Texto)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Adicionar filtro",
"add_to_dashboard": "Adicionar ao painel",
"advanced_chart_builder_config_prompt": "Configura o teu gráfico e clica em \"Executar consulta\" para pré-visualizar",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "A IA não está configurada nesta instância. Contacta o teu administrador.",
"ai_not_available": "A análise de dados por IA não está disponível.",
"ai_not_enabled": "A análise de dados por IA está desativada para esta organização. Ativa-a nas definições da organização.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "ex: Quantos utilizadores se registaram na semana passada?",
"ai_query_section_description": "Descreve o que queres ver e deixa a IA construir o gráfico.",
"ai_query_section_title": "Pergunta aos teus dados",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Já está no painel",
"and_filter_logic": "E",
"apply_changes": "Aplicar alterações",
@@ -2591,16 +2593,19 @@
"nav_label": "Diretórios de Feedback",
"no_access": "Não tens permissão para gerir diretórios de feedback.",
"no_connectors": "Ainda sem fontes de feedback associadas a este diretório.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Pausar estas fontes de feedback irá impedir a adição de novos registos.",
"pause_connectors_confirmation_title": "Pausar fontes de feedback associadas?",
"select_workspaces_placeholder": "Selecionar espaços de trabalho...",
"show_archived": "Mostrar arquivados",
"title": "Diretórios de Feedback",
"unarchive": "Desarquivar",
"unarchive_workspace_conflict": "Não é possível desarquivar este diretório porque um ou mais workspaces atribuídos estão arquivados.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Organiza os registos de feedback em diretórios e encaminha os dados para o workspace certo. Disponível nos planos Pro e Scale.",
"upgrade_prompt_title": "Faz upgrade para desbloquear Diretórios de Registos de Feedback",
"workspace_access": "Acesso ao workspace",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Workspaces já vinculados",
"workspaces_being_added": "Workspaces a receber acesso"
},
@@ -3675,6 +3680,8 @@
"add_source": "Adicionar fonte",
"allowed_values": "Valores permitidos: {values}",
"api_ingestion": "Ingestão de API",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Envia registos de feedback através da API de gestão.",
"auto_generated": "Gerado automaticamente",
"change_file": "Alterar ficheiro",
@@ -3865,7 +3872,8 @@
"value_boolean": "Valor (Booleano)",
"value_date": "Valor (Data)",
"value_number": "Valor (Número)",
"value_text": "Valor (Texto)"
"value_text": "Valor (Texto)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Adaugă filtru",
"add_to_dashboard": "Adaugă la Tablou de Bord",
"advanced_chart_builder_config_prompt": "Configurează graficul și apasă pe \"Rulează interogarea\" pentru previzualizare",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "AI nu este configurat pe această instanță. Contactează administratorul.",
"ai_not_available": "Analiza datelor cu AI nu este disponibilă.",
"ai_not_enabled": "Analiza datelor cu AI este dezactivată pentru această organizație. Activează-o în setările organizației.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "ex: Câți utilizatori s-au înscris săptămâna trecută?",
"ai_query_section_description": "Descrie ce vrei să vezi și lasă AI-ul să construiască graficul.",
"ai_query_section_title": "Întreabă-ți datele",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Deja pe tabloul de bord",
"and_filter_logic": "ȘI",
"apply_changes": "Aplică modificările",
@@ -2591,16 +2593,19 @@
"nav_label": "Directoare de feedback",
"no_access": "Nu ai permisiunea de a gestiona directoarele de feedback.",
"no_connectors": "Nicio sursă de feedback conectată la acest director încă.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Pauza acestor surse de feedback va opri adăugarea de noi înregistrări.",
"pause_connectors_confirmation_title": "Pui pe pauză sursele de feedback conectate?",
"select_workspaces_placeholder": "Selectează spații de lucru...",
"show_archived": "Afișează arhivate",
"title": "Directoare de Feedback",
"unarchive": "Dezarhivează",
"unarchive_workspace_conflict": "Acest director nu poate fi dezarhivat deoarece unul sau mai multe spații de lucru alocate sunt arhivate.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Organizează înregistrările de feedback în directoare și direcționează datele către workspace-ul potrivit. Disponibile în planurile Pro și Scale.",
"upgrade_prompt_title": "Actualizează pentru a debloca Directoarele pentru Înregistrări de Feedback",
"workspace_access": "Acces la spațiul de lucru",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Spații de lucru deja conectate",
"workspaces_being_added": "Spații de lucru cărora li se acordă acces"
},
@@ -3675,6 +3680,8 @@
"add_source": "Adaugă sursă",
"allowed_values": "Valori permise: {values}",
"api_ingestion": "Ingestie API",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Trimite înregistrări de feedback folosind API-ul de management.",
"auto_generated": "Generat automat",
"change_file": "Schimbă fișierul",
@@ -3865,7 +3872,8 @@
"value_boolean": "Valoare (booleană)",
"value_date": "Valoare (data)",
"value_number": "Valoare (număr)",
"value_text": "Valoare (Text)"
"value_text": "Valoare (Text)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Добавить фильтр",
"add_to_dashboard": "Добавить на панель",
"advanced_chart_builder_config_prompt": "Настрой график и нажми «Выполнить запрос», чтобы посмотреть предварительный просмотр",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "ИИ не настроен на этом экземпляре. Свяжитесь с администратором.",
"ai_not_available": "Анализ данных с помощью ИИ недоступен.",
"ai_not_enabled": "Анализ данных с помощью ИИ отключён для этой организации. Включите его в настройках организации.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "например: Сколько пользователей зарегистрировались на прошлой неделе?",
"ai_query_section_description": "Опиши, что хочешь увидеть, и AI построит график.",
"ai_query_section_title": "Спроси свои данные",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Уже на дашборде",
"and_filter_logic": "И",
"apply_changes": "Применить изменения",
@@ -2591,16 +2593,19 @@
"nav_label": "Каталоги отзывов",
"no_access": "У тебя нет прав для управления директориями обратной связи.",
"no_connectors": "К этому каталогу пока не привязаны источники отзывов.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Приостановка этих источников отзывов остановит добавление новых записей.",
"pause_connectors_confirmation_title": "Приостановить связанные источники отзывов?",
"select_workspaces_placeholder": "Выберите рабочие области...",
"show_archived": "Показать архивные",
"title": "Директории обратной связи",
"unarchive": "Разархивировать",
"unarchive_workspace_conflict": "Невозможно разархивировать этот каталог, потому что один или несколько назначенных рабочих пространств архивированы.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Организуй записи обратной связи в директории и направляй данные в нужное рабочее пространство. Доступно в тарифах Pro и Scale.",
"upgrade_prompt_title": "Обнови тариф, чтобы получить доступ к директориям записей обратной связи",
"workspace_access": "Доступ к рабочему пространству",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Уже связанные рабочие пространства",
"workspaces_being_added": "Рабочие пространства, которым предоставляется доступ"
},
@@ -3675,6 +3680,8 @@
"add_source": "Добавить источник",
"allowed_values": "Допустимые значения: {values}",
"api_ingestion": "Импорт через API",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Отправляйте записи обратной связи через Management API.",
"auto_generated": "Автоматически генерируется",
"change_file": "Изменить файл",
@@ -3865,7 +3872,8 @@
"value_boolean": "Значение (логическое)",
"value_date": "Значение (Дата)",
"value_number": "Значение (число)",
"value_text": "Значение (текст)"
"value_text": "Значение (текст)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Lägg till filter",
"add_to_dashboard": "Lägg till på instrumentpanelen",
"advanced_chart_builder_config_prompt": "Konfigurera ditt diagram och klicka på \"Kör fråga\" för att förhandsgranska",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "AI är inte konfigurerad på denna instans. Kontakta din administratör.",
"ai_not_available": "AI-dataanalys är inte tillgänglig.",
"ai_not_enabled": "AI-dataanalys är inaktiverad för denna organisation. Aktivera det i organisationsinställningarna.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "t.ex. Hur många användare registrerade sig förra veckan?",
"ai_query_section_description": "Beskriv vad du vill se så bygger AI diagrammet åt dig.",
"ai_query_section_title": "Fråga din data",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Redan på instrumentpanelen",
"and_filter_logic": "OCH",
"apply_changes": "Verkställ ändringar",
@@ -2591,16 +2593,19 @@
"nav_label": "Feedbackkataloger",
"no_access": "Du har inte behörighet att hantera feedback-kataloger.",
"no_connectors": "Inga feedbackkällor länkade till den här katalogen ännu.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Att pausa dessa feedbackkällor kommer att stoppa nya poster från att läggas till.",
"pause_connectors_confirmation_title": "Pausa länkade feedbackkällor?",
"select_workspaces_placeholder": "Välj arbetsytor...",
"show_archived": "Visa arkiverade",
"title": "Feedback-kataloger",
"unarchive": "Avarkivera",
"unarchive_workspace_conflict": "Den här katalogen kan inte avarkiveras eftersom en eller flera tilldelade arbetsytor är arkiverade.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Organisera feedbackposter i kataloger och dirigera data till rätt arbetsyta. Tillgängligt på Pro- och Scale-planerna.",
"upgrade_prompt_title": "Uppgradera för att låsa upp Feedbackpostkataloger",
"workspace_access": "Arbetsyteåtkomst",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Redan länkade arbetsytor",
"workspaces_being_added": "Arbetsytor som beviljas åtkomst"
},
@@ -3675,6 +3680,8 @@
"add_source": "Lägg till källa",
"allowed_values": "Tillåtna värden: {values}",
"api_ingestion": "API ingestion",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Send feedback records using the Management API.",
"auto_generated": "Automatiskt genererad",
"change_file": "Byt fil",
@@ -3865,7 +3872,8 @@
"value_boolean": "Värde (booleskt)",
"value_date": "Värde (datum)",
"value_number": "Värde (antal)",
"value_text": "Värde (text)"
"value_text": "Värde (text)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "Filtre ekle",
"add_to_dashboard": "Panoya Ekle",
"advanced_chart_builder_config_prompt": "Grafiğini yapılandır ve önizleme için \"Sorguyu Çalıştır\"a tıkla",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "Bu örnekte AI yapılandırılmamış. Yöneticinle iletişime geç.",
"ai_not_available": "AI veri analizi mevcut değil.",
"ai_not_enabled": "Bu organizasyon için AI veri analizi devre dışı. Organizasyon ayarlarından etkinleştir.",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "örn. Geçen hafta kaç kullanıcı kaydoldu?",
"ai_query_section_description": "Ne görmek istediğini anlat, AI grafiği oluştursun.",
"ai_query_section_title": "Verilerine sor",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "Zaten panoda",
"and_filter_logic": "VE",
"apply_changes": "Değişiklikleri Uygula",
@@ -2591,16 +2593,19 @@
"nav_label": "Geri Bildirim Dizinleri",
"no_access": "Geri bildirim dizinlerini yönetme yetkin yok.",
"no_connectors": "Bu dizine henüz bağlı geri bildirim kaynağı yok.",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "Bu geri bildirim kaynaklarını duraklatmak, yeni kayıtların eklenmesini durdurur.",
"pause_connectors_confirmation_title": "Bağlı geri bildirim kaynakları duraklatılsın mı?",
"select_workspaces_placeholder": "Çalışma alanlarını seç...",
"show_archived": "Arşivlenmişleri göster",
"title": "Geri Bildirim Dizinleri",
"unarchive": "Arşivden çıkar",
"unarchive_workspace_conflict": "Atanmış çalışma alanlarından biri veya daha fazlası arşivlendiği için bu dizin arşivden çıkarılamaz.",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "Geri bildirim kayıtlarını dizinler halinde düzenleyin ve verileri doğru çalışma alanına yönlendirin. Pro ve Scale planlarında kullanılabilir.",
"upgrade_prompt_title": "Geri Bildirim Kayıt Dizinlerinin Kilidini Açmak İçin Yükseltin",
"workspace_access": "Çalışma alanı erişimi",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "Zaten bağlı çalışma alanları",
"workspaces_being_added": "Erişim verilen çalışma alanları"
},
@@ -3675,6 +3680,8 @@
"add_source": "Kaynak ekle",
"allowed_values": "İzin verilen değerler: {values}",
"api_ingestion": "API ingestion",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Send feedback records using the Management API.",
"auto_generated": "Otomatik olarak oluşturuldu",
"change_file": "Dosyayı değiştir",
@@ -3865,7 +3872,8 @@
"value_boolean": "Değer (Boolean)",
"value_date": "Değer (Tarih)",
"value_number": "Değer (Sayı)",
"value_text": "Değer (Metin)"
"value_text": "Değer (Metin)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "添加过滤器",
"add_to_dashboard": "添加到 Dashboard",
"advanced_chart_builder_config_prompt": "配置你的图表,然后点击“运行查询”预览",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "此实例未配置 AI。请联系您的管理员。",
"ai_not_available": "AI 数据分析不可用。",
"ai_not_enabled": "此组织已禁用 AI 数据分析。请在组织设置中启用。",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "例如:上周有多少用户注册?",
"ai_query_section_description": "描述你想要看到的内容,让 AI 帮你生成图表。",
"ai_query_section_title": "向你的数据提问",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "已在仪表板上",
"and_filter_logic": "且",
"apply_changes": "应用更改",
@@ -2591,16 +2593,19 @@
"nav_label": "反馈目录",
"no_access": "你没有管理反馈目录的权限。",
"no_connectors": "暂未关联反馈来源到此目录。",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "暂停这些反馈来源后,将不会有新记录添加进来。",
"pause_connectors_confirmation_title": "暂停关联反馈来源?",
"select_workspaces_placeholder": "选择工作区...",
"show_archived": "显示已归档",
"title": "反馈目录",
"unarchive": "取消归档",
"unarchive_workspace_conflict": "无法取消归档该目录,因为一个或多个已分配工作区已归档。",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "将反馈记录整理到目录中,并将数据路由到正确的工作空间。专业版和规模版方案可用。",
"upgrade_prompt_title": "升级以解锁反馈记录目录",
"workspace_access": "工作区访问权限",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "已关联的工作区",
"workspaces_being_added": "将被授权访问的工作区"
},
@@ -3675,6 +3680,8 @@
"add_source": "添加来源",
"allowed_values": "允许的值:{values}",
"api_ingestion": "API ingestion",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Send feedback records using the Management API.",
"auto_generated": "自动生成",
"change_file": "更换文件",
@@ -3865,7 +3872,8 @@
"value_boolean": "值(布尔值)",
"value_date": "值(日期)",
"value_number": "值(数量)",
"value_text": "值(文本)"
"value_text": "值(文本)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "客户努力评分",
+10 -2
View File
@@ -1667,6 +1667,7 @@
"add_filter": "新增篩選器",
"add_to_dashboard": "新增到儀表板",
"advanced_chart_builder_config_prompt": "設定你的圖表,然後點擊「執行查詢」預覽",
"ai_enable_in_settings": "Enable it in organization settings.",
"ai_instance_not_configured": "此執行個體未設定 AI。請聯絡您的管理員。",
"ai_not_available": "AI 資料分析無法使用。",
"ai_not_enabled": "此組織已停用 AI 資料分析。請在組織設定中啟用。",
@@ -1674,6 +1675,7 @@
"ai_query_placeholder": "例如:上週有多少用戶註冊?",
"ai_query_section_description": "描述你想看到的內容,讓 AI 幫你建立圖表。",
"ai_query_section_title": "詢問你的數據",
"ai_upgrade_plan": "Upgrade plan.",
"already_on_dashboard": "已在儀表板上",
"and_filter_logic": "且",
"apply_changes": "套用變更",
@@ -2591,16 +2593,19 @@
"nav_label": "意見回饋目錄",
"no_access": "你沒有權限管理意見回饋目錄。",
"no_connectors": "此目錄尚未連結任何回饋來源。",
"no_unassigned_workspaces_description": "Every workspace is already linked to an active feedback directory. Remove a workspace from its current directory before assigning it here.",
"no_unassigned_workspaces_title": "No unassigned workspaces available",
"pause_connectors_confirmation_description": "暫停這些回饋來源將停止新增記錄。",
"pause_connectors_confirmation_title": "暫停已連結的回饋來源?",
"select_workspaces_placeholder": "選擇工作區...",
"show_archived": "顯示已封存",
"title": "意見回饋目錄",
"unarchive": "取消封存",
"unarchive_workspace_conflict": "無法取消封存此目錄,因為一個或多個已指派工作區已封存。",
"unarchive_workspace_conflict": "Cannot unarchive this directory because one or more assigned workspaces already belong to another active feedback directory.",
"upgrade_prompt_description": "將回饋記錄整理至目錄中,並將資料導向正確的工作區。專業版和企業版方案提供此功能。",
"upgrade_prompt_title": "升級以解鎖回饋記錄目錄功能",
"workspace_access": "工作區存取權限",
"workspace_assigned_to_directory": "{workspaceName} is linked to {directoryName}",
"workspaces_already_linked": "已連結的工作區",
"workspaces_being_added": "正在授予存取權限的工作區"
},
@@ -3675,6 +3680,8 @@
"add_source": "新增來源",
"allowed_values": "允許的值:{values}",
"api_ingestion": "API ingestion",
"api_ingestion_setup_description": "Use the REST API to send feedback records directly into Formbricks. The API ingestion docs include the endpoint, payload shape, and authentication details.",
"api_ingestion_setup_title": "Set up API ingestion",
"api_ingestion_settings_description": "Send feedback records using the Management API.",
"auto_generated": "自動生成",
"change_file": "更換檔案",
@@ -3865,7 +3872,8 @@
"value_boolean": "值(布林值)",
"value_date": "值(日期)",
"value_number": "值(數量)",
"value_text": "值(文字)"
"value_text": "值(文字)",
"view_rest_api_docs": "View REST API docs"
},
"xm-templates": {
"ces": "CES",
@@ -8,10 +8,9 @@ import { useTranslation } from "react-i18next";
import { getFormattedErrorMessage } from "@/lib/utils/helper";
import { generateAIChartAction } from "@/modules/ee/analysis/charts/actions";
import type { AnalyticsResponse } from "@/modules/ee/analysis/types/analysis";
import { Alert } from "@/modules/ui/components/alert";
import { Alert, AlertDescription } from "@/modules/ui/components/alert";
import { Button } from "@/modules/ui/components/button";
import { Input } from "@/modules/ui/components/input";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/modules/ui/components/tooltip";
interface AIQuerySectionProps {
workspaceId: string;
@@ -31,7 +30,13 @@ export function AIQuerySection({
const [userQuery, setUserQuery] = useState("");
const [isGenerating, setIsGenerating] = useState(false);
const { t } = useTranslation();
const showAIDataAnalysisDisabledAlert = !isAIAvailable && aiUnavailableReason === "not_enabled";
const aiUnavailableMessage =
{
not_in_plan: t("workspace.analysis.charts.ai_not_in_plan"),
not_enabled: t("workspace.analysis.charts.ai_not_enabled"),
instance_not_configured: t("workspace.analysis.charts.ai_instance_not_configured"),
}[aiUnavailableReason ?? ""] ?? t("workspace.analysis.charts.ai_not_available");
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
@@ -83,54 +88,36 @@ export function AIQuerySection({
maxLength={2000}
disabled={!isAIAvailable || isGenerating}
/>
{showAIDataAnalysisDisabledAlert ? (
<Button
type="submit"
variant="default"
className="w-full"
disabled={!isAIAvailable || !userQuery.trim() || isGenerating}
loading={isGenerating}>
<WandSparklesIcon className="h-4 w-4" />
{t("workspace.analysis.charts.create_chart_with_ai")}
</Button>
) : (
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<div>
<Button
type="submit"
variant="default"
className="w-full"
disabled={!isAIAvailable || !userQuery.trim() || isGenerating}
loading={isGenerating}>
<WandSparklesIcon className="h-4 w-4" />
{t("workspace.analysis.charts.create_chart_with_ai")}
</Button>
</div>
</TooltipTrigger>
{!isAIAvailable && (
<TooltipContent>
{{
not_in_plan: t("workspace.analysis.charts.ai_not_in_plan"),
not_enabled: t("workspace.analysis.charts.ai_not_enabled"),
instance_not_configured: t("workspace.analysis.charts.ai_instance_not_configured"),
}[aiUnavailableReason ?? ""] ?? t("workspace.analysis.charts.ai_not_available")}
</TooltipContent>
)}
</Tooltip>
</TooltipProvider>
)}
<Button
type="submit"
variant="default"
className="w-full"
disabled={!isAIAvailable || !userQuery.trim() || isGenerating}
loading={isGenerating}>
<WandSparklesIcon className="h-4 w-4" />
{t("workspace.analysis.charts.create_chart_with_ai")}
</Button>
</form>
</div>
{showAIDataAnalysisDisabledAlert && (
{!isAIAvailable && (
<Alert variant="info" size="small">
<span className="truncate">{t("workspace.surveys.edit.ai_data_analysis_disabled")}</span>
<Link
href={`/workspaces/${workspaceId}/settings/organization/general`}
className="ml-2 inline-flex shrink-0 underline">
Enable it in organization settings.
</Link>
<AlertDescription className="overflow-visible whitespace-normal">
<span>{aiUnavailableMessage}</span>
{aiUnavailableReason === "not_enabled" && (
<Link
href={`/workspaces/${workspaceId}/settings/organization/general`}
className="ml-2 inline-flex shrink-0 underline">
{t("workspace.analysis.charts.ai_enable_in_settings")}
</Link>
)}
{aiUnavailableReason === "not_in_plan" && (
<Link
href={`/workspaces/${workspaceId}/settings/organization/billing`}
className="ml-2 inline-flex shrink-0 underline">
{t("workspace.analysis.charts.ai_upgrade_plan")}
</Link>
)}
</AlertDescription>
</Alert>
)}
</div>
@@ -23,6 +23,7 @@ import {
getTranslatedFeedbackDirectoryError,
} from "@/modules/ee/feedback-directory/types/feedback-directory";
import { TOrganizationWorkspace } from "@/modules/ee/teams/team-list/types/workspace";
import { Alert, AlertDescription, AlertTitle } from "@/modules/ui/components/alert";
import { Button } from "@/modules/ui/components/button";
import {
Dialog,
@@ -96,6 +97,34 @@ export const FeedbackDirectorySettingsModal = ({
[orgWorkspaces, workspaceAccessMap, directory?.id]
);
const workspaceConflictDetails = useMemo(
() =>
orgWorkspaces
.map((workspace) => {
const assignment = workspaceAccessMap.get(workspace.id);
if (!assignment || assignment.feedbackDirectoryId === directory?.id) {
return null;
}
return {
workspaceId: workspace.id,
workspaceName: workspace.name,
feedbackDirectoryName: assignment.feedbackDirectoryName,
};
})
.filter(
(
conflict
): conflict is {
workspaceId: string;
workspaceName: string;
feedbackDirectoryName: string;
} => conflict !== null
)
.sort((a, b) => a.workspaceName.localeCompare(b.workspaceName, undefined, { sensitivity: "base" })),
[orgWorkspaces, workspaceAccessMap, directory?.id]
);
const initialWorkspaceIds = useMemo(
() => directory?.workspaces.map((workspace) => workspace.workspaceId) ?? [],
[directory?.workspaces]
@@ -117,6 +146,10 @@ export const FeedbackDirectorySettingsModal = ({
setValue,
reset,
} = form;
const selectedWorkspaceIds = form.watch("workspaceIds") ?? [];
const hasUnassignedWorkspace = workspaceOptions.some((option) => !option.disabled);
const showWorkspaceAccessBlockedExplanation =
workspaceConflictDetails.length > 0 && !hasUnassignedWorkspace;
const workspaceNameById = useMemo(() => {
const map = new Map(orgWorkspaces.map((workspace) => [workspace.id, workspace.name]));
@@ -290,7 +323,7 @@ export const FeedbackDirectorySettingsModal = ({
</Muted>
<MultiSelect
options={workspaceOptions}
value={form.watch("workspaceIds") ?? []}
value={selectedWorkspaceIds}
onChange={(selected) => {
setValue("workspaceIds", selected, { shouldDirty: true });
}}
@@ -298,6 +331,32 @@ export const FeedbackDirectorySettingsModal = ({
placeholder={t("workspace.settings.feedback_directories.select_workspaces_placeholder")}
containerClassName="focus-within:ring-0 focus-within:ring-offset-0"
/>
{showWorkspaceAccessBlockedExplanation && (
<Alert variant="info" size="small" className="items-start">
<div className="min-w-0 space-y-1">
<AlertTitle className="truncate">
{t("workspace.settings.feedback_directories.no_unassigned_workspaces_title")}
</AlertTitle>
<AlertDescription className="overflow-visible whitespace-normal">
<p>
{t(
"workspace.settings.feedback_directories.no_unassigned_workspaces_description"
)}
</p>
<ul className="mt-1 list-disc space-y-0.5 pl-4">
{workspaceConflictDetails.map((conflict) => (
<li key={conflict.workspaceId}>
{t("workspace.settings.feedback_directories.workspace_assigned_to_directory", {
workspaceName: conflict.workspaceName,
directoryName: conflict.feedbackDirectoryName,
})}
</li>
))}
</ul>
</AlertDescription>
</div>
</Alert>
)}
</div>
{isEdit && (
@@ -402,6 +402,7 @@ describe("FeedbackDirectory Service", () => {
});
test("unarchives directory", async () => {
vi.mocked(prisma.feedbackDirectory.findUnique).mockResolvedValueOnce(mockDirectoryDetailsDbRow as any);
vi.mocked(prisma.feedbackDirectory.update).mockResolvedValueOnce({} as any);
const result = await updateFeedbackDirectory(mockDirectoryId, mockOrganizationId, {
@@ -409,12 +410,35 @@ describe("FeedbackDirectory Service", () => {
});
expect(result).toBe(true);
expect(prisma.feedbackDirectoryWorkspace.findFirst).toHaveBeenCalledWith({
where: {
workspaceId: { in: [mockWorkspaceId1, mockWorkspaceId2] },
feedbackDirectoryId: { not: mockDirectoryId },
feedbackDirectory: { isArchived: false },
},
select: { workspaceId: true },
});
expect(prisma.feedbackDirectory.update).toHaveBeenCalledWith({
where: { id: mockDirectoryId },
data: { isArchived: false },
});
});
test("throws InvalidInputError when unarchiving would assign a workspace to two active directories", async () => {
vi.mocked(prisma.feedbackDirectory.findUnique).mockResolvedValueOnce(mockDirectoryDetailsDbRow as any);
vi.mocked(prisma.feedbackDirectoryWorkspace.findFirst).mockResolvedValueOnce({
workspaceId: mockWorkspaceId1,
} as any);
await expect(
updateFeedbackDirectory(mockDirectoryId, mockOrganizationId, {
isArchived: false,
})
).rejects.toThrow(new InvalidInputError("WORKSPACE_ALREADY_ASSIGNED_TO_DIFFERENT_DIRECTORY"));
expect(prisma.feedbackDirectory.update).not.toHaveBeenCalled();
});
test("updates workspace assignments with diff", async () => {
// getFeedbackDirectoryDetails call
vi.mocked(prisma.feedbackDirectory.findUnique).mockResolvedValueOnce(mockDirectoryDetailsDbRow as any);
@@ -383,6 +383,16 @@ const getArchiveUpdate = async (
}
if (isArchived === false) {
const currentDetails = await getFeedbackDirectoryDetails(directoryId);
if (!currentDetails) {
throw new ResourceNotFoundError("FeedbackDirectory", directoryId);
}
await assertWorkspacesNotAssignedElsewhere(
directoryId,
currentDetails.workspaces.map((workspace) => workspace.workspaceId)
);
return { isArchived: false };
}
@@ -14,7 +14,7 @@ import {
importHistoricalResponsesAction,
} from "@/lib/connector/actions";
import { getFormattedErrorMessage } from "@/lib/utils/helper";
import { Alert } from "@/modules/ui/components/alert";
import { Alert, AlertDescription, AlertTitle } from "@/modules/ui/components/alert";
import { Button } from "@/modules/ui/components/button";
import {
Dialog,
@@ -66,6 +66,9 @@ import { ConnectorTypeSelector } from "./connector-type-selector";
import { CsvConnectorUI } from "./csv-connector-ui";
import { FormbricksQuestionList } from "./formbricks-question-list";
const API_INGESTION_DOCS_URL = "https://formbricks.com/docs/unify-feedback/api/rest-api";
const FEEDBACK_RECORD_MCP_DOCS_URL = "https://formbricks.com/docs/unify-feedback/api/mcp";
interface CreateConnectorModalProps {
open: boolean;
onOpenChange: (open: boolean) => void;
@@ -107,7 +110,7 @@ const getDialogDescription = (
const getNextStepButtonLabel = (type: TConnectorOptionId | null, t: (key: string) => string): string => {
if (type === "formbricks_survey") return t("workspace.unify.select_questions");
if (type === "csv") return t("workspace.unify.configure_import");
if (type === "api_ingestion") return t("common.learn_more");
if (type === "api_ingestion") return t("workspace.unify.view_rest_api_docs");
if (type === "feedback_record_mcp") return t("common.learn_more");
return t("workspace.unify.create_mapping");
};
@@ -260,12 +263,12 @@ export const CreateConnectorModal = ({
if (currentStep !== "selectType" || !selectedType) return;
if (selectedType === "api_ingestion") {
window.open("https://formbricks.com/docs/unify-feedback/api/rest-api", "_blank", "noopener,noreferrer");
window.open(API_INGESTION_DOCS_URL, "_blank", "noopener,noreferrer");
return;
}
if (selectedType === "feedback_record_mcp") {
window.open("https://formbricks.com/docs/unify-feedback/api/mcp", "_blank", "noopener,noreferrer");
window.open(FEEDBACK_RECORD_MCP_DOCS_URL, "_blank", "noopener,noreferrer");
return;
}
@@ -479,6 +482,16 @@ export const CreateConnectorModal = ({
workspaceId={workspaceId}
/>
)}
{currentStep === "selectType" && selectedType === "api_ingestion" && (
<Alert variant="info" size="small" className="mt-3 items-start">
<div className="min-w-0 space-y-1">
<AlertTitle>{t("workspace.unify.api_ingestion_setup_title")}</AlertTitle>
<AlertDescription className="overflow-visible whitespace-normal">
<p>{t("workspace.unify.api_ingestion_setup_description")}</p>
</AlertDescription>
</div>
</Alert>
)}
{currentStep === "mapping" && selectedType === "formbricks_survey" && (
<FormProvider {...formbricksForm}>
@@ -1,8 +1,8 @@
import { createId } from "@paralleldrive/cuid2";
import fs from "node:fs/promises";
import path from "node:path";
import readline from "node:readline";
import { fileURLToPath } from "node:url";
import { createId } from "@paralleldrive/cuid2";
import { logger } from "@formbricks/logger";
const __filename = fileURLToPath(import.meta.url);
@@ -1,9 +1,9 @@
import { type Prisma, PrismaClient } from "@prisma/client";
import { exec } from "node:child_process";
import fs from "node:fs/promises";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { promisify } from "node:util";
import { type Prisma, PrismaClient } from "@prisma/client";
import { logger } from "@formbricks/logger";
const __filename = fileURLToPath(import.meta.url);
@@ -5,10 +5,10 @@ import { cn } from "@/lib/utils";
export type ButtonVariant = "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | "custom";
export type ButtonSize = "default" | "custom" | "sm" | "lg" | "icon";
type ButtonVariantProps = {
interface ButtonVariantProps {
variant?: ButtonVariant | null;
size?: ButtonSize | null;
};
}
type ButtonVariantClassProps =
| (ButtonVariantProps & { class?: string; className?: never })
| (ButtonVariantProps & { class?: never; className?: string })