@open-mercato/core 0.6.7-develop.6674.1.add2064cad → 0.6.7-develop.6677.1.beabb7ca12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/modules/audit_logs/api/audit-logs/access/route.js +5 -1
- package/dist/modules/audit_logs/api/audit-logs/access/route.js.map +2 -2
- package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js +5 -1
- package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js.map +2 -2
- package/dist/modules/audit_logs/api/audit-logs/actions/route.js +5 -1
- package/dist/modules/audit_logs/api/audit-logs/actions/route.js.map +2 -2
- package/dist/modules/audit_logs/api/audit-logs/readScope.js +12 -0
- package/dist/modules/audit_logs/api/audit-logs/readScope.js.map +7 -0
- package/dist/modules/directory/api/organization-switcher/route.js +84 -20
- package/dist/modules/directory/api/organization-switcher/route.js.map +2 -2
- package/dist/modules/directory/subscribers/invalidateOrgScopeCache.js +5 -1
- package/dist/modules/directory/subscribers/invalidateOrgScopeCache.js.map +2 -2
- package/dist/modules/directory/utils/organizationScope.js +11 -3
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/package.json +7 -7
- package/src/modules/attachments/i18n/de.json +12 -0
- package/src/modules/attachments/i18n/en.json +12 -0
- package/src/modules/attachments/i18n/es.json +12 -0
- package/src/modules/attachments/i18n/pl.json +12 -0
- package/src/modules/audit_logs/api/audit-logs/access/route.ts +5 -0
- package/src/modules/audit_logs/api/audit-logs/actions/export/route.ts +5 -0
- package/src/modules/audit_logs/api/audit-logs/actions/route.ts +5 -0
- package/src/modules/audit_logs/api/audit-logs/readScope.ts +28 -0
- package/src/modules/auth/i18n/de.json +1 -0
- package/src/modules/auth/i18n/en.json +1 -0
- package/src/modules/auth/i18n/es.json +1 -0
- package/src/modules/auth/i18n/pl.json +1 -0
- package/src/modules/catalog/i18n/de.json +18 -0
- package/src/modules/catalog/i18n/en.json +18 -0
- package/src/modules/catalog/i18n/es.json +18 -0
- package/src/modules/catalog/i18n/pl.json +18 -0
- package/src/modules/customers/i18n/de.json +44 -0
- package/src/modules/customers/i18n/en.json +44 -0
- package/src/modules/customers/i18n/es.json +44 -0
- package/src/modules/customers/i18n/pl.json +44 -0
- package/src/modules/directory/api/organization-switcher/route.ts +97 -26
- package/src/modules/directory/subscribers/invalidateOrgScopeCache.ts +4 -1
- package/src/modules/directory/utils/organizationScope.ts +9 -3
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server'
|
|
2
|
+
import type { AuthContext } from '@open-mercato/shared/lib/auth/server'
|
|
3
|
+
|
|
4
|
+
type ResolvedAuth = NonNullable<AuthContext>
|
|
5
|
+
|
|
6
|
+
// `isSuperAdmin` is not part of the declared `AuthContext` shape — it reaches callers
|
|
7
|
+
// through the type's index signature — so read it exactly the way
|
|
8
|
+
// `shared/lib/auth/server.ts` does instead of widening the shared contract here.
|
|
9
|
+
function isSuperAdmin(auth: ResolvedAuth): boolean {
|
|
10
|
+
return (auth as Record<string, unknown>).isSuperAdmin === true
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Fail closed on tenant scope for audit-log reads.
|
|
15
|
+
*
|
|
16
|
+
* `audit_logs.view_tenant` only widens visibility WITHIN a tenant, so cross-tenant reads
|
|
17
|
+
* must be gated on `isSuperAdmin`, never on the caller's tenant being empty: a tenant-less
|
|
18
|
+
* principal (unscoped API key or global account) holding `view_tenant` otherwise drops the
|
|
19
|
+
* tenant, organization and actor predicates at once and reads decrypted action-log rows for
|
|
20
|
+
* every tenant in the instance (issues #3817, #3818).
|
|
21
|
+
*
|
|
22
|
+
* Plain truthiness is deliberate — it matches the `if (parsed.tenantId)` predicate guard in
|
|
23
|
+
* ActionLogService/AccessLogService, so every value that would skip it is rejected here.
|
|
24
|
+
*/
|
|
25
|
+
export function requireResolvedTenantScope(auth: ResolvedAuth): NextResponse | null {
|
|
26
|
+
if (auth.tenantId || isSuperAdmin(auth)) return null
|
|
27
|
+
return NextResponse.json({ error: 'Forbidden' }, { status: 403 })
|
|
28
|
+
}
|
|
@@ -128,6 +128,7 @@
|
|
|
128
128
|
"auth.roles.form.group.details": "Details",
|
|
129
129
|
"auth.roles.form.group.widgets": "Dashboard-Widgets",
|
|
130
130
|
"auth.roles.form.loading": "Daten werden geladen...",
|
|
131
|
+
"auth.roles.form.tenantReassignWarning": "Diese Rolle wird einem anderen Mandanten zugewiesen. Die hier ausgewählten Berechtigungen werden beim Absenden unter dem neuen Mandanten gespeichert.",
|
|
131
132
|
"auth.roles.form.title.create": "Rolle erstellen",
|
|
132
133
|
"auth.roles.form.title.edit": "Rolle bearbeiten",
|
|
133
134
|
"auth.roles.list.actions.create": "Erstellen",
|
|
@@ -128,6 +128,7 @@
|
|
|
128
128
|
"auth.roles.form.group.details": "Details",
|
|
129
129
|
"auth.roles.form.group.widgets": "Dashboard Widgets",
|
|
130
130
|
"auth.roles.form.loading": "Loading data...",
|
|
131
|
+
"auth.roles.form.tenantReassignWarning": "This role is being reassigned to a different tenant. The permissions selected here will be saved under the new tenant when you submit.",
|
|
131
132
|
"auth.roles.form.title.create": "Create Role",
|
|
132
133
|
"auth.roles.form.title.edit": "Edit Role",
|
|
133
134
|
"auth.roles.list.actions.create": "Create",
|
|
@@ -128,6 +128,7 @@
|
|
|
128
128
|
"auth.roles.form.group.details": "Detalles",
|
|
129
129
|
"auth.roles.form.group.widgets": "Widgets del panel",
|
|
130
130
|
"auth.roles.form.loading": "Cargando datos...",
|
|
131
|
+
"auth.roles.form.tenantReassignWarning": "Este rol se está reasignando a otro inquilino. Los permisos seleccionados aquí se guardarán bajo el nuevo inquilino al enviar.",
|
|
131
132
|
"auth.roles.form.title.create": "Crear rol",
|
|
132
133
|
"auth.roles.form.title.edit": "Editar rol",
|
|
133
134
|
"auth.roles.list.actions.create": "Crear",
|
|
@@ -128,6 +128,7 @@
|
|
|
128
128
|
"auth.roles.form.group.details": "Szczegóły",
|
|
129
129
|
"auth.roles.form.group.widgets": "Widżety pulpitu",
|
|
130
130
|
"auth.roles.form.loading": "Ładowanie danych...",
|
|
131
|
+
"auth.roles.form.tenantReassignWarning": "Ta rola jest przypisywana do innego najemcy. Wybrane tutaj uprawnienia zostaną zapisane pod nowym najemcą po zatwierdzeniu.",
|
|
131
132
|
"auth.roles.form.title.create": "Utwórz rolę",
|
|
132
133
|
"auth.roles.form.title.edit": "Edytuj rolę",
|
|
133
134
|
"auth.roles.list.actions.create": "Utwórz",
|
|
@@ -86,17 +86,35 @@
|
|
|
86
86
|
"catalog.errors.id_required": "Datensatzkennung ist erforderlich.",
|
|
87
87
|
"catalog.errors.organization_required": "Organisationskontext ist erforderlich.",
|
|
88
88
|
"catalog.errors.tenant_required": "Mandantenkontext ist erforderlich.",
|
|
89
|
+
"catalog.merchandising_assistant.agents.merchandising.description": "Texte entwerfen, Attribute vereinheitlichen und Preisänderungen für die aktuelle Auswahl vorschlagen.",
|
|
90
|
+
"catalog.merchandising_assistant.agents.merchandising.label": "Merchandising-Assistent",
|
|
89
91
|
"catalog.merchandising_assistant.context.filteredByCategory": "Filtered by category",
|
|
92
|
+
"catalog.merchandising_assistant.context.matchingProducts": "{count} Produkte in der Ansicht",
|
|
93
|
+
"catalog.merchandising_assistant.context.selectedProducts": "{count} Produkte ausgewählt",
|
|
90
94
|
"catalog.merchandising_assistant.context.tags": "{count} tags",
|
|
91
95
|
"catalog.merchandising_assistant.dock.subtitle": "Catalog",
|
|
92
96
|
"catalog.merchandising_assistant.popover.heading": "AI assistants",
|
|
93
97
|
"catalog.merchandising_assistant.sheet.composerPlaceholder": "Frage nach Beschreibungen, Attributen, Titeln oder Preisideen…",
|
|
94
98
|
"catalog.merchandising_assistant.sheet.description": "Nur-Lese-Demo. Schlägt Beschreibungen, Attribute, Titel und Preisanpassungen für die aktuelle Auswahl vor. In dieser Phase werden keine Änderungen angewendet.",
|
|
99
|
+
"catalog.merchandising_assistant.sheet.descriptionWithSelection": "Arbeit mit {count} ausgewählten Produkten. Frag nach Beschreibungen, Attributextraktion, Titelvorschlägen oder Preisanalysen.",
|
|
95
100
|
"catalog.merchandising_assistant.sheet.dock": "Dock to side",
|
|
96
101
|
"catalog.merchandising_assistant.sheet.selectionPill": "Bearbeitet {count} Produkte",
|
|
97
102
|
"catalog.merchandising_assistant.sheet.title": "Katalog-Merchandising-Assistent",
|
|
103
|
+
"catalog.merchandising_assistant.sheet.welcomeDescriptionAll": "Wähle Produkte für gezielte Aktionen aus oder erkunde deinen Katalog:",
|
|
104
|
+
"catalog.merchandising_assistant.sheet.welcomeDescriptionSelection": "Bereit für deine {count} ausgewählten Produkte. Probiere eine dieser Aktionen:",
|
|
105
|
+
"catalog.merchandising_assistant.sheet.welcomeTitle": "Merchandising-Assistent",
|
|
106
|
+
"catalog.merchandising_assistant.suggestions.analyzeAttributes": "Attributabdeckung analysieren",
|
|
107
|
+
"catalog.merchandising_assistant.suggestions.browseProducts": "Zeig mir einen Überblick über meinen Produktkatalog",
|
|
108
|
+
"catalog.merchandising_assistant.suggestions.draftDescriptions": "Produktbeschreibungen für ausgewählte Artikel entwerfen",
|
|
109
|
+
"catalog.merchandising_assistant.suggestions.extractAttributes": "Attribute aus Beschreibungen extrahieren",
|
|
110
|
+
"catalog.merchandising_assistant.suggestions.findMissingDescriptions": "Produkte ohne Beschreibung finden",
|
|
111
|
+
"catalog.merchandising_assistant.suggestions.priceAdjustments": "Preisanpassungen vorschlagen",
|
|
112
|
+
"catalog.merchandising_assistant.suggestions.pricingOverview": "Preisverteilung anzeigen",
|
|
113
|
+
"catalog.merchandising_assistant.suggestions.showStats": "Katalogübersicht anzeigen",
|
|
114
|
+
"catalog.merchandising_assistant.suggestions.titleVariants": "Titelvarianten für SEO generieren",
|
|
98
115
|
"catalog.merchandising_assistant.trigger.ariaLabel": "KI-Merchandising-Assistent öffnen",
|
|
99
116
|
"catalog.merchandising_assistant.trigger.label": "AI",
|
|
117
|
+
"catalog.merchandising_assistant.trigger.moreAgentsAriaLabel": "KI-Assistenten auswählen",
|
|
100
118
|
"catalog.module.description": "Verwalte wiederverwendbare Produkte, Varianten und Preise für Vertriebsdokumente.",
|
|
101
119
|
"catalog.module.title": "Produktkatalog",
|
|
102
120
|
"catalog.nav.group": "Katalog",
|
|
@@ -86,17 +86,35 @@
|
|
|
86
86
|
"catalog.errors.id_required": "Record identifier is required.",
|
|
87
87
|
"catalog.errors.organization_required": "Organization context is required.",
|
|
88
88
|
"catalog.errors.tenant_required": "Tenant context is required.",
|
|
89
|
+
"catalog.merchandising_assistant.agents.merchandising.description": "Draft copy, normalize attributes, and propose price changes for the current selection.",
|
|
90
|
+
"catalog.merchandising_assistant.agents.merchandising.label": "Merchandising Assistant",
|
|
89
91
|
"catalog.merchandising_assistant.context.filteredByCategory": "Filtered by category",
|
|
92
|
+
"catalog.merchandising_assistant.context.matchingProducts": "{count} products in view",
|
|
93
|
+
"catalog.merchandising_assistant.context.selectedProducts": "{count} products selected",
|
|
90
94
|
"catalog.merchandising_assistant.context.tags": "{count} tags",
|
|
91
95
|
"catalog.merchandising_assistant.dock.subtitle": "Catalog",
|
|
92
96
|
"catalog.merchandising_assistant.popover.heading": "AI assistants",
|
|
93
97
|
"catalog.merchandising_assistant.sheet.composerPlaceholder": "Ask for descriptions, attributes, titles, or price ideas...",
|
|
94
98
|
"catalog.merchandising_assistant.sheet.description": "Read-only demo. Proposes descriptions, attributes, titles, and price adjustments for the current selection. No writes are applied in this phase.",
|
|
99
|
+
"catalog.merchandising_assistant.sheet.descriptionWithSelection": "Working with {count} selected products. Ask for descriptions, attribute extraction, title suggestions, or pricing analysis.",
|
|
95
100
|
"catalog.merchandising_assistant.sheet.dock": "Dock to side",
|
|
96
101
|
"catalog.merchandising_assistant.sheet.selectionPill": "Acting on {count} products",
|
|
97
102
|
"catalog.merchandising_assistant.sheet.title": "Catalog merchandising assistant",
|
|
103
|
+
"catalog.merchandising_assistant.sheet.welcomeDescriptionAll": "Select products for targeted actions, or explore your catalog:",
|
|
104
|
+
"catalog.merchandising_assistant.sheet.welcomeDescriptionSelection": "Ready to work with your {count} selected products. Try one of these:",
|
|
105
|
+
"catalog.merchandising_assistant.sheet.welcomeTitle": "Merchandising Assistant",
|
|
106
|
+
"catalog.merchandising_assistant.suggestions.analyzeAttributes": "Analyze attribute coverage",
|
|
107
|
+
"catalog.merchandising_assistant.suggestions.browseProducts": "Show me an overview of my product catalog",
|
|
108
|
+
"catalog.merchandising_assistant.suggestions.draftDescriptions": "Draft product descriptions for selected items",
|
|
109
|
+
"catalog.merchandising_assistant.suggestions.extractAttributes": "Extract attributes from descriptions",
|
|
110
|
+
"catalog.merchandising_assistant.suggestions.findMissingDescriptions": "Find products with missing descriptions",
|
|
111
|
+
"catalog.merchandising_assistant.suggestions.priceAdjustments": "Suggest price adjustments",
|
|
112
|
+
"catalog.merchandising_assistant.suggestions.pricingOverview": "Show pricing distribution",
|
|
113
|
+
"catalog.merchandising_assistant.suggestions.showStats": "Show catalog overview",
|
|
114
|
+
"catalog.merchandising_assistant.suggestions.titleVariants": "Generate title variants for SEO",
|
|
98
115
|
"catalog.merchandising_assistant.trigger.ariaLabel": "Open AI merchandising assistant",
|
|
99
116
|
"catalog.merchandising_assistant.trigger.label": "AI",
|
|
117
|
+
"catalog.merchandising_assistant.trigger.moreAgentsAriaLabel": "Choose an AI assistant",
|
|
100
118
|
"catalog.module.description": "Manage reusable products, variants, and pricing for sales documents.",
|
|
101
119
|
"catalog.module.title": "Product Catalog",
|
|
102
120
|
"catalog.nav.group": "Catalog",
|
|
@@ -86,17 +86,35 @@
|
|
|
86
86
|
"catalog.errors.id_required": "Se requiere el identificador del registro.",
|
|
87
87
|
"catalog.errors.organization_required": "Se requiere el contexto de la organización.",
|
|
88
88
|
"catalog.errors.tenant_required": "Se requiere el contexto del inquilino.",
|
|
89
|
+
"catalog.merchandising_assistant.agents.merchandising.description": "Redacta textos, normaliza atributos y propone cambios de precio para la selección actual.",
|
|
90
|
+
"catalog.merchandising_assistant.agents.merchandising.label": "Asistente de Merchandising",
|
|
89
91
|
"catalog.merchandising_assistant.context.filteredByCategory": "Filtered by category",
|
|
92
|
+
"catalog.merchandising_assistant.context.matchingProducts": "{count} productos en la vista",
|
|
93
|
+
"catalog.merchandising_assistant.context.selectedProducts": "{count} productos seleccionados",
|
|
90
94
|
"catalog.merchandising_assistant.context.tags": "{count} tags",
|
|
91
95
|
"catalog.merchandising_assistant.dock.subtitle": "Catalog",
|
|
92
96
|
"catalog.merchandising_assistant.popover.heading": "AI assistants",
|
|
93
97
|
"catalog.merchandising_assistant.sheet.composerPlaceholder": "Pide descripciones, atributos, títulos o ideas de precios…",
|
|
94
98
|
"catalog.merchandising_assistant.sheet.description": "Demo de solo lectura. Propone descripciones, atributos, títulos y ajustes de precios para la selección actual. En esta fase no se aplican cambios.",
|
|
99
|
+
"catalog.merchandising_assistant.sheet.descriptionWithSelection": "Trabajando con {count} productos seleccionados. Pide descripciones, extracción de atributos, sugerencias de título o análisis de precios.",
|
|
95
100
|
"catalog.merchandising_assistant.sheet.dock": "Dock to side",
|
|
96
101
|
"catalog.merchandising_assistant.sheet.selectionPill": "Actuando sobre {count} productos",
|
|
97
102
|
"catalog.merchandising_assistant.sheet.title": "Asistente de merchandising del catálogo",
|
|
103
|
+
"catalog.merchandising_assistant.sheet.welcomeDescriptionAll": "Selecciona productos para acciones específicas o explora tu catálogo:",
|
|
104
|
+
"catalog.merchandising_assistant.sheet.welcomeDescriptionSelection": "Listo para trabajar con tus {count} productos seleccionados. Prueba una de estas opciones:",
|
|
105
|
+
"catalog.merchandising_assistant.sheet.welcomeTitle": "Asistente de Merchandising",
|
|
106
|
+
"catalog.merchandising_assistant.suggestions.analyzeAttributes": "Analizar la cobertura de atributos",
|
|
107
|
+
"catalog.merchandising_assistant.suggestions.browseProducts": "Muéstrame un resumen de mi catálogo de productos",
|
|
108
|
+
"catalog.merchandising_assistant.suggestions.draftDescriptions": "Redactar descripciones de producto para los elementos seleccionados",
|
|
109
|
+
"catalog.merchandising_assistant.suggestions.extractAttributes": "Extraer atributos de las descripciones",
|
|
110
|
+
"catalog.merchandising_assistant.suggestions.findMissingDescriptions": "Encontrar productos sin descripción",
|
|
111
|
+
"catalog.merchandising_assistant.suggestions.priceAdjustments": "Sugerir ajustes de precio",
|
|
112
|
+
"catalog.merchandising_assistant.suggestions.pricingOverview": "Mostrar la distribución de precios",
|
|
113
|
+
"catalog.merchandising_assistant.suggestions.showStats": "Mostrar resumen del catálogo",
|
|
114
|
+
"catalog.merchandising_assistant.suggestions.titleVariants": "Generar variantes de título para SEO",
|
|
98
115
|
"catalog.merchandising_assistant.trigger.ariaLabel": "Abrir el asistente de merchandising IA",
|
|
99
116
|
"catalog.merchandising_assistant.trigger.label": "AI",
|
|
117
|
+
"catalog.merchandising_assistant.trigger.moreAgentsAriaLabel": "Elegir un asistente de IA",
|
|
100
118
|
"catalog.module.description": "Administra productos reutilizables, variantes y precios para los documentos de ventas.",
|
|
101
119
|
"catalog.module.title": "Catálogo de productos",
|
|
102
120
|
"catalog.nav.group": "Catálogo",
|
|
@@ -86,17 +86,35 @@
|
|
|
86
86
|
"catalog.errors.id_required": "Wymagany jest identyfikator rekordu.",
|
|
87
87
|
"catalog.errors.organization_required": "Wymagany jest kontekst organizacji.",
|
|
88
88
|
"catalog.errors.tenant_required": "Wymagany jest kontekst dzierżawy.",
|
|
89
|
+
"catalog.merchandising_assistant.agents.merchandising.description": "Przygotuj treści, uporządkuj atrybuty i zaproponuj zmiany cen dla bieżącego wyboru.",
|
|
90
|
+
"catalog.merchandising_assistant.agents.merchandising.label": "Asystent merchandisingu",
|
|
89
91
|
"catalog.merchandising_assistant.context.filteredByCategory": "Filtrowane po kategorii",
|
|
92
|
+
"catalog.merchandising_assistant.context.matchingProducts": "{count} produktów w widoku",
|
|
93
|
+
"catalog.merchandising_assistant.context.selectedProducts": "Wybrano {count} produktów",
|
|
90
94
|
"catalog.merchandising_assistant.context.tags": "Tagi: {count}",
|
|
91
95
|
"catalog.merchandising_assistant.dock.subtitle": "Katalog",
|
|
92
96
|
"catalog.merchandising_assistant.popover.heading": "Asystenci AI",
|
|
93
97
|
"catalog.merchandising_assistant.sheet.composerPlaceholder": "Poproś o opisy, atrybuty, tytuły lub propozycje cen…",
|
|
94
98
|
"catalog.merchandising_assistant.sheet.description": "Demo tylko do odczytu. Proponuje opisy, atrybuty, tytuły i korekty cen dla bieżącego wyboru. Na tym etapie żadne zmiany nie są zapisywane.",
|
|
99
|
+
"catalog.merchandising_assistant.sheet.descriptionWithSelection": "Praca na {count} wybranych produktach. Poproś o opisy, wyodrębnienie atrybutów, propozycje tytułów lub analizę cen.",
|
|
95
100
|
"catalog.merchandising_assistant.sheet.dock": "Przypnij z boku",
|
|
96
101
|
"catalog.merchandising_assistant.sheet.selectionPill": "Działa na {count} produktach",
|
|
97
102
|
"catalog.merchandising_assistant.sheet.title": "Asystent merchandisingu katalogu",
|
|
103
|
+
"catalog.merchandising_assistant.sheet.welcomeDescriptionAll": "Wybierz produkty, aby wykonać na nich działania, albo przejrzyj swój katalog:",
|
|
104
|
+
"catalog.merchandising_assistant.sheet.welcomeDescriptionSelection": "Gotowe do pracy na Twoich {count} wybranych produktach. Wypróbuj jedną z opcji:",
|
|
105
|
+
"catalog.merchandising_assistant.sheet.welcomeTitle": "Asystent merchandisingu",
|
|
106
|
+
"catalog.merchandising_assistant.suggestions.analyzeAttributes": "Przeanalizuj pokrycie atrybutów",
|
|
107
|
+
"catalog.merchandising_assistant.suggestions.browseProducts": "Pokaż mi przegląd mojego katalogu produktów",
|
|
108
|
+
"catalog.merchandising_assistant.suggestions.draftDescriptions": "Przygotuj opisy produktów dla wybranych pozycji",
|
|
109
|
+
"catalog.merchandising_assistant.suggestions.extractAttributes": "Wyodrębnij atrybuty z opisów",
|
|
110
|
+
"catalog.merchandising_assistant.suggestions.findMissingDescriptions": "Znajdź produkty bez opisów",
|
|
111
|
+
"catalog.merchandising_assistant.suggestions.priceAdjustments": "Zaproponuj korekty cen",
|
|
112
|
+
"catalog.merchandising_assistant.suggestions.pricingOverview": "Pokaż rozkład cen",
|
|
113
|
+
"catalog.merchandising_assistant.suggestions.showStats": "Pokaż przegląd katalogu",
|
|
114
|
+
"catalog.merchandising_assistant.suggestions.titleVariants": "Wygeneruj warianty tytułów pod SEO",
|
|
98
115
|
"catalog.merchandising_assistant.trigger.ariaLabel": "Otwórz asystenta merchandisingu AI",
|
|
99
116
|
"catalog.merchandising_assistant.trigger.label": "AI",
|
|
117
|
+
"catalog.merchandising_assistant.trigger.moreAgentsAriaLabel": "Wybierz asystenta AI",
|
|
100
118
|
"catalog.module.description": "Zarządzaj produktami, wariantami i cennikami wykorzystywanymi w sprzedaży.",
|
|
101
119
|
"catalog.module.title": "Katalog produktów",
|
|
102
120
|
"catalog.nav.group": "Katalog",
|
|
@@ -90,6 +90,7 @@
|
|
|
90
90
|
"customers.ai.actions.translate": "Translate",
|
|
91
91
|
"customers.ai.comingSoon": "Coming soon",
|
|
92
92
|
"customers.ai.prefix": "KI:",
|
|
93
|
+
"customers.ai_assistant.agents.account.description": "Personen, Unternehmen, Deals und Aktivitäten erkunden.",
|
|
93
94
|
"customers.ai_assistant.agents.account.label": "CRM Assistant",
|
|
94
95
|
"customers.ai_assistant.context.matchingDeals": "{count} Deals in der Ansicht",
|
|
95
96
|
"customers.ai_assistant.context.matchingPeople": "{count} contacts in view",
|
|
@@ -104,31 +105,47 @@
|
|
|
104
105
|
"customers.ai_assistant.popover.heading": "AI assistants",
|
|
105
106
|
"customers.ai_assistant.sheet.composerPlaceholder": "Frage nach Personen, Firmen, Deals...",
|
|
106
107
|
"customers.ai_assistant.sheet.description": "Read-only-Assistent. Fragen zu Personen, Firmen, Deals und Aktivitäten im Umfang dieser Liste.",
|
|
108
|
+
"customers.ai_assistant.sheet.descriptionWithSelection": "Arbeit mit {count} ausgewählten Kontakten. Frag nach deren Daten, Deals, Unternehmen und Aktivitäten.",
|
|
109
|
+
"customers.ai_assistant.sheet.descriptionWithSelectionCompanies": "Arbeit mit {count} ausgewählten Unternehmen. Frag nach deren Deals, Kontakten und Aktivitäten.",
|
|
107
110
|
"customers.ai_assistant.sheet.descriptionWithSelectionDeals": "Arbeit mit {count} ausgewählten Deals. Fragen Sie nach Stage, Wert und Abschlussdaten.",
|
|
108
111
|
"customers.ai_assistant.sheet.dock": "Dock to side",
|
|
109
112
|
"customers.ai_assistant.sheet.selectionPill": "Wirkt auf {count} Ausgewählte",
|
|
110
113
|
"customers.ai_assistant.sheet.title": "Kunden-AI-Assistent",
|
|
114
|
+
"customers.ai_assistant.sheet.welcomeDescriptionAll": "Frag mich alles zu deinen Kunden, Unternehmen und Deals:",
|
|
115
|
+
"customers.ai_assistant.sheet.welcomeDescriptionAllCompanies": "Frag mich alles zu deinen Unternehmen, Deals und Aktivitäten:",
|
|
111
116
|
"customers.ai_assistant.sheet.welcomeDescriptionAllDeals": "Fragen Sie nach Deals, Pipeline oder Abschlussdaten:",
|
|
117
|
+
"customers.ai_assistant.sheet.welcomeDescriptionSelection": "Bereit, deine {count} ausgewählten Kontakte zu erkunden:",
|
|
118
|
+
"customers.ai_assistant.sheet.welcomeDescriptionSelectionCompanies": "Bereit, deine {count} ausgewählten Unternehmen zu erkunden:",
|
|
112
119
|
"customers.ai_assistant.sheet.welcomeDescriptionSelectionDeals": "Bereit, Ihre {count} ausgewählten Deals zu erkunden:",
|
|
113
120
|
"customers.ai_assistant.sheet.welcomeTitle": "CRM Assistant",
|
|
114
121
|
"customers.ai_assistant.suggestions.activityOverview": "Activity overview",
|
|
115
122
|
"customers.ai_assistant.suggestions.atRiskSelectedDeals": "Ausgewählte gefährdete Deals",
|
|
123
|
+
"customers.ai_assistant.suggestions.companiesActivityOverview": "Aktivitätsübersicht",
|
|
116
124
|
"customers.ai_assistant.suggestions.companiesForSelectedDeals": "Firmen zu ausgewählten Deals",
|
|
125
|
+
"customers.ai_assistant.suggestions.companiesWithoutContacts": "Unternehmen ohne Kontakte",
|
|
117
126
|
"customers.ai_assistant.suggestions.dealsAtRisk": "Deals mit Verschiebungsrisiko",
|
|
118
127
|
"customers.ai_assistant.suggestions.dealsClosingThisMonth": "Diesen Monat abschließende Deals",
|
|
128
|
+
"customers.ai_assistant.suggestions.dealsForSelectedCompanies": "Deals der ausgewählten Unternehmen anzeigen",
|
|
119
129
|
"customers.ai_assistant.suggestions.findCompanies": "Find related companies",
|
|
120
130
|
"customers.ai_assistant.suggestions.findDeals": "Show deals for selected people",
|
|
131
|
+
"customers.ai_assistant.suggestions.peopleAtSelectedCompanies": "Personen in den ausgewählten Unternehmen auflisten",
|
|
121
132
|
"customers.ai_assistant.suggestions.recentDeals": "Show recent deals",
|
|
133
|
+
"customers.ai_assistant.suggestions.searchCompanies": "Nach einem Unternehmen suchen",
|
|
122
134
|
"customers.ai_assistant.suggestions.searchDeals": "Nach einem Deal suchen",
|
|
123
135
|
"customers.ai_assistant.suggestions.searchPeople": "Search for a contact",
|
|
124
136
|
"customers.ai_assistant.suggestions.summarizeSelected": "Summarize selected contacts",
|
|
137
|
+
"customers.ai_assistant.suggestions.summarizeSelectedCompanies": "Ausgewählte Unternehmen zusammenfassen",
|
|
125
138
|
"customers.ai_assistant.suggestions.summarizeSelectedDeals": "Ausgewählte Deals zusammenfassen",
|
|
126
139
|
"customers.ai_assistant.suggestions.topCompanies": "List top companies",
|
|
140
|
+
"customers.ai_assistant.suggestions.topCompaniesByDeals": "Top-Unternehmen nach Deal-Wert",
|
|
127
141
|
"customers.ai_assistant.suggestions.topDealsByValue": "Top-Deals nach Wert",
|
|
128
142
|
"customers.ai_assistant.suggestions.totalOpenDealValue": "Gesamtwert offener Deals",
|
|
129
143
|
"customers.ai_assistant.trigger.ariaLabel": "KI-Assistent für Personen öffnen",
|
|
144
|
+
"customers.ai_assistant.trigger.ariaLabelCompanies": "KI-Assistenten für Unternehmen öffnen",
|
|
130
145
|
"customers.ai_assistant.trigger.ariaLabelDeals": "KI-Assistent für Deals öffnen",
|
|
131
146
|
"customers.ai_assistant.trigger.label": "AI",
|
|
147
|
+
"customers.ai_assistant.trigger.moreAgentsAriaLabel": "KI-Assistenten auswählen",
|
|
148
|
+
"customers.assignableStaff.forbidden": "Unzureichende Berechtigungen zum Laden zuweisbarer Mitarbeiter.",
|
|
132
149
|
"customers.assignableStaff.loadError": "Teammitglieder konnten nicht geladen werden. Prüfen Sie Ihre Berechtigungen und versuchen Sie es erneut.",
|
|
133
150
|
"customers.audit.activities.create": "Aktivität erstellen",
|
|
134
151
|
"customers.audit.activities.delete": "Aktivität löschen",
|
|
@@ -747,6 +764,7 @@
|
|
|
747
764
|
"customers.companies.list.bulkDelete.failedGroup": "{count} Unternehmen konnten nicht gelöscht werden: {message}",
|
|
748
765
|
"customers.companies.list.bulkDelete.operationLabel": "{count} Unternehmen löschen",
|
|
749
766
|
"customers.companies.list.bulkDelete.partial": "{deleted} von {total} Unternehmen gelöscht; {failed} fehlgeschlagen",
|
|
767
|
+
"customers.companies.list.bulkDelete.progressDescription": "{count} Unternehmen zum Löschen ausgewählt",
|
|
750
768
|
"customers.companies.list.bulkDelete.progressName": "Ausgewählte Unternehmen löschen",
|
|
751
769
|
"customers.companies.list.bulkDelete.success": "{count} companies deleted",
|
|
752
770
|
"customers.companies.list.bulkDelete.title": "Delete {count} companies?",
|
|
@@ -885,10 +903,24 @@
|
|
|
885
903
|
"customers.countries.it": "Italien",
|
|
886
904
|
"customers.countries.pl": "Polen",
|
|
887
905
|
"customers.countries.us": "Vereinigte Staaten",
|
|
906
|
+
"customers.deal_analyzer.context.dealsInView": "{count} Deals in der Ansicht",
|
|
907
|
+
"customers.deal_analyzer.context.selectedDeals": "{count} Deals ausgewählt",
|
|
888
908
|
"customers.deal_analyzer.dock.subtitle": "Deals",
|
|
909
|
+
"customers.deal_analyzer.sheet.composerPlaceholder": "Ins Stocken geratene Deals analysieren, Phasenwechsel vorschlagen...",
|
|
910
|
+
"customers.deal_analyzer.sheet.description": "Mehrstufiger Analyzer für den Deal-Zustand. Erkennt stockende Deals und schlägt Phasenwechsel zur Freigabe vor.",
|
|
911
|
+
"customers.deal_analyzer.sheet.descriptionWithSelection": "Analyse von {count} ausgewählten Deals hinsichtlich Pipeline-Zustand und Phasenwechsel-Vorschlägen.",
|
|
889
912
|
"customers.deal_analyzer.sheet.dock": "Seitlich andocken",
|
|
913
|
+
"customers.deal_analyzer.sheet.selectionPill": "Aktion für {count} Deals",
|
|
890
914
|
"customers.deal_analyzer.sheet.title": "Deal-Analyse",
|
|
915
|
+
"customers.deal_analyzer.sheet.welcomeDescriptionAll": "Analysiere den Zustand der Pipeline und schlage Phasenwechsel vor:",
|
|
916
|
+
"customers.deal_analyzer.sheet.welcomeDescriptionSelection": "Bereit, deine {count} ausgewählten Deals zu analysieren:",
|
|
891
917
|
"customers.deal_analyzer.sheet.welcomeTitle": "Deal-Analyse",
|
|
918
|
+
"customers.deal_analyzer.suggestions.analyzeSelected": "Ausgewählte Deals analysieren",
|
|
919
|
+
"customers.deal_analyzer.suggestions.analyzeStalledDeals": "Ins Stocken geratene Deals analysieren",
|
|
920
|
+
"customers.deal_analyzer.suggestions.overviewByStage": "Überblick über den Deal-Zustand",
|
|
921
|
+
"customers.deal_analyzer.suggestions.proposeStageMove": "Phasenwechsel für ausgewählte Deals vorschlagen",
|
|
922
|
+
"customers.deal_analyzer.suggestions.showAtRiskPipeline": "Gefährdete Pipeline anzeigen",
|
|
923
|
+
"customers.deal_analyzer.trigger.ariaLabel": "KI-Agent zur Deal-Analyse öffnen",
|
|
892
924
|
"customers.deals.create.associations.companiesPlaceholder": "Unternehmen nach Name oder Domain suchen…",
|
|
893
925
|
"customers.deals.create.associations.peoplePlaceholder": "Personen nach Name oder E-Mail suchen…",
|
|
894
926
|
"customers.deals.create.back": "Zurück zu Deals",
|
|
@@ -973,7 +1005,10 @@
|
|
|
973
1005
|
"customers.deals.detail.highlights": "Schlüsselkennzahlen",
|
|
974
1006
|
"customers.deals.detail.linkedEntities.clearAll": "Clear",
|
|
975
1007
|
"customers.deals.detail.linkedEntities.clearVisible": "Sichtbare löschen",
|
|
1008
|
+
"customers.deals.detail.linkedEntities.confirmButton": "{{entity}} verknüpfen",
|
|
1009
|
+
"customers.deals.detail.linkedEntities.dialogSubtitle": "Einen bestehenden Datensatz vom Typ {{entity}} mit diesem Deal verknüpfen",
|
|
976
1010
|
"customers.deals.detail.linkedEntities.dialogTitle": "Manage linked {{entity}}",
|
|
1011
|
+
"customers.deals.detail.linkedEntities.dialogTitleShort": "{{entity}} verknüpfen",
|
|
977
1012
|
"customers.deals.detail.linkedEntities.empty": "No linked records yet.",
|
|
978
1013
|
"customers.deals.detail.linkedEntities.loadMore": "Load more",
|
|
979
1014
|
"customers.deals.detail.linkedEntities.loading": "Loading linked records…",
|
|
@@ -986,6 +1021,7 @@
|
|
|
986
1021
|
"customers.deals.detail.linkedEntities.searchAll": "Search all {{entity}}…",
|
|
987
1022
|
"customers.deals.detail.linkedEntities.searchResults": "Search results",
|
|
988
1023
|
"customers.deals.detail.linkedEntities.searching": "Searching…",
|
|
1024
|
+
"customers.deals.detail.linkedEntities.sectionLabel": "PASSENDE {{entity}}",
|
|
989
1025
|
"customers.deals.detail.linkedEntities.selectVisible": "Sichtbare auswählen",
|
|
990
1026
|
"customers.deals.detail.linkedEntities.selectedTitle": "Selected {{entity}}",
|
|
991
1027
|
"customers.deals.detail.linkedEntities.summary": "{{count}} linked {{entity}}",
|
|
@@ -1067,6 +1103,7 @@
|
|
|
1067
1103
|
"customers.deals.detail.title": "Deal-Details",
|
|
1068
1104
|
"customers.deals.detail.unsavedCancel": "Keep editing",
|
|
1069
1105
|
"customers.deals.detail.unsavedConfirm": "Discard changes",
|
|
1106
|
+
"customers.deals.detail.unsavedDescription": "Du hast ungespeicherte Änderungen an diesem Deal. Speichere sie zuerst oder fahre fort, um sie zu verwerfen.",
|
|
1070
1107
|
"customers.deals.detail.unsavedTitle": "Discard unsaved changes?",
|
|
1071
1108
|
"customers.deals.detail.untitled": "Unbenannter Deal",
|
|
1072
1109
|
"customers.deals.detail.updateSuccess": "Deal updated.",
|
|
@@ -1374,6 +1411,7 @@
|
|
|
1374
1411
|
"customers.deals.list.bulkDelete.failedGroup": "{count} Deals konnten nicht gelöscht werden: {message}",
|
|
1375
1412
|
"customers.deals.list.bulkDelete.operationLabel": "{count} Deals löschen",
|
|
1376
1413
|
"customers.deals.list.bulkDelete.partial": "{deleted} von {total} Deals gelöscht; {failed} fehlgeschlagen",
|
|
1414
|
+
"customers.deals.list.bulkDelete.progressDescription": "{count} Deals zum Löschen ausgewählt",
|
|
1377
1415
|
"customers.deals.list.bulkDelete.progressName": "Ausgewählte Deals löschen",
|
|
1378
1416
|
"customers.deals.list.bulkDelete.success": "{count} deals deleted",
|
|
1379
1417
|
"customers.deals.list.bulkDelete.title": "Delete {count} deals?",
|
|
@@ -1646,6 +1684,7 @@
|
|
|
1646
1684
|
"customers.linking.deal.addNew": "Neuer Deal",
|
|
1647
1685
|
"customers.linking.deal.confirmButton": "Deal verknüpfen",
|
|
1648
1686
|
"customers.linking.deal.dialogDescription": "Bestehende Deals suchen, um sie mit diesem Datensatz zu verknüpfen.",
|
|
1687
|
+
"customers.linking.deal.dialogSubtitle": "Einen bestehenden Deal mit diesem Datensatz verknüpfen",
|
|
1649
1688
|
"customers.linking.deal.dialogTitle": "Deals verknüpfen",
|
|
1650
1689
|
"customers.linking.deal.orphanWarning": "Dieser Deal hat keine weiteren verknüpften Objekte. Wird er später entfernt, ist er nicht mehr auffindbar.",
|
|
1651
1690
|
"customers.linking.deal.orphanWarningTitle": "Deal ohne Unternehmen",
|
|
@@ -1660,8 +1699,11 @@
|
|
|
1660
1699
|
"customers.linking.pagination.previous": "Vorherige Seite",
|
|
1661
1700
|
"customers.linking.pagination.previousShort": "Zurück",
|
|
1662
1701
|
"customers.linking.person.addNew": "Neue Person",
|
|
1702
|
+
"customers.linking.person.addNewSubtitle": "Das Unternehmen wird automatisch ausgefüllt",
|
|
1663
1703
|
"customers.linking.person.confirmButton": "Person verknüpfen",
|
|
1664
1704
|
"customers.linking.person.dialogDescription": "Bestehende Personen suchen und mit diesem Datensatz verknüpfen, ohne die Seite zu verlassen.",
|
|
1705
|
+
"customers.linking.person.dialogSubtitle": "Einen bestehenden Kontakt mit diesem Unternehmen verknüpfen",
|
|
1706
|
+
"customers.linking.person.dialogSubtitleFor": "Einen bestehenden Kontakt mit {{name}} verknüpfen",
|
|
1665
1707
|
"customers.linking.person.dialogTitle": "Personen verknüpfen",
|
|
1666
1708
|
"customers.linking.person.searchEmpty": "Keine passenden Personen gefunden.",
|
|
1667
1709
|
"customers.linking.person.searchPlaceholder": "Alle Personen durchsuchen…",
|
|
@@ -2290,6 +2332,7 @@
|
|
|
2290
2332
|
"customers.people.list.bulkDelete.failedGroup": "{count} Personen konnten nicht gelöscht werden: {message}",
|
|
2291
2333
|
"customers.people.list.bulkDelete.operationLabel": "{count} Personen löschen",
|
|
2292
2334
|
"customers.people.list.bulkDelete.partial": "{deleted} von {total} Personen gelöscht; {failed} fehlgeschlagen",
|
|
2335
|
+
"customers.people.list.bulkDelete.progressDescription": "{count} Personen zum Löschen ausgewählt",
|
|
2293
2336
|
"customers.people.list.bulkDelete.progressName": "Ausgewählte Personen löschen",
|
|
2294
2337
|
"customers.people.list.bulkDelete.success": "{count} people deleted",
|
|
2295
2338
|
"customers.people.list.bulkDelete.title": "Delete {count} people?",
|
|
@@ -2465,6 +2508,7 @@
|
|
|
2465
2508
|
"customers.roles.dialog.team.unassigned": "No team",
|
|
2466
2509
|
"customers.roles.dialog.teamLabel": "Select a team member",
|
|
2467
2510
|
"customers.roles.dialog.title": "Assign role",
|
|
2511
|
+
"customers.roles.dialog.visibleCount": "{{shown}} von {{total}} Teammitgliedern angezeigt",
|
|
2468
2512
|
"customers.roles.email": "Send email",
|
|
2469
2513
|
"customers.roles.emailUnavailable": "Email unavailable",
|
|
2470
2514
|
"customers.roles.emptySlot": "Not assigned",
|
|
@@ -90,6 +90,7 @@
|
|
|
90
90
|
"customers.ai.actions.translate": "Translate",
|
|
91
91
|
"customers.ai.comingSoon": "Coming soon",
|
|
92
92
|
"customers.ai.prefix": "AI:",
|
|
93
|
+
"customers.ai_assistant.agents.account.description": "Explore people, companies, deals, and activities.",
|
|
93
94
|
"customers.ai_assistant.agents.account.label": "CRM Assistant",
|
|
94
95
|
"customers.ai_assistant.context.matchingDeals": "{count} deals in view",
|
|
95
96
|
"customers.ai_assistant.context.matchingPeople": "{count} contacts in view",
|
|
@@ -104,31 +105,47 @@
|
|
|
104
105
|
"customers.ai_assistant.popover.heading": "AI assistants",
|
|
105
106
|
"customers.ai_assistant.sheet.composerPlaceholder": "Ask about people, companies, deals...",
|
|
106
107
|
"customers.ai_assistant.sheet.description": "Read-only assistant. Ask about people, companies, deals, and activities scoped to this list.",
|
|
108
|
+
"customers.ai_assistant.sheet.descriptionWithSelection": "Working with {count} selected contacts. Ask about their details, deals, companies, and activities.",
|
|
109
|
+
"customers.ai_assistant.sheet.descriptionWithSelectionCompanies": "Working with {count} selected companies. Ask about their deals, contacts, and activities.",
|
|
107
110
|
"customers.ai_assistant.sheet.descriptionWithSelectionDeals": "Working with {count} selected deals. Ask about their stage, value, and close dates.",
|
|
108
111
|
"customers.ai_assistant.sheet.dock": "Dock to side",
|
|
109
112
|
"customers.ai_assistant.sheet.selectionPill": "Acting on {count} selected",
|
|
110
113
|
"customers.ai_assistant.sheet.title": "Customers AI assistant",
|
|
114
|
+
"customers.ai_assistant.sheet.welcomeDescriptionAll": "Ask me anything about your customers, companies, and deals:",
|
|
115
|
+
"customers.ai_assistant.sheet.welcomeDescriptionAllCompanies": "Ask me anything about your companies, deals, and activities:",
|
|
111
116
|
"customers.ai_assistant.sheet.welcomeDescriptionAllDeals": "Ask about deals, pipeline, or close dates:",
|
|
117
|
+
"customers.ai_assistant.sheet.welcomeDescriptionSelection": "Ready to explore your {count} selected contacts:",
|
|
118
|
+
"customers.ai_assistant.sheet.welcomeDescriptionSelectionCompanies": "Ready to explore your {count} selected companies:",
|
|
112
119
|
"customers.ai_assistant.sheet.welcomeDescriptionSelectionDeals": "Ready to explore your {count} selected deals:",
|
|
113
120
|
"customers.ai_assistant.sheet.welcomeTitle": "CRM Assistant",
|
|
114
121
|
"customers.ai_assistant.suggestions.activityOverview": "Activity overview",
|
|
115
122
|
"customers.ai_assistant.suggestions.atRiskSelectedDeals": "Selected deals at risk",
|
|
123
|
+
"customers.ai_assistant.suggestions.companiesActivityOverview": "Activity overview",
|
|
116
124
|
"customers.ai_assistant.suggestions.companiesForSelectedDeals": "Companies on selected deals",
|
|
125
|
+
"customers.ai_assistant.suggestions.companiesWithoutContacts": "Companies missing contacts",
|
|
117
126
|
"customers.ai_assistant.suggestions.dealsAtRisk": "Deals at risk of slipping",
|
|
118
127
|
"customers.ai_assistant.suggestions.dealsClosingThisMonth": "Deals closing this month",
|
|
128
|
+
"customers.ai_assistant.suggestions.dealsForSelectedCompanies": "Show deals for selected companies",
|
|
119
129
|
"customers.ai_assistant.suggestions.findCompanies": "Find related companies",
|
|
120
130
|
"customers.ai_assistant.suggestions.findDeals": "Show deals for selected people",
|
|
131
|
+
"customers.ai_assistant.suggestions.peopleAtSelectedCompanies": "List people at selected companies",
|
|
121
132
|
"customers.ai_assistant.suggestions.recentDeals": "Show recent deals",
|
|
133
|
+
"customers.ai_assistant.suggestions.searchCompanies": "Search for a company",
|
|
122
134
|
"customers.ai_assistant.suggestions.searchDeals": "Search for a deal",
|
|
123
135
|
"customers.ai_assistant.suggestions.searchPeople": "Search for a contact",
|
|
124
136
|
"customers.ai_assistant.suggestions.summarizeSelected": "Summarize selected contacts",
|
|
137
|
+
"customers.ai_assistant.suggestions.summarizeSelectedCompanies": "Summarize selected companies",
|
|
125
138
|
"customers.ai_assistant.suggestions.summarizeSelectedDeals": "Summarize selected deals",
|
|
126
139
|
"customers.ai_assistant.suggestions.topCompanies": "List top companies",
|
|
140
|
+
"customers.ai_assistant.suggestions.topCompaniesByDeals": "Top companies by deal value",
|
|
127
141
|
"customers.ai_assistant.suggestions.topDealsByValue": "Top deals by value",
|
|
128
142
|
"customers.ai_assistant.suggestions.totalOpenDealValue": "Total open deal value",
|
|
129
143
|
"customers.ai_assistant.trigger.ariaLabel": "Open AI assistant for people",
|
|
144
|
+
"customers.ai_assistant.trigger.ariaLabelCompanies": "Open AI assistant for companies",
|
|
130
145
|
"customers.ai_assistant.trigger.ariaLabelDeals": "Open AI assistant for deals",
|
|
131
146
|
"customers.ai_assistant.trigger.label": "AI",
|
|
147
|
+
"customers.ai_assistant.trigger.moreAgentsAriaLabel": "Choose an AI assistant",
|
|
148
|
+
"customers.assignableStaff.forbidden": "Insufficient permissions to load assignable staff.",
|
|
132
149
|
"customers.assignableStaff.loadError": "Unable to load team members. Check your permissions and try again.",
|
|
133
150
|
"customers.audit.activities.create": "Create activity",
|
|
134
151
|
"customers.audit.activities.delete": "Delete activity",
|
|
@@ -747,6 +764,7 @@
|
|
|
747
764
|
"customers.companies.list.bulkDelete.failedGroup": "{count} companies could not be deleted: {message}",
|
|
748
765
|
"customers.companies.list.bulkDelete.operationLabel": "Delete {count} companies",
|
|
749
766
|
"customers.companies.list.bulkDelete.partial": "{deleted} of {total} companies deleted; {failed} failed",
|
|
767
|
+
"customers.companies.list.bulkDelete.progressDescription": "{count} companies selected for deletion",
|
|
750
768
|
"customers.companies.list.bulkDelete.progressName": "Delete selected companies",
|
|
751
769
|
"customers.companies.list.bulkDelete.success": "{count} companies deleted",
|
|
752
770
|
"customers.companies.list.bulkDelete.title": "Delete {count} companies?",
|
|
@@ -885,10 +903,24 @@
|
|
|
885
903
|
"customers.countries.it": "Italy",
|
|
886
904
|
"customers.countries.pl": "Poland",
|
|
887
905
|
"customers.countries.us": "United States",
|
|
906
|
+
"customers.deal_analyzer.context.dealsInView": "{count} deals in view",
|
|
907
|
+
"customers.deal_analyzer.context.selectedDeals": "{count} deals selected",
|
|
888
908
|
"customers.deal_analyzer.dock.subtitle": "Deals",
|
|
909
|
+
"customers.deal_analyzer.sheet.composerPlaceholder": "Analyze stalled deals, propose stage moves...",
|
|
910
|
+
"customers.deal_analyzer.sheet.description": "Multi-step deal health analyzer. Surfaces stalled deals and proposes stage transitions for approval.",
|
|
911
|
+
"customers.deal_analyzer.sheet.descriptionWithSelection": "Analyzing {count} selected deals for pipeline health and stage move proposals.",
|
|
889
912
|
"customers.deal_analyzer.sheet.dock": "Dock to side",
|
|
913
|
+
"customers.deal_analyzer.sheet.selectionPill": "Acting on {count} deals",
|
|
890
914
|
"customers.deal_analyzer.sheet.title": "Deal Analyzer",
|
|
915
|
+
"customers.deal_analyzer.sheet.welcomeDescriptionAll": "Analyze deal pipeline health and propose stage moves:",
|
|
916
|
+
"customers.deal_analyzer.sheet.welcomeDescriptionSelection": "Ready to analyze your {count} selected deals:",
|
|
891
917
|
"customers.deal_analyzer.sheet.welcomeTitle": "Deal Analyzer",
|
|
918
|
+
"customers.deal_analyzer.suggestions.analyzeSelected": "Analyze selected deals",
|
|
919
|
+
"customers.deal_analyzer.suggestions.analyzeStalledDeals": "Analyze stalled deals",
|
|
920
|
+
"customers.deal_analyzer.suggestions.overviewByStage": "Deal health overview",
|
|
921
|
+
"customers.deal_analyzer.suggestions.proposeStageMove": "Propose stage moves for selected deals",
|
|
922
|
+
"customers.deal_analyzer.suggestions.showAtRiskPipeline": "Show at-risk pipeline",
|
|
923
|
+
"customers.deal_analyzer.trigger.ariaLabel": "Open Deal Analyzer AI agent",
|
|
892
924
|
"customers.deals.create.associations.companiesPlaceholder": "Search companies by name or domain…",
|
|
893
925
|
"customers.deals.create.associations.peoplePlaceholder": "Search people by name or email…",
|
|
894
926
|
"customers.deals.create.back": "Back to deals",
|
|
@@ -973,7 +1005,10 @@
|
|
|
973
1005
|
"customers.deals.detail.highlights": "Highlights",
|
|
974
1006
|
"customers.deals.detail.linkedEntities.clearAll": "Clear",
|
|
975
1007
|
"customers.deals.detail.linkedEntities.clearVisible": "Clear visible",
|
|
1008
|
+
"customers.deals.detail.linkedEntities.confirmButton": "Link {{entity}}",
|
|
1009
|
+
"customers.deals.detail.linkedEntities.dialogSubtitle": "Link an existing {{entity}} to this deal",
|
|
976
1010
|
"customers.deals.detail.linkedEntities.dialogTitle": "Manage linked {{entity}}",
|
|
1011
|
+
"customers.deals.detail.linkedEntities.dialogTitleShort": "Link {{entity}}",
|
|
977
1012
|
"customers.deals.detail.linkedEntities.empty": "No linked records yet.",
|
|
978
1013
|
"customers.deals.detail.linkedEntities.loadMore": "Load more",
|
|
979
1014
|
"customers.deals.detail.linkedEntities.loading": "Loading linked records…",
|
|
@@ -986,6 +1021,7 @@
|
|
|
986
1021
|
"customers.deals.detail.linkedEntities.searchAll": "Search all {{entity}}…",
|
|
987
1022
|
"customers.deals.detail.linkedEntities.searchResults": "Search results",
|
|
988
1023
|
"customers.deals.detail.linkedEntities.searching": "Searching…",
|
|
1024
|
+
"customers.deals.detail.linkedEntities.sectionLabel": "MATCHING {{entity}}",
|
|
989
1025
|
"customers.deals.detail.linkedEntities.selectVisible": "Select visible",
|
|
990
1026
|
"customers.deals.detail.linkedEntities.selectedTitle": "Selected {{entity}}",
|
|
991
1027
|
"customers.deals.detail.linkedEntities.summary": "{{count}} linked {{entity}}",
|
|
@@ -1067,6 +1103,7 @@
|
|
|
1067
1103
|
"customers.deals.detail.title": "Deal details",
|
|
1068
1104
|
"customers.deals.detail.unsavedCancel": "Keep editing",
|
|
1069
1105
|
"customers.deals.detail.unsavedConfirm": "Discard changes",
|
|
1106
|
+
"customers.deals.detail.unsavedDescription": "You have unsaved edits in this deal. Save them first or continue to discard them.",
|
|
1070
1107
|
"customers.deals.detail.unsavedTitle": "Discard unsaved changes?",
|
|
1071
1108
|
"customers.deals.detail.untitled": "Untitled deal",
|
|
1072
1109
|
"customers.deals.detail.updateSuccess": "Deal updated.",
|
|
@@ -1374,6 +1411,7 @@
|
|
|
1374
1411
|
"customers.deals.list.bulkDelete.failedGroup": "{count} deals could not be deleted: {message}",
|
|
1375
1412
|
"customers.deals.list.bulkDelete.operationLabel": "Delete {count} deals",
|
|
1376
1413
|
"customers.deals.list.bulkDelete.partial": "{deleted} of {total} deals deleted; {failed} failed",
|
|
1414
|
+
"customers.deals.list.bulkDelete.progressDescription": "{count} deals selected for deletion",
|
|
1377
1415
|
"customers.deals.list.bulkDelete.progressName": "Delete selected deals",
|
|
1378
1416
|
"customers.deals.list.bulkDelete.success": "{count} deals deleted",
|
|
1379
1417
|
"customers.deals.list.bulkDelete.title": "Delete {count} deals?",
|
|
@@ -1646,6 +1684,7 @@
|
|
|
1646
1684
|
"customers.linking.deal.addNew": "Add new deal",
|
|
1647
1685
|
"customers.linking.deal.confirmButton": "Link deal",
|
|
1648
1686
|
"customers.linking.deal.dialogDescription": "Search for existing deals to link to this record.",
|
|
1687
|
+
"customers.linking.deal.dialogSubtitle": "Link an existing deal to this record",
|
|
1649
1688
|
"customers.linking.deal.dialogTitle": "Link deals",
|
|
1650
1689
|
"customers.linking.deal.orphanWarning": "This deal has no other linked entities. If you unlink it later, it will become unreachable.",
|
|
1651
1690
|
"customers.linking.deal.orphanWarningTitle": "Deal without company",
|
|
@@ -1660,8 +1699,11 @@
|
|
|
1660
1699
|
"customers.linking.pagination.previous": "Previous page",
|
|
1661
1700
|
"customers.linking.pagination.previousShort": "Previous",
|
|
1662
1701
|
"customers.linking.person.addNew": "Add new person",
|
|
1702
|
+
"customers.linking.person.addNewSubtitle": "Company will be filled in automatically",
|
|
1663
1703
|
"customers.linking.person.confirmButton": "Link person",
|
|
1664
1704
|
"customers.linking.person.dialogDescription": "Search for existing people and attach them to this record without leaving the page.",
|
|
1705
|
+
"customers.linking.person.dialogSubtitle": "Link an existing contact to this company",
|
|
1706
|
+
"customers.linking.person.dialogSubtitleFor": "Link an existing contact to {{name}}",
|
|
1665
1707
|
"customers.linking.person.dialogTitle": "Link people",
|
|
1666
1708
|
"customers.linking.person.searchEmpty": "No matching people found.",
|
|
1667
1709
|
"customers.linking.person.searchPlaceholder": "Search all people…",
|
|
@@ -2290,6 +2332,7 @@
|
|
|
2290
2332
|
"customers.people.list.bulkDelete.failedGroup": "{count} people could not be deleted: {message}",
|
|
2291
2333
|
"customers.people.list.bulkDelete.operationLabel": "Delete {count} people",
|
|
2292
2334
|
"customers.people.list.bulkDelete.partial": "{deleted} of {total} people deleted; {failed} failed",
|
|
2335
|
+
"customers.people.list.bulkDelete.progressDescription": "{count} people selected for deletion",
|
|
2293
2336
|
"customers.people.list.bulkDelete.progressName": "Delete selected people",
|
|
2294
2337
|
"customers.people.list.bulkDelete.success": "{count} people deleted",
|
|
2295
2338
|
"customers.people.list.bulkDelete.title": "Delete {count} people?",
|
|
@@ -2465,6 +2508,7 @@
|
|
|
2465
2508
|
"customers.roles.dialog.team.unassigned": "No team",
|
|
2466
2509
|
"customers.roles.dialog.teamLabel": "Select a team member",
|
|
2467
2510
|
"customers.roles.dialog.title": "Assign role",
|
|
2511
|
+
"customers.roles.dialog.visibleCount": "Showing {{shown}} of {{total}} team members",
|
|
2468
2512
|
"customers.roles.email": "Send email",
|
|
2469
2513
|
"customers.roles.emailUnavailable": "Email unavailable",
|
|
2470
2514
|
"customers.roles.emptySlot": "Not assigned",
|