From d981147ff2f72665fbd886c12e61bc47d6a5a5cf Mon Sep 17 00:00:00 2001 From: GreenEclipse Date: Sun, 16 Aug 2026 18:18:39 +0200 Subject: [PATCH] fix --- apps/api/cmd/seed-a1/category_backfill.go | 26 +- apps/api/internal/catalog/clone.go | 9 + .../internal/processing/category_backfill.go | 61 + apps/api/internal/processing/category_test.go | 79 + .../processing/fix_company_catalog.go | 35 +- apps/api/internal/processing/pipeline.go | 19 +- apps/web/src/lib/admin-orgs.ts | 8 + apps/web/src/lib/i18n/messages/de.ts | 3823 +++--- apps/web/src/lib/i18n/messages/en.ts | 9 +- apps/web/src/lib/i18n/messages/es.ts | 4939 ++++---- apps/web/src/lib/i18n/messages/fr.ts | 6455 +++++----- apps/web/src/lib/i18n/messages/it.ts | 1985 +-- apps/web/src/lib/i18n/messages/ja.ts | 10357 ++++++++-------- apps/web/src/lib/i18n/messages/nl.ts | 1483 +-- apps/web/src/lib/i18n/messages/pl.ts | 6533 +++++----- apps/web/src/lib/i18n/messages/pt.ts | 5351 ++++---- apps/web/src/lib/i18n/messages/sl.ts | 15 +- apps/web/src/routes/admin/users/+page.svelte | 17 +- 18 files changed, 20707 insertions(+), 20497 deletions(-) diff --git a/apps/api/cmd/seed-a1/category_backfill.go b/apps/api/cmd/seed-a1/category_backfill.go index e9fb896..6daae70 100644 --- a/apps/api/cmd/seed-a1/category_backfill.go +++ b/apps/api/cmd/seed-a1/category_backfill.go @@ -10,6 +10,7 @@ import ( "strings" "github.com/descrybe/descrybe-v2/apps/api/internal/billing" + "github.com/descrybe/descrybe-v2/apps/api/internal/processing" "github.com/google/uuid" "github.com/jackc/pgx/v5/pgxpool" ) @@ -34,30 +35,9 @@ type categoryBackfillResult struct { } // backfillMappedCategoriesFromProcessed copies processed_products.category into -// raw_products.mapped_data.category for A1 only. Legacy dumps store category on -// processed rows (unique_id codes); feed mappings never mapped a category field, -// so re-processing without this backfill yields Uncategorized / grey C coverage. +// raw_products.mapped_data.category for A1 only. Delegates to processing. func backfillMappedCategoriesFromProcessed(ctx context.Context, pg *pgxpool.Pool, companyID uuid.UUID) (int64, error) { - ct, err := pg.Exec(ctx, ` - UPDATE raw_products r - SET mapped_data = jsonb_set( - COALESCE(r.mapped_data, '{}'::jsonb), - '{category}', - to_jsonb(p.category), - true - ), - updated_at = now() - FROM processed_products p - WHERE p.raw_product_id = r.id - AND p.company_id = $1 - AND r.company_id = $1 - AND COALESCE(NULLIF(trim(p.category), ''), '') <> '' - AND lower(trim(p.category)) <> 'none' - AND COALESCE(NULLIF(trim(r.mapped_data->>'category'), ''), '') = ''`, companyID) - if err != nil { - return 0, fmt.Errorf("backfill mapped category: %w", err) - } - return ct.RowsAffected(), nil + return processing.BackfillMappedCategoriesFromProcessed(ctx, pg, companyID) } // backfillCategoriesFromMySQLDump streams dump processed_products for the A1 diff --git a/apps/api/internal/catalog/clone.go b/apps/api/internal/catalog/clone.go index 57488a4..6544804 100644 --- a/apps/api/internal/catalog/clone.go +++ b/apps/api/internal/catalog/clone.go @@ -358,6 +358,15 @@ func cloneCompanyCatalog(ctx context.Context, pool *pgxpool.Pool, src, dest uuid } add("raw_products", ct.RowsAffected()) + var mappedWithCat int64 + if err := tx.QueryRow(ctx, ` + SELECT COUNT(*) FROM raw_products + WHERE company_id = $1 + AND COALESCE(NULLIF(trim(mapped_data->>'category'), ''), '') <> ''`, dest).Scan(&mappedWithCat); err != nil { + return nil, fmt.Errorf("count mapped categories: %w", err) + } + add("mapped_with_category", mappedWithCat) + ct, err = tx.Exec(ctx, ` INSERT INTO processed_products ( id, company_id, user_id, product_id, name, category, description, processed_description, diff --git a/apps/api/internal/processing/category_backfill.go b/apps/api/internal/processing/category_backfill.go index 2b84d39..95f5beb 100644 --- a/apps/api/internal/processing/category_backfill.go +++ b/apps/api/internal/processing/category_backfill.go @@ -92,6 +92,67 @@ func BackfillProcessedCategoriesFromMapped(ctx context.Context, pool *pgxpool.Po return out, nil } +// BackfillMappedCategoriesFromProcessed copies processed_products.category into +// raw_products.mapped_data.category when mapped category is empty. Legacy A1 dumps +// often store category only on processed rows; feed mappings do not map category, +// so Fix Catalog / re-seed must push processed → mapped for Products UI coverage. +// Does not invent categories. +func BackfillMappedCategoriesFromProcessed(ctx context.Context, pool *pgxpool.Pool, companyID uuid.UUID) (int64, error) { + if pool == nil { + return 0, fmt.Errorf("mapped category backfill: nil pool") + } + if companyID == uuid.Nil { + return 0, fmt.Errorf("mapped category backfill: empty company id") + } + ct, err := pool.Exec(ctx, ` + UPDATE raw_products r + SET mapped_data = jsonb_set( + COALESCE(r.mapped_data, '{}'::jsonb), + '{category}', + to_jsonb(p.category), + true + ), + updated_at = now() + FROM processed_products p + WHERE p.raw_product_id = r.id + AND p.company_id = $1 + AND r.company_id = $1 + AND COALESCE(NULLIF(trim(p.category), ''), '') <> '' + AND lower(trim(p.category)) <> 'none' + AND COALESCE(NULLIF(trim(r.mapped_data->>'category'), ''), '') = ''`, companyID) + if err != nil { + return 0, fmt.Errorf("mapped category backfill: %w", err) + } + return ct.RowsAffected(), nil +} + +// CountMappedCategoryCoverage returns how many raw_products rows have a non-empty +// mapped_data.category vs empty, plus taxonomy row count for the company. +func CountMappedCategoryCoverage(ctx context.Context, pool *pgxpool.Pool, companyID uuid.UUID) (withCat, withoutCat, taxonomy int64, err error) { + if pool == nil { + return 0, 0, 0, fmt.Errorf("mapped category coverage: nil pool") + } + err = pool.QueryRow(ctx, ` + SELECT + COUNT(*) FILTER ( + WHERE COALESCE(NULLIF(trim(mapped_data->>'category'), ''), '') <> '' + ), + COUNT(*) FILTER ( + WHERE COALESCE(NULLIF(trim(mapped_data->>'category'), ''), '') = '' + ) + FROM raw_products + WHERE company_id = $1`, companyID).Scan(&withCat, &withoutCat) + if err != nil { + return 0, 0, 0, fmt.Errorf("mapped category coverage: %w", err) + } + err = pool.QueryRow(ctx, ` + SELECT COUNT(*) FROM categories WHERE company_id = $1`, companyID).Scan(&taxonomy) + if err != nil { + return withCat, withoutCat, 0, fmt.Errorf("taxonomy count: %w", err) + } + return withCat, withoutCat, taxonomy, nil +} + // CountProcessedCategoryCoverage returns how many processed rows for companyID have // a non-empty category vs empty/"none". func CountProcessedCategoryCoverage(ctx context.Context, pool *pgxpool.Pool, companyID uuid.UUID) (withCat, withoutCat int64, err error) { diff --git a/apps/api/internal/processing/category_test.go b/apps/api/internal/processing/category_test.go index f7dadf6..df87832 100644 --- a/apps/api/internal/processing/category_test.go +++ b/apps/api/internal/processing/category_test.go @@ -470,3 +470,82 @@ func TestBackfillProcessedCategoriesFromMapped(t *testing.T) { t.Fatalf("coverage with=%d without=%d", withCat, withoutCat) } } + +func TestBackfillMappedCategoriesFromProcessed(t *testing.T) { + dsn := os.Getenv("DATABASE_URL") + if dsn == "" { + t.Skip("DATABASE_URL not set") + } + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + pg, err := pgxpool.New(ctx, dsn) + if err != nil { + t.Fatal(err) + } + defer pg.Close() + + companyID := uuid.New() + rawID := uuid.New() + ppID := uuid.New() + gtin := "map-bf-" + companyID.String()[:8] + + if _, err := pg.Exec(ctx, `INSERT INTO companies (id, name) VALUES ($1, $2)`, companyID, "mapped-backfill-test"); err != nil { + t.Fatal(err) + } + defer func() { + _, _ = pg.Exec(context.Background(), `DELETE FROM processed_products WHERE company_id = $1`, companyID) + _, _ = pg.Exec(context.Background(), `DELETE FROM raw_products WHERE company_id = $1`, companyID) + _, _ = pg.Exec(context.Background(), `DELETE FROM companies WHERE id = $1`, companyID) + }() + + if _, err := pg.Exec(ctx, ` + INSERT INTO raw_products (id, company_id, gtin, raw_data, mapped_data, is_processed, processing_status) + VALUES ($1, $2, $3, '{}'::jsonb, '{"name":"Widget"}'::jsonb, true, 'processed')`, + rawID, companyID, gtin); err != nil { + t.Fatal(err) + } + if _, err := pg.Exec(ctx, ` + INSERT INTO processed_products ( + id, company_id, product_id, name, category, description, processed_name, processed_description, + raw_product_id, status, attributes, processed_attributes, field_sources + ) VALUES ( + $1, $2, $3, 'Widget', '42', 'x', 'Widget', 'x', + $4, 'needs_review', '{}'::jsonb, '{}'::jsonb, '{}'::jsonb + )`, ppID, companyID, gtin, rawID); err != nil { + t.Fatal(err) + } + + n, err := BackfillMappedCategoriesFromProcessed(ctx, pg, companyID) + if err != nil { + t.Fatal(err) + } + if n != 1 { + t.Fatalf("updated=%d want 1", n) + } + var mappedCat string + if err := pg.QueryRow(ctx, ` + SELECT COALESCE(mapped_data->>'category', '') FROM raw_products WHERE id = $1`, rawID).Scan(&mappedCat); err != nil { + t.Fatal(err) + } + if mappedCat != "42" { + t.Fatalf("mapped category=%q want 42", mappedCat) + } + + n2, err := BackfillMappedCategoriesFromProcessed(ctx, pg, companyID) + if err != nil { + t.Fatal(err) + } + if n2 != 0 { + t.Fatalf("second backfill updated=%d want 0", n2) + } + + withCat, withoutCat, taxonomy, err := CountMappedCategoryCoverage(ctx, pg, companyID) + if err != nil { + t.Fatal(err) + } + if withCat != 1 || withoutCat != 0 || taxonomy != 0 { + t.Fatalf("mapped coverage with=%d without=%d taxonomy=%d", withCat, withoutCat, taxonomy) + } +} diff --git a/apps/api/internal/processing/fix_company_catalog.go b/apps/api/internal/processing/fix_company_catalog.go index c94566f..237dce4 100644 --- a/apps/api/internal/processing/fix_company_catalog.go +++ b/apps/api/internal/processing/fix_company_catalog.go @@ -41,9 +41,19 @@ type FixCompanyCatalogResult struct { WeakHashesCleared int `json:"weak_hashes_cleared"` CategoriesBackfilled int `json:"categories_backfilled"` + // MappedCategoriesBackfilled is processed → mapped_data.category copies. + MappedCategoriesBackfilled int `json:"mapped_categories_backfilled"` + // Coverage after Fix (Products UI reads mapped_data.category for raw rows). + TaxonomyCategories int64 `json:"taxonomy_categories"` + MappedWithCategory int64 `json:"mapped_with_category"` + MappedWithoutCategory int64 `json:"mapped_without_category"` + ProcessedWithCategory int64 `json:"processed_with_category"` + ProcessedWithoutCategory int64 `json:"processed_without_category"` // Hashes / Categories alias the long names for flash.admin.fixA1Success. Hashes int `json:"hashes"` Categories int `json:"categories"` + // MappedBackfilled aliases mapped_categories_backfilled for flash {mapped_backfilled}. + MappedBackfilled int `json:"mapped_backfilled"` DescriptionsNormalized int `json:"descriptions_normalized"` DescriptionsBackfilled int `json:"descriptions_backfilled"` @@ -106,6 +116,14 @@ func FixCompanyCatalog(ctx context.Context, pool *pgxpool.Pool, companyID uuid.U out.MetaBackfilled = hygiene.MetaBackfilled out.ProductsScanned = hygiene.ProductsScanned + if opts.BackfillCategories { + mappedN, err := BackfillMappedCategoriesFromProcessed(ctx, pool, companyID) + if err != nil { + return out, fmt.Errorf("mapped category backfill: %w", err) + } + out.MappedCategoriesBackfilled = int(mappedN) + } + sanitized, err := BackfillCompanyProcessedAttributes(ctx, pool, companyID) if err != nil { return out, fmt.Errorf("sanitize attributes: %w", err) @@ -119,9 +137,24 @@ func FixCompanyCatalog(ctx context.Context, pool *pgxpool.Pool, companyID uuid.U out.ReprocessNeededCount = needed out.ReprocessSampleRawProductIDs = sample - // Short keys for flash.admin.fixA1Success {prompts,hashes,categories}. + mWith, mWithout, taxonomy, err := CountMappedCategoryCoverage(ctx, pool, companyID) + if err != nil { + return out, err + } + out.MappedWithCategory = mWith + out.MappedWithoutCategory = mWithout + out.TaxonomyCategories = taxonomy + pWith, pWithout, err := CountProcessedCategoryCoverage(ctx, pool, companyID) + if err != nil { + return out, err + } + out.ProcessedWithCategory = pWith + out.ProcessedWithoutCategory = pWithout + + // Short keys for flash.admin.fixA1Success {prompts,hashes,categories,mapped_backfilled}. out.Prompts = out.CategoryPromptsUpdated out.Hashes = out.WeakHashesCleared out.Categories = out.CategoriesBackfilled + out.MappedBackfilled = out.MappedCategoriesBackfilled return out, nil } diff --git a/apps/api/internal/processing/pipeline.go b/apps/api/internal/processing/pipeline.go index cbf79f9..db4b258 100644 --- a/apps/api/internal/processing/pipeline.go +++ b/apps/api/internal/processing/pipeline.go @@ -598,6 +598,7 @@ func (p *Pipeline) ProcessJob(ctx context.Context, jobID uuid.UUID) error { return err } if !IsProcessableJobStatus(status) { + log.Printf("processing: skip job=%s status=%s reason=not_processable", jobID, status) return nil } @@ -625,6 +626,9 @@ func (p *Pipeline) ProcessJob(ctx context.Context, jobID uuid.UUID) error { modeLabel = label } + log.Printf("processing: start job=%s company=%s type=%s mode=%s prior_processed=%d", + jobID, companyID, processingType, modeLabel, alreadyProcessed) + progress := InitialStepProgress(processingType) if len(progress) > 0 { progress[0].Status = "running" @@ -648,6 +652,11 @@ func (p *Pipeline) ProcessJob(ctx context.Context, jobID uuid.UUID) error { batch := resolveBatchSize(p.BatchSize) progressEvery := resolveProgressEvery(p.ProgressEvery) jobCache := p.loadJobScopedCache(ctx, companyID, jobID) + if !jobCache.stepPolicy().AllowAI { + log.Printf("processing: ai_skip job=%s reason=entitlement_can_use_ai", jobID) + } else if !jobEngine.CompleterEnabled() { + log.Printf("processing: ai_skip job=%s reason=openai_not_configured", jobID) + } processed := alreadyProcessed failed := 0 tokenTotal := 0 @@ -672,6 +681,7 @@ func (p *Pipeline) ProcessJob(ctx context.Context, jobID uuid.UUID) error { flushProgress(true) if errors.Is(err, errJobCancelled) { _ = p.reclaimOrphanedProcessingItems(ctx, jobID) + log.Printf("processing: cancelled job=%s", jobID) return nil } return fmt.Errorf("processing: check cancel job=%s: %w", jobID, err) @@ -728,6 +738,7 @@ func (p *Pipeline) ProcessJob(ctx context.Context, jobID uuid.UUID) error { flushProgress(true) if errors.Is(err, errJobCancelled) { _ = p.reclaimOrphanedProcessingItems(ctx, jobID) + log.Printf("processing: cancelled job=%s", jobID) return nil } return fmt.Errorf("processing: check cancel job=%s: %w", jobID, err) @@ -807,7 +818,8 @@ func (p *Pipeline) ProcessJob(ctx context.Context, jobID uuid.UUID) error { current_step = $6, step_progress = $7::jsonb, ai_provider_mode = $8 WHERE id = $1 AND status = 'running'`, jobID, finalStatus, processed, errMsg, tokenTotal, finalStep, finalJSON, finalMode) - log.Printf("processing: finished job=%s status=%s processed=%d failed=%d mode=%s", jobID, finalStatus, processed, failed, finalMode) + log.Printf("processing: finished job=%s status=%s processed=%d failed=%d mode=%s event=%s", + jobID, finalStatus, processed, failed, finalMode, finalStatus) return err } @@ -1556,7 +1568,12 @@ func (p *Pipeline) processOne(ctx context.Context, companyID, jobID uuid.UUID, i // name tokens are not wiped. Empty taxonomy set skips filtering (unit tests). if cache != nil { coerceCategoryToCompanyUniqueID(&result, cache.categoryNamesByUID, cache.categoryUniqueIDs) + catPreFilter := strings.TrimSpace(result.Category) filterCategoryIfInvalid(&result, cache.categoryUniqueIDs) + if catPreFilter != "" && strings.TrimSpace(result.Category) == "" { + log.Printf("processing: category_empty job=%s raw=%s rejected=%s reason=unknown_unique_id", + jobID, it.RawID, catPreFilter) + } syncCategoryName(&result, cache.categoryNamesByUID) } // Re-apply after category validation so allowlist matches the persisted category. diff --git a/apps/web/src/lib/admin-orgs.ts b/apps/web/src/lib/admin-orgs.ts index a2b25f9..2025a4a 100644 --- a/apps/web/src/lib/admin-orgs.ts +++ b/apps/web/src/lib/admin-orgs.ts @@ -246,6 +246,14 @@ export type FixCatalogResult = { /** Alias of categories_backfilled for flash {categories}. */ categories?: number; categories_backfilled?: number; + /** Alias of mapped_categories_backfilled for flash {mapped_backfilled}. */ + mapped_backfilled?: number; + mapped_categories_backfilled?: number; + taxonomy_categories?: number; + mapped_with_category?: number; + mapped_without_category?: number; + processed_with_category?: number; + processed_without_category?: number; attributes_sanitized?: number; products_scanned?: number; reprocess_needed_count?: number; diff --git a/apps/web/src/lib/i18n/messages/de.ts b/apps/web/src/lib/i18n/messages/de.ts index b590521..c85e6ee 100644 --- a/apps/web/src/lib/i18n/messages/de.ts +++ b/apps/web/src/lib/i18n/messages/de.ts @@ -1,17 +1,17 @@ -import type { MessageDict } from "./types"; +import type { MessageDict } from "./types"; -/** German (de) UI pack — keys must stay in sync with en.ts. */ +/** German (de) UI pack — keys must stay in sync with en.ts. */ export const de: MessageDict = { "app.name": "Descrybe", "app.home": "Descrybe-Startseite", "common.cancel": "Abbrechen", - "common.save": "Änderungen speichern", + "common.save": "Änderungen speichern", "common.saveShort": "Speichern", "common.continue": "Weiter", - "common.open": "Öffnen", + "common.open": "Öffnen", "common.markDone": "Als erledigt markieren", "common.viewAll": "Alle anzeigen", - "common.close": "Schließen", + "common.close": "Schließen", "common.askAdmin": "Fragen Sie einen Unternehmens-Admin", "common.you": "Sie", "common.active": "Aktiv", @@ -20,22 +20,22 @@ export const de: MessageDict = { "common.password": "Passwort", "common.name": "Ihr Name", "common.viewPricing": "Preise ansehen", - "common.backToSignIn": "Zurück zur Anmeldung", - "common.signingOut": "Abmelden…", + "common.backToSignIn": "Zurück zur Anmeldung", + "common.signingOut": "Abmelden…", "common.signOutAndContinue": "Abmelden und fortfahren", "common.staySignedIn": "Angemeldet bleiben", "a11y.skipToContent": "Zum Inhalt springen", "theme.switchToDark": "Zum dunklen Design wechseln", "theme.switchToLight": "Zum hellen Design wechseln", "header.signOut": "Abmelden", - "header.signingOut": "Abmelden…", - "status.emDash": "—", + "header.signingOut": "Abmelden…", + "status.emDash": "—", "status.pending": "Ausstehend", "status.processing": "Verarbeitung", "status.completed": "Abgeschlossen", "status.failed": "Fehlgeschlagen", "status.cancelled": "Abgebrochen", - "nav.section.overview": "Übersicht", + "nav.section.overview": "Übersicht", "nav.section.catalog": "Katalog", "nav.section.feeds": "Feeds", "nav.section.stores": "Shops", @@ -44,7 +44,7 @@ export const de: MessageDict = { "nav.section.integrations": "Integrationen", "nav.section.account": "Konto", "nav.section.platform": "Plattform", - "nav.dashboard": "Übersicht", + "nav.dashboard": "Übersicht", "nav.products": "Produkte", "nav.categories": "Kategorien", "nav.attributes": "Attribute", @@ -52,7 +52,7 @@ export const de: MessageDict = { "nav.feeds": "Feeds", "nav.exports": "Exporte", "nav.stores": "Shops", - "nav.jobs": "Aufträge", + "nav.jobs": "Aufträge", "nav.campaigns": "Kampagnen", "nav.calendar": "Kalender", "nav.seo": "SEO", @@ -66,23 +66,23 @@ export const de: MessageDict = { "nav.admin": "Admin", "nav.main": "Hauptnavigation", "nav.sidebar": "App-Seitenleiste", - "nav.close": "Navigation schließen", - "nav.closeMenu": "Menü schließen", - "nav.open": "Navigation öffnen", + "nav.close": "Navigation schließen", + "nav.closeMenu": "Menü schließen", + "nav.open": "Navigation öffnen", "nav.commandPalette": "Seiten suchen", "nav.commandPaletteLabel": "Suchen", "auth.login.title": "Anmelden", "auth.login.description": "Verwenden Sie Ihre Descrybe-E-Mail und Ihr Passwort.", "auth.login.submit": "Anmelden", - "auth.login.submitting": "Anmeldung…", + "auth.login.submitting": "Anmeldung…", "auth.login.failed": "Anmeldung fehlgeschlagen", - "auth.login.passwordNotSet": "Dieses Konto benötigt noch ein Passwort. Öffnen Sie Ihren Einladungslink oder bitten Sie einen Admin, einen neuen auszustellen.", + "auth.login.passwordNotSet": "Dieses Konto benötigt noch ein Passwort. Öffnen Sie Ihren Einladungslink oder bitten Sie einen Admin, einen neuen auszustellen.", "auth.login.setPasswordFirstTitle": "Zuerst Passwort festlegen:", "auth.login.setPasswordFirstBody": "nutzen Sie den Einladungslink aus Ihrer E-Mail. Wenn der Link an eine alte Adresse ging (E-Mail-Drift), bitten Sie einen Unternehmens-Admin, eine neue Passwort-Einladung an {email} auszustellen.", "auth.login.yourEmail": "Ihre E-Mail", - "auth.login.platformAdminsReissue": "Plattform-Admins können erneut ausstellen unter", - "auth.login.adminUsersLink": "Admin → Benutzer", - "auth.login.haveToken": "Haben Sie ein Token? Einladung annehmen öffnen", + "auth.login.platformAdminsReissue": "Plattform-Admins können erneut ausstellen unter", + "auth.login.adminUsersLink": "Admin → Benutzer", + "auth.login.haveToken": "Haben Sie ein Token? Einladung annehmen öffnen", "auth.login.noAccount": "Kein Konto?", "auth.login.createCompany": "Unternehmen erstellen", "auth.login.haveInvite": "Haben Sie eine Einladung oder einen Passwort-Link?", @@ -90,98 +90,98 @@ export const de: MessageDict = { "auth.login.forgotPassword": "Passwort vergessen?", "auth.login.forgotPasswordHelp": "Geben Sie Ihre E-Mail auf der Reset-Seite ein. Wenn Sie noch kein Passwort gesetzt haben, nutzen Sie den Einladungs-/Set-Password-Link.", "auth.forgot.title": "Passwort vergessen", - "auth.forgot.description": "Geben Sie die E-Mail Ihres Kontos ein. Wenn sie zu einem aktiven Konto gehört, senden wir einen Reset-Link.", + "auth.forgot.description": "Geben Sie die E-Mail Ihres Kontos ein. Wenn sie zu einem aktiven Konto gehört, senden wir einen Reset-Link.", "auth.forgot.submit": "Reset-Link senden", - "auth.forgot.submitting": "Wird gesendet…", + "auth.forgot.submitting": "Wird gesendet…", "auth.forgot.failed": "Reset konnte nicht angefordert werden", - "auth.forgot.sentTitle": "E-Mail prüfen", - "auth.forgot.sentBody": "Wenn ein Konto zu dieser Adresse existiert, ist ein Reset-Link unterwegs. Der Link läuft in einer Stunde ab.", - "auth.forgot.backToSignIn": "Zurück zur Anmeldung", - "auth.reset.title": "Passwort zurücksetzen", - "auth.reset.description": "Wählen Sie ein neues Passwort für Ihr Descrybe-Konto (mindestens 8 Zeichen).", + "auth.forgot.sentTitle": "E-Mail prüfen", + "auth.forgot.sentBody": "Wenn ein Konto zu dieser Adresse existiert, ist ein Reset-Link unterwegs. Der Link läuft in einer Stunde ab.", + "auth.forgot.backToSignIn": "Zurück zur Anmeldung", + "auth.reset.title": "Passwort zurücksetzen", + "auth.reset.description": "Wählen Sie ein neues Passwort für Ihr Descrybe-Konto (mindestens 8 Zeichen).", "auth.reset.submit": "Neues Passwort speichern", - "auth.reset.submitting": "Wird gespeichert…", - "auth.reset.failed": "Passwort konnte nicht zurückgesetzt werden", + "auth.reset.submitting": "Wird gespeichert…", + "auth.reset.failed": "Passwort konnte nicht zurückgesetzt werden", "auth.reset.doneTitle": "Passwort aktualisiert", "auth.reset.doneDescription": "Melden Sie sich mit Ihrer E-Mail und dem neuen Passwort an.", "auth.reset.goToSignIn": "Zur Anmeldung", - "auth.reset.passwordConfirm": "Passwort bestätigen", - "auth.reset.passwordMismatch": "Passwörter stimmen nicht überein", + "auth.reset.passwordConfirm": "Passwort bestätigen", + "auth.reset.passwordMismatch": "Passwörter stimmen nicht überein", "auth.reset.missingTitle": "Reset-Link fehlt", - "auth.reset.missingDescription": "Öffnen Sie den Link aus Ihrer E-Mail, um ein neues Passwort zu wählen.", + "auth.reset.missingDescription": "Öffnen Sie den Link aus Ihrer E-Mail, um ein neues Passwort zu wählen.", "auth.reset.requestNewLink": "Neuen Reset-Link anfordern", "auth.reset.tokenMissing": "Es wurde kein Reset-Link angegeben. Nutzen Sie den Link aus Ihrer E-Mail oder fordern Sie einen neuen an.", - "auth.reset.tokenInvalid": "Dieser Reset-Link ist ungültig oder abgelaufen. Fordern Sie einen neuen über die Passwort-vergessen-Seite an.", - "auth.reset.linkRecognized": "Reset-Link erkannt. Geben Sie unten ein neues Passwort ein — das Geheimnis wird auf dieser Seite nicht angezeigt.", + "auth.reset.tokenInvalid": "Dieser Reset-Link ist ungültig oder abgelaufen. Fordern Sie einen neuen über die Passwort-vergessen-Seite an.", + "auth.reset.linkRecognized": "Reset-Link erkannt. Geben Sie unten ein neues Passwort ein — das Geheimnis wird auf dieser Seite nicht angezeigt.", "auth.reset.tokenLabel": "Reset-Token", - "auth.reset.passwordHint": "Mindestens 8 Zeichen. Keine weiteren Komplexitätsregeln.", + "auth.reset.passwordHint": "Mindestens 8 Zeichen. Keine weiteren Komplexitätsregeln.", "auth.register.title": "Unternehmen erstellen", "auth.register.description": "Registriert ein Unternehmen und dessen Admin-Benutzer.", "auth.register.companyName": "Unternehmensname", "auth.register.submit": "Konto erstellen", - "auth.register.submitting": "Wird erstellt…", + "auth.register.submitting": "Wird erstellt…", "auth.register.failed": "Registrierung fehlgeschlagen", "auth.register.haveAccount": "Haben Sie bereits ein Konto?", "auth.register.signIn": "Anmelden", "auth.invite.title": "Einladung annehmen", "auth.invite.setPasswordTitle": "Passwort festlegen", - "auth.invite.description": "Legen Sie Ihr Passwort fest, um dem Unternehmen beizutreten. Ihr Admin hat entweder Mitglied (Tagesgeschäft) oder Admin (Team und Abrechnung) zugewiesen.", - "auth.invite.setPasswordDescription": "Wählen Sie ein Passwort für Ihr migriertes Descrybe-Konto (mindestens 8 Zeichen).", - "auth.invite.checking": "Einladung wird geprüft…", - "auth.invite.forEmail": "Einladung für {email}.", - "auth.invite.linkRecognized": "Einladungslink erkannt. Geben Sie unten ein Passwort ein, um fortzufahren — das Geheimnis wird auf dieser Seite nicht angezeigt.", - "auth.invite.resetLinkRecognized": "Reset-Link erkannt. Geben Sie unten ein Passwort ein, um fortzufahren — das Geheimnis wird auf dieser Seite nicht angezeigt.", + "auth.invite.description": "Legen Sie Ihr Passwort fest, um dem Unternehmen beizutreten. Ihr Admin hat entweder Mitglied (Tagesgeschäft) oder Admin (Team und Abrechnung) zugewiesen.", + "auth.invite.setPasswordDescription": "Wählen Sie ein Passwort für Ihr migriertes Descrybe-Konto (mindestens 8 Zeichen).", + "auth.invite.checking": "Einladung wird geprüft…", + "auth.invite.forEmail": "Einladung für {email}.", + "auth.invite.linkRecognized": "Einladungslink erkannt. Geben Sie unten ein Passwort ein, um fortzufahren — das Geheimnis wird auf dieser Seite nicht angezeigt.", + "auth.invite.resetLinkRecognized": "Reset-Link erkannt. Geben Sie unten ein Passwort ein, um fortzufahren — das Geheimnis wird auf dieser Seite nicht angezeigt.", "auth.invite.tokenLabel": "Einladungs-Token", "auth.invite.resetTokenLabel": "Reset-Token", - "auth.invite.tokenHelp": "Fügen Sie das Token aus Ihrer Einladungs-E-Mail ein. Es wird in diesem Feld maskiert angezeigt.", - "auth.invite.passwordHint": "Mindestens 8 Zeichen. Keine weiteren Komplexitätsregeln.", + "auth.invite.tokenHelp": "Fügen Sie das Token aus Ihrer Einladungs-E-Mail ein. Es wird in diesem Feld maskiert angezeigt.", + "auth.invite.passwordHint": "Mindestens 8 Zeichen. Keine weiteren Komplexitätsregeln.", "auth.invite.submit": "Einladung annehmen", "auth.invite.setPasswordSubmit": "Passwort festlegen", - "auth.invite.accepting": "Wird angenommen…", - "auth.invite.saving": "Speichern…", + "auth.invite.accepting": "Wird angenommen…", + "auth.invite.saving": "Speichern…", "auth.invite.verifyFailed": "Einladung konnte nicht verifiziert werden", "auth.invite.verifySetPasswordFailed": "Passwort-Link konnte nicht verifiziert werden", "auth.invite.acceptFailed": "Einladung konnte nicht angenommen werden", "auth.invite.setPasswordFailed": "Passwort konnte nicht festgelegt werden", - "auth.invite.expired": "Diese Einladung ist ungültig oder abgelaufen. Bitten Sie Ihren Unternehmens-Admin um eine neue Einladung und öffnen Sie den neuen Link (oder fügen Sie das neue Token unten ein).", - "auth.invite.setPasswordExpired": "Dieser Passwort-Link ist ungültig oder abgelaufen. Bitten Sie einen Unternehmens- oder Plattform-Admin um Neuausstellung und öffnen Sie den neuen Link (oder fügen Sie das neue Token unten ein).", + "auth.invite.expired": "Diese Einladung ist ungültig oder abgelaufen. Bitten Sie Ihren Unternehmens-Admin um eine neue Einladung und öffnen Sie den neuen Link (oder fügen Sie das neue Token unten ein).", + "auth.invite.setPasswordExpired": "Dieser Passwort-Link ist ungültig oder abgelaufen. Bitten Sie einen Unternehmens- oder Plattform-Admin um Neuausstellung und öffnen Sie den neuen Link (oder fügen Sie das neue Token unten ein).", "auth.invite.emailMismatchDefault": "Sie sind mit einer anderen E-Mail angemeldet als diese Einladung.", - "auth.invite.expiredFooter": "Abgelaufener Link? Bitten Sie einen Admin um Neuausstellung — es gibt keine Self-Service-API zum erneuten Senden. Plattform-Admins:", - "auth.invite.adminUsersLink": "Admin → Benutzer", + "auth.invite.expiredFooter": "Abgelaufener Link? Bitten Sie einen Admin um Neuausstellung — es gibt keine Self-Service-API zum erneuten Senden. Plattform-Admins:", + "auth.invite.adminUsersLink": "Admin → Benutzer", "auth.invite.doneTitle": "Sie sind im Team", "auth.invite.doneSetPasswordTitle": "Passwort gespeichert", - "auth.invite.doneDescription": "Ihr Konto ist bereit. Öffnen Sie als Nächstes das Dashboard, um mit Feeds und Produkten zu arbeiten, oder prüfen Sie die Unternehmenseinstellungen.", - "auth.invite.doneSetPasswordDescription": "Melden Sie sich mit Ihrer E-Mail und dem neuen Passwort an, um Ihren Arbeitsbereich zu öffnen.", - "auth.invite.openDashboard": "Dashboard öffnen", + "auth.invite.doneDescription": "Ihr Konto ist bereit. Öffnen Sie als Nächstes das Dashboard, um mit Feeds und Produkten zu arbeiten, oder prüfen Sie die Unternehmenseinstellungen.", + "auth.invite.doneSetPasswordDescription": "Melden Sie sich mit Ihrer E-Mail und dem neuen Passwort an, um Ihren Arbeitsbereich zu öffnen.", + "auth.invite.openDashboard": "Dashboard öffnen", "auth.invite.companySettings": "Unternehmenseinstellungen", "auth.invite.goToSignIn": "Zur Anmeldung", - "auth.invite.afterSignInNote": "Nach der Anmeldung landen Sie in Ihrem Arbeitsbereich — die Greenfield-Einrichtungstour wird übersprungen.", - "auth.invite.mismatchTitle": "Falsches Konto für diese Einladung", - "auth.invite.mismatchDescription": "Dieser Link gilt für eine andere E-Mail als die, mit der Sie angemeldet sind. Melden Sie sich ab, um als eingeladener Benutzer fortzufahren, oder bleiben Sie angemeldet und bitten Sie einen Admin um Neuausstellung der Einladung.", - "auth.invite.mismatchDetail": "Angemeldet als {session}, aber diese Einladung ist für {invite}.", - "auth.invite.mismatchFallback": "Die angemeldete E-Mail stimmt nicht mit dieser Einladung überein.", + "auth.invite.afterSignInNote": "Nach der Anmeldung landen Sie in Ihrem Arbeitsbereich — die Greenfield-Einrichtungstour wird übersprungen.", + "auth.invite.mismatchTitle": "Falsches Konto für diese Einladung", + "auth.invite.mismatchDescription": "Dieser Link gilt für eine andere E-Mail als die, mit der Sie angemeldet sind. Melden Sie sich ab, um als eingeladener Benutzer fortzufahren, oder bleiben Sie angemeldet und bitten Sie einen Admin um Neuausstellung der Einladung.", + "auth.invite.mismatchDetail": "Angemeldet als {session}, aber diese Einladung ist für {invite}.", + "auth.invite.mismatchFallback": "Die angemeldete E-Mail stimmt nicht mit dieser Einladung überein.", "auth.invite.switchAccountTitle": "Konto wechseln:", - "auth.invite.switchAccountBody": "melden Sie sich ab und schließen Sie dieses Formular mit der eingeladenen E-Mail{emailSuffix} ab.", + "auth.invite.switchAccountBody": "melden Sie sich ab und schließen Sie dieses Formular mit der eingeladenen E-Mail{emailSuffix} ab.", "auth.invite.reissueTitle": "Neuausstellungs-Pfad:", - "auth.invite.reissueBody": "wenn sich Ihre echte Anmelde-E-Mail geändert hat (E-Mail-Drift), bitten Sie einen Unternehmens-Admin, diese Einladung zu widerrufen und eine neue an die E-Mail zu senden, mit der Sie sich anmelden. Plattform-Admins können Passwort-Links auch unter Admin → Benutzer erneut ausstellen.", - "locale.switcher": "Oberflächensprache", - "locale.menu": "Oberflächensprache wählen", + "auth.invite.reissueBody": "wenn sich Ihre echte Anmelde-E-Mail geändert hat (E-Mail-Drift), bitten Sie einen Unternehmens-Admin, diese Einladung zu widerrufen und eine neue an die E-Mail zu senden, mit der Sie sich anmelden. Plattform-Admins können Passwort-Links auch unter Admin → Benutzer erneut ausstellen.", + "locale.switcher": "Oberflächensprache", + "locale.menu": "Oberflächensprache wählen", "locale.label": "Dashboard-Sprache", - "locale.help": "Ändert Beschriftungen in Navigation und Einstellungen. Die Sprache für generierte Inhalte wird separat unter Unternehmen festgelegt.", + "locale.help": "Ändert Beschriftungen in Navigation und Einstellungen. Die Sprache für generierte Inhalte wird separat unter Unternehmen festgelegt.", "settings.contentLanguage": "Inhaltssprache", - "settings.contentLanguageHelp": "Sprache für Produkttitel, Beschreibungen und andere generierte Inhalte", + "settings.contentLanguageHelp": "Sprache für Produkttitel, Beschreibungen und andere generierte Inhalte", "settings.tab.profile": "Profil", "settings.tab.company": "Unternehmen", "settings.tab.alerts": "Hinweise", - "settings.tab.apiKeys": "API-Schlüssel", + "settings.tab.apiKeys": "API-Schlüssel", "settings.tab.team": "Teammitglieder", "settings.title": "Einstellungen", - "settings.description": "Konto, Unternehmen, API-Schlüssel und Team.", - "settings.accessDenied": "Sie haben keine Berechtigung, die Unternehmenseinstellungen zu öffnen. Bitten Sie einen Unternehmens-Admin um Hilfe.", + "settings.description": "Konto, Unternehmen, API-Schlüssel und Team.", + "settings.accessDenied": "Sie haben keine Berechtigung, die Unternehmenseinstellungen zu öffnen. Bitten Sie einen Unternehmens-Admin um Hilfe.", "settings.loadFailed": "Einstellungen konnten nicht geladen werden", "settings.profileHeading": "Profil", - "settings.personalInfo": "Persönliche Daten", - "settings.personalInfoHelp": "Aktualisieren Sie Ihre persönlichen Daten", + "settings.personalInfo": "Persönliche Daten", + "settings.personalInfoHelp": "Aktualisieren Sie Ihre persönlichen Daten", "settings.firstName": "Vorname", "settings.firstNamePlaceholder": "Ihr Vorname", "settings.lastName": "Nachname", @@ -193,16 +193,16 @@ export const de: MessageDict = { "settings.role.admin": "Admin", "settings.teamHeading": "Teammitglieder", "settings.inviteUser": "Benutzer einladen", - "settings.teamAdminOnly": "Nur Unternehmens-Admins können Teammitglieder einladen, befördern, herabstufen oder entfernen.", + "settings.teamAdminOnly": "Nur Unternehmens-Admins können Teammitglieder einladen, befördern, herabstufen oder entfernen.", "settings.shareAcceptLink": "Annahmelink teilen", - "settings.shareAcceptLinkHelp": "Ausgehende E-Mail ist nicht konfiguriert. Kopieren Sie diesen Einmal-Link und senden Sie ihn an den Eingeladenen. Er legt ein Passwort fest (mindestens 8 Zeichen) und tritt mit der von Ihnen gewählten Rolle bei.", + "settings.shareAcceptLinkHelp": "Ausgehende E-Mail ist nicht konfiguriert. Kopieren Sie diesen Einmal-Link und senden Sie ihn an den Eingeladenen. Er legt ein Passwort fest (mindestens 8 Zeichen) und tritt mit der von Ihnen gewählten Rolle bei.", "settings.acceptLinkLabel": "Einmaliger Einladungs-Annahmelink", "settings.copyLink": "Link kopieren", "settings.linkCopied": "Annahmelink kopiert.", "settings.table.email": "E-Mail", "settings.table.role": "Rolle", "settings.table.status": "Zustand", - "settings.table.joined": "Beigetreten / läuft ab", + "settings.table.joined": "Beigetreten / läuft ab", "settings.table.actions": "Aktionen", "settings.teamForbidden": "Sie haben keine Berechtigung, die Teamliste anzuzeigen. Bitten Sie einen Unternehmens-Admin um Hilfe.", "settings.noTeammates": "Noch keine Teammitglieder", @@ -213,11 +213,11 @@ export const de: MessageDict = { "settings.makeMember": "Zum Mitglied machen", "settings.removeMember": "Entfernen", "settings.revokeInvite": "Einladung widerrufen", - "settings.needOneAdmin": "Unternehmen benötigen mindestens einen Admin", - "settings.expires": "Läuft ab am {date}", - "settings.invalidEmail": "Geben Sie eine gültige E-Mail-Adresse ein.", - "settings.inviteCreatedNoMail": "Einladung für {email} als {role} erstellt. Kopieren Sie den Annahmelink unten und teilen Sie ihn — ausgehende E-Mail ist nicht konfiguriert.", - "settings.inviteSent": "Einladung an {email} als {role} gesendet. Die Person sollte die E-Mail öffnen und vor Ablauf annehmen.", + "settings.needOneAdmin": "Unternehmen benötigen mindestens einen Admin", + "settings.expires": "Läuft ab am {date}", + "settings.invalidEmail": "Geben Sie eine gültige E-Mail-Adresse ein.", + "settings.inviteCreatedNoMail": "Einladung für {email} als {role} erstellt. Kopieren Sie den Annahmelink unten und teilen Sie ihn — ausgehende E-Mail ist nicht konfiguriert.", + "settings.inviteSent": "Einladung an {email} als {role} gesendet. Die Person sollte die E-Mail öffnen und vor Ablauf annehmen.", "settings.inviteFailed": "Einladung konnte nicht gesendet werden", "settings.revokeConfirm": "Diese Einladung widerrufen?", "settings.revoked": "Einladung widerrufen.", @@ -228,18 +228,18 @@ export const de: MessageDict = { "settings.roleChangeConfirm": "{email} zu {role} {action}?", "settings.roleChanged": "{email} ist jetzt {role}.", "settings.roleChangeFailed": "Rolle konnte nicht aktualisiert werden", - "settings.promote": "Befördern", + "settings.promote": "Befördern", "settings.demote": "Herabstufen", "settings.inviteTitle": "Teammitglied einladen", "settings.inviteDescription": "Sie erhalten einen Link, um ein Passwort festzulegen (mindestens 8 Zeichen) und diesem Unternehmen beizutreten.", "settings.inviteEmail": "E-Mail", "settings.inviteEmailPlaceholder": "kollege@beispiel.com", "settings.inviteRole": "Rolle", - "settings.inviteRoleHint": "Mitglieder verwalten Produkte und Feeds. Admins können auch Teammitglieder einladen und Unternehmenseinstellungen ändern.", + "settings.inviteRoleHint": "Mitglieder verwalten Produkte und Feeds. Admins können auch Teammitglieder einladen und Unternehmenseinstellungen ändern.", "settings.sendInvite": "Einladung senden", "settings.companyHeading": "Unternehmenseinstellungen", "settings.activeCompany": "Aktives Unternehmen", - "settings.creditsOverview": "Credit-Übersicht", + "settings.creditsOverview": "Credit-Übersicht", "settings.plan": "Tarifplan", "settings.used": "Verbraucht", "settings.companyInfo": "Unternehmensinformationen", @@ -247,30 +247,30 @@ export const de: MessageDict = { "settings.companyName": "Unternehmensname", "settings.companyNamePlaceholder": "Ihr Unternehmensname", "settings.contentSettings": "Inhaltseinstellungen", - "settings.mergeProducts": "Produkte mit derselben GTIN zusammenführen", + "settings.mergeProducts": "Produkte mit derselben GTIN zusammenführen", "settings.emailIntegration": "E-Mail-Integration", "settings.aiIntegrations": "KI-Integrationen", "settings.alertsHeading": "Operator-Benachrichtigungen", "settings.inAppToasts": "In-App-Toasts", "settings.emailAlerts": "E-Mail-Benachrichtigungen", - "settings.apiKeysHeading": "API-Schlüssel", - "settings.createApiKey": "API-Schlüssel erstellen", - "settings.createApiKeyShort": "API-Schlüssel erstellen", - "settings.createApiKeyTitle": "API-Schlüssel erstellen", - "settings.apiKeyLabel": "API-Schlüssel", - "settings.keyName": "Schlüsselname", - "settings.storeKeySafe": "Bewahren Sie ihn sicher auf — das vollständige Geheimnis ist danach nicht mehr sichtbar.", - "settings.apiKeysIntro": "Erstellen Sie einen Unternehmens-API-Schlüssel für die öffentlichen /api/v1-Endpunkte. Das vollständige Geheimnis wird nur einmal bei der Erstellung angezeigt — sofort kopieren.", + "settings.apiKeysHeading": "API-Schlüssel", + "settings.createApiKey": "API-Schlüssel erstellen", + "settings.createApiKeyShort": "API-Schlüssel erstellen", + "settings.createApiKeyTitle": "API-Schlüssel erstellen", + "settings.apiKeyLabel": "API-Schlüssel", + "settings.keyName": "Schlüsselname", + "settings.storeKeySafe": "Bewahren Sie ihn sicher auf — das vollständige Geheimnis ist danach nicht mehr sichtbar.", + "settings.apiKeysIntro": "Erstellen Sie einen Unternehmens-API-Schlüssel für die öffentlichen /api/v1-Endpunkte. Das vollständige Geheimnis wird nur einmal bei der Erstellung angezeigt — sofort kopieren.", "settings.apiKeysUseWhere": "Senden Sie ihn als Authorization: Bearer (bevorzugt) oder X-API-Key.", "settings.apiKeysDocsLink": "API-Authentifizierungsdocs", - "settings.apiKeyOnceWarning": "Dies ist die einzige Anzeige des vollständigen Geheimnisses. Kopieren Sie es jetzt, bevor Sie diesen Dialog schließen.", + "settings.apiKeyOnceWarning": "Dies ist die einzige Anzeige des vollständigen Geheimnisses. Kopieren Sie es jetzt, bevor Sie diesen Dialog schließen.", "settings.table.name": "Bezeichnung", - "settings.table.key": "Schlüssel", + "settings.table.key": "Schlüssel", "settings.table.lastUsed": "Zuletzt verwendet", "dashboard.demoSandbox": "Demo-Sandbox", "dashboard.demoEmptyTitle": "Demo-Sandbox ist leer", - "dashboard.demoEmptyHint": "Demo-Sandbox ist leer — wechseln Sie zu A1 oder verbinden Sie einen Feed, um echte Katalogstatistiken zu sehen.", - "dashboard.overviewTitle": "Übersicht", + "dashboard.demoEmptyHint": "Demo-Sandbox ist leer — wechseln Sie zu A1 oder verbinden Sie einen Feed, um echte Katalogstatistiken zu sehen.", + "dashboard.overviewTitle": "Übersicht", "dashboard.quickLinks": "Schnelllinks", "dashboard.whatsNew": "Neuigkeiten", "dashboard.startTutorial": "Tutorial starten", @@ -280,14 +280,14 @@ export const de: MessageDict = { "dashboard.browseTutorialSections": "Tutorial-Abschnitte durchsuchen", "dashboard.connectFeed": "Feed verbinden", "dashboard.processProducts": "Produkte verarbeiten", - "dashboard.openProducts": "Produkte öffnen", + "dashboard.openProducts": "Produkte öffnen", "dashboard.welcomeTo": "Willkommen bei {name}", "dashboard.trialBadge": "Testphase", "dashboard.actions": "Dashboard-Aktionen", "dashboard.emptyPaygHint": "Descrybe holt einen Katalog herein, reichert ihn an und verarbeitet ihn, dann exportiert oder pusht zu Shops. Nutzen Sie Erste Schritte unten.", - "dashboard.emptyCreditsHint": "Descrybe holt einen Katalog herein, reichert ihn an und verarbeitet ihn, dann exportiert oder pusht zu Shops. Sie haben {credits} — starten Sie mit Erste Schritte unten.", + "dashboard.emptyCreditsHint": "Descrybe holt einen Katalog herein, reichert ihn an und verarbeitet ihn, dann exportiert oder pusht zu Shops. Sie haben {credits} — starten Sie mit Erste Schritte unten.", "dashboard.workflowTitle": "Katalog-Workflow", - "dashboard.recentActivity": "Letzte Aktivität", + "dashboard.recentActivity": "Letzte Aktivität", "dashboard.loadFailed": "Dashboard konnte nicht geladen werden", "dashboard.workspaceFallback": "Dieser Arbeitsbereich", "dashboard.jobFallback": "Job {id}", @@ -297,8 +297,8 @@ export const de: MessageDict = { "dashboard.workflow.products.build": "Katalog aufbauen", "dashboard.workflow.products.count": "{count} im Katalog", "dashboard.workflow.map": "Map", - "dashboard.workflow.map.detail": "Spalten zuordnen, nachdem Sie einen Feed hinzugefügt haben", - "dashboard.workflow.map.ready": "Map bei einem Feed öffnen", + "dashboard.workflow.map.detail": "Spalten zuordnen, nachdem Sie einen Feed hinzugefügt haben", + "dashboard.workflow.map.ready": "Map bei einem Feed öffnen", "dashboard.workflow.sync": "Sync", "dashboard.workflow.sync.detail": "Nach dem Mapping eine Stichprobe abrufen", "dashboard.workflow.sync.ready": "Stichprobe in Produkte synchronisieren", @@ -306,83 +306,83 @@ export const de: MessageDict = { "dashboard.workflow.processActive": "{count} aktiv", "dashboard.workflow.processWaiting": "{count} wartend", "dashboard.workflow.processDone": "{count} erledigt", - "dashboard.workflow.processRun": "KI-Jobs ausführen", + "dashboard.workflow.processRun": "KI-Jobs ausführen", "dashboard.workflow.export": "Exportieren", "dashboard.workflow.exportReady": "Vorlagen & Download", "dashboard.workflow.exportMap": "Zuordnen dann exportieren", - "dashboard.workflowHint": "Katalog rein → anreichern / verarbeiten → exportieren oder zu Shops pushen. Zum nächsten Schritt für {name}.", - "dashboard.overviewHint": "Live-Summen für {name}", - "dashboard.demoEmptyMessage": "Wechseln Sie in der Kopfzeile zu A1 (oder einem anderen Seed-Unternehmen) oder verbinden Sie hier einen Feed, um diese Sandbox zu füllen.", + "dashboard.workflowHint": "Katalog rein → anreichern / verarbeiten → exportieren oder zu Shops pushen. Zum nächsten Schritt für {name}.", + "dashboard.overviewHint": "Live-Summen für {name}", + "dashboard.demoEmptyMessage": "Wechseln Sie in der Kopfzeile zu A1 (oder einem anderen Seed-Unternehmen) oder verbinden Sie hier einen Feed, um diese Sandbox zu füllen.", "dashboard.emptyTitle": "Katalog hereinholen", - "dashboard.emptyMessage": "Katalog rein → anreichern / verarbeiten → exportieren oder zu Shops pushen. Starten Sie mit Erste Schritte unten (oder Feed verbinden / CSV hochladen).", + "dashboard.emptyMessage": "Katalog rein → anreichern / verarbeiten → exportieren oder zu Shops pushen. Starten Sie mit Erste Schritte unten (oder Feed verbinden / CSV hochladen).", "dashboard.connectFeedAnyway": "Feed trotzdem verbinden", "dashboard.connectFeedShort": "Feed verbinden", "dashboard.uploadCsv": "CSV hochladen", "dashboard.goToBilling": "Zur Abrechnung", "dashboard.freePlanTitle": "Sie nutzen den Free-Plan", - "dashboard.freePlanMessageWithLimit": "{used} von {max} Produkten genutzt. Feed-Zuordnung, Basisbereinigung und EU-Energieetiketten (EPREL) sind enthalten; upgraden Sie für KI-Titel und -Beschreibungen sowie mehr Kapazität.", - "dashboard.freePlanMessage": "Feed-Zuordnung, Basisbereinigung und EU-Energieetiketten (EPREL) sind enthalten; upgraden Sie für KI-Titel und -Beschreibungen sowie mehr Kapazität.", + "dashboard.freePlanMessageWithLimit": "{used} von {max} Produkten genutzt. Feed-Zuordnung, Basisbereinigung und EU-Energieetiketten (EPREL) sind enthalten; upgraden Sie für KI-Titel und -Beschreibungen sowie mehr Kapazität.", + "dashboard.freePlanMessage": "Feed-Zuordnung, Basisbereinigung und EU-Energieetiketten (EPREL) sind enthalten; upgraden Sie für KI-Titel und -Beschreibungen sowie mehr Kapazität.", "dashboard.outOfCreditsTitle": "Ihre KI-Credits sind aufgebraucht", "dashboard.outOfCreditsMessage": "Kaufen Sie mehr Credits oder upgraden Sie Ihren Plan, um die Verarbeitung fortzusetzen.", "dashboard.productLimitTitle": "Produktlimit erreicht", "dashboard.productLimitMessage": "Ihr {plan}-Plan erlaubt {max} Produkte ({count} im Katalog). Upgraden Sie, um mehr zu verarbeiten.", "dashboard.productLimitMessageFull": "Das Produktlimit Ihres {plan}-Plans ist erreicht. Upgraden Sie, um mehr zu verarbeiten.", - "dashboard.comparePlans": "Pläne vergleichen", - "dashboard.viewPlans": "Pläne ansehen", - "dashboard.trialTitle": "Testphase · {plan}", - "dashboard.trialMessageDated": "Testphase endet am {date}. {credits} Credits übrig.", + "dashboard.comparePlans": "Pläne vergleichen", + "dashboard.viewPlans": "Pläne ansehen", + "dashboard.trialTitle": "Testphase · {plan}", + "dashboard.trialMessageDated": "Testphase endet am {date}. {credits} Credits übrig.", "dashboard.trialMessage": "{credits} Credits verbleiben in Ihrer Testphase.", "dashboard.lowCreditsTitle": "Credits werden knapp", - "dashboard.lowCreditsMessage": "{remaining} von {total} Credits übrig. Laden Sie auf oder upgraden Sie, bevor Jobs stoppen.", + "dashboard.lowCreditsMessage": "{remaining} von {total} Credits übrig. Laden Sie auf oder upgraden Sie, bevor Jobs stoppen.", "dashboard.latestJobs": "Neueste Verarbeitungsjobs", - "dashboard.noJobsEmpty": "Noch keine Jobs — importieren Sie zuerst Produkte.", + "dashboard.noJobsEmpty": "Noch keine Jobs — importieren Sie zuerst Produkte.", "dashboard.noJobsReady": "Keine aktuellen Jobs. Starten Sie einen unter Produkte, wenn Sie bereit sind.", "dashboard.startJob": "Job unter Produkte starten", "dashboard.quickLinksHint": "Feeds, Produkte, Jobs und Export.", "dashboard.feedsImportMap": "Importieren und zuordnen", "dashboard.productsBrowse": "Durchsuchen und verarbeiten", - "dashboard.jobsMonitor": "Aufgaben überwachen", + "dashboard.jobsMonitor": "Aufgaben überwachen", "dashboard.exportsTemplates": "Vorlagen & Download", "activation.title": "Erste Schritte", - "activation.description": "Descrybe holt einen Katalog herein, reichert ihn an und verarbeitet ihn, dann exportiert oder pusht zu Shops. Schließen Sie den aktuellen Schritt ab und fahren Sie fort — die Demo-Tour erklärt die Bildschirme, ohne den Checklistenfortschritt zu ändern.", - "activation.descriptionShort": "Beginnen Sie mit dem hervorgehobenen Schritt unten — eine Aktion nach der anderen. Shop-Verbindung ist optional.", - "activation.nextCta": "Diesen Schritt ausführen", + "activation.description": "Descrybe holt einen Katalog herein, reichert ihn an und verarbeitet ihn, dann exportiert oder pusht zu Shops. Schließen Sie den aktuellen Schritt ab und fahren Sie fort — die Demo-Tour erklärt die Bildschirme, ohne den Checklistenfortschritt zu ändern.", + "activation.descriptionShort": "Beginnen Sie mit dem hervorgehobenen Schritt unten — eine Aktion nach der anderen. Shop-Verbindung ist optional.", + "activation.nextCta": "Diesen Schritt ausführen", "activation.valueProp": "Descrybe holt einen Katalog herein, reichert ihn an und verarbeitet ihn, dann exportiert oder pusht zu Ihren Shops.", "activation.alreadyDone": "Bereits erledigt", - "activation.skipForNow": "Vorerst überspringen", + "activation.skipForNow": "Vorerst überspringen", "activation.showAllSteps": "Alle {total} Schritte anzeigen", "activation.showFewerSteps": "Weniger Schritte anzeigen", "activation.corePathLabel": "Kurz gesagt", - "activation.corePath": "Katalog rein → Anreichern / verarbeiten → Exportieren oder zu Shops pushen", - "activation.storeWizardHint": "Nicht nötig für Feeds oder Exporte — überspringen, außer Sie möchten Produkte in einen Live-Shop pushen.", - "activation.storeWizardCta": "Geführtes Setup starten", - "activation.focus.map": "Als Nächstes: Map bei einem Feed öffnen, Spalten zuordnen und speichern. Zuerst einen Feed hinzufügen, wenn die Liste leer ist.", - "activation.focus.sync": "Als Nächstes: Nach dem Speichern der Zuordnung eine Stichprobe synchronisieren. Sync nur bei zugeordneten Feeds — nicht bei unmapped Quellen.", - "activation.focus.dismiss": "Hinweis schließen", + "activation.corePath": "Katalog rein → Anreichern / verarbeiten → Exportieren oder zu Shops pushen", + "activation.storeWizardHint": "Nicht nötig für Feeds oder Exporte — überspringen, außer Sie möchten Produkte in einen Live-Shop pushen.", + "activation.storeWizardCta": "Geführtes Setup starten", + "activation.focus.map": "Als Nächstes: Map bei einem Feed öffnen, Spalten zuordnen und speichern. Zuerst einen Feed hinzufügen, wenn die Liste leer ist.", + "activation.focus.sync": "Als Nächstes: Nach dem Speichern der Zuordnung eine Stichprobe synchronisieren. Sync nur bei zugeordneten Feeds — nicht bei unmapped Quellen.", + "activation.focus.dismiss": "Hinweis schließen", "activation.dismiss": "Checkliste ausblenden", "hypercare.report.title": "Cutover-Hypercare", - "hypercare.report.message": "Fehlende oder falsche Daten nach der Migration? Melden Sie es, damit wir Ihren Workspace korrigieren können.", + "hypercare.report.message": "Fehlende oder falsche Daten nach der Migration? Melden Sie es, damit wir Ihren Workspace korrigieren können.", "hypercare.report.cta": "Fehlende oder falsche Daten melden", "hypercare.report.dismiss": "Verwerfen", - "hypercare.report.adminTriage": "Hypercare-Warteschlange öffnen", + "hypercare.report.adminTriage": "Hypercare-Warteschlange öffnen", "etl.gaps.title": "What did not migrate", - "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", + "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", "etl.gaps.dismiss": "Dismiss", "etl.gaps.apiKeys.title": "API keys", - "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", + "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", "etl.gaps.apiKeys.cta": "Open API keys", "etl.gaps.blobs.title": "File contents (blobs)", - "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", + "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", "etl.gaps.blobs.countHint": "{count} file records are metadata-only (bytes were not migrated).", "etl.gaps.blobs.cta": "Open Files", "etl.gaps.jobs.title": "Processing history", "etl.gaps.jobs.body": "Legacy job and task history was not backfilled for cutover. New jobs you start here will appear normally.", - "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", + "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", "etl.gaps.jobs.migratedHint": "{count} jobs were tagged migrated from an optional backfill.", "etl.gaps.jobs.cta": "Open Processing", "etl.gaps.woo.title": "Store credentials", - "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", + "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", "etl.gaps.woo.cta": "Open Stores", "etl.gaps.settings.title": "Company settings", "etl.gaps.settings.body": "Only language and merge-products settings were imported. Re-check other company preferences in Settings.", @@ -390,52 +390,52 @@ export const de: MessageDict = { "activation.progress": "{done} von {total} erledigt", "activation.stepsLabel": "Aktivierungsschritte", "activation.pausedTitle": "Erste Schritte pausiert", - "activation.pausedBody": "Jederzeit fortsetzen — von Produktfeldern bis Export. Shop-Verbindung bleibt optional.", + "activation.pausedBody": "Jederzeit fortsetzen — von Produktfeldern bis Export. Shop-Verbindung bleibt optional.", "activation.resume": "Checkliste fortsetzen", "activation.step.enable-fields.title": "Produktfelder aktivieren", - "activation.step.enable-fields.body": "Wählen Sie, welche Standard-Produktspalten Descrybe mappen und bereinigen soll.", - "activation.step.connect-source.title": "Produktfeed hinzufügen", - "activation.step.connect-source.body": "Fügen Sie einen CSV- oder XML-Katalogfeed hinzu, damit Produkte in Descrybe gelangen. Eine Live-Shop-Verbindung ist ein späterer optionaler Schritt.", + "activation.step.enable-fields.body": "Wählen Sie, welche Standard-Produktspalten Descrybe mappen und bereinigen soll.", + "activation.step.connect-source.title": "Produktfeed hinzufügen", + "activation.step.connect-source.body": "Fügen Sie einen CSV- oder XML-Katalogfeed hinzu, damit Produkte in Descrybe gelangen. Eine Live-Shop-Verbindung ist ein späterer optionaler Schritt.", "activation.step.map.title": "Feed-Spalten mappen", - "activation.step.map.body": "Öffnen Sie unter Feeds die Map für Ihren Feed, ordnen Sie Lieferantenspalten zu und speichern Sie.", + "activation.step.map.body": "Öffnen Sie unter Feeds die Map für Ihren Feed, ordnen Sie Lieferantenspalten zu und speichern Sie.", "activation.step.sync-sample.title": "Stichprobe synchronisieren", - "activation.step.sync-sample.body": "Synchronisieren Sie unter Feeds eine kleine Stichprobe von einem gemappten Feed, um das Mapping vor dem vollen Lauf zu prüfen.", + "activation.step.sync-sample.body": "Synchronisieren Sie unter Feeds eine kleine Stichprobe von einem gemappten Feed, um das Mapping vor dem vollen Lauf zu prüfen.", "activation.step.process.title": "Produkte verarbeiten", - "activation.step.process.body": "Öffnen Sie unverarbeitete Produkte und starten Sie die Verarbeitung für bereinigte Kataloginhalte.", + "activation.step.process.body": "Öffnen Sie unverarbeitete Produkte und starten Sie die Verarbeitung für bereinigte Kataloginhalte.", "activation.step.store-connect.title": "Shop verbinden", - "activation.step.store-connect.body": "Optional. Verbinden Sie WooCommerce oder Shopify, um Produkte in Ihren Shop zu pushen. Überspringen, wenn Sie nur Feeds und Exporte nutzen.", + "activation.step.store-connect.body": "Optional. Verbinden Sie WooCommerce oder Shopify, um Produkte in Ihren Shop zu pushen. Überspringen, wenn Sie nur Feeds und Exporte nutzen.", "activation.step.export.title": "Export erstellen", - "activation.step.export.body": "Erstellen Sie einen Export-Feed, um bereinigte Produkte als XML oder CSV herunterzuladen oder zu veröffentlichen.", + "activation.step.export.body": "Erstellen Sie einen Export-Feed, um bereinigte Produkte als XML oder CSV herunterzuladen oder zu veröffentlichen.", "stats.products": "Importierte Produkte", "stats.categories": "Kategorien", "stats.attributes": "Attribute", "stats.feeds": "Feeds", "stats.credits": "Guthaben", - "stats.openCatalog": "Katalog öffnen", - "stats.productsHint": "Katalog {processed} · Warteschlange {unprocessed} (getrennte Zähler)", + "stats.openCatalog": "Katalog öffnen", + "stats.productsHint": "Katalog {processed} · Warteschlange {unprocessed} (getrennte Zähler)", "stats.catalogTree": "Katalogbaum", "stats.attributeLibrary": "Attributbibliothek", "stats.importSources": "Importquellen", "stats.payAsYouGo": "Nutzung nach Verbrauch", - "stats.walletBilling": "Wallet · Abrechnung", - "stats.enterpriseBilling": "Enterprise · Abrechnung", - "stats.usedBilling": "{used} verbraucht · Abrechnung", + "stats.walletBilling": "Wallet · Abrechnung", + "stats.enterpriseBilling": "Enterprise · Abrechnung", + "stats.usedBilling": "{used} verbraucht · Abrechnung", "processing.jobStatus.processing": "Verarbeitung", "processing.jobStatus.completed": "Abgeschlossen", "processing.jobStatus.failed": "Fehlgeschlagen", "processing.jobStatus.cancelled": "Abgebrochen", "processing.jobStatus.pending": "Ausstehend", "processing.jobStatus.queued": "In Warteschlange", - "processing.jobStatus.skipped": "Übersprungen", + "processing.jobStatus.skipped": "Übersprungen", "processing.jobStatus.unknown": "Unbekannt", "processing.job.error.all_failed": "Alle {count} Produkte sind fehlgeschlagen.", "processing.job.error.partial_failed": "{count} Produkte sind fehlgeschlagen.", "processing.step.normalize": "Normalisieren", "processing.step.parse_specs": "Specs parsen", - "processing.step.fill_fields": "Felder ausfüllen", + "processing.step.fill_fields": "Felder ausfüllen", "processing.step.eprel": "EPREL", "processing.step.ai_enhance": "KI-Verbesserung", - "processing.type.full": "Vollständige Verarbeitung", + "processing.type.full": "Vollständige Verarbeitung", "processing.type.enhance_only": "Nur verbessern", "processing.type.title": "Nur Titel", "processing.type.description": "Nur Beschreibung", @@ -445,42 +445,42 @@ export const de: MessageDict = { "processing.type.seo": "SEO", "processing.type.normalize": "Normalisieren", "errors.requestFailed": "Anfrage fehlgeschlagen", - "errors.maintenance": "Das System ist in Wartung. Versuchen Sie es später erneut.", - "errors.readOnly": "Das System ist im Nur-Lesen-Modus. Änderungen sind vorübergehend deaktiviert.", - "errors.companyAdminDenied": "Nur Unternehmens-Admins können {action}. Bitten Sie einen Admin um Hilfe.", + "errors.maintenance": "Das System ist in Wartung. Versuchen Sie es später erneut.", + "errors.readOnly": "Das System ist im Nur-Lesen-Modus. Änderungen sind vorübergehend deaktiviert.", + "errors.companyAdminDenied": "Nur Unternehmens-Admins können {action}. Bitten Sie einen Admin um Hilfe.", "errors.companyAdminDenied.actionDefault": "dies tun", - "docs.tryIt.memberCannotCreate": "Nur Unternehmens-Admins können API-Schlüssel erstellen. Legacy-Schlüssel wurden nicht migriert — Schlüssel unten einfügen oder Admin um einen neuen bitten.", - "docs.tryIt.noKeysLegacyAdmin": "Legacy-API-Schlüssel wurden nicht migriert. Neuen Schlüssel über Use my API key oder Einstellungen → API-Schlüssel erstellen — Geheimnis nur einmal sichtbar.", - "docs.tryIt.noKeysLegacyMember": "Keine API-Schlüssel gelistet. Legacy-Schlüssel nicht migriert — Admin um Erstellung bitten oder dk_-Schlüssel einfügen.", + "docs.tryIt.memberCannotCreate": "Nur Unternehmens-Admins können API-Schlüssel erstellen. Legacy-Schlüssel wurden nicht migriert — Schlüssel unten einfügen oder Admin um einen neuen bitten.", + "docs.tryIt.noKeysLegacyAdmin": "Legacy-API-Schlüssel wurden nicht migriert. Neuen Schlüssel über Use my API key oder Einstellungen → API-Schlüssel erstellen — Geheimnis nur einmal sichtbar.", + "docs.tryIt.noKeysLegacyMember": "Keine API-Schlüssel gelistet. Legacy-Schlüssel nicht migriert — Admin um Erstellung bitten oder dk_-Schlüssel einfügen.", "errors.couldNotUpdateLanguage": "Sprache konnte nicht aktualisiert werden", "toast.support.replyTitle": "Support-Antwort", "toast.support.replyBody": "Das Team hat auf Ihr Support-Ticket geantwortet.", "toast.support.replyRe": "Re: {subject}", "toast.support.statusTitle": "Ticketstatus aktualisiert", - "toast.support.statusBody": "Der Status Ihres Support-Tickets hat sich geändert.", + "toast.support.statusBody": "Der Status Ihres Support-Tickets hat sich geändert.", "toast.support.updateTitle": "Support-Update", "assistant.label": "Assistent", - "assistant.open": "Systemassistenten öffnen", - "assistant.close": "Systemassistenten schließen", + "assistant.open": "Systemassistenten öffnen", + "assistant.close": "Systemassistenten schließen", "tutorial.demoTour": "Demo-Tour", "tutorial.jumpToTopic": "Zu einem Thema springen", "tutorial.whereNeedHelp": "Wobei brauchen Sie Hilfe?", - "tutorial.skipTour": "Tour überspringen", - "tutorial.skipAria": "Tutorial überspringen", - "tutorial.pickerBody": "Wählen Sie einen Abschnitt, um diesen Teil der Demo erneut zu öffnen. Das Durchsuchen der Tour ändert Ihre Kontodaten nicht.", + "tutorial.skipTour": "Tour überspringen", + "tutorial.skipAria": "Tutorial überspringen", + "tutorial.pickerBody": "Wählen Sie einen Abschnitt, um diesen Teil der Demo erneut zu öffnen. Das Durchsuchen der Tour ändert Ihre Kontodaten nicht.", "tutorial.sectionsAria": "Tutorial-Abschnitte", - "tutorial.open": "Öffnen", - "tutorial.close": "Schließen", + "tutorial.open": "Öffnen", + "tutorial.close": "Schließen", "tutorial.resumeLastStep": "Letzten Schritt fortsetzen", "tutorial.startFromBeginning": "Von vorn starten", "tutorial.stepOf": "Schritt {current} von {total}", - "tutorial.jumpTo": "Springen zu…", + "tutorial.jumpTo": "Springen zu…", "tutorial.jumpToSectionAria": "Zum Abschnitt springen", - "tutorial.back": "Zurück", + "tutorial.back": "Zurück", "tutorial.pause": "Pausieren", "tutorial.continue": "Weiter", "tutorial.finishTour": "Tour beenden", - "tutorial.missingTargetHint": "Dieses Steuerelement ist auf diesem Bildschirm noch nicht vorhanden. Sie können trotzdem Weiter wählen — die Tour erfordert nie Speichern oder Synchronisieren.", + "tutorial.missingTargetHint": "Dieses Steuerelement ist auf diesem Bildschirm noch nicht vorhanden. Sie können trotzdem Weiter wählen — die Tour erfordert nie Speichern oder Synchronisieren.", "tutorial.section.welcome": "Welcome", "tutorial.section.catalog": "Catalog setup", "tutorial.section.sources": "Feeds", @@ -490,90 +490,90 @@ export const de: MessageDict = { "tutorial.section.grow": "Grow", "tutorial.section.done": "Done", "tutorial.step.welcome.title": "Willkommen bei Descrybe", - "tutorial.step.welcome.body": "Descrybes Kernschleife ist Feeds → Process → Export / Stores. Diese geführte Demo hebt diese Screens auf Ihrem echten Dashboard hervor — ohne Speichern, Sync, Felder aktivieren oder Feeds anlegen. Jederzeit pausieren; Fortsetzen über die Kopfzeile. Springen Sie zu einem Abschnitt, wenn Sie nur bei einem Thema Hilfe brauchen.", - "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", + "tutorial.step.welcome.body": "Descrybes Kernschleife ist Feeds → Process → Export / Stores. Diese geführte Demo hebt diese Screens auf Ihrem echten Dashboard hervor — ohne Speichern, Sync, Felder aktivieren oder Feeds anlegen. Jederzeit pausieren; Fortsetzen über die Kopfzeile. Springen Sie zu einem Abschnitt, wenn Sie nur bei einem Thema Hilfe brauchen.", + "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", "tutorial.step.welcome.nextLabel": "Start tour", - "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", + "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", "tutorial.step.dashboard-overview.title": "Ihr Kommandozentrum", - "tutorial.step.dashboard-overview.body": "Der Katalog-Workflow zeigt den täglichen Pfad: Feeds → Map → Sync → Process. Getting started verfolgt echten Workspace-Fortschritt (getrennt von dieser Demo). Wenn Sie ernsthaft arbeiten wollen, nutzen Sie Manage feeds oder Start processing — dann exportieren oder einen Shop verbinden.", - "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", + "tutorial.step.dashboard-overview.body": "Der Katalog-Workflow zeigt den täglichen Pfad: Feeds → Map → Sync → Process. Getting started verfolgt echten Workspace-Fortschritt (getrennt von dieser Demo). Wenn Sie ernsthaft arbeiten wollen, nutzen Sie Manage feeds oder Start processing — dann exportieren oder einen Shop verbinden.", + "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", "tutorial.step.dashboard-overview.missingHint": "The workflow strip and checklist appear after the dashboard loads.", "tutorial.step.enable-fields.title": "Standardfelder", - "tutorial.step.enable-fields.body": "Standard Fields sind die Produktspalten, die Descrybe zuordnet, verarbeitet und exportiert — Titel, Beschreibung, GTIN, Bilder und mehr. Enable recommended aktiviert einen sinnvollen Standard für die meisten Kataloge. Sie können die Liste später verfeinern, ohne vorhandene Mappings zu brechen.", - "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", + "tutorial.step.enable-fields.body": "Standard Fields sind die Produktspalten, die Descrybe zuordnet, verarbeitet und exportiert — Titel, Beschreibung, GTIN, Bilder und mehr. Enable recommended aktiviert einen sinnvollen Standard für die meisten Kataloge. Sie können die Liste später verfeinern, ohne vorhandene Mappings zu brechen.", + "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", "tutorial.step.enable-fields.warning": "Enabling or disabling fields affects mapping and processing for this company. Prefer Enable recommended once, then tweak carefully.", "tutorial.step.enable-fields.missingHint": "Wait for the Fields page to load, or open Fields from the Catalog section in the sidebar.", "tutorial.step.catalog-depth.title": "Kategorien & Attribute", - "tutorial.step.catalog-depth.body": "Im Katalog-Bereich der Seitenleiste finden Sie auch Categories und Attributes. Categories organisieren den Katalog; Attribute speisen Filter und strukturierte Beschreibungen. Sie müssen sie nicht konfigurieren, um diese Tour zu beenden.", - "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", + "tutorial.step.catalog-depth.body": "Im Katalog-Bereich der Seitenleiste finden Sie auch Categories und Attributes. Categories organisieren den Katalog; Attribute speisen Filter und strukturierte Beschreibungen. Sie müssen sie nicht konfigurieren, um diese Tour zu beenden.", + "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", "tutorial.step.catalog-depth.missingHint": "Expand Catalog in the sidebar to open Categories or Attributes after the tour.", - "tutorial.step.connect-source.title": "Produktquelle hinzufügen", - "tutorial.step.connect-source.body": "Feeds bringen Lieferantenkataloge in Descrybe — CSV-, XML- oder URL-Dateien. Add Feed legt eine neue Quelle an; jede Zeile zeigt den Status (bereit zum Mapping, gemappt, aktiv). Map öffnet den Feldabgleich für diesen Feed.", - "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", + "tutorial.step.connect-source.title": "Produktquelle hinzufügen", + "tutorial.step.connect-source.body": "Feeds bringen Lieferantenkataloge in Descrybe — CSV-, XML- oder URL-Dateien. Add Feed legt eine neue Quelle an; jede Zeile zeigt den Status (bereit zum Mapping, gemappt, aktiv). Map öffnet den Feldabgleich für diesen Feed.", + "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", "tutorial.step.connect-source.warning": "Avoid deleting live feeds unless you intend to remove that source and its sync history.", - "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", + "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", "tutorial.step.map.title": "Quellfelder zuordnen", - "tutorial.step.map.body": "Auf dem Map-Bildschirm eines Feeds ordnen Sie Lieferantenspalten den Descrybe-Standardfeldern zu. Auto-map schlägt Treffer aus Spaltennamen vor; bestätigen Sie unscharfe Treffer und korrigieren Sie Fehler. Save Mappings speichert die Zuordnung, damit Sync und Verarbeitung jede Zeile lesen können.", - "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", - "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", + "tutorial.step.map.body": "Auf dem Map-Bildschirm eines Feeds ordnen Sie Lieferantenspalten den Descrybe-Standardfeldern zu. Auto-map schlägt Treffer aus Spaltennamen vor; bestätigen Sie unscharfe Treffer und korrigieren Sie Fehler. Save Mappings speichert die Zuordnung, damit Sync und Verarbeitung jede Zeile lesen können.", + "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", + "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", "tutorial.step.map.missingHint": "Add a feed and click Map to see the mapping UI; or Continue to keep learning.", "tutorial.step.sync-sample.title": "Stichprobe synchronisieren (wenn bereit)", - "tutorial.step.sync-sample.body": "Nach gespeicherten Mappings zieht Sync + Process sample einen kleinen Batch und startet die Verarbeitung, damit Sie Titel, Bilder und Attribute vor einem Voll-Lauf prüfen können. Full Sync now in der Feed-Liste ist für größere Imports, sobald die Stichprobe gut aussieht.", - "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", + "tutorial.step.sync-sample.body": "Nach gespeicherten Mappings zieht Sync + Process sample einen kleinen Batch und startet die Verarbeitung, damit Sie Titel, Bilder und Attribute vor einem Voll-Lauf prüfen können. Full Sync now in der Feed-Liste ist für größere Imports, sobald die Stichprobe gut aussieht.", + "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", "tutorial.step.sync-sample.warning": "Syncing writes products into this company. Prefer a sample first; avoid Sync now on unmapped feeds.", "tutorial.step.sync-sample.missingHint": "Sync controls appear on feed rows and on the mapping screen footer.", - "tutorial.step.process.title": "Produkte prüfen", - "tutorial.step.process.body": "Products listet synchronisierte und verarbeitete Katalogartikel. Filtern Sie nach Status, öffnen Sie eine Zeile für Details und nutzen Sie EPREL-Badges bei Energielabel-Daten. Hier erkennen Sie Mapping-Fehler vor Export oder Shop-Sync.", - "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", + "tutorial.step.process.title": "Produkte prüfen", + "tutorial.step.process.body": "Products listet synchronisierte und verarbeitete Katalogartikel. Filtern Sie nach Status, öffnen Sie eine Zeile für Details und nutzen Sie EPREL-Badges bei Energielabel-Daten. Hier erkennen Sie Mapping-Fehler vor Export oder Shop-Sync.", + "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", "tutorial.step.process.missingHint": "Wait for the products table, or Continue if the catalog is still empty.", "tutorial.step.processing-hub.title": "Hintergrundverarbeitung", - "tutorial.step.processing-hub.body": "Jobs unter Processing zeigen KI- und Pipeline-Fortschritt: abgeschlossene Läufe und Fehler. Starten Sie Jobs vom Dashboard oder Produkten, wenn Sie bewusst Credits für einen Batch ausgeben wollen.", - "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", + "tutorial.step.processing-hub.body": "Jobs unter Processing zeigen KI- und Pipeline-Fortschritt: abgeschlossene Läufe und Fehler. Starten Sie Jobs vom Dashboard oder Produkten, wenn Sie bewusst Credits für einen Batch ausgeben wollen.", + "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", "tutorial.step.processing-hub.missingHint": "Open Jobs from the Processing section in the sidebar if the page is empty.", "tutorial.step.stores-hub.title": "Shops & Plattformen", - "tutorial.step.stores-hub.body": "Nach der Verarbeitung verbindet Stores WooCommerce oder Shopify, um bereinigte Katalogdaten in Ihren Shop zu pushen. Nutzen Sie das, wenn Marketplace/CMS das Ziel ist — oder springen Sie zu Export feeds, wenn Partner nur Datei/URL brauchen.", - "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", + "tutorial.step.stores-hub.body": "Nach der Verarbeitung verbindet Stores WooCommerce oder Shopify, um bereinigte Katalogdaten in Ihren Shop zu pushen. Nutzen Sie das, wenn Marketplace/CMS das Ziel ist — oder springen Sie zu Export feeds, wenn Partner nur Datei/URL brauchen.", + "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", "tutorial.step.stores-hub.missingHint": "Open Stores from the sidebar to see connection cards.", "tutorial.step.export.title": "Bereinigte Produkte exportieren", - "tutorial.step.export.body": "Export feeds veröffentlichen bereinigte Produkte als XML oder CSV für Kanäle, Partner oder Ihren Shop. Erstellen Sie einen Export, wählen Sie Format und Filter, dann teilen Sie die Feed-URL oder laden herunter. Exporte lesen verarbeitete Katalogdaten — zuerst mappen und verarbeiten für beste Ergebnisse.", - "tutorial.step.export.tip": "You don’t need to create an export during the demo.", - "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", + "tutorial.step.export.body": "Export feeds veröffentlichen bereinigte Produkte als XML oder CSV für Kanäle, Partner oder Ihren Shop. Erstellen Sie einen Export, wählen Sie Format und Filter, dann teilen Sie die Feed-URL oder laden herunter. Exporte lesen verarbeitete Katalogdaten — zuerst mappen und verarbeiten für beste Ergebnisse.", + "tutorial.step.export.tip": "You don’t need to create an export during the demo.", + "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", "tutorial.step.export.missingHint": "Wait for Export feeds to load, or open Exports from the Feeds section in the sidebar.", "tutorial.step.billing-hub.title": "Credits & Abrechnung", - "tutorial.step.billing-hub.body": "Billing zeigt Ihren Plan, Wallet und verbleibende Credits. Verarbeitung und einige AI-Funktionen belasten dieses Guthaben. Behalten Sie die Nutzung vor großen Katalogläufen im Blick.", - "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", + "tutorial.step.billing-hub.body": "Billing zeigt Ihren Plan, Wallet und verbleibende Credits. Verarbeitung und einige AI-Funktionen belasten dieses Guthaben. Behalten Sie die Nutzung vor großen Katalogläufen im Blick.", + "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", "tutorial.step.billing-hub.missingHint": "Open Billing from the Account section in the sidebar.", "tutorial.step.grow-hub.title": "Kampagnen, SEO & Reviews", - "tutorial.step.grow-hub.body": "Unter Marketing: Campaigns erzeugt Inhalte, Content calendar plant Posts, SEO prüft Listings und Reviews bindet WooCommerce ein. Das baut auf einem gesunden gemappten Katalog auf — schließen Sie Feeds → Process → Export / Stores ab, bevor Sie sich darauf stützen.", - "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", + "tutorial.step.grow-hub.body": "Unter Marketing: Campaigns erzeugt Inhalte, Content calendar plant Posts, SEO prüft Listings und Reviews bindet WooCommerce ein. Das baut auf einem gesunden gemappten Katalog auf — schließen Sie Feeds → Process → Export / Stores ab, bevor Sie sich darauf stützen.", + "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", "tutorial.step.grow-hub.missingHint": "Open Campaigns from Marketing in the sidebar, or Continue.", "tutorial.step.tour-done.title": "Bereit zum Erkunden", - "tutorial.step.tour-done.body": "Das ist die Produktkarte: Feeds → Map → Sync → Process → Export / Stores. Nutzen Sie Getting started auf dem Dashboard für echte Einrichtung. Tour jederzeit in der Kopfzeile fortsetzen/neu starten, oder Jump to… einen Abschnitt. Skip tour beendet die Demo ohne Checklistenänderung.", - "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", + "tutorial.step.tour-done.body": "Das ist die Produktkarte: Feeds → Map → Sync → Process → Export / Stores. Nutzen Sie Getting started auf dem Dashboard für echte Einrichtung. Tour jederzeit in der Kopfzeile fortsetzen/neu starten, oder Jump to… einen Abschnitt. Skip tour beendet die Demo ohne Checklistenänderung.", + "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", "tutorial.step.tour-done.nextLabel": "Finish tour", "tutorial.step.tour-done.missingHint": "Return to the dashboard to finish.", "news.uxImprovements.title": "Verbesserungen der Benutzerfreundlichkeit", "flash.contentLanguageUpdated": "Inhaltssprache aktualisiert.", "theme.darkMode": "Dunkelmodus", "theme.lightMode": "Hellmodus", - "forbidden.title.accessRestricted": "Zugriff eingeschränkt", + "forbidden.title.accessRestricted": "Zugriff eingeschränkt", "forbidden.title.permissionDenied": "Berechtigung verweigert", - "forbidden.message.support": "Dieser Bereich ist nur für Support-Mitarbeiter und Plattform-Admins verfügbar.", - "forbidden.message.platform": "Dieser Bereich ist nur für Plattform-Admins verfügbar.", - "forbidden.message.company": "Sie haben dafür keine Berechtigung. Bitten Sie einen Unternehmens-Admin um Hilfe.", - "forbidden.backToDashboard": "Zurück zum Dashboard", + "forbidden.message.support": "Dieser Bereich ist nur für Support-Mitarbeiter und Plattform-Admins verfügbar.", + "forbidden.message.platform": "Dieser Bereich ist nur für Plattform-Admins verfügbar.", + "forbidden.message.company": "Sie haben dafür keine Berechtigung. Bitten Sie einen Unternehmens-Admin um Hilfe.", + "forbidden.backToDashboard": "Zurück zum Dashboard", "admin.chrome.platformOps": "Plattform-Ops", "admin.chrome.sidebar": "Seitenleiste Plattform-Ops", "admin.chrome.nav": "Plattform-Ops", - "admin.chrome.mobileMenu": "Mobiles Menü Plattform-Ops", + "admin.chrome.mobileMenu": "Mobiles Menü Plattform-Ops", "admin.chrome.opsBadge": "Ops", - "admin.chrome.backToApp": "Zurück zur App", + "admin.chrome.backToApp": "Zurück zur App", "admin.chrome.uiLanguage": "UI-Sprache", "admin.chrome.staff.supportDesk": "Support-Desk", "admin.chrome.staff.platformAdmin": "Plattform-Admin", "admin.chrome.staff.staff": "Mitarbeiter", "admin.chrome.staff.admin": "Admin", - "admin.nav.section.overview": "Übersicht", + "admin.nav.section.overview": "Übersicht", "admin.nav.section.directory": "Verzeichnis", "admin.nav.section.support": "Hilfezentrum", "admin.nav.section.ops": "Betrieb", @@ -585,17 +585,17 @@ export const de: MessageDict = { "admin.nav.tickets": "Tickets", "admin.nav.knowledge": "Wissen", "admin.nav.diagnostics": "Diagnose", - "admin.nav.stuckProducts": "Hängengebliebene Produkte", + "admin.nav.stuckProducts": "Hängengebliebene Produkte", "admin.nav.orphanProcessed": "Orphan processed", "admin.nav.billing": "Abrechnung", "admin.nav.sales": "Sales", - "admin.nav.translations": "Übersetzungen", + "admin.nav.translations": "Übersetzungen", "admin.nav.settings": "Einstellungen", "admin.sales.title": "Sales leads", "admin.sales.description": "Inbound Contact sales messages and custom payment quotes.", "admin.sales.listTitle": "Leads", "admin.sales.listDesc": "{total} matching leads", - "admin.sales.searchPlaceholder": "Search name, email, company…", + "admin.sales.searchPlaceholder": "Search name, email, company…", "admin.sales.statusAll": "All statuses", "admin.sales.status.new": "New", "admin.sales.status.contacted": "Contacted", @@ -643,7 +643,7 @@ export const de: MessageDict = { "admin.sales.col.status": "Status", "admin.sales.col.created": "Created", "sales.contact.title": "Contact sales", - "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", + "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", "sales.contact.formTitle": "Send a message", "sales.contact.formLead": "Enterprise and custom deals are prepared by our team, then paid via Stripe Checkout.", "sales.contact.name": "Name", @@ -653,31 +653,31 @@ export const de: MessageDict = { "sales.contact.estimatedSkus": "Estimated SKUs (optional)", "sales.contact.message": "How can we help?", "sales.contact.submit": "Send message", - "sales.contact.submitting": "Sending…", + "sales.contact.submitting": "Sending…", "sales.contact.error": "Could not send your message. Please try again.", - "sales.contact.toast.success": "Message sent — we will follow up soon.", - "sales.contact.thanksTitle": "Thanks — we got your message", + "sales.contact.toast.success": "Message sent — we will follow up soon.", + "sales.contact.thanksTitle": "Thanks — we got your message", "sales.contact.thanksBody": "A platform admin will review your request and can send a Checkout link for a custom plan.", "sales.contact.bookDemo": "Book a live demo", "sales.contact.orBookDemo": "Or book a Calendly demo", "sales.contact.backPricing": "Back to pricing", "admin.overview.eyebrow": "Kommandozentrale", - "admin.overview.title": "Plattformübersicht", - "admin.overview.description": "Live-Puls der Plattform aus der Analyseübersicht — zu Betrieb, Einblicken und Support springen.", + "admin.overview.title": "Plattformübersicht", + "admin.overview.description": "Live-Puls der Plattform aus der Analyseübersicht — zu Betrieb, Einblicken und Support springen.", "admin.overview.tokens": "Token-Einheiten", - "admin.overview.tokensHint": "Gesamt · Zeitraum", + "admin.overview.tokensHint": "Gesamt · Zeitraum", "admin.overview.credits": "Guthaben", - "admin.overview.creditsHint": "Über alle Unternehmen", - "admin.overview.jobs": "Aufträge", + "admin.overview.creditsHint": "Über alle Unternehmen", + "admin.overview.jobs": "Aufträge", "admin.overview.jobsHint": "Warteschlangen-Snapshot", "admin.overview.platform": "Plattform", - "admin.overview.platformHint": "Mandanten · Volumen", + "admin.overview.platformHint": "Mandanten · Volumen", "admin.overview.signals": "Aktuelle Signale", "admin.overview.shortcuts": "Ops-Kurzbefehle", "admin.overview.providers": "KI-Anbieter-Mix", "admin.overview.internalAi": "Interne KI", "admin.overview.internalAiHint": "Plattformeinstellungen", - "admin.overview.popularKeys": "Beliebte Schlüssel", + "admin.overview.popularKeys": "Beliebte Schlüssel", "admin.overview.popularKeysHint": "Beliebte Mandanten-Anbieter", "admin.overview.customUrl": "Benutzerdefinierte URL", "admin.overview.customUrlHint": "Benutzerdefinierte Basis-URL des Mandanten", @@ -691,16 +691,16 @@ export const de: MessageDict = { "admin.overview.shortcut.knowledge.desc": "Artikel, Vorlagen, Auto-Antwort", "admin.overview.shortcut.users.title": "Benutzer & Orgs", "admin.overview.shortcut.users.desc": "Konten, Unternehmen, Einladungen", - "admin.overview.shortcut.stuck.title": "Hängengebliebene Produkte", - "admin.overview.shortcut.stuck.desc": "Läuft länger als 2 Stunden", - "admin.overview.signal.stuckTitle": "{count} hängengebliebener Job", - "admin.overview.signal.stuckTitlePlural": "{count} hängengebliebene Jobs", - "admin.overview.signal.stuckDetail": "Läuft länger als 2 Stunden — prüfen und ggf. zurücksetzen.", - "admin.overview.signal.stuckCta": "Hängengebliebene Jobs öffnen", + "admin.overview.shortcut.stuck.title": "Hängengebliebene Produkte", + "admin.overview.shortcut.stuck.desc": "Läuft länger als 2 Stunden", + "admin.overview.signal.stuckTitle": "{count} hängengebliebener Job", + "admin.overview.signal.stuckTitlePlural": "{count} hängengebliebene Jobs", + "admin.overview.signal.stuckDetail": "Läuft länger als 2 Stunden — prüfen und ggf. zurücksetzen.", + "admin.overview.signal.stuckCta": "Hängengebliebene Jobs öffnen", "admin.overview.signal.failedTitle": "{count} fehlgeschlagen in den letzten {days} T", "admin.overview.signal.failedDetail": "{completed} im selben Fenster abgeschlossen.", - "admin.overview.signal.failedDetailRate": "{rate}% Fehlerrate · {completed} abgeschlossen.", - "admin.overview.signal.failedCta": "Diagnose öffnen", + "admin.overview.signal.failedDetailRate": "{rate}% Fehlerrate · {completed} abgeschlossen.", + "admin.overview.signal.failedCta": "Diagnose öffnen", "admin.overview.signal.runningTitle": "{count} laufender Job", "admin.overview.signal.runningTitlePlural": "{count} laufende Jobs", "admin.overview.signal.runningDetail": "Aktive Verarbeitungsjobs gerade jetzt.", @@ -708,45 +708,45 @@ export const de: MessageDict = { "admin.overview.signal.ticketsTitle": "{count} offenes Support-Ticket", "admin.overview.signal.ticketsTitlePlural": "{count} offene Support-Tickets", "admin.overview.signal.ticketsDetail": "Offene oder ausstehende Tickets im Support-Desk.", - "admin.overview.signal.ticketsCta": "Support öffnen", - "admin.overview.signal.clearTitle": "Keine erhöhten Signale", - "admin.overview.signal.clearDetail": "Keine hängengebliebenen Jobs, Periodenfehler oder offenen Tickets in der Live-Zusammenfassung (letzte {days} T).", - "admin.overview.signal.clearCta": "In der Diagnose bestätigen", + "admin.overview.signal.ticketsCta": "Support öffnen", + "admin.overview.signal.clearTitle": "Keine erhöhten Signale", + "admin.overview.signal.clearDetail": "Keine hängengebliebenen Jobs, Periodenfehler oder offenen Tickets in der Live-Zusammenfassung (letzte {days} T).", + "admin.overview.signal.clearCta": "In der Diagnose bestätigen", "admin.overview.badge.action": "Aktion", - "admin.overview.badge.watch": "Überwachen", + "admin.overview.badge.watch": "Überwachen", "admin.overview.badge.live": "Live", "admin.overview.badge.clear": "Leeren", "admin.overview.summaryLoadFailed": "Live-Zusammenfassung konnte nicht geladen werden. Die Shortcuts unten funktionieren weiter.", "admin.overview.keyMetrics": "Kennzahlen", - "admin.overview.summaryWindow": "Letzte {days} T · Summary-Endpunkt", + "admin.overview.summaryWindow": "Letzte {days} T · Summary-Endpunkt", "admin.overview.tokensPeriod": "{count} in den letzten {days} T", "admin.overview.creditsFoot": "{remaining} verbleibend von {allocated} zugewiesen", - "admin.overview.jobsFoot": "{failed} fehlgeschlagen · {running} laufend · {stuck} hängend", - "admin.overview.platformFoot": "{users} Nutzer · {processed} verarbeitet · {feeds} Eingabe-Feeds", - "admin.overview.fullDiagnostics": "Vollständige Diagnose", + "admin.overview.jobsFoot": "{failed} fehlgeschlagen · {running} laufend · {stuck} hängend", + "admin.overview.platformFoot": "{users} Nutzer · {processed} verarbeitet · {feeds} Eingabe-Feeds", + "admin.overview.fullDiagnostics": "Vollständige Diagnose", "admin.overview.also": "Auch:", "admin.overview.linkSupport": "Support-Desk", "admin.overview.charts": "Diagramme", - "admin.overview.providerFoot": "{jobs} Jobs · {products} Produkte", + "admin.overview.providerFoot": "{jobs} Jobs · {products} Produkte", "admin.analytics.eyebrow": "Einblicke", "admin.analytics.title": "Analysen & Berichte", "admin.analytics.description": "Live-KPIs und Trends der Plattform aus Tokens, Jobs, Anmeldungen, Feeds, Tickets und Abrechnung.", "admin.analytics.period": "Zeitraum", - "admin.analytics.refreshing": "Aktualisieren…", + "admin.analytics.refreshing": "Aktualisieren…", "admin.analytics.llmTokens": "LLM-Tokens", "admin.analytics.credits": "Credits", "admin.analytics.jobs": "Jobs", "admin.analytics.volume": "Volumen", "admin.analytics.failureRate": "Fehlerrate", - "admin.analytics.stuckJobs": "Hängengebliebene Jobs", - "admin.analytics.apiKeys": "API-Schlüssel", + "admin.analytics.stuckJobs": "Hängengebliebene Jobs", + "admin.analytics.apiKeys": "API-Schlüssel", "admin.analytics.signups": "Anmeldungen", "admin.analytics.internalAi": "Interne KI", "admin.analytics.internalAiHint": "Plattform-OpenAI (Admin-Einstellungen)", - "admin.analytics.popularKeys": "Beliebte Schlüssel", - "admin.analytics.popularKeysHint": "Mandanten-OpenAI / Groq / …", + "admin.analytics.popularKeys": "Beliebte Schlüssel", + "admin.analytics.popularKeysHint": "Mandanten-OpenAI / Groq / …", "admin.analytics.customUrl": "Benutzerdefinierte URL/Modell", - "admin.analytics.customUrlHint": "Mandanten-Basis-URL + Modell + Schlüssel", + "admin.analytics.customUrlHint": "Mandanten-Basis-URL + Modell + Schlüssel", "admin.analytics.tokensByDay": "Tokens pro Tag", "admin.analytics.tokensByProvider": "Tokens nach Anbieterklasse", "admin.analytics.tokensByProviderAria": "Tokens nach Anbieterklasse", @@ -754,14 +754,14 @@ export const de: MessageDict = { "admin.analytics.popularCount": "Beliebt {count}", "admin.analytics.customCount": "Benutzerdefiniert {count}", "admin.analytics.jobsByDay": "Jobs pro Tag", - "admin.analytics.jobsByDayHint": "Erstellte Jobs (sekundär = fehlgeschlagen).", + "admin.analytics.jobsByDayHint": "Erstellte Jobs (sekundär = fehlgeschlagen).", "admin.analytics.signupsByDay": "Anmeldungen pro Tag", - "admin.analytics.signupsByDayHint": "Neue Benutzer (primär) und Unternehmen (sekundär)", + "admin.analytics.signupsByDayHint": "Neue Benutzer (primär) und Unternehmen (sekundär)", "admin.analytics.processingJobsStatus": "processing_jobs nach Status", "admin.analytics.feedSyncStatus": "feed_sync_jobs nach Status", "admin.analytics.ticketsStatus": "support_tickets nach Status", "admin.analytics.providerDetail": "Anbieterdetails", - "admin.analytics.providerDetailHint": "Top-Anbietermodi (für Payload-Größe begrenzt).", + "admin.analytics.providerDetailHint": "Top-Anbietermodi (für Payload-Größe begrenzt).", "admin.analytics.noProviderRows": "Keine Anbieterzeilen", "admin.analytics.provider": "Anbieter", "admin.analytics.class": "Klasse", @@ -776,17 +776,17 @@ export const de: MessageDict = { "admin.analytics.custom": "Benutzerdefiniert", "admin.analytics.noBillingCycles": "Noch keine Abrechnungszyklen", "admin.analytics.linkDiagnostics": "Diagnose", - "admin.analytics.linkStuck": "Hängengebliebene Produkte", + "admin.analytics.linkStuck": "Hängengebliebene Produkte", "admin.users.eyebrow": "Plattform-Admin", "admin.users.title": "Benutzer & Organisationen", "admin.users.description": "Plattform-Benutzerverzeichnis, Mitarbeiterrollen und Unternehmensplan-Zuweisungen.", - "admin.users.staffRoleUnavailable": "Mitarbeiterrollen-Updates sind auf diesem Deployment noch nicht verfügbar. Kontaktieren Sie Ihren Plattform-Admin bei Bedarf.", + "admin.users.staffRoleUnavailable": "Mitarbeiterrollen-Updates sind auf diesem Deployment noch nicht verfügbar. Kontaktieren Sie Ihren Plattform-Admin bei Bedarf.", "admin.users.search": "Suchen", "admin.users.tabUsers": "Benutzer", "admin.users.tabCompanies": "Unternehmen", "admin.users.filterWithoutPlan": "Ohne Plan", - "admin.users.filterWithoutApiKeys": "Schlüssel zur Neuausstellung", - "admin.users.needsApiKeyReissue": "API-Schlüssel neu ausstellen", + "admin.users.filterWithoutApiKeys": "Schlüssel zur Neuausstellung", + "admin.users.needsApiKeyReissue": "API-Schlüssel neu ausstellen", "admin.users.colName": "Bezeichnung", "admin.users.colStaffRole": "Mitarbeiterrolle", "admin.users.colStatus": "Zustand", @@ -805,19 +805,19 @@ export const de: MessageDict = { "admin.users.cloneCatalog": "In mein Unternehmen kopieren", "admin.users.cloneCatalogAria": "Katalog von {name} in mein Sandbox-Unternehmen kopieren", "admin.users.cloneCatalogTitle": "Unternehmenskatalog kopieren", - "admin.users.cloneCatalogDesc": "Sie bleiben auf Ihrem Admin-Konto. Quelldaten bleiben unverändert.", + "admin.users.cloneCatalogDesc": "Sie bleiben auf Ihrem Admin-Konto. Quelldaten bleiben unverändert.", "admin.users.cloneCatalogFrom": "Quelle: {name}", "admin.users.cloneCatalogInto": "Ziel: {name}", - "admin.users.cloneCatalogWarning": "Ersetzt Kategorien, Feeds, Produkte, Attribute, Mappings und Branding im Ziel. Plan, Abrechnung, Mitglieder, API-Schlüssel und Store-Connectoren werden nicht kopiert.", + "admin.users.cloneCatalogWarning": "Ersetzt Kategorien, Feeds, Produkte, Attribute, Mappings und Branding im Ziel. Plan, Abrechnung, Mitglieder, API-Schlüssel und Store-Connectoren werden nicht kopiert.", "admin.users.cloneCatalogCancel": "Abbrechen", "admin.users.cloneCatalogConfirm": "Katalog kopieren", "admin.users.cloneDestFallback": "Ihr Sandbox-Unternehmen", "admin.users.fixA1": "A1-Katalog reparieren", - "admin.users.fixA1Aria": "KI-Prompts, Kategorien und Enhance-Hashes für {name} reparieren", + "admin.users.fixA1Aria": "KI-Prompts, Kategorien und Enhance-Hashes für {name} reparieren", "admin.users.fixA1Title": "Unternehmenskatalog reparieren", - "admin.users.fixA1Desc": "Wendet korrigierte KI-Prompts erneut an, löst schwache Enhance-Hashes und füllt Kategorien aus mapped_data nach.", + "admin.users.fixA1Desc": "Wendet korrigierte KI-Prompts erneut an, löst schwache Enhance-Hashes und füllt Kategorien aus mapped_data nach.", "admin.users.fixA1Company": "Unternehmen: {name}", - "admin.users.fixA1Warning": "Bevorzugen Sie Platform Demo oder ein explizites Unternehmen. Löscht keine Feeds, Mappings oder Rohprodukte. Schützt A1-Kohorten-Überschreibregeln.", + "admin.users.fixA1Warning": "Bevorzugen Sie Platform Demo oder ein explizites Unternehmen. Löscht keine Feeds, Mappings oder Rohprodukte. Schützt A1-Kohorten-Überschreibregeln.", "admin.users.fixA1Cancel": "Abbrechen", "admin.users.fixA1Confirm": "Katalog reparieren", "admin.users.noUsers": "Keine Benutzer entsprechen diesem Filter.", @@ -827,14 +827,14 @@ export const de: MessageDict = { "admin.users.staffRole": "Mitarbeiterrolle", "admin.users.saveRole": "Rolle speichern", "admin.users.assignPlanTitle": "Plan zuweisen", - "admin.users.assignPlanDesc": "Öffentlichen, Legacy- oder benutzerdefinierten Plan diesem Unternehmen zuweisen.", - "admin.users.selectPlan": "Plan auswählen", + "admin.users.assignPlanDesc": "Öffentlichen, Legacy- oder benutzerdefinierten Plan diesem Unternehmen zuweisen.", + "admin.users.selectPlan": "Plan auswählen", "admin.users.assign": "Zuweisen", "admin.settings.title": "Plattformeinstellungen", - "admin.settings.description": "Plattform-Anmeldedaten, KI-Rollen, Mail und Integrationen für dieses Deployment", + "admin.settings.description": "Plattform-Anmeldedaten, KI-Rollen, Mail und Integrationen für dieses Deployment", "admin.settings.intro": "Konfigurieren Sie hier Plattform-KI-Rollen, SMTP, OAuth, EPREL, Pinecone und Stripe. Lassen Sie Geheimfelder leer, um den gespeicherten Wert zu behalten. Firmen-Keys bleiben unter Mandanten-Integrationen.", - "admin.settings.aiRolesUnavailable": "Vollständige KI-Rollen sind auf diesem Deployment noch nicht verfügbar. Verarbeitung speichert weiter über Plattform-OpenAI; andere Rollen werden persistiert, sobald unterstützt.", - "admin.settings.tab.integrations": "Übersicht", + "admin.settings.aiRolesUnavailable": "Vollständige KI-Rollen sind auf diesem Deployment noch nicht verfügbar. Verarbeitung speichert weiter über Plattform-OpenAI; andere Rollen werden persistiert, sobald unterstützt.", + "admin.settings.tab.integrations": "Übersicht", "admin.settings.tab.ai": "KI-Rollen", "admin.settings.tab.mail": "Mail", "admin.settings.tab.other": "Sonstiges", @@ -842,26 +842,26 @@ export const de: MessageDict = { "admin.settings.mailCardDesc": "Passwort-Einladungen und ausgehende Plattform-E-Mail", "admin.settings.integrationsCardDesc": "OAuth, EPREL, Pinecone, Stripe, Feeds", "admin.settings.tenantVsPlatform": "Mandant vs Plattform", - "admin.settings.hostSecrets": "Server-Datenbank-, Sitzungs- und Signaturgeheimnisse — nur auf dem Host konfigurieren", + "admin.settings.hostSecrets": "Server-Datenbank-, Sitzungs- und Signaturgeheimnisse — nur auf dem Host konfigurieren", "admin.settings.linkAi": "KI", "admin.settings.linkEmail": "E-Mail", "admin.settings.linkBilling": "Abrechnung", "admin.settings.provider": "Anbieter", "admin.settings.model": "Modell", "admin.settings.baseUrl": "Basis-URL", - "admin.settings.apiKey": "API-Schlüssel", + "admin.settings.apiKey": "API-Schlüssel", "admin.settings.embeddingDims": "Embedding-Dimensionen (optional)", "admin.settings.smtpHost": "SMTP-Host", "admin.settings.port": "Port", "admin.settings.username": "Benutzername", "admin.settings.fromAddress": "Absenderadresse", - "admin.settings.testRecipient": "Testempfänger (optional)", - "admin.settings.testRecipientPlaceholder": "Standardmäßig Ihre Admin-E-Mail", + "admin.settings.testRecipient": "Testempfänger (optional)", + "admin.settings.testRecipientPlaceholder": "Standardmäßig Ihre Admin-E-Mail", "admin.settings.googleOauth": "Google OAuth", "admin.settings.googleOauthDesc": "Optionale Plattform-Google-OAuth-Client-Anmeldedaten.", "admin.settings.clientId": "Client-ID", "admin.settings.eprel": "EPREL", - "admin.settings.timeout": "Zeitüberschreitung", + "admin.settings.timeout": "Zeitüberschreitung", "admin.settings.ficheLanguage": "Fiche-Sprache", "admin.settings.pinecone": "Pinecone", "admin.settings.host": "Host", @@ -879,7 +879,7 @@ export const de: MessageDict = { "admin.settings.priceScaleMo": "Scale monthly price ID", "admin.settings.priceScaleYr": "Scale yearly price ID", "admin.settings.creditPackPrices": "AI credit pack price IDs (one-time)", - "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", + "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", "admin.settings.syncCreditPacks": "Sync Stripe packs", "admin.settings.syncCreditPacksOk": "Synced {count} credit pack price(s) ({mode} mode).", "admin.settings.syncCreditPacksModeHint": "Stripe mode for this sync: {mode}. Switch the secret key (sk_test_ vs sk_live_) to sync the other environment.", @@ -888,36 +888,36 @@ export const de: MessageDict = { "admin.settings.pricePackMedium": "Growth pack (2,000 credits) price ID", "admin.settings.pricePackLarge": "Catalog pack (10,000 credits) price ID", "admin.settings.pricePackXL": "Scale pack (40,000 credits) price ID", - "admin.settings.feedAllowlist": "Allowlist für private Feed-URLs", + "admin.settings.feedAllowlist": "Allowlist für private Feed-URLs", "admin.settings.allowlist": "Allowlist", "admin.settings.platformAdmins": "Plattform-Administratoren", "admin.settings.colUserId": "Benutzer-ID", "admin.settings.colEmail": "E-Mail", "admin.settings.colName": "Bezeichnung", - "admin.settings.colAddedOn": "Hinzugefügt am", + "admin.settings.colAddedOn": "Hinzugefügt am", "admin.settings.colRole": "Rolle", "admin.settings.platformAdminBadge": "Plattform-Admin", "admin.settings.noAdmins": "Keine Admin-Benutzer gefunden", - "admin.settings.adminStatusCheck": "Admin-Statusprüfung", + "admin.settings.adminStatusCheck": "Admin-Statusprüfung", "admin.settings.bootstrapPage": "Bootstrap-Seite", "admin.readiness.title": "Cutover-Bereitschaft", - "admin.readiness.detail": "Hypercare-Zähler, die vor dem DNS-Umstellung noch Aufmerksamkeit brauchen.", - "admin.readiness.mustSetPassword": "{count} Benutzer müssen ein Passwort setzen", + "admin.readiness.detail": "Hypercare-Zähler, die vor dem DNS-Umstellung noch Aufmerksamkeit brauchen.", + "admin.readiness.mustSetPassword": "{count} Benutzer müssen ein Passwort setzen", "admin.readiness.withoutAdmin": "{count} Unternehmen ohne Admin", "admin.readiness.withoutPlan": "{count} Unternehmen ohne aktiven Plan", - "admin.readiness.withoutApiKeys": "{count} Unternehmen brauchen API-Schlüssel-Neuausstellung", + "admin.readiness.withoutApiKeys": "{count} Unternehmen brauchen API-Schlüssel-Neuausstellung", "admin.readiness.linksAria": "Bereitschafts-Deep-Links", "admin.readiness.linkUsers": "Benutzer", "admin.readiness.linkBilling": "Abrechnung", "admin.readiness.linkSettings": "Einstellungen", - "admin.readiness.linkApiKeys": "Schlüssel zur Neuausstellung", + "admin.readiness.linkApiKeys": "Schlüssel zur Neuausstellung", "admin.diagnostics.eyebrow": "Plattform", "admin.diagnostics.title": "Diagnose", - "admin.diagnostics.description": "Ops-Konsole für App-Gesundheit, Warteschlangentiefe, aktuelle Jobs und Config-Flags. Secrets und DSNs werden nie angezeigt; Jobfehler sind bereinigt.", + "admin.diagnostics.description": "Ops-Konsole für App-Gesundheit, Warteschlangentiefe, aktuelle Jobs und Config-Flags. Secrets und DSNs werden nie angezeigt; Jobfehler sind bereinigt.", "admin.diagnostics.filterAria": "Job-Statusfilter", "admin.diagnostics.queue": "Warteschlange", "admin.diagnostics.noJobsInQueue": "Keine Jobs in der Warteschlange.", - "admin.diagnostics.sanitizedErrors": "Bereinigte Fehler · max. 25", + "admin.diagnostics.sanitizedErrors": "Bereinigte Fehler · max. 25", "admin.diagnostics.colId": "ID", "admin.diagnostics.colCompany": "Unternehmen", "admin.diagnostics.colStatus": "Zustand", @@ -926,17 +926,17 @@ export const de: MessageDict = { "admin.diagnostics.colError": "Fehler", "admin.diagnostics.colTicket": "Ticket", "admin.diagnostics.colWhen": "Wann", - "admin.diagnostics.noJobsFilter": "Keine Jobs für diesen Filter.", - "admin.stuck.title": "Hängengebliebene Produkte", - "admin.stuck.description": "Aktuelle Verarbeitungsjobs prüfen und länger als 2 Stunden hängengebliebene zurücksetzen", + "admin.diagnostics.noJobsFilter": "Keine Jobs für diesen Filter.", + "admin.stuck.title": "Hängengebliebene Produkte", + "admin.stuck.description": "Aktuelle Verarbeitungsjobs prüfen und länger als 2 Stunden hängengebliebene zurücksetzen", "admin.stuck.noJobs": "Keine Jobs gefunden.", "admin.stuck.filterAria": "Jobs nach Status filtern", "admin.orphan.title": "Orphan processed", - "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", + "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", "admin.orphan.cutoverHint": "Safe by default: refresh and dry-run never delete. Confirm delete sends confirm=true only after you approve the dialog.", "admin.orphan.refreshReport": "Refresh report", "admin.orphan.dryRunBtn": "Dry-run cleanup", - "admin.orphan.deleteBtn": "Confirm delete…", + "admin.orphan.deleteBtn": "Confirm delete…", "admin.orphan.loadFailed": "Could not load orphan report", "admin.orphan.dryRunFailed": "Dry-run cleanup failed", "admin.orphan.deleteFailed": "Confirmed orphan cleanup failed", @@ -947,7 +947,7 @@ export const de: MessageDict = { "admin.orphan.samplesDesc": "Up to 25 most recently updated orphan catalog rows", "admin.orphan.cleanBadge": "Clean", "admin.orphan.needsCleanupBadge": "Needs cleanup", - "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", + "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", "admin.orphan.noSamples": "No sample rows in this report.", "admin.orphan.colProcessed": "Processed ID", "admin.orphan.colCompany": "Company", @@ -963,22 +963,22 @@ export const de: MessageDict = { "admin.orphan.confirmDesc": "This permanently deletes {total} processed_products row(s) whose raw is missing or unprocessed. Job product links use ON DELETE SET NULL.", "admin.orphan.confirmDelete": "Delete orphans", "admin.billing.title": "Billing-Admin", - "admin.billing.description": "Verwalten Sie Pläne, Credits, Feature-Berechtigungen pro Paket und plattformweite Feature-Schalter.", + "admin.billing.description": "Verwalten Sie Pläne, Credits, Feature-Berechtigungen pro Paket und plattformweite Feature-Schalter.", "admin.billing.noCompanies": "Keine Unternehmen gefunden.", "admin.billing.noCompaniesFilter": "Keine Unternehmen entsprechen diesem Filter.", "admin.billing.assignPlanTitle": "Plan zuweisen", - "admin.billing.assignPlanDesc": "Weisen Sie einem Unternehmen einen Abrechnungsplan zu. Optionale Test-Credits setzen den Firmensaldo für den Testzeitraum zurück.", - "admin.billing.creditsTitle": "Credits hinzufügen / anpassen", + "admin.billing.assignPlanDesc": "Weisen Sie einem Unternehmen einen Abrechnungsplan zu. Optionale Test-Credits setzen den Firmensaldo für den Testzeitraum zurück.", + "admin.billing.creditsTitle": "Credits hinzufügen / anpassen", "admin.billing.creditsDesc": "Guthaben eines Unternehmens gutschreiben oder belasten.", - "admin.billing.searchCompany": "Unternehmen suchen…", + "admin.billing.searchCompany": "Unternehmen suchen…", "admin.knowledge.draft": "Entwurf", "admin.knowledge.badge.draft": "Entwurf", "admin.knowledge.newArticle": "Neuer Artikel", "admin.knowledge.editArticle": "Artikel bearbeiten", "admin.knowledge.noMatchingArticles": "Keine passenden Artikel", "admin.knowledge.noArticles": "Keine Wissensartikel", - "admin.knowledge.emptyCategoryMsg": "Kategorie „{category}“ ist bereit — fügen Sie eine Artikelschale hinzu, die ein Content-Agent füllt.", - "admin.knowledge.emptyArticlesMsg": "Fügen Sie FAQ-artige Schalen mit Kategorien und Keywords hinzu. Lassen Sie Platzhalter im Text für Content-Agenten.", + "admin.knowledge.emptyCategoryMsg": "Kategorie „{category}“ ist bereit — fügen Sie eine Artikelschale hinzu, die ein Content-Agent füllt.", + "admin.knowledge.emptyArticlesMsg": "Fügen Sie FAQ-artige Schalen mit Kategorien und Keywords hinzu. Lassen Sie Platzhalter im Text für Content-Agenten.", "admin.knowledge.col.title": "Titel", "admin.knowledge.col.name": "Bezeichnung", "admin.knowledge.edit": "Bearbeiten", @@ -986,13 +986,13 @@ export const de: MessageDict = { "admin.knowledge.editTemplate": "Vorlage bearbeiten", "admin.knowledge.allCategories": "Alle", "admin.settings.enablePlatformSmtp": "Plattform-SMTP aktivieren", - "admin.plans.title": "Abonnementpläne", - "admin.plans.description": "Öffentlich ladder, A1 / Legacy, Plattform Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Versteckt.", - "admin.plans.searchPlaceholder": "Name oder Beschreibung suchen…", - "admin.plans.searchAria": "Pläne suchen", - "admin.plans.filterAria": "Pläne nach Sichtbarkeit filtern", + "admin.plans.title": "Abonnementpläne", + "admin.plans.description": "Öffentlich ladder, A1 / Legacy, Plattform Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Versteckt.", + "admin.plans.searchPlaceholder": "Name oder Beschreibung suchen…", + "admin.plans.searchAria": "Pläne suchen", + "admin.plans.filterAria": "Pläne nach Sichtbarkeit filtern", "admin.plans.filter.catalog": "Katalog", - "admin.plans.filter.public": "Öffentlich", + "admin.plans.filter.public": "Öffentlich", "admin.plans.filter.legacy": "Legacy", "admin.plans.filter.custom": "Benutzerdefiniert", "admin.plans.filter.hidden": "Versteckt", @@ -1003,7 +1003,7 @@ export const de: MessageDict = { "admin.plans.col.maxProducts": "Max. Produkte", "admin.plans.col.term": "Laufzeit", "admin.plans.customPackageFlag": "Custom-Paket-Flag", - "admin.plans.visibility.public": "Öffentlich", + "admin.plans.visibility.public": "Öffentlich", "admin.plans.visibility.legacy": "Legacy", "admin.plans.visibility.hidden": "Versteckt", "admin.plans.visibility.custom": "Benutzerdefiniert", @@ -1013,30 +1013,30 @@ export const de: MessageDict = { "admin.plans.assignAria": "{name} zuweisen", "admin.plans.permissions": "Planberechtigungen", "admin.plans.permissionsAria": "Bearbeiten Planberechtigungen for {name}", - "admin.plans.showing": "Anzeige von {filtered} von {total} Plänen", + "admin.plans.showing": "Anzeige von {filtered} von {total} Plänen", "admin.plans.unlimited": "Unbegrenzt", - "admin.plans.optionLabel": "{name} ({credits} Credits) · {kind}", + "admin.plans.optionLabel": "{name} ({credits} Credits) · {kind}", "admin.permissions.noteStrong": "Nur Planberechtigungen.", - "admin.permissions.noteBody": "These toggles set what this package may include. Plattform-wide on/aus masters are on the {global} tab — a plan can enable a feature that still stays aus when the platform switch is deaktiviert.", + "admin.permissions.noteBody": "These toggles set what this package may include. Plattform-wide on/aus masters are on the {global} tab — a plan can enable a feature that still stays aus when the platform switch is deaktiviert.", "admin.permissions.globalTab": "Globale Schalter", "admin.permissions.title": "Planberechtigungen", "admin.permissions.descCount": "{enabled}/{total} aktiviert", "admin.permissions.matchesProfile": "entspricht {profile}", - "admin.permissions.customizedOverrides": "angepasste Überschreibungen", + "admin.permissions.customizedOverrides": "angepasste Überschreibungen", "admin.permissions.planDefaults": "Plan-Standardwerte", "admin.permissions.badge.legacy": "Migriertes Legacy-Paket", - "admin.permissions.badge.publicLadder": "Öffentlich ladder", - "admin.permissions.badge.ladderCustom": "Öffentlich ladder · benutzerdefiniert flag", + "admin.permissions.badge.publicLadder": "Öffentlich ladder", + "admin.permissions.badge.ladderCustom": "Öffentlich ladder · benutzerdefiniert flag", "admin.permissions.badge.customDeal": "Benutzerdefiniert deal", "admin.permissions.badge.clientDeal": "Kundenvereinbarung", "admin.permissions.badge.customOverrides": "Benutzerdefiniert overrides", "admin.permissions.badge.defaults": "Standardwerte", "admin.permissions.badge.customFlag": "Benutzerdefiniert flag", "admin.permissions.package": "Paket", - "admin.permissions.noPlans": "Keine Pläne", - "admin.permissions.suffix.legacy": "· legacy", - "admin.permissions.suffix.default": " · Standard", - "admin.permissions.suffix.custom": " · benutzerdefiniert", + "admin.permissions.noPlans": "Keine Pläne", + "admin.permissions.suffix.legacy": "· legacy", + "admin.permissions.suffix.default": " · Standard", + "admin.permissions.suffix.custom": " · benutzerdefiniert", "admin.permissions.section": "Bereich", "admin.permissions.allSections": "Alle Abschnitte", "admin.permissions.state": "Zustand", @@ -1045,23 +1045,23 @@ export const de: MessageDict = { "admin.permissions.stateOff": "Deaktiviert", "admin.permissions.stateDiffers": "Weicht ab from default", "admin.permissions.search": "Suchen", - "admin.permissions.searchPlaceholder": "Nach Schlüssel oder Bezeichnung filtern", + "admin.permissions.searchPlaceholder": "Nach Schlüssel oder Bezeichnung filtern", "admin.permissions.profilesAria": "Plan-Feature-Profile", "admin.permissions.applyProfile": "Profil anwenden", "admin.permissions.applyLegacy": "Legacy-Profil anwenden", - "admin.permissions.profilesHint": "One-click matrices for public ladder packages and migrated legacy navigation. Speicherns overrides for the ausgewählt package only.", + "admin.permissions.profilesHint": "One-click matrices for public ladder packages and migrated legacy navigation. Speicherns overrides for the ausgewählt package only.", "admin.permissions.applyNamed": "{label} anwenden", "admin.permissions.applyGeneric": "Profil anwenden", "admin.permissions.enableAll": "Alles aktivieren", "admin.permissions.disableAll": "Alles deaktivieren", - "admin.permissions.clearOverrides": "Overrides löschen", + "admin.permissions.clearOverrides": "Overrides löschen", "admin.permissions.globallyOff": "Globally aus", "admin.permissions.enableSection": "Bereich aktivieren", "admin.permissions.disableSection": "Bereich deaktivieren", "admin.permissions.noMatch": "Keine Funktionen entsprechen den aktuellen Filtern.", "admin.permissions.differs": "Weicht ab", "admin.permissions.platformOffHint": "Aus plattformweit even if this plan enables it.", - "admin.permissions.sectionToggled": "{label} {state} für diesen Plan.", + "admin.permissions.sectionToggled": "{label} {state} für diesen Plan.", "admin.permissions.state.enabled": "aktiviert", "admin.permissions.state.disabled": "deaktiviert", "admin.permissions.loadFailed": "Laden fehlgeschlagen Planberechtigungen", @@ -1072,11 +1072,11 @@ export const de: MessageDict = { "admin.permissions.resetFailed": "Fehlgeschlagen: reset defaults", "admin.permissions.sectionFailed": "Abschnitt update fehlgeschlagen", "admin.profile.legacy.label": "Legacy", - "admin.profile.legacy.description": "Migrated legacy navigation: catalog, Feeds, Abrechnung, and Einstellungen; no Zurückground Tasks, Shops, or marketing.", + "admin.profile.legacy.description": "Migrated legacy navigation: catalog, Feeds, Abrechnung, and Einstellungen; no Zurückground Tasks, Shops, or marketing.", "admin.profile.free.label": "Kostenlos", - "admin.profile.free.description": "Öffentlich Free ladder — AI, API-Schlüssels, live email, and own-key AI aus.", + "admin.profile.free.description": "Öffentlich Free ladder — AI, API-Schlüssels, live email, and own-key AI aus.", "admin.profile.starter.label": "Starter", - "admin.profile.starter.description": "Öffentlich Starter — AI on; own-key AI aus.", + "admin.profile.starter.description": "Öffentlich Starter — AI on; own-key AI aus.", "admin.profile.growth.label": "Growth", "admin.profile.growth.description": "Alle Katalogfunktionen aktiv.", "admin.profile.business.label": "Business", @@ -1084,7 +1084,7 @@ export const de: MessageDict = { "admin.profile.enterprise.label": "Enterprise / alles an", "admin.profile.enterprise.description": "Full Feature-Matrix (custom and Enterprise default).", "admin.gates.noteStrong": "Plattform-wide masters.", - "admin.gates.noteBody": "Diese Schalter gelten für jedes Paket. Effektiver Zugriff ist {combo}. Paketbezogene Rechte bleiben auf dem Tab {permissions}.", + "admin.gates.noteBody": "Diese Schalter gelten für jedes Paket. Effektiver Zugriff ist {combo}. Paketbezogene Rechte bleiben auf dem Tab {permissions}.", "admin.gates.combo": "Planberechtigung UND globaler Bereich UND globales Feature", "admin.gates.permissionsTab": "Planberechtigungen", "admin.gates.sectionsOff": "{count} section aus", @@ -1096,17 +1096,17 @@ export const de: MessageDict = { "admin.gates.section": "Bereich", "admin.gates.allSections": "Alle Abschnitte", "admin.gates.search": "Suchen", - "admin.gates.searchPlaceholder": "Nach Schlüssel oder Bezeichnung filtern", + "admin.gates.searchPlaceholder": "Nach Schlüssel oder Bezeichnung filtern", "admin.gates.sectionOff": "Abschnitt aus", "admin.gates.noMatch": "Keine Funktionen entsprechen den aktuellen Filtern.", "admin.gates.featureAria": "{label} global", "admin.gates.sectionsTitle": "Globale Bereichsschalter", - "admin.gates.sectionsDesc": "Turn an entire Produkt area on or aus for all packages. “Abschnitt + features” also updates every feature master in that section.", + "admin.gates.sectionsDesc": "Turn an entire Produkt area on or aus for all packages. “Abschnitt + features” also updates every feature master in that section.", "admin.gates.sectionAria": "Globaler Bereich {label}", "admin.gates.enableSectionFeatures": "Bereich + Features aktivieren", "admin.gates.disableSectionFeatures": "Bereich + Features deaktivieren", - "admin.gates.sectionSuccess": "{label} {state} für alle Pakete.", - "admin.gates.sectionSuccessWithFeatures": "{label} {state} für alle Pakete (Bereichs- und Feature-Master).", + "admin.gates.sectionSuccess": "{label} {state} für alle Pakete.", + "admin.gates.sectionSuccessWithFeatures": "{label} {state} für alle Pakete (Bereichs- und Feature-Master).", "admin.gates.featureSuccess": "{key} {state} global.", "admin.gates.state.enabled": "aktiviert", "admin.gates.state.disabled": "deaktiviert", @@ -1115,15 +1115,15 @@ export const de: MessageDict = { "admin.gates.saveFailed": "Speichern fehlgeschlagen global feature", "admin.billing.createPlan": "Plan erstellen", "admin.billing.assignPlanBtn": "Plan zuweisen", - "admin.billing.stat.plans": "Pläne", - "admin.billing.stat.catalogHidden": "{catalog} Katalog · {hidden} ausgeblendet", + "admin.billing.stat.plans": "Pläne", + "admin.billing.stat.catalogHidden": "{catalog} Katalog · {hidden} ausgeblendet", "admin.billing.stat.creditsAllocated": "Zugewiesene Credits", "admin.billing.stat.acrossCompanies": "Across Unternehmen on this page (first 50)", "admin.billing.stat.creditsUsed": "Verbrauchte Credits", "admin.billing.stat.creditsConsumed": "Auf dieser Seite verbrauchte Credits", "admin.billing.stat.noActivePlan": "Kein aktiver Plan", "admin.billing.stat.noActivePlanHint": "Unternehmen with no active subscription (this page)", - "admin.billing.tab.plans": "Pläne", + "admin.billing.tab.plans": "Pläne", "admin.billing.tab.permissions": "Planberechtigungen", "admin.billing.tab.global": "Globale Schalter", "admin.billing.tab.companies": "Unternehmen", @@ -1131,7 +1131,7 @@ export const de: MessageDict = { "admin.billing.cyclesDesc": "Process due renewals for Unternehmen on scheduled Abrechnungszyklen.", "admin.billing.runCycles": "Run due Abrechnungszyklen", "admin.billing.companiesTitle": "Unternehmen", - "admin.billing.companiesDesc": "Credit-Salden und Planstatus — Pläne zuweisen oder Credits anpassen.", + "admin.billing.companiesDesc": "Credit-Salden und Planstatus — Pläne zuweisen oder Credits anpassen.", "admin.billing.searchCompaniesAria": "Suchen Unternehmen", "admin.billing.planStatusAria": "Planstatus", "admin.billing.filter.all": "Alle Unternehmen", @@ -1146,8 +1146,8 @@ export const de: MessageDict = { "admin.billing.badge.noPlan": "Kein Plan", "admin.billing.badge.active": "Aktiv", "admin.billing.assignPlanAria": "Plan {name} zuweisen", - "admin.billing.addCredits": "Credits hinzufügen", - "admin.billing.addCreditsAria": "Hinzufügen credits for {name}", + "admin.billing.addCredits": "Credits hinzufügen", + "admin.billing.addCreditsAria": "Hinzufügen credits for {name}", "admin.billing.showingCompanies": "Anzeige von {filtered} von {total} Unternehmen", "admin.billing.editPlanTitle": "Bearbeiten plan", "admin.billing.createPlanTitle": "Plan erstellen", @@ -1155,24 +1155,24 @@ export const de: MessageDict = { "admin.billing.createPlanDesc": "Erstellen a package. Benutzerdefiniert plans stay hidden from public pricing.", "admin.billing.field.name": "Bezeichnung", "admin.billing.field.description": "Beschreibung", - "admin.billing.field.descriptionPlaceholder": "Optionale kurze Zusammenfassung für Admins", + "admin.billing.field.descriptionPlaceholder": "Optionale kurze Zusammenfassung für Admins", "admin.billing.field.monthlyCredits": "Monatliche Credits", - "admin.billing.field.yearlyCredits": "Jährliche Credits", + "admin.billing.field.yearlyCredits": "Jährliche Credits", "admin.billing.field.maxProducts": "Max. Produkte", "admin.billing.field.maxProductsPlaceholder": "Leer = unbegrenzt", "admin.billing.field.term": "Laufzeit", "admin.billing.term.monthly": "Monatlich", - "admin.billing.term.yearly": "Jährlich", + "admin.billing.term.yearly": "Jährlich", "admin.billing.customPackage": "Benutzerdefiniert package", - "admin.billing.customPackageHint": "Versteckt from public pricing. Use for client deals; leave aus for Free–Business.", + "admin.billing.customPackageHint": "Versteckt from public pricing. Use for client deals; leave aus for Free–Business.", "admin.billing.previewBadge": "Vorschau-Badge: {preview}.", "admin.billing.company": "Unternehmen", - "admin.billing.selectCompany": "Auswählen Unternehmen", - "admin.billing.noPlanSuffix": "· no plan", + "admin.billing.selectCompany": "Auswählen Unternehmen", + "admin.billing.noPlanSuffix": "· no plan", "admin.billing.plan": "Tarifplan", - "admin.billing.selectPlan": "Plan auswählen", + "admin.billing.selectPlan": "Plan auswählen", "admin.billing.trialAssignment": "Testzuweisung", - "admin.billing.trialHint": "Optionales Trial-Flag + Credit-Gutschrift für Sales- oder Evaluierungs-Trials.", + "admin.billing.trialHint": "Optionales Trial-Flag + Credit-Gutschrift für Sales- oder Evaluierungs-Trials.", "admin.billing.trialCredits": "Test-Credits", "admin.billing.assign": "Zuweisen", "admin.billing.amount": "Betrag", @@ -1192,12 +1192,12 @@ export const de: MessageDict = { "admin.knowledge.tab.templates": "Vorlagen", "admin.knowledge.tab.settings": "Auto-Antwort", "admin.knowledge.allStatuses": "Alle statuses", - "admin.knowledge.published": "Veröffentlicht", + "admin.knowledge.published": "Veröffentlicht", "admin.knowledge.createArticle": "Erstellen article", "admin.knowledge.col.categories": "Kategorien", "admin.knowledge.col.status": "Zustand", - "admin.knowledge.col.keywords": "Schlüsselwörter", - "admin.knowledge.badge.published": "Veröffentlicht", + "admin.knowledge.col.keywords": "Schlüsselwörter", + "admin.knowledge.badge.published": "Veröffentlicht", "admin.knowledge.createTemplate": "Erstellen template", "admin.knowledge.badge.active": "Aktiv", "admin.knowledge.badge.inactive": "Inaktiv", @@ -1219,26 +1219,26 @@ export const de: MessageDict = { "admin.knowledge.notReadyBadge": "Nicht bereit", "admin.knowledge.enabled": "Aktiviert", "admin.knowledge.disabled": "Deaktiviert", - "admin.knowledge.openAiRoles": "Öffnen Plattform Einstellungen → AI roles", + "admin.knowledge.openAiRoles": "Öffnen Plattform Einstellungen → AI roles", "admin.knowledge.field.title": "Titel", "admin.knowledge.field.slug": "Slug", "admin.knowledge.field.body": "Inhalt (Markdown)", - "admin.knowledge.field.keywords": "Schlüsselwörter", + "admin.knowledge.field.keywords": "Schlüsselwörter", "admin.knowledge.keywordsPlaceholder": "kommagetrennt", - "admin.knowledge.field.intents": "Intent-Schlüssel", + "admin.knowledge.field.intents": "Intent-Schlüssel", "admin.knowledge.intentsPlaceholder": "kommagetrennt", "admin.knowledge.field.categories": "Kategorie slugs", - "admin.knowledge.categoriesPlaceholder": "Abrechnung, account…", - "admin.knowledge.field.weight": "Prioritätsgewicht", - "admin.knowledge.publishedEligible": "Veröffentlicht (für Abgleich geeignet)", + "admin.knowledge.categoriesPlaceholder": "Abrechnung, account…", + "admin.knowledge.field.weight": "Prioritätsgewicht", + "admin.knowledge.publishedEligible": "Veröffentlicht (für Abgleich geeignet)", "admin.knowledge.field.name": "Bezeichnung", "admin.knowledge.field.templateBody": "Text", "admin.knowledge.active": "Aktiv", "admin.settings.card.aiRolesTitle": "Plattform AI roles", - "admin.settings.card.aiRolesDesc": "Verarbeitung, vectorization, docs/API, and Support — separate keys/models", + "admin.settings.card.aiRolesDesc": "Verarbeitung, vectorization, docs/API, and Support — separate keys/models", "admin.settings.roleOff": " (aus)", - "admin.settings.roleNotSet": "· not set", - "admin.settings.someRolesUnavailable": "Some AI roles are not verfügbar on this deployment yet. Verarbeitung still uses the platform ÖffnenAI Einstellungen until all roles are Supported.", + "admin.settings.roleNotSet": "· not set", + "admin.settings.someRolesUnavailable": "Some AI roles are not verfügbar on this deployment yet. Verarbeitung still uses the platform ÖffnenAI Einstellungen until all roles are Supported.", "admin.settings.configure": "Konfigurieren", "admin.settings.card.smtpTitle": "Plattform SMTP", "admin.settings.configured": "Konfiguriert", @@ -1246,7 +1246,7 @@ export const de: MessageDict = { "admin.settings.source": "Quelle: {source}", "admin.settings.smtpEnabled": "SMTP aktiviert", "admin.settings.smtpDisabled": "SMTP deaktiviert", - "admin.settings.passwordSet": "· password set", + "admin.settings.passwordSet": "· password set", "admin.settings.card.otherTitle": "Andere Integrationen", "admin.settings.oauthSet": "Google OAuth gesetzt", "admin.settings.oauthOff": "Google OAuth aus", @@ -1257,9 +1257,9 @@ export const de: MessageDict = { "admin.settings.stripeSet": "Stripe gesetzt", "admin.settings.stripeOff": "Stripe aus", "admin.settings.password": "Passwort", - "admin.settings.passwordSavedHint": "(gespeichert — leave blank to keep)", - "admin.settings.secretKey": "Geheimschlüssel", - "admin.settings.secretConfiguredHint": "(konfiguriert — leer lassen zum Behalten)", + "admin.settings.passwordSavedHint": "(gespeichert — leave blank to keep)", + "admin.settings.secretKey": "Geheimschlüssel", + "admin.settings.secretConfiguredHint": "(konfiguriert — leer lassen zum Behalten)", "admin.settings.passwordConfigured": "Passwort configured", "admin.settings.noSmtpPassword": "Kein SMTP-Passwort", "admin.settings.enabled": "Aktiviert", @@ -1271,11 +1271,11 @@ export const de: MessageDict = { "admin.settings.eprelEnabled": "EPREL enrichment aktiviert", "admin.settings.loadFailed": "Plattform Einstellungen could not be loaded. Saving is deaktiviert until reload succeeds.", "admin.settings.testAccepted": "Testnachricht von SMTP akzeptiert", - "admin.stuck.cleanupBtn": "Hängengebliebene Jobs bereinigen (>2 Std. laufend)", + "admin.stuck.cleanupBtn": "Hängengebliebene Jobs bereinigen (>2 Std. laufend)", "admin.stuck.jobsTitle": "Verarbeitungsjobs", - "admin.stuck.jobsDesc": "Letzte 100 Jobs · {running} derzeit laufend", + "admin.stuck.jobsDesc": "Letzte 100 Jobs · {running} derzeit laufend", "admin.stuck.filterAll": "Alle", - "admin.stuck.filterRunning": "Läuft", + "admin.stuck.filterRunning": "Läuft", "admin.stuck.filterFailed": "Fehlgeschlagen", "admin.stuck.filterPending": "Ausstehend", "admin.stuck.filterCompleted": "Abgeschlossen", @@ -1289,8 +1289,8 @@ export const de: MessageDict = { "admin.stuck.cleanupFailed": "Bereinigung fehlgeschlagen", "admin.support.knowledgeLink": "Wissen & Auto-Antwort", "admin.support.queueTitle": "Ticket-Warteschlange", - "admin.support.queueMeta": "{total} · Bereich {scope}", - "admin.support.queueMetaStatus": "· Status {status}", + "admin.support.queueMeta": "{total} · Bereich {scope}", + "admin.support.queueMetaStatus": "· Status {status}", "admin.support.ticketCountOne": "{count} Ticket", "admin.support.ticketCountMany": "{count} Tickets", "admin.support.statusAll": "Alle statuses", @@ -1299,76 +1299,76 @@ export const de: MessageDict = { "admin.support.scopeMine": "Meine", "admin.support.scopeUnassigned": "Nicht zugewiesen", "admin.support.flagAny": "Beliebiger Auto-Status", - "admin.support.flagNeedsHuman": "Mensch nötig", + "admin.support.flagNeedsHuman": "Mensch nötig", "admin.support.flagAiDraft": "KI-Entwurf", "admin.support.colSubject": "Betreff", "admin.support.colStatus": "Zustand", "admin.support.colAuto": "Auto", - "admin.support.colPriority": "Priorität", - "admin.support.colAssignee": "Zuständig", + "admin.support.colPriority": "Priorität", + "admin.support.colAssignee": "Zuständig", "admin.support.colCompany": "Unternehmen", "admin.support.colUpdated": "Aktualisiert", "admin.support.colActions": "Aktionen", "admin.support.autoOff": "Auto aus", - "admin.support.claim": "Übernehmen", - "admin.support.claimAria": "Ticket {subject} übernehmen", + "admin.support.claim": "Übernehmen", + "admin.support.claimAria": "Ticket {subject} übernehmen", "admin.support.unassigned": "Nicht zugewiesen", "admin.support.you": "Sie", "admin.support.assigned": "Zugewiesen", "admin.support.loadQueueFailed": "Support-Warteschlange konnte nicht geladen werden", - "admin.support.claimFailed": "Ticket konnte nicht übernommen werden", + "admin.support.claimFailed": "Ticket konnte nicht übernommen werden", "admin.support.ticketFallbackTitle": "Support Ticket", - "admin.support.ticketMeta": "{company} · {requester}", - "admin.support.ticketMetaFallback": "Staff-Prüfthread", + "admin.support.ticketMeta": "{company} · {requester}", + "admin.support.ticketMetaFallback": "Staff-Prüfthread", "admin.support.companyFallback": "Unternehmen", "admin.support.requesterFallback": "Anfragender", "admin.support.backQueue": "Warteschlange", - "admin.support.resolve": "Lösen", + "admin.support.resolve": "Lösen", "admin.support.markPending": "Als ausstehend markieren", - "admin.support.reopen": "Wieder öffnen", - "admin.support.assigneeLabel": "Zuständig:", + "admin.support.reopen": "Wieder öffnen", + "admin.support.assigneeLabel": "Zuständig:", "admin.support.unassign": "Zuweisung aufheben", "admin.support.assignToStaff": "Mitarbeitern zuweisen", "admin.support.apply": "Anwenden", "admin.support.autoPanelTitle": "Auto-Match / KI-Assistenz", - "admin.support.autoPanelDesc": "Nur für Staff: Ergebnis von FAQ-Match und KI-Entwurf/Versand. Kunden sehen keine Entwürfe.", + "admin.support.autoPanelDesc": "Nur für Staff: Ergebnis von FAQ-Match und KI-Entwurf/Versand. Kunden sehen keine Entwürfe.", "admin.support.autoDisabledBadge": "Auto deaktiviert", "admin.support.autoStatusLabel": "Statusangabe:", "admin.support.lastAttempt": "Letzter Versuch:", "admin.support.reenableAuto": "Auto wieder aktivieren", - "admin.support.disableAuto": "Auto für dieses Ticket deaktivieren", + "admin.support.disableAuto": "Auto für dieses Ticket deaktivieren", "admin.support.aiDraftTitle": "KI-Entwurf (genehmigen oder bearbeiten)", - "admin.support.aiDraftDesc": "Nur-Entwurf-Modus hat eine interne Notiz hinterlassen. Bei Bedarf bearbeiten, dann an den Kunden senden — oder verwerfen und manuell übernehmen.", + "admin.support.aiDraftDesc": "Nur-Entwurf-Modus hat eine interne Notiz hinterlassen. Bei Bedarf bearbeiten, dann an den Kunden senden — oder verwerfen und manuell übernehmen.", "admin.support.confidence": "Konfidenz {value}", "admin.support.statusAfterSend": "Status nach dem Senden", "admin.support.approveSend": "Genehmigen & senden", "admin.support.discardDraft": "Entwurf verwerfen", "admin.support.threadTitle": "Thread", - "admin.support.threadMeta": "{count} · letzte Aktivität {when}", + "admin.support.threadMeta": "{count} · letzte Aktivität {when}", "admin.support.messageCountOne": "{count} Nachricht", "admin.support.messageCountMany": "{count} Nachrichten", "admin.support.replyTitle": "Antworten", - "admin.support.replyDesc": "Öffentliche Antworten benachrichtigen den Kunden. Interne Notizen bleiben staff-only. Standardstatus nach öffentlicher Antwort ist ausstehend.", - "admin.support.internalNote": "Interne Notiz (für Kunden nicht sichtbar)", + "admin.support.replyDesc": "Öffentliche Antworten benachrichtigen den Kunden. Interne Notizen bleiben staff-only. Standardstatus nach öffentlicher Antwort ist ausstehend.", + "admin.support.internalNote": "Interne Notiz (für Kunden nicht sichtbar)", "admin.support.setStatus": "Status setzen", "admin.support.statusDefault": "Standard", "admin.support.saveNote": "Notiz speichern", "admin.support.sendReply": "Antwort senden", - "admin.support.replyAndResolve": "Antworten & lösen", - "admin.support.closedBanner": "Dieses Ticket ist geschlossen. Öffnen Sie es erneut, um fortzufahren.", - "admin.support.priorityMeta": "Priorität {priority}", + "admin.support.replyAndResolve": "Antworten & lösen", + "admin.support.closedBanner": "Dieses Ticket ist geschlossen. Öffnen Sie es erneut, um fortzufahren.", + "admin.support.priorityMeta": "Priorität {priority}", "admin.support.authorAiDraft": "KI-Entwurf (nur Staff)", "admin.support.authorInternal": "Interne Notiz", "admin.support.authorStaff": "Mitarbeiter", "admin.support.authorCustomer": "Kunde", "admin.support.flash.noteSaved": "Interne Notiz gespeichert.", "admin.support.flash.replySent": "Antwort gesendet.", - "admin.support.flash.resolved": "Ticket als gelöst markiert.", + "admin.support.flash.resolved": "Ticket als gelöst markiert.", "admin.support.flash.pending": "Ticket als ausstehend markiert (wartet auf Kunden).", - "admin.support.flash.reopened": "Ticket wieder geöffnet.", + "admin.support.flash.reopened": "Ticket wieder geöffnet.", "admin.support.flash.statusSet": "Ticket-Status auf {status} gesetzt.", - "admin.support.flash.autoDisabled": "Automatische Antworten für dieses Ticket deaktiviert.", - "admin.support.flash.autoEnabled": "Automatische Antworten für dieses Ticket wieder aktiviert.", + "admin.support.flash.autoDisabled": "Automatische Antworten für dieses Ticket deaktiviert.", + "admin.support.flash.autoEnabled": "Automatische Antworten für dieses Ticket wieder aktiviert.", "admin.support.loadTicketFailed": "Ticket konnte nicht geladen werden", "admin.support.replyFailed": "Antwort konnte nicht gesendet werden", "admin.support.statusFailed": "Status konnte nicht aktualisiert werden", @@ -1377,89 +1377,89 @@ export const de: MessageDict = { "admin.support.autoFailed": "Auto-Antwort konnte nicht aktualisiert werden", "admin.support.approveFailed": "KI-Entwurf konnte nicht genehmigt werden", "admin.support.discardFailed": "KI-Entwurf konnte nicht verworfen werden", - "admin.settings.sourceResolved": "Aufgelöst aus {sources}", - "admin.settings.sourceUpdated": " · aktualisiert {when}", + "admin.settings.sourceResolved": "Aufgelöst aus {sources}", + "admin.settings.sourceUpdated": " · aktualisiert {when}", "admin.settings.updatedAt": "Aktualisiert {when}", - "admin.settings.tenantDesc": "Unternehmens-KI-Schlüssel und Marketing-E-Mail bleiben unter Integrationen. Sitzungs- und Verschlüsselungsgeheimnisse bleiben in der Serverumgebung und werden hier nicht bearbeitet.", - "admin.settings.perCompanyAiEmail": "KI/E-Mail pro Unternehmen —", - "admin.settings.plansCredits": "Pläne und Credits —", + "admin.settings.tenantDesc": "Unternehmens-KI-Schlüssel und Marketing-E-Mail bleiben unter Integrationen. Sitzungs- und Verschlüsselungsgeheimnisse bleiben in der Serverumgebung und werden hier nicht bearbeitet.", + "admin.settings.perCompanyAiEmail": "KI/E-Mail pro Unternehmen —", + "admin.settings.plansCredits": "Pläne und Credits —", "admin.settings.fromDatabase": "Aus der Datenbank", "admin.settings.fromEnvironment": "Aus der Umgebung", "admin.settings.sourceBadge": "Quelle: {source}", - "admin.settings.storedKey": "Gespeicherter Schlüssel: {masked}", + "admin.settings.storedKey": "Gespeicherter Schlüssel: {masked}", "admin.settings.enableRole": "Diese Rolle aktivieren", - "admin.settings.clearApiKey": "Gespeicherten API-Schlüssel löschen", - "admin.settings.apiKeyKeepPlaceholder": "•••• leer lassen zum Behalten", - "admin.settings.apiKeyNewPlaceholder": "sk-… oder lokal", + "admin.settings.clearApiKey": "Gespeicherten API-Schlüssel löschen", + "admin.settings.apiKeyKeepPlaceholder": "•••• leer lassen zum Behalten", + "admin.settings.apiKeyNewPlaceholder": "sk-… oder lokal", "admin.settings.smtpCardTitle": "Plattform SMTP", - "admin.settings.smtpCardDesc": "Für Set-Password-Einladungen und ausgehende Plattform-E-Mails. Marketing-Resend/SMTP bleibt pro Unternehmen unter Integrationen → E-Mail.", + "admin.settings.smtpCardDesc": "Für Set-Password-Einladungen und ausgehende Plattform-E-Mails. Marketing-Resend/SMTP bleibt pro Unternehmen unter Integrationen → E-Mail.", "admin.settings.smtpBadgeOn": "SMTP aktiviert", "admin.settings.smtpBadgeOff": "SMTP deaktiviert", "admin.settings.enableSmtp": "Plattform-SMTP aktivieren", "admin.settings.storedPassword": "Gespeichertes Passwort: {masked}", - "admin.settings.clearSmtpPassword": "Gespeichertes SMTP-Passwort löschen", + "admin.settings.clearSmtpPassword": "Gespeichertes SMTP-Passwort löschen", "admin.settings.sendTestEmail": "Test-E-Mail senden", "admin.settings.enableGoogle": "Google OAuth aktivieren", "admin.settings.clientSecret": "Client-Secret", "admin.settings.leaveBlankKeep": "(leer lassen zum Behalten)", "admin.settings.storedSecret": "Gespeichertes Geheimnis: {masked}", - "admin.settings.clearClientSecret": "Gespeichertes Client-Geheimnis löschen", - "admin.settings.eprelDesc": "Kostenlose öffentliche EU-Energielabel-Daten während der Verarbeitung. Standardmäßig für alle Pläne aktiv — keine Aktivierung oder kostenpflichtiges Upgrade. Steuerelemente nur zum Deaktivieren oder Feinabstimmen.", - "admin.settings.optionalKeySaved": "Optionaler API-Schlüssel gespeichert", - "admin.settings.noApiKeyNeeded": "Kein API-Schlüssel nötig", - "admin.settings.optionalApiKey": "Optionaler API-Schlüssel", - "admin.settings.optionalApiKeySavedHint": "(gespeichert — leave blank to keep)", - "admin.settings.optionalApiKeyPublicHint": "(öffentliche API funktioniert ohne)", - "admin.settings.clearEprelKey": "Gespeicherten EPREL-API-Schlüssel löschen", - "admin.settings.pineconeDesc": "Optionale Vektor-Kategorievorschläge während der Verarbeitung. Host-Umgebungs­werte werden genutzt, wenn Felder hier leer bleiben.", - "admin.settings.apiKeyConfigured": "API-Schlüssel konfiguriert", - "admin.settings.noApiKey": "Kein API-Schlüssel", - "admin.settings.apiKeyLabel": "API-Schlüssel", - "admin.settings.clearPineconeKey": "Gespeicherten Pinecone-API-Schlüssel löschen", - "admin.settings.stripeDesc": "Optionale Überschreibungen der Server-Stripe-Konfiguration. Passwortfelder bevorzugen; Werte werden nach dem Speichern nicht erneut angezeigt.", - "admin.settings.stripeMock": "Stripe-Mock-Modus erzwingen (nur Nicht-Produktion — deaktiviert echte Abbuchungen)", + "admin.settings.clearClientSecret": "Gespeichertes Client-Geheimnis löschen", + "admin.settings.eprelDesc": "Kostenlose öffentliche EU-Energielabel-Daten während der Verarbeitung. Standardmäßig für alle Pläne aktiv — keine Aktivierung oder kostenpflichtiges Upgrade. Steuerelemente nur zum Deaktivieren oder Feinabstimmen.", + "admin.settings.optionalKeySaved": "Optionaler API-Schlüssel gespeichert", + "admin.settings.noApiKeyNeeded": "Kein API-Schlüssel nötig", + "admin.settings.optionalApiKey": "Optionaler API-Schlüssel", + "admin.settings.optionalApiKeySavedHint": "(gespeichert — leave blank to keep)", + "admin.settings.optionalApiKeyPublicHint": "(öffentliche API funktioniert ohne)", + "admin.settings.clearEprelKey": "Gespeicherten EPREL-API-Schlüssel löschen", + "admin.settings.pineconeDesc": "Optionale Vektor-Kategorievorschläge während der Verarbeitung. Host-Umgebungs­werte werden genutzt, wenn Felder hier leer bleiben.", + "admin.settings.apiKeyConfigured": "API-Schlüssel konfiguriert", + "admin.settings.noApiKey": "Kein API-Schlüssel", + "admin.settings.apiKeyLabel": "API-Schlüssel", + "admin.settings.clearPineconeKey": "Gespeicherten Pinecone-API-Schlüssel löschen", + "admin.settings.stripeDesc": "Optionale Überschreibungen der Server-Stripe-Konfiguration. Passwortfelder bevorzugen; Werte werden nach dem Speichern nicht erneut angezeigt.", + "admin.settings.stripeMock": "Stripe-Mock-Modus erzwingen (nur Nicht-Produktion — deaktiviert echte Abbuchungen)", "admin.settings.webhookSecret": "Webhook-Geheimnis", - "admin.settings.clearStripeSecret": "Stripe-Geheimschlüssel löschen", - "admin.settings.clearStripeWebhook": "Stripe-Webhook-Geheimnis löschen", - "admin.settings.feedAllowlistDesc": "Kommagetrennte Hosts/CIDRs für private Feed-URLs erlaubt.", + "admin.settings.clearStripeSecret": "Stripe-Geheimschlüssel löschen", + "admin.settings.clearStripeWebhook": "Stripe-Webhook-Geheimnis löschen", + "admin.settings.feedAllowlistDesc": "Kommagetrennte Hosts/CIDRs für private Feed-URLs erlaubt.", "admin.settings.adminsDesc": "Plattform-Administratoren auf diesem Deployment", "admin.settings.onboardingTitle": "Admin-Onboarding-Hilfen", "admin.settings.onboardingDesc": "Nutzen Sie Set-Password-Einladungs-E-Mails, um berechtigte Nutzer ohne Passwort einzuarbeiten.", "admin.settings.sendInvites": "Set-Password-E-Mails senden", - "admin.settings.adminStatusBefore": "Plattform-Admins können von diesem Bildschirm nicht erstellt werden. Bestätigen Sie Ihren Zugang auf der", - "admin.settings.adminStatusAfter": ", oder bitten Sie einen bestehenden Admin/Ops, Ihr Konto zu befördern.", + "admin.settings.adminStatusBefore": "Plattform-Admins können von diesem Bildschirm nicht erstellt werden. Bestätigen Sie Ihren Zugang auf der", + "admin.settings.adminStatusAfter": ", oder bitten Sie einen bestehenden Admin/Ops, Ihr Konto zu befördern.", "admin.settings.loadUsersFailed": "Admin-Benutzer konnten nicht geladen werden", "admin.settings.sendFailed": "Senden fehlgeschlagen", "admin.settings.saveMailFailed": "Mail-Einstellungen konnten nicht gespeichert werden", - "admin.settings.smtpNotConfigured": "SMTP ist nicht konfiguriert — aktivieren und speichern Sie zuerst die Mail-Einstellungen.", + "admin.settings.smtpNotConfigured": "SMTP ist nicht konfiguriert — aktivieren und speichern Sie zuerst die Mail-Einstellungen.", "admin.settings.smtpTestFailed": "SMTP-Test fehlgeschlagen", "admin.settings.testEmailFailed": "Test-E-Mail konnte nicht gesendet werden", "admin.settings.saveIntegrationFailed": "Integrationseinstellungen konnten nicht gespeichert werden", - "admin.settings.aiSaved": "{label}-KI-Einstellungen gespeichert. API-Schlüssel werden nicht erneut angezeigt.", + "admin.settings.aiSaved": "{label}-KI-Einstellungen gespeichert. API-Schlüssel werden nicht erneut angezeigt.", "admin.settings.aiSaveFailed": "{label}-KI-Einstellungen konnten nicht gespeichert werden", "admin.settings.aiTestOk": "{label}: Verbindung OK", - "admin.settings.aiTestSkipped": "{label}: übersprungen — speichern Sie Zugangsdaten (und aktivieren Sie die Rolle) zum Testen.", + "admin.settings.aiTestSkipped": "{label}: übersprungen — speichern Sie Zugangsdaten (und aktivieren Sie die Rolle) zum Testen.", "admin.settings.aiTestFailed": "{label}: Verbindung fehlgeschlagen", "admin.settings.aiTestError": "{label}-Verbindung konnte nicht getestet werden", "admin.settings.aiRole.processing.label": "Verarbeitung", "admin.settings.aiRole.processing.desc": "Produkt-Pipeline Chat/Completions (Titel, Beschreibungen, Enhance).", "admin.settings.aiRole.vectorization.label": "Vektorisierung", - "admin.settings.aiRole.vectorization.desc": "Embeddings für Suche / Pinecone-Indexierung (Indexdimensionen abstimmen).", + "admin.settings.aiRole.vectorization.desc": "Embeddings für Suche / Pinecone-Indexierung (Indexdimensionen abstimmen).", "admin.settings.aiRole.docs_api.label": "Docs / API", - "admin.settings.aiRole.docs_api.desc": "Zukünftiger Docs/API-Assistenten-Slot — /docs Ask bleibt regelbasiert und darf diese Rolle nie aufrufen.", + "admin.settings.aiRole.docs_api.desc": "Zukünftiger Docs/API-Assistenten-Slot — /docs Ask bleibt regelbasiert und darf diese Rolle nie aufrufen.", "admin.settings.aiRole.support.label": "Hilfezentrum", - "admin.settings.aiRole.support.desc": "KI-Fallback für Ticket-Auto-Antwort — Anbieter/Schlüssel/Modell hier konfigurieren; Versand unter Support-Wissen → Auto-Antwort aktivieren.", + "admin.settings.aiRole.support.desc": "KI-Fallback für Ticket-Auto-Antwort — Anbieter/Schlüssel/Modell hier konfigurieren; Versand unter Support-Wissen → Auto-Antwort aktivieren.", "admin.settings.providerOption.openai": "OpenAI", "admin.settings.providerOption.openrouter": "OpenRouter", "admin.settings.providerOption.azure": "Azure OpenAI", "admin.settings.providerOption.ollama": "Ollama", "admin.settings.providerOption.custom": "Benutzerdefiniert / sonstige", "admin.support.title": "Support-Center", - "admin.support.description": "Mitarbeiter-Posteingang — aus Warteschlange übernehmen, nach Bereich filtern, Threads öffnen und lösen", - "admin.support.unavailable": "Support-Warteschlange ist nicht verfügbar. Kontaktieren Sie Ihren Plattform-Admin, falls das anhält.", + "admin.support.description": "Mitarbeiter-Posteingang — aus Warteschlange übernehmen, nach Bereich filtern, Threads öffnen und lösen", + "admin.support.unavailable": "Support-Warteschlange ist nicht verfügbar. Kontaktieren Sie Ihren Plattform-Admin, falls das anhält.", "admin.support.noTickets": "Keine Tickets in dieser Warteschlange.", "admin.support.ticketNotFound": "Ticket nicht gefunden.", - "admin.support.notAvailable": "Support ist auf diesem Deployment nicht verfügbar.", + "admin.support.notAvailable": "Support ist auf diesem Deployment nicht verfügbar.", "admin.support.loadFailed": "Dieses Ticket konnte nicht geladen werden.", "admin.support.noMessages": "Noch keine Nachrichten.", "admin.support.queueScopeAria": "Warteschlangenbereich", @@ -1469,109 +1469,109 @@ export const de: MessageDict = { "admin.support.searchAria": "Tickets suchen", "admin.support.assignStaffAria": "Mitarbeitern zuweisen", "admin.support.aiDraftAria": "KI-Entwurf", - "admin.support.replyPlaceholder": "Antwort schreiben…", + "admin.support.replyPlaceholder": "Antwort schreiben…", "admin.support.replyAria": "Antworttext", "admin.knowledge.eyebrow": "Plattform-Admin", "admin.knowledge.title": "Support-Wissen", - "admin.knowledge.description": "Strukturieren Sie Hilfeartikel für FAQ-Auto-Match. Content-Agenten füllen Texte — halten Sie Fakten korrekt.", + "admin.knowledge.description": "Strukturieren Sie Hilfeartikel für FAQ-Auto-Match. Content-Agenten füllen Texte — halten Sie Fakten korrekt.", "admin.knowledge.notReady": "Support-Wissen ist nicht bereit", "admin.knowledge.noTemplates": "Keine Antwortvorlagen", - "admin.knowledge.articleDesc": "Markdown-Text unterstützt Bilder per sicherem Upload. Erfinden Sie keine Produktfakten — lassen Sie Platzhalter für Content-Agenten.", + "admin.knowledge.articleDesc": "Markdown-Text unterstützt Bilder per sicherem Upload. Erfinden Sie keine Produktfakten — lassen Sie Platzhalter für Content-Agenten.", "admin.knowledge.templateDesc": "Erlaubte Platzhalter: subject, category.", - "admin.knowledge.searchPlaceholder": "Titel, Slug, Keywords suchen…", + "admin.knowledge.searchPlaceholder": "Titel, Slug, Keywords suchen…", "admin.knowledge.searchAria": "Artikel suchen", - "admin.knowledge.publishFilterAria": "Veröffentlichungsstatusfilter", - "admin.knowledge.deleteArticleAria": "Artikel löschen", - "admin.knowledge.deleteTemplateAria": "Vorlage löschen", + "admin.knowledge.publishFilterAria": "Veröffentlichungsstatusfilter", + "admin.knowledge.deleteArticleAria": "Artikel löschen", + "admin.knowledge.deleteTemplateAria": "Vorlage löschen", "admin.support.autoReplyStatus.matched": "FAQ gefunden", "admin.support.autoReplyStatus.aiDraft": "KI-Entwurf ausstehend", "admin.support.autoReplyStatus.aiSent": "KI-Antwort gesendet", - "admin.support.autoReplyStatus.skipped": "Auto übersprungen", + "admin.support.autoReplyStatus.skipped": "Auto übersprungen", "admin.support.autoReplyStatus.failed": "Auto fehlgeschlagen", - "admin.support.autoReplyStatus.handedOff": "Mensch nötig", + "admin.support.autoReplyStatus.handedOff": "Mensch nötig", "admin.support.autoReplyStatus.none": "Kein Auto-Versuch", "admin.support.autoSource.kb": "Wissensdatenbank", "admin.support.autoSource.template": "Vorlage", - "admin.support.autoSource.ai": "KI-unterstützt", + "admin.support.autoSource.ai": "KI-unterstützt", "admin.support.autoSource.automated": "Automatisiert", "admin.knowledge.categoriesHeading": "Kategorien", - "admin.knowledge.categoriesHint": "Leere vorbereitete Buckets für Content-Agenten.", + "admin.knowledge.categoriesHint": "Leere vorbereitete Buckets für Content-Agenten.", "admin.knowledge.showingArticles": "{shown} Artikel angezeigt (Inhalt wird beim Bearbeiten geladen).", "admin.knowledge.showingArticlesOf": "{shown} von {total} Artikeln angezeigt (Inhalt wird beim Bearbeiten geladen).", "admin.knowledge.templatesHint": "Vorgefertigte Antworten mit optionalen Platzhaltern {{subject}} / {{category}}.", "admin.knowledge.faqAutoMatchTitle": "FAQ-Auto-Match", - "admin.knowledge.faqAutoMatchDesc": "Schlüsselwort-Match bei Ticket-Erstellung. Standardschwelle 0,78 (Bereich 0,50–0,95).", + "admin.knowledge.faqAutoMatchDesc": "Schlüsselwort-Match bei Ticket-Erstellung. Standardschwelle 0,78 (Bereich 0,50–0,95).", "admin.knowledge.aiFallbackTitle": "KI-Fallback", "admin.knowledge.aiFallbackDesc": "Wird genutzt, wenn der FAQ-Match unter dem Schwellwert liegt. Antworten nutzen die Plattform-KI-Rolle {role}.", "admin.knowledge.noModel": "kein Modell", - "admin.knowledge.keyLast4": "Schlüssel …{last4}", + "admin.knowledge.keyLast4": "Schlüssel …{last4}", "admin.knowledge.sourceLabel": "Quelle {source}", - "admin.knowledge.apiKeyNote": "Der API-Schlüssel kommt immer von dieser Rolle; Overrides oben ändern nur Anbieter / Modell / Basis-URL.", + "admin.knowledge.apiKeyNote": "Der API-Schlüssel kommt immer von dieser Rolle; Overrides oben ändern nur Anbieter / Modell / Basis-URL.", "admin.knowledge.saveAutoSettings": "Auto-Antwort-Einstellungen speichern", - "admin.knowledge.insertImage": "Bild einfügen", - "admin.knowledge.uploading": "Wird hochgeladen…", - "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, max. 2 MiB. Gespeichert unter UPLOAD_DIR/support-kb (öffentliche HMAC-URL).", - "admin.knowledge.unavailableMsg": "Support-Wissen ist in dieser Bereitstellung nicht verfügbar. Wenden Sie sich an Ihren Plattform-Administrator.", + "admin.knowledge.insertImage": "Bild einfügen", + "admin.knowledge.uploading": "Wird hochgeladen…", + "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, max. 2 MiB. Gespeichert unter UPLOAD_DIR/support-kb (öffentliche HMAC-URL).", + "admin.knowledge.unavailableMsg": "Support-Wissen ist in dieser Bereitstellung nicht verfügbar. Wenden Sie sich an Ihren Plattform-Administrator.", "admin.knowledge.loadFailed": "Support-Wissen konnte nicht geladen werden", "admin.knowledge.loadArticleFailed": "Artikel konnte nicht geladen werden", "admin.knowledge.loadTemplateFailed": "Vorlage konnte nicht geladen werden", "admin.knowledge.saveArticleFailed": "Artikel konnte nicht gespeichert werden", "admin.knowledge.saveTemplateFailed": "Vorlage konnte nicht gespeichert werden", - "admin.knowledge.deleteArticleFailed": "Artikel konnte nicht gelöscht werden", - "admin.knowledge.deleteTemplateFailed": "Vorlage konnte nicht gelöscht werden", + "admin.knowledge.deleteArticleFailed": "Artikel konnte nicht gelöscht werden", + "admin.knowledge.deleteTemplateFailed": "Vorlage konnte nicht gelöscht werden", "admin.knowledge.saveAutoFailed": "Auto-Antwort-Einstellungen konnten nicht gespeichert werden", "admin.knowledge.uploadImageFailed": "Bild konnte nicht hochgeladen werden", "admin.translations.eyebrow": "Plattform", - "admin.translations.title": "Übersetzungen", - "admin.translations.description": "Prüfen Sie die Dashboard-UI-Abdeckung und bearbeiten Sie dateibasierte Locale-Packs.", - "admin.translations.unavailable": "Übersetzungen nicht verfügbar", + "admin.translations.title": "Übersetzungen", + "admin.translations.description": "Prüfen Sie die Dashboard-UI-Abdeckung und bearbeiten Sie dateibasierte Locale-Packs.", + "admin.translations.unavailable": "Übersetzungen nicht verfügbar", "admin.translations.sourceOfTruth": "Single Source of Truth", "admin.translations.sourceOfTruthLabel": "Single Source of Truth:", "admin.translations.colLocale": "Locale", - "admin.translations.colTranslated": "Übersetzt", + "admin.translations.colTranslated": "Übersetzt", "admin.translations.colMissing": "Fehlend", "admin.translations.colStatus": "Zustand", "admin.translations.badgeBase": "Basis", - "admin.translations.badgeComplete": "Vollständig", + "admin.translations.badgeComplete": "Vollständig", "admin.translations.badgeUnregistered": "Nicht registriert", - "admin.translations.badgeGaps": "Lücken", + "admin.translations.badgeGaps": "Lücken", "admin.translations.language": "Sprache", "admin.translations.show": "Anzeigen", "admin.translations.filterMissing": "Nur fehlende", - "admin.translations.filterTranslated": "Nur übersetzte", - "admin.translations.filterAll": "Alle Schlüssel", + "admin.translations.filterTranslated": "Nur übersetzte", + "admin.translations.filterAll": "Alle Schlüssel", "admin.translations.search": "Suchen", - "admin.translations.searchPlaceholder": "Schlüssel oder Text…", - "admin.translations.noKeysMatch": "Keine Schlüssel passen", + "admin.translations.searchPlaceholder": "Schlüssel oder Text…", + "admin.translations.noKeysMatch": "Keine Schlüssel passen", "admin.translations.badgeMissing": "Fehlend", "admin.translations.badgeUnsaved": "Ungespeichert", "admin.translations.english": "Englisch", "admin.bootstrap.title": "Bootstrap-Admin-Zugriff", - "admin.bootstrap.description": "Bestätigen Sie, ob Ihr Konto bereits Plattform-Admin-Zugriff hat. Neue Admins müssen von einem bestehenden Administrator gewährt werden.", + "admin.bootstrap.description": "Bestätigen Sie, ob Ihr Konto bereits Plattform-Admin-Zugriff hat. Neue Admins müssen von einem bestehenden Administrator gewährt werden.", "admin.bootstrap.statusTitle": "Plattform-Admin-Status", - "admin.bootstrap.statusDesc": "Plattform-Admin-Zugriff wird von einem bestehenden Administrator gewährt. Es gibt kein Self-Serve-Bootstrap für diese Rolle.", + "admin.bootstrap.statusDesc": "Plattform-Admin-Zugriff wird von einem bestehenden Administrator gewährt. Es gibt kein Self-Serve-Bootstrap für diese Rolle.", "admin.bootstrap.alreadyAdmin": "Sie haben bereits Plattform-Admin-Zugriff.", - "admin.bootstrap.signedInAs": "Angemeldet als {email}. Öffnen Sie das Admin-Panel, um fortzufahren.", + "admin.bootstrap.signedInAs": "Angemeldet als {email}. Öffnen Sie das Admin-Panel, um fortzufahren.", "admin.bootstrap.signedInAsShort": "Angemeldet als {email}", "admin.bootstrap.notAdminTitle": "Kein Plattform-Admin", "admin.bootstrap.notAdminMsg": "Ihr Konto ist angemeldet, aber nicht als Plattform-Admin markiert. Bitten Sie einen bestehenden Admin um Zugriff, melden Sie sich ab und wieder an.", "admin.bootstrap.goToPanel": "Zum Admin-Panel", "admin.bootstrap.loadFailed": "Profil konnte nicht geladen werden", "admin.migrate.title": "Organisationsmigration", - "admin.migrate.description": "Dieses Migrationswerkzeug ist außer Betrieb und ändert keine Daten.", - "admin.migrate.notAvailable": "Nicht verfügbar", - "admin.migrate.body": "Die Organisationsmigration vom vorherigen Identity Provider ist nicht mehr nötig. Unternehmen und lokale Auth werden unter Benutzer & Organisationen verwaltet.", - "admin.migrate.hint": "Wenn Sie dies über ein altes Lesezeichen geöffnet haben, fahren Sie mit Benutzer & Organisationen, Plattform-Abrechnung oder Hängengebliebenen Produkten fort.", + "admin.migrate.description": "Dieses Migrationswerkzeug ist außer Betrieb und ändert keine Daten.", + "admin.migrate.notAvailable": "Nicht verfügbar", + "admin.migrate.body": "Die Organisationsmigration vom vorherigen Identity Provider ist nicht mehr nötig. Unternehmen und lokale Auth werden unter Benutzer & Organisationen verwaltet.", + "admin.migrate.hint": "Wenn Sie dies über ein altes Lesezeichen geöffnet haben, fahren Sie mit Benutzer & Organisationen, Plattform-Abrechnung oder Hängengebliebenen Produkten fort.", "admin.migrate.adminHome": "Admin-Start", "admin.migrate.users": "Benutzer", - "admin.redirect.diagnostics": "Weiterleitung zur Diagnose…", - "admin.redirect.stuck": "Weiterleitung zu hängengebliebenen Produkten…", + "admin.redirect.diagnostics": "Weiterleitung zur Diagnose…", + "admin.redirect.stuck": "Weiterleitung zu hängengebliebenen Produkten…", "common.refresh": "Aktualisieren", - "common.delete": "Löschen", - "common.clearSearch": "Suche löschen", - "common.loading": "Laden…", + "common.delete": "Löschen", + "common.clearSearch": "Suche löschen", + "common.loading": "Laden…", "common.never": "Nie", - "common.back": "Zurück", + "common.back": "Zurück", "common.startOver": "Von vorn beginnen", "common.create": "Erstellen", "common.required": "Erforderlich", @@ -1581,10 +1581,10 @@ export const de: MessageDict = { "common.products": "Produkte", "common.more": "+{count} weitere", "feeds.title": "Ihre Feeds", - "feeds.loadingDesc": "Lieferanten-Feeds werden geladen…", - "feeds.desc": "{page} auf dieser Seite · {total} Feeds gesamt — Lieferanten-CSV/XML-URLs und Uploads. Verbinden Sie über Stores für geführte Optionen.", + "feeds.loadingDesc": "Lieferanten-Feeds werden geladen…", + "feeds.desc": "{page} auf dieser Seite · {total} Feeds gesamt — Lieferanten-CSV/XML-URLs und Uploads. Verbinden Sie über Stores für geführte Optionen.", "feeds.storesHub": "Shop-Zentrale", - "feeds.addFeed": "Feed hinzufügen", + "feeds.addFeed": "Feed hinzufügen", "feeds.searchPlaceholder": "Feeds suchen...", "feeds.emptyTitle": "Noch keine Produkt-Feeds", "feeds.emptyMessage": "Verbinden Sie eine Lieferanten-CSV/XML-URL oder laden Sie eine Datei hoch, um Produkte in Ihren Katalog zu synchronisieren.", @@ -1602,46 +1602,46 @@ export const de: MessageDict = { "feeds.mappingsSaved": "Feldzuordnungen gespeichert", "feeds.mapped": "Zugeordnet", "feeds.notMapped": "Nicht zugeordnet", - "feeds.notMappedTitle": "Noch keine Feldzuordnungen — öffnen Sie Zuordnen zum Konfigurieren", + "feeds.notMappedTitle": "Noch keine Feldzuordnungen — öffnen Sie Zuordnen zum Konfigurieren", "feeds.productsFromFeed": "{count} Produkte aus diesem Feed", "feeds.noProductsYet": "Noch keine Produkte aus diesem Feed importiert", - "feeds.syncing": "Synchronisierung…", + "feeds.syncing": "Synchronisierung…", "feeds.syncingShort": "Synchronisierung", - "feeds.syncingHint": "Kann bei großen Feeds einige Minuten dauern", + "feeds.syncingHint": "Kann bei großen Feeds einige Minuten dauern", "feeds.liveSync": "Feed-Sync", "feeds.productData": "Katalogdaten", "feeds.mapFields": "Felder zuordnen", "feeds.map": "Zuordnen", "feeds.sync": "Synchronisieren", "feeds.syncNow": "Jetzt synchronisieren", - "feeds.syncManualTitle": "Jetzt einmalig synchronisieren. Die Auto-Sync-Intervall-Einstellung bleibt unverändert.", - "feeds.syncInProgress": "Sync läuft", - "feeds.addTitle": "Feed hinzufügen", - "feeds.addDesc": "Verbinden Sie eine Produkt-Feed-URL oder laden Sie eine CSV hoch. Nutzen Sie die Beispiele unten für die erwartete Struktur.", + "feeds.syncManualTitle": "Jetzt einmalig synchronisieren. Die Auto-Sync-Intervall-Einstellung bleibt unverändert.", + "feeds.syncInProgress": "Sync läuft", + "feeds.addTitle": "Feed hinzufügen", + "feeds.addDesc": "Verbinden Sie eine Produkt-Feed-URL oder laden Sie eine CSV hoch. Nutzen Sie die Beispiele unten für die erwartete Struktur.", "feeds.field.name": "Bezeichnung", "feeds.field.namePlaceholder": "Mein Produktfeed", "feeds.tab.url": "Feed-URL", "feeds.tab.file": "CSV-Datei", "feeds.field.url": "Feed-URL", - "feeds.field.urlPlaceholder": "https://…", + "feeds.field.urlPlaceholder": "https://…", "feeds.field.type": "Typ", "feeds.field.file": "CSV-Datei", - "feeds.fileHint": "Max. 5 MiB. Nach dem Erstellen Spalten zuordnen, dann synchronisieren — gleicher Ablauf wie URL-Feeds.", + "feeds.fileHint": "Max. 5 MiB. Nach dem Erstellen Spalten zuordnen, dann synchronisieren — gleicher Ablauf wie URL-Feeds.", "feeds.field.interval": "Auto-Sync-Intervall (Minuten)", - "feeds.field.intervalHint": "Wie oft Descrybe diesen Feed automatisch abrufen soll, solange er aktiv ist. Sync in der Feed-Liste startet einen einmaligen Abruf — das ändert diesen Zeitplan nicht.", + "feeds.field.intervalHint": "Wie oft Descrybe diesen Feed automatisch abrufen soll, solange er aktiv ist. Sync in der Feed-Liste startet einen einmaligen Abruf — das ändert diesen Zeitplan nicht.", "feeds.createFeed": "Feed erstellen", "feeds.editTitle": "Feed bearbeiten", - "feeds.editDesc": "Name, Typ, Auto-Sync-Zeitplan oder Quell-URL aktualisieren. Sync in der Feed-Liste führt einen einmaligen Abruf aus.", + "feeds.editDesc": "Name, Typ, Auto-Sync-Zeitplan oder Quell-URL aktualisieren. Sync in der Feed-Liste führt einen einmaligen Abruf aus.", "feeds.csvSource": "CSV-Quelle", "feeds.uploadedCsv": "Hochgeladenes CSV", "feeds.replaceFileHint": "Um die Datei zu ersetzen, erstellen Sie einen neuen Feed. Sync liest den gespeicherten Upload erneut.", "feeds.csvTypeLocked": "Hochgeladene CSV-Feeds bleiben vom Typ CSV.", - "feeds.saveChanges": "Änderungen speichern", + "feeds.saveChanges": "Änderungen speichern", "feeds.historyTitle": "Sync-Verlauf", - "feeds.historyDesc": "Aktuelle Sync-Jobs für „{name}“.", + "feeds.historyDesc": "Aktuelle Sync-Jobs für „{name}“.", "feeds.historyLastSynced": "Letzte erfolgreiche Sync {relative} ({absolute}).", "feeds.historyNeverSynced": "Noch keine erfolgreiche Sync.", - "feeds.historyLoading": "Sync-Verlauf wird geladen…", + "feeds.historyLoading": "Sync-Verlauf wird geladen…", "feeds.historyEmpty": "Noch keine Sync-Jobs.", "feeds.history.started": "Gestartet", "feeds.history.completed": "Abgeschlossen", @@ -1656,18 +1656,18 @@ export const de: MessageDict = { "feeds.processing": "Verarbeitung", "feeds.syncFailed": "Sync fehlgeschlagen", "feeds.statusUpdateFailed": "Status konnte nicht aktualisiert werden", - "feeds.deleteConfirm": "Feed „{name}“ löschen? Das kann nicht rückgängig gemacht werden.", - "feeds.deleted": "Feed gelöscht.", - "feeds.deleteFailed": "Feed konnte nicht gelöscht werden", + "feeds.deleteConfirm": "Feed „{name}“ löschen? Das kann nicht rückgängig gemacht werden.", + "feeds.deleted": "Feed gelöscht.", + "feeds.deleteFailed": "Feed konnte nicht gelöscht werden", "feeds.historyLoadFailed": "Sync-Verlauf konnte nicht geladen werden", - "feeds.ftpUnsupported": "FTP/FTPS-Sync wird nicht unterstützt. Bitten Sie Ihren Lieferanten um eine öffentliche HTTPS-Feed-URL, laden Sie hier einen CSV-Feed hoch oder importieren Sie eine Datei unter Uploads.", - "feeds.ftpUnsupportedShort": "FTP-Sync nicht unterstützt", + "feeds.ftpUnsupported": "FTP/FTPS-Sync wird nicht unterstützt. Bitten Sie Ihren Lieferanten um eine öffentliche HTTPS-Feed-URL, laden Sie hier einen CSV-Feed hoch oder importieren Sie eine Datei unter Uploads.", + "feeds.ftpUnsupportedShort": "FTP-Sync nicht unterstützt", "feeds.ftpBadge": "FTP", - "feeds.ftpMigrateBanner": "Einige Feeds nutzen noch FTP/FTPS. Descrybe kann diese Links nicht abrufen. Wechseln Sie zu einer öffentlichen HTTPS-URL, fügen Sie einen CSV-Feed hinzu oder laden Sie unter Uploads hoch.", + "feeds.ftpMigrateBanner": "Einige Feeds nutzen noch FTP/FTPS. Descrybe kann diese Links nicht abrufen. Wechseln Sie zu einer öffentlichen HTTPS-URL, fügen Sie einen CSV-Feed hinzu oder laden Sie unter Uploads hoch.", "feeds.ftpUploadCta": "Zu Uploads", - "feeds.ftpHttpsCta": "HTTPS-Feed hinzufügen", + "feeds.ftpHttpsCta": "HTTPS-Feed hinzufügen", "feeds.ftpCsvCta": "CSV-Feed hochladen", - "feeds.status.mappingIncomplete": "Zuordnung unvollständig", + "feeds.status.mappingIncomplete": "Zuordnung unvollständig", "feeds.status.readyForMapping": "Bereit zur Zuordnung", "feeds.status.mapped": "Zugeordnet", "feeds.status.active": "Aktiv", @@ -1675,127 +1675,127 @@ export const de: MessageDict = { "feeds.status.error": "Fehler", "feeds.status.unknown": "Unbekannt", "feeds.actions.menu": "Feed-Aktionen", - "feeds.actions.menuSyncing": "Feed-Aktionen (Sync läuft)", + "feeds.actions.menuSyncing": "Feed-Aktionen (Sync läuft)", "feeds.actions.editFeed": "Feed bearbeiten", "feeds.actions.editMapping": "Zuordnung bearbeiten", "feeds.actions.syncNow": "Jetzt synchronisieren", - "feeds.actions.syncInProgress": "Sync läuft…", + "feeds.actions.syncInProgress": "Sync läuft…", "feeds.actions.activateToSync": "Feed zum Synchronisieren aktivieren", "feeds.actions.viewHistory": "Sync-Verlauf anzeigen", "feeds.actions.deactivate": "Feed deaktivieren", "feeds.actions.activate": "Feed aktivieren", - "feeds.actions.delete": "Feed löschen", + "feeds.actions.delete": "Feed löschen", "feeds.stats.totalFeeds": "Feeds gesamt", - "feeds.stats.activeMapped": "{active} aktiv · {mapped} zugeordnet", + "feeds.stats.activeMapped": "{active} aktiv · {mapped} zugeordnet", "feeds.stats.activeOnly": "{active} aktiv", "feeds.stats.totalProducts": "Importierte Produkte", - "feeds.stats.acrossFeeds": "Rohzeilen über Feeds (nicht Katalog + Warteschlange)", + "feeds.stats.acrossFeeds": "Rohzeilen über Feeds (nicht Katalog + Warteschlange)", "feeds.stats.processed": "Im Katalog", - "feeds.stats.readyCatalog": "Katalogzeilen — kein Anteil der Importierten", + "feeds.stats.readyCatalog": "Katalogzeilen — kein Anteil der Importierten", "feeds.stats.unprocessed": "Wartet auf Verarbeitung", - "feeds.stats.waiting": "Roh-Warteschlange — kein Anteil der Importierten", + "feeds.stats.waiting": "Roh-Warteschlange — kein Anteil der Importierten", "feeds.format.howTo": "So strukturieren Sie Ihren Feed", "feeds.format.required": "Erforderlich:", "feeds.preview.title": "Vorschau der Feed-Quelle", - "feeds.preview.truncated": "Gekürzt", + "feeds.preview.truncated": "Gekürzt", "feeds.preview.refresh": "Vorschau aktualisieren", "feeds.preview.copy": "Vorschau kopieren", - "feeds.preview.loading": "Vorschau wird geladen…", + "feeds.preview.loading": "Vorschau wird geladen…", "feeds.preview.empty": "Schema extrahieren, um die Feed-Quelle vorzuschauen.", - "feeds.schema.search": "Felder suchen…", + "feeds.schema.search": "Felder suchen…", "feeds.schema.fieldName": "Feldname", "feeds.schema.sourcePath": "Quellpfad", - "feeds.schema.confirm": "Bestätigen", + "feeds.schema.confirm": "Bestätigen", "feeds.schema.apply": "Anwenden", - "feeds.preflight.missingItemPath": "Wählen Sie vor dem Synchronisieren einen Produkt-Elementpfad.", + "feeds.preflight.missingItemPath": "Wählen Sie vor dem Synchronisieren einen Produkt-Elementpfad.", "feeds.preflight.emptyMappings": "Ordnen Sie vor dem Synchronisieren mindestens ein Quellfeld zu.", "feeds.preflight.missingRequired": "Ordnen Sie Pflichtfelder vor dem Synchronisieren zu: {fields}.", "feeds.preflight.unknownSource": "Einige zugeordnete Quellen fehlen im extrahierten Schema: {fields}{more}. Extrahieren Sie erneut oder korrigieren Sie Pfade, bevor Sie Stichprobenwerte nutzen.", - "feeds.preflight.emptySample": "Pflichtfelder haben leere Stichprobenwerte: {fields}. Prüfen Sie Quellspalten vor einer vollständigen Sync.", + "feeds.preflight.emptySample": "Pflichtfelder haben leere Stichprobenwerte: {fields}. Prüfen Sie Quellspalten vor einer vollständigen Sync.", "feeds.preflight.fix": "Korrigieren Sie Feldzuordnungen vor dem Synchronisieren.", "mapping.title": "Feed-Mapping", "mapping.titleNamed": "Zuordnen: {name}", - "mapping.description": "Wählen Sie das wiederkehrende Produktelement, extrahieren Sie Quellfelder und ordnen Sie sie den Descrybe-Produktfeldern zu.", + "mapping.description": "Wählen Sie das wiederkehrende Produktelement, extrahieren Sie Quellfelder und ordnen Sie sie den Descrybe-Produktfeldern zu.", "mapping.autoMap": "Auto-zuordnen", "mapping.fuzzy": "{count} unscharf", "mapping.extractSchema": "Schema extrahieren", - "mapping.backToFeeds": "Zurück zu Feeds", - "mapping.ftpStillEdit": "{message} Sie können Zuordnungen hier weiterhin bearbeiten. Zum Aktualisieren der Produkte auf HTTPS wechseln oder eine Datei hochladen.", + "mapping.backToFeeds": "Zurück zu Feeds", + "mapping.ftpStillEdit": "{message} Sie können Zuordnungen hier weiterhin bearbeiten. Zum Aktualisieren der Produkte auf HTTPS wechseln oder eine Datei hochladen.", "mapping.ftpUploadCta": "Zu Uploads", - "mapping.ftpHttpsCta": "HTTPS-Feed hinzufügen", + "mapping.ftpHttpsCta": "HTTPS-Feed hinzufügen", "mapping.ftpCsvCta": "CSV-Feed hochladen", - "mapping.loading": "Feed-Details werden geladen…", - "mapping.step1": "Produktelement auswählen", + "mapping.loading": "Feed-Details werden geladen…", + "mapping.step1": "Produktelement auswählen", "mapping.step2": "Felder zuordnen", - "mapping.step1Heading": "Schritt 1: Produktelement auswählen", - "mapping.csvHint": "CSV-Feeds nutzen Spaltenköpfe als Quellfelder. Extrahieren Sie das Schema, um Spalten zu laden, und fahren Sie mit dem Mapping fort.", - "mapping.howToSelect": "So wählen Sie das Produktelement:", + "mapping.step1Heading": "Schritt 1: Produktelement auswählen", + "mapping.csvHint": "CSV-Feeds nutzen Spaltenköpfe als Quellfelder. Extrahieren Sie das Schema, um Spalten zu laden, und fahren Sie mit dem Mapping fort.", + "mapping.howToSelect": "So wählen Sie das Produktelement:", "mapping.howToHint": "Optionale Anleitung", "mapping.howTo.1": "Schema extrahieren oder auf ein wiederholtes Tag in der Vorschau klicken", "mapping.howTo.2": "Jedes Element sollte die Details eines einzelnen Produkts enthalten", - "mapping.howTo.3": "Pfad bestätigen (zum Beispiel", + "mapping.howTo.3": "Pfad bestätigen (zum Beispiel", "mapping.howTo.4": "Weiter Quellfelder den Produktfeldern zuordnen", "mapping.productElementPath": "Pfad des Produktelements", "mapping.pathPlaceholder": "z. B. rss/channel/item oder products/product", - "mapping.continue": "Weiter →", - "mapping.continueFields": "Weiter zur Feldzuordnung →", + "mapping.continue": "Weiter →", + "mapping.continueFields": "Weiter zur Feldzuordnung →", "mapping.discovered": "{fields} Quellfelder aus {rows} Beispielzeile(n) gefunden.", - "mapping.suggestionsCount": "· {count} Auto-Mapping-Vorschlag/-schläge", + "mapping.suggestionsCount": "· {count} Auto-Mapping-Vorschlag/-schläge", "mapping.step2Heading": "Schritt 2: Felder zuordnen", "mapping.requiredFieldsBadge": "{count} Pflichtfelder", "mapping.unmappedRequired": "{count} Pflichtfelder ohne Zuordnung", "mapping.sourceFieldsBadge": "{count} Quellfelder", "mapping.suggestedBadge": "{count} vorgeschlagen", - "mapping.step2Help": "Ordnen Sie Spalten oder XPath-Knoten Ihren Produktfeldern zu. Pflichtfelder sind mit * markiert. Hover über das Hilfe-Icon für einen kurzen Tipp.", + "mapping.step2Help": "Ordnen Sie Spalten oder XPath-Knoten Ihren Produktfeldern zu. Pflichtfelder sind mit * markiert. Hover über das Hilfe-Icon für einen kurzen Tipp.", "mapping.requiredFields": "Pflichtfelder", - "mapping.requiredMapped": "· {mapped}/{total} zugeordnet", - "mapping.requiredProgressDone": "Alle Pflichtfelder zugeordnet — bereit für den nächsten Schritt.", - "mapping.requiredProgressHint": "Mit * markierte Felder müssen zugeordnet sein, bevor dieser Feed Produkte synchronisieren kann.", + "mapping.requiredMapped": "· {mapped}/{total} zugeordnet", + "mapping.requiredProgressDone": "Alle Pflichtfelder zugeordnet — bereit für den nächsten Schritt.", + "mapping.requiredProgressHint": "Mit * markierte Felder müssen zugeordnet sein, bevor dieser Feed Produkte synchronisieren kann.", "mapping.requiredProgressAria": "Fortschritt Pflichtfelder: {mapped} von {total} zugeordnet", "mapping.nextAfterSaveReady": "Mappings saved. Next, sync a small sample to check products look right.", "mapping.nextAfterSaveIncomplete": "Mappings saved. Finish the remaining required fields, then sync a sample.", "mapping.nextCtaSyncSample": "Sync + process sample", "mapping.nextCtaFinishRequired": "Show missing required fields", - "mapping.highConfidence": "{count} hochvertrauenswürdige Zuordnung bereit", - "mapping.highConfidencePlural": "{count} hochvertrauenswürdige Zuordnungen bereit", - "mapping.highConfidenceHelp": "Exakte und Alias-Treffer (z. B. EAN → GTIN). Alle anwenden oder Chips pro Zeile akzeptieren.", - "mapping.reviewMappings": "Zuordnungen prüfen", + "mapping.highConfidence": "{count} hochvertrauenswürdige Zuordnung bereit", + "mapping.highConfidencePlural": "{count} hochvertrauenswürdige Zuordnungen bereit", + "mapping.highConfidenceHelp": "Exakte und Alias-Treffer (z. B. EAN → GTIN). Alle anwenden oder Chips pro Zeile akzeptieren.", + "mapping.reviewMappings": "Zuordnungen prüfen", "mapping.needItemPath": "Geben Sie vor dem Mapping einen Produkt-Elementpfad ein.", "mapping.removeMapping": "Zuordnung entfernen", "mapping.sourcePlaceholder": "Spaltenname oder XPath", "mapping.processAfterSync": "Produkte nach Sync verarbeiten", - "mapping.noFuzzyLeft": "Keine unscharfen Treffer mehr zu bestätigen.", + "mapping.noFuzzyLeft": "Keine unscharfen Treffer mehr zu bestätigen.", "mapping.syncedQueued": "Feed synchronisiert und {queued} Produkt(e) zur Verarbeitung eingereiht{jobId}.", "mapping.saveMappings": "Zuordnungen speichern", "mapping.syncProcessSample": "Sync + Stichprobe verarbeiten", "mapping.badgeCsv": "CSV", "mapping.requiredAria": "Hilfe zu Pflichtfeldern", - "mapping.applySuggestions": "Vorschläge anwenden ({count})", - "mapping.confirmFuzzy": "Unscharfe bestätigen ({count})", - "mapping.fuzzyNeedConfirm": "{count} unscharfer Treffer zu bestätigen", - "mapping.fuzzyNeedConfirmPlural": "{count} unscharfe Treffer zu bestätigen", - "mapping.fuzzyHelp": "Treffer mit geringer Sicherheit werden nicht automatisch angewendet. Hier bestätigen oder pro Zeile akzeptieren.", + "mapping.applySuggestions": "Vorschläge anwenden ({count})", + "mapping.confirmFuzzy": "Unscharfe bestätigen ({count})", + "mapping.fuzzyNeedConfirm": "{count} unscharfer Treffer zu bestätigen", + "mapping.fuzzyNeedConfirmPlural": "{count} unscharfe Treffer zu bestätigen", + "mapping.fuzzyHelp": "Treffer mit geringer Sicherheit werden nicht automatisch angewendet. Hier bestätigen oder pro Zeile akzeptieren.", "mapping.missingRequiredTitle": "Pflichtfelder brauchen noch eine Quellzuordnung:", - "mapping.applyTip": "Tipp: Vorschläge oben anwenden — viele Pflichtfelder passen zu gängigen Quellnamen.", + "mapping.applyTip": "Tipp: Vorschläge oben anwenden — viele Pflichtfelder passen zu gängigen Quellnamen.", "mapping.formatLabel": "Format:", "mapping.itemPathLabel": "Item-Pfad:", "mapping.reExtract": "Erneut extrahieren", "mapping.manualRows": "Manuelle Zeilen", "mapping.schemaTable": "Schema-Tabelle", - "mapping.addField": "Feld hinzufügen", + "mapping.addField": "Feld hinzufügen", "mapping.noSchemaYet": "Noch kein Schema extrahiert.", "mapping.orManualRows": "oder nutzen Sie die manuellen Zeilen unten.", "mapping.sourceField": "Quellfeld", - "mapping.selectSource": "Quelle wählen…", + "mapping.selectSource": "Quelle wählen…", "mapping.mapsTo": "Zuordnen zu", "mapping.none": "Keine", - "mapping.backToItem": "← Zurück zur Elementauswahl", - "mapping.unsaved": "Ungespeicherte Änderungen", + "mapping.backToItem": "← Zurück zur Elementauswahl", + "mapping.unsaved": "Ungespeicherte Änderungen", "mapping.requiredFieldsColon": "Pflichtfelder:", "mapping.sampleOptions": "Beispieloptionen", - "mapping.sampleSize": "Stichprobengröße", - "mapping.noExactAlias": "Keine exakten/Alias-Vorschläge. Prüfen Sie die unscharfen Treffer unten.", - "mapping.noSuggestionsExtract": "Keine Vorschläge — zuerst Schema extrahieren.", + "mapping.sampleSize": "Stichprobengröße", + "mapping.noExactAlias": "Keine exakten/Alias-Vorschläge. Prüfen Sie die unscharfen Treffer unten.", + "mapping.noSuggestionsExtract": "Keine Vorschläge — zuerst Schema extrahieren.", "mapping.schemaExtracted": "Schema extrahiert: {fields} Felder aus {rows} Beispielzeile(n).", "mapping.saved": "Feldzuordnungen gespeichert{version}.", "mapping.savedVersion": " (v{version})", @@ -1803,33 +1803,33 @@ export const de: MessageDict = { "mapping.jobSuffix": " (Job {jobId})", "mapping.appliedReplace": "{count} {kind} Zuordnung(en) angewendet.", "mapping.appliedNew": "{count} neue {kind} Zuordnung(en) angewendet ({total} gesamt).", - "mapping.kindHighConfidence": "hochvertrauenswürdige", + "mapping.kindHighConfidence": "hochvertrauenswürdige", "mapping.kindFuzzy": "unscharfe", - "mapping.fuzzyConfirmFlash": "{count} unscharfer Treffer zu bestätigen — Unscharfe bestätigen unten oder Chips pro Zeile nutzen.", - "mapping.fuzzyConfirmFlashPlural": "{count} unscharfe Treffer zu bestätigen — Unscharfe bestätigen unten oder Chips pro Zeile nutzen.", + "mapping.fuzzyConfirmFlash": "{count} unscharfer Treffer zu bestätigen — Unscharfe bestätigen unten oder Chips pro Zeile nutzen.", + "mapping.fuzzyConfirmFlashPlural": "{count} unscharfe Treffer zu bestätigen — Unscharfe bestätigen unten oder Chips pro Zeile nutzen.", "mapping.formatHelp.title": "So strukturieren Sie Ihren Feed", "mapping.formatHelp.required": "Erforderlich:", "mapping.formatHelp.requiredBody": "{gtin} (EAN/UPC), {title} (oder {name}), {brand}", - "mapping.formatHelp.https": "Nutzen Sie öffentliche HTTPS-URLs für Remote-Feeds (kein FTP oder localhost). CSV-Upload eignet sich für lokale Dateien.", + "mapping.formatHelp.https": "Nutzen Sie öffentliche HTTPS-URLs für Remote-Feeds (kein FTP oder localhost). CSV-Upload eignet sich für lokale Dateien.", "mapping.formatHelp.specs": "Specs als Label: Wert-Paare (z. B. {ram}). Abmessungen: {height}, {width}, {depth}, {mass}", - "mapping.formatHelp.also": "Auch unterstützt: Preise, Bestand, Bilder, Kategorie, Garantie, EPREL-ID, HTML-Beschreibungen, Extra-Bilder, Video-URL und mehr — vollständige Stichprobe herunterladen.", + "mapping.formatHelp.also": "Auch unterstützt: Preise, Bestand, Bilder, Kategorie, Garantie, EPREL-ID, HTML-Beschreibungen, Extra-Bilder, Video-URL und mehr — vollständige Stichprobe herunterladen.", "mapping.formatHelp.downloadXml": "Beispiel-XML herunterladen", "mapping.formatHelp.downloadCsv": "Beispiel-CSV herunterladen", "mapping.formatHelp.xmlExample": "XML-Beispiel", "mapping.formatHelp.csvExample": "CSV-Beispiel (Kopf + Zeilen)", "mapping.sourcePreview.title": "Vorschau der Feed-Quelle", - "mapping.sourcePreview.truncated": "Gekürzt", + "mapping.sourcePreview.truncated": "Gekürzt", "mapping.sourcePreview.refresh": "Vorschau aktualisieren", "mapping.sourcePreview.copy": "Vorschau kopieren", - "mapping.sourcePreview.loading": "Feed-Stichprobe wird geladen…", - "mapping.sourcePreview.errorHint": "Sie können den Produktelement-Pfad weiterhin manuell eingeben. Schema extrahieren, wenn die Feed-URL erreichbar ist.", + "mapping.sourcePreview.loading": "Feed-Stichprobe wird geladen…", + "mapping.sourcePreview.errorHint": "Sie können den Produktelement-Pfad weiterhin manuell eingeben. Schema extrahieren, wenn die Feed-URL erreichbar ist.", "mapping.sourcePreview.retry": "Erneut versuchen", "mapping.sourcePreview.empty": "Noch keine Vorschau", - "mapping.sourcePreview.emptyHintXml": "Klicken Sie auf „Schema extrahieren“, um eine Stichprobe zu laden und Felder zu finden, oder geben Sie einen Item-Pfad manuell ein.", - "mapping.sourcePreview.emptyHintCsv": "Klicken Sie auf „Schema extrahieren“, um eine Stichprobe zu laden und Felder zu finden.", - "mapping.sourcePreview.selectPath": "Pfad wählen: {path}", + "mapping.sourcePreview.emptyHintXml": "Klicken Sie auf „Schema extrahieren“, um eine Stichprobe zu laden und Felder zu finden, oder geben Sie einen Item-Pfad manuell ein.", + "mapping.sourcePreview.emptyHintCsv": "Klicken Sie auf „Schema extrahieren“, um eine Stichprobe zu laden und Felder zu finden.", + "mapping.sourcePreview.selectPath": "Pfad wählen: {path}", "mapping.sourcePreview.clickTag": "Klicken Sie auf eine Tag-Zeile, um den Produktelement-Pfad festzulegen.", - "mapping.table.search": "Felder suchen…", + "mapping.table.search": "Felder suchen…", "mapping.table.all": "Alle Felder", "mapping.table.mapped": "Zugeordnet", "mapping.table.unmapped": "Nicht zugeordnet", @@ -1838,25 +1838,25 @@ export const de: MessageDict = { "mapping.table.sampleValues": "Beispielwerte", "mapping.table.type": "Typ", "mapping.table.mapTo": "Zuordnen zu", - "mapping.table.emptySchema": "Extrahieren Sie das Feed-Schema für Quellfelder, oder fügen Sie Zuordnungen manuell hinzu.", + "mapping.table.emptySchema": "Extrahieren Sie das Feed-Schema für Quellfelder, oder fügen Sie Zuordnungen manuell hinzu.", "mapping.table.noMatch": "Keine Felder entsprechen Ihren Kriterien.", "mapping.table.unique": "{count} eindeutig", "mapping.table.nested": "verschachtelt", "mapping.table.apply": "Anwenden", - "mapping.table.confirm": "Bestätigen", + "mapping.table.confirm": "Bestätigen", "mapping.table.suggestedMatch": "Vorgeschlagener {confidence}-Treffer", - "mapping.table.confirmFuzzyMatch": "Unscharfen Treffer bestätigen ({percent}%)", + "mapping.table.confirmFuzzyMatch": "Unscharfen Treffer bestätigen ({percent}%)", "mapping.preview.title": "Mapping-Vorschau", "mapping.preview.subtitle": "Beispiel-Produktform aus Ihren aktuellen Feldzuordnungen", - "mapping.preview.usingSamples": "· mit extrahierten Stichproben", + "mapping.preview.usingSamples": "· mit extrahierten Stichproben", "mapping.preview.formatCsv": "format: csv", "mapping.preview.item": "Element: {path}", - "mapping.preview.sourceFields": "· {count} Quellfelder", + "mapping.preview.sourceFields": "· {count} Quellfelder", "mapping.preview.empty": "Noch keine Felder zugeordnet", "mapping.preview.emptyHint": "Ordnen Sie Spalten oder XPath-Knoten Produktfeldern zu. Hier erscheint eine Produktvorschau.", "mapping.preview.rawSample": "Rohes Stichprobenfragment", "imports.title": "Uploads", - "imports.description": "CSV-Importe für diesen Workspace gespeichert — Produkte, Kategorien und Attribute.", + "imports.description": "CSV-Importe für diesen Workspace gespeichert — Produkte, Kategorien und Attribute.", "imports.importProducts": "Produkte importieren", "imports.emptyTitle": "Noch keine Uploads", "imports.emptyMessage": "Produkt-, Kategorie- und Attribut-CSV-Importe erscheinen hier nach dem Upload.", @@ -1868,121 +1868,121 @@ export const de: MessageDict = { "imports.col.fileName": "Dateiname", "imports.col.kind": "Art", "imports.col.uploaded": "Hochgeladen", - "imports.col.size": "Größe", + "imports.col.size": "Größe", "imports.actions": "Upload-Aktionen", "imports.loadFailed": "Uploads konnten nicht geladen werden", - "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", + "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", "imports.metadataOnlyBadge": "Metadata only (blob not migrated)", - "imports.deleteConfirm": "„{name}“ löschen? Damit wird der Upload-Datensatz entfernt (und der lokale Blob, falls vorhanden).", - "imports.deleted": "Upload gelöscht.", - "imports.deleteFailed": "Upload konnte nicht gelöscht werden", + "imports.deleteConfirm": "„{name}“ löschen? Damit wird der Upload-Datensatz entfernt (und der lokale Blob, falls vorhanden).", + "imports.deleted": "Upload gelöscht.", + "imports.deleteFailed": "Upload konnte nicht gelöscht werden", "imports.status.uploaded": "Hochgeladen", - "reviews.redirectLoading": "WooCommerce-Bewertungen werden geöffnet…", + "reviews.redirectLoading": "WooCommerce-Bewertungen werden geöffnet…", "reviews.tab": "Bewertungen", - "reviews.syncTitle": "Bewertungsimport (Shop → Descrybe)", - "reviews.syncDesc": "Eingehender Import — WooCommerce-Produktbewertungen für Kampagnen und Reputation nach Descrybe holen", + "reviews.syncTitle": "Bewertungsimport (Shop → Descrybe)", + "reviews.syncDesc": "Eingehender Import — WooCommerce-Produktbewertungen für Kampagnen und Reputation nach Descrybe holen", "reviews.syncQueued": "Bewertungs-Sync in Warteschlange", "reviews.statusBadge": "Bewertungen: {status}", "reviews.syncedCount": "{count} synchronisiert", "reviews.lastSync": "Letzte Sync: {date}", "reviews.noSyncYet": "Noch keine Bewertungs-Sync abgeschlossen.", "reviews.needsReconnect": "Bewertungsimport kann erst laufen, wenn Zugangsdaten nach der Migration erneut verbunden sind. Im Reiter Verbindung: Speichern, dann Verbindung testen.", - "reviews.queueImport": "Bewertungsimport einreihen (Shop → Descrybe)", + "reviews.queueImport": "Bewertungsimport einreihen (Shop → Descrybe)", "reviews.queueing": "Wird eingereiht...", "reviews.saveTestFirst": "Speichern Sie Anmeldedaten und testen Sie die Verbindung vor dem Sync", "reviews.refreshList": "Liste aktualisieren", - "reviews.loading": "Bewertungen werden geladen…", + "reviews.loading": "Bewertungen werden geladen…", "reviews.emptyTitle": "Noch keine Bewertungen", "reviews.emptyMessage": "Nach Shop-Verbindung Bewertungs-Sync einreihen. Dieses Tab bleibt mit leerer Liste nutzbar.", "reviews.col.product": "Produkt", "reviews.col.reviewer": "Rezensent", "reviews.col.rating": "Bewertung", - "reviews.col.review": "Prüfen", - "reviews.queuedSuccess": "Bewertungs-Sync in Warteschlange. Sync läuft bald.", + "reviews.col.review": "Prüfen", + "reviews.queuedSuccess": "Bewertungs-Sync in Warteschlange. Sync läuft bald.", "reviews.queueFailed": "Bewertungs-Sync konnte nicht in die Warteschlange gestellt werden", "campaigns.title": "Kampagnen", - "campaigns.description": "Erstellen Sie saisonale E-Mail-Kampagnen aus Ihrem Katalog — Saison wählen, Produkte auswählen, Zielgruppe festlegen und generieren.", + "campaigns.description": "Erstellen Sie saisonale E-Mail-Kampagnen aus Ihrem Katalog — Saison wählen, Produkte auswählen, Zielgruppe festlegen und generieren.", "campaigns.new": "Neue Kampagne", - "campaigns.loading": "Laden Kampagnen…", + "campaigns.loading": "Laden Kampagnen…", "campaigns.loadFailed": "Laden fehlgeschlagen Kampagnen", - "campaigns.deleteConfirm": "Kampagne „{name}“ löschen? Das kann nicht rückgängig gemacht werden.", - "campaigns.deleted": "Kampagne gelöscht", - "campaigns.deleteFailed": "Kampagne konnte nicht gelöscht werden", - "campaigns.partialUnavailable": "Kampagnen sind derzeit nicht vollständig erreichbar. Generieren und Senden können fehlschlagen, bis der Dienst wieder da ist.", - "campaigns.searchPlaceholder": "Suchen Kampagnen…", - "campaigns.unavailableTitle": "Kampagnen nicht verfügbar", - "campaigns.unavailableMessage": "Der Kampagnendienst ist nicht erreichbar. Sie können den Assistenten öffnen, aber Generieren und Senden warten auf den Dienst.", - "campaigns.openWizard": "Erstellungsassistent öffnen", - "campaigns.backDashboard": "Zurück zum Dashboard", + "campaigns.deleteConfirm": "Kampagne „{name}“ löschen? Das kann nicht rückgängig gemacht werden.", + "campaigns.deleted": "Kampagne gelöscht", + "campaigns.deleteFailed": "Kampagne konnte nicht gelöscht werden", + "campaigns.partialUnavailable": "Kampagnen sind derzeit nicht vollständig erreichbar. Generieren und Senden können fehlschlagen, bis der Dienst wieder da ist.", + "campaigns.searchPlaceholder": "Suchen Kampagnen…", + "campaigns.unavailableTitle": "Kampagnen nicht verfügbar", + "campaigns.unavailableMessage": "Der Kampagnendienst ist nicht erreichbar. Sie können den Assistenten öffnen, aber Generieren und Senden warten auf den Dienst.", + "campaigns.openWizard": "Erstellungsassistent öffnen", + "campaigns.backDashboard": "Zurück zum Dashboard", "campaigns.browseProducts": "Produkte durchsuchen", "campaigns.emptyTitle": "Noch keine Kampagnen", "campaigns.noMatches": "Keine Treffer", - "campaigns.emptyMessage": "Erstellen Sie in wenigen Schritten eine Black-Friday-, Weihnachts- oder individuelle Kampagne — saisonale Vorlagen stehen bereit.", + "campaigns.emptyMessage": "Erstellen Sie in wenigen Schritten eine Black-Friday-, Weihnachts- oder individuelle Kampagne — saisonale Vorlagen stehen bereit.", "campaigns.noMatchesMessage": "Anderen Namen, Saison oder Status versuchen.", "campaigns.create": "Erstellen Kampagne", "campaigns.col.season": "Saison", "campaigns.col.updated": "Aktualisiert", "campaigns.scheduled": "Geplant {date}", "campaigns.newTitle": "Neue Kampagne", - "campaigns.newDesc": "Saison wählen, Produkte und Zielgruppe auswählen, Prompt schreiben, dann generieren, testen und planen.", + "campaigns.newDesc": "Saison wählen, Produkte und Zielgruppe auswählen, Prompt schreiben, dann generieren, testen und planen.", "campaigns.editTitle": "Bearbeiten Kampagne", - "campaigns.editDesc": "Saison, Produkte und Zielgruppe aktualisieren — dann neu generieren, Test senden oder planen.", - "campaignWizard.loading": "Kampagnenassistent wird geladen…", - "campaignWizard.apiMissing": "Die Kampagnen-API ist vorübergehend nicht verfügbar. Sie können den Assistenten erkunden; Speichern / Generieren / Senden brauchen erreichbares /api/campaigns.", + "campaigns.editDesc": "Saison, Produkte und Zielgruppe aktualisieren — dann neu generieren, Test senden oder planen.", + "campaignWizard.loading": "Kampagnenassistent wird geladen…", + "campaignWizard.apiMissing": "Die Kampagnen-API ist vorübergehend nicht verfügbar. Sie können den Assistenten erkunden; Speichern / Generieren / Senden brauchen erreichbares /api/campaigns.", "campaignWizard.upgradeTitle": "KI-Kampagnen sind eine kostenpflichtige Funktion", - "campaignWizard.upgradeMessage": "Free-Pläne können Saisons und Zielgruppen vorbereiten, aber KI generieren braucht Starter oder höher. Upgraden Sie für KI-E-Mail-Entwürfe.", - "campaignWizard.comparePlans": "Pläne vergleichen", + "campaignWizard.upgradeMessage": "Free-Pläne können Saisons und Zielgruppen vorbereiten, aber KI generieren braucht Starter oder höher. Upgraden Sie für KI-E-Mail-Entwürfe.", + "campaignWizard.comparePlans": "Pläne vergleichen", "campaignWizard.step.season": "Saison", "campaignWizard.step.catalog": "Produkte", "campaignWizard.step.audience": "Zielgruppe", "campaignWizard.step.prompt": "Prompt", "campaignWizard.step.preview": "Vorschau", "campaignWizard.step.send": "Senden", - "campaignWizard.pickSeason": "Saison wählen", - "campaignWizard.pickSeasonHelp": "Mit Vorlage starten — Sie können später alles bearbeiten.", + "campaignWizard.pickSeason": "Saison wählen", + "campaignWizard.pickSeasonHelp": "Mit Vorlage starten — Sie können später alles bearbeiten.", "campaignWizard.name": "Kampagnenname", "campaignWizard.namePlaceholder": "Black Friday 2026", "campaignWizard.catalogTitle": "Kategorien & Produkte", - "campaignWizard.catalogHelp": "Wählen Sie, was diese E-Mail zeigen soll. Kategorien allein reichen für einen schnellen Start.", + "campaignWizard.catalogHelp": "Wählen Sie, was diese E-Mail zeigen soll. Kategorien allein reichen für einen schnellen Start.", "campaignWizard.categories": "Kategorien", - "campaignWizard.noCategories": "Noch keine Kategorien — fügen Sie welche unter Katalog hinzu.", - "campaignWizard.categoriesSelected": "{count} Kategorie ausgewählt", - "campaignWizard.categoriesSelectedPlural": "{count} Kategorien ausgewählt", + "campaignWizard.noCategories": "Noch keine Kategorien — fügen Sie welche unter Katalog hinzu.", + "campaignWizard.categoriesSelected": "{count} Kategorie ausgewählt", + "campaignWizard.categoriesSelectedPlural": "{count} Kategorien ausgewählt", "campaignWizard.productsOptional": "Produkte (optional)", - "campaignWizard.selectedCount": "{count} ausgewählt", - "campaignWizard.searchProducts": "Produkte suchen…", + "campaignWizard.selectedCount": "{count} ausgewählt", + "campaignWizard.searchProducts": "Produkte suchen…", "campaignWizard.noProducts": "Keine Produkte gefunden.", "campaignWizard.audienceTitle": "Wer soll das erhalten?", - "campaignWizard.audienceHelp": "Standardmäßig alle. Eingrenzen mit Kategorien oder früheren Käufern, wenn Bestellungen sync sind.", + "campaignWizard.audienceHelp": "Standardmäßig alle. Eingrenzen mit Kategorien oder früheren Käufern, wenn Bestellungen sync sind.", "campaignWizard.audience.all": "Alle Kontakte", "campaignWizard.audience.allHint": "An die gesamte Liste senden (wenn E-Mail-Anbieter konfiguriert ist).", "campaignWizard.audience.byCategory": "Nach Kategorieinteresse", - "campaignWizard.audience.byCategoryHint": "Personen mit Bezug zu ausgewählten Kategorien.", + "campaignWizard.audience.byCategoryHint": "Personen mit Bezug zu ausgewählten Kategorien.", "campaignWizard.audience.purchased": "In Kategorie gekauft", "campaignWizard.audience.purchasedHint": "Kunden, die Produkte der Zielgruppen-Kategorien kauften (aus sync Bestellungen).", "campaignWizard.audience.notPurchased": "Noch nicht gekauft", - "campaignWizard.audience.notPurchasedHint": "Kontakte, die diese Kategorien nicht kauften — ideal für Win-back.", + "campaignWizard.audience.notPurchasedHint": "Kontakte, die diese Kategorien nicht kauften — ideal für Win-back.", "campaignWizard.ordersHint": "Gekauft-/Nicht-gekauft-Targeting erscheint nach Sync von WooCommerce-Bestellungen.", "campaignWizard.audienceCategories": "Zielgruppen-Kategorien", "campaignWizard.promptTitle": "E-Mail-Prompt", - "campaignWizard.promptHelp": "Wir haben eine solide Vorgabe für {season} ausgefüllt. Beliebig bearbeiten oder behalten.", + "campaignWizard.promptHelp": "Wir haben eine solide Vorgabe für {season} ausgefüllt. Beliebig bearbeiten oder behalten.", "campaignWizard.promptSeasonFallback": "diese Saison", - "campaignWizard.useDefaultPrompt": "Standardmäßigen Saison-Prompt verwenden", + "campaignWizard.useDefaultPrompt": "Standardmäßigen Saison-Prompt verwenden", "campaignWizard.promptLabel": "Prompt", "campaignWizard.advanced": "Erweiterte Optionen", - "campaignWizard.advancedHelp": "Die KI-Generierung nutzt Ihr Brand-Kit (falls gesetzt) und ausgewählte Produkte. Nur-Vorlagen-Vorschau überspringt KI und dient als Layout-Stub.", + "campaignWizard.advancedHelp": "Die KI-Generierung nutzt Ihr Brand-Kit (falls gesetzt) und ausgewählte Produkte. Nur-Vorlagen-Vorschau überspringt KI und dient als Layout-Stub.", "campaignWizard.planFree": "Kostenlos", "campaignWizard.planPaid": "Kostenpflichtig", "campaignWizard.planLine": "Tarif:", - "campaignWizard.aiLocked": "— KI generieren ist gesperrt.", + "campaignWizard.aiLocked": "— KI generieren ist gesperrt.", "campaignWizard.generateAi": "KI generieren", "campaignWizard.templatePreview": "Vorlagenvorschau", "campaignWizard.saveDraft": "Entwurf speichern", "campaignWizard.previewTitle": "Vorschau", "campaignWizard.status": "Statusangabe:", "campaignWizard.generateToSee": "Generieren Sie einen Entwurf, um den E-Mail-Text zu sehen.", - "campaignWizard.noPreview": "Noch keine Vorschau. Zurück zu Prompt und KI generieren oder Vorlagenvorschau ausführen.", - "campaignWizard.backToPrompt": "Zurück zum Prompt", + "campaignWizard.noPreview": "Noch keine Vorschau. Zurück zu Prompt und KI generieren oder Vorlagenvorschau ausführen.", + "campaignWizard.backToPrompt": "Zurück zum Prompt", "campaignWizard.subject": "Betreff", "campaignWizard.emailPreview": "E-Mail-Vorschau", "campaignWizard.regenerateAi": "Mit KI neu generieren", @@ -1994,200 +1994,200 @@ export const de: MessageDict = { "campaignWizard.testEmailPlaceholder": "sie@firma.de", "campaignWizard.sendTest": "Test senden", "campaignWizard.scheduleTitle": "Planen", - "campaignWizard.scheduleHelp": "Wählen Sie, wann diese Kampagne rausgehen soll.", + "campaignWizard.scheduleHelp": "Wählen Sie, wann diese Kampagne rausgehen soll.", "campaignWizard.sendAt": "Senden um", "campaignWizard.schedule": "Kampagne planen", "campaignWizard.generateToContinue": "Generieren zum Fortfahren", "campaignWizard.done": "Fertig", "campaignWizard.loadFailed": "Assistent konnte nicht geladen werden", - "campaignWizard.pickCatalog": "Wählen Sie mindestens eine Kategorie oder ein Produkt", - "campaignWizard.pickAudienceCats": "Wählen Sie Zielgruppen-Kategorien für diesen Filter", - "campaignWizard.completeStep": "Schließen Sie diesen Schritt ab, um fortzufahren", + "campaignWizard.pickCatalog": "Wählen Sie mindestens eine Kategorie oder ein Produkt", + "campaignWizard.pickAudienceCats": "Wählen Sie Zielgruppen-Kategorien für diesen Filter", + "campaignWizard.completeStep": "Schließen Sie diesen Schritt ab, um fortzufahren", "campaignWizard.aiDraftReady": "KI-Entwurf erzeugt", "campaignWizard.templateReady": "Vorlagenvorschau bereit", - "campaignWizard.unavailableSave": "Kampagnen sind derzeit nicht verfügbar. Entwürfe können nicht gespeichert werden, bis die Funktion live ist.", + "campaignWizard.unavailableSave": "Kampagnen sind derzeit nicht verfügbar. Entwürfe können nicht gespeichert werden, bis die Funktion live ist.", "campaignWizard.generateFailed": "Generierung fehlgeschlagen", "campaignWizard.generateFirst": "Zuerst eine Vorschau erzeugen", "campaignWizard.enterTestEmail": "Geben Sie eine Test-E-Mail-Adresse ein", "campaignWizard.testFailed": "Testversand fehlgeschlagen", - "campaignWizard.pickSchedule": "Wählen Sie Datum und Uhrzeit", + "campaignWizard.pickSchedule": "Wählen Sie Datum und Uhrzeit", "campaignWizard.scheduled": "Kampagne geplant", "campaignWizard.scheduleFailed": "Planung fehlgeschlagen", "campaignWizard.draftSaved": "Entwurf gespeichert", - "campaignWizard.unavailableShort": "Kampagnen sind derzeit nicht verfügbar.", + "campaignWizard.unavailableShort": "Kampagnen sind derzeit nicht verfügbar.", "campaignWizard.saveFailed": "Speichern fehlgeschlagen", "marketing.calendarTitle": "Content-Kalender", - "marketing.calendarDesc": "Verknüpfen Sie Saisonkampagnen mit Daten und bereiten Sie einen Export-Feed mit Shopping-Defaults vor.", + "marketing.calendarDesc": "Verknüpfen Sie Saisonkampagnen mit Daten und bereiten Sie einen Export-Feed mit Shopping-Defaults vor.", "marketing.loadFailed": "Kalender konnte nicht geladen werden", "marketing.prepared": "Kampagne vorbereitet", "marketing.alreadyReady": "Kampagne ist bereits bereit", - "marketing.exportFeedsHint": "{name} → Export-Feeds", + "marketing.exportFeedsHint": "{name} → Export-Feeds", "marketing.prepareFailed": "Kampagne konnte nicht vorbereitet werden", "marketing.requestFailed": "Anfrage fehlgeschlagen", "marketing.emptyTitle": "Keine saisonalen Presets", - "marketing.emptyMessage": "Kalender-Presets erscheinen hier, sobald die Marketing-API verfügbar ist.", - "marketing.openCampaigns": "E-Mail-Kampagnen öffnen", + "marketing.emptyMessage": "Kalender-Presets erscheinen hier, sobald die Marketing-API verfügbar ist.", + "marketing.openCampaigns": "E-Mail-Kampagnen öffnen", "marketing.window": "Fenster:", - "marketing.linkedExport": "Verknüpfter Export:", - "marketing.openPrepared": "Vorbereiteten Feed öffnen", - "marketing.preparing": "Wird vorbereitet…", + "marketing.linkedExport": "Verknüpfter Export:", + "marketing.openPrepared": "Vorbereiteten Feed öffnen", + "marketing.preparing": "Wird vorbereitet…", "marketing.prepareNamed": "{name}-Kampagne vorbereiten", - "marketing.footer": "E-Mail-Kampagnen bleiben unter {link} — diese Seite bereitet nur Katalog-Export-Feeds vor.", + "marketing.footer": "E-Mail-Kampagnen bleiben unter {link} — diese Seite bereitet nur Katalog-Export-Feeds vor.", "common.done": "Fertig", "common.copied": "In die Zwischenablage kopiert.", "common.copyFailed": "Kopieren fehlgeschlagen. Markieren Sie den Text und kopieren Sie manuell.", - "common.submitting": "Wird gesendet…", - "common.sending": "Senden…", - "settings.companyAdminOnlyView": "Nur Unternehmens-Admins können Firmeneinstellungen ändern. Sie können die aktuellen Workspace-Details einsehen.", - "settings.activeCompanyHelp": "Workspace für Katalog, Feeds, Abrechnung und API-Schlüssel. Wechseln Sie jederzeit hier oder in der Kopfzeile.", - "settings.noCompanySelected": "Kein Unternehmen ausgewählt", + "common.submitting": "Wird gesendet…", + "common.sending": "Senden…", + "settings.companyAdminOnlyView": "Nur Unternehmens-Admins können Firmeneinstellungen ändern. Sie können die aktuellen Workspace-Details einsehen.", + "settings.activeCompanyHelp": "Workspace für Katalog, Feeds, Abrechnung und API-Schlüssel. Wechseln Sie jederzeit hier oder in der Kopfzeile.", + "settings.noCompanySelected": "Kein Unternehmen ausgewählt", "settings.creditsOverviewHelp": "KI-Credit-Saldo des aktiven Unternehmens. Detaillierte Nutzung steht unter Abrechnung.", "settings.billingLabel": "Abrechnung", "settings.remainingLabel": "Verbleibend", - "settings.creditsUnavailable": "Credit-Saldo ist für diesen Workspace noch nicht verfügbar.", - "settings.openBilling": "Nutzung & Abrechnung öffnen", + "settings.creditsUnavailable": "Credit-Saldo ist für diesen Workspace noch nicht verfügbar.", + "settings.openBilling": "Nutzung & Abrechnung öffnen", "settings.companyNameHelp": "Dieser Name erscheint in Einladungen und Organisationseinstellungen", - "settings.contentSettingsHelp": "Sprache und Produktmatching für generierte Inhalte konfigurieren", + "settings.contentSettingsHelp": "Sprache und Produktmatching für generierte Inhalte konfigurieren", "settings.mergeProductsHelp": "Wenn aktiv, kombinieren CSV-Importe Zeilen mit demselben GTIN zu einem Produkt. Deaktivieren, um jede Zeile getrennt zu halten.", - "settings.emailIntegrationHelp": "Richten Sie Resend oder SMTP für Einladungen, Kampagnen und Transaktionsmail ein.", + "settings.emailIntegrationHelp": "Richten Sie Resend oder SMTP für Einladungen, Kampagnen und Transaktionsmail ein.", "settings.configureEmail": "E-Mail konfigurieren", - "settings.aiIntegrationsHelp": "Plattform-Credits oder eigener Schlüssel, plus bearbeitbare Prompts für Titel, Beschreibungen, SEO und Kampagnen. Schlüssel ruhend verschlüsselt.", - "settings.openAiIntegrations": "KI-Integrationen öffnen", + "settings.aiIntegrationsHelp": "Plattform-Credits oder eigener Schlüssel, plus bearbeitbare Prompts für Titel, Beschreibungen, SEO und Kampagnen. Schlüssel ruhend verschlüsselt.", + "settings.openAiIntegrations": "KI-Integrationen öffnen", "settings.companyNameRequired": "Geben Sie einen Unternehmensnamen ein.", "settings.companySaved": "Unternehmenseinstellungen gespeichert.", "settings.companyUpdateFailed": "Unternehmen konnte nicht aktualisiert werden", - "settings.mergeOn": "Produkte mit demselben GTIN werden feedübergreifend zusammengeführt.", + "settings.mergeOn": "Produkte mit demselben GTIN werden feedübergreifend zusammengeführt.", "settings.mergeOff": "Produkte mit demselben GTIN bleiben getrennt.", - "settings.mergeUpdateFailed": "Zusammenführungseinstellung konnte nicht aktualisiert werden", - "settings.inAppToastsHelp": "Nur in diesem Browser. Fehler sind standardmäßig an; Abschlüsse sind stumm, um Lärm zu reduzieren. Formularfeedback und Rückgängig werden nie stummgeschaltet.", - "settings.emailAlertsHelp": "E-Mail-Alert-Einstellungen kommen bald. Fehlerbenachrichtigungen standardmäßig an (wie in-app); Abschluss-Mails bleiben aus, außer Sie aktivieren sie.", - "settings.emailAlertsBody": "Konfigurieren Sie Transaktionsmail vorerst unter Unternehmen → E-Mail-Integration. In-App-Alerts oben gelten weiter.", - "settings.apiKeysLegacyNotice": "Legacy-API-Schlüssel wurden nicht migriert. Neuen Schlüssel erstellen — das Geheimnis wird nur einmal angezeigt.", - "settings.apiKeysAdminOnly": "Nur Unternehmens-Admins können API-Schlüssel erstellen oder widerrufen. Vorhandene Präfixe können Sie anzeigen.", - "settings.apiKeysCopyUnavailableNotice": "Kopieren für vorhandene Schlüssel nicht verfügbar — nur Präfix gespeichert. Neuen Schlüssel erstellen, Geheimnis einmal kopieren, alten bei Bedarf widerrufen.", - "settings.apiKeysForbidden": "Sie dürfen API-Schlüssel nicht anzeigen. Bitten Sie einen Unternehmens-Admin um Hilfe.", - "settings.noApiKeys": "Noch keine API-Schlüssel", - "settings.noApiKeysHelpAdmin": "Legacy-API-Schlüssel wurden nicht migriert. Neuen Schlüssel für Descrybe-API (X-API-Key) erstellen. Vollständiges Geheimnis nur einmal sichtbar.", - "settings.noApiKeysHelpMember": "Noch keine API-Schlüssel für dieses Unternehmen. Legacy-Schlüssel nicht migriert — Admin um Erstellung bitten.", - "settings.unnamedKey": "Unbenannter Schlüssel", + "settings.mergeUpdateFailed": "Zusammenführungseinstellung konnte nicht aktualisiert werden", + "settings.inAppToastsHelp": "Nur in diesem Browser. Fehler sind standardmäßig an; Abschlüsse sind stumm, um Lärm zu reduzieren. Formularfeedback und Rückgängig werden nie stummgeschaltet.", + "settings.emailAlertsHelp": "E-Mail-Alert-Einstellungen kommen bald. Fehlerbenachrichtigungen standardmäßig an (wie in-app); Abschluss-Mails bleiben aus, außer Sie aktivieren sie.", + "settings.emailAlertsBody": "Konfigurieren Sie Transaktionsmail vorerst unter Unternehmen → E-Mail-Integration. In-App-Alerts oben gelten weiter.", + "settings.apiKeysLegacyNotice": "Legacy-API-Schlüssel wurden nicht migriert. Neuen Schlüssel erstellen — das Geheimnis wird nur einmal angezeigt.", + "settings.apiKeysAdminOnly": "Nur Unternehmens-Admins können API-Schlüssel erstellen oder widerrufen. Vorhandene Präfixe können Sie anzeigen.", + "settings.apiKeysCopyUnavailableNotice": "Kopieren für vorhandene Schlüssel nicht verfügbar — nur Präfix gespeichert. Neuen Schlüssel erstellen, Geheimnis einmal kopieren, alten bei Bedarf widerrufen.", + "settings.apiKeysForbidden": "Sie dürfen API-Schlüssel nicht anzeigen. Bitten Sie einen Unternehmens-Admin um Hilfe.", + "settings.noApiKeys": "Noch keine API-Schlüssel", + "settings.noApiKeysHelpAdmin": "Legacy-API-Schlüssel wurden nicht migriert. Neuen Schlüssel für Descrybe-API (X-API-Key) erstellen. Vollständiges Geheimnis nur einmal sichtbar.", + "settings.noApiKeysHelpMember": "Noch keine API-Schlüssel für dieses Unternehmen. Legacy-Schlüssel nicht migriert — Admin um Erstellung bitten.", + "settings.unnamedKey": "Unbenannter Schlüssel", "settings.neverUsed": "Nie verwendet", - "settings.apiKeyActions": "API-Schlüssel-Aktionen", - "settings.copyUnavailable": "Kopieren nicht verfügbar", - "settings.copyUnavailableTitle": "Vollständiges Geheimnis wird nur einmal bei Erstellung angezeigt", + "settings.apiKeyActions": "API-Schlüssel-Aktionen", + "settings.copyUnavailable": "Kopieren nicht verfügbar", + "settings.copyUnavailableTitle": "Vollständiges Geheimnis wird nur einmal bei Erstellung angezeigt", "settings.revoke": "Widerrufen", - "settings.apiKeyNameRequired": "Geben Sie einen Namen für diesen API-Schlüssel ein.", - "settings.apiKeyCreatedOnce": "API-Schlüssel erstellt. Jetzt kopieren — wird nicht erneut angezeigt.", - "settings.apiKeyCreated": "API-Schlüssel erstellt.", - "settings.apiKeyCreateFailed": "API-Schlüssel konnte nicht erstellt werden", - "settings.apiKeyRevokeConfirm": "Diesen API-Schlüssel widerrufen? Anfragen damit funktionieren nicht mehr.", - "settings.apiKeyRevoked": "API-Schlüssel widerrufen.", - "settings.apiKeyRevokeFailed": "API-Schlüssel konnte nicht widerrufen werden", - "settings.apiKeyCopied": "API-Schlüssel kopiert.", - "settings.createApiKeyOnceHelp": "Diesen Schlüssel jetzt kopieren — er wird nicht erneut angezeigt. Als Authorization: Bearer oder X-API-Key auf /api/v1 verwenden.", - "settings.createApiKeyNameHelp": "Benennen Sie den Schlüssel zur späteren Unterscheidung. Nach dem Erstellen als Authorization: Bearer (bevorzugt) oder X-API-Key senden.", + "settings.apiKeyNameRequired": "Geben Sie einen Namen für diesen API-Schlüssel ein.", + "settings.apiKeyCreatedOnce": "API-Schlüssel erstellt. Jetzt kopieren — wird nicht erneut angezeigt.", + "settings.apiKeyCreated": "API-Schlüssel erstellt.", + "settings.apiKeyCreateFailed": "API-Schlüssel konnte nicht erstellt werden", + "settings.apiKeyRevokeConfirm": "Diesen API-Schlüssel widerrufen? Anfragen damit funktionieren nicht mehr.", + "settings.apiKeyRevoked": "API-Schlüssel widerrufen.", + "settings.apiKeyRevokeFailed": "API-Schlüssel konnte nicht widerrufen werden", + "settings.apiKeyCopied": "API-Schlüssel kopiert.", + "settings.createApiKeyOnceHelp": "Diesen Schlüssel jetzt kopieren — er wird nicht erneut angezeigt. Als Authorization: Bearer oder X-API-Key auf /api/v1 verwenden.", + "settings.createApiKeyNameHelp": "Benennen Sie den Schlüssel zur späteren Unterscheidung. Nach dem Erstellen als Authorization: Bearer (bevorzugt) oder X-API-Key senden.", "settings.keyNamePlaceholder": "z. B. Production", - "settings.newApiKeyAria": "Neuer API-Schlüssel einmal angezeigt", - "settings.copyApiKeyAria": "API-Schlüssel kopieren", + "settings.newApiKeyAria": "Neuer API-Schlüssel einmal angezeigt", + "settings.copyApiKeyAria": "API-Schlüssel kopieren", "settings.alert.sync_fail.title": "Sync-Fehler", - "settings.alert.sync_fail.description": "Wenn ein Feed-Sync abläuft oder die API einen Fehler zurückgibt.", + "settings.alert.sync_fail.description": "Wenn ein Feed-Sync abläuft oder die API einen Fehler zurückgibt.", "settings.alert.sync_done.title": "Sync abgeschlossen", "settings.alert.sync_done.description": "Wenn ein Feed-Sync erfolgreich endet.", "settings.alert.ai_fail.title": "KI- / Verarbeitungsfehler", - "settings.alert.ai_fail.description": "Wenn Start oder Lauf eines Verarbeitungsjobs fehlschlägt.", + "settings.alert.ai_fail.description": "Wenn Start oder Lauf eines Verarbeitungsjobs fehlschlägt.", "settings.alert.ai_done.title": "KI / Verarbeitung abgeschlossen", - "settings.alert.ai_done.description": "Wenn ein Hintergrund-Job erfolgreich endet. Start-Toasts bleiben immer an, damit Rückgängig verfügbar bleibt.", + "settings.alert.ai_done.description": "Wenn ein Hintergrund-Job erfolgreich endet. Start-Toasts bleiben immer an, damit Rückgängig verfügbar bleibt.", "settings.alert.export_fail.title": "Exportfehler", - "settings.alert.export_fail.description": "Wenn ein Produkt- oder Export-Feed-Export fehlschlägt.", + "settings.alert.export_fail.description": "Wenn ein Produkt- oder Export-Feed-Export fehlschlägt.", "settings.alert.export_done.title": "Export abgeschlossen", "settings.alert.export_done.description": "Wenn ein Export erfolgreich endet.", "settings.alert.support_reply.title": "Antworten des Support-Personals", "settings.alert.support_reply.description": "Wenn ein Plattform-Agent auf Ihr Support-Ticket antwortet.", - "settings.alert.support_status.title": "Support-Statusänderungen", - "settings.alert.support_status.description": "Wenn ein Support-Ticket auf ausstehend oder gelöst wechselt.", + "settings.alert.support_status.title": "Support-Statusänderungen", + "settings.alert.support_status.description": "Wenn ein Support-Ticket auf ausstehend oder gelöst wechselt.", "empty.forbidden.title.company": "Berechtigung verweigert", - "empty.forbidden.title.platform": "Zugriff eingeschränkt", - "empty.forbidden.message.company": "Sie haben dafür keine Berechtigung. Bitten Sie einen Unternehmens-Admin um Hilfe.", - "empty.forbidden.message.platform": "Dieser Bereich ist nur für Plattform-Admins verfügbar.", - "empty.forbidden.message.support": "Dieser Bereich ist nur für Support-Mitarbeiter und Plattform-Admins verfügbar.", - "empty.forbidden.backDashboard": "Zurück zum Dashboard", - "empty.forbidden.apiKeys": "Sie dürfen API-Schlüssel nicht anzeigen. Bitten Sie einen Unternehmens-Admin um Hilfe.", - "empty.forbidden.ai": "Sie dürfen KI-Anbietereinstellungen nicht anzeigen. Bitten Sie einen Unternehmens-Admin um Hilfe.", - "empty.forbidden.email": "Sie dürfen E-Mail-Anbietereinstellungen nicht anzeigen. Bitten Sie einen Unternehmens-Admin um Hilfe.", - "confirm.defaultTitle": "Löschen bestätigen", + "empty.forbidden.title.platform": "Zugriff eingeschränkt", + "empty.forbidden.message.company": "Sie haben dafür keine Berechtigung. Bitten Sie einen Unternehmens-Admin um Hilfe.", + "empty.forbidden.message.platform": "Dieser Bereich ist nur für Plattform-Admins verfügbar.", + "empty.forbidden.message.support": "Dieser Bereich ist nur für Support-Mitarbeiter und Plattform-Admins verfügbar.", + "empty.forbidden.backDashboard": "Zurück zum Dashboard", + "empty.forbidden.apiKeys": "Sie dürfen API-Schlüssel nicht anzeigen. Bitten Sie einen Unternehmens-Admin um Hilfe.", + "empty.forbidden.ai": "Sie dürfen KI-Anbietereinstellungen nicht anzeigen. Bitten Sie einen Unternehmens-Admin um Hilfe.", + "empty.forbidden.email": "Sie dürfen E-Mail-Anbietereinstellungen nicht anzeigen. Bitten Sie einen Unternehmens-Admin um Hilfe.", + "confirm.defaultTitle": "Löschen bestätigen", "confirm.defaultDescription": "Sind Sie sicher?", - "confirm.defaultConfirm": "Bestätigen", - "confirm.deleteFeed": "Feed „{name}“ löschen? Das kann nicht rückgängig gemacht werden.", - "confirm.deleteCampaign": "Kampagne „{name}“ löschen? Das kann nicht rückgängig gemacht werden.", - "confirm.deleteExportFeed": "Möchten Sie diesen Export-Feed wirklich löschen?", + "confirm.defaultConfirm": "Bestätigen", + "confirm.deleteFeed": "Feed „{name}“ löschen? Das kann nicht rückgängig gemacht werden.", + "confirm.deleteCampaign": "Kampagne „{name}“ löschen? Das kann nicht rückgängig gemacht werden.", + "confirm.deleteExportFeed": "Möchten Sie diesen Export-Feed wirklich löschen?", "confirm.rotateExportToken": "Feed-URL-Token rotieren? Die alte oeffentliche URL funktioniert sofort nicht mehr.", - "confirm.deleteUpload": "„{name}“ löschen? Damit wird der Upload-Datensatz entfernt (und der lokale Blob, falls vorhanden).", - "confirm.revokeApiKey": "Diesen API-Schlüssel widerrufen? Anfragen damit funktionieren nicht mehr.", - "confirm.deleteKnowledgeArticle": "Diesen Wissensartikel löschen?", - "confirm.deleteReplyTemplate": "Diese Antwortvorlage löschen?", - "confirm.deleteStructuredField": "Möchten Sie dieses Feld wirklich löschen? Das kann nicht rückgängig gemacht werden.", - "toast.campaign.pickAudience": "Wählen Sie mindestens eine Kategorie oder ein Produkt", - "toast.campaign.pickCategories": "Wählen Sie Zielgruppen-Kategorien für diesen Filter", - "toast.campaign.completeStep": "Schließen Sie diesen Schritt ab, um fortzufahren", + "confirm.deleteUpload": "„{name}“ löschen? Damit wird der Upload-Datensatz entfernt (und der lokale Blob, falls vorhanden).", + "confirm.revokeApiKey": "Diesen API-Schlüssel widerrufen? Anfragen damit funktionieren nicht mehr.", + "confirm.deleteKnowledgeArticle": "Diesen Wissensartikel löschen?", + "confirm.deleteReplyTemplate": "Diese Antwortvorlage löschen?", + "confirm.deleteStructuredField": "Möchten Sie dieses Feld wirklich löschen? Das kann nicht rückgängig gemacht werden.", + "toast.campaign.pickAudience": "Wählen Sie mindestens eine Kategorie oder ein Produkt", + "toast.campaign.pickCategories": "Wählen Sie Zielgruppen-Kategorien für diesen Filter", + "toast.campaign.completeStep": "Schließen Sie diesen Schritt ab, um fortzufahren", "toast.campaign.aiDraft": "KI-Entwurf erzeugt", "toast.campaign.templatePreview": "Vorlagenvorschau bereit", "toast.campaign.generateFirst": "Zuerst eine Vorschau erzeugen", "toast.campaign.testSent": "Test-E-Mail an {email} gesendet", "toast.campaign.scheduled": "Kampagne geplant", "toast.campaign.draftSaved": "Entwurf gespeichert", - "toast.campaign.deleted": "Kampagne gelöscht", + "toast.campaign.deleted": "Kampagne gelöscht", "toast.campaign.prepared": "Kampagne vorbereitet", "toast.campaign.alreadyReady": "Kampagne ist bereits bereit", "toast.campaign.prepareFailed": "Kampagne konnte nicht vorbereitet werden", - "toast.campaign.deleteFailed": "Kampagne konnte nicht gelöscht werden", + "toast.campaign.deleteFailed": "Kampagne konnte nicht gelöscht werden", "toast.feed.copyFailed": "URL konnte nicht kopiert werden", "toast.feed.created": "Feed erstellt", "toast.feed.updated": "Feed aktualisiert.", "toast.feed.mapBeforeSync": "Ordnen Sie Felder zu, bevor Sie diesen Feed synchronisieren.", "toast.feed.activateBeforeSync": "Aktivieren Sie den Feed vor dem Synchronisieren.", "toast.feed.syncFinished": "Sync abgeschlossen", - "toast.feed.deleted": "Feed gelöscht.", - "toast.feed.mappingLoadFailed": "Feldzuordnungen konnten nicht geladen werden. Öffnen Sie das Mapping vor dem Sync.", + "toast.feed.deleted": "Feed gelöscht.", + "toast.feed.mappingLoadFailed": "Feldzuordnungen konnten nicht geladen werden. Öffnen Sie das Mapping vor dem Sync.", "toast.feed.syncFailed": "Sync fehlgeschlagen", "toast.feed.statusFailed": "Status konnte nicht aktualisiert werden", - "toast.feed.deleteFailed": "Feed konnte nicht gelöscht werden", + "toast.feed.deleteFailed": "Feed konnte nicht gelöscht werden", "toast.feed.beforeSampling": "Vor dem Sampling", "toast.processing.jobCompleted": "Verarbeitung abgeschlossen", "toast.processing.jobFailed": "Verarbeitung fehlgeschlagen", "toast.products.startFailed": "Verarbeitung konnte nicht gestartet werden", "toast.products.jobStarted": "Verarbeitungsjob gestartet", - "toast.products.acceptUndone": "Übernahme rückgängig", - "toast.products.resetComplete": "Zurücksetzen abgeschlossen", - "toast.products.nameAcceptUndone": "Namensakzeptanz rückgängig gemacht", - "toast.products.descAcceptUndone": "Beschreibungsakzeptanz rückgängig gemacht", + "toast.products.acceptUndone": "Übernahme rückgängig", + "toast.products.resetComplete": "Zurücksetzen abgeschlossen", + "toast.products.nameAcceptUndone": "Namensakzeptanz rückgängig gemacht", + "toast.products.descAcceptUndone": "Beschreibungsakzeptanz rückgängig gemacht", "toast.products.cancelOne": "Verarbeitung abgebrochen", "toast.products.cancelMany": "Verarbeitungsjobs abgebrochen", "toast.products.startJobFailed": "Verarbeitungsjob konnte nicht gestartet werden", "toast.products.acceptFailed": "Anreicherung konnte nicht akzeptiert werden", "toast.products.updateFailed": "Produkt konnte nicht aktualisiert werden", - "toast.products.undoAcceptFailed": "Akzeptieren konnte nicht rückgängig gemacht werden", - "toast.products.undoFieldAcceptFailed": "Feldakzeptanz konnte nicht rückgängig gemacht werden", - "toast.products.undoFieldDiscardFailed": "Feldverwerfen konnte nicht rückgängig gemacht werden", + "toast.products.undoAcceptFailed": "Akzeptieren konnte nicht rückgängig gemacht werden", + "toast.products.undoFieldAcceptFailed": "Feldakzeptanz konnte nicht rückgängig gemacht werden", + "toast.products.undoFieldDiscardFailed": "Feldverwerfen konnte nicht rückgängig gemacht werden", "toast.products.rejectFailed": "Anreicherung konnte nicht abgelehnt werden", - "toast.products.exportFailed": "Ausgewählte Produkte konnten nicht exportiert werden", - "toast.products.resetFailed": "Produkte konnten nicht zurückgesetzt werden", + "toast.products.exportFailed": "Ausgewählte Produkte konnten nicht exportiert werden", + "toast.products.resetFailed": "Produkte konnten nicht zurückgesetzt werden", "toast.products.cancelFailed": "Verarbeitungsjob konnte nicht abgebrochen werden", "toast.support.ticketCreated": "Ticket erstellt", "toast.support.replySent": "Antwort gesendet", - "toast.support.thanksFeedback": "Danke für Ihr Feedback", + "toast.support.thanksFeedback": "Danke für Ihr Feedback", "toast.support.createFailed": "Ticket konnte nicht erstellt werden", - "toast.support.unavailable": "Support nicht verfügbar", + "toast.support.unavailable": "Support nicht verfügbar", "toast.support.loadFailed": "Support-Tickets konnten nicht geladen werden", "toast.support.loadTicketFailed": "Ticket konnte nicht geladen werden", "toast.support.replyFailed": "Antwort konnte nicht gesendet werden", - "toast.support.ratingUnavailable": "Bewertung nicht verfügbar", + "toast.support.ratingUnavailable": "Bewertung nicht verfügbar", "toast.support.alreadyRated": "Bereits bewertet", - "toast.support.ratingFailed": "Bewertung konnte nicht übermittelt werden", - "toast.structured.fieldAdded": "Feld hinzugefügt", - "toast.structured.fieldAddedBody": "Das Feld für strukturierte Beschreibungen wurde hinzugefügt.", - "toast.structured.fieldDeleted": "Feld gelöscht", - "toast.structured.fieldDeletedBody": "Das Feld für strukturierte Beschreibungen wurde gelöscht.", - "toast.structured.addFailed": "Feld konnte nicht hinzugefügt werden", - "toast.structured.deleteFailed": "Feld konnte nicht gelöscht werden", + "toast.support.ratingFailed": "Bewertung konnte nicht übermittelt werden", + "toast.structured.fieldAdded": "Feld hinzugefügt", + "toast.structured.fieldAddedBody": "Das Feld für strukturierte Beschreibungen wurde hinzugefügt.", + "toast.structured.fieldDeleted": "Feld gelöscht", + "toast.structured.fieldDeletedBody": "Das Feld für strukturierte Beschreibungen wurde gelöscht.", + "toast.structured.addFailed": "Feld konnte nicht hinzugefügt werden", + "toast.structured.deleteFailed": "Feld konnte nicht gelöscht werden", "toast.brand.saved": "Marken-Kit gespeichert", "toast.brand.logoUploaded": "Logo hochgeladen", "toast.brand.saveFailed": "Marken-Kit konnte nicht gespeichert werden", @@ -2205,152 +2205,153 @@ export const de: MessageDict = { "toast.attrs.createFailed": "Erstellen fehlgeschlagen", "toast.attrs.importFailed": "Import fehlgeschlagen", "toast.attrs.updateFailed": "Aktualisierung fehlgeschlagen", - "toast.attrs.deleteFailed": "Löschen fehlgeschlagen", + "toast.attrs.deleteFailed": "Löschen fehlgeschlagen", "toast.switcher.loadUsersFailed": "Umschaltbare Benutzer konnten nicht geladen werden", "toast.switcher.switchFailed": "Benutzerwechsel fehlgeschlagen", - "toast.switcher.returnFailed": "Rückkehr zum ursprünglichen Benutzer fehlgeschlagen", + "toast.switcher.returnFailed": "Rückkehr zum ursprünglichen Benutzer fehlgeschlagen", "toast.switcher.companyFailed": "Unternehmenswechsel fehlgeschlagen", "toast.requestFailed": "Anfrage fehlgeschlagen", - "flash.campaign.unavailableDraft": "Kampagnen sind derzeit nicht verfügbar. Entwürfe können nicht gespeichert werden, bis die Funktion live ist.", + "flash.campaign.unavailableDraft": "Kampagnen sind derzeit nicht verfügbar. Entwürfe können nicht gespeichert werden, bis die Funktion live ist.", "flash.campaign.testEmailRequired": "Geben Sie eine Test-E-Mail-Adresse ein", - "flash.campaign.scheduleRequired": "Wählen Sie Datum und Uhrzeit", - "flash.campaign.unavailable": "Kampagnen sind derzeit nicht verfügbar.", + "flash.campaign.scheduleRequired": "Wählen Sie Datum und Uhrzeit", + "flash.campaign.unavailable": "Kampagnen sind derzeit nicht verfügbar.", "flash.campaign.generateFailed": "Generierung fehlgeschlagen", "flash.campaign.testFailed": "Testversand fehlgeschlagen", "flash.campaign.scheduleFailed": "Planung fehlgeschlagen", "flash.campaign.saveFailed": "Speichern fehlgeschlagen", "flash.feed.copyFailed": "URL konnte nicht kopiert werden", - "flash.feed.csvRequired": "Bitte wählen Sie eine .csv-Datei.", - "flash.feed.csvFileRequired": "Bitte wählen Sie eine CSV-Datei.", + "flash.feed.csvRequired": "Bitte wählen Sie eine .csv-Datei.", + "flash.feed.csvFileRequired": "Bitte wählen Sie eine CSV-Datei.", "flash.feed.urlRequired": "Feed-URL ist erforderlich.", "flash.feed.updated": "Feed aktualisiert.", - "flash.feed.syncFinishedNamed": "Sync für „{name}“ abgeschlossen ({status}: {products}).", - "flash.feed.deleted": "Feed gelöscht.", + "flash.feed.syncFinishedNamed": "Sync für „{name}“ abgeschlossen ({status}: {products}).", + "flash.feed.deleted": "Feed gelöscht.", "flash.feed.createFailed": "Feed konnte nicht erstellt werden", "flash.feed.updateFailed": "Feed konnte nicht aktualisiert werden", "flash.settings.companyNameRequired": "Geben Sie einen Unternehmensnamen ein.", "flash.settings.companySaved": "Unternehmenseinstellungen gespeichert.", "flash.settings.companyFailed": "Unternehmen konnte nicht aktualisiert werden", - "flash.settings.mergeFailed": "Zusammenführungseinstellung konnte nicht aktualisiert werden", - "flash.settings.apiKeyNameRequired": "Geben Sie einen Namen für diesen API-Schlüssel ein.", - "flash.settings.apiKeyCreatedFailed": "API-Schlüssel konnte nicht erstellt werden", - "flash.settings.apiKeyRevoked": "API-Schlüssel widerrufen.", - "flash.settings.apiKeyRevokeFailed": "API-Schlüssel konnte nicht widerrufen werden", + "flash.settings.mergeFailed": "Zusammenführungseinstellung konnte nicht aktualisiert werden", + "flash.settings.apiKeyNameRequired": "Geben Sie einen Namen für diesen API-Schlüssel ein.", + "flash.settings.apiKeyCreatedFailed": "API-Schlüssel konnte nicht erstellt werden", + "flash.settings.apiKeyRevoked": "API-Schlüssel widerrufen.", + "flash.settings.apiKeyRevokeFailed": "API-Schlüssel konnte nicht widerrufen werden", "flash.settings.copyFailed": "Kopieren fehlgeschlagen. Markieren Sie den Text und kopieren Sie manuell.", - "flash.products.accepted": "{count} Produkt(e) akzeptiert — nach Verarbeitet verschoben.", + "flash.products.accepted": "{count} Produkt(e) akzeptiert — nach Verarbeitet verschoben.", "flash.products.updated": "Produkt aktualisiert.", - "flash.products.enrichmentAccepted": "Anreicherung akzeptiert — nach Verarbeitet verschoben.", - "flash.products.originalEmpty": "Originalwert ist leer; Anreicherung kann per PATCH nicht gelöscht werden.", - "flash.products.selectExport": "Wählen Sie mindestens ein Produkt zum Exportieren.", - "flash.products.exported": "{count} Produkt(e) über Export-Feed exportiert.", + "flash.products.enrichmentAccepted": "Anreicherung akzeptiert — nach Verarbeitet verschoben.", + "flash.products.originalEmpty": "Originalwert ist leer; Anreicherung kann per PATCH nicht gelöscht werden.", + "flash.products.selectExport": "Wählen Sie mindestens ein Produkt zum Exportieren.", + "flash.products.exported": "{count} Produkt(e) über Export-Feed exportiert.", "flash.support.missingId": "Ticket-ID fehlt", "flash.support.notFound": "Ticket nicht gefunden", - "flash.support.unavailable": "Support ist vorübergehend nicht verfügbar.", - "flash.support.ratingUnavailable": "Bewertung ist vorübergehend nicht verfügbar. Bitte später erneut versuchen.", + "flash.support.unavailable": "Support ist vorübergehend nicht verfügbar.", + "flash.support.ratingUnavailable": "Bewertung ist vorübergehend nicht verfügbar. Bitte später erneut versuchen.", "flash.support.alreadyRated": "Sie haben dieses Ticket bereits bewertet.", - "flash.support.queueUnavailable": "Die Support-Warteschlange ist in dieser Bereitstellung nicht verfügbar.", - "flash.support.deploymentUnavailable": "Support ist auf diesem Deployment nicht verfügbar.", + "flash.support.queueUnavailable": "Die Support-Warteschlange ist in dieser Bereitstellung nicht verfügbar.", + "flash.support.deploymentUnavailable": "Support ist auf diesem Deployment nicht verfügbar.", "flash.support.replyRequired": "Antworttext ist erforderlich.", "flash.support.draftRequired": "Entwurftext ist vor der Freigabe erforderlich.", - "flash.support.claimed": "Ticket übernommen.", + "flash.support.claimed": "Ticket übernommen.", "flash.support.unassigned": "Ticket nicht zugewiesen.", - "flash.support.assigneeCleared": "Zuständigkeit gelöscht.", - "flash.support.assigneeUpdated": "Zuständigkeit aktualisiert.", + "flash.support.assigneeCleared": "Zuständigkeit gelöscht.", + "flash.support.assigneeUpdated": "Zuständigkeit aktualisiert.", "flash.support.draftApproved": "KI-Entwurf freigegeben und an den Kunden gesendet.", "flash.support.draftSent": "Entwurf als Mitarbeiterantwort gesendet.", - "flash.support.draftDiscarded": "KI-Entwurf verworfen. Ticket an die menschliche Warteschlange übergeben.", + "flash.support.draftDiscarded": "KI-Entwurf verworfen. Ticket an die menschliche Warteschlange übergeben.", "flash.support.autoReplyDisabled": "Auto-Antwort deaktiviert (Entwurf als interne Notiz belassen).", - "flash.structured.keyRequired": "Feldschlüssel ist erforderlich", + "flash.structured.keyRequired": "Feldschlüssel ist erforderlich", "flash.category.nameRequired": "Name und eindeutige ID sind erforderlich.", "flash.category.textEmpty": "Text darf nicht leer sein", - "flash.export.noConfigs": "Noch keine Export-Feeds. Erstellen Sie einen unter Export Feeds und kehren Sie zurück, um Ihre Auswahl zu exportieren.", - "flash.export.selectFormat": "Bitte wählen Sie einen Export-Feed.", - "flash.files.deleted": "Upload gelöscht.", - "flash.mapping.noSuggestions": "Keine Vorschläge — Quellfeldnamen prüfen.", - "flash.mapping.allMapped": "Alle Vorschläge sind bereits zugeordnet. Prüfen Sie die Konfidenz-Chips in der Tabelle.", - "flash.mapping.extractFirst": "Keine Vorschläge — zuerst Schema extrahieren.", + "flash.export.noConfigs": "Noch keine Export-Feeds. Erstellen Sie einen unter Export Feeds und kehren Sie zurück, um Ihre Auswahl zu exportieren.", + "flash.export.selectFormat": "Bitte wählen Sie einen Export-Feed.", + "flash.files.deleted": "Upload gelöscht.", + "flash.mapping.noSuggestions": "Keine Vorschläge — Quellfeldnamen prüfen.", + "flash.mapping.allMapped": "Alle Vorschläge sind bereits zugeordnet. Prüfen Sie die Konfidenz-Chips in der Tabelle.", + "flash.mapping.extractFirst": "Keine Vorschläge — zuerst Schema extrahieren.", "flash.mapping.pathRequired": "Geben Sie vor dem Mapping einen Produkt-Elementpfad ein.", - "flash.billing.checkoutCanceled": "Checkout wurde abgebrochen. Es wurden keine Änderungen vorgenommen.", - "flash.billing.portalReturn": "Zurück vom Abrechnungsportal. Verwalten Sie Ihren Plan hier oder unter Plans.", - "flash.billing.invalidAmount": "Bitte geben Sie einen gültigen Credit-Betrag ein.", + "flash.billing.checkoutCanceled": "Checkout wurde abgebrochen. Es wurden keine Änderungen vorgenommen.", + "flash.billing.portalReturn": "Zurück vom Abrechnungsportal. Verwalten Sie Ihren Plan hier oder unter Plans.", + "flash.billing.invalidAmount": "Bitte geben Sie einen gültigen Credit-Betrag ein.", "flash.billing.companyNotFound": "Unternehmen nicht gefunden.", - "flash.billing.creditsAdded": "{amount} Credits wurden hinzugefügt.", + "flash.billing.creditsAdded": "{amount} Credits wurden hinzugefügt.", "flash.unsubscribe.missingToken": "Abmelde-Token fehlt.", "flash.unsubscribe.loadFailed": "Abmeldestatus konnte nicht geladen werden.", "flash.unsubscribe.failed": "Abmeldung fehlgeschlagen.", - "flash.seo.filledMeta": "Meta für „{label}“ ausgefüllt ({mode}).", + "flash.seo.filledMeta": "Meta für „{label}“ ausgefüllt ({mode}).", "flash.shopify.saved": "Shopify-Einstellungen gespeichert.", "flash.woo.saved": "WooCommerce-Einstellungen gespeichert.", "flash.woo.syncSaved": "Sync-Einstellungen gespeichert.", "flash.woo.autoCategories": "{count} Kategorien automatisch zugeordnet.", "flash.woo.autoAttributes": "{count} Attribute automatisch zugeordnet.", - "flash.ai.promptsSaved": "Prompt-Vorlagen gespeichert. Sie gelten für den nächsten KI-Lauf.", + "flash.ai.promptsSaved": "Prompt-Vorlagen gespeichert. Sie gelten für den nächsten KI-Lauf.", "flash.ai.promptRestored": "Integrierten Standard-Prompt wiederhergestellt.", "flash.ai.connectionOk": "Verbindung OK ({detail}).", - "flash.ai.connectionByok": ", Ihr eigener Schlüssel", + "flash.ai.connectionByok": ", Ihr eigener Schlüssel", "flash.email.saved": "E-Mail-Anbieter gespeichert. Domain verifizieren, dann Test senden.", - "flash.email.testDryRun": "Test im Dry-Run protokolliert — es wurde keine E-Mail gesendet.", + "flash.email.testDryRun": "Test im Dry-Run protokolliert — es wurde keine E-Mail gesendet.", "flash.email.testSent": "Test-E-Mail gesendet. Die From-Adresse wird bei erfolgreicher Zustellung als verifiziert markiert.", - "flash.fields.apiUnavailable": "Die Standardfelder-API ist nicht verfügbar. Änderungen können nicht gespeichert werden.", + "flash.fields.apiUnavailable": "Die Standardfelder-API ist nicht verfügbar. Änderungen können nicht gespeichert werden.", "flash.fields.updated": "Feld erfolgreich aktualisiert", "flash.fields.created": "Feld erfolgreich erstellt", "flash.fields.enabledRecommended": "Empfohlene E-Commerce-Felder aktiviert", - "flash.fields.deleted": "Feld erfolgreich gelöscht", + "flash.fields.deleted": "Feld erfolgreich gelöscht", "flash.fields.groupUpdated": "Gruppe erfolgreich aktualisiert", "flash.fields.groupCreated": "Gruppe erfolgreich erstellt", - "flash.fields.groupDeleted": "Gruppe erfolgreich gelöscht", - "flash.processing.cancelled": "„{name}“ wurde abgebrochen.", - "flash.processing.retried": "„{name}“ zur Wiederholung eingereiht.", - "flash.admin.staffRoleUpdated": "Mitarbeiterrolle für {email} aktualisiert.", - "flash.admin.staffRoleUnavailable": "Mitarbeiterrollen-Updates sind auf diesem Server noch nicht verfügbar.", + "flash.fields.groupDeleted": "Gruppe erfolgreich gelöscht", + "flash.processing.cancelled": "„{name}“ wurde abgebrochen.", + "flash.processing.retried": "„{name}“ zur Wiederholung eingereiht.", + "flash.admin.staffRoleUpdated": "Mitarbeiterrolle für {email} aktualisiert.", + "flash.admin.staffRoleUnavailable": "Mitarbeiterrollen-Updates sind auf diesem Server noch nicht verfügbar.", "flash.admin.planAssigned": "Plan {name} zugewiesen.", - "flash.admin.catalogCloned": "{source} nach {dest} kopiert: {products} Produkte, {categories} Kategorien.", - "flash.admin.fixA1Success": "Katalogreparatur für {name} abgeschlossen: {prompts} Prompts aktualisiert, {hashes} Hashes gelöscht, {categories} Kategorien nachgefüllt.", - "flash.admin.fixA1Error": "Katalogreparatur für {name} fehlgeschlagen.", + "flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.", + "flash.admin.fixA1Success": "Catalog repair finished for {name}: {prompts} prompts, {hashes} hashes, {categories} processed←mapped, {mapped_backfilled} mapped←processed. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).", + "flash.admin.fixA1Error": "Katalogreparatur für {name} fehlgeschlagen.", + "flash.admin.cloneDestMissing": "No sandbox destination. Switch to Platform Demo (staff home), then clone again.", "flash.admin.planAssignedShort": "Plan zugewiesen.", "flash.admin.creditsUpdated": "Credits aktualisiert.", "flash.admin.cyclesProcessed": "Abrechnungszyklen verarbeitet: {count}", "flash.admin.invitesSummary": "Passwort-Einladungen: {parts}. E-Mail-Zustellung: {smtp}.", "flash.admin.smtpOn": "an", "flash.admin.smtpOff": "aus", - "flash.admin.localPasswordSet": "Lokales Passwort für {email} gesetzt.", - "flash.admin.localPasswordUnavailable": "Lokale Passwort-Tools sind in dieser Umgebung nicht verfügbar.", - "flash.admin.switchedUser": "Benutzer gewechselt. Wird neu geladen…", - "flash.admin.switchUnavailable": "Benutzerwechsel ist in dieser Umgebung nicht verfügbar.", + "flash.admin.localPasswordSet": "Lokales Passwort für {email} gesetzt.", + "flash.admin.localPasswordUnavailable": "Lokale Passwort-Tools sind in dieser Umgebung nicht verfügbar.", + "flash.admin.switchedUser": "Benutzer gewechselt. Wird neu geladen…", + "flash.admin.switchUnavailable": "Benutzerwechsel ist in dieser Umgebung nicht verfügbar.", "flash.admin.diagnosticsRateLimit": "Diagnose-Limit erreicht (20/min). Eine Minute warten und aktualisieren.", - "flash.admin.smtpSaved": "Plattform-SMTP-Einstellungen gespeichert. Passwörter bleiben verborgen.", - "flash.admin.integrationSaved": "Integrationseinstellungen gespeichert. Geheimfelder werden nie wieder vollständig angezeigt.", - "flash.admin.aiSaved": "{label}-KI-Einstellungen gespeichert. API-Schlüssel werden nicht erneut angezeigt.", - "flash.admin.cleanup": "Bereinigung: {jobs} Jobs fehlgeschlagen, {products} Produkte zurückgesetzt.", - "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", + "flash.admin.smtpSaved": "Plattform-SMTP-Einstellungen gespeichert. Passwörter bleiben verborgen.", + "flash.admin.integrationSaved": "Integrationseinstellungen gespeichert. Geheimfelder werden nie wieder vollständig angezeigt.", + "flash.admin.aiSaved": "{label}-KI-Einstellungen gespeichert. API-Schlüssel werden nicht erneut angezeigt.", + "flash.admin.cleanup": "Bereinigung: {jobs} Jobs fehlgeschlagen, {products} Produkte zurückgesetzt.", + "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", "flash.admin.orphanDeleted": "Deleted {deleted} orphan row(s). Remaining: {remaining}.", "flash.admin.articleUpdated": "Artikel aktualisiert.", "flash.admin.articleCreated": "Artikel erstellt.", "flash.admin.templateUpdated": "Vorlage aktualisiert.", "flash.admin.templateCreated": "Vorlage erstellt.", - "flash.admin.articleDeleted": "Artikel gelöscht.", - "flash.admin.templateDeleted": "Vorlage gelöscht.", + "flash.admin.articleDeleted": "Artikel gelöscht.", + "flash.admin.templateDeleted": "Vorlage gelöscht.", "flash.admin.autoReplySaved": "Auto-Antwort-Einstellungen gespeichert.", - "flash.admin.imageUploaded": "Bild hochgeladen und in Markdown eingefügt.", - "flash.admin.translationsSaved": "{count} Zeichenkette(n) für {locale} gespeichert. Committen Sie das Message-Pack, wenn bereit.", + "flash.admin.imageUploaded": "Bild hochgeladen und in Markdown eingefügt.", + "flash.admin.translationsSaved": "{count} Zeichenkette(n) für {locale} gespeichert. Committen Sie das Message-Pack, wenn bereit.", "flash.admin.featuresUpdated": "{key} aktualisiert.", - "flash.admin.featuresAllOn": "Alle Funktionen für diesen Plan aktiviert.", - "flash.admin.featuresAllOff": "Alle Funktionen für diesen Plan deaktiviert.", + "flash.admin.featuresAllOn": "Alle Funktionen für diesen Plan aktiviert.", + "flash.admin.featuresAllOff": "Alle Funktionen für diesen Plan deaktiviert.", "flash.admin.profileApplied": "Profil {label} auf {name} angewendet.", - "flash.admin.overridesCleared": "Overrides gelöscht — Plan-Name-Standardwerte werden verwendet.", - "empty.plans.none": "Keine Pläne gefunden.", + "flash.admin.overridesCleared": "Overrides gelöscht — Plan-Name-Standardwerte werden verwendet.", + "empty.plans.none": "Keine Pläne gefunden.", "empty.plans.noMatch": "Kein Plan entspricht diesem Filter.", - "empty.plans.selectPackage": "Wählen Sie ein Paket, um Funktionen zu bearbeiten.", + "empty.plans.selectPackage": "Wählen Sie ein Paket, um Funktionen zu bearbeiten.", "empty.products.processingTitle": "Keine Produkte in Verarbeitung", - "empty.products.processingMessageCan": "Live-Fortschritt finden Sie unter Verarbeitung. Öffnen Sie dort einen laufenden Job für den Schrittstatus; dieses Tab listet laufende Produkte, sobald Job-Item-Filter verfügbar sind.", + "empty.products.processingMessageCan": "Live-Fortschritt finden Sie unter Verarbeitung. Öffnen Sie dort einen laufenden Job für den Schrittstatus; dieses Tab listet laufende Produkte, sobald Job-Item-Filter verfügbar sind.", "empty.products.processingMessageCannot": "Produkte in einem Job erscheinen hier, sobald die Verarbeitung im Katalog gestartet wurde.", - "empty.products.reviewTitle": "Keine Produkte zur Prüfung", - "empty.products.reviewMessage": "Nach einem Job landen angereicherte Produkte hier. Öffnen Sie eine Zeile zum Vergleichen, dann Übernehmen, bearbeiten oder Ablehnen.", + "empty.products.reviewTitle": "Keine Produkte zur Prüfung", + "empty.products.reviewMessage": "Nach einem Job landen angereicherte Produkte hier. Öffnen Sie eine Zeile zum Vergleichen, dann Übernehmen, bearbeiten oder Ablehnen.", "empty.products.errorTitle": "Keine Produkte mit Fehlern", - "empty.products.errorMessage": "Wenn ein Job für ein Produkt fehlschlägt, erscheint es hier zum erneuten Versuch.", + "empty.products.errorMessage": "Wenn ein Job für ein Produkt fehlschlägt, erscheint es hier zum erneuten Versuch.", "empty.products.filterTitleUnprocessed": "Keine unverarbeiteten Treffer", - "empty.products.filterTitle": "Keine Produkte stimmen überein", - "empty.products.filterMessage": "Andere Suche, Kategorie oder Feed versuchen — oder Filter leeren, um alles zu sehen.", + "empty.products.filterTitle": "Keine Produkte stimmen überein", + "empty.products.filterMessage": "Andere Suche, Kategorie oder Feed versuchen — oder Filter leeren, um alles zu sehen.", "empty.products.unprocessedTitle": "Noch keine unverarbeiteten Produkte", "empty.products.unprocessedMessage": "Verbinden Sie einen Lieferanten-Feed oder laden Sie eine CSV hoch, um Produkte zu importieren.", "empty.products.noneTitle": "Noch keine Produkte", @@ -2358,24 +2359,24 @@ export const de: MessageDict = { "empty.products.noneMessage": "Aus Feed importieren oder CSV hochladen, dann einen Auftrag starten.", "empty.products.viewJobs": "Jobs anzeigen", "empty.products.startJob": "Auftrag starten", - "empty.products.clearFilters": "Filter löschen", + "empty.products.clearFilters": "Filter löschen", "empty.products.viewProcessed": "Verarbeitete anzeigen", "empty.products.retryCatalog": "Aus Katalog erneut versuchen", "empty.products.connectFeed": "Feed verbinden", - "empty.products.addProduct": "Produkt hinzufügen", + "empty.products.addProduct": "Produkt hinzufügen", "empty.products.uploadCsv": "CSV hochladen", "empty.feeds.noneTitle": "Noch keine Produkt-Feeds", - "empty.feeds.noneMessage": "Verbinden Sie eine Lieferanten-CSV/XML-URL oder laden Sie eine Datei hoch. Als Nächstes: Map → Sync → Process.", + "empty.feeds.noneMessage": "Verbinden Sie eine Lieferanten-CSV/XML-URL oder laden Sie eine Datei hoch. Als Nächstes: Map → Sync → Process.", "empty.feeds.noMatchTitle": "Keine passenden Feeds", "empty.feeds.noMatchMessage": "Versuchen Sie einen anderen Suchbegriff oder leeren Sie die Suche, um alle Feeds zu sehen.", "empty.export.loadFailedTitle": "Export-Feeds konnten nicht geladen werden", - "empty.export.loadFailedMessage": "Beim Laden Ihrer Exporte ist etwas schiefgelaufen. Erneut versuchen oder den Fehler oben für Details prüfen.", + "empty.export.loadFailedMessage": "Beim Laden Ihrer Exporte ist etwas schiefgelaufen. Erneut versuchen oder den Fehler oben für Details prüfen.", "empty.export.noneTitle": "Noch keine Export-Feeds", - "empty.export.noneMessage": "Erstellen Sie einen Google-Shopping-, Meta- oder eigenen CSV/XML-Feed, um festzulegen, welche Produkte und Felder ausgegeben werden. Öffentliche URL für Merchant Center oder Partner erzeugen — oder eine Auswahl unter Produkte exportieren.", + "empty.export.noneMessage": "Erstellen Sie einen Google-Shopping-, Meta- oder eigenen CSV/XML-Feed, um festzulegen, welche Produkte und Felder ausgegeben werden. Öffentliche URL für Merchant Center oder Partner erzeugen — oder eine Auswahl unter Produkte exportieren.", "empty.export.noMatchTitle": "Keine passenden Feeds", "empty.export.noMatchMessage": "Versuchen Sie einen anderen Suchbegriff.", "empty.files.noneTitle": "Noch keine Uploads", - "empty.files.noneMessage": "CSV-Importe für Produkte, Kategorien und Attribute erscheinen hier nach dem Upload. Nach einer Plattform-Migration wurden Dateiinhalte (Blobs) nicht kopiert — laden Sie sie bei Bedarf erneut hoch.", + "empty.files.noneMessage": "CSV-Importe für Produkte, Kategorien und Attribute erscheinen hier nach dem Upload. Nach einer Plattform-Migration wurden Dateiinhalte (Blobs) nicht kopiert — laden Sie sie bei Bedarf erneut hoch.", "empty.files.uploadCta": "CSV hochladen", "empty.export.fromProductsCta": "Aus Produkten exportieren", "empty.dashboard.noJobsTitle": "Keine aktuellen Jobs", @@ -2383,40 +2384,40 @@ export const de: MessageDict = { "empty.stores.noneTitle": "Noch kein Shop verbunden", "empty.stores.noneMessage": "Verbinden Sie WooCommerce oder Shopify, um Katalog und Bestellungen zu synchronisieren. Lieferantendatei bevorzugt? Nutzen Sie Feed-URL oder CSV-Upload.", "empty.stores.noneTitleMember": "Noch kein Store verbunden", - "empty.stores.noneMessageMember": "Nur Unternehmens-Admins können WooCommerce oder Shopify verbinden. Bitten Sie einen Admin um Hilfe, oder nutzen Sie Feed-URL/CSV, wenn Ihre Rolle das erlaubt.", - "empty.woo.openConnection": "Verbindungseinstellungen öffnen", - "empty.shopify.openConnection": "Verbindungseinstellungen öffnen", + "empty.stores.noneMessageMember": "Nur Unternehmens-Admins können WooCommerce oder Shopify verbinden. Bitten Sie einen Admin um Hilfe, oder nutzen Sie Feed-URL/CSV, wenn Ihre Rolle das erlaubt.", + "empty.woo.openConnection": "Verbindungseinstellungen öffnen", + "empty.shopify.openConnection": "Verbindungseinstellungen öffnen", "empty.processing.noneTitle": "Noch keine Jobs", "empty.processing.noneMessage": "Starten Sie einen Job unter Produkte, wenn Sie bereit sind. Fortschritt und Verlauf erscheinen hier.", - "empty.campaigns.unavailableTitle": "Kampagnen nicht verfügbar", - "empty.campaigns.unavailableMessage": "Der Kampagnendienst ist nicht erreichbar. Sie können den Assistenten öffnen, aber Generieren und Senden warten auf den Dienst.", + "empty.campaigns.unavailableTitle": "Kampagnen nicht verfügbar", + "empty.campaigns.unavailableMessage": "Der Kampagnendienst ist nicht erreichbar. Sie können den Assistenten öffnen, aber Generieren und Senden warten auf den Dienst.", "empty.calendar.noneTitle": "Keine saisonalen Presets", - "empty.calendar.noneMessage": "Kalender-Presets erscheinen hier, sobald die Marketing-API verfügbar ist.", + "empty.calendar.noneMessage": "Kalender-Presets erscheinen hier, sobald die Marketing-API verfügbar ist.", "empty.seo.noneTitle": "Kein Katalog zum Bewerten", - "empty.seo.noneMessage": "Zuerst Produkte verarbeiten oder Kategorien hinzufügen. SEO-Scores erscheinen, sobald Katalogdaten da sind.", - "empty.vector.unavailableTitle": "Vektor-Kategorien nicht verfügbar", + "empty.seo.noneMessage": "Zuerst Produkte verarbeiten oder Kategorien hinzufügen. SEO-Scores erscheinen, sobald Katalogdaten da sind.", + "empty.vector.unavailableTitle": "Vektor-Kategorien nicht verfügbar", "empty.vector.noMatchTitle": "Noch keine Treffer", "empty.vector.noMatchMessage": "Produktbeschreibung eingeben und suchen, um Vektor-Kategorie-Treffer zu sehen.", - "empty.structured.unavailableTitle": "Strukturierte Beschreibungen nicht verfügbar", - "empty.structured.unavailableMessage": "Diese API ist auf diesem Backend noch nicht verfügbar. Export-ID-Felder können hier erst verwaltet werden, wenn /api/structured-descriptions angebunden ist.", - "empty.structured.noneTitle": "Noch keine Felder für strukturierte Beschreibungen", - "empty.structured.noneMessage": "Hier ein Feld hinzufügen oder Export-IDs in einer Kategorie-Beschreibungsformel erstellen — sie erscheinen für Export-Feeds.", - "empty.support.unavailableTitle": "Support nicht verfügbar", + "empty.structured.unavailableTitle": "Strukturierte Beschreibungen nicht verfügbar", + "empty.structured.unavailableMessage": "Diese API ist auf diesem Backend noch nicht verfügbar. Export-ID-Felder können hier erst verwaltet werden, wenn /api/structured-descriptions angebunden ist.", + "empty.structured.noneTitle": "Noch keine Felder für strukturierte Beschreibungen", + "empty.structured.noneMessage": "Hier ein Feld hinzufügen oder Export-IDs in einer Kategorie-Beschreibungsformel erstellen — sie erscheinen für Export-Feeds.", + "empty.support.unavailableTitle": "Support nicht verfügbar", "empty.support.noneTitle": "Noch keine Tickets", - "empty.support.unavailableMessage": "Die Support-API ist nicht erreichbar. Bald erneut versuchen oder neues Ticket öffnen, wenn der Dienst da ist.", + "empty.support.unavailableMessage": "Die Support-API ist nicht erreichbar. Bald erneut versuchen oder neues Ticket öffnen, wenn der Dienst da ist.", "empty.support.filterMessage": "Kein Ticket entspricht diesem Status. Anderen Filter versuchen oder neues Ticket erstellen.", "empty.support.noneMessage": "Beschreiben Sie Ihr Problem; unser Team antwortet in diesem Thread. Sie erhalten auch eine In-App-Benachrichtigung, wenn Mitarbeiter antworten.", "empty.support.createTicket": "Ticket erstellen", - "empty.support.clearFilter": "Filter löschen", + "empty.support.clearFilter": "Filter löschen", "empty.support.ticketNotFoundTitle": "Ticket nicht gefunden", - "empty.support.ticketNotFoundMessage": "Dieses Ticket wurde möglicherweise entfernt oder Sie haben keinen Zugriff.", + "empty.support.ticketNotFoundMessage": "Dieses Ticket wurde möglicherweise entfernt oder Sie haben keinen Zugriff.", "empty.support.noMessagesTitle": "Keine Nachrichten", "empty.support.noMessagesMessage": "Dieser Thread hat noch keine Nachrichten.", - "empty.settings.noApiKeysTitle": "Noch keine API-Schlüssel", + "empty.settings.noApiKeysTitle": "Noch keine API-Schlüssel", "empty.shopify.noOrdersTitle": "Noch keine Bestellungen", - "empty.shopify.noOrdersMessage": "Bestellungen erscheinen, nachdem Shopify verbunden ist und ein Bestellimport läuft. Leere Listen sind bis zum ersten Sync normal.", + "empty.shopify.noOrdersMessage": "Bestellungen erscheinen, nachdem Shopify verbunden ist und ein Bestellimport läuft. Leere Listen sind bis zum ersten Sync normal.", "empty.woo.noOrdersTitle": "Noch keine Bestellungen", - "empty.woo.noOrdersMessage": "Bestellungen erscheinen, nachdem WooCommerce verbunden ist und eine Bestellsynchronisierung läuft. Leere Listen sind bis zum ersten Sync normal.", + "empty.woo.noOrdersMessage": "Bestellungen erscheinen, nachdem WooCommerce verbunden ist und eine Bestellsynchronisierung läuft. Leere Listen sind bis zum ersten Sync normal.", "empty.woo.noReviewsTitle": "Noch keine Bewertungen", "empty.woo.noReviewsMessage": "Bewertungen erscheinen, nachdem Sie einen Bewertungsimport aus einem verbundenen Shop starten. Dieser Tab bleibt bei leerer Liste nutzbar.", "empty.admin.noProviderTitle": "Keine Anbieterzeilen", @@ -2424,15 +2425,15 @@ export const de: MessageDict = { "empty.admin.noCompaniesTitle": "Keine Unternehmen", "empty.admin.noCompaniesMessage": "Die Unternehmensliste ist leer.", "empty.admin.noCyclesTitle": "Noch keine Abrechnungszyklen", - "empty.admin.noCyclesMessage": "Zyklen erscheinen, sobald Abrechnungsläufe historische Zeilen erzeugen.", + "empty.admin.noCyclesMessage": "Zyklen erscheinen, sobald Abrechnungsläufe historische Zeilen erzeugen.", "empty.admin.noCompaniesFound": "Keine Unternehmen gefunden.", "empty.admin.noCompaniesMatch": "Keine Unternehmen entsprechen diesem Filter.", "empty.admin.notPlatformTitle": "Kein Plattform-Admin", "empty.admin.notPlatformMessage": "Ihr Konto ist angemeldet, aber nicht als Plattform-Admin markiert. Bitten Sie einen bestehenden Admin um Zugriff, melden Sie sich ab und wieder an.", - "empty.admin.noJobsFilter": "Keine Jobs für diesen Filter.", + "empty.admin.noJobsFilter": "Keine Jobs für diesen Filter.", "empty.admin.noAdminUsers": "Keine Admin-Benutzer gefunden", "empty.admin.noJobs": "Keine Jobs gefunden.", - "empty.admin.queueUnavailable": "Support-Warteschlange ist nicht verfügbar. Kontaktieren Sie Ihren Plattform-Admin, falls das anhält.", + "empty.admin.queueUnavailable": "Support-Warteschlange ist nicht verfügbar. Kontaktieren Sie Ihren Plattform-Admin, falls das anhält.", "empty.admin.noTicketsQueue": "Keine Tickets in dieser Warteschlange.", "empty.admin.knowledgeTitle": "Support-Wissen", "empty.admin.knowledgeNotReadyTitle": "Support-Wissen ist nicht bereit", @@ -2440,66 +2441,66 @@ export const de: MessageDict = { "empty.admin.noTemplatesTitle": "Keine Antwortvorlagen", "empty.admin.noTemplatesMessage": "Vorlagen werden wie Artikel zugeordnet und als gekennzeichnete Auto-Antworten gepostet.", "empty.admin.ticketNotFound": "Ticket nicht gefunden.", - "empty.admin.supportUnavailable": "Support ist auf diesem Deployment nicht verfügbar.", + "empty.admin.supportUnavailable": "Support ist auf diesem Deployment nicht verfügbar.", "empty.admin.ticketLoadFailed": "Dieses Ticket konnte nicht geladen werden.", "empty.admin.noMessages": "Noch keine Nachrichten.", - "empty.admin.translationsUnavailableTitle": "Übersetzungen nicht verfügbar", - "empty.admin.translationsUnavailableMessage": "Der Übersetzungs-Katalog-Endpunkt ist in diesem Build nicht verfügbar.", - "empty.admin.noKeysMatchTitle": "Keine Schlüssel passen", - "empty.admin.noKeysMatchMessage": "Anderen Filter oder Suche versuchen, oder aktualisieren, wenn neue Schlüssel in Englisch hinzugefügt wurden.", + "empty.admin.translationsUnavailableTitle": "Übersetzungen nicht verfügbar", + "empty.admin.translationsUnavailableMessage": "Der Übersetzungs-Katalog-Endpunkt ist in diesem Build nicht verfügbar.", + "empty.admin.noKeysMatchTitle": "Keine Schlüssel passen", + "empty.admin.noKeysMatchMessage": "Anderen Filter oder Suche versuchen, oder aktualisieren, wenn neue Schlüssel in Englisch hinzugefügt wurden.", "empty.admin.noUsersMatch": "Keine Benutzer entsprechen diesem Filter.", "empty.admin.noCompaniesMatchFilter": "Keine Unternehmen entsprechen diesem Filter.", - "blast.title": "E-Mail-Blast bestätigen", - "blast.dryRunDescription": "Dry-Run ist aktiv — es verlassen keine echten E-Mails Descrybe. Bestätigen, um den Dry-Run zu protokollieren.", + "blast.title": "E-Mail-Blast bestätigen", + "blast.dryRunDescription": "Dry-Run ist aktiv — es verlassen keine echten E-Mails Descrybe. Bestätigen, um den Dry-Run zu protokollieren.", "blast.liveDescription": "Dadurch werden echte E-Mails an Ihre Zielgruppe gesendet. Tippen Sie I understand zum Fortfahren.", - "blast.recipients": "Empfänger in dieser Anfrage: {count}", - "blast.typePhrase": "„I understand“ eingeben", + "blast.recipients": "Empfänger in dieser Anfrage: {count}", + "blast.typePhrase": "„I understand“ eingeben", "blast.placeholder": "I understand", - "blast.runDryRun": "Dry-Run ausführen", + "blast.runDryRun": "Dry-Run ausführen", "blast.send": "Blast senden", "marketing.footerBefore": "E-Mail-Kampagnen bleiben unter", - "marketing.footerAfter": "— diese Seite bereitet nur Katalog-Export-Feeds vor.", + "marketing.footerAfter": "— diese Seite bereitet nur Katalog-Export-Feeds vor.", "support.title": "Support-Center", - "support.description": "Öffnen a Ticket for Abrechnung, bugs, or account help. Personal replies show here and as in-app notifications.", + "support.description": "Öffnen a Ticket for Abrechnung, bugs, or account help. Personal replies show here and as in-app notifications.", "support.newTicket": "New Ticket", "support.createTicket": "Ticket erstellen", - "support.loadingTickets": "Laden Tickets…", + "support.loadingTickets": "Laden Tickets…", "support.loadFailed": "Support-Tickets konnten nicht geladen werden", - "support.unavailableBanner": "Support is not fully verfügbar yet. You can still prepare a Ticket; submitting may wait until the service is ready.", + "support.unavailableBanner": "Support is not fully verfügbar yet. You can still prepare a Ticket; submitting may wait until the service is ready.", "support.yourTickets": "Ihre Tickets", "support.ticketCount": "{count} Tickets", "support.ticketCountOne": "{count} Ticket", - "support.statusFilterSuffix": "· Status {status}", + "support.statusFilterSuffix": "· Status {status}", "support.filterByStatus": "Filtern by status", - "support.unavailableTitle": "Support nicht verfügbar", + "support.unavailableTitle": "Support nicht verfügbar", "support.emptyTitle": "Noch keine Tickets", - "support.unavailableEmpty": "Die Support-API ist nicht erreichbar. Bald erneut versuchen oder neues Ticket öffnen, wenn der Dienst da ist.", + "support.unavailableEmpty": "Die Support-API ist nicht erreichbar. Bald erneut versuchen oder neues Ticket öffnen, wenn der Dienst da ist.", "support.emptyFiltered": "Kein Ticket entspricht diesem Status. Anderen Filter versuchen oder neues Ticket erstellen.", "support.emptyHelp": "Beschreiben Sie Ihr Problem; unser Team antwortet in diesem Thread. Sie erhalten auch eine In-App-Benachrichtigung, wenn Mitarbeiter antworten.", - "support.clearFilter": "Filter löschen", + "support.clearFilter": "Filter löschen", "support.table.subject": "Betreff", "support.table.category": "Kategorie", "support.table.status": "Zustand", - "support.table.priority": "Priorität", + "support.table.priority": "Priorität", "support.table.updated": "Aktualisiert", - "support.openTicketAria": "Öffnen Ticket {subject}", + "support.openTicketAria": "Öffnen Ticket {subject}", "support.status.all": "Alle", - "support.status.open": "Öffnen", + "support.status.open": "Öffnen", "support.status.pending": "Ausstehend", - "support.status.resolved": "Gelöst", + "support.status.resolved": "Gelöst", "support.status.closed": "Geschlossen", "support.new.title": "Neues Support-Ticket", "support.new.description": "Sagen Sie uns, wobei Sie Hilfe brauchen. Schritte, Fehlermeldungen oder Rechnungsdetails wenn relevant.", - "support.new.back": "Zurück to Tickets", + "support.new.back": "Zurück to Tickets", "support.new.details": "Ticketdetails", - "support.new.detailsHelp": "Status startet als offen. Zuerst kann eine automatische Antwort kommen; ein Mensch kann jederzeit im selben Thread übernehmen.", + "support.new.detailsHelp": "Status startet als offen. Zuerst kann eine automatische Antwort kommen; ein Mensch kann jederzeit im selben Thread übernehmen.", "support.new.subject": "Betreff", "support.new.subjectPlaceholder": "Kurze Zusammenfassung", "support.new.category": "Kategorie", - "support.new.priority": "Priorität", + "support.new.priority": "Priorität", "support.new.optional": "Optionale Details", - "support.new.optionalHint": "(SKU, Tags — hilft beim Routing)", - "support.new.relatedSku": "Zugehörige SKU", + "support.new.optionalHint": "(SKU, Tags — hilft beim Routing)", + "support.new.relatedSku": "Zugehörige SKU", "support.new.relatedSkuPlaceholder": "z. B. ABC-123", "support.new.relatedSkuHelp": "Produkt or Feed SKU if this is about a specific item.", "support.new.tags": "Tags", @@ -2511,31 +2512,31 @@ export const de: MessageDict = { "support.new.createdTitle": "Ticket erstellt", "support.new.createdBody": "Wir antworten in diesem Thread. Achten Sie auf In-App-Benachrichtigungen.", "support.new.viewTicket": "View Ticket", - "support.new.unavailable": "Support is temporarily nicht verfügbar. Your message was not submitted — try again shortly.", - "support.new.unavailableTitle": "Support nicht verfügbar", + "support.new.unavailable": "Support is temporarily nicht verfügbar. Your message was not submitted — try again shortly.", + "support.new.unavailableTitle": "Support nicht verfügbar", "support.new.createFailed": "Ticket konnte nicht erstellt werden", "support.ticket.fallbackTitle": "Support Ticket", "support.ticket.description": "Conversation thread with Descrybe Support.", - "support.ticket.meta": "{category} · {priority} · Aktualisiert {when}", + "support.ticket.meta": "{category} · {priority} · Aktualisiert {when}", "support.ticket.allTickets": "Alle Tickets", - "support.ticket.loading": "Laden Ticket…", + "support.ticket.loading": "Laden Ticket…", "support.ticket.missingId": "Ticket-ID fehlt", "support.ticket.notFound": "Ticket nicht gefunden", - "support.ticket.notFoundMessage": "Dieses Ticket wurde möglicherweise entfernt oder Sie haben keinen Zugriff.", - "support.ticket.backCenter": "Zurück to Support Center", - "support.ticket.unavailable": "Support ist vorübergehend nicht verfügbar.", + "support.ticket.notFoundMessage": "Dieses Ticket wurde möglicherweise entfernt oder Sie haben keinen Zugriff.", + "support.ticket.backCenter": "Zurück to Support Center", + "support.ticket.unavailable": "Support ist vorübergehend nicht verfügbar.", "support.ticket.loadFailed": "Ticket konnte nicht geladen werden", - "support.ticket.openedMeta": "Öffnened {when} · {category} · {priority} priority", + "support.ticket.openedMeta": "Öffnened {when} · {category} · {priority} priority", "support.ticket.sku": "SKU {sku}", "support.ticket.messagesAria": "Ticketnachrichten", "support.ticket.noMessages": "Keine Nachrichten", "support.ticket.noMessagesHelp": "Dieser Thread hat noch keine Nachrichten.", "support.ticket.yourReply": "Ihre Antwort", - "support.ticket.replyPlaceholder": "Add details or reply to Support…", + "support.ticket.replyPlaceholder": "Add details or reply to Support…", "support.ticket.sendReply": "Antwort senden", "support.ticket.replySent": "Antwort gesendet", - "support.ticket.reopened": "Ticket für Teamprüfung wieder geöffnet.", - "support.ticket.replyAdded": "Ihre Nachricht wurde dem Thread hinzugefügt.", + "support.ticket.reopened": "Ticket für Teamprüfung wieder geöffnet.", + "support.ticket.replyAdded": "Ihre Nachricht wurde dem Thread hinzugefügt.", "support.ticket.replyFailed": "Antwort konnte nicht gesendet werden", "support.ticket.reopenHint": "Replying reopens this Ticket for staff.", "support.ticket.humanHint": "Replying asks a human teammate to continue from hier.", @@ -2543,21 +2544,21 @@ export const de: MessageDict = { "support.kind.you": "Sie", "support.kind.human": "Hilfezentrum", "support.kind.auto": "Automatisiert", - "support.kind.ai": "KI-unterstützt", + "support.kind.ai": "KI-unterstützt", "support.kind.system": "Systembereich", "support.kind.autoBadge": "Automatische Antwort", - "support.kind.aiBadge": "KI-unterstützt", + "support.kind.aiBadge": "KI-unterstützt", "support.progress.closed.title": "Ticket geschlossen", - "support.progress.closed.message": "This conversation is closed. Öffnen a new Ticket if you still need help.", - "support.progress.resolved.title": "Als gelöst markiert", - "support.progress.resolved.message": "Wir glauben, das ist erledigt. Antworten zum Wiederöffnen oder unten kurz bewerten.", + "support.progress.closed.message": "This conversation is closed. Öffnen a new Ticket if you still need help.", + "support.progress.resolved.title": "Als gelöst markiert", + "support.progress.resolved.message": "Wir glauben, das ist erledigt. Antworten zum Wiederöffnen oder unten kurz bewerten.", "support.progress.quickAnswer.title": "Schnelle Antwort gesendet", - "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply hier — a human will take over.", + "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply hier — a human will take over.", "support.progress.onIt.title": "Wir sind dran", "support.progress.onIt.handedMessage": "A Support teammate has your Ticket and will reply in this thread.", - "support.progress.onIt.pendingMessage": "Support prüft Ihre Nachricht. Updates erscheinen in diesem Thread.", + "support.progress.onIt.pendingMessage": "Support prüft Ihre Nachricht. Updates erscheinen in diesem Thread.", "support.progress.received.title": "Ticket empfangen", - "support.progress.received.message": "Danke — wir haben Ihre Anfrage. Automatische Hilfe kann bald erscheinen, oder ein Teammitglied antwortet.", + "support.progress.received.message": "Danke — wir haben Ihre Anfrage. Automatische Hilfe kann bald erscheinen, oder ein Teammitglied antwortet.", "support.category.billing": "Abrechnung", "support.category.billing.help": "Rechnungen, payment methods, plan changes, and Stripe receipts.", "support.category.billing_credits": "Abrechnung / credits", @@ -2567,33 +2568,33 @@ export const de: MessageDict = { "support.category.account": "Konto / Zugang", "support.category.account.help": "Login, invites, Unternehmen membership, and permissions.", "support.category.integrations": "Integrationen", - "support.category.integrations.help": "WooCommerce, Shopify, öffentliche API oder Connector-Setup.", + "support.category.integrations.help": "WooCommerce, Shopify, öffentliche API oder Connector-Setup.", "support.category.processing": "Verarbeitung / AI", "support.category.processing.help": "Produkt Verarbeitung, AI prompts, and generation quality.", "support.category.export": "Exportieren / channels", "support.category.export.help": "Exportieren Feeds, channels, and sync destinations.", "support.category.migration": "Migration / Daten", - "support.category.migration.help": "Fehlende oder falsche Daten nach dem Cutover — Produkte, Feeds, Stores, Billing oder Team.", + "support.category.migration.help": "Fehlende oder falsche Daten nach dem Cutover — Produkte, Feeds, Stores, Billing oder Team.", "support.category.other": "Sonstiges", - "support.category.other.help": "Alles andere — wir leiten es an die richtige Person weiter.", + "support.category.other.help": "Alles andere — wir leiten es an die richtige Person weiter.", "support.priority.low": "Niedrig", - "support.priority.low.help": "Nice-to-have oder nicht blockierend — wir kommen der Reihe nach dazu.", + "support.priority.low.help": "Nice-to-have oder nicht blockierend — wir kommen der Reihe nach dazu.", "support.priority.normal": "Normal", "support.priority.normal.help": "Standard request. Most Tickets use this.", "support.priority.high": "Hoch", - "support.priority.high.help": "Blockiert Arbeit oder Umsatz — sparsam verwenden.", - "support.csat.thanks": "Danke für Ihr Feedback", - "support.csat.unavailable": "Bewertung ist vorübergehend nicht verfügbar. Bitte später erneut versuchen.", - "support.csat.unavailableTitle": "Bewertung nicht verfügbar", + "support.priority.high.help": "Blockiert Arbeit oder Umsatz — sparsam verwenden.", + "support.csat.thanks": "Danke für Ihr Feedback", + "support.csat.unavailable": "Bewertung ist vorübergehend nicht verfügbar. Bitte später erneut versuchen.", + "support.csat.unavailableTitle": "Bewertung nicht verfügbar", "support.csat.alreadyRated": "Sie haben dieses Ticket bereits bewertet.", "support.csat.alreadyRatedTitle": "Bereits bewertet", - "support.csat.submitFailed": "Bewertung konnte nicht übermittelt werden", + "support.csat.submitFailed": "Bewertung konnte nicht übermittelt werden", "support.csat.yourRating": "Ihre Bewertung", "support.csat.ratedOutOf": "You rated this Ticket {score} out of 5", "support.csat.howDidWeDo": "Wie waren wir?", - "support.csat.formHelp": "This Ticket is {status}. Rate your experience (1–5). Optional comment helps us improve.", + "support.csat.formHelp": "This Ticket is {status}. Rate your experience (1–5). Optional comment helps us improve.", "support.csat.rating": "Bewertung", - "support.csat.scoreAria": "{value} — {label}", + "support.csat.scoreAria": "{value} — {label}", "support.csat.whatWentWrong": "Was ist schiefgelaufen? (optional)", "support.csat.whatWentWrongPlaceholder": "Eine kurze Notiz hilft uns beim Nachfassen.", "support.csat.anythingElse": "Noch etwas? (optional)", @@ -2604,59 +2605,59 @@ export const de: MessageDict = { "support.csat.score.3": "OK", "support.csat.score.4": "Zufrieden", "support.csat.score.5": "Sehr zufrieden", - "catalog.delete": "Löschen", - "catalog.deleting": "Löschen…", - "catalog.saving": "Speichern…", - "catalog.adding": "Wird hinzugefügt…", - "catalog.assigning": "Zuweisen…", - "catalog.uploading": "Wird hochgeladen…", + "catalog.delete": "Löschen", + "catalog.deleting": "Löschen…", + "catalog.saving": "Speichern…", + "catalog.adding": "Wird hinzugefügt…", + "catalog.assigning": "Zuweisen…", + "catalog.uploading": "Wird hochgeladen…", "catalog.create": "Erstellen", "catalog.createFailed": "Erstellen fehlgeschlagen", "catalog.updateFailed": "Aktualisierung fehlgeschlagen", - "catalog.deleteFailed": "Löschen fehlgeschlagen", + "catalog.deleteFailed": "Löschen fehlgeschlagen", "catalog.importFailed": "Import fehlgeschlagen", - "catalog.confirm": "Bestätigen", - "catalog.confirmDeletion": "Löschen bestätigen", + "catalog.confirm": "Bestätigen", + "catalog.confirmDeletion": "Löschen bestätigen", "catalog.areYouSure": "Sind Sie sicher?", - "catalog.previous": "Zurück", + "catalog.previous": "Zurück", "catalog.next": "Weiter", "catalog.expand": "Erweitern", "catalog.collapse": "Einklappen", - "catalog.clearSearch": "Suche löschen", - "catalog.clearFilters": "Filter löschen", + "catalog.clearSearch": "Suche löschen", + "catalog.clearFilters": "Filter löschen", "catalog.clearSelection": "Auswahl leeren", - "catalog.add": "Hinzufügen", + "catalog.add": "Hinzufügen", "catalog.update": "Aktualisieren", "catalog.edit": "Bearbeiten", - "catalog.accept": "Übernehmen", + "catalog.accept": "Übernehmen", "catalog.reject": "Ablehnen", - "catalog.reset": "Zurücksetzen", - "catalog.undo": "Rückgängig", - "catalog.close": "Schließen", - "catalog.closePanel": "Panel schließen", - "catalog.closeMenus": "Menüs schließen", - "catalog.openMenu": "Menü öffnen", - "catalog.loading": "Laden…", + "catalog.reset": "Zurücksetzen", + "catalog.undo": "Rückgängig", + "catalog.close": "Schließen", + "catalog.closePanel": "Panel schließen", + "catalog.closeMenus": "Menüs schließen", + "catalog.openMenu": "Menü öffnen", + "catalog.loading": "Laden…", "catalog.empty": "Leer", "catalog.required": "Erforderlich", "catalog.optional": "Optional", "catalog.features": "Funktionen", "catalog.csvImportFinished": "CSV-Import abgeschlossen.", - "catalog.comparePlans": "Pläne vergleichen", - "catalog.saveChanges": "Änderungen speichern", + "catalog.comparePlans": "Pläne vergleichen", + "catalog.saveChanges": "Änderungen speichern", "catalog.saveFormula": "Formel speichern", "catalog.saveFormulaShort": "Formel speichern", "catalog.noResults": "Keine Ergebnisse", "products.title": "Produkte", - "products.description": "Durchsuchen, prüfen und verarbeiten Sie Ihren Katalog.", + "products.description": "Durchsuchen, prüfen und verarbeiten Sie Ihren Katalog.", "products.loadFailed": "Produkte konnten nicht geladen werden", "products.unnamed": "Unbenanntes Produkt", "products.tabs.navLabel": "Produktansichten", "products.tab.processed": "Verarbeitet", "products.tab.processedHint": "Fertige Produkte zum Exportieren oder Synchronisieren", - "products.tab.needsReview": "Zur Prüfung", + "products.tab.needsReview": "Zur Prüfung", "products.tab.needsReviewHint": "Angereicherte Produkte zum Annehmen, Bearbeiten oder Ablehnen", - "products.tab.needsReviewShort": "Prüfung", + "products.tab.needsReviewShort": "Prüfung", "products.tab.error": "Fehler", "products.tab.errorHint": "Produkte, die in einem Job fehlgeschlagen sind", "products.tab.processing": "In Bearbeitung", @@ -2666,47 +2667,47 @@ export const de: MessageDict = { "products.tab.unprocessedHint": "Katalogprodukte, die noch nicht verarbeitet wurden", "products.tab.raw": "Unverarbeitet", "products.status.processed": "Verarbeitet", - "products.status.needsReview": "Prüfung erforderlich", + "products.status.needsReview": "Prüfung erforderlich", "products.status.processing": "Verarbeitung", "products.status.error": "Fehler", "products.status.failed": "Fehlgeschlagen", "products.status.unprocessed": "Unverarbeitet", "products.status.pending": "Ausstehend", "products.status.unknown": "Unbekannt", - "products.pagination.showing": "Anzeige {start}–{end} von {total}", + "products.pagination.showing": "Anzeige {start}–{end} von {total}", "products.empty.processing.title": "Noch keine Jobs", - "products.empty.processing.messageJobs": "Gerade läuft nichts. Starten Sie einen Job unter Unverarbeitet, oder öffnen Sie Verarbeitung, um den Fortschritt zu verfolgen.", - "products.empty.processing.messageBasic": "Produkte erscheinen hier, während ein Job läuft.", - "products.empty.needsReview.title": "Keine Produkte zur Prüfung", - "products.empty.needsReview.message": "Nach einem Job landen angereicherte Produkte hier. Öffnen Sie eine Zeile zum Vergleichen, dann Übernehmen, bearbeiten oder Ablehnen.", + "products.empty.processing.messageJobs": "Gerade läuft nichts. Starten Sie einen Job unter Unverarbeitet, oder öffnen Sie Verarbeitung, um den Fortschritt zu verfolgen.", + "products.empty.processing.messageBasic": "Produkte erscheinen hier, während ein Job läuft.", + "products.empty.needsReview.title": "Keine Produkte zur Prüfung", + "products.empty.needsReview.message": "Nach einem Job landen angereicherte Produkte hier. Öffnen Sie eine Zeile zum Vergleichen, dann Übernehmen, bearbeiten oder Ablehnen.", "products.empty.error.title": "Keine Produkte mit Fehlern", - "products.empty.error.message": "Wenn ein Job für ein Produkt fehlschlägt, erscheint es hier zum erneuten Versuch.", + "products.empty.error.message": "Wenn ein Job für ein Produkt fehlschlägt, erscheint es hier zum erneuten Versuch.", "products.empty.noUnprocessedMatches": "Keine unverarbeiteten Treffer", - "products.empty.noMatch": "Keine Produkte stimmen überein", - "products.empty.filtersHint": "Andere Suche, Kategorie oder Feed versuchen — oder Filter leeren, um alles zu sehen.", + "products.empty.noMatch": "Keine Produkte stimmen überein", + "products.empty.filtersHint": "Andere Suche, Kategorie oder Feed versuchen — oder Filter leeren, um alles zu sehen.", "products.empty.noUnprocessed.title": "Noch keine unverarbeiteten Produkte", "products.empty.noUnprocessed.message": "Verbinden Sie einen Lieferanten-Feed oder laden Sie eine CSV hoch, um Produkte zu importieren.", "products.empty.none.title": "Noch keine Produkte", - "products.empty.none.messageStores": "Schließen Sie zuerst Feeds → Map → Sync ab, dann Process. Importieren Sie aus einem Feed oder einem Store.", - "products.empty.none.messageBasic": "Schließen Sie zuerst Feeds → Map → Sync ab, dann Process. Verbinden Sie einen Feed oder laden Sie eine CSV hoch.", + "products.empty.none.messageStores": "Schließen Sie zuerst Feeds → Map → Sync ab, dann Process. Importieren Sie aus einem Feed oder einem Store.", + "products.empty.none.messageBasic": "Schließen Sie zuerst Feeds → Map → Sync ab, dann Process. Verbinden Sie einen Feed oder laden Sie eine CSV hoch.", "products.actions.viewJobs": "Jobs anzeigen", "products.actions.startJob": "Auftrag starten", "products.actions.viewProcessed": "Verarbeitete anzeigen", "products.actions.retryFromCatalog": "Aus Katalog erneut versuchen", "products.actions.connectFeed": "Feed verbinden", - "products.actions.addProduct": "Produkt hinzufügen", + "products.actions.addProduct": "Produkt hinzufügen", "products.actions.uploadCsv": "CSV hochladen", "products.actions.exportSelected": "Auswahl exportieren", - "products.export.title": "Ausgewählte Produkte exportieren", - "products.export.confirm": "Export bestätigen", + "products.export.title": "Ausgewählte Produkte exportieren", + "products.export.confirm": "Export bestätigen", "products.export.loadFailed": "Export-Feed-Optionen konnten nicht geladen werden. Bitte erneut versuchen.", - "products.export.noneFound": "Noch keine Export-Feeds. Erstellen Sie einen unter Export Feeds und kehren Sie zurück, um Ihre Auswahl zu exportieren.", - "products.export.selectFormat": "Bitte wählen Sie einen Export-Feed.", - "products.export.failed": "Ausgewählte Produkte konnten nicht exportiert werden", + "products.export.noneFound": "Noch keine Export-Feeds. Erstellen Sie einen unter Export Feeds und kehren Sie zurück, um Ihre Auswahl zu exportieren.", + "products.export.selectFormat": "Bitte wählen Sie einen Export-Feed.", + "products.export.failed": "Ausgewählte Produkte konnten nicht exportiert werden", "products.upload.title": "CSV hochladen", - "products.upload.description": "Importieren Sie Produkte aus einer CSV-Datei (GTIN/EAN, Name, Kategorie, …). Laden Sie die Beispieldatei herunter, um den vollständigen Spaltensatz zu sehen.", + "products.upload.description": "Importieren Sie Produkte aus einer CSV-Datei (GTIN/EAN, Name, Kategorie, …). Laden Sie die Beispieldatei herunter, um den vollständigen Spaltensatz zu sehen.", "products.upload.submit": "Hochladen & importieren", - "products.upload.chooseFirst": "Wählen Sie zuerst eine CSV-Datei.", + "products.upload.chooseFirst": "Wählen Sie zuerst eine CSV-Datei.", "products.upload.csvOnly": "Bitte laden Sie eine CSV-Datei hoch.", "products.upload.tooLarge": "CSV must be 5 MB or smaller.", "products.processing.started": "Verarbeitungsjob gestartet", @@ -2717,37 +2718,37 @@ export const de: MessageDict = { "products.processing.cancelFailed": "Verarbeitungsjob konnte nicht abgebrochen werden", "products.processing.justCancelled": "Der soeben gestartete Job wurde abgebrochen.", "products.processing.viewInProcessing": "In Verarbeitung anzeigen", - "products.processing.confirm": "Verarbeitung bestätigen", - "products.processing.freePlanTitle": "Free-Plan — Verarbeitung ohne KI", - "products.processing.freePlanBody": "Normalisierung, Spezifikationen, Ausfüllen und EPREL verbrauchen keine Credits. AI-Titel/Beschreibungen erfordern einen bezahlten Plan oder Credits.", + "products.processing.confirm": "Verarbeitung bestätigen", + "products.processing.freePlanTitle": "Free-Plan — Verarbeitung ohne KI", + "products.processing.freePlanBody": "Normalisierung, Spezifikationen, Ausfüllen und EPREL verbrauchen keine Credits. AI-Titel/Beschreibungen erfordern einen bezahlten Plan oder Credits.", "products.enrichment.acceptTitle": "Anreicherung akzeptieren?", - "products.enrichment.acceptConfirm": "Anreicherung akzeptieren bestätigen", - "products.enrichment.acceptSelected": "Anreicherung für {count} ausgewählte(s) Produkt(e) akzeptieren? Sie werden zu Verarbeitet verschoben.", - "products.enrichment.rejectConfirm": "Anreicherungsablehnung bestätigen", - "products.enrichment.rejectBody": "Anreicherung ablehnen und dieses Produkt zu unverarbeitet zurücksetzen? Sie können die Verarbeitung später erneut ausführen.", - "products.enrichment.rejectSelectedConfirm": "Ablehnung der Auswahl bestätigen", - "products.enrichment.resetConfirm": "Zurücksetzen auf unverarbeitet bestätigen", - "products.enrichment.resetSelected": "{count} ausgewählte(s) Produkt(e) auf unverarbeitet zurücksetzen? Sie erscheinen wieder als unverarbeitete Einträge.", - "products.enrichment.accepted": "Anreicherung akzeptiert — nach Verarbeitet verschoben.", - "products.enrichment.rejected": "Anreicherung abgelehnt — Produkt zu unverarbeitet zurückgesetzt.", + "products.enrichment.acceptConfirm": "Anreicherung akzeptieren bestätigen", + "products.enrichment.acceptSelected": "Anreicherung für {count} ausgewählte(s) Produkt(e) akzeptieren? Sie werden zu Verarbeitet verschoben.", + "products.enrichment.rejectConfirm": "Anreicherungsablehnung bestätigen", + "products.enrichment.rejectBody": "Anreicherung ablehnen und dieses Produkt zu unverarbeitet zurücksetzen? Sie können die Verarbeitung später erneut ausführen.", + "products.enrichment.rejectSelectedConfirm": "Ablehnung der Auswahl bestätigen", + "products.enrichment.resetConfirm": "Zurücksetzen auf unverarbeitet bestätigen", + "products.enrichment.resetSelected": "{count} ausgewählte(s) Produkt(e) auf unverarbeitet zurücksetzen? Sie erscheinen wieder als unverarbeitete Einträge.", + "products.enrichment.accepted": "Anreicherung akzeptiert — nach Verarbeitet verschoben.", + "products.enrichment.rejected": "Anreicherung abgelehnt — Produkt zu unverarbeitet zurückgesetzt.", "products.enrichment.acceptFailed": "Anreicherung konnte nicht akzeptiert werden", "products.enrichment.rejectFailed": "Anreicherung konnte nicht abgelehnt werden", - "products.enrichment.acceptUndone": "Übernahme rückgängig", - "products.enrichment.undoAcceptFailed": "Akzeptieren konnte nicht rückgängig gemacht werden", - "products.enrichment.resetDone": "Produkt zu unverarbeitet zurückgesetzt.", - "products.enrichment.resetFailed": "Produkte konnten nicht zurückgesetzt werden", - "products.enrichment.valueReset": "Angereicherter Wert auf Original zurückgesetzt.", - "products.enrichment.originalEmpty": "Originalwert ist leer; Anreicherung kann per PATCH nicht gelöscht werden.", + "products.enrichment.acceptUndone": "Übernahme rückgängig", + "products.enrichment.undoAcceptFailed": "Akzeptieren konnte nicht rückgängig gemacht werden", + "products.enrichment.resetDone": "Produkt zu unverarbeitet zurückgesetzt.", + "products.enrichment.resetFailed": "Produkte konnten nicht zurückgesetzt werden", + "products.enrichment.valueReset": "Angereicherter Wert auf Original zurückgesetzt.", + "products.enrichment.originalEmpty": "Originalwert ist leer; Anreicherung kann per PATCH nicht gelöscht werden.", "products.enrichment.staysNeedsReview": "Das Produkt bleibt in Needs Review, bis Sie alles akzeptieren.", - "products.field.nameAcceptUndone": "Namensakzeptanz rückgängig gemacht", - "products.field.descriptionAcceptUndone": "Beschreibungsakzeptanz rückgängig gemacht", - "products.field.nameDiscardUndone": "Namensverwerfen rückgängig gemacht", - "products.field.descriptionDiscardUndone": "Beschreibungsverwerfen rückgängig gemacht", - "products.field.undoAcceptFailed": "Feldakzeptanz konnte nicht rückgängig gemacht werden", - "products.field.undoDiscardFailed": "Feldverwerfen konnte nicht rückgängig gemacht werden", + "products.field.nameAcceptUndone": "Namensakzeptanz rückgängig gemacht", + "products.field.descriptionAcceptUndone": "Beschreibungsakzeptanz rückgängig gemacht", + "products.field.nameDiscardUndone": "Namensverwerfen rückgängig gemacht", + "products.field.descriptionDiscardUndone": "Beschreibungsverwerfen rückgängig gemacht", + "products.field.undoAcceptFailed": "Feldakzeptanz konnte nicht rückgängig gemacht werden", + "products.field.undoDiscardFailed": "Feldverwerfen konnte nicht rückgängig gemacht werden", "products.updateFailed": "Produkt konnte nicht aktualisiert werden", - "products.keyboardTips": "Tastaturkürzel", - "products.keyboardTipsShort": "Tastaturkürzel (?)", + "products.keyboardTips": "Tastaturkürzel", + "products.keyboardTipsShort": "Tastaturkürzel (?)", "products.option.categories": "Kategorien", "products.option.attributes": "Attribute / Spezifikationen", "products.option.titlesAi": "Titel (KI)", @@ -2759,81 +2760,81 @@ export const de: MessageDict = { "products.enrichment.state.processed": "Verarbeitet", "products.enrichment.state.feed": "Aus dem Feed", "products.enrichment.state.missing": "Fehlend", - "products.enrichment.help.name": "Produkttitel. Grün = AI-verarbeiteter Name; orange = nur Feed-/Originalname; grau = fehlend.", - "products.enrichment.help.description": "Produktbeschreibung. Grün = AI-verarbeitet; orange = nur Feed/Original; grau = fehlend.", - "products.enrichment.help.attributes": "Spezifikationen und Attribute. Grün = AI-/angereicherte Attribute; orange = nur aus dem Feed; grau = keine.", - "products.enrichment.help.category": "Zugewiesene Kategorie. Grün = Kategorie gesetzt; grau = fehlend.", + "products.enrichment.help.name": "Produkttitel. Grün = AI-verarbeiteter Name; orange = nur Feed-/Originalname; grau = fehlend.", + "products.enrichment.help.description": "Produktbeschreibung. Grün = AI-verarbeitet; orange = nur Feed/Original; grau = fehlend.", + "products.enrichment.help.attributes": "Spezifikationen und Attribute. Grün = AI-/angereicherte Attribute; orange = nur aus dem Feed; grau = keine.", + "products.enrichment.help.category": "Zugewiesene Kategorie. Grün = Kategorie gesetzt; grau = fehlend.", "products.enrichment.chipTitle": "{label}: {state}. {help}", - "products.enrichment.complete": "Vollständig — {parts}", - "products.enrichment.missingSummary": "Fehlt {missing} — {parts}", + "products.enrichment.complete": "Vollständig — {parts}", + "products.enrichment.missingSummary": "Fehlt {missing} — {parts}", "products.issue.title": "Titel", "products.issue.gtin": "GTIN", "products.issue.category": "Kategorie", "products.filters.allCategories": "Alle Kategorien", "products.filters.allFeeds": "Alle Feeds", "products.filters.allCoverage": "Gesamte Abdeckung", - "products.filters.anyFeedChange": "Jede Feed-Änderung", + "products.filters.anyFeedChange": "Jede Feed-Änderung", "products.filters.eprelAll": "EPREL: alle", - "products.filters.feedChangesAll": "Feed-Änderungen: alle", + "products.filters.feedChangesAll": "Feed-Änderungen: alle", "products.filters.byCategory": "Nach Kategorie filtern", "products.filters.byCoverage": "Nach Abdeckung filtern", "products.filters.byFeed": "Nach Feed filtern", "products.filters.byEprel": "Nach EPREL filtern", - "products.filters.byFeedSync": "Nach Feed-Sync-Änderungen filtern", - "products.filters.coverageHint": "Nach Vollständigkeit von Name / Beschreibung / Attribute / Kategorie filtern", - "products.filters.feedSyncHint": "Nach Preis-/Bestands-/Titeländerungen der letzten Feed-Synchronisation filtern", + "products.filters.byFeedSync": "Nach Feed-Sync-Änderungen filtern", + "products.filters.coverageHint": "Nach Vollständigkeit von Name / Beschreibung / Attribute / Kategorie filtern", + "products.filters.feedSyncHint": "Nach Preis-/Bestands-/Titeländerungen der letzten Feed-Synchronisation filtern", "products.filters.eprelHint": "Produkte filtern, die eine EPREL-Energieetiketten-Register-ID haben oder nicht", - "products.filters.availabilityChanged": "Verfügbarkeit geändert", + "products.filters.availabilityChanged": "Verfügbarkeit geändert", "products.eprel.badgeTitle": "EPREL-ID bei diesem Produkt vorhanden (European Product Registry for Energy Labelling).", "products.eprel.help": "Die European Product Registry for Energy Labelling (EPREL)-ID ist auf diesem Produkt vorhanden.", "products.feedData": "Feed-Daten", "attributes.title": "Attribute", "attributes.description": "Definieren Sie Produktfelder, Listenwerte und Kategoriezuweisungen.", "attributes.loadFailed": "Attribute konnten nicht geladen werden", - "attributes.loading": "Attribute werden geladen…", + "attributes.loading": "Attribute werden geladen…", "attributes.zero": "0 Attribute", - "attributes.addNew": "Neues Attribut hinzufügen", + "attributes.addNew": "Neues Attribut hinzufügen", "attributes.create": "Attribut erstellen", "attributes.edit": "Attribut bearbeiten", - "attributes.delete": "Attribut löschen", + "attributes.delete": "Attribut löschen", "attributes.displayName": "Anzeigename des Attributs", "attributes.actions": "Attributaktionen", "attributes.created": "Attribut erstellt.", "attributes.createdAssignFailed": "Attribut erstellt, aber die Kategoriezuweisung ist fehlgeschlagen.", "attributes.updated": "Attribut aktualisiert.", - "attributes.deleted": "Attribut gelöscht.", - "attributes.addValue": "Wert hinzufügen", - "attributes.manageValues": "Werte für dieses Listenattribut hinzufügen, bearbeiten oder entfernen.", - "attributes.valueTypeHint": "Wählen Sie, wie Werte für dieses Attribut eingegeben werden.", - "attributes.createDescription": "Erstellen Sie eine neue Attributdefinition. Sie können sie während der Erstellung einer Kategorie zuweisen.", + "attributes.deleted": "Attribut gelöscht.", + "attributes.addValue": "Wert hinzufügen", + "attributes.manageValues": "Werte für dieses Listenattribut hinzufügen, bearbeiten oder entfernen.", + "attributes.valueTypeHint": "Wählen Sie, wie Werte für dieses Attribut eingegeben werden.", + "attributes.createDescription": "Erstellen Sie eine neue Attributdefinition. Sie können sie während der Erstellung einer Kategorie zuweisen.", "attributes.assignToCategories": "Attribute Kategorien zuweisen", - "attributes.assignFailed": "Attribut konnte der ausgewählten Kategorie nicht zugewiesen werden.", + "attributes.assignFailed": "Attribut konnte der ausgewählten Kategorie nicht zugewiesen werden.", "attributes.bulkAssignFailed": "Massenzuweisung fehlgeschlagen", "attributes.filterByCategory": "Nach Kategorie filtern", "attributes.saveValueFailed": "Wert konnte nicht gespeichert werden", - "attributes.deleteValueFailed": "Wert konnte nicht gelöscht werden", + "attributes.deleteValueFailed": "Wert konnte nicht gelöscht werden", "attributes.csvNeedHeader": "CSV muss eine Kopfzeile und mindestens eine Zeile enthalten", - "attributes.csvNeedColumns": "CSV muss die Spalten „category_id“ und „attribute_key“ enthalten", + "attributes.csvNeedColumns": "CSV muss die Spalten „category_id“ und „attribute_key“ enthalten", "attributes.type.string": "Text", - "attributes.type.stringHint": "Freitext — Namen, Modelle, kurze Notizen", + "attributes.type.stringHint": "Freitext — Namen, Modelle, kurze Notizen", "attributes.type.number": "Zahl", - "attributes.type.numberHint": "Numerischer Wert; Einheit hinzufügen, wenn sinnvoll (cm, kg, W)", + "attributes.type.numberHint": "Numerischer Wert; Einheit hinzufügen, wenn sinnvoll (cm, kg, W)", "attributes.type.boolean": "Ja / Nein", - "attributes.type.booleanHint": "Wahr oder falsch — z. B. hat GPS, kabelloses Laden", + "attributes.type.booleanHint": "Wahr oder falsch — z. B. hat GPS, kabelloses Laden", "attributes.type.date": "Datum", - "attributes.type.dateHint": "Ein Kalenderdatum (Veröffentlichung, Garantieende, …)", + "attributes.type.dateHint": "Ein Kalenderdatum (Veröffentlichung, Garantieende, …)", "attributes.type.list": "Dropdown", - "attributes.type.listHint": "Wählen Sie genau eine Option aus einer definierten Liste", + "attributes.type.listHint": "Wählen Sie genau eine Option aus einer definierten Liste", "attributes.type.multiselect": "Mehrfachauswahl", - "attributes.type.multiselectHint": "Wählen Sie eine oder mehrere Optionen aus einer Liste", + "attributes.type.multiselectHint": "Wählen Sie eine oder mehrere Optionen aus einer Liste", "attributes.color": "Farbe", "categories.title": "Kategorien", - "categories.description": "Organisieren Sie Ihre Kataloghierarchie. Bearbeiten Sie eine Kategorie für Titel-/Beschreibungsformeln und KI-Prompts.", + "categories.description": "Organisieren Sie Ihre Kataloghierarchie. Bearbeiten Sie eine Kategorie für Titel-/Beschreibungsformeln und KI-Prompts.", "categories.loadFailed": "Kategorien konnten nicht geladen werden", - "categories.add": "Kategorie hinzufügen", + "categories.add": "Kategorie hinzufügen", "categories.edit": "Kategorie bearbeiten", - "categories.delete": "Kategorie löschen", - "categories.deleteConfirm": "Möchten Sie diese Kategorie wirklich löschen? Dies kann nicht rückgängig gemacht werden.", + "categories.delete": "Kategorie löschen", + "categories.deleteConfirm": "Möchten Sie diese Kategorie wirklich löschen? Dies kann nicht rückgängig gemacht werden.", "categories.name": "Kategoriename", "categories.namePlaceholder": "Kategoriename", "categories.descriptionPlaceholder": "Optionale Kategoriebeschreibung", @@ -2841,16 +2842,16 @@ export const de: MessageDict = { "categories.searchPlaceholder": "Nach Name oder ID suchen...", "categories.created": "{name} wurde erstellt.", "categories.updated": "Die Kategorie wurde erfolgreich aktualisiert.", - "categories.deleted": "Die Kategorie wurde erfolgreich gelöscht.", + "categories.deleted": "Die Kategorie wurde erfolgreich gelöscht.", "categories.notFound": "Kategorie nicht gefunden.", "categories.loadCategoryFailed": "Kategorie konnte nicht geladen werden", "categories.noCategoriesYet": "Noch keine Kategorien", - "categories.noMatch": "Keine Kategorie entspricht „{query}“. Suche löschen oder anderen Begriff versuchen.", - "categories.emptyHint": "Fügen Sie eine Kategorie hinzu oder importieren Sie eine CSV für Ihren Baum.", - "categories.promptCountOne": "{count} Kategorie hat einen KI-Generierungs-Prompt. Öffnen Sie das Menü ⋮ → KI-Prompt bearbeiten, oder bearbeiten Sie eine Kategorie und wählen Sie KI-Prompt bearbeiten.", - "categories.promptCountMany": "{count} Kategorien haben einen KI-Generierungs-Prompt. Öffnen Sie das Menü ⋮ → KI-Prompt bearbeiten, oder bearbeiten Sie eine Kategorie und wählen Sie KI-Prompt bearbeiten.", + "categories.noMatch": "Keine Kategorie entspricht „{query}“. Suche löschen oder anderen Begriff versuchen.", + "categories.emptyHint": "Fügen Sie eine Kategorie hinzu oder importieren Sie eine CSV für Ihren Baum.", + "categories.promptCountOne": "{count} Kategorie hat einen KI-Generierungs-Prompt. Öffnen Sie das Menü â‹® → KI-Prompt bearbeiten, oder bearbeiten Sie eine Kategorie und wählen Sie KI-Prompt bearbeiten.", + "categories.promptCountMany": "{count} Kategorien haben einen KI-Generierungs-Prompt. Öffnen Sie das Menü â‹® → KI-Prompt bearbeiten, oder bearbeiten Sie eine Kategorie und wählen Sie KI-Prompt bearbeiten.", "categories.actions": "Kategorieaktionen", - "categories.chooseCsv": "CSV wählen", + "categories.chooseCsv": "CSV wählen", "categories.createSingleOrImport": "Erstellen Sie eine Kategorie oder importieren Sie viele per CSV.", "categories.createSingle": "Eine einzelne Kategorie erstellen.", "categories.missingNameColumn": "Erforderliche Spalte 'name' fehlt", @@ -2870,29 +2871,29 @@ export const de: MessageDict = { "categories.aiPromptTitle": "Kategorie-KI-Prompt", "categories.aiPromptDescription": "Kategoriebezogene Generierungsvorlage beim Anreichern von Produkten in dieser Kategorie.", "categories.aiPromptSaved": "KI-Prompt gespeichert.", - "categories.aiPromptCleared": "KI-Prompt gelöscht (Unternehmensstandard gilt).", + "categories.aiPromptCleared": "KI-Prompt gelöscht (Unternehmensstandard gilt).", "categories.aiPromptSaveFailed": "Prompt konnte nicht gespeichert werden", "categories.aiPromptAssignFailed": "Prompt konnte nicht zugewiesen werden", "categories.assignAiPrompt": "KI-Prompt zuweisen", "categories.assignAiPromptHelp": "Kopieren Sie diesen KI-Generierungs-Prompt in andere Kategorien.", - "categories.loadingPrompt": "Prompt wird geladen…", + "categories.loadingPrompt": "Prompt wird geladen…", "categories.brandVoice": "Markenstimme", "categories.productName": "Produktname", "categories.gtin": "GTIN", - "categories.backToCategories": "Zurück zu Kategorien", - "categories.cancelReturn": "Abbrechen und zu Kategorien zurück", + "categories.backToCategories": "Zurück zu Kategorien", + "categories.cancelReturn": "Abbrechen und zu Kategorien zurück", "categories.assignFormula": "Formel zuweisen", "categories.assignFormulaOther": "Formel anderen Kategorien zuweisen", "categories.assignTitleFormula": "Titelformel zuweisen", "categories.assignDescriptionFormula": "Beschreibungsformel zuweisen", - "categories.assignSelectHelp": "Wählen Sie die Kategorien für diese Vorlage.", - "categories.assignTitleHelp": "Wählen Sie die Kategorien für diese Titelformel-Vorlage.", - "categories.assignDescriptionHelp": "Wählen Sie die Kategorien für diese Beschreibungsformel-Vorlage.", - "categories.searchCategories": "Kategorien suchen…", + "categories.assignSelectHelp": "Wählen Sie die Kategorien für diese Vorlage.", + "categories.assignTitleHelp": "Wählen Sie die Kategorien für diese Titelformel-Vorlage.", + "categories.assignDescriptionHelp": "Wählen Sie die Kategorien für diese Beschreibungsformel-Vorlage.", + "categories.searchCategories": "Kategorien suchen…", "categories.matching": " passende", - "categories.titleFormulaHelp": "Erstellen Sie Produkttitel aus Variablen und statischem Text für diese Kategorie.", - "categories.descriptionFormulaHelp": "Definieren Sie SEO-Metatext und Body-Abschnitte, die die KI für diese Kategorie erzeugen soll.", - "categories.loadingFormula": "Formel wird geladen…", + "categories.titleFormulaHelp": "Erstellen Sie Produkttitel aus Variablen und statischem Text für diese Kategorie.", + "categories.descriptionFormulaHelp": "Definieren Sie SEO-Metatext und Body-Abschnitte, die die KI für diese Kategorie erzeugen soll.", + "categories.loadingFormula": "Formel wird geladen…", "categories.titleFormulaSaved": "Titelformel erfolgreich gespeichert", "categories.titleFormulaRemoved": "Titelformel erfolgreich entfernt", "categories.titleFormulaSaveFailed": "Titelformel konnte nicht gespeichert werden", @@ -2902,8 +2903,8 @@ export const de: MessageDict = { "categories.descriptionFormulaSavedWithExports": "Beschreibungsformel erfolgreich gespeichert und {count} Export-IDs synchronisiert", "categories.descriptionFormulaSaveFailed": "Beschreibungsformel konnte nicht gespeichert werden", "categories.descriptionFormulaAssignFailed": "Beschreibungsformel konnte nicht zugewiesen werden", - "categories.seoTitlePlaceholder": "Sagen Sie der KI, wie der SEO-Titel geschrieben werden soll…", - "categories.seoDescriptionPlaceholder": "Sagen Sie der KI, wie die SEO-Beschreibung geschrieben werden soll…", + "categories.seoTitlePlaceholder": "Sagen Sie der KI, wie der SEO-Titel geschrieben werden soll…", + "categories.seoDescriptionPlaceholder": "Sagen Sie der KI, wie die SEO-Beschreibung geschrieben werden soll…", "categories.sectionPromptPlaceholder": "Was soll die KI in diesem Abschnitt schreiben?", "categories.sectionKeyPlaceholder": "z. B. short_description (Buchstaben, Zahlen, _)", "categories.formulaElementTypes": "Formelelementtypen", @@ -2911,23 +2912,23 @@ export const de: MessageDict = { "categories.elementSeparator": "Elementtrenner", "categories.elementSeparatorHint": "Leerzeichen, Bindestrich usw.", "categories.dragToReorder": "Ziehen zum Neuordnen", - "categories.addCustomVariable": "Benutzerdefinierte Variable hinzufügen", + "categories.addCustomVariable": "Benutzerdefinierte Variable hinzufügen", "categories.editCustomVariable": "Benutzerdefinierte Variable bearbeiten", - "categories.customVariableHelp": "Definieren Sie eine wiederverwendbare Variable für Titelformeln.", + "categories.customVariableHelp": "Definieren Sie eine wiederverwendbare Variable für Titelformeln.", "categories.manageVariables": "Variablen verwalten", - "categories.manageVariablesHelp": "Variablen für Ihre Titelformeln anzeigen, bearbeiten und hinzufügen.", - "categories.searchVariables": "Variablen suchen…", - "categories.variableAdded": "Variable erfolgreich hinzugefügt", + "categories.manageVariablesHelp": "Variablen für Ihre Titelformeln anzeigen, bearbeiten und hinzufügen.", + "categories.searchVariables": "Variablen suchen…", + "categories.variableAdded": "Variable erfolgreich hinzugefügt", "categories.variableUpdated": "Variable erfolgreich aktualisiert", - "categories.variableDeleted": "Variable erfolgreich gelöscht", - "categories.variableDeleteFailed": "Variable konnte nicht gelöscht werden", + "categories.variableDeleted": "Variable erfolgreich gelöscht", + "categories.variableDeleteFailed": "Variable konnte nicht gelöscht werden", "categories.variableNameRequired": "Variablenname ist erforderlich", "categories.displayNameRequired": "Anzeigename ist erforderlich", "categories.variableNamePattern": "Der Name darf nur Buchstaben, Zahlen und Unterstriche enthalten", - "categories.deleteVariableConfirm": "Möchten Sie diese Variable wirklich löschen? Das kann Formeln betreffen, die sie verwenden.", - "categories.removeElementConfirm": "Möchten Sie dieses Element wirklich aus Ihrer Formel entfernen?", - "categories.addTextElement": "Textelement hinzufügen", - "categories.addTextElementHelp": "Fügen Sie Ihrer Formel ein statisches Textelement hinzu.", + "categories.deleteVariableConfirm": "Möchten Sie diese Variable wirklich löschen? Das kann Formeln betreffen, die sie verwenden.", + "categories.removeElementConfirm": "Möchten Sie dieses Element wirklich aus Ihrer Formel entfernen?", + "categories.addTextElement": "Textelement hinzufügen", + "categories.addTextElementHelp": "Fügen Sie Ihrer Formel ein statisches Textelement hinzu.", "categories.editTextElement": "Textelement bearbeiten", "categories.editTextElementHelp": "Bearbeiten Sie das Textelement in Ihrer Formel.", "categories.staticTextPlaceholder": "Statischen Text eingeben", @@ -2936,51 +2937,51 @@ export const de: MessageDict = { "categories.exampleWidget": "Acme Widget Pro (Beispiel)", "fields.title": "Standardfelder", "fields.description": "Definieren Sie Standard-Produktfelder und organisieren Sie sie in Gruppen", - "fields.loading": "Standardfelder werden geladen…", + "fields.loading": "Standardfelder werden geladen…", "fields.loadFailed": "Felder konnten nicht geladen werden", "fields.loadGroupsFailed": "Feldgruppen konnten nicht geladen werden", - "fields.addField": "Neues Feld hinzufügen", - "fields.addGroup": "Neue Gruppe hinzufügen", + "fields.addField": "Neues Feld hinzufügen", + "fields.addGroup": "Neue Gruppe hinzufügen", "fields.createField": "Feld erstellen", "fields.createGroup": "Gruppe erstellen", "fields.editField": "Feld bearbeiten", "fields.editGroup": "Gruppe bearbeiten", "fields.basicInfo": "Grundinformationen", - "fields.createFieldHelp": "Erstellen Sie ein neues Standardfeld für Ihre Produktdaten", + "fields.createFieldHelp": "Erstellen Sie ein neues Standardfeld für Ihre Produktdaten", "fields.editFieldHelp": "Aktualisieren Sie die Details dieses Standardfelds", - "fields.createGroupHelp": "Erstellen Sie eine neue Gruppe für Ihre Standardfelder", + "fields.createGroupHelp": "Erstellen Sie eine neue Gruppe für Ihre Standardfelder", "fields.editGroupHelp": "Aktualisieren Sie die Details dieser Feldgruppe", - "fields.dataTypeHint": "Datentyp für dieses Feld", + "fields.dataTypeHint": "Datentyp für dieses Feld", "fields.defaultValueOptional": "Standardwert (optional)", - "fields.fieldDescriptionPlaceholder": "Beschreibung für dieses Feld eingeben", - "fields.groupDescriptionPlaceholder": "Beschreibung für diese Gruppe eingeben", + "fields.fieldDescriptionPlaceholder": "Beschreibung für dieses Feld eingeben", + "fields.groupDescriptionPlaceholder": "Beschreibung für diese Gruppe eingeben", "fields.keyHint": "Nur Kleinbuchstaben, Zahlen und Unterstriche", "fields.exampleTitle": "Produkttitel", - "fields.noFields": "Keine Felder gefunden. Klicken Sie auf „Feld hinzufügen“, um eines zu erstellen.", + "fields.noFields": "Keine Felder gefunden. Klicken Sie auf „Feld hinzufügen“, um eines zu erstellen.", "fields.noFieldsMatch": "Keine Felder entsprechen Ihrer Suche", "fields.noGroups": "Keine Gruppen gefunden. Erstellen Sie Ihre erste Gruppe.", "fields.noGroupsMatch": "Keine Gruppen entsprechen Ihrer Suche", "fields.fieldCreated": "Feld erfolgreich erstellt", "fields.fieldUpdated": "Feld erfolgreich aktualisiert", - "fields.fieldDeleted": "Feld erfolgreich gelöscht", + "fields.fieldDeleted": "Feld erfolgreich gelöscht", "fields.groupCreated": "Gruppe erfolgreich erstellt", "fields.groupUpdated": "Gruppe erfolgreich aktualisiert", - "fields.groupDeleted": "Gruppe erfolgreich gelöscht", + "fields.groupDeleted": "Gruppe erfolgreich gelöscht", "fields.saveFieldFailed": "Feld konnte nicht gespeichert werden", "fields.saveGroupFailed": "Gruppe konnte nicht gespeichert werden", "fields.updateFieldFailed": "Feld konnte nicht aktualisiert werden", "fields.updateUnitFailed": "Einheit konnte nicht aktualisiert werden", - "fields.deleteFieldFailed": "Feld konnte nicht gelöscht werden", - "fields.deleteGroupFailed": "Gruppe konnte nicht gelöscht werden", + "fields.deleteFieldFailed": "Feld konnte nicht gelöscht werden", + "fields.deleteGroupFailed": "Gruppe konnte nicht gelöscht werden", "fields.bulkUpdateFailed": "Massenaktualisierung fehlgeschlagen", "fields.enableRecommendedFailed": "Empfohlene Felder konnten nicht aktiviert werden", "fields.enabledRecommended": "Empfohlene E-Commerce-Felder aktiviert", - "fields.deleteFieldConfirm": "Diese Aktion kann nicht rückgängig gemacht werden. Das Feld wird dauerhaft gelöscht und aus allen Vorlagen entfernt, die es verwenden.", - "fields.deleteGroupConfirm": "Diese Aktion kann nicht rückgängig gemacht werden. Die Gruppe wird dauerhaft gelöscht. Felder in dieser Gruppe müssen neu zugewiesen werden.", + "fields.deleteFieldConfirm": "Diese Aktion kann nicht rückgängig gemacht werden. Das Feld wird dauerhaft gelöscht und aus allen Vorlagen entfernt, die es verwenden.", + "fields.deleteGroupConfirm": "Diese Aktion kann nicht rückgängig gemacht werden. Die Gruppe wird dauerhaft gelöscht. Felder in dieser Gruppe müssen neu zugewiesen werden.", "fields.type.string": "Text", - "fields.type.stringHint": "Freitext — Namen, Codes, kurze Notizen", + "fields.type.stringHint": "Freitext — Namen, Codes, kurze Notizen", "fields.type.number": "Zahl", - "fields.type.numberHint": "Numerischer Wert; Einheit hinzufügen, wenn sinnvoll (EUR, pcs)", + "fields.type.numberHint": "Numerischer Wert; Einheit hinzufügen, wenn sinnvoll (EUR, pcs)", "fields.type.boolean": "Ja / Nein", "fields.type.booleanHint": "Wahr oder falsch", "fields.type.date": "Datum", @@ -2990,7 +2991,7 @@ export const de: MessageDict = { "fields.type.image": "Bild", "fields.type.imageHint": "Bild-URL oder Galeriebild", "fields.type.dimension": "Abmessung", - "fields.type.dimensionHint": "Längenmessung (Breite, Höhe, Tiefe)", + "fields.type.dimensionHint": "Längenmessung (Breite, Höhe, Tiefe)", "fields.type.weight": "Gewicht", "fields.type.weightHint": "Masse / Versandgewicht", "fields.type.color": "Farbe", @@ -2998,20 +2999,20 @@ export const de: MessageDict = { "fields.type.custom": "Benutzerdefiniert", "fields.type.customHint": "Spezielles / freies Feld", "empty.admin.knowledgeHeading": "Support-Wissen", - "empty.admin.translationsHeading": "Übersetzungen", + "empty.admin.translationsHeading": "Übersetzungen", "flash.attrs.createdLinkFailed": "Attribut erstellt, aber die Kategoriezuweisung ist fehlgeschlagen.", "flash.attrs.created": "Attribut erstellt.", "flash.attrs.csvImported": "CSV-Import abgeschlossen.", "flash.attrs.updated": "Attribut aktualisiert.", - "flash.attrs.deleted": "Attribut gelöscht.", - "flash.attrs.valueDeleted": "Wert gelöscht.", - "flash.attrs.assignedLinks": "{count} Kategorie–Attribut-Verknüpfung(en) zugewiesen.", + "flash.attrs.deleted": "Attribut gelöscht.", + "flash.attrs.valueDeleted": "Wert gelöscht.", + "flash.attrs.assignedLinks": "{count} Kategorie–Attribut-Verknüpfung(en) zugewiesen.", "flash.brand.saved": "Marken-Kit gespeichert.", "flash.brand.logoType": "Logo muss PNG, JPEG oder WebP sein", - "flash.brand.logoSize": "Logo überschreitet das 2-MiB-Limit", + "flash.brand.logoSize": "Logo überschreitet das 2-MiB-Limit", "flash.brand.logoUploaded": "Logo hochgeladen.", "flash.categories.updated": "Die Kategorie wurde erfolgreich aktualisiert.", - "flash.categories.deleted": "Die Kategorie wurde erfolgreich gelöscht.", + "flash.categories.deleted": "Die Kategorie wurde erfolgreich gelöscht.", "flash.categories.csvImported": "CSV-Import abgeschlossen.", "flash.products.csvImported": "Product CSV import finished.", "flash.categories.descFormulaAssigned": "Beschreibungsformel {count} Kategorien zugewiesen", @@ -3019,22 +3020,22 @@ export const de: MessageDict = { "flash.categories.promptNounOne": "Kategorie", "flash.categories.promptNounMany": "Kategorien", "flash.categories.titleFormulaAssigned": "Titelformel {count} {noun} zugewiesen", - "flash.categories.variableDeleted": "Variable erfolgreich gelöscht", + "flash.categories.variableDeleted": "Variable erfolgreich gelöscht", "flash.export.updated": "Export-Feed aktualisiert.", "flash.export.created": "Export-Feed erstellt.", - "flash.export.urlCopied": "Öffentliche {format}-Feed-URL kopiert. Fügen Sie sie in jedes System ein, das Produktfeeds abruft.", + "flash.export.urlCopied": "Öffentliche {format}-Feed-URL kopiert. Fügen Sie sie in jedes System ein, das Produktfeeds abruft.", "flash.export.copyFailed": "URL konnte nicht in die Zwischenablage kopiert werden", "flash.export.refreshed": "Feed aktualisiert.", "flash.export.refreshedWithCount": "Feed aktualisiert ({count} Produkte).", - "flash.export.deleted": "Export-Feed erfolgreich gelöscht.", + "flash.export.deleted": "Export-Feed erfolgreich gelöscht.", "flash.export.tokenRotated": "Oeffentliches Feed-URL-Token rotiert. Systeme mit der alten URL aktualisieren.", "common.edit": "Bearbeiten", - "common.previous": "Zurück", + "common.previous": "Zurück", "common.next": "Weiter", - "common.saving": "Speichern…", - "common.deleting": "Löschen…", - "common.adding": "Wird hinzugefügt…", - "common.processing": "Verarbeitung…", + "common.saving": "Speichern…", + "common.deleting": "Löschen…", + "common.adding": "Wird hinzugefügt…", + "common.processing": "Verarbeitung…", "common.upload": "Hochladen", "common.expand": "Erweitern", "common.collapse": "Einklappen", @@ -3047,62 +3048,62 @@ export const de: MessageDict = { "common.unit": "Einheit", "common.group": "Gruppe", "common.search": "Suchen", - "common.openMenu": "Menü öffnen", + "common.openMenu": "Menü öffnen", "common.areYouSure": "Sind Sie sicher?", - "common.selectGroup": "Gruppe auswählen", - "attributes.addAttribute": "Attribut hinzufügen", - "attributes.searchPlaceholder": "Attribute suchen…", + "common.selectGroup": "Gruppe auswählen", + "attributes.addAttribute": "Attribut hinzufügen", + "attributes.searchPlaceholder": "Attribute suchen…", "attributes.searchAria": "Attribute suchen (Eingabetaste zum Suchen)", "attributes.filterCategoryAria": "Nach Kategorie filtern", "attributes.allCategories": "Alle Kategorien", "attributes.col.name": "Bezeichnung", - "attributes.col.key": "Attributschlüssel", + "attributes.col.key": "Attributschlüssel", "attributes.col.type": "Typ", "attributes.col.unit": "Einheit", "attributes.col.categories": "Kategorien", "attributes.col.updated": "Zuletzt aktualisiert", "attributes.col.actions": "Aktionen", "attributes.emptyTitle": "Keine Attribute gefunden", - "attributes.emptyFiltered": "Versuchen Sie, die Suche oder den Kategoriefilter zu löschen.", - "attributes.emptyHint": "Fügen Sie ein Attribut hinzu oder importieren Sie eine CSV, um zu starten.", + "attributes.emptyFiltered": "Versuchen Sie, die Suche oder den Kategoriefilter zu löschen.", + "attributes.emptyHint": "Fügen Sie ein Attribut hinzu oder importieren Sie eine CSV, um zu starten.", "attributes.noValues": "Keine Werte", "attributes.actionsAria": "Attributaktionen", "attributes.editDetails": "Details bearbeiten", "attributes.loadingValues": "Werte werden geladen...", - "attributes.noValuesYetHint": "Noch keine Werte hinzugefügt. Nutzen Sie „Manage Values“, um Werte hinzuzufügen.", + "attributes.noValuesYetHint": "Noch keine Werte hinzugefügt. Nutzen Sie „Manage Values“, um Werte hinzuzufügen.", "attributes.pageZero": "0 Attribute", - "attributes.pageShowing": "Anzeige {from}–{to} von {total} Attributen", - "attributes.linkCategoryFailed": "Attribut konnte der ausgewählten Kategorie nicht zugewiesen werden.", + "attributes.pageShowing": "Anzeige {from}–{to} von {total} Attributen", + "attributes.linkCategoryFailed": "Attribut konnte der ausgewählten Kategorie nicht zugewiesen werden.", "attributes.createdLinkFailed": "Attribut erstellt, aber die Kategoriezuweisung ist fehlgeschlagen.", "attributes.createFailed": "Erstellen fehlgeschlagen", "attributes.importFinished": "CSV-Import abgeschlossen.", "attributes.importFailed": "Import fehlgeschlagen", "attributes.updateFailed": "Aktualisierung fehlgeschlagen", - "attributes.deleteFailed": "Löschen fehlgeschlagen", + "attributes.deleteFailed": "Löschen fehlgeschlagen", "attributes.valueUpdated": "Wert aktualisiert.", - "attributes.valueAdded": "Wert hinzugefügt.", + "attributes.valueAdded": "Wert hinzugefügt.", "attributes.valueSaveFailed": "Wert konnte nicht gespeichert werden", - "attributes.valueDeleted": "Wert gelöscht.", - "attributes.valueDeleteFailed": "Wert konnte nicht gelöscht werden", + "attributes.valueDeleted": "Wert gelöscht.", + "attributes.valueDeleteFailed": "Wert konnte nicht gelöscht werden", "attributes.csvNeedRows": "CSV muss eine Kopfzeile und mindestens eine Zeile enthalten", "attributes.rowUnknown": "Zeile {row}: unbekannte Kategorie oder Attribut", "attributes.rowLinkFailed": "Zeile {row}: {detail}", - "attributes.linkFailedShort": "Verknüpfung fehlgeschlagen", - "attributes.assignedLinks": "{count} Kategorie–Attribut-Verknüpfung(en) zugewiesen.", + "attributes.linkFailedShort": "Verknüpfung fehlgeschlagen", + "attributes.assignedLinks": "{count} Kategorie–Attribut-Verknüpfung(en) zugewiesen.", "attributes.rowsFailed": "{count} Zeile(n) fehlgeschlagen.", - "attributes.addTitle": "Neues Attribut hinzufügen", - "attributes.addDesc": "Erstellen Sie eine neue Attributdefinition. Sie können sie während der Erstellung einer Kategorie zuweisen.", + "attributes.addTitle": "Neues Attribut hinzufügen", + "attributes.addDesc": "Erstellen Sie eine neue Attributdefinition. Sie können sie während der Erstellung einer Kategorie zuweisen.", "attributes.tab.single": "Einzeln", "attributes.tab.bulk": "Massenimport", - "attributes.field.key": "Attributschlüssel", + "attributes.field.key": "Attributschlüssel", "attributes.field.keyPlaceholder": "Attribut-key", "attributes.field.displayName": "Anzeigename", "attributes.field.displayNamePlaceholder": "Anzeigename des Attributs", "attributes.field.type": "Typ", - "attributes.field.typeDefaultHint": "Wählen Sie, wie Werte für dieses Attribut eingegeben werden.", + "attributes.field.typeDefaultHint": "Wählen Sie, wie Werte für dieses Attribut eingegeben werden.", "attributes.field.category": "Kategorie", - "attributes.field.categoryPlaceholder": "Kategorie auswählen…", - "attributes.field.categoryHint": "Wählen Sie die Kategorie, zu der dieses Attribut gehört. Attribute sollten einer Kategorie zugewiesen werden.", + "attributes.field.categoryPlaceholder": "Kategorie auswählen…", + "attributes.field.categoryHint": "Wählen Sie die Kategorie, zu der dieses Attribut gehört. Attribute sollten einer Kategorie zugewiesen werden.", "attributes.field.unitOptional": "Einheit (optional)", "attributes.field.unitPlaceholder": "z. B. cm, kg usw.", "attributes.field.exampleOptional": "Beispiel (optional)", @@ -3117,71 +3118,71 @@ export const de: MessageDict = { "attributes.bulk.col.valueType": "string (Text), number, boolean (Ja/Nein), date, list (Dropdown), multiselect", "attributes.bulk.col.categoryId": "Eindeutige Kategorie-ID", "attributes.bulk.col.unitExample": "optional", - "attributes.bulk.col.parentKey": "Elternschlüssel für Listenwerte", + "attributes.bulk.col.parentKey": "Elternschlüssel für Listenwerte", "attributes.editTitle": "Attribut bearbeiten", - "attributes.editDesc": "Details für Attribut „{name}“ aktualisieren", - "attributes.field.keyHint": "Eindeutiger Bezeichner für dieses Attribut", + "attributes.editDesc": "Details für Attribut „{name}“ aktualisieren", + "attributes.field.keyHint": "Eindeutiger Bezeichner für dieses Attribut", "attributes.field.displayNameHint": "Der Name, der den Benutzern angezeigt wird", - "attributes.deleteTitle": "Attribut löschen", - "attributes.deleteDesc": "Möchten Sie „{name}“ wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", - "attributes.deleteWarningValues": "Warnung: Dadurch werden auch alle mit diesem Attribut verknüpften Werte gelöscht.", - "attributes.manageTitleNamed": "Werte für {name} verwalten", + "attributes.deleteTitle": "Attribut löschen", + "attributes.deleteDesc": "Möchten Sie „{name}“ wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", + "attributes.deleteWarningValues": "Warnung: Dadurch werden auch alle mit diesem Attribut verknüpften Werte gelöscht.", + "attributes.manageTitleNamed": "Werte für {name} verwalten", "attributes.manageTitle": "Werte verwalten", - "attributes.manageDesc": "Werte für dieses Listenattribut hinzufügen, bearbeiten oder entfernen.", - "attributes.valueKey": "Wertschlüssel", - "attributes.valueKeyHint": "Eindeutiger Bezeichner für diesen Wert", + "attributes.manageDesc": "Werte für dieses Listenattribut hinzufügen, bearbeiten oder entfernen.", + "attributes.valueKey": "Wertschlüssel", + "attributes.valueKeyHint": "Eindeutiger Bezeichner für diesen Wert", "attributes.displayValue": "Anzeigewert", "attributes.displayValuePlaceholder": "Anzuzeigender Wert", - "attributes.displayValueHint": "Der Anzeigename, der für diesen Wert angezeigt wird", + "attributes.displayValueHint": "Der Anzeigename, der für diesen Wert angezeigt wird", "attributes.updateValue": "Wert aktualisieren", "attributes.noValuesYet": "Noch keine Werte.", "attributes.assignTitle": "Attribute Kategorien zuweisen", - "attributes.assignDesc": "Laden Sie eine CSV hoch, die eindeutige Kategorie-IDs Attributschlüsseln zuordnet.", + "attributes.assignDesc": "Laden Sie eine CSV hoch, die eindeutige Kategorie-IDs Attributschlüsseln zuordnet.", "attributes.downloadTemplate": "Vorlage herunterladen", "attributes.csvFile": "CSV-Datei", "attributes.assignSuccess": "Zuweisungen erfolgreich angewendet.", - "attributes.assigning": "Zuweisen…", + "attributes.assigning": "Zuweisen…", "attributes.uploadAndAssign": "Hochladen & zuweisen", "attributes.type.string.label": "Text", - "attributes.type.string.hint": "Freitext — Namen, Modelle, kurze Notizen", + "attributes.type.string.hint": "Freitext — Namen, Modelle, kurze Notizen", "attributes.type.number.label": "Zahl", - "attributes.type.number.hint": "Numerischer Wert; Einheit hinzufügen, wenn sinnvoll (cm, kg, W)", + "attributes.type.number.hint": "Numerischer Wert; Einheit hinzufügen, wenn sinnvoll (cm, kg, W)", "attributes.type.boolean.label": "Ja / Nein", - "attributes.type.boolean.hint": "Wahr oder falsch — z. B. hat GPS, kabelloses Laden", + "attributes.type.boolean.hint": "Wahr oder falsch — z. B. hat GPS, kabelloses Laden", "attributes.type.date.label": "Datum", - "attributes.type.date.hint": "Ein Kalenderdatum (Veröffentlichung, Garantieende, …)", + "attributes.type.date.hint": "Ein Kalenderdatum (Veröffentlichung, Garantieende, …)", "attributes.type.list.label": "Dropdown", - "attributes.type.list.hint": "Wählen Sie genau eine Option aus einer definierten Liste", + "attributes.type.list.hint": "Wählen Sie genau eine Option aus einer definierten Liste", "attributes.type.multiselect.label": "Mehrfachauswahl", - "attributes.type.multiselect.hint": "Wählen Sie eine oder mehrere Optionen aus einer Liste", + "attributes.type.multiselect.hint": "Wählen Sie eine oder mehrere Optionen aus einer Liste", "standardFields.title": "Standardfelder", "standardFields.description": "Definieren Sie Standard-Produktfelder und organisieren Sie sie in Gruppen", - "standardFields.apiUnavailable": "Die Standardfelder-API ist nicht verfügbar. Änderungen können nicht gespeichert werden.", + "standardFields.apiUnavailable": "Die Standardfelder-API ist nicht verfügbar. Änderungen können nicht gespeichert werden.", "standardFields.apiUnreachable": "Die Standardfelder-API ist derzeit nicht erreichbar. Erstellen/Bearbeiten bleibt deaktiviert, bis /api/standard-fields und /api/field-groups antworten.", - "standardFields.loading": "Standardfelder werden geladen…", + "standardFields.loading": "Standardfelder werden geladen…", "standardFields.tab.fields": "Felder", "standardFields.tab.groups": "Gruppen", "standardFields.heading": "Standardfelder", - "standardFields.headingHint": "Felder für Zuordnung und Verarbeitung aktivieren — ein Schalter pro Zeile.", + "standardFields.headingHint": "Felder für Zuordnung und Verarbeitung aktivieren — ein Schalter pro Zeile.", "standardFields.enableRecommended": "Empfohlene aktivieren", "standardFields.enableSelected": "Auswahl aktivieren ({count})", "standardFields.disableSelected": "Auswahl deaktivieren", - "standardFields.addField": "Feld hinzufügen", + "standardFields.addField": "Feld hinzufügen", "standardFields.searchFields": "Felder suchen...", "standardFields.col.enabled": "Aktiviert", "standardFields.col.name": "Bezeichnung", - "standardFields.col.key": "Schlüssel", + "standardFields.col.key": "Schlüssel", "standardFields.col.type": "Typ", "standardFields.col.unit": "Einheit", "standardFields.col.group": "Gruppe", "standardFields.col.status": "Zustand", "standardFields.emptySearch": "Keine Felder entsprechen Ihrer Suche", - "standardFields.emptyHint": "Keine Felder gefunden. Klicken Sie auf „Feld hinzufügen“, um eines zu erstellen.", - "standardFields.selectFieldAria": "{name} auswählen", + "standardFields.emptyHint": "Keine Felder gefunden. Klicken Sie auf „Feld hinzufügen“, um eines zu erstellen.", + "standardFields.selectFieldAria": "{name} auswählen", "standardFields.enableFieldAria": "{name} aktivieren", - "standardFields.systemFieldTitle": "Systemfeld — kann nicht gelöscht werden", + "standardFields.systemFieldTitle": "Systemfeld — kann nicht gelöscht werden", "standardFields.groupsHeading": "Feldgruppen", - "standardFields.addGroup": "Gruppe hinzufügen", + "standardFields.addGroup": "Gruppe hinzufügen", "standardFields.searchGroups": "Gruppen suchen...", "standardFields.col.description": "Beschreibung", "standardFields.col.displayOrder": "Anzeigereihenfolge", @@ -3202,63 +3203,63 @@ export const de: MessageDict = { "standardFields.bulkFailed": "Massenaktualisierung fehlgeschlagen", "standardFields.recommendedEnabled": "Empfohlene E-Commerce-Felder aktiviert", "standardFields.recommendedFailed": "Empfohlene Felder konnten nicht aktiviert werden", - "standardFields.fieldDeleted": "Feld erfolgreich gelöscht", - "standardFields.deleteFieldFailed": "Feld konnte nicht gelöscht werden", + "standardFields.fieldDeleted": "Feld erfolgreich gelöscht", + "standardFields.deleteFieldFailed": "Feld konnte nicht gelöscht werden", "standardFields.groupUpdated": "Gruppe erfolgreich aktualisiert", "standardFields.groupCreated": "Gruppe erfolgreich erstellt", "standardFields.saveGroupFailed": "Gruppe konnte nicht gespeichert werden", - "standardFields.groupDeleted": "Gruppe erfolgreich gelöscht", - "standardFields.deleteGroupFailed": "Gruppe konnte nicht gelöscht werden", + "standardFields.groupDeleted": "Gruppe erfolgreich gelöscht", + "standardFields.deleteGroupFailed": "Gruppe konnte nicht gelöscht werden", "standardFields.editField": "Feld bearbeiten", - "standardFields.addNewField": "Neues Feld hinzufügen", + "standardFields.addNewField": "Neues Feld hinzufügen", "standardFields.editFieldDesc": "Aktualisieren Sie die Details dieses Standardfelds", - "standardFields.addFieldDesc": "Erstellen Sie ein neues Standardfeld für Ihre Produktdaten", + "standardFields.addFieldDesc": "Erstellen Sie ein neues Standardfeld für Ihre Produktdaten", "standardFields.field.name": "Bezeichnung", "standardFields.field.namePlaceholder": "Produkttitel", - "standardFields.field.nameHint": "Anzeigename für dieses Feld", - "standardFields.field.key": "Schlüssel", + "standardFields.field.nameHint": "Anzeigename für dieses Feld", + "standardFields.field.key": "Schlüssel", "standardFields.field.keyPlaceholder": "produkt_titel", "standardFields.field.keyTitle": "Nur Kleinbuchstaben, Zahlen und Unterstriche", "standardFields.field.keyHint": "Eindeutige Kennung (Kleinbuchstaben, keine Leerzeichen)", "standardFields.field.type": "Typ", - "standardFields.field.typeDefaultHint": "Datentyp für dieses Feld", + "standardFields.field.typeDefaultHint": "Datentyp für dieses Feld", "standardFields.field.group": "Gruppe", - "standardFields.field.groupHint": "Gruppe, zu der dieses Feld gehört", + "standardFields.field.groupHint": "Gruppe, zu der dieses Feld gehört", "standardFields.field.enabled": "Aktiviert", "standardFields.field.enabledHint": "Dieses Feld in Zuordnung und Verarbeitung verwenden", "standardFields.field.required": "Pflichtfeld", - "standardFields.field.requiredHint": "Pflichtfelder müssen in jedem Feed zugeordnet sein, bevor Produkte synchronisiert werden können.", + "standardFields.field.requiredHint": "Pflichtfelder müssen in jedem Feed zugeordnet sein, bevor Produkte synchronisiert werden können.", "standardFields.field.unit": "Einheit", - "standardFields.field.unitPlaceholder": "kg, EUR, cm…", + "standardFields.field.unitPlaceholder": "kg, EUR, cm…", "standardFields.field.unitHint": "Optionale Einheit, die mit diesem Feld angezeigt wird", "standardFields.field.description": "Beschreibung", - "standardFields.field.descriptionPlaceholder": "Beschreibung für dieses Feld eingeben", + "standardFields.field.descriptionPlaceholder": "Beschreibung für dieses Feld eingeben", "standardFields.field.default": "Standardwert", "standardFields.field.defaultPlaceholder": "Standardwert (optional)", "standardFields.field.defaultHint": "Standardwert, wenn kein Wert angegeben ist", - "standardFields.saveUnavailable": "Speichern (nicht verfügbar)", + "standardFields.saveUnavailable": "Speichern (nicht verfügbar)", "standardFields.updateField": "Feld aktualisieren", "standardFields.createField": "Feld erstellen", "standardFields.editGroup": "Gruppe bearbeiten", - "standardFields.addNewGroup": "Neue Gruppe hinzufügen", + "standardFields.addNewGroup": "Neue Gruppe hinzufügen", "standardFields.editGroupDesc": "Aktualisieren Sie die Details dieser Feldgruppe", - "standardFields.addGroupDesc": "Erstellen Sie eine neue Gruppe für Ihre Standardfelder", + "standardFields.addGroupDesc": "Erstellen Sie eine neue Gruppe für Ihre Standardfelder", "standardFields.group.name": "Bezeichnung", "standardFields.group.namePlaceholder": "Grundinformationen", - "standardFields.group.nameHint": "Anzeigename für diese Gruppe", + "standardFields.group.nameHint": "Anzeigename für diese Gruppe", "standardFields.group.description": "Beschreibung", - "standardFields.group.descriptionPlaceholder": "Beschreibung für diese Gruppe eingeben", + "standardFields.group.descriptionPlaceholder": "Beschreibung für diese Gruppe eingeben", "standardFields.group.descriptionHint": "Optionale Beschreibung des Zwecks dieser Gruppe", "standardFields.group.order": "Anzeigereihenfolge", "standardFields.group.orderHint": "Niedrigere Zahlen erscheinen zuerst", "standardFields.updateGroup": "Gruppe aktualisieren", "standardFields.createGroup": "Gruppe erstellen", - "standardFields.deleteFieldDesc": "Diese Aktion kann nicht rückgängig gemacht werden. Das Feld wird dauerhaft gelöscht und aus allen Vorlagen entfernt, die es verwenden.", - "standardFields.deleteGroupDesc": "Diese Aktion kann nicht rückgängig gemacht werden. Die Gruppe wird dauerhaft gelöscht. Felder in dieser Gruppe müssen neu zugewiesen werden.", + "standardFields.deleteFieldDesc": "Diese Aktion kann nicht rückgängig gemacht werden. Das Feld wird dauerhaft gelöscht und aus allen Vorlagen entfernt, die es verwenden.", + "standardFields.deleteGroupDesc": "Diese Aktion kann nicht rückgängig gemacht werden. Die Gruppe wird dauerhaft gelöscht. Felder in dieser Gruppe müssen neu zugewiesen werden.", "standardFields.type.string.label": "Text", - "standardFields.type.string.hint": "Freitext — Namen, Codes, kurze Notizen", + "standardFields.type.string.hint": "Freitext — Namen, Codes, kurze Notizen", "standardFields.type.number.label": "Zahl", - "standardFields.type.number.hint": "Numerischer Wert; Einheit hinzufügen, wenn sinnvoll (EUR, pcs)", + "standardFields.type.number.hint": "Numerischer Wert; Einheit hinzufügen, wenn sinnvoll (EUR, pcs)", "standardFields.type.boolean.label": "Ja / Nein", "standardFields.type.boolean.hint": "Wahr oder falsch", "standardFields.type.date.label": "Datum", @@ -3268,7 +3269,7 @@ export const de: MessageDict = { "standardFields.type.image.label": "Bild", "standardFields.type.image.hint": "Bild-URL oder Galeriebild", "standardFields.type.dimension.label": "Abmessung", - "standardFields.type.dimension.hint": "Längenmessung (Breite, Höhe, Tiefe)", + "standardFields.type.dimension.hint": "Längenmessung (Breite, Höhe, Tiefe)", "standardFields.type.weight.label": "Gewicht", "standardFields.type.weight.hint": "Masse / Versandgewicht", "standardFields.type.color.label": "Farbe", @@ -3283,52 +3284,52 @@ export const de: MessageDict = { "standardFields.fallback.price": "Preis", "standardFields.fallback.sale_price": "Aktionspreis", "standardFields.fallback.purchase_price": "Einkaufspreis", - "standardFields.fallback.currency": "Währung", + "standardFields.fallback.currency": "Währung", "standardFields.fallback.image_url": "Bild-URL", "standardFields.fallback.main_image": "Hauptbild", - "standardFields.fallback.additional_image_urls": "Zusätzliche Bilder", + "standardFields.fallback.additional_image_urls": "Zusätzliche Bilder", "standardFields.fallback.product_url": "Produkt-URL", "standardFields.fallback.official_link": "Offizieller Link", "standardFields.fallback.sku": "SKU", "standardFields.fallback.mpn": "MPN", "standardFields.fallback.category": "Kategorie", - "standardFields.fallback.availability": "Verfügbarkeit", + "standardFields.fallback.availability": "Verfügbarkeit", "standardFields.fallback.stock": "Bestand", "standardFields.fallback.color": "Farbe", - "standardFields.fallback.size": "Größe", + "standardFields.fallback.size": "Größe", "standardFields.fallback.material": "Material", "standardFields.fallback.warranty": "Garantie", "standardFields.fallback.service": "Service", "standardFields.fallback.weight": "Gewicht", "standardFields.fallback.net_depth": "Nettotiefe", - "standardFields.fallback.net_height": "Nettohöhe", + "standardFields.fallback.net_height": "Nettohöhe", "standardFields.fallback.net_width": "Nettubreite", "standardFields.fallback.net_mass": "Nettomasse", "standardFields.fallback.video_url": "Video-URL", "standardFields.fallback.eprel_id": "EPREL-ID", "standardFields.fallback.specs": "Spezifikationen", "standardFields.fallback.specifications": "Spezifikationen (Legacy)", - "standardFields.tip.gtin": "Global Trade Item Number — Barcode/EAN/UPC zur Produktidentifikation.", - "standardFields.tip.title": "Kundenorientierter Produktname in Katalogen und Kanälen.", - "standardFields.tip.brand": "Name des Herstellers oder der Marke (nicht des Händlers).", - "standardFields.tip.description": "Längerer Produkttext; für Anreicherung und Kanallistenungen.", + "standardFields.tip.gtin": "Global Trade Item Number — Barcode/EAN/UPC zur Produktidentifikation.", + "standardFields.tip.title": "Kundenorientierter Produktname in Katalogen und Kanälen.", + "standardFields.tip.brand": "Name des Herstellers oder der Marke (nicht des Händlers).", + "standardFields.tip.description": "Längerer Produkttext; für Anreicherung und Kanallistenungen.", "standardFields.tip.product_model": "Modellname/-nummer des Herstellers.", - "standardFields.tip.price": "Regulärer Verkaufspreis (numerisch; Währung separat zugeordnet).", + "standardFields.tip.price": "Regulärer Verkaufspreis (numerisch; Währung separat zugeordnet).", "standardFields.tip.sale_price": "Reduzierter oder Aktionspreis im Angebot.", "standardFields.tip.purchase_price": "Ihr Einkaufspreis (intern).", - "standardFields.tip.currency": "ISO-Währungscode für Preisfelder (z. B. EUR, USD).", - "standardFields.tip.image_url": "URL des primären Produktbilds.", + "standardFields.tip.currency": "ISO-Währungscode für Preisfelder (z. B. EUR, USD).", + "standardFields.tip.image_url": "URL des primären Produktbilds.", "standardFields.tip.main_image": "URL des Hauptgaleriebilds (Alias von image).", - "standardFields.tip.additional_image_urls": "Zusätzliche Bild-URLs (kommagetrennt oder wiederholte Knoten).", - "standardFields.tip.product_url": "Öffentliche Produktseiten-URL in Ihrem Shop oder auf Ihrer Site.", + "standardFields.tip.additional_image_urls": "Zusätzliche Bild-URLs (kommagetrennt oder wiederholte Knoten).", + "standardFields.tip.product_url": "Öffentliche Produktseiten-URL in Ihrem Shop oder auf Ihrer Site.", "standardFields.tip.official_link": "URL der Produktseite des Herstellers oder der Marke.", - "standardFields.tip.sku": "Stock Keeping Unit — Ihr interner Artikelcode.", - "standardFields.tip.mpn": "Manufacturer Part Number — Teilecode des Lieferanten.", + "standardFields.tip.sku": "Stock Keeping Unit — Ihr interner Artikelcode.", + "standardFields.tip.mpn": "Manufacturer Part Number — Teilecode des Lieferanten.", "standardFields.tip.category": "Produktkategorie oder Taxonomiepfad.", - "standardFields.tip.availability": "Status wie auf Lager / nicht vorrätig / Vorbestellung.", + "standardFields.tip.availability": "Status wie auf Lager / nicht vorrätig / Vorbestellung.", "standardFields.tip.stock": "Numerische Bestandsmenge.", - "standardFields.tip.color": "Farbattribut für Varianten.", - "standardFields.tip.size": "Größenattribut für Varianten.", + "standardFields.tip.color": "Farbattribut für Varianten.", + "standardFields.tip.size": "Größenattribut für Varianten.", "standardFields.tip.material": "Hauptmaterial oder Zusammensetzung.", "standardFields.tip.warranty": "Garantiezeitraum oder -text.", "standardFields.tip.service": "Service- oder Supportnotizen.", @@ -3336,45 +3337,45 @@ export const de: MessageDict = { "standardFields.tip.eprel_id": "Produktkennung des EU-Energielabels (EPREL).", "standardFields.tip.specs": "Strukturierte technische Spezifikationen.", "standardFields.tip.specifications": "Legacy-Specs-Feld; specs bevorzugen, wenn beides existiert.", - "export.dialog.title": "Ausgewählte Produkte exportieren", - "export.dialog.description": "{count} ausgewählte(s) Produkt(e) exportieren. Wählen Sie den Export-Feed für Format und Felder — wie „was synchronisieren“, aber für Download oder Partner-Feed.", + "export.dialog.title": "Ausgewählte Produkte exportieren", + "export.dialog.description": "{count} ausgewählte(s) Produkt(e) exportieren. Wählen Sie den Export-Feed für Format und Felder — wie „was synchronisieren“, aber für Download oder Partner-Feed.", "export.dialog.loadFailed": "Export-Feed-Optionen konnten nicht geladen werden. Bitte erneut versuchen.", - "export.dialog.selectPlaceholder": "Export-Feed auswählen…", + "export.dialog.selectPlaceholder": "Export-Feed auswählen…", "export.dialog.help": "Ihre Auswahl bestimmt die Produkte; der Feed bestimmt Kanalformat und gemappte Felder.", "export.dialog.emptyTitle": "Noch keine Export-Feeds", - "export.dialog.emptyMessage": "Erstellen Sie einen Export-Feed für Format und Felder und kehren Sie zurück, um diese Auswahl zu exportieren.", + "export.dialog.emptyMessage": "Erstellen Sie einen Export-Feed für Format und Felder und kehren Sie zurück, um diese Auswahl zu exportieren.", "export.dialog.createFeedCta": "Export-Feed erstellen", - "export.dialog.confirmAria": "Export bestätigen", + "export.dialog.confirmAria": "Export bestätigen", "export.dialog.export": "Exportieren", "billing.title": "Nutzung & Abrechnung", "billing.loadFailed": "Abrechnung konnte nicht geladen werden", "billing.usageLoadFailed": "Nutzung konnte nicht geladen werden", - "billing.checkoutComplete": "Checkout abgeschlossen. Plan und Credits werden in Kürze aktualisiert.", + "billing.checkoutComplete": "Checkout abgeschlossen. Plan und Credits werden in Kürze aktualisiert.", "billing.checkoutCompletePlan": "Plan aktualisiert. Ihre {plan}-Credits sind bereit.", - "billing.checkoutCanceled": "Checkout wurde abgebrochen. Es wurden keine Änderungen vorgenommen.", - "billing.portalReturned": "Zurück vom Abrechnungsportal. Verwalten Sie Ihren Plan hier oder unter Plans.", - "billing.comparePlans": "Pläne vergleichen", + "billing.checkoutCanceled": "Checkout wurde abgebrochen. Es wurden keine Änderungen vorgenommen.", + "billing.portalReturned": "Zurück vom Abrechnungsportal. Verwalten Sie Ihren Plan hier oder unter Plans.", + "billing.comparePlans": "Pläne vergleichen", "billing.managePayment": "Zahlung verwalten", - "billing.addCredits": "Credits hinzufügen", - "billing.addingCredits": "Wird hinzugefügt…", - "billing.addCreditsTitle": "Credits hinzufügen", - "billing.addCreditsDescription": "Nur Plattform-Admin. Credits sind sofort für KI-Titel, Beschreibungen und andere kostenpflichtige Schritte verfügbar.", + "billing.addCredits": "Credits hinzufügen", + "billing.addingCredits": "Wird hinzugefügt…", + "billing.addCreditsTitle": "Credits hinzufügen", + "billing.addCreditsDescription": "Nur Plattform-Admin. Credits sind sofort für KI-Titel, Beschreibungen und andere kostenpflichtige Schritte verfügbar.", "billing.creditAmount": "Credit-Betrag", - "billing.invalidCreditAmount": "Bitte geben Sie einen gültigen Credit-Betrag ein.", + "billing.invalidCreditAmount": "Bitte geben Sie einen gültigen Credit-Betrag ein.", "billing.companyNotFound": "Unternehmen nicht gefunden.", - "billing.creditsAdded": "{amount} Credits wurden hinzugefügt.", - "billing.addCreditsFailed": "Credits konnten nicht hinzugefügt werden. Plattform-Admin-Zugriff kann erforderlich sein.", + "billing.creditsAdded": "{amount} Credits wurden hinzugefügt.", + "billing.addCreditsFailed": "Credits konnten nicht hinzugefügt werden. Plattform-Admin-Zugriff kann erforderlich sein.", "billing.planApplied": "Plan angewendet. Ihre Credits sind bereit.", "billing.checkoutFailed": "Checkout fehlgeschlagen", - "billing.portalFailed": "Abrechnungsportal konnte nicht geöffnet werden", + "billing.portalFailed": "Abrechnungsportal konnte nicht geöffnet werden", "billing.noPlanAssigned": "Kein Plan zugewiesen", "billing.unlimited": "Unbegrenzt", "billing.payAsYouGo": "Pay as you go", "billing.noMonthlyAiCredits": "Keine monatlichen KI-Credits", - "billing.header.noPlan": "Noch kein Plan zugewiesen. Wählen Sie einen Plan oder fragen Sie einen Firmen-Admin.", + "billing.header.noPlan": "Noch kein Plan zugewiesen. Wählen Sie einen Plan oder fragen Sie einen Firmen-Admin.", "billing.header.free": "Feeds zuordnen und Produktdaten bereinigen ohne KI-Credits.", - "billing.header.enterprise": "Unbegrenzte Produkte und KI-Kapazität.", - "billing.header.payg": "Pay as you go — Credits kommen aus dem Firmen-Wallet.", + "billing.header.enterprise": "Unbegrenzte Produkte und KI-Kapazität.", + "billing.header.payg": "Pay as you go — Credits kommen aus dem Firmen-Wallet.", "billing.header.remaining": "{remaining} KI-Credits verbleiben in diesem Zeitraum.", "billing.na": "k. A.", "billing.range.7d": "letzte 7 Tage", @@ -3386,64 +3387,64 @@ export const de: MessageDict = { "billing.rangeOpt.cycle": "Aktueller Zyklus", "billing.rangeOpt.all": "Gesamt", "billing.freeBannerTitle": "Sie nutzen den Free-Plan", - "billing.freeBannerMessage": "Upgraden für KI-Titel und -Beschreibungen sowie höhere Produktlimits.", + "billing.freeBannerMessage": "Upgraden für KI-Titel und -Beschreibungen sowie höhere Produktlimits.", "billing.outOfCreditsTitle": "Ihre KI-Credits sind aufgebraucht", "billing.productLimitTitle": "Produktlimit erreicht", - "billing.outOfCreditsMessage": "KI-Titel und -Beschreibungen sind pausiert, bis Credits hinzugefügt oder ein Upgrade erfolgt.", - "billing.productLimitMessage": "Upgraden Sie für mehr Produktkapazität.", + "billing.outOfCreditsMessage": "KI-Titel und -Beschreibungen sind pausiert, bis Credits hinzugefügt oder ein Upgrade erfolgt.", + "billing.productLimitMessage": "Upgraden Sie für mehr Produktkapazität.", "billing.lowCreditsTitle": "Credits werden knapp", - "billing.lowCreditsMessage": "Nur noch {remaining} Credits auf {plan}. Upgraden Sie vor Ihrem nächsten großen Batch.", + "billing.lowCreditsMessage": "Nur noch {remaining} Credits auf {plan}. Upgraden Sie vor Ihrem nächsten großen Batch.", "billing.currentPlan": "Aktueller Plan", "billing.periodEnds": "Abrechnungszeitraum endet am {date}", "billing.openEndedContract": "Unbefristeter Vertrag", "billing.creditWallet": "Credit-Wallet", "billing.creditsRemaining": "Verbleibende Credits", - "billing.enterpriseCapacity": "Enterprise-verwaltete Kapazität", - "billing.paygUsed": "{used} verwendet · keine monatliche Zuteilung", + "billing.enterpriseCapacity": "Enterprise-verwaltete Kapazität", + "billing.paygUsed": "{used} verwendet · keine monatliche Zuteilung", "billing.trialLeftover": "Test- / Restcredits", "billing.aiLockedFree": "KI auf Free gesperrt", "billing.usedOf": "{used} von {total} verwendet", "billing.noBalanceTitle": "Noch kein Credit-Saldo", - "billing.noBalanceBody": "Die Credits Ihres Plans erscheinen hier, sobald die Abrechnung für diesen Workspace eingerichtet ist.", - "billing.needCapacity": "Mehr Kapazität nötig?", + "billing.noBalanceBody": "Die Credits Ihres Plans erscheinen hier, sobald die Abrechnung für diesen Workspace eingerichtet ist.", + "billing.needCapacity": "Mehr Kapazität nötig?", "billing.selfServeUpgrade": "Self-Service-Upgrade auf Starter, Growth oder Business", - "billing.viaStripe": "über Stripe", - "billing.checkoutUnavailable": "Selbstbedienungskäufe sind nicht verfügbar, bis Stripe eingerichtet ist. Kontaktieren Sie den Vertrieb für einen Plan.", + "billing.viaStripe": "über Stripe", + "billing.checkoutUnavailable": "Selbstbedienungskäufe sind nicht verfügbar, bis Stripe eingerichtet ist. Kontaktieren Sie den Vertrieb für einen Plan.", "billing.upgradeToGrowth": "Auf Growth upgraden", - "billing.askAdminPlan": "Bitten Sie einen Firmen-Admin, den Plan zu ändern.", + "billing.askAdminPlan": "Bitten Sie einen Firmen-Admin, den Plan zu ändern.", "billing.usage": "Nutzung", - "billing.productsProcessed": "{count} Produkte verarbeitet · {range}", - "billing.updating": "Aktualisierung…", + "billing.productsProcessed": "{count} Produkte verarbeitet · {range}", + "billing.updating": "Aktualisierung…", "billing.productsByDay": "Produkte pro Tag", "billing.chartAmber": "Amber = Tokens. Bereich: {range}.", "billing.chartRange": "Bereich: {range}.", "billing.nothingToChartTitle": "Noch nichts zu diagrammieren", - "billing.nothingToChartBody": "Produkte hinzufügen oder einen Feed verbinden — die Nutzung erscheint hier.", - "billing.dailyChartsHint": "Tagesdiagramme sind für die letzten 7 Tage, 30 Tage oder den aktuellen Abrechnungszyklus verfügbar.", + "billing.nothingToChartBody": "Produkte hinzufügen oder einen Feed verbinden — die Nutzung erscheint hier.", + "billing.dailyChartsHint": "Tagesdiagramme sind für die letzten 7 Tage, 30 Tage oder den aktuellen Abrechnungszyklus verfügbar.", "billing.noNewProducts": "Keine neuen Produkte in {range}", "billing.catalogOverall": "Der Katalog hat insgesamt {count} Produkte.", "billing.chartProducts": "Produkte", "billing.chartTokens": "Token-Einheiten", "billing.chartEmpty": "Keine Produkte in diesem Zeitraum.", - "billing.adminStats": "{tokens} Tokens · {jobs} Jobs · {input} Input- / {export} Export-Feeds", + "billing.adminStats": "{tokens} Tokens · {jobs} Jobs · {input} Input- / {export} Export-Feeds", "billing.whatUsesCredits": "Was Credits verbraucht", "billing.burnsCredits": "Verbraucht Credits", "billing.noCreditCost": "Keine Credit-Kosten", - "billing.publicPricing": "Öffentliche Preise", - "billing.managePlanOnPlans": "Plan unter Pläne verwalten", - "billing.recovery.pastDueTitle": "Zahlung überfällig", - "billing.recovery.pastDueAdmin": "Ihre Abonnementzahlung ist fehlgeschlagen. Aktualisieren Sie die Zahlung im Customer Portal — der Zugang bleibt in dieser Schonfrist offen.", + "billing.publicPricing": "Öffentliche Preise", + "billing.managePlanOnPlans": "Plan unter Pläne verwalten", + "billing.recovery.pastDueTitle": "Zahlung überfällig", + "billing.recovery.pastDueAdmin": "Ihre Abonnementzahlung ist fehlgeschlagen. Aktualisieren Sie die Zahlung im Customer Portal — der Zugang bleibt in dieser Schonfrist offen.", "billing.recovery.pastDueMember": "Abrechnung erfordert Aufmerksamkeit. Bitten Sie einen Firmen-Admin, die Zahlung im Customer Portal zu aktualisieren. Der Zugang bleibt in dieser Schonfrist offen.", - "billing.recovery.openPortal": "Customer Portal öffnen", + "billing.recovery.openPortal": "Customer Portal öffnen", "billing.recovery.contactAdmin": "Firmen-Admin kontaktieren", "billing.recovery.goToBilling": "Zur Abrechnung", "billing.recovery.missingPlanTitle": "Kein Plan zugewiesen", - "billing.recovery.missingPlanMessage": "Dieses Unternehmen hat keinen aktiven Plan (oft nach einer übersprungenen Migration). Weisen Sie einen Plan über Checkout zu oder fragen Sie den Support — gehen Sie nicht von Unlimited-Kapazität aus.", - "billing.recovery.choosePlan": "Plan wählen", + "billing.recovery.missingPlanMessage": "Dieses Unternehmen hat keinen aktiven Plan (oft nach einer übersprungenen Migration). Weisen Sie einen Plan über Checkout zu oder fragen Sie den Support — gehen Sie nicht von Unlimited-Kapazität aus.", + "billing.recovery.choosePlan": "Plan wählen", "billing.upgrade": "Upgrade", "billing.askCompanyAdmin": "Fragen Sie einen Unternehmens-Admin", - "billing.memberHint": "Nur Firmen-Admins können Pläne ändern oder Checkout öffnen.", - "billing.unlimitedPlanWallet": "Unbegrenzter Plan · Wallet {wallet}", + "billing.memberHint": "Nur Firmen-Admins können Pläne ändern oder Checkout öffnen.", + "billing.unlimitedPlanWallet": "Unbegrenzter Plan · Wallet {wallet}", "billing.creditsSuffix": "{label} Credits", "billing.perMonth": "{amount} / Monat", "billing.zeroPerMonth": "0 / Monat", @@ -3455,57 +3456,57 @@ export const de: MessageDict = { "billing.planKind.enterprise": "Enterprise / individuell", "billing.planKind.trial": "Testphase", "billing.planKind.standard": "Standardplan", - "billing.creditUsage.normalize.label": "Normalisieren, Specs & füllen", - "billing.creditUsage.normalize.detail": "Datenbereinigung und Attributfüllung laufen ohne Verbrauch von KI-Credits.", + "billing.creditUsage.normalize.label": "Normalisieren, Specs & füllen", + "billing.creditUsage.normalize.detail": "Datenbereinigung und Attributfüllung laufen ohne Verbrauch von KI-Credits.", "billing.creditUsage.ai.label": "KI-Titel & -Beschreibungen", "billing.creditUsage.ai.detail": "Abrechnung pro Produkt basierend auf der KI-Funktion und der generierten Textmenge.", "billing.creditUsage.eprel.label": "EPREL / Energieetiketten", - "billing.creditUsage.eprel.detail": "Kostenlose öffentliche EU-EPREL-Daten auf allen Plänen (ohne Credits).", + "billing.creditUsage.eprel.detail": "Kostenlose öffentliche EU-EPREL-Daten auf allen Plänen (ohne Credits).", "billing.creditUsage.campaign.label": "Kampagnen-KI & Markenanwendung", "billing.creditUsage.campaign.detail": "Kostenpflichtige KI-Schritte mit dem verwalteten Modell verbrauchen Firmen-Credits.", "exports.title": "Export-Feeds", - "exports.description": "Legen Sie pro Kanal fest, was veröffentlicht wird — welche Produkte und Felder — und teilen Sie eine öffentliche Feed-URL (ohne Login).", - "exports.descriptionFiltered": "Öffentliche Google Shopping-, Meta- und benutzerdefinierte Feed-Links. Anzeige {filtered} von {total} Feeds.", + "exports.description": "Legen Sie pro Kanal fest, was veröffentlicht wird — welche Produkte und Felder — und teilen Sie eine öffentliche Feed-URL (ohne Login).", + "exports.descriptionFiltered": "Öffentliche Google Shopping-, Meta- und benutzerdefinierte Feed-Links. Anzeige {filtered} von {total} Feeds.", "exports.loadFailed": "Export-Feeds konnten nicht geladen werden", "exports.loadFeedFailed": "Export-Feed konnte nicht geladen werden", "exports.refresh": "Aktualisieren", - "exports.refreshing": "Aktualisieren…", + "exports.refreshing": "Aktualisieren…", "exports.create": "Export-Feed erstellen", "exports.edit": "Export-Feed bearbeiten", "exports.editDescription": "Name, Status, enthaltene Produkte und gemappte Felder aktualisieren.", - "exports.howToTitle": "So wählen Sie, was exportiert wird", + "exports.howToTitle": "So wählen Sie, was exportiert wird", "exports.howTo.choose": "Was in den Feed kommt", - "exports.howTo.chooseBody": "— Quell-Feed und Produktstatus beim Erstellen/Bearbeiten setzen, damit die öffentliche URL nur diese Produkte enthält.", + "exports.howTo.chooseBody": "— Quell-Feed und Produktstatus beim Erstellen/Bearbeiten setzen, damit die öffentliche URL nur diese Produkte enthält.", "exports.howTo.subset": "Einmalige Teilmenge", - "exports.howTo.subsetBody": "— unter", + "exports.howTo.subsetBody": "— unter", "exports.howTo.productsLink": "Produkte", - "exports.howTo.subsetTail": " Zeilen auswählen und Exportieren, um nur diese Produkte mit Format und Feldern des Feeds herunterzuladen.", + "exports.howTo.subsetTail": " Zeilen auswählen und Exportieren, um nur diese Produkte mit Format und Feldern des Feeds herunterzuladen.", "exports.howTo.google": "Google Shopping", - "exports.howTo.googleBody": "— erstellen Sie eine CSV- oder XML-Voreinstellung, Generate, kopieren Sie die öffentliche URL in Merchant Center → Products → Feeds → scheduled fetch.", + "exports.howTo.googleBody": "— erstellen Sie eine CSV- oder XML-Voreinstellung, Generate, kopieren Sie die öffentliche URL in Merchant Center → Products → Feeds → scheduled fetch.", "exports.howTo.meta": "Meta-Katalog", - "exports.howTo.metaBody": "— CSV-Voreinstellung für Commerce Manager-Datenquellen.", + "exports.howTo.metaBody": "— CSV-Voreinstellung für Commerce Manager-Datenquellen.", "exports.howTo.custom": "Benutzerdefiniertes CSV/XML", - "exports.howTo.customBody": "— jeder Partner; dieselbe öffentliche URL funktioniert für Cron-/Webhook-Poller.", + "exports.howTo.customBody": "— jeder Partner; dieselbe öffentliche URL funktioniert für Cron-/Webhook-Poller.", "exports.howTo.rest": "REST", - "exports.howTo.restBody": "— API-Schlüssel unter", - "exports.howTo.settingsApiKeys": "Einstellungen → API-Schlüssel", - "exports.howTo.restTail": "(Legacy-Schlüssel nicht migriert) pull", + "exports.howTo.restBody": "— API-Schlüssel unter", + "exports.howTo.settingsApiKeys": "Einstellungen → API-Schlüssel", + "exports.howTo.restTail": "(Legacy-Schlüssel nicht migriert) pull", "exports.howTo.openapi": "OpenAPI", "exports.feedStatus": "Feed-Status", - "exports.generating": "Export wird generiert — bei großen Katalogen kann das einen Moment dauern.", + "exports.generating": "Export wird generiert — bei großen Katalogen kann das einen Moment dauern.", "exports.generationFailed": "Generierung fehlgeschlagen. Siehe den Fehler oben, dann Refresh Feed erneut versuchen.", "exports.exportedProducts": "{count} Produkte exportiert", "exports.lastGenerated": "Zuletzt generiert: {time}", "exports.neverGenerated": "Noch nie generiert", "exports.searchPlaceholder": "Feeds suchen...", "exports.searchAria": "Feeds suchen", - "exports.clearSearch": "Suche löschen", - "exports.loading": "Feeds werden geladen…", + "exports.clearSearch": "Suche löschen", + "exports.loading": "Feeds werden geladen…", "exports.loadErrorTitle": "Export-Feeds konnten nicht geladen werden", - "exports.loadErrorBody": "Beim Laden Ihrer Exporte ist etwas schiefgelaufen. Erneut versuchen oder den Fehler oben für Details prüfen.", + "exports.loadErrorBody": "Beim Laden Ihrer Exporte ist etwas schiefgelaufen. Erneut versuchen oder den Fehler oben für Details prüfen.", "exports.tryAgain": "Erneut versuchen", "exports.emptyTitle": "Noch keine Export-Feeds", - "exports.emptyBody": "Erstellen Sie einen Google-Shopping-, Meta- oder eigenen CSV/XML-Feed, um festzulegen, welche Produkte und Felder ausgegeben werden. Öffentliche URL für Merchant Center oder Partner erzeugen — oder eine Auswahl unter Produkte exportieren.", + "exports.emptyBody": "Erstellen Sie einen Google-Shopping-, Meta- oder eigenen CSV/XML-Feed, um festzulegen, welche Produkte und Felder ausgegeben werden. Öffentliche URL für Merchant Center oder Partner erzeugen — oder eine Auswahl unter Produkte exportieren.", "exports.emptyCta": "Google-Shopping-Feed erstellen", "exports.noMatchTitle": "Keine passenden Feeds", "exports.noMatchBody": "Versuchen Sie einen anderen Suchbegriff.", @@ -3515,106 +3516,106 @@ export const de: MessageDict = { "exports.col.lastGenerated": "Zuletzt generiert", "exports.col.status": "Zustand", "exports.col.actions": "Aktionen", - "exports.working": "Läuft.", - "exports.generatingShort": "Wird generiert…", + "exports.working": "Läuft.", + "exports.generatingShort": "Wird generiert…", "exports.copyUrl": "URL kopieren", - "exports.openMenu": "Menü öffnen", + "exports.openMenu": "Menü öffnen", "exports.preview": "Vorschau", "exports.download": "Herunterladen", "exports.refreshFeed": "Feed aktualisieren", "exports.editAction": "Bearbeiten", - "exports.delete": "Löschen", + "exports.delete": "Löschen", "exports.rotateToken": "URL-Token rotieren", "exports.rotateFailed": "Feed-URL-Token konnte nicht rotiert werden", - "exports.deleting": "Löschen…", + "exports.deleting": "Löschen…", "exports.channelPreset": "Kanal-Voreinstellung", "exports.name": "Bezeichnung", "exports.format": "Format", "exports.sourceFeed": "Quell-Feed (optional)", - "exports.sourceFeedHelp": "Diesen Feed auf Produkte eines Eingabe-Feeds beschränken oder Alle Produkte lassen — so steuern Sie, was die öffentliche URL enthält.", + "exports.sourceFeedHelp": "Diesen Feed auf Produkte eines Eingabe-Feeds beschränken oder Alle Produkte lassen — so steuern Sie, was die öffentliche URL enthält.", "exports.allProducts": "Alle Produkte", "exports.rootElement": "Root-Element", "exports.itemElement": "Item-Element", "exports.productStatuses": "Produktstatus (kommagetrennt)", - "exports.productStatusesHelp": "Nur Produkte mit diesen Statuswerten einbeziehen (z. B. active). Leer lassen für alle Statuswerte.", + "exports.productStatusesHelp": "Nur Produkte mit diesen Statuswerten einbeziehen (z. B. active). Leer lassen für alle Statuswerte.", "exports.status": "Zustand", "exports.active": "Aktiv", "exports.inactive": "Inaktiv", "exports.fieldMappings": "Feldzuordnungen", - "exports.addField": "Feld hinzufügen", - "exports.outputKey": "Ausgabeschlüssel", + "exports.addField": "Feld hinzufügen", + "exports.outputKey": "Ausgabeschlüssel", "exports.source": "Quelle", "exports.customSource": "Benutzerdefiniert (attr.* / spec.*)", "exports.removeField": "Feld entfernen", - "exports.fieldHelp": "Exporte lesen verarbeitete Produkte (mit rohem mapped_data als Fallback). Nutzen Sie eprel_* / energy_* für EPREL-Felder, spec.* für eine Spezifikation oder specifications.*, um alle Specs als XML-Knoten zu erweitern.", - "exports.saving": "Speichern…", - "exports.saveChanges": "Änderungen speichern", + "exports.fieldHelp": "Exporte lesen verarbeitete Produkte (mit rohem mapped_data als Fallback). Nutzen Sie eprel_* / energy_* für EPREL-Felder, spec.* für eine Spezifikation oder specifications.*, um alle Specs als XML-Knoten zu erweitern.", + "exports.saving": "Speichern…", + "exports.saveChanges": "Änderungen speichern", "exports.createFeed": "Feed erstellen", "exports.updated": "Export-Feed aktualisiert.", "exports.created": "Export-Feed erstellt.", "exports.saveFailed": "Speichern fehlgeschlagen", - "exports.urlCopied": "Öffentliche {format}-Feed-URL kopiert. Fügen Sie sie in jedes System ein, das Produktfeeds abruft.", + "exports.urlCopied": "Öffentliche {format}-Feed-URL kopiert. Fügen Sie sie in jedes System ein, das Produktfeeds abruft.", "exports.copyFailed": "URL konnte nicht in die Zwischenablage kopiert werden", "exports.refreshed": "Feed aktualisiert", "exports.refreshedWithCount": "Feed aktualisiert ({count} Produkte).", "exports.refreshFailed": "Feed konnte nicht aktualisiert werden", - "exports.deleteConfirm": "Möchten Sie diesen Export-Feed wirklich löschen?", - "exports.deleted": "Export-Feed erfolgreich gelöscht.", - "exports.deleteFailed": "Export-Feed konnte nicht gelöscht werden", + "exports.deleteConfirm": "Möchten Sie diesen Export-Feed wirklich löschen?", + "exports.deleted": "Export-Feed erfolgreich gelöscht.", + "exports.deleteFailed": "Export-Feed konnte nicht gelöscht werden", "exports.defaultName": "Neuer Export-Feed", "exports.fallbackName": "Export-Feed", - "exports.dialog.selectTitle": "Ausgewählte Produkte exportieren", - "exports.dialog.selectDescription": "Wählen Sie eine Export-Feed-Konfiguration für die {count} ausgewählten Produkte.", + "exports.dialog.selectTitle": "Ausgewählte Produkte exportieren", + "exports.dialog.selectDescription": "Wählen Sie eine Export-Feed-Konfiguration für die {count} ausgewählten Produkte.", "exports.dialog.noneFound": "Keine Export-Feed-Konfigurationen gefunden. Bitte erstellen Sie eine im Bereich Export Feeds.", "exports.dialog.loadFailed": "Export-Feed-Optionen konnten nicht geladen werden. Bitte erneut versuchen.", - "exports.dialog.selectRequired": "Bitte wählen Sie ein Export-Feed-Format.", - "exports.dialog.selectPlaceholder": "Export-Feed-Format auswählen...", - "exports.dialog.confirmAria": "Export bestätigen", + "exports.dialog.selectRequired": "Bitte wählen Sie ein Export-Feed-Format.", + "exports.dialog.selectPlaceholder": "Export-Feed-Format auswählen...", + "exports.dialog.confirmAria": "Export bestätigen", "exports.dialog.export": "Exportieren", "exports.preset.google_shopping_csv.label": "Google Shopping (CSV)", "exports.preset.google_shopping_csv.shortLabel": "Google Shopping CSV", - "exports.preset.google_shopping_csv.description": "Merchant Center-Produktfeed mit den Standard-Google-Spalten (id, title, price, gtin, …).", - "exports.preset.google_shopping_csv.hint": "Nach dem Aktualisieren des Feeds die öffentliche CSV-URL in Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch kopieren.", + "exports.preset.google_shopping_csv.description": "Merchant Center-Produktfeed mit den Standard-Google-Spalten (id, title, price, gtin, …).", + "exports.preset.google_shopping_csv.hint": "Nach dem Aktualisieren des Feeds die öffentliche CSV-URL in Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch kopieren.", "exports.preset.google_shopping_csv.defaultName": "Google Shopping CSV", "exports.preset.google_shopping_xml.label": "Google Shopping (XML)", "exports.preset.google_shopping_xml.shortLabel": "Google Shopping XML", - "exports.preset.google_shopping_xml.description": "Dieselben Google-Spalten wie XML-Elemente (g:id, g:title, …) für Merchant Center-XML-Feeds.", - "exports.preset.google_shopping_xml.hint": "Fügen Sie die öffentliche XML-URL in Merchant Center als scheduled fetch ein. Ordnen Sie fehlende Shop-Felder (link, price) unter Field mappings zu, falls nötig.", + "exports.preset.google_shopping_xml.description": "Dieselben Google-Spalten wie XML-Elemente (g:id, g:title, …) für Merchant Center-XML-Feeds.", + "exports.preset.google_shopping_xml.hint": "Fügen Sie die öffentliche XML-URL in Merchant Center als scheduled fetch ein. Ordnen Sie fehlende Shop-Felder (link, price) unter Field mappings zu, falls nötig.", "exports.preset.google_shopping_xml.defaultName": "Google Shopping XML", "exports.preset.meta_csv.label": "Meta-Katalog (CSV)", "exports.preset.meta_csv.shortLabel": "Meta CSV", - "exports.preset.meta_csv.description": "Spalten des Facebook-/Instagram-Commerce-Katalogs (id, title, availability, price, image_link, …).", - "exports.preset.meta_csv.hint": "In Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed die öffentliche CSV-URL einfügen.", + "exports.preset.meta_csv.description": "Spalten des Facebook-/Instagram-Commerce-Katalogs (id, title, availability, price, image_link, …).", + "exports.preset.meta_csv.hint": "In Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed die öffentliche CSV-URL einfügen.", "exports.preset.meta_csv.defaultName": "Meta-Katalog CSV", "exports.preset.custom_csv.label": "Benutzerdefiniertes CSV", "exports.preset.custom_csv.shortLabel": "Benutzerdefiniertes CSV", - "exports.preset.custom_csv.description": "Wählen Sie eigene Spalten und Produktquellen für jeden Partner oder Webhook.", - "exports.preset.custom_csv.hint": "Ausgabe-Schlüssel frei hinzufügen oder umbenennen. Die öffentliche URL benötigt keinen Login zum Download.", + "exports.preset.custom_csv.description": "Wählen Sie eigene Spalten und Produktquellen für jeden Partner oder Webhook.", + "exports.preset.custom_csv.hint": "Ausgabe-Schlüssel frei hinzufügen oder umbenennen. Die öffentliche URL benötigt keinen Login zum Download.", "exports.preset.custom_csv.defaultName": "Benutzerdefinierter CSV-Export", "exports.preset.custom_xml.label": "Benutzerdefiniertes XML", "exports.preset.custom_xml.shortLabel": "Benutzerdefiniertes XML", "exports.preset.custom_xml.description": "Erstellen Sie eine benutzerdefinierte XML-Struktur mit eigenen Root-/Item-Namen und Feldzuordnungen.", - "exports.preset.custom_xml.hint": "Legen Sie Root- und Item-Elementnamen fest und ordnen Sie jeden Ausgabe-Schlüssel einer Produktquelle zu.", + "exports.preset.custom_xml.hint": "Legen Sie Root- und Item-Elementnamen fest und ordnen Sie jeden Ausgabe-Schlüssel einer Produktquelle zu.", "exports.preset.custom_xml.defaultName": "Benutzerdefinierter XML-Export", "processing.title": "Verarbeitung", - "processing.description": "Live-Pipeline-Fortschritt für Produktverarbeitungsjobs. Automatische Aktualisierung, solange dieser Tab sichtbar ist. Abgeschlossene Jobs verlinken zu Needs Review für Akzeptieren / Bearbeiten / Ablehnen.", + "processing.description": "Live-Pipeline-Fortschritt für Produktverarbeitungsjobs. Automatische Aktualisierung, solange dieser Tab sichtbar ist. Abgeschlossene Jobs verlinken zu Needs Review für Akzeptieren / Bearbeiten / Ablehnen.", "processing.refresh": "Aktualisieren", "processing.loadFailed": "Verarbeitungsjobs konnten nicht geladen werden", - "processing.tooManyRequests": "Zu viele Anfragen — warten Sie einen Moment und versuchen Sie es erneut.", - "processing.serverError": "{fallback} (Serverfehler {status}). Versuchen Sie es in Kürze erneut.", + "processing.tooManyRequests": "Zu viele Anfragen — warten Sie einen Moment und versuchen Sie es erneut.", + "processing.serverError": "{fallback} (Serverfehler {status}). Versuchen Sie es in Kürze erneut.", "processing.httpError": "{fallback} (HTTP {status})", "processing.cancelFailed": "Diese Aufgabe konnte nicht abgebrochen werden", "processing.retryFailed": "Diese Aufgabe konnte nicht erneut versucht werden", - "processing.cancelledMsg": "„{name}“ wurde abgebrochen.", - "processing.queuedRetry": "„{name}“ zur Wiederholung eingereiht.", + "processing.cancelledMsg": "„{name}“ wurde abgebrochen.", + "processing.queuedRetry": "„{name}“ zur Wiederholung eingereiht.", "processing.jobFallback": "Job {id}", "processing.tasks": "Aufgaben", - "processing.pipelineHint": "Pipeline: normalize → specs → fill → EPREL → AI. Große Starts können in Geschwister-Jobs aufgeteilt werden.", + "processing.pipelineHint": "Pipeline: normalize → specs → fill → EPREL → AI. Große Starts können in Geschwister-Jobs aufgeteilt werden.", "processing.emptyTitle": "Noch keine Hintergrundaufgaben", "processing.emptyBody": "Noch keine Hintergrundaufgaben. Starten Sie bei Bedarf einen neuen Job unter Products.", "processing.startJob": "Auftrag starten", "processing.connectFeed": "Feed verbinden", - "processing.splitBatch": "Batch geteilt · {jobs} Jobs · {products} Produkte", + "processing.splitBatch": "Batch geteilt · {jobs} Jobs · {products} Produkte", "processing.col.task": "Aufgabe", "processing.col.status": "Zustand", "processing.col.steps": "Schritte", @@ -3622,87 +3623,87 @@ export const de: MessageDict = { "processing.col.started": "Gestartet", "processing.col.completed": "Abgeschlossen", "processing.col.actions": "Aktionen", - "processing.partOfBatch": "· Teil des Stapels", + "processing.partOfBatch": "· Teil des Stapels", "processing.nowStep": "Jetzt: {step}", - "processing.skip": "(überspringen)", - "processing.reviewResults": "Ergebnisse prüfen", - "processing.reviewTitle": "Öffnen Sie Needs Review, um die Anreicherung zu akzeptieren, zu bearbeiten oder abzulehnen", + "processing.skip": "(überspringen)", + "processing.reviewResults": "Ergebnisse prüfen", + "processing.reviewTitle": "Öffnen Sie Needs Review, um die Anreicherung zu akzeptieren, zu bearbeiten oder abzulehnen", "processing.cancel": "Abbrechen", - "processing.cancelling": "Wird abgebrochen…", + "processing.cancelling": "Wird abgebrochen…", "processing.cancelTitle": "Diesen ausstehenden oder laufenden Job abbrechen", "processing.retry": "Erneut versuchen", - "processing.retrying": "Erneuter Versuch…", + "processing.retrying": "Erneuter Versuch…", "processing.actions.onPage": "{count} auf dieser Seite", "processing.actions.clearSelection": "Auswahl leeren", "processing.actions.processSelected": "Auswahl verarbeiten", - "processing.actions.processAria": "Ausgewählte Produkte verarbeiten", - "processing.actions.processAriaCount": "{count} ausgewählte Produkt{plural} auf dieser Seite verarbeiten", + "processing.actions.processAria": "Ausgewählte Produkte verarbeiten", + "processing.actions.processAriaCount": "{count} ausgewählte Produkt{plural} auf dieser Seite verarbeiten", "processing.actions.whatToProcess": "Was verarbeiten", - "processing.actions.freeNoAiTitle": "Free-Plan — keine KI-Credits", + "processing.actions.freeNoAiTitle": "Free-Plan — keine KI-Credits", "processing.actions.freeNoAiBody": "Normalize, specs, fill und EPREL laufen weiterhin. KI-Titel/-Beschreibungen erfordern einen bezahlten Plan oder Credits.", - "processing.actions.comparePlans": "Pläne vergleichen", - "processing.actions.selectAll": "Alles auswählen", - "processing.actions.selectAllAria": "Alle Verarbeitungsmodi auswählen", + "processing.actions.comparePlans": "Pläne vergleichen", + "processing.actions.selectAll": "Alles auswählen", + "processing.actions.selectAllAria": "Alle Verarbeitungsmodi auswählen", "processing.actions.upgradeRequired": "{label} (Upgrade erforderlich)", - "processing.actions.upgradeSuffix": " · Upgrade", + "processing.actions.upgradeSuffix": " · Upgrade", "processing.actions.credits": "{credits} Credits", "processing.actions.free": "kostenlos", - "processing.actions.autoCategorizeTitle": "Kategorisierung wird automatisch hinzugefügt", - "processing.actions.autoCategorizeBody": "{count} Produkt(e) brauchen Kategorisierung für die {types}-Verarbeitung", + "processing.actions.autoCategorizeTitle": "Kategorisierung wird automatisch hinzugefügt", + "processing.actions.autoCategorizeBody": "{count} Produkt(e) brauchen Kategorisierung für die {types}-Verarbeitung", "processing.actions.aiLocked": "KI-Optionen sind auf Free gesperrt. Upgraden Sie, um Titel/Beschreibungen zu verarbeiten.", "processing.actions.totalCredits": "Gesamt-Credits ({count} auf dieser Seite):", - "processing.actions.starting": "Start…", + "processing.actions.starting": "Start…", "processing.actions.processCount": "{count} auf dieser Seite verarbeiten", - "processing.actions.close": "Schließen", - "processing.actions.accept": "Übernehmen", + "processing.actions.close": "Schließen", + "processing.actions.accept": "Übernehmen", "processing.actions.acceptEnrichment": "Anreicherung akzeptieren", "processing.actions.export": "Exportieren", "processing.actions.exportSelected": "Auswahl exportieren", "processing.actions.reject": "Ablehnen", - "processing.actions.rejectReset": "Ablehnen (zurücksetzen)", - "processing.actions.resetUnprocessed": "Auf Unverarbeitet zurücksetzen", - "processing.actions.confirmTitle": "Verarbeitung bestätigen", - "processing.actions.confirmBody": "{count} Produkt(e) auf dieser Seite für {credits} Credits verarbeiten. Credits werden beim Start des Jobs verbraucht und können über diese Aktion nicht rückgängig gemacht werden.", + "processing.actions.rejectReset": "Ablehnen (zurücksetzen)", + "processing.actions.resetUnprocessed": "Auf Unverarbeitet zurücksetzen", + "processing.actions.confirmTitle": "Verarbeitung bestätigen", + "processing.actions.confirmBody": "{count} Produkt(e) auf dieser Seite für {credits} Credits verarbeiten. Credits werden beim Start des Jobs verbraucht und können über diese Aktion nicht rückgängig gemacht werden.", "processing.actions.confirmStart": "Verarbeitung starten", "processing.option.category": "Kategorien", "processing.option.attributes": "Attribute / Specs", "processing.option.title": "Titel (KI)", "processing.option.description": "Beschreibungen (KI)", "processing.receipt.view": "In Verarbeitung anzeigen", - "processing.receipt.undo": "Rückgängig", - "processing.receipt.format": "{succeeded} erfolgreich · {skipped} übersprungen · {failed} fehlgeschlagen", + "processing.receipt.undo": "Rückgängig", + "processing.receipt.format": "{succeeded} erfolgreich · {skipped} übersprungen · {failed} fehlgeschlagen", "processing.receipt.cancelledOne": "Verarbeitung abgebrochen", "processing.receipt.cancelledMany": "Verarbeitungsjobs abgebrochen", "processing.receipt.cancelledDesc": "Der soeben gestartete Job wurde abgebrochen.", "processing.receipt.cancelFailed": "Verarbeitungsjob konnte nicht abgebrochen werden", "unsubscribe.title": "Abmelden", "unsubscribe.me": "Abonnement beenden", - "unsubscribe.invalidLink": "Ungültiger Link", + "unsubscribe.invalidLink": "Ungültiger Link", "unsubscribe.failedShort": "Abmeldung fehlgeschlagen", "unsubscribe.already": "Sie sind bereits abgemeldet.", - "unsubscribe.confirmPrompt": "Bestätigen Sie unten, um Marketing-E-Mails abzubestellen.", + "unsubscribe.confirmPrompt": "Bestätigen Sie unten, um Marketing-E-Mails abzubestellen.", "unsubscribe.done": "Sie wurden abgemeldet.", "stores.title": "Stores & Quellen", - "stores.description": "Verbinden Sie Shop oder Lieferant an einem Ort — Woo, Shopify, Feed-URL oder CSV. Live-Shops: Produkte Descrybe → Shop; Bestellungen/Bewertungen Shop → Descrybe. Exportieren, wenn der Katalog bereit ist.", + "stores.description": "Verbinden Sie Shop oder Lieferant an einem Ort — Woo, Shopify, Feed-URL oder CSV. Live-Shops: Produkte Descrybe → Shop; Bestellungen/Bewertungen Shop → Descrybe. Exportieren, wenn der Katalog bereit ist.", "stores.allInputFeeds": "Alle Eingabe-Feeds", "stores.exportFeeds": "Export-Feeds", - "stores.migrationNote": "Nach einer Descrybe-Plattformmigration müssen WooCommerce- und Shopify-Zugangsdaten ggf. erneut eingegeben werden — das ist ein Reconnect, kein kaputter Sync.", + "stores.migrationNote": "Nach einer Descrybe-Plattformmigration müssen WooCommerce- und Shopify-Zugangsdaten ggf. erneut eingegeben werden — das ist ein Reconnect, kein kaputter Sync.", "stores.docsPrefix": "Docs:", - "stores.docsApiOverview": "API-Übersicht", - "stores.docsSuffix": "für öffentlichen Produktzugriff; nutzen Sie WooCommerce oder Shopify unten für Live-Shop-Sync.", + "stores.docsApiOverview": "API-Übersicht", + "stores.docsSuffix": "für öffentlichen Produktzugriff; nutzen Sie WooCommerce oder Shopify unten für Live-Shop-Sync.", "stores.connectorsHeading": "Shop- und Katalog-Konnektoren", "stores.statusAria": "Status: {label}", "stores.ctaAria": "{cta}: {title}", "stores.startTitle": "Wo soll ich anfangen?", - "stores.startBody": "Woo-Shop → WooCommerce. Shopify oder andere Plattform → Feed-URL oder CSV-Upload. Bereit für Merchant Center oder Partner → Export-Feeds (Google-Shopping-Preset oder eigene Felder). Nach einer Migration Woo/Shopify neu verbinden, bevor Sync erwartet wird.", - "stores.startBodyMember": "Bitten Sie einen Unternehmens-Admin, WooCommerce oder Shopify zu verbinden. Verbundene Stores können Sie weiterhin öffnen (Sync/Browse); Feed-URL, CSV und Export-Feeds bleiben je nach Plan verfügbar.", - "stores.wizard.title": "Geführte Store-Einrichtung", - "stores.wizard.description": "Store verbinden, Verbindung testen, erste Produktsynchronisierung starten — fertig.", - "stores.wizard.guidedSetup": "Geführte Einrichtung", - "stores.wizard.guidedSetupAria": "Geführte Store-Einrichtung starten", - "stores.wizard.adminOnly": "Nur Unternehmens-Admins können die geführte Store-Einrichtung ausführen (Zugangsdaten speichern und ersten Sync). Verbundene Stores können Sie weiterhin öffnen.", - "stores.wizard.pickChannel": "Store-Konnektor wählen", - "stores.wizard.pickChannelBody": "Wählen Sie WooCommerce oder Shopify. Verbinden → testen → erste Sync auf der Konnektor-Seite, dann hierher zurück.", + "stores.startBody": "Woo-Shop → WooCommerce. Shopify oder andere Plattform → Feed-URL oder CSV-Upload. Bereit für Merchant Center oder Partner → Export-Feeds (Google-Shopping-Preset oder eigene Felder). Nach einer Migration Woo/Shopify neu verbinden, bevor Sync erwartet wird.", + "stores.startBodyMember": "Bitten Sie einen Unternehmens-Admin, WooCommerce oder Shopify zu verbinden. Verbundene Stores können Sie weiterhin öffnen (Sync/Browse); Feed-URL, CSV und Export-Feeds bleiben je nach Plan verfügbar.", + "stores.wizard.title": "Geführte Store-Einrichtung", + "stores.wizard.description": "Store verbinden, Verbindung testen, erste Produktsynchronisierung starten — fertig.", + "stores.wizard.guidedSetup": "Geführte Einrichtung", + "stores.wizard.guidedSetupAria": "Geführte Store-Einrichtung starten", + "stores.wizard.adminOnly": "Nur Unternehmens-Admins können die geführte Store-Einrichtung ausführen (Zugangsdaten speichern und ersten Sync). Verbundene Stores können Sie weiterhin öffnen.", + "stores.wizard.pickChannel": "Store-Konnektor wählen", + "stores.wizard.pickChannelBody": "Wählen Sie WooCommerce oder Shopify. Verbinden → testen → erste Sync auf der Konnektor-Seite, dann hierher zurück.", "stores.wizard.channel.shopify": "Shopify", "stores.wizard.channel.woocommerce": "WooCommerce", "stores.wizard.channelLabel": "Einrichtung: {channel}", @@ -3718,41 +3719,41 @@ export const de: MessageDict = { "stores.wizard.step.sync.body": "Erste Produktsynchronisierung in die Warteschlange stellen.", "stores.wizard.step.done.title": "Fertig", "stores.wizard.step.done.body": "Store ist verbunden und eine Sync wurde gestartet oder abgeschlossen.", - "stores.wizard.openConnector": "Konnektor öffnen", + "stores.wizard.openConnector": "Konnektor öffnen", "stores.wizard.viewProducts": "Produkte anzeigen", - "stores.wizard.backToHub": "Zurück zu Stores", - "stores.wizard.banner.generic": "Geführte Einrichtung: Schritt abschließen, dann zum Assistenten zurück.", - "stores.wizard.banner.test": "Geführte Einrichtung — Verbindung testen, dann zum Assistenten zurück.", - "stores.wizard.banner.sync": "Geführte Einrichtung — erste Produktsync starten, dann zum Assistenten zurück.", - "stores.wizard.banner.return": "Zurück zum Assistenten", - "stores.wizard.banner.dismiss": "Schließen", + "stores.wizard.backToHub": "Zurück zu Stores", + "stores.wizard.banner.generic": "Geführte Einrichtung: Schritt abschließen, dann zum Assistenten zurück.", + "stores.wizard.banner.test": "Geführte Einrichtung — Verbindung testen, dann zum Assistenten zurück.", + "stores.wizard.banner.sync": "Geführte Einrichtung — erste Produktsync starten, dann zum Assistenten zurück.", + "stores.wizard.banner.return": "Zurück zum Assistenten", + "stores.wizard.banner.dismiss": "Schließen", "stores.woo.title": "WooCommerce", - "stores.woo.description": "Produkte von Descrybe → WooCommerce pushen. Bestellungen und Bewertungen von WooCommerce → Descrybe holen.", + "stores.woo.description": "Produkte von Descrybe → WooCommerce pushen. Bestellungen und Bewertungen von WooCommerce → Descrybe holen.", "stores.woo.ctaReconnect": "Woo erneut verbinden", - "stores.woo.ctaOpen": "Woo öffnen", + "stores.woo.ctaOpen": "Woo öffnen", "stores.woo.ctaConnect": "Woo verbinden", "stores.woo.ctaView": "Woo ansehen", "stores.shopify.title": "Shopify", - "stores.shopify.description": "Produkte pushen Descrybe → Shopify. Bestellungen pullen Shopify → Descrybe. Bewertungen sind über die Shopify Admin API nicht verfügbar.", + "stores.shopify.description": "Produkte pushen Descrybe → Shopify. Bestellungen pullen Shopify → Descrybe. Bewertungen sind über die Shopify Admin API nicht verfügbar.", "stores.shopify.ctaReconnect": "Shopify erneut verbinden", - "stores.shopify.ctaOpen": "Shopify öffnen", + "stores.shopify.ctaOpen": "Shopify öffnen", "stores.shopify.ctaConnect": "Shopify verbinden", "stores.shopify.ctaView": "Shopify ansehen", "stores.feedUrl.title": "Feed-URL", "stores.feedUrl.description": "Pull any supplier or Shop catalog from a public CSV or XML URL on a schedule. Map fields, then sync.", - "stores.feedUrl.cta": "Feed-URL hinzufügen", + "stores.feedUrl.cta": "Feed-URL hinzufügen", "stores.csv.title": "CSV-Upload", - "stores.csv.description": "Laden Sie eine Produkt-CSV als Eingabe-Feed hoch. Ideal für einmalige Lieferantendateien oder Shopify-Admin-Exporte.", + "stores.csv.description": "Laden Sie eine Produkt-CSV als Eingabe-Feed hoch. Ideal für einmalige Lieferantendateien oder Shopify-Admin-Exporte.", "stores.csv.cta": "CSV hochladen", "stores.export.title": "Export / REST", - "stores.export.description": "Veröffentlichen Sie Google Shopping oder benutzerdefiniertes CSV/XML mit öffentlicher URL. Oder holen Sie Produkte per API-Schlüssel (/api/v1).", - "stores.export.cta": "Exporte öffnen", - "stores.apiKeys.title": "API-Schlüssel", - "stores.apiKeys.description": "Legacy-API-Schlüssel wurden nicht migriert. Erstellen Sie unter Einstellungen einen neuen Schlüssel, um den /api/v1-Zugang wiederherzustellen — das Geheimnis wird nur einmal angezeigt.", - "stores.apiKeys.descriptionMember": "Unternehmens-API-Schlüssel für /api/v1. Legacy-Schlüssel wurden nicht migriert — nur Admins können erstellen/widerrufen; Präfixe in den Einstellungen sichtbar.", - "stores.apiKeys.cta": "API-Schlüssel verwalten", - "stores.apiKeys.ctaView": "API-Schlüssel ansehen", - "stores.status.needsReconnect": "Erneute Verbindung nötig", + "stores.export.description": "Veröffentlichen Sie Google Shopping oder benutzerdefiniertes CSV/XML mit öffentlicher URL. Oder holen Sie Produkte per API-Schlüssel (/api/v1).", + "stores.export.cta": "Exporte öffnen", + "stores.apiKeys.title": "API-Schlüssel", + "stores.apiKeys.description": "Legacy-API-Schlüssel wurden nicht migriert. Erstellen Sie unter Einstellungen einen neuen Schlüssel, um den /api/v1-Zugang wiederherzustellen — das Geheimnis wird nur einmal angezeigt.", + "stores.apiKeys.descriptionMember": "Unternehmens-API-Schlüssel für /api/v1. Legacy-Schlüssel wurden nicht migriert — nur Admins können erstellen/widerrufen; Präfixe in den Einstellungen sichtbar.", + "stores.apiKeys.cta": "API-Schlüssel verwalten", + "stores.apiKeys.ctaView": "API-Schlüssel ansehen", + "stores.status.needsReconnect": "Erneute Verbindung nötig", "stores.status.connected": "Verbunden", "stores.status.notConnected": "Nicht verbunden", "stores.status.ready": "Bereit", @@ -3781,12 +3782,12 @@ export const de: MessageDict = { "store.noOrdersSyncYet": "Noch keine Bestell-Sync abgeschlossen.", "store.save": "Speichern", "store.saving": "Speichern...", - "store.testing": "Test läuft...", + "store.testing": "Test läuft...", "store.testConnection": "Verbindung testen", "store.queueing": "Wird eingereiht...", - "store.queueProductPush": "Produkt-Push einreihen (Descrybe → Shop)", - "store.queueFirstProductSync": "Ersten Produkt-Push einreihen (Descrybe → Shop)", - "store.queueOrdersImport": "Bestellimport einreihen (Shop → Descrybe)", + "store.queueProductPush": "Produkt-Push einreihen (Descrybe → Shop)", + "store.queueFirstProductSync": "Ersten Produkt-Push einreihen (Descrybe → Shop)", + "store.queueOrdersImport": "Bestellimport einreihen (Shop → Descrybe)", "store.refreshList": "Liste aktualisieren", "store.saveBeforeTest": "Anmeldedaten vor dem Test speichern", "store.saveTestBeforeQueue": "Speichern Sie Anmeldedaten und testen Sie die Verbindung vor dem Sync", @@ -3803,33 +3804,33 @@ export const de: MessageDict = { "store.col.status": "Zustand", "store.col.total": "Gesamt", "store.col.date": "Datum", - "store.loadingOrders": "Bestellungen werden geladen…", + "store.loadingOrders": "Bestellungen werden geladen…", "store.loadingOrdersDot": "Bestellungen werden geladen.", "flash.store.saveFailed": "Einstellungen konnten nicht gespeichert werden", "flash.store.queueSyncFailed": "Sync konnte nicht in die Warteschlange gestellt werden", "flash.store.queueOrdersFailed": "Bestell-Sync konnte nicht in die Warteschlange gestellt werden", "flash.store.connectedTo": "Verbunden mit {name}.", "flash.shopify.loadFailed": "Shopify-Konfiguration konnte nicht geladen werden", - "flash.shopify.productSyncQueued": "Produkt-Sync in Warteschlange. Der Worker führt ihn bald aus.", - "flash.shopify.ordersSyncQueued": "Bestell-Sync in Warteschlange. Der Worker führt ihn bald aus.", + "flash.shopify.productSyncQueued": "Produkt-Sync in Warteschlange. Der Worker führt ihn bald aus.", + "flash.shopify.ordersSyncQueued": "Bestell-Sync in Warteschlange. Der Worker führt ihn bald aus.", "flash.woo.loadFailed": "WooCommerce-Konfiguration konnte nicht geladen werden", - "flash.woo.productSyncQueued": "Produkt-Sync in Warteschlange. Sync läuft bald.", - "flash.woo.ordersSyncQueued": "Bestell-Sync in Warteschlange. Sync läuft bald.", - "flash.woo.reviewsSyncQueued": "Bewertungs-Sync in Warteschlange. Sync läuft bald.", + "flash.woo.productSyncQueued": "Produkt-Sync in Warteschlange. Sync läuft bald.", + "flash.woo.ordersSyncQueued": "Bestell-Sync in Warteschlange. Sync läuft bald.", + "flash.woo.reviewsSyncQueued": "Bewertungs-Sync in Warteschlange. Sync läuft bald.", "flash.woo.queueReviewsFailed": "Bewertungs-Sync konnte nicht in die Warteschlange gestellt werden", "flash.woo.remoteMapsFailed": "Remote-Maps konnten nicht geladen werden", "flash.woo.syncSettingsFailed": "Sync-Einstellungen konnten nicht gespeichert werden", "flash.woo.categoryAutoMapFailed": "Kategorie-Auto-Map fehlgeschlagen", "flash.woo.attributeAutoMapFailed": "Attribut-Auto-Map fehlgeschlagen", "shopify.title": "Shopify-Integration", - "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", - "shopify.adminOnly": "Only Unternehmen admins can change Shopify connection Einstellungen. Synchronisieren and browse stay verfügbar.", + "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", + "shopify.adminOnly": "Only Unternehmen admins can change Shopify connection Einstellungen. Synchronisieren and browse stay verfügbar.", "shopify.lockedTitle": "Shopify-Verbindung gesperrt", - "shopify.noCredentialsMember": "Noch keine Shopify-Zugangsdaten hinterlegt. Bitten Sie einen Unternehmens-Admin, den Shop zu verbinden. Sync und Bestellübersicht bleiben nach Speichern und Verbindungstest verfügbar.", + "shopify.noCredentialsMember": "Noch keine Shopify-Zugangsdaten hinterlegt. Bitten Sie einen Unternehmens-Admin, den Shop zu verbinden. Sync und Bestellübersicht bleiben nach Speichern und Verbindungstest verfügbar.", "shopify.enterToken": "Anmeldedaten eingeben", - "shopify.noCredentials": "Keine Shopify-Zugangsdaten hinterlegt. Geben Sie Ihre *.myshopify.com-Domain und Dev-Dashboard-Client-ID + Secret ein (oder ein Legacy-Admin-API-Token), dann Speichern und Verbindung testen. Nach einer Plattformmigration werden alte Secrets nicht übernommen — erneut mit einem frischen Token verbinden.", + "shopify.noCredentials": "Keine Shopify-Zugangsdaten hinterlegt. Geben Sie Ihre *.myshopify.com-Domain und Dev-Dashboard-Client-ID + Secret ein (oder ein Legacy-Admin-API-Token), dann Speichern und Verbindung testen. Nach einer Plattformmigration werden alte Secrets nicht übernommen — erneut mit einem frischen Token verbinden.", "shopify.allConnectors": "Alle Shop-Konnektoren", - "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", + "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", "shopify.setup.oauthNote": "Still manual: create/install the app in Shopify and paste Client ID + secret here. Descrybe does not host a one-click App Store install. Legacy permanent shpat_ tokens from older Admin custom apps still work.", "shopify.setup.scopesTitle": "Erforderliche Admin-API-Scopes", "shopify.setup.scopesIntro": "Add these scopes on the app version in the Dev Dashboard before you release and install:", @@ -3841,56 +3842,56 @@ export const de: MessageDict = { "shopify.setup.step5.clientId": "Client ID", "shopify.setup.step5.and": "and", "shopify.setup.step5.clientSecret": "Client secret", - "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", + "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", "shopify.setup.step5.save": "Save", - "shopify.setup.step5.arrow": "→", + "shopify.setup.step5.arrow": "→", "shopify.setup.step5.test": "Test Connection", "shopify.setup.step5.after": ". Descrybe stores secrets encrypted and refreshes the short-lived access token automatically.", "shopify.setup.step6.products": "Products", - "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", + "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", "shopify.setup.step6.orders": "Orders", - "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", + "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", "shopify.setup.step7.before": "No live shop yet? Enable", "shopify.setup.step7.dryRun": "Dry run", "shopify.setup.step7.after": "(or use the special dry-run access token) to walk through the flow without calling Shopify.", "shopify.setup.openDevDashboard": "Open Dev Dashboard", "shopify.setup.openDevelopApps": "Open shop Develop apps", "shopify.setup.openDevelopAppsNeedDomain": "Enter your shop domain below to unlock a direct Admin link for this store.", - "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", + "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", "shopify.setup.copyScopes": "Copy required scopes", "shopify.setup.scopesCopied": "Scopes copied", "shopify.setup.docsCreate": "Create app docs", "shopify.setup.docsTokens": "Access token docs", - "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", + "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", "shopify.setup.hideLegacyToken": "Hide legacy token field", - "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", + "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", "shopify.field.clientId": "Client ID", "shopify.field.clientSecret": "Client secret", - "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", + "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", "shopify.field.accessTokenHelp": "Only for custom apps created in Shopify Admin before January 2026. New apps should use Client ID + secret instead.", "shopify.placeholder.clientId": "Client ID from Dev Dashboard", - "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", + "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", "shopify.placeholder.clientSecret": "Client secret", - "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", + "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", "shopify.setup.scope.write_products": "write_products", "shopify.setup.scope.write_productsWhy": "Produkte in Shopify erstellen und aktualisieren (ausgehender Push)", "shopify.setup.scope.read_products": "read_products", "shopify.setup.scope.read_productsWhy": "Bestehende Produkte anhand der SKU vor dem Aktualisieren finden", "shopify.setup.scope.read_orders": "read_orders", "shopify.setup.scope.read_ordersWhy": "Bestellungen in Descrybe importieren (eingehend)", - "shopify.setup.step1": "Wenn Sie Shopify vor einer Plattformmigration verbunden hatten: neue Dev-Dashboard-App erstellen (oder mit frischem Legacy-Token erneut verbinden) — alte gespeicherte Secrets werden nicht übernommen.", + "shopify.setup.step1": "Wenn Sie Shopify vor einer Plattformmigration verbunden hatten: neue Dev-Dashboard-App erstellen (oder mit frischem Legacy-Token erneut verbinden) — alte gespeicherte Secrets werden nicht übernommen.", "shopify.setup.step2.before": "Open the", "shopify.setup.step2.path": "Shopify Dev Dashboard", - "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", + "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", "shopify.setup.step3.before": "Create a version: set App URL (default home is fine for API-only), add scopes", "shopify.setup.step3.after": ".", "shopify.setup.step4.before": "From the app Home tab,", "shopify.setup.step4.after": "on your store (merchant must approve scopes).", - "shopify.testSectionTitle": "Verbindung prüfen", - "shopify.testHint": "Speichern Sie zuerst Shop-Domain und Token, und führen Sie dann Verbindung testen aus. Ein erfolgreicher Test bestätigt Token und Scopes, bevor Sie Sync einreihen.", - "shopify.overwriteTitle": "Shopify-Produkte überschreiben?", - "shopify.overwriteBodyCount": "Dies stellt einen ausgehenden Produkt-Push in die Warteschlange. {count} zuvor verknüpfte Shopify-Produkt(e) können mit Descrybe-Inhalten aktualisiert werden.", - "shopify.overwriteBody": "Dies stellt einen ausgehenden Produkt-Push in die Warteschlange. Übereinstimmende Shopify-Produkte können mit Descrybe-Inhalten aktualisiert werden.", + "shopify.testSectionTitle": "Verbindung prüfen", + "shopify.testHint": "Speichern Sie zuerst Shop-Domain und Token, und führen Sie dann Verbindung testen aus. Ein erfolgreicher Test bestätigt Token und Scopes, bevor Sie Sync einreihen.", + "shopify.overwriteTitle": "Shopify-Produkte überschreiben?", + "shopify.overwriteBodyCount": "Dies stellt einen ausgehenden Produkt-Push in die Warteschlange. {count} zuvor verknüpfte Shopify-Produkt(e) können mit Descrybe-Inhalten aktualisiert werden.", + "shopify.overwriteBody": "Dies stellt einen ausgehenden Produkt-Push in die Warteschlange. Übereinstimmende Shopify-Produkte können mit Descrybe-Inhalten aktualisiert werden.", "shopify.credentialsTitle": "Shop-Anmeldedaten", "shopify.credentialsDesc.before": "Die Shop-Domain muss Ihre", "shopify.credentialsDesc.code": "*.myshopify.com", @@ -3899,97 +3900,97 @@ export const de: MessageDict = { "shopify.field.accessToken": "Admin-API-Zugriffstoken", "shopify.field.apiVersion": "API-Version", "shopify.placeholder.tokenKeep": "******** (leer lassen zum Behalten)", - "shopify.enableSync": "Produkt-Push aktivieren (Descrybe → Shopify)", + "shopify.enableSync": "Produkt-Push aktivieren (Descrybe → Shopify)", "shopify.dryRunLabel": "Dry Run (keine Live-Shopify-Aufrufe)", - "shopify.ordersTitle": "Bestellimport (Shopify → Descrybe)", - "shopify.ordersDesc": "Shopify → Descrybe — Bestellungen und Positionen nach Descrybe ziehen (schreibt nicht zurück nach Shopify).", + "shopify.ordersTitle": "Bestellimport (Shopify → Descrybe)", + "shopify.ordersDesc": "Shopify → Descrybe — Bestellungen und Positionen nach Descrybe ziehen (schreibt nicht zurück nach Shopify).", "shopify.ordersNeedsReconnect": "Bestellimport kann erst laufen, wenn Zugangsdaten nach der Migration erneut verbunden sind. Im Reiter Verbindung: Speichern, dann Verbindung testen.", "shopify.notesTitle": "Notizen", "shopify.notesDesc": "Shopify-Connector-Funktionen", - "shopify.notes.productsLabel": "Produkte (Descrybe → Shopify)", - "shopify.notes.productsBody": "— verarbeitete Descrybe-Produkte werden in Shopify erstellt oder aktualisiert (SKU-Match via GraphQL, wenn keine gecachte Shopify-Produkt-ID). Re-Sync kann übereinstimmende Remote-Felder überschreiben.", - "shopify.notes.ordersLabel": "Bestellungen (Shopify → Descrybe)", - "shopify.notes.ordersBody": "— für Reporting und künftige Audience-Workflows abgerufen.", + "shopify.notes.productsLabel": "Produkte (Descrybe → Shopify)", + "shopify.notes.productsBody": "— verarbeitete Descrybe-Produkte werden in Shopify erstellt oder aktualisiert (SKU-Match via GraphQL, wenn keine gecachte Shopify-Produkt-ID). Re-Sync kann übereinstimmende Remote-Felder überschreiben.", + "shopify.notes.ordersLabel": "Bestellungen (Shopify → Descrybe)", + "shopify.notes.ordersBody": "— für Reporting und künftige Audience-Workflows abgerufen.", "shopify.notes.reviewsLabel": "Bewertungen", "shopify.notes.reviewsBody": "-- not Supported. Shopify has no first-party Produkt reviews Admin API (third-party review apps are out of scope here).", - "shopify.notes.encryption.before": "Tokens werden ruhend verschlüsselt mit", + "shopify.notes.encryption.before": "Tokens werden ruhend verschlüsselt mit", "woo.title": "WooCommerce-Integration", - "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", + "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", "woo.allStores": "Alle Stores", - "woo.adminOnly": "Nur Unternehmens-Admins können WooCommerce-Verbindung und Mapping ändern. Sync und Durchsuchen bleiben verfügbar.", + "woo.adminOnly": "Nur Unternehmens-Admins können WooCommerce-Verbindung und Mapping ändern. Sync und Durchsuchen bleiben verfügbar.", "woo.enterCredentials": "Anmeldedaten eingeben", - "woo.noCredentials": "Keine WooCommerce-Zugangsdaten hinterlegt. Store-URL eingeben, in WordPress einen Read/Write-REST-API-Schlüssel erstellen, Consumer Key und Secret einfügen, dann Speichern und Verbindung testen. Nach einer Plattformmigration werden alte Secrets nicht übernommen — mit einem neuen Schlüssel erneut verbinden.", + "woo.noCredentials": "Keine WooCommerce-Zugangsdaten hinterlegt. Store-URL eingeben, in WordPress einen Read/Write-REST-API-Schlüssel erstellen, Consumer Key und Secret einfügen, dann Speichern und Verbindung testen. Nach einer Plattformmigration werden alte Secrets nicht übernommen — mit einem neuen Schlüssel erneut verbinden.", "woo.lockedTitle": "WooCommerce-Verbindung gesperrt", - "woo.noCredentialsMember": "Noch keine WooCommerce-Zugangsdaten hinterlegt. Bitten Sie einen Unternehmens-Admin, den Shop zu verbinden. Sync, Bestellungen und Bewertungen bleiben nach Speichern und Verbindungstest verfügbar.", + "woo.noCredentialsMember": "Noch keine WooCommerce-Zugangsdaten hinterlegt. Bitten Sie einen Unternehmens-Admin, den Shop zu verbinden. Sync, Bestellungen und Bewertungen bleiben nach Speichern und Verbindungstest verfügbar.", "woo.setupDesc": "Follow these steps to create a WooCommerce REST API key in WordPress and connect it here. Descrybe never creates keys on your store for you.", - "woo.setup.step1": "Wenn Sie WooCommerce vor einer Plattformmigration verbunden hatten: neuen REST-API-Schlüssel erstellen — alte gespeicherte Zugangsdaten sind nicht nutzbar.", + "woo.setup.step1": "Wenn Sie WooCommerce vor einer Plattformmigration verbunden hatten: neuen REST-API-Schlüssel erstellen — alte gespeicherte Zugangsdaten sind nicht nutzbar.", "woo.setup.step2.before": "Enter your store", "woo.setup.step2.path": "HTTPS URL", "woo.setup.step2.after": "in the form below (example: https://yourstore.com).", "woo.setup.step3.before": "In WordPress admin, open", - "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", + "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", "woo.setup.step3.after": "(or use the deep link once your store URL is filled in).", "woo.setup.step4.before": "Click", "woo.setup.step4.addKey": "Add key", "woo.setup.step4.mid": ", set permissions to", "woo.setup.step4.permissions": "Read/Write", - "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", + "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", "woo.setup.step5.before": "Paste the key and secret below, enable sync if ready, then", "woo.setup.step5.save": "Save", - "woo.setup.step5.arrow": "→", + "woo.setup.step5.arrow": "→", "woo.setup.step5.test": "Test Connection", "woo.setup.step5.after": ".", "woo.setup.step6.products": "Products", - "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", + "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", "woo.setup.step6.orders": "Orders", "woo.setup.step6.and": "and", "woo.setup.step6.reviews": "reviews", - "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", - "woo.setup.openKeys": "REST-API-Schlüssel öffnen", - "woo.setup.addKey": "Schlüssel hinzufügen", - "woo.setup.openKeysHint": "Öffnet WordPress-Admin → WooCommerce → Einstellungen → Erweitert → REST-API.", - "woo.setup.openKeysNeedUrl": "Zuerst eine gültige Store-URL speichern, um Admin-Links zu öffnen.", + "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", + "woo.setup.openKeys": "REST-API-Schlüssel öffnen", + "woo.setup.addKey": "Schlüssel hinzufügen", + "woo.setup.openKeysHint": "Öffnet WordPress-Admin → WooCommerce → Einstellungen → Erweitert → REST-API.", + "woo.setup.openKeysNeedUrl": "Zuerst eine gültige Store-URL speichern, um Admin-Links zu öffnen.", "woo.setup.docsLink": "WooCommerce REST-API-Dokumentation", - "woo.overwriteTitle": "WooCommerce-Produkte überschreiben?", - "woo.overwriteBodyCount": "Dies stellt einen ausgehenden Produkt-Push in die Warteschlange. {count} zuvor verknüpfte WooCommerce-Produkt(e) können mit Descrybe-Inhalten aktualisiert werden.", - "woo.overwriteBody": "Dies stellt einen ausgehenden Produkt-Push in die Warteschlange. Übereinstimmende WooCommerce-Produkte können mit Descrybe-Inhalten aktualisiert werden.", + "woo.overwriteTitle": "WooCommerce-Produkte überschreiben?", + "woo.overwriteBodyCount": "Dies stellt einen ausgehenden Produkt-Push in die Warteschlange. {count} zuvor verknüpfte WooCommerce-Produkt(e) können mit Descrybe-Inhalten aktualisiert werden.", + "woo.overwriteBody": "Dies stellt einen ausgehenden Produkt-Push in die Warteschlange. Übereinstimmende WooCommerce-Produkte können mit Descrybe-Inhalten aktualisiert werden.", "woo.connectionTitle": "Store connection", "woo.connectionDesc": "Paste your store URL and a Read/Write REST API key pair. Save, then Test Connection before queuing syncs.", - "woo.enableSync": "Produkt-Push aktivieren (Descrybe → WooCommerce)", + "woo.enableSync": "Produkt-Push aktivieren (Descrybe → WooCommerce)", "woo.field.storeUrl": "Shop-URL", - "woo.field.storeUrlHelp": "Öffentliche Site-URL mit https. Für die WooCommerce-REST-API und Deep-Links in den WordPress-Admin.", + "woo.field.storeUrlHelp": "Öffentliche Site-URL mit https. Für die WooCommerce-REST-API und Deep-Links in den WordPress-Admin.", "woo.field.consumerKey": "Consumer Key", "woo.field.consumerSecret": "Consumer Secret", "woo.field.credentialsHelp": "Consumer Key und Secret mit Lese-/Schreibrechten. Leer lassen, um vorhandene Zugangsdaten zu behalten.", - "woo.placeholder.keep": "******** (unverändert)", - "woo.keepCredentialsHint": "Lassen Sie Schlüssel/Geheimnis beim Speichern leer, um bestehende Anmeldedaten zu behalten.", + "woo.placeholder.keep": "******** (unverändert)", + "woo.keepCredentialsHint": "Lassen Sie Schlüssel/Geheimnis beim Speichern leer, um bestehende Anmeldedaten zu behalten.", "woo.saveConfiguration": "Konfiguration speichern", "woo.categoryMappingTitle": "Kategoriezuordnung", "woo.categoryMappingDesc": "Ordnen Sie Ihre internen Kategorien den WooCommerce-Kategorien zu", "woo.autoMapCategories": "Kategorien automatisch zuordnen", "woo.autoMapping": "Automatische Zuordnung...", "woo.refreshCategories": "Kategorien aktualisieren", - "woo.availableCategories": "Verfügbare WooCommerce-Kategorien", + "woo.availableCategories": "Verfügbare WooCommerce-Kategorien", "woo.categoriesEmptyHint": "Testen Sie die Verbindung und aktualisieren Sie dann, um WooCommerce-Kategorien zu laden.", "woo.attributeMappingTitle": "Attributzuordnung", "woo.attributeMappingDesc": "Ordnen Sie Ihre internen Attribute den WooCommerce-Attributen zu", "woo.autoMapAttributes": "Attribute automatisch zuordnen", "woo.refreshAttributes": "Attribute aktualisieren", - "woo.availableAttributes": "Verfügbare WooCommerce-Attribute", + "woo.availableAttributes": "Verfügbare WooCommerce-Attribute", "woo.attributesEmptyHint": "Testen Sie die Verbindung und aktualisieren Sie dann, um WooCommerce-Attribute zu laden.", - "woo.ordersTitle": "Bestellimport (WooCommerce → Descrybe)", - "woo.ordersDesc": "WooCommerce → Descrybe — Bestellungen und Positionen nach Descrybe ziehen (schreibt nicht zurück in den Shop).", + "woo.ordersTitle": "Bestellimport (WooCommerce → Descrybe)", + "woo.ordersDesc": "WooCommerce → Descrybe — Bestellungen und Positionen nach Descrybe ziehen (schreibt nicht zurück in den Shop).", "woo.ordersNeedsReconnect": "Bestellimport kann erst laufen, wenn Zugangsdaten nach der Migration erneut verbunden sind. Im Reiter Verbindung: Speichern, dann Verbindung testen.", "woo.syncSettingsTitle": "Sync-Einstellungen", - "woo.syncSettingsDesc": "Konfigurieren, wie Produkte Descrybe → WooCommerce gepusht werden", + "woo.syncSettingsDesc": "Konfigurieren, wie Produkte Descrybe → WooCommerce gepusht werden", "woo.matchStrategy": "Produkt Matching Strategy", - "woo.matchStrategyHelp": "Produkt-Push (Descrybe → WooCommerce) matcht Remote-Produkte nach SKU oder EAN/GTIN. Syncs über den Reiter Verbindung einreihen (manuell).", + "woo.matchStrategyHelp": "Produkt-Push (Descrybe → WooCommerce) matcht Remote-Produkte nach SKU oder EAN/GTIN. Syncs über den Reiter Verbindung einreihen (manuell).", "woo.lastSyncLabel": "Letzte Sync", "woo.saveSyncSettings": "Sync-Einstellungen speichern", "woo.match.sku": "SKU", "woo.match.ean": "EAN/GTIN", - "plan.feature.section.shell": "Oberfläche", - "plan.feature.section.dashboard": "Übersicht", + "plan.feature.section.shell": "Oberfläche", + "plan.feature.section.dashboard": "Übersicht", "plan.feature.section.catalog": "Katalog", "plan.feature.section.feeds": "Feeds", "plan.feature.section.stores": "Shops", @@ -4005,21 +4006,21 @@ export const de: MessageDict = { "plan.feature.shell.company_switcher": "Unternehmenswechsler", "plan.feature.shell.support_notifications": "Support-Benachrichtigungsglocke", "plan.feature.shell.tutorial": "Produkt-Tutorial", - "plan.feature.shell.account_menu": "Kontomenü", + "plan.feature.shell.account_menu": "Kontomenü", "plan.feature.shell.billing_recovery_banner": "Banner zur Abrechnungswiederherstellung", - "plan.feature.dashboard.overview": "Dashboard-Übersicht", + "plan.feature.dashboard.overview": "Dashboard-Übersicht", "plan.feature.dashboard.stats": "Statistikkarten", "plan.feature.dashboard.quick_links": "Schnelllinks", - "plan.feature.dashboard.recent_jobs": "Aktuelle Aufträge", + "plan.feature.dashboard.recent_jobs": "Aktuelle Aufträge", "plan.feature.dashboard.news_feed": "Nachrichtenfeed", "plan.feature.dashboard.activation_checklist": "Aktivierungs-Checkliste", - "plan.feature.dashboard.migrated_checklist": "Checkliste für migrierte Kohorte", - "plan.feature.dashboard.etl_gaps": "ETL-Lücken-Panel", + "plan.feature.dashboard.migrated_checklist": "Checkliste für migrierte Kohorte", + "plan.feature.dashboard.etl_gaps": "ETL-Lücken-Panel", "plan.feature.dashboard.store_reconnect": "Banner zur Shop-Neuverbindung", "plan.feature.dashboard.upgrade_banners": "Upgrade-Banner", "plan.feature.catalog.products": "Produkte", "plan.feature.catalog.products.tab_processed": "Produkte - Registerkarte Verarbeitet", - "plan.feature.catalog.products.tab_needs_review": "Produkte - Registerkarte Prüfung nötig", + "plan.feature.catalog.products.tab_needs_review": "Produkte - Registerkarte Prüfung nötig", "plan.feature.catalog.products.tab_error": "Produkte - Registerkarte Fehler", "plan.feature.catalog.products.tab_processing": "Produkte - Registerkarte In Verarbeitung", "plan.feature.catalog.products.tab_unprocessed": "Produkte - Registerkarte Unverarbeitet", @@ -4027,8 +4028,8 @@ export const de: MessageDict = { "plan.feature.catalog.products.process_attributes": "Attribute / Specs verarbeiten", "plan.feature.catalog.products.process_ai_titles": "KI-Titel verarbeiten", "plan.feature.catalog.products.process_ai_descriptions": "KI-Beschreibungen verarbeiten", - "plan.feature.catalog.products.enrichment_review": "Anreicherungs-Prüfungsbereich", - "plan.feature.catalog.products.export_selection": "Ausgewählte Produkte exportieren", + "plan.feature.catalog.products.enrichment_review": "Anreicherungs-Prüfungsbereich", + "plan.feature.catalog.products.export_selection": "Ausgewählte Produkte exportieren", "plan.feature.catalog.products.upgrade_prompt": "Produkt-Upgrade-Hinweise", "plan.feature.catalog.categories": "Kategorien", "plan.feature.catalog.categories.title_formula": "Kategorie-Titelformel", @@ -4040,11 +4041,11 @@ export const de: MessageDict = { "plan.feature.catalog.structured_descriptions": "Strukturierte Beschreibungsfelder", "plan.feature.catalog.vector_categories": "Vektor-Kategorien", "plan.feature.feeds.list": "Import-Feeds", - "plan.feature.feeds.add_url": "Feed-URL hinzufügen", - "plan.feature.feeds.add_csv": "Feed per CSV-Upload hinzufügen", + "plan.feature.feeds.add_url": "Feed-URL hinzufügen", + "plan.feature.feeds.add_csv": "Feed per CSV-Upload hinzufügen", "plan.feature.feeds.sync": "Feed synchronisieren", "plan.feature.feeds.mapping": "Feed-Zuordnung", - "plan.feature.feeds.mapping.select_item": "Zuordnung - Item-Element auswählen", + "plan.feature.feeds.mapping.select_item": "Zuordnung - Item-Element auswählen", "plan.feature.feeds.mapping.map_fields": "Zuordnung - Felder zuordnen", "plan.feature.feeds.export_feeds": "Export-Feeds", "plan.feature.feeds.export_feeds.create": "Export-Feed erstellen", @@ -4064,30 +4065,30 @@ export const de: MessageDict = { "plan.feature.stores.shopify.settings": "Shopify-Einstellungen", "plan.feature.processing.monitor": "Verarbeitungsmonitor", "plan.feature.marketing.campaigns": "Kampagnen", - "plan.feature.marketing.campaigns.create": "Assistent für neue Kampagne", + "plan.feature.marketing.campaigns.create": "Assistent für neue Kampagne", "plan.feature.marketing.campaigns.generate_ai": "KI-Kampagnengenerierung", "plan.feature.marketing.campaigns.send": "Kampagne senden / Blast", "plan.feature.marketing.content_calendar": "Content-Kalender", "plan.feature.marketing.brand_kit": "Marken-Kit", "plan.feature.marketing.brand_ai_apply": "Marken-KI in Prompts anwenden", "plan.feature.marketing.seo": "SEO-Empfehlungen", - "plan.feature.marketing.seo.template_fill": "SEO-Vorlage ausfüllen", + "plan.feature.marketing.seo.template_fill": "SEO-Vorlage ausfüllen", "plan.feature.marketing.seo.ai_rewrite": "SEO-KI-Umschreibung", "plan.feature.marketing.reviews": "Bewertungen", "plan.feature.integrations.ai": "KI-Integrationen", - "plan.feature.integrations.ai.byok": "Eigenen KI-Schlüssel verwenden", + "plan.feature.integrations.ai.byok": "Eigenen KI-Schlüssel verwenden", "plan.feature.integrations.email": "E-Mail-Versand", "plan.feature.integrations.email.test": "E-Mail-Testversand", "plan.feature.integrations.email.blast": "E-Mail-Massenversand", - "plan.feature.billing.overview": "Abrechnungsübersicht", + "plan.feature.billing.overview": "Abrechnungsübersicht", "plan.feature.billing.customer_portal": "Stripe-Kundenportal", "plan.feature.billing.quick_upgrade": "Schnell-Upgrade-Checkout", - "plan.feature.billing.plans_compare": "Pläne vergleichen", + "plan.feature.billing.plans_compare": "Pläne vergleichen", "plan.feature.billing.checkout": "Stripe-Checkout", "plan.feature.settings.profile": "Profileinstellungen", "plan.feature.settings.company": "Unternehmenseinstellungen", "plan.feature.settings.alerts": "Alarmeinstellungen", - "plan.feature.settings.api_keys": "API-Schlüssel", + "plan.feature.settings.api_keys": "API-Schlüssel", "plan.feature.settings.team": "Teamverwaltung", "plan.feature.settings.team_invite": "Teammitglied einladen", "plan.feature.support.center": "Hilfe-Center", @@ -4095,9 +4096,9 @@ export const de: MessageDict = { "plan.feature.support.ticket_thread": "Support-Ticket-Thread", "plan.feature.capability.sku_cap": "Produkt-SKU-Limit", "plan.feature.capability.ai_credits": "KI-Guthaben-Wallet", - "plan.feature.capability.ai_processing": "KI-Verarbeitungsaufträge", + "plan.feature.capability.ai_processing": "KI-Verarbeitungsaufträge", "plan.feature.capability.eprel": "EPREL-Anreicherung", - "plan.feature.capability.normalize_specs_fill": "Normalisieren / Specs / Ausfüllen", + "plan.feature.capability.normalize_specs_fill": "Normalisieren / Specs / Ausfüllen", "plan.feature.capability.campaign_ai": "KI-Kampagnengenerierung", "plan.feature.capability.email_live_send": "Live-E-Mail-Zustellung", "plan.feature.capability.brand_ai_apply": "Markenstimme in KI-Prompts", @@ -4106,92 +4107,92 @@ export const de: MessageDict = { "plan.feature.capability.export_feed_limit": "Export-Feed-Limit (Marketing)", "plan.feature.capability.storage_limit": "Speicherlimit (Marketing)", "plan.feature.capability.api_access": "REST-API-Zugang (Marketing)", - "plan.feature.capability.byok": "Eigenen KI-Schlüssel verwenden", + "plan.feature.capability.byok": "Eigenen KI-Schlüssel verwenden", "billing.plan.free": "Kostenlos", - "products.actions.selectAll": "Alles auswählen", - "products.actions.upgradeSuffix": " · Upgrade", + "products.actions.selectAll": "Alles auswählen", + "products.actions.upgradeSuffix": " · Upgrade", "products.actions.upgradeRequired": "{label} (Upgrade erforderlich)", "products.actions.free": "kostenlos", "products.actions.credits": "{credits} Credits", - "products.actions.autoCategorizeTitle": "Kategorisierung wird automatisch hinzugefügt", - "products.actions.autoCategorizeBody": "{count} Produkt(e) brauchen Kategorisierung für die {types}-Verarbeitung", + "products.actions.autoCategorizeTitle": "Kategorisierung wird automatisch hinzugefügt", + "products.actions.autoCategorizeBody": "{count} Produkt(e) brauchen Kategorisierung für die {types}-Verarbeitung", "products.actions.aiLocked": "KI-Optionen sind auf Free gesperrt. Upgraden Sie, um Titel/Beschreibungen zu verarbeiten.", "products.actions.processSelected": "Auswahl verarbeiten", "products.actions.markProcessed": "Als verarbeitet markieren", - "products.actions.resetUnprocessed": "Auf unverarbeitet zurücksetzen", + "products.actions.resetUnprocessed": "Auf unverarbeitet zurücksetzen", "products.actions.export": "Exportieren", "products.upload.dropHint": "CSV hier ablegen oder klicken zum Durchsuchen", - "products.upload.supportsHint": "Unterstützt .csv-Produktimporte (ean, name, category…)", - "products.export.chooseConfig": "{count} ausgewählte(s) Produkt(e) exportieren. Wählen Sie den Export-Feed für Format und Felder.", - "products.export.selectPlaceholder": "Export-Feed auswählen…", + "products.upload.supportsHint": "Unterstützt .csv-Produktimporte (ean, name, category…)", + "products.export.chooseConfig": "{count} ausgewählte(s) Produkt(e) exportieren. Wählen Sie den Export-Feed für Format und Felder.", + "products.export.selectPlaceholder": "Export-Feed auswählen…", "fields.typeLabel": "Typ", "fields.groupLabel": "Gruppe", - "fields.selectGroup": "Gruppe auswählen", - "fields.groupBelongsHint": "Gruppe, zu der dieses Feld gehört", - "fields.addFieldShort": "Feld hinzufügen", + "fields.selectGroup": "Gruppe auswählen", + "fields.groupBelongsHint": "Gruppe, zu der dieses Feld gehört", + "fields.addFieldShort": "Feld hinzufügen", "fields.enableRecommended": "Empfohlene aktivieren", "feeds.activated": "Feed aktiviert.", "feeds.deactivated": "Feed deaktiviert.", - "feeds.syncTimeout": "Synchronisieren timed out waiting for the server. The job may still finish — open Synchronisieren History to check status.", + "feeds.syncTimeout": "Synchronisieren timed out waiting for the server. The job may still finish — open Synchronisieren History to check status.", "feeds.createdMapHint": "Feed erstellt. Ordnen Sie Felder vor dem Synchronisieren zu.", "feeds.createdPlain": "Feed erstellt.", "feeds.createdMapDesc": "Ordnen Sie Quellspalten Produktfeldern zu und synchronisieren Sie dann.", "feeds.lastLiveSync": "Letzte erfolgreiche Feed-Sync: {when}", "feeds.noLiveSyncProducts": "Noch keine erfolgreiche Feed-Sync. Katalog zuletzt aktualisiert {when}.", "feeds.noDataYet": "Noch keine Sync- oder Katalogdaten.", - "products.filters.incomplete": "Unvollständig", - "products.filters.complete44": "Vollständig (4/4)", + "products.filters.incomplete": "Unvollständig", + "products.filters.complete44": "Vollständig (4/4)", "products.filters.missingName": "Name fehlt", "products.filters.missingDescription": "Beschreibung fehlt", "products.filters.missingAttributes": "Attribute fehlen", "products.filters.missingCategory": "Kategorie fehlt", "products.filters.hasEprel": "Hat EPREL", "products.filters.noEprel": "Kein EPREL", - "products.filters.priceChanged": "Preis geändert", - "products.filters.stockChanged": "Bestand geändert", - "products.filters.titleChanged": "Titel geändert", + "products.filters.priceChanged": "Preis geändert", + "products.filters.stockChanged": "Bestand geändert", + "products.filters.titleChanged": "Titel geändert", "products.filters.newFromFeed": "Neu aus Feed", - "products.filters.otherFieldChange": "Andere Feldänderung", + "products.filters.otherFieldChange": "Andere Feldänderung", "products.filters.sortUpdatedNewest": "Aktualisiert (neueste)", - "products.filters.sortUpdatedOldest": "Aktualisiert (älteste)", + "products.filters.sortUpdatedOldest": "Aktualisiert (älteste)", "products.filters.sortNameAsc": "Name (A-Z)", "products.filters.sortNameDesc": "Name (Z-A)", "products.filters.searchPlaceholder": "Produkte suchen...", "products.filters.searchCategories": "Kategorien suchen...", - "products.filters.selectFeed": "Feed auswählen", - "products.filters.loadingFeeds": "Feeds werden geladen…", + "products.filters.selectFeed": "Feed auswählen", + "products.filters.loadingFeeds": "Feeds werden geladen…", "products.table.loading": "Produkte werden geladen", "products.table.uncategorized": "Unkategorisiert", "products.table.assignCategory": "Kategorie zuweisen", - "products.table.changeCategory": "Kategorie für {name} ändern", - "products.table.selectCategory": "Kategorie auswählen…", + "products.table.changeCategory": "Kategorie für {name} ändern", + "products.table.selectCategory": "Kategorie auswählen…", "products.table.saveCategory": "Kategorie speichern", "products.table.cancelCategory": "Kategoriebearbeitung abbrechen", - "products.table.categoryRequired": "Kategorie wählen", - "products.table.noCategoriesAvailable": "Noch keine Kategorien — erstelle eine unter Katalog", - "products.table.qualityUnavailable": "Qualität nicht verfügbar", + "products.table.categoryRequired": "Kategorie wählen", + "products.table.noCategoriesAvailable": "Noch keine Kategorien — erstelle eine unter Katalog", + "products.table.qualityUnavailable": "Qualität nicht verfügbar", "products.table.full": "Voll", "products.table.empty": "Leer", "products.table.saveName": "Name speichern", "products.table.cancelRename": "Umbenennen abbrechen", "products.table.noSyncYet": "Noch keine Sync", - "products.feedSync.feedAndWhen": "{feed} · {when}", + "products.feedSync.feedAndWhen": "{feed} · {when}", "products.feedSync.syncedWhen": "Synchronisiert {when}", "products.table.productOptions": "Produktoptionen", "products.edit.details": "Produktdetails", "products.edit.noEprel": "Keine EPREL-ID auf diesem Produkt.", "products.edit.specsPresent": "Technische Spezifikationen sind auf diesem Produkt vorhanden.", "products.edit.noEnrichedName": "Kein angereicherter Name", - "products.edit.resetName": "Angereicherten Namen auf Original zurücksetzen", - "products.edit.cannotClearName": "Original ist leer — angereicherter Name kann per PATCH nicht gelöscht werden", + "products.edit.resetName": "Angereicherten Namen auf Original zurücksetzen", + "products.edit.cannotClearName": "Original ist leer — angereicherter Name kann per PATCH nicht gelöscht werden", "products.edit.showPreview": "Vorschau anzeigen", "products.edit.editHtml": "HTML bearbeiten", "products.edit.noEnrichedDescription": "Keine angereicherte Beschreibung", - "products.edit.resetDescription": "Angereicherte Beschreibung auf Original zurücksetzen", - "products.edit.cannotClearDescription": "Original ist leer — angereicherte Beschreibung kann nicht per PATCH gelöscht werden", + "products.edit.resetDescription": "Angereicherte Beschreibung auf Original zurücksetzen", + "products.edit.cannotClearDescription": "Original ist leer — angereicherte Beschreibung kann nicht per PATCH gelöscht werden", "products.edit.unknownFeed": "Unbekannter Feed", - "products.edit.noProcessedName": "Kein verarbeiteter Name verfügbar", - "products.edit.feedNamed": "Feed · {name}", + "products.edit.noProcessedName": "Kein verarbeiteter Name verfügbar", + "products.edit.feedNamed": "Feed · {name}", "products.edit.noAiDescription": "Keine KI-Beschreibung", "products.edit.sourceLabel": "Quellenbezeichnung", "products.edit.coverageTitle": "Wie viele von Name, Beschreibung, Attributen und Kategorie vorhanden sind (Feed oder verarbeitet).", @@ -4199,15 +4200,15 @@ export const de: MessageDict = { "products.edit.eprelPresentTitle": "Die European Product Registry for Energy Labelling (EPREL)-ID ist auf diesem Produkt vorhanden.", "products.edit.noEprelBadge": "Kein EPREL", "products.edit.specsBadge": "Specs", - "products.edit.reviewBannerTitle": "Angereicherte Felder vor dem Akzeptieren prüfen", - "products.edit.reviewBannerHelp": "Nutzen Sie den Tab Prüfung, um Originale mit KI zu vergleichen. Kürzel: A akzeptieren · R ablehnen · Alt+1/2 Feld · ⌘/Ctrl+Enter alles akzeptieren.", - "products.edit.tab.review": "Prüfen", + "products.edit.reviewBannerTitle": "Angereicherte Felder vor dem Akzeptieren prüfen", + "products.edit.reviewBannerHelp": "Nutzen Sie den Tab Prüfung, um Originale mit KI zu vergleichen. Kürzel: A akzeptieren · R ablehnen · Alt+1/2 Feld · ⌘/Ctrl+Enter alles akzeptieren.", + "products.edit.tab.review": "Prüfen", "products.edit.tab.details": "Details", "products.edit.tab.content": "Inhalt", "products.edit.tab.attributes": "Attribute", "products.edit.tab.feed": "Feed", - "products.edit.changed": "Geändert", - "products.edit.matched": "Übereinstimmend", + "products.edit.changed": "Geändert", + "products.edit.matched": "Übereinstimmend", "products.edit.original": "Original", "products.edit.enriched": "Angereichert", "products.edit.discardName": "Name verwerfen", @@ -4215,10 +4216,10 @@ export const de: MessageDict = { "products.edit.discardDescription": "Beschreibung verwerfen", "products.edit.acceptDescription": "Beschreibung akzeptieren", "products.edit.noCategory": "No Kategorie", - "products.edit.whatsFilledIn": "Was ausgefüllt ist", - "products.edit.coverageLegend": "Gray = missing · Orange = from Feed · Green = processed", + "products.edit.whatsFilledIn": "Was ausgefüllt ist", + "products.edit.coverageLegend": "Gray = missing · Orange = from Feed · Green = processed", "products.edit.feedSource": "Feed-Quelle", - "products.edit.updatedRelative": "· aktualisiert {when}", + "products.edit.updatedRelative": "· aktualisiert {when}", "products.edit.viewAllFeedFields": "View all Feed fields ({filled}/{total})", "products.edit.productIdentity": "Produkt identity", "products.edit.aiProcessedName": "AI-verarbeiteter Name", @@ -4226,9 +4227,9 @@ export const de: MessageDict = { "products.edit.productIdSku": "Produkt ID / SKU", "products.edit.rowUpdated": "Produktzeile aktualisiert {when}", "products.edit.noRawUpdateTime": "No raw Produkt update time", - "products.edit.feedSyncLabel": "· Feed sync {when}", + "products.edit.feedSyncLabel": "· Feed sync {when}", "products.edit.neverRecorded": "nie erfasst", - "products.edit.feedFilledCount": "{filled} ausgefüllt · {total} Felder", + "products.edit.feedFilledCount": "{filled} ausgefüllt · {total} Felder", "products.edit.noMappedFeedFields": "No mapped Feed fields on this Produkt.", "products.edit.fieldCol": "Feld", "products.edit.valueFromFeed": "Wert from Feed", @@ -4237,21 +4238,21 @@ export const de: MessageDict = { "products.edit.originalDescription": "Originalbeschreibung", "products.edit.noAttrsYet": "No Attribut or specification data on this Produkt yet.", "products.edit.fromFeed": "Aus dem Feed", - "products.edit.feedAttrsHelp": "Aus dem Feed geparste Werte (Spezifikationen HTML, Garantie, Maße, EPREL). Schlüssel werden nach Möglichkeit mit attribute_key verknüpft.", + "products.edit.feedAttrsHelp": "Aus dem Feed geparste Werte (Spezifikationen HTML, Garantie, Maße, EPREL). Schlüssel werden nach Möglichkeit mit attribute_key verknüpft.", "products.edit.fieldsCount": "{count} Felder", "products.edit.originalAttributes": "Original-Attribute", "products.edit.aiAttributes": "KI- / angereicherte Attribute", "products.edit.editableAttributes": "Bearbeitbare Attribute", - "products.edit.editableAttributesHelp": "Änderungen werden in der Produkt-Attributmap gespeichert. Feed- und KI-Zeilen darunter bleiben als Referenz, wenn sie abweichen.", - "products.edit.addAttribute": "Attribut hinzufügen", - "products.edit.attrKeyPlaceholder": "Schlüssel", + "products.edit.editableAttributesHelp": "Änderungen werden in der Produkt-Attributmap gespeichert. Feed- und KI-Zeilen darunter bleiben als Referenz, wenn sie abweichen.", + "products.edit.addAttribute": "Attribut hinzufügen", + "products.edit.attrKeyPlaceholder": "Schlüssel", "products.edit.attrValuePlaceholder": "Wert", "products.edit.removeAttribute": "{key} entfernen", - "products.edit.noEditableAttrs": "Noch keine bearbeitbaren Attribute. Schlüssel/Wert-Paar hinzufügen.", + "products.edit.noEditableAttrs": "Noch keine bearbeitbaren Attribute. Schlüssel/Wert-Paar hinzufügen.", "products.edit.reject": "Ablehnen", - "products.edit.accept": "Übernehmen", + "products.edit.accept": "Übernehmen", "taskIndicator.title": "Hintergrundaufgaben", - "taskIndicator.activeOne": "1 Job läuft", + "taskIndicator.activeOne": "1 Job läuft", "taskIndicator.activeMany": "{count} Jobs laufen", "taskIndicator.view": "Fortschritt anzeigen", "taskIndicator.expand": "Aufgabenliste ausklappen", @@ -4264,146 +4265,146 @@ export const de: MessageDict = { "products.filters.sortLabel": "Sortierung: {label}", "products.table.colIdName": "ID/Name", "products.table.colCoverage": "Abdeckung", - "products.table.coverageTitle": "Abdeckung: N=Name, D=Beschreibung, A=Attribute, C=Kategorie. Grau=fehlend, orange=aus dem Feed, grün=verarbeitet. EPREL zeigt die Energieetiketten-Register-ID.", + "products.table.coverageTitle": "Abdeckung: N=Name, D=Beschreibung, A=Attribute, C=Kategorie. Grau=fehlend, orange=aus dem Feed, grün=verarbeitet. EPREL zeigt die Energieetiketten-Register-ID.", "products.table.colFeed": "Feed", "products.table.colCategory": "Kategorie", "products.table.colStatus": "Zustand", "products.table.colUpdated": "Zuletzt aktualisiert", "products.table.colActions": "Aktionen", - "products.table.loadingDots": "Produkte werden geladen…", + "products.table.loadingDots": "Produkte werden geladen…", "products.table.noneFound": "Keine Produkte gefunden.", - "products.table.selectProduct": "Produkt {name} auswählen", + "products.table.selectProduct": "Produkt {name} auswählen", "products.table.rename": "{name} umbenennen", - "products.table.productNameAria": "Produktname für {name}", - "products.table.selectPage": "Auswählen {count} on this page", - "products.table.deselectPage": "{count} auf dieser Seite abwählen", + "products.table.productNameAria": "Produktname für {name}", + "products.table.selectPage": "Auswählen {count} on this page", + "products.table.deselectPage": "{count} auf dieser Seite abwählen", "categories.assign": "Zuweisen", - "categories.titleFormulaSubtitle": "Legen Sie fest, wie Produkttitel für {name} erzeugt werden sollen", - "categories.addText": "Text hinzufügen", - "categories.aboutTitleFormulas": "Über Titelformeln", + "categories.titleFormulaSubtitle": "Legen Sie fest, wie Produkttitel für {name} erzeugt werden sollen", + "categories.addText": "Text hinzufügen", + "categories.aboutTitleFormulas": "Über Titelformeln", "categories.aboutTitleFormulasHelp": "Titel werden von links nach rechts aus den folgenden Elementen zusammengesetzt.", - "categories.variablesReplacedHelp": "Variablen werden durch Produktdaten ersetzt, sofern verfügbar. Fehlende Werte werden übersprungen.", + "categories.variablesReplacedHelp": "Variablen werden durch Produktdaten ersetzt, sofern verfügbar. Fehlende Werte werden übersprungen.", "categories.variableTypeHelp": "Dynamisches Feld aus Produktdaten (Beispiel: Marke).", "categories.textTypeHelp": "Statischer Text, der immer wie geschrieben erscheint.", "categories.assignTitleCopyHelp": "Mit Zuweisen kopieren Sie diese Formel auf andere Kategorien, die dasselbe Titelmuster teilen sollen.", - "categories.titleFormulaInvalid": "Diese Titelformel-Seite benötigt eine gültige Kategorie. Kehren Sie zu Kategorien zurück und öffnen Sie Titelformel bearbeiten erneut.", + "categories.titleFormulaInvalid": "Diese Titelformel-Seite benötigt eine gültige Kategorie. Kehren Sie zu Kategorien zurück und öffnen Sie Titelformel bearbeiten erneut.", "categories.preview.title": "Titelvorschau", "categories.preview.description": "So werden Ihre Produkttitel strukturiert", "categories.preview.exampleTab": "Beispielvorschau", "categories.preview.structureTab": "Formelstruktur", - "categories.preview.noElements": "Noch keine Elemente hinzugefügt", + "categories.preview.noElements": "Noch keine Elemente hinzugefügt", "categories.brandTips.title": "Markenbezogene Tipps", - "categories.brandTips.freePlan": "Das Marken-Kit ist im Free-Plan bearbeitbar; KI-Anwendung schaltet sich in bezahlten Plänen frei.", + "categories.brandTips.freePlan": "Das Marken-Kit ist im Free-Plan bearbeitbar; KI-Anwendung schaltet sich in bezahlten Plänen frei.", "categories.brandTips.editBrandKit": "Marken-Kit bearbeiten", - "categories.brandTips.emptyBefore": "Fügen Sie Stimme oder bevorzugte Begriffe in ", + "categories.brandTips.emptyBefore": "Fügen Sie Stimme oder bevorzugte Begriffe in ", "categories.brandTips.emptyAfter": " hinzu, um hier Tipps zu sehen.", "categories.brandTips.brandKit": "Marken-Kit", "categories.brandTips.descGuidanceBefore": "Hinweise aus Ihrem ", - "categories.brandTips.descGuidanceAfter": " für Beschreibungsabschnitte.", + "categories.brandTips.descGuidanceAfter": " für Beschreibungsabschnitte.", "categories.formulaElementsTitle": "Formelelemente", "categories.formulaElementsHelp": "Elemente per Drag & Drop neu anordnen", - "categories.noElementsAdded": "Keine Elemente hinzugefügt", - "categories.addElementsHint": "Fügen Sie Variablen oder Text rechts im Panel hinzu", + "categories.noElementsAdded": "Keine Elemente hinzugefügt", + "categories.addElementsHint": "Fügen Sie Variablen oder Text rechts im Panel hinzu", "categories.editTextElementAria": "Textelement {value} bearbeiten", "categories.removeElementAria": "{type}-Element {value} entfernen", "categories.tab.single": "Einzeln", "categories.tab.bulk": "Massenupload", "categories.uniqueIdLabel": "Eindeutige ID", - "categories.parentLabel": "Übergeordnet", + "categories.parentLabel": "Übergeordnet", "categories.noneRoot": "Keine (Stamm)", "categories.descriptionLabel": "Beschreibung", "categories.csvUploadHelp": "Laden Sie eine CSV mit den Spalten name, unique_id sowie optional parent_unique_id und description hoch.", "categories.downloadTemplate": "Vorlage herunterladen", - "categories.variableNameKey": "Name (Schlüssel)", + "categories.variableNameKey": "Name (Schlüssel)", "categories.displayName": "Anzeigename", "categories.exampleValue": "Beispielwert", "categories.variableExists": "Eine Variable mit dem Namen \"{name}\" existiert bereits.", - "categories.addVariable": "Variable hinzufügen", + "categories.addVariable": "Variable hinzufügen", "categories.updateVariable": "Variable aktualisieren", "categories.col.displayName": "Anzeigename", - "categories.col.key": "Schlüssel", + "categories.col.key": "Schlüssel", "categories.col.description": "Beschreibung", "categories.col.example": "Beispiel", "categories.noVariablesFound": "Keine Variablen gefunden", - "categories.availableVariables": "Verfügbare Variablen", + "categories.availableVariables": "Verfügbare Variablen", "categories.manage": "Verwalten", - "categories.noVariablesMatch": "Keine Variablen entsprechen „{query}“.", - "categories.noUnusedVariables": "Keine ungenutzten Variablen mehr. Fügen Sie eine benutzerdefinierte Variable hinzu oder entfernen Sie ein Element.", + "categories.noVariablesMatch": "Keine Variablen entsprechen „{query}“.", + "categories.noUnusedVariables": "Keine ungenutzten Variablen mehr. Fügen Sie eine benutzerdefinierte Variable hinzu oder entfernen Sie ein Element.", "categories.exampleColon": "Beispiel: {value}", "categories.editVariableAria": "{label} bearbeiten", - "categories.deleteVariableAria": "{label} löschen", - "categories.addVariableAria": "{label} hinzufügen", + "categories.deleteVariableAria": "{label} löschen", + "categories.addVariableAria": "{label} hinzufügen", "categories.textLabel": "Text", "categories.textAppearsAsWritten": "Dieser Text erscheint in Ihren Titeln genau wie geschrieben", - "categories.addTextButton": "Text hinzufügen", + "categories.addTextButton": "Text hinzufügen", "categories.updateTextButton": "Text aktualisieren", - "categories.structureDescriptionsFor": "Produktbeschreibungen für {name} strukturieren", + "categories.structureDescriptionsFor": "Produktbeschreibungen für {name} strukturieren", "categories.metaInformation": "Meta-Informationen", - "categories.metaInformationHelp": "Anweisungen, die die KI für SEO-Titel und Meta-Beschreibung verwendet.", + "categories.metaInformationHelp": "Anweisungen, die die KI für SEO-Titel und Meta-Beschreibung verwendet.", "categories.metaTitleFormula": "Meta-Titelformel", - "categories.metaTitleHint": "Wird in Suchergebnissen und Browser-Tabs angezeigt (etwa 50–60 Zeichen).", + "categories.metaTitleHint": "Wird in Suchergebnissen und Browser-Tabs angezeigt (etwa 50–60 Zeichen).", "categories.metaDescriptionFormula": "Meta-Beschreibungsformel", - "categories.metaDescriptionHint": "Wird unter dem Titel in Suchergebnissen angezeigt (etwa 120–155 Zeichen).", - "categories.resetToDefault": "Auf Standard zurücksetzen", + "categories.metaDescriptionHint": "Wird unter dem Titel in Suchergebnissen angezeigt (etwa 120–155 Zeichen).", + "categories.resetToDefault": "Auf Standard zurücksetzen", "categories.descriptionSections": "Beschreibungsabschnitte", "categories.descriptionSectionsHelp": "Ziehen Sie Abschnitte, um die Reihenfolge der generierten Beschreibung festzulegen.", "categories.noSectionsYet": "Noch keine Abschnitte", - "categories.addSectionsHint": "Fügen Sie eine Überschrift, einen Absatz oder eine Liste hinzu.", + "categories.addSectionsHint": "Fügen Sie eine Überschrift, einen Absatz oder eine Liste hinzu.", "categories.aiInstructions": "KI-Anweisungen", "categories.exportIdOptional": "Export-ID (optional)", "categories.exportIdUnique": "Export-ID muss eindeutig sein", - "categories.addSection": "Abschnitt hinzufügen", - "categories.aboutDescriptionFormulas": "Über Beschreibungsformeln", - "categories.aboutDescriptionFormulasHelp": "Diese Anweisungen sagen der KI, wie Beschreibungen für Produkte in dieser Kategorie geschrieben werden sollen.", + "categories.addSection": "Abschnitt hinzufügen", + "categories.aboutDescriptionFormulas": "Über Beschreibungsformeln", + "categories.aboutDescriptionFormulasHelp": "Diese Anweisungen sagen der KI, wie Beschreibungen für Produkte in dieser Kategorie geschrieben werden sollen.", "categories.sectionTypesHeading": "Abschnittstypen", - "categories.sectionTypeHeadings": "Überschriften (H1–H4):", + "categories.sectionTypeHeadings": "Überschriften (H1–H4):", "categories.sectionTypeHeadingsHelp": "Titel und Untertitel", - "categories.sectionTypeParagraphs": "Absätze:", - "categories.sectionTypeParagraphsHelp": "Hauptinhaltsblöcke", - "categories.sectionTypeLists": "Aufzählungen:", + "categories.sectionTypeParagraphs": "Absätze:", + "categories.sectionTypeParagraphsHelp": "Hauptinhaltsblöcke", + "categories.sectionTypeLists": "Aufzählungen:", "categories.sectionTypeListsHelp": "Features und Specs", "categories.aiInstructionsHeading": "KI-Anweisungen", - "categories.aiInstructionsBody": "Schreiben Sie pro Abschnitt eine klare Aufgabe (Inhalt, Ton, Länge). Vage Prompts erzeugen vage Texte.", + "categories.aiInstructionsBody": "Schreiben Sie pro Abschnitt eine klare Aufgabe (Inhalt, Ton, Länge). Vage Prompts erzeugen vage Texte.", "categories.exportIdsHeading": "Export-IDs", "categories.exportIdsBody": "Optionale IDs ordnen einen Abschnitt Export-Feeds zu (zum Beispiel short_description).", "categories.assignDescCopyHelp": "Mit Zuweisen kopieren Sie diese Vorlage auf andere Kategorien mit derselben Struktur.", - "categories.descriptionFormulaInvalid": "Diese Beschreibungsformel-Seite benötigt eine gültige Kategorie. Kehren Sie zu Kategorien zurück und öffnen Sie Beschreibungsformel bearbeiten erneut.", - "categories.sectionType.h1": "Überschrift 1", - "categories.sectionType.h2": "Überschrift 2", - "categories.sectionType.h3": "Überschrift 3", - "categories.sectionType.h4": "Überschrift 4", + "categories.descriptionFormulaInvalid": "Diese Beschreibungsformel-Seite benötigt eine gültige Kategorie. Kehren Sie zu Kategorien zurück und öffnen Sie Beschreibungsformel bearbeiten erneut.", + "categories.sectionType.h1": "Überschrift 1", + "categories.sectionType.h2": "Überschrift 2", + "categories.sectionType.h3": "Überschrift 3", + "categories.sectionType.h4": "Überschrift 4", "categories.sectionType.p": "Absatz", - "categories.sectionType.ul": "Aufzählung", + "categories.sectionType.ul": "Aufzählung", "categories.aiGenerationPrompt": "KI-Generierungs-Prompt", - "categories.aiPromptOverrides": "Überschreibt den Unternehmens-Prompt zur Produktverbesserung für {name}", + "categories.aiPromptOverrides": "Überschreibt den Unternehmens-Prompt zur Produktverbesserung für {name}", "categories.promptTemplate": "Prompt-Vorlage", - "categories.promptTemplateHelp": "Verwenden Sie Platzhalter wie {{name}} und {{description}}. Leer lassen, um den Unternehmensstandard unter Integrationen → KI zu verwenden.", + "categories.promptTemplateHelp": "Verwenden Sie Platzhalter wie {{name}} und {{description}}. Leer lassen, um den Unternehmensstandard unter Integrationen → KI zu verwenden.", "categories.clear": "Leeren", "categories.promptLabel": "Prompt", "categories.charactersCount": "{count} Zeichen", - "categories.activeOverride": "· aktive Überschreibung für diese Kategorie", - "categories.usingCompanyDefault": "· Unternehmens-/Standardvorgabe wird verwendet", - "categories.usingCompanyDefaultForLang": "· leer für diese Sprache — Unternehmens-/integrierter Standard gilt", - "categories.aiPromptSavedLang": "KI-Prompt für {lang} gespeichert.", - "categories.aiPromptClearedLang": "KI-Prompt für {lang} gelöscht (Unternehmensstandard gilt).", + "categories.activeOverride": "· aktive Überschreibung für diese Kategorie", + "categories.usingCompanyDefault": "· Unternehmens-/Standardvorgabe wird verwendet", + "categories.usingCompanyDefaultForLang": "· leer für diese Sprache — Unternehmens-/integrierter Standard gilt", + "categories.aiPromptSavedLang": "KI-Prompt für {lang} gespeichert.", + "categories.aiPromptClearedLang": "KI-Prompt für {lang} gelöscht (Unternehmensstandard gilt).", "contentLang.switcherLabel": "Inhaltssprache", - "contentLang.primary": "primär", + "contentLang.primary": "primär", "contentLang.hasOverride": "benutzerdefiniert", - "contentLang.addLanguage": "Sprache hinzufügen…", - "contentLang.add": "Hinzufügen", + "contentLang.addLanguage": "Sprache hinzufügen…", + "contentLang.add": "Hinzufügen", "contentLang.removeLanguage": "{lang} entfernen", - "contentLang.resultsHint": "Sprache wechseln, um KI-Titel und -Beschreibungen für jede Inhaltssprache zu prüfen.", + "contentLang.resultsHint": "Sprache wechseln, um KI-Titel und -Beschreibungen für jede Inhaltssprache zu prüfen.", "contentLang.settingsTitle": "Inhaltssprachen", - "contentLang.settingsHelp": "Die Primärsprache wird standardmäßig verwendet. Zusätzliche Sprachen erhalten eigene Prompts und KI-Ergebnisse (jeder Durchlauf verbraucht Credits).", - "ai.prompts.languageHelp": "Unternehmens-Prompts je Inhaltssprache bearbeiten. Leere Sprache fällt auf die integrierte Standardeinstellung für diese Sprache zurück.", - "header.accountSettingsAria": "Kontoeinstellungen für {email}", + "contentLang.settingsHelp": "Die Primärsprache wird standardmäßig verwendet. Zusätzliche Sprachen erhalten eigene Prompts und KI-Ergebnisse (jeder Durchlauf verbraucht Credits).", + "ai.prompts.languageHelp": "Unternehmens-Prompts je Inhaltssprache bearbeiten. Leere Sprache fällt auf die integrierte Standardeinstellung für diese Sprache zurück.", + "header.accountSettingsAria": "Kontoeinstellungen für {email}", "switcher.switchUserAria": "Benutzer wechseln: {label}", - "switcher.unavailable": "Benutzerwechsel ist in dieser Umgebung nicht verfügbar.", + "switcher.unavailable": "Benutzerwechsel ist in dieser Umgebung nicht verfügbar.", "switcher.loadFailed": "Benutzer konnten nicht geladen werden.", "support.notifications.aria": "Support-Benachrichtigungen", "support.notifications.ariaUnread": "Support-Benachrichtigungen, {count} ungelesen", "time.never": "Nie", - "time.invalid": "Ungültiges Datum", + "time.invalid": "Ungültiges Datum", "time.unknown": "Unbekanntes Datum", "time.justNow": "gerade eben", "time.neverUsed": "Nie verwendet", @@ -4412,24 +4413,24 @@ export const de: MessageDict = { "news.subtitle": "Neueste Funktionen und Verbesserungen", "news.keyFeatures": "Wichtige Funktionen:", "news.badge.new": "Neu", - "news.footer": "Das war’s fürs Erste — schauen Sie nach dem nächsten Release wieder vorbei.", + "news.footer": "Das war’s fürs Erste — schauen Sie nach dem nächsten Release wieder vorbei.", "news.category.enhancement": "Verbesserung", "news.category.feature": "Funktion", "news.category.integration": "Integration", "news.category.newFeature": "Neue Funktion", "news.category.billing": "Abrechnung", "news.uxImprovements.description": "Verbesserte Benutzerfreundlichkeit mit Tour-Steuerung, API-Verbesserungen und besserer Navigation.", - "news.uxImprovements.f1": "Tour überspringen/ausblenden", - "news.uxImprovements.f2": "API-Zuverlässigkeitsverbesserungen", + "news.uxImprovements.f1": "Tour überspringen/ausblenden", + "news.uxImprovements.f2": "API-Zuverlässigkeitsverbesserungen", "news.uxImprovements.f3": "Verbesserte UI-Navigation", "news.uxImprovements.f4": "Bessere Workflow-Effizienz", - "news.multiselect.title": "Unterstützung für Mehrfachauswahl-Attribute", - "news.multiselect.description": "Produkte können mehrere Werte für Listenattribute haben.", + "news.multiselect.title": "Unterstützung für Mehrfachauswahl-Attribute", + "news.multiselect.description": "Produkte können mehrere Werte für Listenattribute haben.", "news.multiselect.f1": "Mehrfachauswahl-Attributtyp", "news.multiselect.f2": "Mehrfachauswahl in der Produktbearbeitung", "news.multiselect.f3": "Mehrere Werte auf einem Attribut", - "news.multiselect.f4": "Verbesserte Extraktion für Mehrfachauswahlfelder", - "news.multiselect.f5": "Bessere Kompatibilität von Export-Feeds", + "news.multiselect.f4": "Verbesserte Extraktion für Mehrfachauswahlfelder", + "news.multiselect.f5": "Bessere Kompatibilität von Export-Feeds", "news.csvEan.title": "CSV-EAN-Upload", "news.csvEan.description": "CSV-Dateien mit EAN-Codes hochladen, um hunderte Produkte auf einmal zu verarbeiten.", "news.csvEan.f1": "CSV-Upload per Drag & Drop", @@ -4437,35 +4438,35 @@ export const de: MessageDict = { "news.csvEan.f3": "Automatische Duplikaterkennung", "news.csvEan.f4": "Massenverarbeitung von Produkten", "news.csvEan.f5": "Detaillierte Verarbeitungsstatistiken", - "news.brick.title": "BRICK-Code-Attributunterstützung", - "news.brick.description": "Attributsystem mit BRICK-Codes für standardisierte Klassifikation und Exporte.", + "news.brick.title": "BRICK-Code-Attributunterstützung", + "news.brick.description": "Attributsystem mit BRICK-Codes für standardisierte Klassifikation und Exporte.", "news.brick.f1": "BRICK-Code-Attributverarbeitung", "news.brick.f2": "Automatische Codeformatierung in Exporten", "news.brick.f3": "BRICK-Code-Integration in XML-Feeds", - "news.brick.f4": "Kompatibilitätsverbesserungen für Export-Feeds", - "news.apiV1.title": "API-v1-Veröffentlichung", - "news.apiV1.description": "Neue API-v1-Endpunkte für Kategorien, Attribute, Feeds, Produkte und Exporte.", + "news.brick.f4": "Kompatibilitätsverbesserungen für Export-Feeds", + "news.apiV1.title": "API-v1-Veröffentlichung", + "news.apiV1.description": "Neue API-v1-Endpunkte für Kategorien, Attribute, Feeds, Produkte und Exporte.", "news.apiV1.f1": "RESTful API-v1-Endpunkte", "news.apiV1.f2": "Verwaltung von Kategorien und Attributen", "news.apiV1.f3": "Feed-Erstellung und -Verwaltung", - "news.apiV1.f4": "Produktverarbeitung über API", + "news.apiV1.f4": "Produktverarbeitung über API", "news.apiV1.f5": "Programmatischer Zugriff auf Export-Feeds", "news.apiV1.f6": "Authentifizierung und Autorisierung", "news.feedFiltering.title": "Feed-Filterung auf der Produktseite", - "news.feedFiltering.description": "Produktseite mit optimierter Feed-Filterung, Ladezuständen und besserer Performance.", + "news.feedFiltering.description": "Produktseite mit optimierter Feed-Filterung, Ladezuständen und besserer Performance.", "news.feedFiltering.f1": "Verbesserte Feed-Filterung", - "news.feedFiltering.f2": "Verbesserte Ladezustände", + "news.feedFiltering.f2": "Verbesserte Ladezustände", "news.feedFiltering.f3": "Optimierte Abfrageleistung", "news.feedFiltering.f4": "Bessere Paginierungsbehandlung", "news.feedFiltering.f5": "Verbesserungen der Exportfunktion", "news.exportFeeds.title": "Export-Feed-System", - "news.exportFeeds.description": "Umfassendes Export-Feed-System für XML/CSV mit benutzerdefinierten Konfigurationen.", + "news.exportFeeds.description": "Umfassendes Export-Feed-System für XML/CSV mit benutzerdefinierten Konfigurationen.", "news.exportFeeds.f1": "XML- und CSV-Exportformate", "news.exportFeeds.f2": "Benutzerdefiniertes Feldmapping", "news.exportFeeds.f3": "Exportvorschau", "news.exportFeeds.f4": "Jobbasierter Produktexport", "news.exportFeeds.f5": "EPREL-Datenintegration", - "news.exportFeeds.f6": "Öffentliche Export-Feed-URLs", + "news.exportFeeds.f6": "Öffentliche Export-Feed-URLs", "news.woocommerce.title": "WooCommerce-Integration", "news.woocommerce.description": "Produkte, Kategorien und Attribute mit WooCommerce-Shops synchronisieren.", "news.woocommerce.f1": "Shop-Anmeldedaten konfigurieren", @@ -4473,24 +4474,24 @@ export const de: MessageDict = { "news.woocommerce.f3": "Bidirektionale Produktsynchronisation", "news.woocommerce.f4": "Match-Strategieoptionen", "news.eprel.title": "EPREL-Energieetiketten-Integration", - "news.eprel.description": "Anbindung an das europäische Energieetikettenregister für Effizienzdaten.", + "news.eprel.description": "Anbindung an das europäische Energieetikettenregister für Effizienzdaten.", "news.eprel.f1": "Automatische EPREL-ID-Verarbeitung", "news.eprel.f2": "Abruf von Energieetikettenbildern", "news.eprel.f3": "Download von Produkt-Energiefiches", "news.eprel.f4": "Extraktion der Energieklasse", - "news.eprel.f5": "Mehrsprachige Unterstützung", + "news.eprel.f5": "Mehrsprachige Unterstützung", "news.aiCategorization.title": "Verbesserte Produktkategorisierung", - "news.aiCategorization.description": "KI-Kategorisierung mit höherer Genauigkeit und hierarchischer Unterstützung.", + "news.aiCategorization.description": "KI-Kategorisierung mit höherer Genauigkeit und hierarchischer Unterstützung.", "news.aiCategorization.f1": "Hierarchische Kategorienavigation", "news.aiCategorization.f2": "Konfidenzbewertung", - "news.aiCategorization.f3": "Mehrsprachige Unterstützung", + "news.aiCategorization.f3": "Mehrsprachige Unterstützung", "news.aiCategorization.f4": "Automatische Fallback-Behandlung", "news.standardFields.title": "Verwaltung von Standardfeldern", "news.standardFields.description": "Standardproduktfelder mit Gruppen, Validierung und Standardwerten verwalten.", "news.standardFields.f1": "Organisation in Feldgruppen", "news.standardFields.f2": "System- und benutzerdefinierte Felder", "news.standardFields.f3": "Feldvalidierungsregeln", - "news.standardFields.f4": "Unterstützung für Standardwerte", + "news.standardFields.f4": "Unterstützung für Standardwerte", "news.standardFields.f5": "Automatische Feldeinrichtung", "news.billingSystem.title": "Kreditbasiertes Billing", "news.billingSystem.description": "Neues kreditbasiertes Abrechnungssystem mit Nutzungsverfolgung und flexiblen Zahlungsoptionen.", @@ -4500,45 +4501,45 @@ export const de: MessageDict = { "news.billingSystem.f4": "Verwaltung von Zahlungsmethoden", "news.billingSystem.f5": "Rechnungserstellung", "products.pageTitle": "Produktverwaltung", - "products.pageDescriptionStoresBefore": "Verwalten, verarbeiten und optimieren Sie Ihren Katalog. Shop verbinden oder CSV importieren über", - "products.pageDescriptionBasic": "Verwalten, verarbeiten und optimieren Sie Ihren Katalog. Import über Feeds oder CSV-Upload.", - "products.keyboard.esc": "— Produktbearbeitungsbereich oder Dialoge schließen", - "products.keyboard.toggle": "— diesen Tipp umschalten", + "products.pageDescriptionStoresBefore": "Verwalten, verarbeiten und optimieren Sie Ihren Katalog. Shop verbinden oder CSV importieren über", + "products.pageDescriptionBasic": "Verwalten, verarbeiten und optimieren Sie Ihren Katalog. Import über Feeds oder CSV-Upload.", + "products.keyboard.esc": "— Produktbearbeitungsbereich oder Dialoge schließen", + "products.keyboard.toggle": "— diesen Tipp umschalten", "products.keyboard.reviewPrefix": "Im Bereich Needs Review:", "products.keyboard.acceptAll": "alles akzeptieren", "products.keyboard.rejectShort": "ablehnen", "products.keyboard.acceptFields": "Name / Beschreibung akzeptieren", "products.connectStore": "Shop verbinden", - "products.updating": "Aktualisierung…", - "products.needLinkedRaw": "Ausgewählte Produkte brauchen ein verknüpftes Rohprodukt zur Verarbeitung.", - "products.selectToProcess": "Wählen Sie mindestens ein Produkt zur Verarbeitung.", - "products.undoResetHint": "Rückgängig setzt das Produkt per Reset auf unverarbeitet.", - "products.field.accepted": "{label} in Produkt übernommen.", + "products.updating": "Aktualisierung…", + "products.needLinkedRaw": "Ausgewählte Produkte brauchen ein verknüpftes Rohprodukt zur Verarbeitung.", + "products.selectToProcess": "Wählen Sie mindestens ein Produkt zur Verarbeitung.", + "products.undoResetHint": "Rückgängig setzt das Produkt per Reset auf unverarbeitet.", + "products.field.accepted": "{label} in Produkt übernommen.", "products.field.acceptFailed": "{field} konnte nicht akzeptiert werden", "products.field.discarded": "Anreicherung {label} verworfen.", "products.field.discardFailed": "{field} konnte nicht verworfen werden", "products.upgradeRequired": "Upgrade erforderlich", "products.upgradeBody": "Diese Funktion braucht einen kostenpflichtigen Plan oder KI-Credits.", "products.enrichment.rejectTitle": "Anreicherung ablehnen?", - "products.enrichment.rejectSelectedTitle": "Ausgewählte Produkte ablehnen?", - "products.enrichment.resetTitle": "Auf unverarbeitet zurücksetzen?", - "products.selectedOnPage": "{count} auf dieser Seite ausgewählt", - "products.selectionPageOnly": "{shown} von {total} — Auswahl nur diese Seite", + "products.enrichment.rejectSelectedTitle": "Ausgewählte Produkte ablehnen?", + "products.enrichment.resetTitle": "Auf unverarbeitet zurücksetzen?", + "products.selectedOnPage": "{count} auf dieser Seite ausgewählt", + "products.selectionPageOnly": "{shown} von {total} — Auswahl nur diese Seite", "products.edit.coverageHint": "Wie viele von Name, Beschreibung, Attributen und Kategorie vorhanden sind (Feed oder verarbeitet).", "products.edit.noEprelShort": "Kein EPREL", "products.edit.specs": "Specs", - "products.edit.reviewBannerBody": "Nutzen Sie den Tab Prüfung, um Originale mit KI zu vergleichen. Kürzel: A akzeptieren · R ablehnen · Alt+1/2 Feld · ⌘/Ctrl+Enter alles akzeptieren.", - "products.edit.whatsFilled": "Was ausgefüllt ist", - "products.edit.legend": "Gray = missing · Orange = from Feed · Green = processed", - "products.edit.updatedAgo": "· aktualisiert {relative}", + "products.edit.reviewBannerBody": "Nutzen Sie den Tab Prüfung, um Originale mit KI zu vergleichen. Kürzel: A akzeptieren · R ablehnen · Alt+1/2 Feld · ⌘/Ctrl+Enter alles akzeptieren.", + "products.edit.whatsFilled": "Was ausgefüllt ist", + "products.edit.legend": "Gray = missing · Orange = from Feed · Green = processed", + "products.edit.updatedAgo": "· aktualisiert {relative}", "products.edit.status": "Zustand", "products.edit.noRawUpdate": "No raw Produkt update time", - "products.edit.feedSyncPart": "· Feed-Sync", - "products.edit.filledFields": "{filled} ausgefüllt · {total} Felder", + "products.edit.feedSyncPart": "· Feed-Sync", + "products.edit.filledFields": "{filled} ausgefüllt · {total} Felder", "products.edit.noMappedFields": "No mapped Feed fields on this Produkt.", "products.edit.emptyBadge": "Leer", "products.edit.coreBadge": "Kern", - "products.edit.feedAttrsHint": "Aus dem Feed geparste Werte (Spezifikationen HTML, Garantie, Maße, EPREL). Schlüssel werden nach Möglichkeit mit attribute_key verknüpft.", + "products.edit.feedAttrsHint": "Aus dem Feed geparste Werte (Spezifikationen HTML, Garantie, Maße, EPREL). Schlüssel werden nach Möglichkeit mit attribute_key verknüpft.", "products.edit.originalAttrs": "Originalattribute", "products.edit.aiAttrs": "KI- / angereicherte Attribute", "mapping.confidence.exact": "Exakt", @@ -4555,42 +4556,42 @@ export const de: MessageDict = { "field.group.other": "Sonstiges", "common.yes": "Ja", "common.no": "Nein", - "status.running": "Läuft", + "status.running": "Läuft", "flash.admin.analyticsLoadFailed": "Analysen konnten nicht geladen werden", "flash.admin.diagnosticsLoadFailed": "Diagnose konnte nicht geladen werden", - "flash.admin.diagnosticsUnavailable": "Diagnose ist in dieser Bereitstellung nicht verfügbar. Wenden Sie sich an den Plattform-Administrator.", - "flash.admin.diagnosticsUnreachable": "Diagnose-API nicht erreichbar. Prüfen Sie, ob die API läuft und PUBLIC_API_URL / Vite-Proxy darauf zeigen.", - "admin.charts.statusEmpty": "Noch keine Zeilen in dieser Aufschlüsselung.", + "flash.admin.diagnosticsUnavailable": "Diagnose ist in dieser Bereitstellung nicht verfügbar. Wenden Sie sich an den Plattform-Administrator.", + "flash.admin.diagnosticsUnreachable": "Diagnose-API nicht erreichbar. Prüfen Sie, ob die API läuft und PUBLIC_API_URL / Vite-Proxy darauf zeigen.", + "admin.charts.statusEmpty": "Noch keine Zeilen in dieser Aufschlüsselung.", "admin.charts.seriesEmpty": "Noch keine Daten in diesem Zeitraum.", - "admin.charts.primaryDefault": "Primär", + "admin.charts.primaryDefault": "Primär", "admin.charts.statusAria": "Statusverteilung", "admin.charts.seriesAria": "{label}-Diagramm", "admin.analytics.lastNDaysAria": "Letzte {days} Tage", - "admin.analytics.overview": "Übersicht", + "admin.analytics.overview": "Übersicht", "admin.analytics.overviewHint": "Plattformsummen mit Periodenkontext der letzten {days} Tage.", - "admin.analytics.tokensInPeriod": "{tokens} in der Periode · aus verarbeiteten Produkten", + "admin.analytics.tokensInPeriod": "{tokens} in der Periode · aus verarbeiteten Produkten", "admin.analytics.creditsRemainingOf": "{remaining} verbleibend von {allocated} zugewiesen", "admin.analytics.noJobsYet": "Noch keine Jobs", - "admin.analytics.feedsVolume": "{input} Eingabe · {export} Export-Feeds", - "admin.analytics.usersCompaniesRaw": "{users} Nutzer · {companies} Unternehmen · {raw} roh", + "admin.analytics.feedsVolume": "{input} Eingabe · {export} Export-Feeds", + "admin.analytics.usersCompaniesRaw": "{users} Nutzer · {companies} Unternehmen · {raw} roh", "admin.analytics.operations": "Betrieb", - "admin.analytics.operationsHint": "Zuverlässigkeitssignale, Schlüssel und Wachstum für den gewählten Zeitraum.", - "admin.analytics.failedCompleted": "{failed} fehlgeschlagen · {completed} abgeschlossen", - "admin.analytics.runningOver2h": "Läuft > 2 Std. ·", + "admin.analytics.operationsHint": "Zuverlässigkeitssignale, Schlüssel und Wachstum für den gewählten Zeitraum.", + "admin.analytics.failedCompleted": "{failed} fehlgeschlagen · {completed} abgeschlossen", + "admin.analytics.runningOver2h": "Läuft > 2 Std. ·", "admin.analytics.apiKeysTotal": "{total} insgesamt (widerrufene eingeschlossen)", - "admin.analytics.signupsDetail": "Nutzer · {companies} Unternehmen · {tickets} offene/ausstehende Tickets", + "admin.analytics.signupsDetail": "Nutzer · {companies} Unternehmen · {tickets} offene/ausstehende Tickets", "admin.analytics.providerMix": "Anbieter-Mix", "admin.analytics.providerMixHint": "Token-Verbrauch danach, wie KI-Zugangsdaten konfiguriert sind.", - "admin.analytics.productsJobs": "{products} Produkte · {jobs} Jobs", + "admin.analytics.productsJobs": "{products} Produkte · {jobs} Jobs", "admin.analytics.trends": "Trends", - "admin.analytics.trendsHint": "Tagesreihen für Tokens, Anbieter, Jobs und Anmeldungen.", - "admin.analytics.tokensByDayHint": "Tokens aus abgeschlossener Produktverarbeitung (sekundär = Produkte an dem Tag)", + "admin.analytics.trendsHint": "Tagesreihen für Tokens, Anbieter, Jobs und Anmeldungen.", + "admin.analytics.tokensByDayHint": "Tokens aus abgeschlossener Produktverarbeitung (sekundär = Produkte an dem Tag)", "admin.analytics.seriesTokens": "Token-Einheiten", "admin.analytics.seriesProducts": "Produkte", "admin.analytics.emptyTokens": "Keine verarbeiteten Produkte mit Tokens in diesem Zeitraum.", - "admin.analytics.tokensByProviderHint": "Tagesaufteilung: intern / populär / benutzerdefiniert (nach Anbietertyp)", + "admin.analytics.tokensByProviderHint": "Tagesaufteilung: intern / populär / benutzerdefiniert (nach Anbietertyp)", "admin.analytics.emptyProviderTokens": "Noch keine anbieter-markierten Tokens in diesem Zeitraum.", - "admin.analytics.providerDayTip": "{date}: Intern {internal} · Populär {popular} · Benutzerdefiniert {custom}", + "admin.analytics.providerDayTip": "{date}: Intern {internal} · Populär {popular} · Benutzerdefiniert {custom}", "admin.analytics.seriesCreated": "Erstellt", "admin.analytics.seriesFailed": "Fehlgeschlagen", "admin.analytics.emptyJobsSeries": "Keine Verarbeitungsjobs in diesem Zeitraum erstellt.", @@ -4598,7 +4599,7 @@ export const de: MessageDict = { "admin.analytics.seriesCompanies": "Unternehmen", "admin.analytics.emptySignups": "Keine Nutzer- oder Unternehmensanmeldungen in diesem Zeitraum.", "admin.analytics.statusMix": "Status-Mix", - "admin.analytics.statusMixHint": "Gesamte Queues für Jobs, Feed-Sync und Support.", + "admin.analytics.statusMixHint": "Gesamte Queues für Jobs, Feed-Sync und Support.", "admin.analytics.jobStatus": "Job-Status", "admin.analytics.feedSyncQueue": "Feed-Sync-Warteschlange", "admin.analytics.supportTickets": "Support-Tickets", @@ -4610,41 +4611,41 @@ export const de: MessageDict = { "admin.analytics.companyUsage": "Unternehmensnutzung", "admin.analytics.jobsCol": "Jobs", "admin.analytics.billingCycles": "Abrechnung cycles", - "admin.analytics.billingCyclesHint": "Historische Summen vergangener Abrechnungszyklen (können hinter dem aktiven Abo zurückliegen)", + "admin.analytics.billingCyclesHint": "Historische Summen vergangener Abrechnungszyklen (können hinter dem aktiven Abo zurückliegen)", "admin.analytics.periodCol": "Zeitraum", "admin.analytics.creditsCol": "Credits", "admin.analytics.dataNotes": "Datenhinweise", "admin.diagnostics.endpointNotMounted": "Endpoint nicht eingebunden", "admin.diagnostics.noPayload": "Keine Diagnose-Daten", - "admin.diagnostics.unavailableShort": "Diagnose ist in dieser Bereitstellung nicht verfügbar.", + "admin.diagnostics.unavailableShort": "Diagnose ist in dieser Bereitstellung nicht verfügbar.", "admin.diagnostics.fixThenRefresh": "Beheben Sie den Fehler oben und aktualisieren Sie dann.", - "admin.diagnostics.refreshOrConfirm": "Aktualisieren oder prüfen, ob die API gesund ist.", + "admin.diagnostics.refreshOrConfirm": "Aktualisieren oder prüfen, ob die API gesund ist.", "admin.diagnostics.systemStatus": "Systemstatus", "admin.diagnostics.snapshot": "Snapshot {when}", "admin.diagnostics.queueTotal": "{total} insgesamt", - "admin.diagnostics.queueStuck": "processing_jobs · stecken geblieben (>2 Std.):", + "admin.diagnostics.queueStuck": "processing_jobs · stecken geblieben (>2 Std.):", "admin.diagnostics.driver": "Treiber: {driver}", - "admin.diagnostics.openStuck": "Hängende Produkte öffnen", - "admin.diagnostics.configPresence": "Konfigurationspräsenz", - "admin.diagnostics.configHint": "Nur Booleans · env {env} · RPM {rpm} · Batch {batch} · Retries {retries}", + "admin.diagnostics.openStuck": "Hängende Produkte öffnen", + "admin.diagnostics.configPresence": "Konfigurationspräsenz", + "admin.diagnostics.configHint": "Nur Booleans · env {env} · RPM {rpm} · Batch {batch} · Retries {retries}", "admin.diagnostics.cutoverTitle": "Cutover-Bereitschaft", - "admin.diagnostics.cutoverHint": "Nur Präsenzflags — Goose-Versionshinweise, Worker-Alter, fehlende Pläne. Kein Live-Stripe/SMTP.", + "admin.diagnostics.cutoverHint": "Nur Präsenzflags — Goose-Versionshinweise, Worker-Alter, fehlende Pläne. Kein Live-Stripe/SMTP.", "admin.diagnostics.cutoverGoose": "Goose", - "admin.diagnostics.cutoverGooseVersion": "version_max {max} · erwartet ≥ {min}", + "admin.diagnostics.cutoverGooseVersion": "version_max {max} · erwartet ≥ {min}", "admin.diagnostics.cutoverGooseRequired": "Erforderliche Migrationen", "admin.diagnostics.cutoverWorker": "Worker", - "admin.diagnostics.cutoverWorkerAge": "zuletzt vor {age}s · veraltet nach {stale}s", - "admin.diagnostics.cutoverWorkerAgeUnknown": "Alter nicht verfügbar · veraltet nach {stale}s", + "admin.diagnostics.cutoverWorkerAge": "zuletzt vor {age}s · veraltet nach {stale}s", + "admin.diagnostics.cutoverWorkerAgeUnknown": "Alter nicht verfügbar · veraltet nach {stale}s", "admin.diagnostics.cutoverPlansMissing": "Unternehmen ohne Plan", - "admin.diagnostics.cutoverPlansUnavailable": "Planzählung nicht verfügbar", - "admin.diagnostics.cutoverApiKeysMissing": "Unternehmen ohne API-Schlüssel", - "admin.diagnostics.cutoverApiKeysUnavailable": "API-Schlüssel-Inventar nicht verfügbar", - "admin.diagnostics.cutoverApiKeysHint": "Legacy-Schlüssel wurden nicht migriert — Mandanten müssen einen neuen dk_-Schlüssel erstellen (kein Fake-Import).", + "admin.diagnostics.cutoverPlansUnavailable": "Planzählung nicht verfügbar", + "admin.diagnostics.cutoverApiKeysMissing": "Unternehmen ohne API-Schlüssel", + "admin.diagnostics.cutoverApiKeysUnavailable": "API-Schlüssel-Inventar nicht verfügbar", + "admin.diagnostics.cutoverApiKeysHint": "Legacy-Schlüssel wurden nicht migriert — Mandanten müssen einen neuen dk_-Schlüssel erstellen (kein Fake-Import).", "admin.diagnostics.cutoverApiKeysLink": "Unternehmen zur Neuausstellung listen", "admin.diagnostics.cutoverApplied": "angewendet", "admin.diagnostics.cutoverPending": "ausstehend", "admin.diagnostics.etlInventoryTitle": "ETL gap inventory", - "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", + "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", "admin.diagnostics.etlInventoryFiles": "Files metadata-only", "admin.diagnostics.etlInventoryFilesDetail": "metadata-only / total file rows", "admin.diagnostics.etlInventoryJobs": "Jobs migrated tag", @@ -4652,18 +4653,18 @@ export const de: MessageDict = { "admin.diagnostics.etlInventoryJobsRan": "optional jobs domain backfill detected", "admin.diagnostics.etlInventoryTasks": "Tasks rows", "admin.diagnostics.etlInventoryTasksDetail": "legacy task history present in Postgres", - "admin.diagnostics.recentJobs": "Aktuelle Aufträge", + "admin.diagnostics.recentJobs": "Aktuelle Aufträge", "admin.diagnostics.recentAiFailures": "Aktuelle KI-Support-Fehler", - "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", + "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", "admin.diagnostics.relatedTools": "Verwandte Ops-Tools", - "admin.diagnostics.toolStuckTitle": "Hängengebliebene Produkte", - "admin.diagnostics.toolStuckDesc": "Jobs bereinigen, die länger als 2 Stunden laufen.", + "admin.diagnostics.toolStuckTitle": "Hängengebliebene Produkte", + "admin.diagnostics.toolStuckDesc": "Jobs bereinigen, die länger als 2 Stunden laufen.", "admin.diagnostics.toolOrphanTitle": "Orphan processed", - "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", + "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", "admin.diagnostics.toolAnalyticsTitle": "Analysen", "admin.diagnostics.toolAnalyticsDesc": "Trends und Plattform-Nutzungsdiagramme.", "admin.diagnostics.toolBootstrapTitle": "Bootstrap", - "admin.diagnostics.toolBootstrapDesc": "Plattform-Admin-Zugriff für dieses Konto bestätigen.", + "admin.diagnostics.toolBootstrapDesc": "Plattform-Admin-Zugriff für dieses Konto bestätigen.", "admin.diagnostics.toolSettingsTitle": "Einstellungen", "admin.diagnostics.toolSettingsDesc": "Plattform-Mail, KI und Systemmodus.", "admin.diagnostics.config.maintenance_mode": "Wartungsmodus", @@ -4675,181 +4676,181 @@ export const de: MessageDict = { "admin.diagnostics.config.stripe_mock": "Stripe-Mock", "admin.diagnostics.config.eprel_enabled": "EPREL aktiviert", "admin.diagnostics.config.upload_dir_configured": "Upload-Verzeichnis konfiguriert", - "admin.diagnostics.config.trusted_proxies_configured": "Vertrauenswürdige Proxys gesetzt", + "admin.diagnostics.config.trusted_proxies_configured": "Vertrauenswürdige Proxys gesetzt", "admin.diagnostics.config.web_origin_set": "Web-Origin gesetzt", - "admin.diagnostics.config.public_api_url_set": "Öffentliche API-URL gesetzt", + "admin.diagnostics.config.public_api_url_set": "Öffentliche API-URL gesetzt", "admin.diagnostics.config.token_signing_secret_set": "Token-Signaturgeheimnis gesetzt", - "admin.diagnostics.config.openai_key_set": "OpenAI-Schlüssel gesetzt", - "admin.diagnostics.config.pinecone_key_set": "Pinecone-Schlüssel gesetzt", + "admin.diagnostics.config.openai_key_set": "OpenAI-Schlüssel gesetzt", + "admin.diagnostics.config.pinecone_key_set": "Pinecone-Schlüssel gesetzt", "admin.diagnostics.config.stripe_secret_set": "Stripe-Geheimnis gesetzt", "admin.diagnostics.config.stripe_webhook_secret_set": "Stripe-Webhook-Geheimnis gesetzt", "admin.diagnostics.config.stripe_mock_rejected_in_prod": "Stripe-Mock in Produktion abgelehnt", - "admin.diagnostics.config.credentials_encryption_key_set": "Anmeldedaten-Verschlüsselungsschlüssel gesetzt", - "categories.selectAll": "Alle auswählen", - "categories.selectedCount": "{count} ausgewählt", + "admin.diagnostics.config.credentials_encryption_key_set": "Anmeldedaten-Verschlüsselungsschlüssel gesetzt", + "categories.selectAll": "Alle auswählen", + "categories.selectedCount": "{count} ausgewählt", "categories.noMatchingCategories": "Keine passenden Kategorien", - "categories.assigningProgress": "Zuweisen… {progress}%", + "categories.assigningProgress": "Zuweisen… {progress}%", "categories.assignToCount": "Zuweisen an {count}", - "categories.aiPromptSavedForCategory": "Für diese Kategorie ist ein KI-Generierungs-Prompt gespeichert.", - "categories.titleAndDescriptionFormulasSaved": "Titel- und Beschreibungsformeln sind für diese Kategorie gespeichert.", - "categories.titleFormulaSavedForCategory": "Für diese Kategorie ist eine Titelformel gespeichert.", - "categories.descriptionFormulaSavedForCategory": "Für diese Kategorie ist eine Beschreibungsformel gespeichert.", + "categories.aiPromptSavedForCategory": "Für diese Kategorie ist ein KI-Generierungs-Prompt gespeichert.", + "categories.titleAndDescriptionFormulasSaved": "Titel- und Beschreibungsformeln sind für diese Kategorie gespeichert.", + "categories.titleFormulaSavedForCategory": "Für diese Kategorie ist eine Titelformel gespeichert.", + "categories.descriptionFormulaSavedForCategory": "Für diese Kategorie ist eine Beschreibungsformel gespeichert.", "site.account": "Konto", "site.goToApp": "Zur App", "site.logIn": "Anmelden", "site.getStarted": "Loslegen", - "site.nav.primary": "Primär", + "site.nav.primary": "Primär", "site.nav.mobile": "Mobil", "site.nav.home": "Start", "site.nav.pricing": "Preise", "site.nav.apiDocs": "API-Dokumentation", - "seo.home.title": "Descrybe — Lieferanten-Feeds in fertige Produktseiten verwandeln", + "seo.home.title": "Descrybe — Lieferanten-Feeds in fertige Produktseiten verwandeln", "seo.home.description": "Verbinden Sie CSV- oder XML-Lieferanten-Feeds, ordnen Sie sie Ihren Kategorien und Attributen zu, generieren Sie Titel und Beschreibungen nach Ihren Regeln und exportieren oder synchronisieren Sie mit WooCommerce.", - "seo.pricing.title": "Preise — Free, Starter, Growth, Business | Descrybe", - "seo.pricing.description": "Starten Sie kostenlos mit 100 Produkten und Feed-Mapping. Bezahlte Pläne bieten KI-Titel und -Beschreibungen, mehr SKUs, Export-Feeds und WooCommerce-Sync — ab 49 $/Monat. Enterprise für unbegrenzte Kataloge.", - "seo.privacy.title": "Datenschutzerklärung | Descrybe", - "seo.privacy.description": "Wie Descrybe Kontodaten, Produktkataloge und Lieferanten-Feeds erhebt, nutzt und schützt, wenn Sie unsere Produktdatenplattform verwenden.", + "seo.pricing.title": "Preise — Free, Starter, Growth, Business | Descrybe", + "seo.pricing.description": "Starten Sie kostenlos mit 100 Produkten und Feed-Mapping. Bezahlte Pläne bieten KI-Titel und -Beschreibungen, mehr SKUs, Export-Feeds und WooCommerce-Sync — ab 49 $/Monat. Enterprise für unbegrenzte Kataloge.", + "seo.privacy.title": "Datenschutzerklärung | Descrybe", + "seo.privacy.description": "Wie Descrybe Kontodaten, Produktkataloge und Lieferanten-Feeds erhebt, nutzt und schützt, wenn Sie unsere Produktdatenplattform verwenden.", "seo.terms.title": "Nutzungsbedingungen | Descrybe", - "seo.terms.description": "Nutzungsbedingungen für Descrybe: Feed-Import, Kataloganreicherung, KI-gestützte Inhalte, Exporte und WooCommerce-Synchronisation für Ihr Unternehmen.", - "seo.features.title": "Funktionen — Feeds, Anreicherung und Export | Descrybe", - "seo.features.description": "Erfahren Sie, wie Descrybe Lieferanten-Feeds importiert, Felder Ihrer Taxonomie zuordnet, Produktdaten anreichert und Kataloge über Export-Feeds, WooCommerce oder API ausliefert.", + "seo.terms.description": "Nutzungsbedingungen für Descrybe: Feed-Import, Kataloganreicherung, KI-gestützte Inhalte, Exporte und WooCommerce-Synchronisation für Ihr Unternehmen.", + "seo.features.title": "Funktionen — Feeds, Anreicherung und Export | Descrybe", + "seo.features.description": "Erfahren Sie, wie Descrybe Lieferanten-Feeds importiert, Felder Ihrer Taxonomie zuordnet, Produktdaten anreichert und Kataloge über Export-Feeds, WooCommerce oder API ausliefert.", "pricing.page.eyebrow": "Preise", - "pricing.page.title": "Einfache Pläne für wachsende Kataloge", - "pricing.page.lead": "Starten Sie kostenlos mit Feed-Mapping und grundlegender Bereinigung. Upgraden Sie, wenn Sie KI-Titel und -Beschreibungen, mehr Produkte, Export-Feeds oder WooCommerce-Sync brauchen — von Starter bis Enterprise.", + "pricing.page.title": "Einfache Pläne für wachsende Kataloge", + "pricing.page.lead": "Starten Sie kostenlos mit Feed-Mapping und grundlegender Bereinigung. Upgraden Sie, wenn Sie KI-Titel und -Beschreibungen, mehr Produkte, Export-Feeds oder WooCommerce-Sync brauchen — von Starter bis Enterprise.", "pricing.page.subscribedBefore": "Bereits abonniert? Nutzung verwalten unter", - "pricing.page.subscribedMid": "oder Pläne vergleichen in", - "pricing.page.plansLink": "Pläne", + "pricing.page.subscribedMid": "oder Pläne vergleichen in", + "pricing.page.plansLink": "Pläne", "pricing.page.subscribedAfter": ".", "legal.lastUpdated": "Zuletzt aktualisiert: {date}", - "legal.backHome": "← Zurück zur Startseite", + "legal.backHome": "← Zurück zur Startseite", "legal.emailLabel": "E-Mail:", "legal.postalLabel": "Postanschrift:", - "legal.privacy.title": "Datenschutzerklärung", - "legal.privacy.intro.h": "Einführung", - "legal.privacy.intro.p1": "Bei Descrybe (\"wir\", \"unser\" oder \"uns\") respektieren wir Ihre Privatsphäre und verpflichten uns, Ihre personenbezogenen Daten zu schützen. Diese Datenschutzerklärung erläutert, wie wir Ihre Informationen erheben, verwenden, offenlegen und schützen, wenn Sie die Produktdatenplattform von Descrybe und damit verbundene Dienste (zusammen die \"Dienste\") nutzen.", - "legal.privacy.intro.p2": "Durch den Zugriff auf oder die Nutzung unserer Dienste stimmen Sie den in dieser Datenschutzerklärung beschriebenen Praktiken zu. Wenn Sie mit den hier beschriebenen Richtlinien und Praktiken nicht einverstanden sind, nutzen Sie bitte unsere Dienste nicht.", + "legal.privacy.title": "Datenschutzerklärung", + "legal.privacy.intro.h": "Einführung", + "legal.privacy.intro.p1": "Bei Descrybe (\"wir\", \"unser\" oder \"uns\") respektieren wir Ihre Privatsphäre und verpflichten uns, Ihre personenbezogenen Daten zu schützen. Diese Datenschutzerklärung erläutert, wie wir Ihre Informationen erheben, verwenden, offenlegen und schützen, wenn Sie die Produktdatenplattform von Descrybe und damit verbundene Dienste (zusammen die \"Dienste\") nutzen.", + "legal.privacy.intro.p2": "Durch den Zugriff auf oder die Nutzung unserer Dienste stimmen Sie den in dieser Datenschutzerklärung beschriebenen Praktiken zu. Wenn Sie mit den hier beschriebenen Richtlinien und Praktiken nicht einverstanden sind, nutzen Sie bitte unsere Dienste nicht.", "legal.privacy.collect.h": "Informationen, die wir erheben", - "legal.privacy.collect.lead": "Wir erheben verschiedene Arten von Informationen von und über Nutzer unserer Dienste, darunter:", + "legal.privacy.collect.lead": "Wir erheben verschiedene Arten von Informationen von und über Nutzer unserer Dienste, darunter:", "legal.privacy.collect.personal.h": "Personenbezogene Daten", - "legal.privacy.collect.personal.p": "Wenn Sie ein Konto registrieren, erheben wir Informationen, die zur Identifizierung Ihrer Person verwendet werden könnten, wie Name, E-Mail-Adresse, Telefonnummer, Firmenname und Rechnungsinformationen. Wir erheben diese Informationen direkt von Ihnen, wenn Sie sie uns bereitstellen.", + "legal.privacy.collect.personal.p": "Wenn Sie ein Konto registrieren, erheben wir Informationen, die zur Identifizierung Ihrer Person verwendet werden könnten, wie Name, E-Mail-Adresse, Telefonnummer, Firmenname und Rechnungsinformationen. Wir erheben diese Informationen direkt von Ihnen, wenn Sie sie uns bereitstellen.", "legal.privacy.collect.userData.h": "Nutzerdaten", - "legal.privacy.collect.userData.p": "Zur Erbringung unserer Dienste erheben und verarbeiten wir Produktdaten, Lieferanten-Feeds, Produktbeschreibungen und andere Inhalte, die Sie auf unsere Plattform hochladen, eingeben oder anderweitig übermitteln. Dazu können Produktattribute, Taxonomiestrukturen, Vorlagen und andere für den Betrieb unserer Dienste erforderliche Daten gehören.", + "legal.privacy.collect.userData.p": "Zur Erbringung unserer Dienste erheben und verarbeiten wir Produktdaten, Lieferanten-Feeds, Produktbeschreibungen und andere Inhalte, die Sie auf unsere Plattform hochladen, eingeben oder anderweitig übermitteln. Dazu können Produktattribute, Taxonomiestrukturen, Vorlagen und andere für den Betrieb unserer Dienste erforderliche Daten gehören.", "legal.privacy.collect.usage.h": "Nutzungsinformationen", - "legal.privacy.collect.usage.p": "Wir erheben automatisch bestimmte Informationen über Ihr Gerät und Ihre Interaktion mit unseren Diensten, einschließlich IP-Adresse, Gerätetyp, Browsertyp, Betriebssystem, Zugriffszeiten, aufgerufene Seiten, genutzte Funktionen und andere Systemaktivitäten. Wir verwenden diese Informationen, um unsere Dienste und die Nutzererfahrung zu verbessern.", + "legal.privacy.collect.usage.p": "Wir erheben automatisch bestimmte Informationen über Ihr Gerät und Ihre Interaktion mit unseren Diensten, einschließlich IP-Adresse, Gerätetyp, Browsertyp, Betriebssystem, Zugriffszeiten, aufgerufene Seiten, genutzte Funktionen und andere Systemaktivitäten. Wir verwenden diese Informationen, um unsere Dienste und die Nutzererfahrung zu verbessern.", "legal.privacy.collect.cookies.h": "Cookies und Tracking-Technologien", - "legal.privacy.collect.cookies.p": "Wir verwenden Cookies, Web-Beacons und ähnliche Tracking-Technologien, um Informationen über Ihre Surfaktivitäten auf unserer Website zu erheben. Sie können Cookies über Ihre Browsereinstellungen und andere Tools steuern. Wenn Sie jedoch bestimmte Cookies blockieren, können Sie möglicherweise nicht alle Funktionen unserer Dienste nutzen.", + "legal.privacy.collect.cookies.p": "Wir verwenden Cookies, Web-Beacons und ähnliche Tracking-Technologien, um Informationen über Ihre Surfaktivitäten auf unserer Website zu erheben. Sie können Cookies über Ihre Browsereinstellungen und andere Tools steuern. Wenn Sie jedoch bestimmte Cookies blockieren, können Sie möglicherweise nicht alle Funktionen unserer Dienste nutzen.", "legal.privacy.use.h": "Wie wir Ihre Informationen verwenden", - "legal.privacy.use.lead": "Wir verwenden die erhobenen Informationen für verschiedene Zwecke, darunter:", + "legal.privacy.use.lead": "Wir verwenden die erhobenen Informationen für verschiedene Zwecke, darunter:", "legal.privacy.use.li1": "Bereitstellung, Wartung und Verbesserung unserer Dienste", - "legal.privacy.use.li2": "Abwicklung von Transaktionen und Versand zugehöriger Informationen, einschließlich Bestätigungen, Rechnungen und Servicebenachrichtigungen", - "legal.privacy.use.li3": "Entwicklung neuer Produkte, Dienste, Funktionen und Funktionalitäten", + "legal.privacy.use.li2": "Abwicklung von Transaktionen und Versand zugehöriger Informationen, einschließlich Bestätigungen, Rechnungen und Servicebenachrichtigungen", + "legal.privacy.use.li3": "Entwicklung neuer Produkte, Dienste, Funktionen und Funktionalitäten", "legal.privacy.use.li4": "Personalisierung Ihrer Erfahrung und Bereitstellung von Inhalten und Funktionen, die Ihren Interessen entsprechen", "legal.privacy.use.li5": "Beantwortung Ihrer Anfragen, Kommentare und Fragen", "legal.privacy.use.li6": "Versand technischer Hinweise, Updates, Sicherheitswarnungen sowie Support- und Verwaltungsnachrichten", - "legal.privacy.use.li7": "Überwachung und Analyse von Trends, Nutzung und Aktivitäten im Zusammenhang mit unseren Diensten", - "legal.privacy.use.li8": "Erkennung, Untersuchung und Verhinderung betrügerischer Transaktionen und anderer illegaler Aktivitäten", + "legal.privacy.use.li7": "Überwachung und Analyse von Trends, Nutzung und Aktivitäten im Zusammenhang mit unseren Diensten", + "legal.privacy.use.li8": "Erkennung, Untersuchung und Verhinderung betrügerischer Transaktionen und anderer illegaler Aktivitäten", "legal.privacy.use.li9": "Schutz unserer Rechte, unseres Eigentums und unserer Sicherheit sowie der Rechte, des Eigentums und der Sicherheit unserer Nutzer oder Dritter", - "legal.privacy.use.li10": "Erfüllung rechtlicher Verpflichtungen und Durchsetzung unserer Nutzungsbedingungen", + "legal.privacy.use.li10": "Erfüllung rechtlicher Verpflichtungen und Durchsetzung unserer Nutzungsbedingungen", "legal.privacy.ai.h": "KI und maschinelles Lernen", - "legal.privacy.ai.p1": "Unsere Dienste nutzen Technologien der künstlichen Intelligenz und des maschinellen Lernens, um Produktdaten zu verarbeiten, Inhalte zu generieren und weitere automatisierte Funktionen bereitzustellen. Die Daten, die Sie unseren Diensten bereitstellen, können zum Trainieren und Verbessern unserer KI-Modelle verwendet werden. Wir setzen jedoch geeignete Schutzmaßnahmen um, um Ihre Daten zu schützen und ihre Vertraulichkeit zu wahren.", - "legal.privacy.ai.p2": "Wir verwenden ohne Ihre ausdrückliche Einwilligung keine personenbezogenen Daten zum Trainieren unserer allgemeinen KI-Modelle. Produktdaten, die für das KI-Training verwendet werden, werden soweit möglich anonymisiert und aggregiert.", + "legal.privacy.ai.p1": "Unsere Dienste nutzen Technologien der künstlichen Intelligenz und des maschinellen Lernens, um Produktdaten zu verarbeiten, Inhalte zu generieren und weitere automatisierte Funktionen bereitzustellen. Die Daten, die Sie unseren Diensten bereitstellen, können zum Trainieren und Verbessern unserer KI-Modelle verwendet werden. Wir setzen jedoch geeignete Schutzmaßnahmen um, um Ihre Daten zu schützen und ihre Vertraulichkeit zu wahren.", + "legal.privacy.ai.p2": "Wir verwenden ohne Ihre ausdrückliche Einwilligung keine personenbezogenen Daten zum Trainieren unserer allgemeinen KI-Modelle. Produktdaten, die für das KI-Training verwendet werden, werden soweit möglich anonymisiert und aggregiert.", "legal.privacy.share.h": "Wie wir Ihre Informationen weitergeben", - "legal.privacy.share.lead": "Wir können Ihre Informationen unter folgenden Umständen weitergeben:", + "legal.privacy.share.lead": "Wir können Ihre Informationen unter folgenden Umständen weitergeben:", "legal.privacy.share.providers.h": "Dienstleister", - "legal.privacy.share.providers.p": "Wir können Ihre Informationen an Drittanbieter, Dienstleister, Auftragnehmer oder Agenten weitergeben, die in unserem Auftrag Dienstleistungen erbringen, z. B. Zahlungsabwicklung, Datenanalyse, E-Mail-Versand, Hosting, Kundenservice und Marketingunterstützung.", - "legal.privacy.share.transfers.h": "Unternehmensübertragungen", - "legal.privacy.share.transfers.p": "Wenn wir an einer Fusion, Übernahme, Finanzierung, Umstrukturierung, Insolvenz oder dem Verkauf von Unternehmensvermögen beteiligt sind, können Ihre Informationen im Rahmen dieser Transaktion übertragen werden. Wir werden Sie über jede derartige Änderung der Eigentumsverhältnisse oder der Kontrolle Ihrer personenbezogenen Daten informieren.", + "legal.privacy.share.providers.p": "Wir können Ihre Informationen an Drittanbieter, Dienstleister, Auftragnehmer oder Agenten weitergeben, die in unserem Auftrag Dienstleistungen erbringen, z. B. Zahlungsabwicklung, Datenanalyse, E-Mail-Versand, Hosting, Kundenservice und Marketingunterstützung.", + "legal.privacy.share.transfers.h": "Unternehmensübertragungen", + "legal.privacy.share.transfers.p": "Wenn wir an einer Fusion, Übernahme, Finanzierung, Umstrukturierung, Insolvenz oder dem Verkauf von Unternehmensvermögen beteiligt sind, können Ihre Informationen im Rahmen dieser Transaktion übertragen werden. Wir werden Sie über jede derartige Änderung der Eigentumsverhältnisse oder der Kontrolle Ihrer personenbezogenen Daten informieren.", "legal.privacy.share.legal.h": "Rechtliche Anforderungen", - "legal.privacy.share.legal.p": "Wir können Ihre Informationen offenlegen, wenn dies gesetzlich vorgeschrieben ist oder als Antwort auf gültige Anfragen öffentlicher Behörden (z. B. ein Gericht oder eine Regierungsbehörde). Wir können Ihre Informationen auch offenlegen, um unsere Nutzungsbedingungen durchzusetzen, unsere Rechte, Privatsphäre, Sicherheit oder unser Eigentum und/oder die unserer verbundenen Unternehmen, Nutzer oder Dritter zu schützen.", + "legal.privacy.share.legal.p": "Wir können Ihre Informationen offenlegen, wenn dies gesetzlich vorgeschrieben ist oder als Antwort auf gültige Anfragen öffentlicher Behörden (z. B. ein Gericht oder eine Regierungsbehörde). Wir können Ihre Informationen auch offenlegen, um unsere Nutzungsbedingungen durchzusetzen, unsere Rechte, Privatsphäre, Sicherheit oder unser Eigentum und/oder die unserer verbundenen Unternehmen, Nutzer oder Dritter zu schützen.", "legal.privacy.share.consent.h": "Mit Ihrer Einwilligung", - "legal.privacy.share.consent.p": "Wir können Ihre Informationen an Dritte weitergeben, wenn Sie uns Ihre Einwilligung dazu erteilt haben.", + "legal.privacy.share.consent.p": "Wir können Ihre Informationen an Dritte weitergeben, wenn Sie uns Ihre Einwilligung dazu erteilt haben.", "legal.privacy.security.h": "Datensicherheit", - "legal.privacy.security.p1": "Wir haben geeignete technische und organisatorische Maßnahmen implementiert, um Ihre personenbezogenen Daten vor versehentlichem Verlust sowie vor unbefugtem Zugriff, unbefugter Nutzung, Veränderung und Offenlegung zu schützen. Alle Informationen, die Sie uns bereitstellen, werden auf sicheren Servern hinter Firewalls gespeichert.", - "legal.privacy.security.p2": "Die Sicherheit Ihrer Informationen hängt auch von Ihnen ab. Wenn wir Ihnen ein Passwort für den Zugriff auf bestimmte Teile unserer Dienste bereitgestellt haben (oder Sie eines gewählt haben), sind Sie dafür verantwortlich, dieses Passwort vertraulich zu halten. Wir bitten Sie, Ihr Passwort mit niemandem zu teilen.", - "legal.privacy.security.p3": "Leider ist die Übertragung von Informationen über das Internet nicht vollständig sicher. Obwohl wir unser Bestes tun, um Ihre personenbezogenen Daten zu schützen, können wir die Sicherheit der an unsere Dienste übermittelten personenbezogenen Daten nicht garantieren. Jede Übertragung personenbezogener Daten erfolgt auf Ihr eigenes Risiko.", - "legal.privacy.rights.h": "Ihre Rechte und Wahlmöglichkeiten", - "legal.privacy.rights.lead": "Wir bemühen uns, Ihnen Wahlmöglichkeiten hinsichtlich der personenbezogenen Daten zu bieten, die Sie uns bereitstellen. Je nach Ihrem Standort können Sie bestimmte Rechte in Bezug auf Ihre personenbezogenen Daten haben, darunter:", + "legal.privacy.security.p1": "Wir haben geeignete technische und organisatorische Maßnahmen implementiert, um Ihre personenbezogenen Daten vor versehentlichem Verlust sowie vor unbefugtem Zugriff, unbefugter Nutzung, Veränderung und Offenlegung zu schützen. Alle Informationen, die Sie uns bereitstellen, werden auf sicheren Servern hinter Firewalls gespeichert.", + "legal.privacy.security.p2": "Die Sicherheit Ihrer Informationen hängt auch von Ihnen ab. Wenn wir Ihnen ein Passwort für den Zugriff auf bestimmte Teile unserer Dienste bereitgestellt haben (oder Sie eines gewählt haben), sind Sie dafür verantwortlich, dieses Passwort vertraulich zu halten. Wir bitten Sie, Ihr Passwort mit niemandem zu teilen.", + "legal.privacy.security.p3": "Leider ist die Übertragung von Informationen über das Internet nicht vollständig sicher. Obwohl wir unser Bestes tun, um Ihre personenbezogenen Daten zu schützen, können wir die Sicherheit der an unsere Dienste übermittelten personenbezogenen Daten nicht garantieren. Jede Übertragung personenbezogener Daten erfolgt auf Ihr eigenes Risiko.", + "legal.privacy.rights.h": "Ihre Rechte und Wahlmöglichkeiten", + "legal.privacy.rights.lead": "Wir bemühen uns, Ihnen Wahlmöglichkeiten hinsichtlich der personenbezogenen Daten zu bieten, die Sie uns bereitstellen. Je nach Ihrem Standort können Sie bestimmte Rechte in Bezug auf Ihre personenbezogenen Daten haben, darunter:", "legal.privacy.rights.li1": "Zugriff auf und Aktualisierung Ihrer personenbezogenen Daten", - "legal.privacy.rights.li2": "Löschung Ihrer personenbezogenen Daten verlangen", - "legal.privacy.rights.li3": "Der Verarbeitung Ihrer personenbezogenen Daten widersprechen oder sie einschränken", - "legal.privacy.rights.li4": "Datenübertragbarkeit", + "legal.privacy.rights.li2": "Löschung Ihrer personenbezogenen Daten verlangen", + "legal.privacy.rights.li3": "Der Verarbeitung Ihrer personenbezogenen Daten widersprechen oder sie einschränken", + "legal.privacy.rights.li4": "Datenübertragbarkeit", "legal.privacy.rights.li5": "Einwilligung widerrufen (soweit anwendbar)", - "legal.privacy.rights.footer": "Um Ihre Rechte auszuüben, kontaktieren Sie uns bitte über die am Ende dieser Datenschutzerklärung angegebenen Kontaktdaten. Bitte beachten Sie, dass einige dieser Rechte je nach Ihrem Standort und den konkreten Umständen eingeschränkt oder nicht anwendbar sein können.", + "legal.privacy.rights.footer": "Um Ihre Rechte auszuüben, kontaktieren Sie uns bitte über die am Ende dieser Datenschutzerklärung angegebenen Kontaktdaten. Bitte beachten Sie, dass einige dieser Rechte je nach Ihrem Standort und den konkreten Umständen eingeschränkt oder nicht anwendbar sein können.", "legal.privacy.retention.h": "Datenspeicherung", - "legal.privacy.retention.p1": "Wir speichern Ihre personenbezogenen Daten so lange, wie es zur Erfüllung der in dieser Datenschutzerklärung dargelegten Zwecke erforderlich ist, es sei denn, eine längere Aufbewahrungsfrist ist gesetzlich vorgeschrieben oder zulässig. Bei der Festlegung der Speicherdauer berücksichtigen wir Menge, Art und Sensibilität der Informationen, das potenzielle Schadensrisiko durch unbefugte Nutzung oder Offenlegung, die Zwecke der Verarbeitung sowie geltende gesetzliche Anforderungen.", - "legal.privacy.retention.p2": "Wir können bestimmte Informationen nach der Schließung Ihres Kontos speichern, unter anderem zur Erfüllung unserer gesetzlichen Verpflichtungen, zur Beilegung von Streitigkeiten und zur Durchsetzung unserer Vereinbarungen.", - "legal.privacy.intl.h": "Internationale Datenübermittlungen", - "legal.privacy.intl.p1": "Ihre personenbezogenen Daten können in andere Länder als das Land, in dem Sie ansässig sind, übermittelt und dort verarbeitet werden. Diese Länder können Datenschutzgesetze haben, die sich von denen Ihres Landes unterscheiden.", - "legal.privacy.intl.p2": "Wenn wir Ihre personenbezogenen Daten in Länder außerhalb des Europäischen Wirtschaftsraums oder anderer Regionen mit umfassenden Datenschutzgesetzen übermitteln, stellen wir sicher, dass geeignete Schutzmaßnahmen zum Schutz Ihrer personenbezogenen Daten bestehen und dass die Übermittlung den geltenden Datenschutzvorschriften entspricht.", - "legal.privacy.children.h": "Privatsphäre von Minderjährigen", - "legal.privacy.children.p": "Unsere Dienste sind nicht für Personen unter 16 Jahren bestimmt, und wir erheben wissentlich keine personenbezogenen Daten von Personen unter 16 Jahren. Wenn wir feststellen, dass wir personenbezogene Daten eines Kindes unter 16 Jahren ohne Überprüfung der elterlichen Einwilligung erhoben oder erhalten haben, löschen wir diese Informationen. Wenn Sie glauben, dass wir Informationen von oder über eine Person unter 16 Jahren haben könnten, kontaktieren Sie uns bitte.", - "legal.privacy.changes.h": "Änderungen unserer Datenschutzerklärung", - "legal.privacy.changes.p1": "Wir können unsere Datenschutzerklärung von Zeit zu Zeit aktualisieren. Wenn wir wesentliche Änderungen daran vornehmen, wie wir personenbezogene Daten von Nutzern behandeln, benachrichtigen wir Sie per E-Mail an die in Ihrem Konto angegebene Adresse und/oder durch einen Hinweis auf unserer Website.", - "legal.privacy.changes.p2": "Das Datum der letzten Überarbeitung der Datenschutzerklärung ist oben auf der Seite angegeben. Sie sind dafür verantwortlich, sicherzustellen, dass wir über eine aktuelle, aktive und zustellbare E-Mail-Adresse von Ihnen verfügen, und unsere Website sowie diese Datenschutzerklärung regelmäßig auf Änderungen zu prüfen.", + "legal.privacy.retention.p1": "Wir speichern Ihre personenbezogenen Daten so lange, wie es zur Erfüllung der in dieser Datenschutzerklärung dargelegten Zwecke erforderlich ist, es sei denn, eine längere Aufbewahrungsfrist ist gesetzlich vorgeschrieben oder zulässig. Bei der Festlegung der Speicherdauer berücksichtigen wir Menge, Art und Sensibilität der Informationen, das potenzielle Schadensrisiko durch unbefugte Nutzung oder Offenlegung, die Zwecke der Verarbeitung sowie geltende gesetzliche Anforderungen.", + "legal.privacy.retention.p2": "Wir können bestimmte Informationen nach der Schließung Ihres Kontos speichern, unter anderem zur Erfüllung unserer gesetzlichen Verpflichtungen, zur Beilegung von Streitigkeiten und zur Durchsetzung unserer Vereinbarungen.", + "legal.privacy.intl.h": "Internationale Datenübermittlungen", + "legal.privacy.intl.p1": "Ihre personenbezogenen Daten können in andere Länder als das Land, in dem Sie ansässig sind, übermittelt und dort verarbeitet werden. Diese Länder können Datenschutzgesetze haben, die sich von denen Ihres Landes unterscheiden.", + "legal.privacy.intl.p2": "Wenn wir Ihre personenbezogenen Daten in Länder außerhalb des Europäischen Wirtschaftsraums oder anderer Regionen mit umfassenden Datenschutzgesetzen übermitteln, stellen wir sicher, dass geeignete Schutzmaßnahmen zum Schutz Ihrer personenbezogenen Daten bestehen und dass die Übermittlung den geltenden Datenschutzvorschriften entspricht.", + "legal.privacy.children.h": "Privatsphäre von Minderjährigen", + "legal.privacy.children.p": "Unsere Dienste sind nicht für Personen unter 16 Jahren bestimmt, und wir erheben wissentlich keine personenbezogenen Daten von Personen unter 16 Jahren. Wenn wir feststellen, dass wir personenbezogene Daten eines Kindes unter 16 Jahren ohne Überprüfung der elterlichen Einwilligung erhoben oder erhalten haben, löschen wir diese Informationen. Wenn Sie glauben, dass wir Informationen von oder über eine Person unter 16 Jahren haben könnten, kontaktieren Sie uns bitte.", + "legal.privacy.changes.h": "Änderungen unserer Datenschutzerklärung", + "legal.privacy.changes.p1": "Wir können unsere Datenschutzerklärung von Zeit zu Zeit aktualisieren. Wenn wir wesentliche Änderungen daran vornehmen, wie wir personenbezogene Daten von Nutzern behandeln, benachrichtigen wir Sie per E-Mail an die in Ihrem Konto angegebene Adresse und/oder durch einen Hinweis auf unserer Website.", + "legal.privacy.changes.p2": "Das Datum der letzten Überarbeitung der Datenschutzerklärung ist oben auf der Seite angegeben. Sie sind dafür verantwortlich, sicherzustellen, dass wir über eine aktuelle, aktive und zustellbare E-Mail-Adresse von Ihnen verfügen, und unsere Website sowie diese Datenschutzerklärung regelmäßig auf Änderungen zu prüfen.", "legal.privacy.contact.h": "Kontakt", - "legal.privacy.contact.lead": "Wenn Sie Fragen oder Bedenken zu unserer Datenschutzerklärung oder unseren Datenpraktiken haben, kontaktieren Sie uns bitte unter:", + "legal.privacy.contact.lead": "Wenn Sie Fragen oder Bedenken zu unserer Datenschutzerklärung oder unseren Datenpraktiken haben, kontaktieren Sie uns bitte unter:", "legal.terms.title": "Nutzungsbedingungen", "legal.terms.s1.h": "1. Zustimmung zu den Bedingungen", - "legal.terms.s1.p": "Durch den Zugriff auf oder die Nutzung der Produktdatenplattform von Descrybe und damit verbundener Dienste (zusammen die \"Dienste\") erklären Sie sich damit einverstanden, an diese Nutzungsbedingungen sowie alle geltenden Gesetze und Vorschriften gebunden zu sein. Wenn Sie mit einer dieser Bedingungen nicht einverstanden sind, ist Ihnen die Nutzung oder der Zugriff auf die Dienste untersagt.", + "legal.terms.s1.p": "Durch den Zugriff auf oder die Nutzung der Produktdatenplattform von Descrybe und damit verbundener Dienste (zusammen die \"Dienste\") erklären Sie sich damit einverstanden, an diese Nutzungsbedingungen sowie alle geltenden Gesetze und Vorschriften gebunden zu sein. Wenn Sie mit einer dieser Bedingungen nicht einverstanden sind, ist Ihnen die Nutzung oder der Zugriff auf die Dienste untersagt.", "legal.terms.s2.h": "2. Nutzungslizenz", - "legal.terms.s2.p1": "Vorbehaltlich der Einhaltung dieser Nutzungsbedingungen gewährt Descrybe Ihnen eine beschränkte, nicht ausschließliche, nicht übertragbare und widerrufliche Lizenz zum Zugriff auf und zur Nutzung der Dienste für Ihre Geschäftszwecke.", + "legal.terms.s2.p1": "Vorbehaltlich der Einhaltung dieser Nutzungsbedingungen gewährt Descrybe Ihnen eine beschränkte, nicht ausschließliche, nicht übertragbare und widerrufliche Lizenz zum Zugriff auf und zur Nutzung der Dienste für Ihre Geschäftszwecke.", "legal.terms.s2.lead": "Diese Lizenz umfasst nicht:", - "legal.terms.s2.li1": "Das Ändern oder Kopieren der Dienste oder jeglicher darin enthaltener Inhalte", - "legal.terms.s2.li2": "Die Nutzung der Dienste für andere kommerzielle Zwecke als die autorisierte geschäftliche Nutzung", - "legal.terms.s2.li3": "Den Versuch, jegliche in den Diensten enthaltene Software zu dekompilieren oder zurückzuentwickeln", + "legal.terms.s2.li1": "Das Ändern oder Kopieren der Dienste oder jeglicher darin enthaltener Inhalte", + "legal.terms.s2.li2": "Die Nutzung der Dienste für andere kommerzielle Zwecke als die autorisierte geschäftliche Nutzung", + "legal.terms.s2.li3": "Den Versuch, jegliche in den Diensten enthaltene Software zu dekompilieren oder zurückzuentwickeln", "legal.terms.s2.li4": "Das Entfernen von Urheberrechts- oder Eigentumshinweisen aus den Materialien", - "legal.terms.s2.li5": "Die Übertragung der Materialien an eine andere Person oder das \"Spiegeln\" der Materialien auf einem anderen Server", - "legal.terms.s2.p2": "Diese Lizenz endet automatisch, wenn Sie gegen eine dieser Einschränkungen verstoßen, und kann von Descrybe jederzeit beendet werden.", + "legal.terms.s2.li5": "Die Übertragung der Materialien an eine andere Person oder das \"Spiegeln\" der Materialien auf einem anderen Server", + "legal.terms.s2.p2": "Diese Lizenz endet automatisch, wenn Sie gegen eine dieser Einschränkungen verstoßen, und kann von Descrybe jederzeit beendet werden.", "legal.terms.s3.h": "3. Abonnement und Zahlung", - "legal.terms.s3.p1": "Der Zugang zu den Diensten kann ein kostenpflichtiges Abonnement erfordern. Die Zahlungsbedingungen werden während des Abonnementvorgangs angegeben. Alle Zahlungen sind nicht erstattungsfähig, es sei denn, Descrybe gibt schriftlich etwas anderes an.", - "legal.terms.s3.p2": "Descrybe behält sich das Recht vor, Abonnementgebühren mit angemessener Vorankündigung zu ändern. Die fortgesetzte Nutzung der Dienste nach einer Gebührenänderung gilt als Annahme der neuen Gebühren.", + "legal.terms.s3.p1": "Der Zugang zu den Diensten kann ein kostenpflichtiges Abonnement erfordern. Die Zahlungsbedingungen werden während des Abonnementvorgangs angegeben. Alle Zahlungen sind nicht erstattungsfähig, es sei denn, Descrybe gibt schriftlich etwas anderes an.", + "legal.terms.s3.p2": "Descrybe behält sich das Recht vor, Abonnementgebühren mit angemessener Vorankündigung zu ändern. Die fortgesetzte Nutzung der Dienste nach einer Gebührenänderung gilt als Annahme der neuen Gebühren.", "legal.terms.s4.h": "4. Nutzerinhalte", - "legal.terms.s4.p1": "Sie behalten alle Rechte an Inhalten, die Sie über die Dienste einreichen, veröffentlichen oder anzeigen (\"Nutzerinhalte\"). Indem Sie Descrybe Nutzerinhalte bereitstellen, gewähren Sie Descrybe eine weltweite, nicht ausschließliche und royaltyfreie Lizenz, solche Inhalte im Zusammenhang mit der Erbringung der Dienste zu nutzen, zu vervielfältigen, zu ändern, anzupassen, zu veröffentlichen, zu übersetzen und zu verbreiten.", - "legal.terms.s4.lead": "Sie versichern und gewährleisten, dass:", + "legal.terms.s4.p1": "Sie behalten alle Rechte an Inhalten, die Sie über die Dienste einreichen, veröffentlichen oder anzeigen (\"Nutzerinhalte\"). Indem Sie Descrybe Nutzerinhalte bereitstellen, gewähren Sie Descrybe eine weltweite, nicht ausschließliche und royaltyfreie Lizenz, solche Inhalte im Zusammenhang mit der Erbringung der Dienste zu nutzen, zu vervielfältigen, zu ändern, anzupassen, zu veröffentlichen, zu übersetzen und zu verbreiten.", + "legal.terms.s4.lead": "Sie versichern und gewährleisten, dass:", "legal.terms.s4.li1": "Sie alle Rechte an den von Ihnen bereitgestellten Nutzerinhalten besitzen oder kontrollieren", "legal.terms.s4.li2": "Die Nutzerinhalte diese Nutzungsbedingungen nicht verletzen", - "legal.terms.s4.li3": "Die Nutzerinhalte keiner Person oder Einrichtung Schaden zufügen werden", - "legal.terms.s5.h": "5. Künstliche Intelligenz", - "legal.terms.s5.p1": "Die Dienste nutzen Technologien der künstlichen Intelligenz und des maschinellen Lernens. Sie erkennen an, dass KI-generierte Inhalte möglicherweise nicht perfekt sind, und stimmen zu, alle KI-generierten Inhalte vor der Nutzung in Ihren Geschäftsabläufen zu prüfen.", - "legal.terms.s5.p2": "Descrybe kann anonymisierte und aggregierte Nutzerinhalte zum Trainieren und Verbessern unserer KI-Modelle verwenden, vorbehaltlich unserer Datenschutzerklärung. Sie können der Verwendung Ihrer Daten für das KI-Training widersprechen, indem Sie uns kontaktieren.", + "legal.terms.s4.li3": "Die Nutzerinhalte keiner Person oder Einrichtung Schaden zufügen werden", + "legal.terms.s5.h": "5. Künstliche Intelligenz", + "legal.terms.s5.p1": "Die Dienste nutzen Technologien der künstlichen Intelligenz und des maschinellen Lernens. Sie erkennen an, dass KI-generierte Inhalte möglicherweise nicht perfekt sind, und stimmen zu, alle KI-generierten Inhalte vor der Nutzung in Ihren Geschäftsabläufen zu prüfen.", + "legal.terms.s5.p2": "Descrybe kann anonymisierte und aggregierte Nutzerinhalte zum Trainieren und Verbessern unserer KI-Modelle verwenden, vorbehaltlich unserer Datenschutzerklärung. Sie können der Verwendung Ihrer Daten für das KI-Training widersprechen, indem Sie uns kontaktieren.", "legal.terms.s6.h": "6. Geistiges Eigentum", - "legal.terms.s6.p": "Die Dienste sowie ihre ursprünglichen Inhalte, Funktionen und Funktionalitäten sind Eigentum von Descrybe und durch internationale Urheberrechts-, Marken-, Patent-, Geschäftsgeheimnis- und sonstige Gesetze zum Schutz geistigen Eigentums oder Eigentumsrechte geschützt.", + "legal.terms.s6.p": "Die Dienste sowie ihre ursprünglichen Inhalte, Funktionen und Funktionalitäten sind Eigentum von Descrybe und durch internationale Urheberrechts-, Marken-, Patent-, Geschäftsgeheimnis- und sonstige Gesetze zum Schutz geistigen Eigentums oder Eigentumsrechte geschützt.", "legal.terms.s7.h": "7. Haftungsausschluss", - "legal.terms.s7.p1": "Die Dienste werden \"wie besehen\" und \"wie verfügbar\" bereitgestellt. Descrybe gibt keine ausdrücklichen oder stillschweigenden Garantien und lehnt hiermit alle Garantien ab, einschließlich, ohne Einschränkung, stillschweigender Garantien der Marktgängigkeit, der Eignung für einen bestimmten Zweck, der Nichtverletzung von Rechten Dritter oder des Leistungsablaufs.", - "legal.terms.s7.p2": "Descrybe garantiert nicht, dass die Dienste ununterbrochen, sicher oder zu einem bestimmten Zeitpunkt oder Ort verfügbar funktionieren oder dass Fehler oder Mängel behoben werden.", - "legal.terms.s8.h": "8. Haftungsbeschränkung", - "legal.terms.s8.lead": "In keinem Fall haftet Descrybe für indirekte, zufällige, besondere, Folgeschäden oder Strafschäden, einschließlich, ohne Einschränkung, Verlust von Gewinnen, Daten, Nutzung, Goodwill oder anderen immateriellen Verlusten, die sich ergeben aus:", - "legal.terms.s8.li1": "Ihrem Zugriff auf oder Ihrer Nutzung der Dienste bzw. der Unfähigkeit, darauf zuzugreifen oder sie zu nutzen", + "legal.terms.s7.p1": "Die Dienste werden \"wie besehen\" und \"wie verfügbar\" bereitgestellt. Descrybe gibt keine ausdrücklichen oder stillschweigenden Garantien und lehnt hiermit alle Garantien ab, einschließlich, ohne Einschränkung, stillschweigender Garantien der Marktgängigkeit, der Eignung für einen bestimmten Zweck, der Nichtverletzung von Rechten Dritter oder des Leistungsablaufs.", + "legal.terms.s7.p2": "Descrybe garantiert nicht, dass die Dienste ununterbrochen, sicher oder zu einem bestimmten Zeitpunkt oder Ort verfügbar funktionieren oder dass Fehler oder Mängel behoben werden.", + "legal.terms.s8.h": "8. Haftungsbeschränkung", + "legal.terms.s8.lead": "In keinem Fall haftet Descrybe für indirekte, zufällige, besondere, Folgeschäden oder Strafschäden, einschließlich, ohne Einschränkung, Verlust von Gewinnen, Daten, Nutzung, Goodwill oder anderen immateriellen Verlusten, die sich ergeben aus:", + "legal.terms.s8.li1": "Ihrem Zugriff auf oder Ihrer Nutzung der Dienste bzw. der Unfähigkeit, darauf zuzugreifen oder sie zu nutzen", "legal.terms.s8.li2": "Jeglichem Verhalten oder Inhalt Dritter auf den Diensten", "legal.terms.s8.li3": "Jeglichen aus den Diensten erhaltenen Inhalten", - "legal.terms.s8.li4": "Unbefugtem Zugriff, Nutzung oder Veränderung Ihrer Übertragungen oder Inhalte", - "legal.terms.s9.h": "9. Kündigung", - "legal.terms.s9.p1": "Descrybe kann Ihren Zugang zu den Diensten sofort, ohne vorherige Ankündigung oder Haftung, aus beliebigem Grund kündigen oder aussetzen, einschließlich, ohne Einschränkung, wenn Sie gegen diese Nutzungsbedingungen verstoßen.", - "legal.terms.s9.p2": "Nach der Kündigung erlischt Ihr Recht zur Nutzung der Dienste sofort. Wenn Sie Ihr Konto kündigen möchten, können Sie die Nutzung der Dienste einfach einstellen oder uns kontaktieren, um die Löschung des Kontos zu beantragen.", + "legal.terms.s8.li4": "Unbefugtem Zugriff, Nutzung oder Veränderung Ihrer Übertragungen oder Inhalte", + "legal.terms.s9.h": "9. Kündigung", + "legal.terms.s9.p1": "Descrybe kann Ihren Zugang zu den Diensten sofort, ohne vorherige Ankündigung oder Haftung, aus beliebigem Grund kündigen oder aussetzen, einschließlich, ohne Einschränkung, wenn Sie gegen diese Nutzungsbedingungen verstoßen.", + "legal.terms.s9.p2": "Nach der Kündigung erlischt Ihr Recht zur Nutzung der Dienste sofort. Wenn Sie Ihr Konto kündigen möchten, können Sie die Nutzung der Dienste einfach einstellen oder uns kontaktieren, um die Löschung des Kontos zu beantragen.", "legal.terms.s10.h": "10. Anwendbares Recht", - "legal.terms.s10.p": "Diese Bedingungen unterliegen den Gesetzen Sloweniens und sind nach diesen auszulegen, ohne Rücksicht auf kollisionsrechtliche Grundsätze.", - "legal.terms.s11.h": "11. Änderungen der Bedingungen", - "legal.terms.s11.p": "Descrybe behält sich das Recht vor, diese Nutzungsbedingungen jederzeit zu ändern oder zu ersetzen. Es liegt in Ihrer Verantwortung, diese Bedingungen regelmäßig auf Änderungen zu prüfen. Die fortgesetzte Nutzung der Dienste nach der Veröffentlichung von Änderungen gilt als Annahme dieser Änderungen.", + "legal.terms.s10.p": "Diese Bedingungen unterliegen den Gesetzen Sloweniens und sind nach diesen auszulegen, ohne Rücksicht auf kollisionsrechtliche Grundsätze.", + "legal.terms.s11.h": "11. Änderungen der Bedingungen", + "legal.terms.s11.p": "Descrybe behält sich das Recht vor, diese Nutzungsbedingungen jederzeit zu ändern oder zu ersetzen. Es liegt in Ihrer Verantwortung, diese Bedingungen regelmäßig auf Änderungen zu prüfen. Die fortgesetzte Nutzung der Dienste nach der Veröffentlichung von Änderungen gilt als Annahme dieser Änderungen.", "legal.terms.s12.h": "12. Kontakt", "legal.terms.s12.lead": "Wenn Sie Fragen zu diesen Nutzungsbedingungen haben, kontaktieren Sie uns bitte unter:", - "plans.loadFailed": "Pläne konnten nicht geladen werden", - "plans.loading": "Pläne werden geladen…", - "plans.apiUnavailable": "Die Plans-API ist auf diesem Backend noch nicht verfügbar. Öffentlicher Preisvergleich wird angezeigt.", - "plans.title": "Wählen Sie Ihren Plan", + "plans.loadFailed": "Pläne konnten nicht geladen werden", + "plans.loading": "Pläne werden geladen…", + "plans.apiUnavailable": "Die Plans-API ist auf diesem Backend noch nicht verfügbar. Öffentlicher Preisvergleich wird angezeigt.", + "plans.title": "Wählen Sie Ihren Plan", "plans.sub.onPrefix": "Sie sind auf", - "plans.sub.enterpriseSuffix": "— unbegrenzte Produkte und KI-Kapazität. Kein Self-Service-Upgrade erforderlich.", - "plans.sub.paygSuffix": "— Pay-as-you-go. Vergleichen Sie die öffentlichen Pläne unten oder sprechen Sie mit dem Vertrieb über Enterprise.", + "plans.sub.enterpriseSuffix": "— unbegrenzte Produkte und KI-Kapazität. Kein Self-Service-Upgrade erforderlich.", + "plans.sub.paygSuffix": "— Pay-as-you-go. Vergleichen Sie die öffentlichen Pläne unten oder sprechen Sie mit dem Vertrieb über Enterprise.", "plans.sub.creditsMid": "mit {remaining} verbleibenden KI-Credits.", - "plans.sub.creditsSuffix": "Upgrade Starter → Growth → Business über Checkout, oder sprechen Sie mit dem Vertrieb über Enterprise.", - "plans.sub.none": "Noch kein Plan zugewiesen (z. B. nach einer übersprungenen Migration). Wählen Sie unten einen Plan — die Kapazität ist nicht Unbegrenzt, bis Checkout oder ein Admin einen zuweist.", + "plans.sub.creditsSuffix": "Upgrade Starter → Growth → Business über Checkout, oder sprechen Sie mit dem Vertrieb über Enterprise.", + "plans.sub.none": "Noch kein Plan zugewiesen (z. B. nach einer übersprungenen Migration). Wählen Sie unten einen Plan — die Kapazität ist nicht Unbegrenzt, bis Checkout oder ein Admin einen zuweist.", "plans.stripeHint": "Self-Service-Upgrades nutzen Stripe Checkout.", - "plans.checkoutUnavailable": "Self-Service-Checkout ist nicht verfügbar, bis Stripe eingerichtet ist. Kontaktieren Sie den Vertrieb für einen Plan.", + "plans.checkoutUnavailable": "Self-Service-Checkout ist nicht verfügbar, bis Stripe eingerichtet ist. Kontaktieren Sie den Vertrieb für einen Plan.", "plans.fallbackName": "Tarifplan", - "plans.fallbackDescription": "Kapazität für Ihren Katalog", + "plans.fallbackDescription": "Kapazität für Ihren Katalog", "plans.badge.current": "Aktuell", "plans.badge.popular": "Am beliebtesten", "plans.price.custom": "Individuell", - "plans.price.forever": "für immer", + "plans.price.forever": "für immer", "plans.price.perMonth": "/Monat", "plans.price.seePricing": "Preise ansehen", "plans.capacity.unlimitedSkus": "Unbegrenzte SKUs", @@ -4861,41 +4862,41 @@ export const de: MessageDict = { "plans.cta.contactSales": "Vertrieb kontaktieren", "plans.cta.switchInBilling": "In der Abrechnung wechseln", "plans.cta.upgradeTo": "Upgrade auf {name}", - "plans.cta.startingCheckout": "Checkout wird gestartet…", + "plans.cta.startingCheckout": "Checkout wird gestartet…", "plans.planApplied": "Plan {plan} angewendet. Ihre Credits sind bereit.", - "plans.faq.title": "Häufig gestellte Fragen", + "plans.faq.title": "Häufig gestellte Fragen", "plans.faq.limit.q": "Was passiert, wenn ich ein Limit erreiche?", - "plans.faq.limit.a": "Zuerst erscheinen sanfte Warnhinweise. Wenn Ihnen die KI-Credits ausgehen oder Sie Ihr SKU-Limit erreichen, werden Jobs, die diese Kapazität benötigen, blockiert, bis Sie Speicherplatz freigeben, den nächsten Zyklus abwarten oder upgraden.", + "plans.faq.limit.a": "Zuerst erscheinen sanfte Warnhinweise. Wenn Ihnen die KI-Credits ausgehen oder Sie Ihr SKU-Limit erreichen, werden Jobs, die diese Kapazität benötigen, blockiert, bis Sie Speicherplatz freigeben, den nächsten Zyklus abwarten oder upgraden.", "plans.faq.selfServe.q": "Kann ich selbst upgraden?", - "plans.faq.selfServe.a": "Unternehmens-Admins können Starter, Growth und Business über Checkout auf der Plan-Karte im Self-Service buchen. Mitglieder sollten einen Admin fragen — Checkout erfordert die Admin-Rolle. Enterprise läuft immer über den Vertrieb. Plattform-Admins können Pläne weiterhin unter Billing Admin zuweisen.", + "plans.faq.selfServe.a": "Unternehmens-Admins können Starter, Growth und Business über Checkout auf der Plan-Karte im Self-Service buchen. Mitglieder sollten einen Admin fragen — Checkout erfordert die Admin-Rolle. Enterprise läuft immer über den Vertrieb. Plattform-Admins können Pläne weiterhin unter Billing Admin zuweisen.", "plans.faq.enterprise.q": "Enterprise und Millionen von SKUs", - "plans.faq.enterprise.a": "Individuelle Kapazität, eigener KI-Schlüssel (BYOK), SLA und Account-Management laufen über den Vertrieb. Buchen Sie einen Termin über Calendly — Enterprise ist bei Millionen-SKU-Skala kein Self-Service. Die App zeigt Unbegrenzt für SKU- und KI-Kapazität.", - "plans.faq.pricing.q": "Wo finde ich die öffentlichen Preise?", + "plans.faq.enterprise.a": "Individuelle Kapazität, eigener KI-Schlüssel (BYOK), SLA und Account-Management laufen über den Vertrieb. Buchen Sie einen Termin über Calendly — Enterprise ist bei Millionen-SKU-Skala kein Self-Service. Die App zeigt Unbegrenzt für SKU- und KI-Kapazität.", + "plans.faq.pricing.q": "Wo finde ich die öffentlichen Preise?", "plans.faq.pricing.aBefore": "Sehen Sie den Marketing-Vergleich auf der", "plans.faq.pricing.pricingPage": "Preisseite", - "plans.faq.pricing.aMid": "— die CTAs sind Loslegen (Registrierung) oder Vertrieb kontaktieren. Verwalten Sie die Nutzung jederzeit unter", + "plans.faq.pricing.aMid": "— die CTAs sind Loslegen (Registrierung) oder Vertrieb kontaktieren. Verwalten Sie die Nutzung jederzeit unter", "plans.faq.pricing.aAfter": ".", - "plans.custom.title": "Benötigen Sie einen individuellen Plan?", - "plans.custom.body": "Enterprise-Kapazität, eigener KI-Schlüssel und SLAs werden mit unserem Team abgestimmt.", - "plans.custom.looking": "Suchen Sie Details zu den öffentlichen Plänen?", + "plans.custom.title": "Benötigen Sie einen individuellen Plan?", + "plans.custom.body": "Enterprise-Kapazität, eigener KI-Schlüssel und SLAs werden mit unserem Team abgestimmt.", + "plans.custom.looking": "Suchen Sie Details zu den öffentlichen Plänen?", "ai.title": "KI-Integrationen", - "ai.description": "Wählen Sie Plattform-Credits oder Ihren eigenen Schlüssel und passen Sie Prompts mit Variablen an.", + "ai.description": "Wählen Sie Plattform-Credits oder Ihren eigenen Schlüssel und passen Sie Prompts mit Variablen an.", "ai.crumb": "KI-Integrationen", - "ai.adminOnly": "Nur Unternehmens-Admins können KI-Einstellungen ändern. Sie können die aktuelle Konfiguration einsehen.", - "ai.badge.ownKey": "Ihr eigener Schlüssel", - "ai.badge.platform": "Plattform-Credits / Schlüssel", + "ai.adminOnly": "Nur Unternehmens-Admins können KI-Einstellungen ändern. Sie können die aktuelle Konfiguration einsehen.", + "ai.badge.ownKey": "Ihr eigener Schlüssel", + "ai.badge.platform": "Plattform-Credits / Schlüssel", "ai.badge.active": "Aktiv: {label}", - "ai.badge.platformKeyAvailable": "Plattform-Schlüssel verfügbar", + "ai.badge.platformKeyAvailable": "Plattform-Schlüssel verfügbar", "ai.badge.lastTest": "Letzter Test: {status}", "ai.providerMode.title": "Anbietermodus", - "ai.providerMode.desc": "Die Plattform nutzt Descrybe-Credits und unseren Schlüssel. Beliebt oder Benutzerdefiniert nutzt Ihren OpenAI-kompatiblen Schlüssel (der Anbieteraufruf selbst verbraucht keine Plattform-Credits; Feature-Credit-Regeln gelten weiterhin).", + "ai.providerMode.desc": "Die Plattform nutzt Descrybe-Credits und unseren Schlüssel. Beliebt oder Benutzerdefiniert nutzt Ihren OpenAI-kompatiblen Schlüssel (der Anbieteraufruf selbst verbraucht keine Plattform-Credits; Feature-Credit-Regeln gelten weiterhin).", "ai.whoPays": "Wer zahlt das Modell?", - "ai.mode.internal": "Plattform (Descrybe-Credits / Schlüssel)", - "ai.mode.popular": "Ihr Schlüssel — beliebter Anbieter", - "ai.mode.custom": "Ihr Schlüssel — eigener Endpunkt", - "ai.useCompanyKey": "Diesen Unternehmensschlüssel für Verarbeitung, SEO-KI und Kampagnen-KI verwenden", + "ai.mode.internal": "Plattform (Descrybe-Credits / Schlüssel)", + "ai.mode.popular": "Ihr Schlüssel — beliebter Anbieter", + "ai.mode.custom": "Ihr Schlüssel — eigener Endpunkt", + "ai.useCompanyKey": "Diesen Unternehmensschlüssel für Verarbeitung, SEO-KI und Kampagnen-KI verwenden", "ai.popular.title": "Beliebter Anbieter", - "ai.popular.desc": "OpenAI-kompatible Endpunkte. Anthropic über OpenRouter.", + "ai.popular.desc": "OpenAI-kompatible Endpunkte. Anthropic über OpenRouter.", "ai.field.provider": "Anbieter", "ai.field.model": "Modell", "ai.placeholder.modelId": "Modell-ID", @@ -4903,51 +4904,51 @@ export const de: MessageDict = { "ai.custom.title": "Eigener Endpunkt", "ai.custom.desc": "Geben Sie die HTTPS-Basis-URL Ihres KI-Anbieters ein.", "ai.field.baseUrl": "Basis-URL", - "ai.apiKey.title": "API-Schlüssel", - "ai.apiKey.desc": "Leer lassen, um den vorhandenen Schlüssel zu behalten. Rohgeheimnisse werden nie zurückgegeben — nur ein maskiertes last4.", - "ai.storedKey": "Gespeicherter Schlüssel: {masked}", - "ai.field.apiKey": "API-Schlüssel", - "ai.placeholder.keepKey": "•••• leer lassen zum Behalten", - "ai.clearStoredKey": "Gespeicherten API-Schlüssel löschen", + "ai.apiKey.title": "API-Schlüssel", + "ai.apiKey.desc": "Leer lassen, um den vorhandenen Schlüssel zu behalten. Rohgeheimnisse werden nie zurückgegeben — nur ein maskiertes last4.", + "ai.storedKey": "Gespeicherter Schlüssel: {masked}", + "ai.field.apiKey": "API-Schlüssel", + "ai.placeholder.keepKey": "•••• leer lassen zum Behalten", + "ai.clearStoredKey": "Gespeicherten API-Schlüssel löschen", "ai.saveProvider": "Anbieter speichern", "ai.testConnection": "Verbindung testen", "ai.prompts.title": "Prompt-Vorlagen", - "ai.prompts.descBefore": "Passen Sie System- und Nutzer-Prompts für Produkttexte, SEO-Meta und Kampagnen-E-Mails an. Fügen Sie Variablen wie", - "ai.prompts.descMid": "ein — sie werden zur Laufzeit befüllt. Die Markenstimme aus dem Brand Kit ist verfügbar als", + "ai.prompts.descBefore": "Passen Sie System- und Nutzer-Prompts für Produkttexte, SEO-Meta und Kampagnen-E-Mails an. Fügen Sie Variablen wie", + "ai.prompts.descMid": "ein — sie werden zur Laufzeit befüllt. Die Markenstimme aus dem Brand Kit ist verfügbar als", "ai.prompts.descAfter": ".", "ai.field.feature": "Funktion", "ai.badge.custom": "Benutzerdefiniert", "ai.badge.builtin": "Integrierter Standard", - "ai.badge.disabledDefault": "Deaktiviert → Standard wird verwendet", + "ai.badge.disabledDefault": "Deaktiviert → Standard wird verwendet", "ai.useCustomPrompt": "Diesen eigenen Prompt verwenden (aus = integrierter Standard)", - "ai.insertVariableInto": "Variable einfügen in", + "ai.insertVariableInto": "Variable einfügen in", "ai.insert.system": "Systembereich", "ai.insert.user": "Nutzer", "ai.field.systemPrompt": "System-Prompt", "ai.field.userPrompt": "Nutzer-Prompt", "ai.savePrompts": "Prompts speichern", - "ai.resetDefault": "Auf Standard zurücksetzen", + "ai.resetDefault": "Auf Standard zurücksetzen", "ai.editBrandVoice": "Markenstimme bearbeiten", "ai.flash.loadFailed": "KI-Einstellungen konnten nicht geladen werden", - "ai.flash.usingPlatform": "Plattform-KI wird verwendet (Descrybe-Credits / Schlüssel, sofern konfiguriert).", - "ai.flash.providerSaved": "KI-Anbieter gespeichert. Schlüssel werden verschlüsselt und nie wieder angezeigt.", + "ai.flash.usingPlatform": "Plattform-KI wird verwendet (Descrybe-Credits / Schlüssel, sofern konfiguriert).", + "ai.flash.providerSaved": "KI-Anbieter gespeichert. Schlüssel werden verschlüsselt und nie wieder angezeigt.", "ai.flash.saveFailed": "Speichern fehlgeschlagen", "ai.flash.savePromptsFailed": "Prompts konnten nicht gespeichert werden", - "ai.flash.resetFailed": "Prompt konnte nicht zurückgesetzt werden", + "ai.flash.resetFailed": "Prompt konnte nicht zurückgesetzt werden", "ai.flash.connectionFailed": "Verbindung fehlgeschlagen", "ai.flash.testFailed": "Test fehlgeschlagen", - "ai.action.changeSettings": "KI-Anbietereinstellungen ändern", - "ai.action.changePrompts": "KI-Prompts ändern", + "ai.action.changeSettings": "KI-Anbietereinstellungen ändern", + "ai.action.changePrompts": "KI-Prompts ändern", "ai.action.testProvider": "den KI-Anbieter testen", "email.title": "E-Mail-Versand", - "email.description": "Resend oder SMTP für Marketingkampagnen. Geheimnisse verschlüsselt im Ruhezustand.", - "email.adminOnly": "Nur Unternehmens-Admins können E-Mail-Anbietereinstellungen ändern. Sie können die aktuelle Konfiguration einsehen.", + "email.description": "Resend oder SMTP für Marketingkampagnen. Geheimnisse verschlüsselt im Ruhezustand.", + "email.adminOnly": "Nur Unternehmens-Admins können E-Mail-Anbietereinstellungen ändern. Sie können die aktuelle Konfiguration einsehen.", "email.crumb": "E-Mail-Integration", - "email.dryRunForced": "Dry-Run ist erzwungen ({reason}). Free-Pläne und EMAIL_DRY_RUN senden nie echte Massenmails.", + "email.dryRunForced": "Dry-Run ist erzwungen ({reason}). Free-Pläne und EMAIL_DRY_RUN senden nie echte Massenmails.", "email.dryRunPolicy": "Richtlinie", "email.badge.verified": "Verifiziert", "email.badge.notVerified": "Nicht verifiziert", - "email.badge.canSendReal": "Echter Versand möglich", + "email.badge.canSendReal": "Echter Versand möglich", "email.badge.realBlocked": "Echter Versand blockiert", "email.badge.lastTest": "Letzter Test: {status}", "email.provider.title": "Anbieter", @@ -4960,8 +4961,8 @@ export const de: MessageDict = { "email.field.from": "Von", "email.field.fromName": "Absendername", "email.field.replyTo": "Reply-To", - "email.resendKeySaved": "Resend-API-Schlüssel (gespeichert — leer lassen zum Behalten)", - "email.resendKey": "Resend-API-Schlüssel", + "email.resendKeySaved": "Resend-API-Schlüssel (gespeichert — leer lassen zum Behalten)", + "email.resendKey": "Resend-API-Schlüssel", "email.field.smtpHost": "SMTP-Host", "email.field.port": "Port", "email.field.username": "Benutzername", @@ -4969,55 +4970,55 @@ export const de: MessageDict = { "email.field.password": "Passwort", "email.verifyDomain": "Domain verifizieren", "email.testGate.title": "Test & Versandfreigabe", - "email.testGate.desc": "Testsendungen prüfen die Absenderadresse. Echte Massenmails erfordern die Eingabe von “I understand”.", - "email.field.recipient": "Empfänger", + "email.testGate.desc": "Testsendungen prüfen die Absenderadresse. Echte Massenmails erfordern die Eingabe von “I understand”.", + "email.field.recipient": "Empfänger", "email.sendTest": "Test senden", - "email.confirmBlast": "Massenversand bestätigen…", + "email.confirmBlast": "Massenversand bestätigen…", "email.flash.loadFailed": "E-Mail-Einstellungen konnten nicht geladen werden", "email.flash.saveFailed": "Speichern fehlgeschlagen", "email.flash.verifyUpdated": "Verifizierung aktualisiert.", "email.flash.verifyFailed": "Verifizierung fehlgeschlagen", "email.flash.testFailed": "Testversand fehlgeschlagen", - "email.flash.blastDryRun": "Zustellprüfung im Dry-Run-Modus erfasst — es wurde keine E-Mail gesendet.", - "email.flash.blastDone": "Zustellprüfung abgeschlossen: {sent} gesendet, {failed} fehlgeschlagen.", + "email.flash.blastDryRun": "Zustellprüfung im Dry-Run-Modus erfasst — es wurde keine E-Mail gesendet.", + "email.flash.blastDone": "Zustellprüfung abgeschlossen: {sent} gesendet, {failed} fehlgeschlagen.", "email.flash.blastFailed": "Massenversand fehlgeschlagen", - "email.blast.subject": "Descrybe-E-Mail-Zustellprüfung", - "email.blast.body": "Dies ist eine Ein-Adressen-Zustellprüfung von Descrybe, um zu bestätigen, dass Ihre E-Mail-Integration senden kann. Empfänger: {recipient}", - "email.action.changeSettings": "E-Mail-Anbietereinstellungen ändern", + "email.blast.subject": "Descrybe-E-Mail-Zustellprüfung", + "email.blast.body": "Dies ist eine Ein-Adressen-Zustellprüfung von Descrybe, um zu bestätigen, dass Ihre E-Mail-Integration senden kann. Empfänger: {recipient}", + "email.action.changeSettings": "E-Mail-Anbietereinstellungen ändern", "email.action.verifyDomain": "die E-Mail-Domain verifizieren", "email.action.sendTest": "Test-E-Mail senden", "email.action.sendBlasts": "E-Mail-Massenmails senden", "seo.title": "SEO-Empfehlungen", - "seo.description": "Checklisten-Werte für Katalog-Meta, Titel, Bilder und Keywords. Vorlagenfüllung ist kostenlos; KI-Umschreibung ist kostenpflichtig.", + "seo.description": "Checklisten-Werte für Katalog-Meta, Titel, Bilder und Keywords. Vorlagenfüllung ist kostenlos; KI-Umschreibung ist kostenpflichtig.", "seo.upgradeTitle": "KI-Umschreibung ist eine kostenpflichtige Funktion", - "seo.upgradeMessage": "Free-Pläne können fehlende Meta weiterhin mit regelbasierten Vorlagen beheben. Upgraden Sie oder fügen Sie Credits hinzu, um KI-Umschreibungen zu nutzen.", - "seo.comparePlans": "Pläne vergleichen", - "seo.openProducts": "Produkte öffnen", + "seo.upgradeMessage": "Free-Pläne können fehlende Meta weiterhin mit regelbasierten Vorlagen beheben. Upgraden Sie oder fügen Sie Credits hinzu, um KI-Umschreibungen zu nutzen.", + "seo.comparePlans": "Pläne vergleichen", + "seo.openProducts": "Produkte öffnen", "seo.overallScore": "Gesamt-SEO-Score", - "seo.overallScoreHint": "Durchschnitt über Checklistenpunkte", + "seo.overallScoreHint": "Durchschnitt über Checklistenpunkte", "seo.productsScanned": "Produkte gescannt", "seo.productsScannedHint": "Verarbeitete Produkte im Unternehmen", "seo.categoriesScanned": "Kategorien gescannt", - "seo.categoriesScannedHint": "Einschließlich Meta-Formelprüfungen", + "seo.categoriesScannedHint": "Einschließlich Meta-Formelprüfungen", "seo.aiRewrite": "KI-Umschreibung", - "seo.available": "Verfügbar", + "seo.available": "Verfügbar", "seo.gated": "Gesperrt", - "seo.templateFree": "Vorlagenfüllung bleibt in allen Plänen kostenlos", + "seo.templateFree": "Vorlagenfüllung bleibt in allen Plänen kostenlos", "seo.checklist": "Checkliste", - "seo.affectedFindings": "{affected} betroffen · {count} Befunde", + "seo.affectedFindings": "{affected} betroffen · {count} Befunde", "seo.fixable": "Behebbar", - "seo.clearFilter": "Filter löschen", + "seo.clearFilter": "Filter löschen", "seo.findings": "Befunde", - "seo.noFindings": "Keine Befunde für diesen Filter — gute Arbeit.", + "seo.noFindings": "Keine Befunde für diesen Filter — gute Arbeit.", "seo.col.issue": "Problem", - "seo.col.entity": "Entität", + "seo.col.entity": "Entität", "seo.col.severity": "Schwere", "seo.col.actions": "Aktionen", - "seo.filling": "Wird gefüllt…", - "seo.templateFill": "Vorlagenfüllung", + "seo.filling": "Wird gefüllt…", + "seo.templateFill": "Vorlagenfüllung", "seo.aiTitleAllowed": "Mit KI umschreiben (nutzt Credits)", "seo.aiTitleGated": "Erfordert kostenpflichtigen Plan oder Credits", - "seo.rewriting": "Wird umgeschrieben…", + "seo.rewriting": "Wird umgeschrieben…", "seo.aiRewriteBtn": "KI-Umschreibung", "seo.viewProduct": "Produkt ansehen", "seo.flash.loadFailed": "SEO-Empfehlungen konnten nicht geladen werden", @@ -5025,69 +5026,69 @@ export const de: MessageDict = { "seo.flash.applyFailed": "Korrektur konnte nicht angewendet werden", "brand.title": "Brand Kit", "brand.description": "Definieren Sie Stimme, Richtlinien und Farben, damit Produkttitel und -beschreibungen markenkonform bleiben.", - "brand.loading": "Brand Kit wird geladen…", - "brand.adminOnly": "Nur Unternehmens-Admins können das Brand Kit bearbeiten. Sie können die aktuelle Stimme, Farben und das Logo einsehen.", - "brand.aiApplyFreeAdmin": "Sie können Ihr Brand Kit im Free-Plan bearbeiten. KI-Anwendung (Markenstimme in Enhance-Prompts einfügen) wird ab Starter freigeschaltet.", - "brand.aiApplyGated": "KI-Anwendung (Markenstimme in Enhance-Prompts einfügen) wird ab Starter freigeschaltet.", + "brand.loading": "Brand Kit wird geladen…", + "brand.adminOnly": "Nur Unternehmens-Admins können das Brand Kit bearbeiten. Sie können die aktuelle Stimme, Farben und das Logo einsehen.", + "brand.aiApplyFreeAdmin": "Sie können Ihr Brand Kit im Free-Plan bearbeiten. KI-Anwendung (Markenstimme in Enhance-Prompts einfügen) wird ab Starter freigeschaltet.", + "brand.aiApplyGated": "KI-Anwendung (Markenstimme in Enhance-Prompts einfügen) wird ab Starter freigeschaltet.", "brand.aiEnhanceUses": "KI-Enhance nutzt diese Markenstimme beim Verarbeiten von Produkten.", - "brand.comparePlans": "Pläne vergleichen", + "brand.comparePlans": "Pläne vergleichen", "brand.voice.title": "Stimme & Richtlinien", - "brand.voice.desc": "Ton, Do/Don’t-Regeln und bevorzugte Formulierungen", + "brand.voice.desc": "Ton, Do/Don’t-Regeln und bevorzugte Formulierungen", "brand.field.voiceTone": "Stimme / Ton", - "brand.placeholder.voiceTone": "z. B. Selbstbewusst, prägnant, technisch aber zugänglich", + "brand.placeholder.voiceTone": "z. B. Selbstbewusst, prägnant, technisch aber zugänglich", "brand.field.dos": "Do (eine pro Zeile)", "brand.placeholder.dos": "Mit dem Hauptnutzen beginnen\nTitel unter 80 Zeichen halten", - "brand.field.donts": "Don’t (eine pro Zeile)", + "brand.field.donts": "Don’t (eine pro Zeile)", "brand.placeholder.donts": "Kein GROSSSCHREIBEN\nSuperlative ohne Beleg vermeiden", "brand.field.preferredTerms": "Bevorzugte Begriffe (eine pro Zeile oder kommagetrennt)", "brand.placeholder.preferredTerms": "kabellos, premium, Energieklasse", - "brand.visual.title": "Visuelle Identität", - "brand.visual.desc": "Farben und Logo für markenbezogene Tipps und Kampagnen", - "brand.field.primaryColor": "Primärfarbe", - "brand.field.secondaryColor": "Sekundärfarbe", + "brand.visual.title": "Visuelle Identität", + "brand.visual.desc": "Farben und Logo für markenbezogene Tipps und Kampagnen", + "brand.field.primaryColor": "Primärfarbe", + "brand.field.secondaryColor": "Sekundärfarbe", "brand.field.logoImage": "Logo-Bild", "brand.logoHint": "PNG, JPEG oder WebP bis 2 MiB. Wird unter den Unternehmens-Uploads gespeichert.", - "brand.uploading": "Wird hochgeladen…", + "brand.uploading": "Wird hochgeladen…", "brand.uploadLogo": "Logo hochladen", - "brand.clear": "Löschen", + "brand.clear": "Löschen", "brand.field.logoUrl": "Logo-URL", - "brand.placeholder.logoUrl": "https://… oder hochgeladen /api/brand/logo/files/…", + "brand.placeholder.logoUrl": "https://… oder hochgeladen /api/brand/logo/files/…", "brand.logoAlt": "Vorschau des Markenlogos", "brand.tipsTitle": "Formel- / Vorschautipps", - "brand.saving": "Wird gespeichert…", + "brand.saving": "Wird gespeichert…", "brand.save": "Brand Kit speichern", "brand.flash.loadFailed": "Brand Kit konnte nicht geladen werden", "structured.title": "Strukturierte Beschreibungsfelder", - "structured.loading": "Strukturierte Beschreibungsfelder werden geladen…", - "structured.backDashboard": "Zurück zum Dashboard", + "structured.loading": "Strukturierte Beschreibungsfelder werden geladen…", + "structured.backDashboard": "Zurück zum Dashboard", "structured.categoryFormulas": "Kategorieformeln", "structured.exportFeeds": "Export-Feeds", - "structured.intro": "Diese Felder werden automatisch erstellt, wenn Sie Export IDs zu den Abschnitten Ihrer Beschreibungsformel hinzufügen. Sie können in Ihren Export-Feeds verwendet werden, um bestimmte Teile Ihrer Produktbeschreibungen einzubeziehen.", - "structured.addField": "Feld hinzufügen", - "structured.openCategories": "Kategorien öffnen", - "structured.tableCaption": "Diese Felder strukturieren Teile von Produktbeschreibungen für den Export.", - "structured.col.fieldKey": "Feldschlüssel", + "structured.intro": "Diese Felder werden automatisch erstellt, wenn Sie Export IDs zu den Abschnitten Ihrer Beschreibungsformel hinzufügen. Sie können in Ihren Export-Feeds verwendet werden, um bestimmte Teile Ihrer Produktbeschreibungen einzubeziehen.", + "structured.addField": "Feld hinzufügen", + "structured.openCategories": "Kategorien öffnen", + "structured.tableCaption": "Diese Felder strukturieren Teile von Produktbeschreibungen für den Export.", + "structured.col.fieldKey": "Feldschlüssel", "structured.col.type": "Typ", "structured.col.created": "Erstellt", "structured.col.actions": "Aktionen", - "structured.dialogTitle": "Strukturiertes Beschreibungsfeld hinzufügen", - "structured.fieldKeyLabel": "Feldschlüssel (erforderlich)", + "structured.dialogTitle": "Strukturiertes Beschreibungsfeld hinzufügen", + "structured.fieldKeyLabel": "Feldschlüssel (erforderlich)", "structured.fieldKeyPlaceholder": "z. B. features, specifications", "structured.fieldTypeLabel": "Feldtyp", "structured.type.text": "Text", "structured.type.number": "Zahl", "structured.type.boolean": "Boolesch", "structured.type.list": "Liste", - "structured.adding": "Wird hinzugefügt...", + "structured.adding": "Wird hinzugefügt...", "structured.flash.loadFailed": "Strukturierte Beschreibungsfelder konnten nicht geladen werden", "assistant.ariaLabel": "Systemassistent", "assistant.title": "Systemassistent", - "assistant.subtitle": "Navigieren, führen und unterstützte Aktionen ausführen", - "assistant.resetAria": "Unterhaltung zurücksetzen", - "assistant.resetTitle": "Zurücksetzen", - "assistant.closeAria": "Assistent schließen", + "assistant.subtitle": "Navigieren, führen und unterstützte Aktionen ausführen", + "assistant.resetAria": "Unterhaltung zurücksetzen", + "assistant.resetTitle": "Zurücksetzen", + "assistant.closeAria": "Assistent schließen", "assistant.messageLabel": "Nachricht", - "assistant.placeholder": "z. B. Feed-URL hinzufügen, API-Schlüssel, Attribute, Verarbeitung…", + "assistant.placeholder": "z. B. Feed-URL hinzufügen, API-Schlüssel, Attribute, Verarbeitung…", "assistant.sendAria": "Senden", "site.bookDemo": "Demo buchen", "site.demoShort": "Demo", @@ -5095,104 +5096,104 @@ export const de: MessageDict = { "site.cookiePolicy": "Cookie-Richtlinie", "site.cookieSettings": "Cookie-Einstellungen", "consent.title": "Cookies und Analysen", - "consent.description": "Wir verwenden notwendige Cookies, damit Descrybe funktioniert. Optionale Analyse- und Marketing-Cookies helfen uns, die Nutzung zu verstehen und Kampagnen zu messen. Sie können Ihre Wahl jederzeit ändern.", + "consent.description": "Wir verwenden notwendige Cookies, damit Descrybe funktioniert. Optionale Analyse- und Marketing-Cookies helfen uns, die Nutzung zu verstehen und Kampagnen zu messen. Sie können Ihre Wahl jederzeit ändern.", "consent.acceptAll": "Alle akzeptieren", "consent.rejectNonEssential": "Nicht notwendige ablehnen", "consent.customize": "Anpassen", "consent.save": "Einstellungen speichern", "consent.necessary": "Notwendig", - "consent.necessaryDesc": "Erforderlich für Anmeldung, Sicherheit (CSRF), Theme, Sprache und diese Auswahl.", + "consent.necessaryDesc": "Erforderlich für Anmeldung, Sicherheit (CSRF), Theme, Sprache und diese Auswahl.", "consent.alwaysOn": "Immer aktiv", "consent.analytics": "Analyse", - "consent.analyticsDesc": "Hilft uns zu verstehen, wie das Produkt genutzt wird (Google Analytics über GTM).", + "consent.analyticsDesc": "Hilft uns zu verstehen, wie das Produkt genutzt wird (Google Analytics über GTM).", "consent.marketing": "Marketing", - "consent.marketingDesc": "Für Werbemessung und Personalisierung, wenn Anzeigen-Tags in GTM konfiguriert sind.", + "consent.marketingDesc": "Für Werbemessung und Personalisierung, wenn Anzeigen-Tags in GTM konfiguriert sind.", "consent.policyLink": "Cookie-Richtlinie lesen", "seo.cookies.title": "Cookie-Richtlinie | Descrybe", - "seo.cookies.description": "Wie Descrybe notwendige, Analyse- und Marketing-Cookies nutzt, einschließlich GTM und GA4, und wie Sie Ihre Einwilligung ändern.", + "seo.cookies.description": "Wie Descrybe notwendige, Analyse- und Marketing-Cookies nutzt, einschließlich GTM und GA4, und wie Sie Ihre Einwilligung ändern.", "legal.cookies.title": "Cookie-Richtlinie", - "legal.cookies.intro.h": "Überblick", - "legal.cookies.intro.p1": "Diese Cookie-Richtlinie erklärt, wie Descrybe Cookies und ähnliche Technologien auf Website und Anwendung verwendet. Bitte lesen Sie sie zusammen mit unserer Datenschutzrichtlinie.", - "legal.cookies.intro.p2": "Soweit erforderlich, fragen wir vor dem Aktivieren von Analyse- oder Marketing-Cookies um Ihre Einwilligung. Notwendige Cookies dienen dem sicheren Betrieb und benötigen keine Einwilligung.", + "legal.cookies.intro.h": "Überblick", + "legal.cookies.intro.p1": "Diese Cookie-Richtlinie erklärt, wie Descrybe Cookies und ähnliche Technologien auf Website und Anwendung verwendet. Bitte lesen Sie sie zusammen mit unserer Datenschutzrichtlinie.", + "legal.cookies.intro.p2": "Soweit erforderlich, fragen wir vor dem Aktivieren von Analyse- oder Marketing-Cookies um Ihre Einwilligung. Notwendige Cookies dienen dem sicheren Betrieb und benötigen keine Einwilligung.", "legal.cookies.types.h": "Cookie-Kategorien", "legal.cookies.necessary.h": "Notwendig", - "legal.cookies.necessary.p": "Diese Cookies halten Sie angemeldet, schützen Formulare mit CSRF-Tokens, speichern Theme- und Spracheinstellungen und merken sich Ihre Cookie-Wahl. Ohne sie funktioniert das Produkt nicht korrekt.", + "legal.cookies.necessary.p": "Diese Cookies halten Sie angemeldet, schützen Formulare mit CSRF-Tokens, speichern Theme- und Spracheinstellungen und merken sich Ihre Cookie-Wahl. Ohne sie funktioniert das Produkt nicht korrekt.", "legal.cookies.analytics.h": "Analyse", - "legal.cookies.analytics.p": "Wenn Sie Analysen erlauben, laden wir Google-Tag-Manager-Tags, die Google-Analytics-4-Cookies setzen können, um Seitenaufrufe und Produkt-Events zu messen. Events starten erst nach Freigabe von analytics_storage.", + "legal.cookies.analytics.p": "Wenn Sie Analysen erlauben, laden wir Google-Tag-Manager-Tags, die Google-Analytics-4-Cookies setzen können, um Seitenaufrufe und Produkt-Events zu messen. Events starten erst nach Freigabe von analytics_storage.", "legal.cookies.marketing.h": "Marketing", - "legal.cookies.marketing.p": "Wenn Sie Marketing erlauben, können werbebezogene Tags in GTM Ad-Storage und verwandte Signale für Kampagnenmessung und Personalisierung nutzen.", + "legal.cookies.marketing.p": "Wenn Sie Marketing erlauben, können werbebezogene Tags in GTM Ad-Storage und verwandte Signale für Kampagnenmessung und Personalisierung nutzen.", "legal.cookies.gtm.h": "Google Tag Manager und GA4", - "legal.cookies.gtm.p": "Wenn konfiguriert, lädt Descrybe einen Google-Tag-Manager-Container. GA4 wird darin von Descrybe konfiguriert. Consent Mode v2 ist standardmäßig für Analyse- und Anzeigenspeicher abgelehnt, bis Sie die Kategorien akzeptieren.", + "legal.cookies.gtm.p": "Wenn konfiguriert, lädt Descrybe einen Google-Tag-Manager-Container. GA4 wird darin von Descrybe konfiguriert. Consent Mode v2 ist standardmäßig für Analyse- und Anzeigenspeicher abgelehnt, bis Sie die Kategorien akzeptieren.", "legal.cookies.third.h": "Drittanbieter", - "legal.cookies.third.p": "Google (Tag Manager / Analytics) kann bei erteilter Einwilligung technische Daten wie Seiten-URLs, Geräte-/Browserinformationen und Eventnamen verarbeiten. Wir senden absichtlich keine Passwörter, API-Schlüssel oder Kontaktdaten in Analytics-Events.", - "legal.cookies.manage.h": "Einwilligung ändern", - "legal.cookies.manage.p": "Nutzen Sie Cookie-Einstellungen in der Fußzeile (oder die Schaltfläche unten), um das Banner erneut zu öffnen. Sie können auch die Websitedaten im Browser löschen.", + "legal.cookies.third.p": "Google (Tag Manager / Analytics) kann bei erteilter Einwilligung technische Daten wie Seiten-URLs, Geräte-/Browserinformationen und Eventnamen verarbeiten. Wir senden absichtlich keine Passwörter, API-Schlüssel oder Kontaktdaten in Analytics-Events.", + "legal.cookies.manage.h": "Einwilligung ändern", + "legal.cookies.manage.p": "Nutzen Sie Cookie-Einstellungen in der Fußzeile (oder die Schaltfläche unten), um das Banner erneut zu öffnen. Sie können auch die Websitedaten im Browser löschen.", "site.privacyPolicy": "Datenschutzrichtlinie", "site.termsOfService": "Nutzungsbedingungen", "site.legalNav": "Rechtliches", "site.footer.aria": "Website", - "site.footer.description": "Descrybe verwandelt Lieferanten-Feeds in saubere, kanalbereite Produktkataloge — Felder zuordnen, Attribute und Listing-Texte anreichern, dann exportieren oder mit WooCommerce synchronisieren.", - "site.footer.rightsLine": "© {year} {name}. Alle Rechte vorbehalten.", + "site.footer.description": "Descrybe verwandelt Lieferanten-Feeds in saubere, kanalbereite Produktkataloge — Felder zuordnen, Attribute und Listing-Texte anreichern, dann exportieren oder mit WooCommerce synchronisieren.", + "site.footer.rightsLine": "© {year} {name}. Alle Rechte vorbehalten.", "site.footer.navTitle": "Navigation", "site.footer.platform": "Plattform", - "site.footer.solutions": "Lösungen", + "site.footer.solutions": "Lösungen", "site.footer.contact": "Kontakt", - "home.hero.tagline": "Produktdaten für E-Commerce-Teams", + "home.hero.tagline": "Produktdaten für E-Commerce-Teams", "home.hero.title": "Von Lieferanten-Feeds zu Produktseiten", - "home.hero.lead": "Verbinden Sie Lieferanten-Feeds, ordnen Sie sie Ihren Kategorien zu, füllen Sie Pflichtattribute und schreiben Sie Titel und Beschreibungen nach Ihren Regeln — dann exportieren oder mit Ihrem Shop synchronisieren.", + "home.hero.lead": "Verbinden Sie Lieferanten-Feeds, ordnen Sie sie Ihren Kategorien zu, füllen Sie Pflichtattribute und schreiben Sie Titel und Beschreibungen nach Ihren Regeln — dann exportieren oder mit Ihrem Shop synchronisieren.", "home.hero.learnMore": "Mehr erfahren", "home.hero.apply": "Zugang beantragen", - "home.hero.supportedBy": "Unterstützt von", + "home.hero.supportedBy": "Unterstützt von", "home.hero.msAlt": "Microsoft for Startups", "home.image.previewAlt": "Descrybe-Plattformvorschau: vom Feed zur Produktseite", "home.how.title": "So spart Descrybe Zeit, Produkte auf den Markt zu bringen", - "home.how.lead": "Importieren Sie unordentliche Lieferantendaten einmal. Descrybe hilft beim Kategorisieren, Ausfüllen von Attributen, Listing-Texten und dem Versand fertiger Produkte an Ihre Kanäle.", + "home.how.lead": "Importieren Sie unordentliche Lieferantendaten einmal. Descrybe hilft beim Kategorisieren, Ausfüllen von Attributen, Listing-Texten und dem Versand fertiger Produkte an Ihre Kanäle.", "home.how.apply": "Zugang beantragen", "home.how.step1.title": "Taxonomie importieren", "home.how.step1.desc": "Richten Sie die Kategorien und Attribute ein, die Ihr Shop bereits nutzt", "home.how.step1.f1": "Pflichtattribute je Kategorie definieren", "home.how.step1.f2": "Titelformeln je Kategorie festlegen", - "home.how.step1.f3": "Vorlagen für Beschreibung und Such-Snippet setzen", + "home.how.step1.f3": "Vorlagen für Beschreibung und Such-Snippet setzen", "home.how.step2.title": "Lieferantendaten importieren", "home.how.step2.desc": "Feed-URL verbinden oder Produktdatei hochladen", "home.how.step2.f1": "Import aus CSV, XML oder API", "home.how.step2.f2": "Automatische Importe von Lieferanten planen", "home.how.step2.f3": "Quellfelder per Drag-and-drop zuordnen", "home.how.step3.title": "Transformieren & anreichern", - "home.how.step3.desc": "Produkte auswählen und Descrybe:", + "home.how.step3.desc": "Produkte auswählen und Descrybe:", "home.how.step3.f1": "Die richtigen Kategorien zuweisen", - "home.how.step3.f2": "Pflicht-Produktattribute füllen", + "home.how.step3.f2": "Pflicht-Produktattribute füllen", "home.how.step3.f3": "Klare, suchfreundliche Titel und Beschreibungen erstellen", - "home.how.step4.title": "In Kanäle exportieren", + "home.how.step4.title": "In Kanäle exportieren", "home.how.step4.desc": "Fertige Produktdaten dorthin senden, wo Sie verkaufen", "home.how.step4.f1": "Kanalspezifische Produktfeeds erzeugen", - "home.how.step4.f2": "Volle Kontrolle über exportierte Felder behalten", - "home.how.step4.f3": "Aktuell bleiben, wenn sich Lieferantendaten ändern", - "home.benefits.title": "Alles für sauberere Produktdaten", - "home.benefits.lead": "Vom Feed-Import bis zu kanalbereiten Listings — ohne jede Datei von Hand neu aufzubauen.", - "home.benefits.shield.title": "Unvollständige Listings früh erkennen", - "home.benefits.shield.desc": "Prüfen Sie Produktdaten gegen Kategorieregeln, damit fehlende Attribute und dünne Texte vor dem Go-live behoben werden.", - "home.benefits.chart.title": "Klarere Listings, stärkere Conversion", - "home.benefits.chart.desc": "Titel und Beschreibungen, die hervorheben, was Käufer interessiert — Vorteile, Specs und Suchbegriffe Ihres Katalogs.", + "home.how.step4.f2": "Volle Kontrolle über exportierte Felder behalten", + "home.how.step4.f3": "Aktuell bleiben, wenn sich Lieferantendaten ändern", + "home.benefits.title": "Alles für sauberere Produktdaten", + "home.benefits.lead": "Vom Feed-Import bis zu kanalbereiten Listings — ohne jede Datei von Hand neu aufzubauen.", + "home.benefits.shield.title": "Unvollständige Listings früh erkennen", + "home.benefits.shield.desc": "Prüfen Sie Produktdaten gegen Kategorieregeln, damit fehlende Attribute und dünne Texte vor dem Go-live behoben werden.", + "home.benefits.chart.title": "Klarere Listings, stärkere Conversion", + "home.benefits.chart.desc": "Titel und Beschreibungen, die hervorheben, was Käufer interessiert — Vorteile, Specs und Suchbegriffe Ihres Katalogs.", "home.benefits.database.title": "Eine konsistente Produktstruktur", - "home.benefits.database.desc": "Gleicher Kategoriebaum und gleiche Attributform über Exports und Kanäle, damit Kunden Produkte überall gleich finden.", + "home.benefits.database.desc": "Gleicher Kategoriebaum und gleiche Attributform über Exports und Kanäle, damit Kunden Produkte überall gleich finden.", "home.benefits.search.title": "Suchfreundliche Produktinhalte", - "home.benefits.search.desc": "Titel, Beschreibungen und Meta-Snippets, die für Käufer und Suchmaschinen leichter verständlich sind.", + "home.benefits.search.desc": "Titel, Beschreibungen und Meta-Snippets, die für Käufer und Suchmaschinen leichter verständlich sind.", "home.benefits.cost.title": "Weniger manuelle Dateneingabe", - "home.benefits.cost.desc": "Automatisieren Sie Mapping, Attributfüllung und Listing-Texte, damit das Team merchandising statt Tabellenpflege macht.", - "home.benefits.scale.title": "Bereit für jeden Verkaufskanal", - "home.benefits.scale.desc": "Formen Sie Export-Feeds und WooCommerce-Sync für die Formate jedes Kanals — ohne den Katalog von Hand neu zu bauen.", + "home.benefits.cost.desc": "Automatisieren Sie Mapping, Attributfüllung und Listing-Texte, damit das Team merchandising statt Tabellenpflege macht.", + "home.benefits.scale.title": "Bereit für jeden Verkaufskanal", + "home.benefits.scale.desc": "Formen Sie Export-Feeds und WooCommerce-Sync für die Formate jedes Kanals — ohne den Katalog von Hand neu zu bauen.", "home.cta.titleLead": "Produkte schneller auf den Markt ", "home.cta.titleHighlight": "bringen", - "home.cta.description": "Hören Sie auf, Produktdaten aus jeder Lieferantendatei neu aufzubauen. Einmal mappen, mit Ihren Regeln anreichern und verkaufsbereite Listings veröffentlichen.", - "home.cta.f1": "Persönliche Demo", + "home.cta.description": "Hören Sie auf, Produktdaten aus jeder Lieferantendatei neu aufzubauen. Einmal mappen, mit Ihren Regeln anreichern und verkaufsbereite Listings veröffentlichen.", + "home.cta.f1": "Persönliche Demo", "home.cta.f2": "Expertenberatung", - "home.cta.f3": "Klare nächste Schritte", + "home.cta.f3": "Klare nächste Schritte", "home.cta.apply": "Zugang beantragen", "home.cta.imageAlt": "Descrybe-Produktseiten", "home.product.eyebrow": "Was Descrybe macht", - "home.product.title": "Lieferanten-Feeds rein. Fertige Listings raus — Export, WooCommerce oder API.", - "home.product.description": "Descrybe hilft E-Commerce-Teams, CSV- und XML-Lieferantenfeeds in saubere Produktkataloge zu verwandeln. Felder Ihren Kategorien zuordnen, Attribute und Texte anreichern, dann über Export-Feeds, WooCommerce-Sync oder die öffentliche API ausliefern.", + "home.product.title": "Lieferanten-Feeds rein. Fertige Listings raus — Export, WooCommerce oder API.", + "home.product.description": "Descrybe hilft E-Commerce-Teams, CSV- und XML-Lieferantenfeeds in saubere Produktkataloge zu verwandeln. Felder Ihren Kategorien zuordnen, Attribute und Texte anreichern, dann über Export-Feeds, WooCommerce-Sync oder die öffentliche API ausliefern.", "home.product.pipelineAria": "Produkt-Pipeline", "home.product.p1.label": "Feeds rein", "home.product.p1.detail": "CSV / XML von Lieferanten-URLs", @@ -5201,24 +5202,24 @@ export const de: MessageDict = { "home.product.p3.label": "Anreichern", "home.product.p3.detail": "Kategorien, Attribute, Titel", "home.product.p4.label": "Ausliefern", - "home.product.p4.detail": "Export · Woo · API", - "pricing.section.badge": "SKU-Kapazität + KI-Credits", - "pricing.section.title": "Kostenlos starten. Skalieren, wenn der Katalog wächst.", - "pricing.section.lead": "Free umfasst Feed-Mapping, grundlegende Produktbereinigung und EU-Energielabels (EPREL) für bis zu 100 SKUs (ohne KI-Credits). Bezahlte Pläne bieten KI-Titel und -Beschreibungen, mehr Kapazität und Exportoptionen — Starter, Growth, Business oder Sales für Enterprise.", + "home.product.p4.detail": "Export · Woo · API", + "pricing.section.badge": "SKU-Kapazität + KI-Credits", + "pricing.section.title": "Kostenlos starten. Skalieren, wenn der Katalog wächst.", + "pricing.section.lead": "Free umfasst Feed-Mapping, grundlegende Produktbereinigung und EU-Energielabels (EPREL) für bis zu 100 SKUs (ohne KI-Credits). Bezahlte Pläne bieten KI-Titel und -Beschreibungen, mehr Kapazität und Exportoptionen — Starter, Growth, Business oder Sales für Enterprise.", "pricing.section.billingPeriod": "Abrechnungszeitraum", "pricing.section.monthly": "Monatlich", - "pricing.section.yearly": "Jährlich", + "pricing.section.yearly": "Jährlich", "pricing.section.savePercent": "20 % sparen", - "pricing.section.publicBefore": "Öffentliche Pläne: Free, Starter, Growth, Business und Enterprise. Free-Konto erstellen, dann upgraden unter", + "pricing.section.publicBefore": "Öffentliche Pläne: Free, Starter, Growth, Business und Enterprise. Free-Konto erstellen, dann upgraden unter", "pricing.section.publicOr": "oder", - "pricing.section.publicAfter": "über Stripe Checkout. Enterprise bleibt sales-geführt.", - "pricing.section.plansLink": "Pläne", + "pricing.section.publicAfter": "über Stripe Checkout. Enterprise bleibt sales-geführt.", + "pricing.section.plansLink": "Pläne", "pricing.section.billingLink": "Abrechnung", - "pricing.section.capabilitiesTitle": "Wofür jeder Plan gebaut ist", + "pricing.section.capabilitiesTitle": "Wofür jeder Plan gebaut ist", "pricing.section.capabilitiesLead": "Feeds importieren, Katalog anreichern, dann exportieren oder mit WooCommerce synchronisieren", - "pricing.section.faqTitle": "Häufig gestellte Fragen", + "pricing.section.faqTitle": "Häufig gestellte Fragen", "pricing.section.readyTitle": "Bereit, Ihren ersten Feed zuzuordnen?", - "pricing.section.readyLead": "Free-Konto erstellen — keine Karte nötig. Schon eines? App öffnen oder Pläne vergleichen.", + "pricing.section.readyLead": "Free-Konto erstellen — keine Karte nötig. Schon eines? App öffnen oder Pläne vergleichen.", "pricing.section.contactSales": "Vertrieb kontaktieren", "pricing.cap.feeds": "Feeds zum Katalog", "pricing.cap.feeds.f1": "CSV-/XML-/URL-Lieferantenfeeds", @@ -5227,12 +5228,12 @@ export const de: MessageDict = { "pricing.cap.feeds.f4": "Geplante Sync", "pricing.cap.feeds.f5": "Kategoriebezogene Transforms", "pricing.cap.processing": "Verarbeitung & KI", - "pricing.cap.processing.f1": "Datenbereinigung & Attributfüllung (alle Pläne)", + "pricing.cap.processing.f1": "Datenbereinigung & Attributfüllung (alle Pläne)", "pricing.cap.processing.f2": "KI-Titel & -Beschreibungen (bezahlt)", - "pricing.cap.processing.f3": "EU-Energielabels / EPREL (alle Pläne)", + "pricing.cap.processing.f3": "EU-Energielabels / EPREL (alle Pläne)", "pricing.cap.processing.f4": "Formeln, Markenstimme, Variablen", - "pricing.cap.processing.f5": "Verwaltete Credits oder eigener KI-Schlüssel", - "pricing.cap.export": "Export & Kanäle", + "pricing.cap.processing.f5": "Verwaltete Credits oder eigener KI-Schlüssel", + "pricing.cap.export": "Export & Kanäle", "pricing.cap.export.f1": "XML-/CSV-Export-Feeds", "pricing.cap.export.f2": "WooCommerce-/Shopify-Sync", "pricing.cap.export.f3": "Volle API", @@ -5244,19 +5245,19 @@ export const de: MessageDict = { "pricing.cap.limits.f3": "Teamrollen & Einladungen", "pricing.cap.limits.f4": "Enterprise-SLA-Optionen", "pricing.faq.credits.q": "Was sind KI-Credits?", - "pricing.faq.credits.a": "KI-Credits zahlen Schritte wie Titel- und Beschreibungsgenerierung. Free enthält 0 KI-Credits — Feeds mappen und Daten bereinigen geht trotzdem. Bezahlte Monatspakete: Starter 150, Plus 500, Growth 1.200, Business 4.000, Scale 8.000. Enterprise enthält ein großes verwaltetes Paket (und eigenen Schlüssel). Ab Growth optional eigener Schlüssel statt verwalteter Credits.", + "pricing.faq.credits.a": "KI-Credits zahlen Schritte wie Titel- und Beschreibungsgenerierung. Free enthält 0 KI-Credits — Feeds mappen und Daten bereinigen geht trotzdem. Bezahlte Monatspakete: Starter 150, Plus 500, Growth 1.200, Business 4.000, Scale 8.000. Enterprise enthält ein großes verwaltetes Paket (und eigenen Schlüssel). Ab Growth optional eigener Schlüssel statt verwalteter Credits.", "pricing.faq.packs.q": "Can I buy extra AI credits?", "pricing.faq.packs.a": "Yes. One-time packs: Starter $19 / 500 credits, Growth $59 / 2,000, Catalog $199 / 10,000, Scale $599 / 40,000. Buy from Billing after you have a paid plan (or Free with leftover trial credits). Packs do not change your SKU or feed limits.", "pricing.faq.limits.q": "Was passiert bei Produkt- oder Credit-Limit?", - "pricing.faq.limits.a": "Wir warnen rechtzeitig. Am Produktlimit oder ohne KI-Credits pausieren Jobs, die Kapazität brauchen, bis Platz frei wird, der nächste Zyklus kommt oder Sie upgraden.", + "pricing.faq.limits.a": "Wir warnen rechtzeitig. Am Produktlimit oder ohne KI-Credits pausieren Jobs, die Kapazität brauchen, bis Platz frei wird, der nächste Zyklus kommt oder Sie upgraden.", "pricing.faq.change.q": "Kann ich up- oder downgraden?", - "pricing.faq.change.a": "Ja. Starten Sie auf Free, dann Upgrade auf Starter, Plus, Growth, Business oder Scale unter Pläne oder Abrechnung (Stripe Checkout). Enterprise ist immer sales-geführt.", - "pricing.faq.free.q": "Was enthält Free?", - "pricing.faq.free.a": "Für immer Free: 50 Produkte, ein Feed, Datenbereinigung und Attributfüllung, EU-Energielabels (EPREL — öffentliche Daten, keine Credits) plus ein manueller Export — mit 0 KI-Credits. Keine Kreditkarte. Upgrade für KI-Titel/-Beschreibungen oder mehr Kapazität.", + "pricing.faq.change.a": "Ja. Starten Sie auf Free, dann Upgrade auf Starter, Plus, Growth, Business oder Scale unter Pläne oder Abrechnung (Stripe Checkout). Enterprise ist immer sales-geführt.", + "pricing.faq.free.q": "Was enthält Free?", + "pricing.faq.free.a": "Für immer Free: 50 Produkte, ein Feed, Datenbereinigung und Attributfüllung, EU-Energielabels (EPREL — öffentliche Daten, keine Credits) plus ein manueller Export — mit 0 KI-Credits. Keine Kreditkarte. Upgrade für KI-Titel/-Beschreibungen oder mehr Kapazität.", "pricing.faq.why.q": "Warum nicht pro Produkt wie reine Content-Tools?", - "pricing.faq.why.a": "Descrybe deckt den Weg vom Lieferantenfeed über den Katalog bis WooCommerce oder Export ab — nicht nur KI-Copy. Sie zahlen Plattformkapazität (Produkte und Feeds); KI ist eine Nutzungsschicht darüber.", + "pricing.faq.why.a": "Descrybe deckt den Weg vom Lieferantenfeed über den Katalog bis WooCommerce oder Export ab — nicht nur KI-Copy. Sie zahlen Plattformkapazität (Produkte und Feeds); KI ist eine Nutzungsschicht darüber.", "pricing.faq.annual.q": "Wie funktioniert die Jahresabrechnung?", - "pricing.faq.annual.a": "Jährliche Abrechnung ist etwa 20 % unter dem Monatspreis. Kostenlos starten, dann jährlich im Checkout wählen (oder Vertrieb kontaktieren).", + "pricing.faq.annual.a": "Jährliche Abrechnung ist etwa 20 % unter dem Monatspreis. Kostenlos starten, dann jährlich im Checkout wählen (oder Vertrieb kontaktieren).", "pricing.calc.badge": "Plan calculator", "pricing.calc.title": "Find the right plan", "pricing.calc.lead": "Enter feeds, catalog size, and how many products you want to enhance with AI (count each language pass).", @@ -5265,12 +5266,12 @@ export const de: MessageDict = { "pricing.calc.skus": "Catalog products (SKUs)", "pricing.calc.skusHint": "Total products you will store and process", "pricing.calc.aiVolume": "AI process volume", - "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", + "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", "pricing.calc.recommendedLabel": "Recommended", "pricing.calc.budgetLabel": "Budget option", "pricing.calc.coversCredits": "Needs about {count} AI credits / month", "pricing.calc.aiIncluded": "Included monthly credits cover this AI volume", - "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", + "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", "pricing.calc.orYearly": "or ~{amount}/mo yearly", "pricing.calc.budgetNote": "Lower list price with yearly discount and/or credit packs when that still fits.", "pricing.calc.noBudget": "The recommended plan is already the leanest fit for these inputs.", @@ -5280,7 +5281,7 @@ export const de: MessageDict = { "pricing.calc.disclaimer": "Estimates use list prices and ~2 credits per AI product enhance. Checkout prices come from Stripe. A1 and other client deals stay admin-only.", "pricing.card.mostPopular": "Am beliebtesten", "pricing.card.custom": "Individuell", - "pricing.card.forever": "für immer", + "pricing.card.forever": "für immer", "pricing.card.perMonth": "Monat", "pricing.card.perYear": "Jahr", "pricing.card.savePerMonth": "${amount}/Monat sparen", @@ -5295,13 +5296,13 @@ export const de: MessageDict = { "pricing.card.showMoreFeature": "{count} weiteres Feature anzeigen", "pricing.card.showMoreFeatures": "{count} weitere Features anzeigen", "pricing.card.upgradeTo": "Upgrade auf {name}", - "pricing.plan.free.description": "Beispiel-Feed mappen und Produktdaten bereinigen — ohne Karte", + "pricing.plan.free.description": "Beispiel-Feed mappen und Produktdaten bereinigen — ohne Karte", "pricing.plan.starter.description": "Kleine Kataloge mit KI-Titeln und -Beschreibungen", - "pricing.plan.plus.description": "Mehr Produkte, Feeds und KI für wachsende Kataloge", + "pricing.plan.plus.description": "Mehr Produkte, Feeds und KI für wachsende Kataloge", "pricing.plan.growth.description": "Multi-Lieferanten-Feeds in Shops und Shopping-Exports", "pricing.plan.business.description": "Mid-Market-Kataloge mit BYOK", "pricing.plan.scale.description": "Distributor-Kataloge mit Priority-Support", - "pricing.plan.enterprise.description": "Unbegrenzte Kapazität, SLA und dediziertes Account-Team", + "pricing.plan.enterprise.description": "Unbegrenzte Kapazität, SLA und dediziertes Account-Team", "pricing.feature.credits100": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits100starter": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits400": "400 AI credits / month (~50% catalog cover)", @@ -5329,7 +5330,7 @@ export const de: MessageDict = { "pricing.feature.sixFeedSources": "6 feed sources", "pricing.feature.twelveFeedSources": "12 feed sources", "pricing.feature.twentyFiveFeedSources": "25 feed sources", - "pricing.feature.cleanData": "Daten bereinigen, Specs parsen und Felder füllen", + "pricing.feature.cleanData": "Daten bereinigen, Specs parsen und Felder füllen", "pricing.feature.eprel": "EU-Energielabels (EPREL)", "pricing.feature.zeroCredits": "0 KI-Credits / Monat", "pricing.feature.oneManualExport": "1 manueller Export-Feed", @@ -5340,7 +5341,7 @@ export const de: MessageDict = { "pricing.feature.aiTitles": "KI-Titel & -Beschreibungen", "pricing.feature.liveStoreSync": "Live-Shop-Sync", "pricing.feature.apiAccess": "API-Zugang", - "pricing.feature.byok": "Eigener KI-Schlüssel", + "pricing.feature.byok": "Eigener KI-Schlüssel", "pricing.feature.upTo500Skus": "Bis zu 500 SKUs", "pricing.feature.upTo1000Skus": "Up to 1,000 SKUs", "pricing.feature.fiveFeedSources": "5 feed sources", @@ -5400,7 +5401,7 @@ export const de: MessageDict = { "pricing.feature.credits50000half": "50,000 AI credits / month (~50% catalog cover)", "pricing.feature.unlimitedExports": "Unbegrenzte Export-Feeds", "pricing.feature.fullApiWebhooks": "Volle API", - "pricing.feature.byokIncluded": "Eigener KI-Schlüssel inklusive", + "pricing.feature.byokIncluded": "Eigener KI-Schlüssel inklusive", "pricing.feature.priorityEmail": "Priorisierter E-Mail-Support", "pricing.feature.upTo100kSkus": "Bis zu 100.000 SKUs", "pricing.feature.upTo150kSkus": "Up to 150,000 SKUs", @@ -5412,12 +5413,12 @@ export const de: MessageDict = { "pricing.feature.prioritySlack": "Priority-Support + Slack", "pricing.feature.unlimitedSkus": "Unbegrenzte SKUs", "pricing.feature.unlimitedFeeds": "Unbegrenzte Feed-Quellen", - "pricing.feature.unlimitedAiOwnKey": "Unbegrenzte KI-Credits / eigener Schlüssel", + "pricing.feature.unlimitedAiOwnKey": "Unbegrenzte KI-Credits / eigener Schlüssel", "pricing.feature.ssoWebhooksAm": "SSO, dedizierter Account Manager", "pricing.feature.customIntegrations": "Individuelle Integrationen", "pricing.feature.slaPriority": "SLA & Priority-Support", "pricing.pack.tiny.name": "Nano pack", - "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", + "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", "pricing.pack.small.name": "Starter pack", "pricing.pack.small.desc": "Extra AI for fixes and tests (~250 products)", "pricing.pack.medium.name": "Growth pack", @@ -5427,48 +5428,48 @@ export const de: MessageDict = { "pricing.pack.xl.name": "Scale pack", "pricing.pack.xl.desc": "Heavy usage / agency bursts (~20,000 products)", "pricing.pack.xxl.name": "Business pack", - "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", + "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", "pricing.pack.mega.name": "Scale pack", - "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", - "pricing.section.faqDescription": "Klare Antworten zu Plänen, Credits und dem, was Free enthält.", + "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", + "pricing.section.faqDescription": "Klare Antworten zu Plänen, Credits und dem, was Free enthält.", "billing.buyCreditPacks": "Buy AI credit packs", - "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", + "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", "billing.packCredits": "{credits} Credits", "billing.packApproxProducts": "~{count} AI products", "billing.buyPack": "Buy", - "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", + "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", "billing.packCheckoutFailed": "Could not start credit pack checkout.", - "empty.default.noItems": "Keine Einträge gefunden.", + "empty.default.noItems": "Keine Einträge gefunden.", "settings.tabLockedHint": "Not on your plan", "stores.connectorLocked": "Not on your plan", "stores.connectorUpgrade": "Upgrade to unlock", "plan.upgrade.title": "Diese Funktion ist nicht in Ihrem Plan", "plan.upgrade.message": "Upgraden Sie, um diesen Teil von Descrybe freizuschalten.", - "plan.upgrade.defaultMessage": "Ihr aktueller Plan enthält diesen Teil von Descrybe nicht. Upgraden Sie, um ihn freizuschalten, oder fragen Sie einen Unternehmens-Admin, wenn Sie die Abrechnung nicht ändern können.", - "plan.upgrade.sectionOff.title": "Diese Funktion ist vorübergehend nicht verfügbar", - "plan.upgrade.sectionOff.message": "Dieser Teil von Descrybe ist auf der Plattform derzeit deaktiviert. Das ist kein Upgrade-Problem — versuchen Sie es später erneut oder kontaktieren Sie den Support.", - "plan.upgrade.sectionOff.cta": "Zurück zum Dashboard", - "plan.upgrade.stores.message": "WooCommerce- und Shopify-Konnektoren brauchen einen Plan mit Stores. Upgraden Sie, um diese Shops zu verbinden — oder arbeiten Sie weiter mit Feeds und der API in Ihrem aktuellen Plan.", + "plan.upgrade.defaultMessage": "Ihr aktueller Plan enthält diesen Teil von Descrybe nicht. Upgraden Sie, um ihn freizuschalten, oder fragen Sie einen Unternehmens-Admin, wenn Sie die Abrechnung nicht ändern können.", + "plan.upgrade.sectionOff.title": "Diese Funktion ist vorübergehend nicht verfügbar", + "plan.upgrade.sectionOff.message": "Dieser Teil von Descrybe ist auf der Plattform derzeit deaktiviert. Das ist kein Upgrade-Problem — versuchen Sie es später erneut oder kontaktieren Sie den Support.", + "plan.upgrade.sectionOff.cta": "Zurück zum Dashboard", + "plan.upgrade.stores.message": "WooCommerce- und Shopify-Konnektoren brauchen einen Plan mit Stores. Upgraden Sie, um diese Shops zu verbinden — oder arbeiten Sie weiter mit Feeds und der API in Ihrem aktuellen Plan.", "plan.upgrade.stillWorks.title": "Was in Ihrem Plan weiterhin funktioniert", "plan.upgrade.stillWorks.feeds.label": "Eingabe-Feeds", - "plan.upgrade.stillWorks.feeds.description": "CSV- oder XML-URLs und Datei-Uploads hinzufügen, um Kataloge ohne Shop-Konnektoren zu synchronisieren.", + "plan.upgrade.stillWorks.feeds.description": "CSV- oder XML-URLs und Datei-Uploads hinzufügen, um Kataloge ohne Shop-Konnektoren zu synchronisieren.", "plan.upgrade.stillWorks.export.label": "Export-Feeds", - "plan.upgrade.stillWorks.export.description": "Ausgehende Feeds für Shopping-Kanäle und Partner erzeugen.", + "plan.upgrade.stillWorks.export.description": "Ausgehende Feeds für Shopping-Kanäle und Partner erzeugen.", "plan.upgrade.stillWorks.processing.label": "Hintergrundaufgaben", - "plan.upgrade.stillWorks.processing.description": "KI- und Katalog-Jobs unter Verarbeitung überwachen — in Ihrem Plan auch ohne Shop-Konnektoren verfügbar.", - "plan.upgrade.stillWorks.api.label": "API-Schlüssel", - "plan.upgrade.stillWorks.api.description": "Erstellen Sie unter Einstellungen einen Schlüssel für /api/v1 — das Geheimnis wird nur einmal angezeigt.", + "plan.upgrade.stillWorks.processing.description": "KI- und Katalog-Jobs unter Verarbeitung überwachen — in Ihrem Plan auch ohne Shop-Konnektoren verfügbar.", + "plan.upgrade.stillWorks.api.label": "API-Schlüssel", + "plan.upgrade.stillWorks.api.description": "Erstellen Sie unter Einstellungen einen Schlüssel für /api/v1 — das Geheimnis wird nur einmal angezeigt.", "plan.upgrade.stillWorks.docs.label": "API-Dokumentation", - "plan.upgrade.stillWorks.docs.description": "Lesen Sie die API-Übersicht und integrieren Sie ohne WooCommerce oder Shopify.", - "plan.upgrade.feature.settings.api_keys": "API-Schlüssel brauchen einen bezahlten Plan", + "plan.upgrade.stillWorks.docs.description": "Lesen Sie die API-Übersicht und integrieren Sie ohne WooCommerce oder Shopify.", + "plan.upgrade.feature.settings.api_keys": "API-Schlüssel brauchen einen bezahlten Plan", "plan.upgrade.feature.catalog.products.process_ai_titles": "KI-Titel sind eine bezahlte Funktion", "plan.upgrade.feature.catalog.products.process_ai_descriptions": "KI-Beschreibungen sind eine bezahlte Funktion", "plan.upgrade.feature.marketing.campaigns.generate_ai": "Kampagnen-KI braucht einen bezahlten Plan", "plan.upgrade.feature.marketing.campaigns.send": "Live-Kampagnenversand braucht einen bezahlten Plan", "plan.upgrade.feature.marketing.brand_ai_apply": "Markenstimme in der KI braucht einen bezahlten Plan", "plan.upgrade.feature.marketing.seo.ai_rewrite": "SEO-KI-Umschreiben braucht einen bezahlten Plan", - "plan.upgrade.feature.integrations.ai.byok": "Eigener KI-Schlüssel ab Growth", - "plan.upgrade.feature.capability.byok": "Eigener KI-Schlüssel ab Growth", + "plan.upgrade.feature.integrations.ai.byok": "Eigener KI-Schlüssel ab Growth", + "plan.upgrade.feature.capability.byok": "Eigener KI-Schlüssel ab Growth", "plan.upgrade.feature.marketing.campaigns": "Kampagnen sind nicht in Ihrem Plan", "plan.upgrade.feature.marketing.content_calendar": "Content-Kalender ist nicht in Ihrem Plan", "plan.upgrade.feature.marketing.seo": "SEO-Tools sind nicht in Ihrem Plan", @@ -5485,12 +5486,12 @@ export const de: MessageDict = { "plan.upgrade.feature.support.ticket_thread": "Support-Ticket-Threads sind nicht in Ihrem Plan", "plan.upgrade.feature.catalog.structured_descriptions": "Strukturierte Beschreibungen sind nicht in Ihrem Plan", "plan.upgrade.feature.catalog.vector_categories": "Vektor-Kategorien sind nicht in Ihrem Plan", - "plan.checkingAccess": "Plan-Zugriff wird geprüft…", - "upgradeBanner.comparePlans": "Pläne vergleichen", + "plan.checkingAccess": "Plan-Zugriff wird geprüft…", + "upgradeBanner.comparePlans": "Pläne vergleichen", "upgradeBanner.talkToSales": "Vertrieb kontaktieren", - "commandPalette.closeAria": "Suche schließen", + "commandPalette.closeAria": "Suche schließen", "commandPalette.ariaLabel": "Seiten suchen", - "commandPalette.placeholder": "Seiten suchen…", + "commandPalette.placeholder": "Seiten suchen…", "commandPalette.searchAria": "Seiten suchen", "commandPalette.destinationsAria": "Seiten", "commandPalette.noMatches": "Keine passenden Seiten", @@ -5500,40 +5501,40 @@ export const de: MessageDict = { "commandPalette.announceMatchOne": "{count} passende Seite.", "commandPalette.announceMatchMany": "{count} passende Seiten.", "vector.title": "Vektorkategorien-Test", - "vector.description": "Durchsuchen Sie den Vektorkategorie-Index, wenn Pinecone konfiguriert ist. Index erstellen und Initialisieren sind in v2 noch nicht verfügbar.", - "vector.probing": "Vektorkategorien-API wird geprüft…", - "vector.unavailable": "Vektorkategorien sind auf diesem Backend noch nicht verfügbar. Hier gibt es nichts auszuführen, bis /api/vector-categories/* angebunden ist.", + "vector.description": "Durchsuchen Sie den Vektorkategorie-Index, wenn Pinecone konfiguriert ist. Index erstellen und Initialisieren sind in v2 noch nicht verfügbar.", + "vector.probing": "Vektorkategorien-API wird geprüft…", + "vector.unavailable": "Vektorkategorien sind auf diesem Backend noch nicht verfügbar. Hier gibt es nichts auszuführen, bis /api/vector-categories/* angebunden ist.", "vector.browseCategories": "Kategorien durchsuchen", "vector.initHeading": "Vektordatenbank initialisieren", - "vector.initComingSoon": "Index erstellen und Vektor-DB initialisieren sind in v2 noch nicht verfügbar (demnächst). Suche funktioniert weiterhin, wenn Pinecone konfiguriert ist.", + "vector.initComingSoon": "Index erstellen und Vektor-DB initialisieren sind in v2 noch nicht verfügbar (demnächst). Suche funktioniert weiterhin, wenn Pinecone konfiguriert ist.", "vector.createIndex": "Index erstellen", "vector.initDb": "Vektor-DB initialisieren", "vector.searchHeading": "Kategorien suchen", - "vector.searchPlaceholder": "Produktbeschreibung eingeben…", + "vector.searchPlaceholder": "Produktbeschreibung eingeben…", "vector.results": "Ergebnisse:", "vector.categoryLabel": "Kategorie:", "vector.idLabel": "ID:", "vector.scoreLabel": "Score:", - "switcher.switching": "Wechsle…", - "switcher.returnTo": "Zurück zu {email}", + "switcher.switching": "Wechsle…", + "switcher.returnTo": "Zurück zu {email}", "switcher.switchUser": "Benutzer wechseln", - "switcher.loadingUsers": "Benutzer werden geladen…", + "switcher.loadingUsers": "Benutzer werden geladen…", "switcher.empty": "Keine wechselbaren Benutzer gefunden.", "switcher.noCompany": "Kein Unternehmen", "switcher.unknownCompany": "Unbekanntes Unternehmen", - "companySwitcher.select": "Unternehmen auswählen", + "companySwitcher.select": "Unternehmen auswählen", "companySwitcher.switchAria": "Unternehmen wechseln: {label}", "companySwitcher.companies": "Unternehmen", - "companySwitcher.returnTo": "Zurück zu {name}", - "companySwitcher.returnHome": "Zurück zum Heimatunternehmen", + "companySwitcher.returnTo": "Zurück zu {name}", + "companySwitcher.returnHome": "Zurück zum Heimatunternehmen", "storeReconnect.primaryLabel": "Shop erneut verbinden", "storeReconnect.titlePlural": "Shops nach Migration erneut verbinden", "storeReconnect.titleChannel": "{channel} nach Migration erneut verbinden", "storeReconnect.titleSingular": "Shop nach Migration erneut verbinden", - "storeReconnect.messageWithItems": "Shop-API-Zugangsdaten wurden nach der Plattformmigration nicht übernommen (oder sind nicht nutzbar). Das ist keine kaputte Sync — verbinden Sie jeden Shop erneut und testen Sie die Verbindung, bevor Sie eine Sync einreihen.", - "storeReconnect.messageSingle": "{channel}-API-Zugangsdaten wurden nach der Plattformmigration nicht übernommen (oder sind nicht nutzbar). Das ist keine kaputte Sync — fügen Sie frische Zugangsdaten ein, speichern Sie und testen Sie die Verbindung, bevor Sie eine Sync einreihen.", + "storeReconnect.messageWithItems": "Shop-API-Zugangsdaten wurden nach der Plattformmigration nicht übernommen (oder sind nicht nutzbar). Das ist keine kaputte Sync — verbinden Sie jeden Shop erneut und testen Sie die Verbindung, bevor Sie eine Sync einreihen.", + "storeReconnect.messageSingle": "{channel}-API-Zugangsdaten wurden nach der Plattformmigration nicht übernommen (oder sind nicht nutzbar). Das ist keine kaputte Sync — fügen Sie frische Zugangsdaten ein, speichern Sie und testen Sie die Verbindung, bevor Sie eine Sync einreihen.", "storeReconnect.channelFallback": "Shop", - "storeReconnect.askAdmin": "Bitten Sie einen Unternehmens-Admin um die erneute Verbindung — nur Admins können Shop-Zugangsdaten speichern.", + "storeReconnect.askAdmin": "Bitten Sie einen Unternehmens-Admin um die erneute Verbindung — nur Admins können Shop-Zugangsdaten speichern.", "storeReconnect.reconnectItem": "{label} erneut verbinden", "admin.storeReconnect.channel.other": "Other", "admin.storeReconnect.channel.woocommerce": "WooCommerce", @@ -5556,7 +5557,7 @@ export const de: MessageDict = { "admin.storeReconnect.listTitle": "Connected but invalid", "admin.storeReconnect.metric.showing": "Rows shown", "admin.storeReconnect.metric.total": "Gaps total", - "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", + "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", "admin.storeReconnect.loadFailed": "Could not load store reconnect inventory.", "admin.storeReconnect.refresh": "Refresh", "admin.storeReconnect.description": "Companies with a connected store identity but missing or unusable API credentials (cutover credential gaps).", @@ -5566,21 +5567,21 @@ export const de: MessageDict = { "storeReconnect.wizardLabel": "Guided setup", "storeReconnect.reviewsHint": "Bewertungsimport kann erst laufen, wenn Zugangsdaten nach der Migration erneut verbunden sind. Im Reiter Verbindung: Speichern, dann Verbindung testen.", "storeReconnect.ordersHint": "Bestellimport kann erst laufen, wenn Zugangsdaten nach der Migration erneut verbunden sind. Im Reiter Verbindung: Speichern, dann Verbindung testen.", - "productSync.directionTitle": "Produkte: Descrybe → Shop", - "productSync.outbound": "Descrybe → {channel}", - "productSync.outboundBody": "— sendet verarbeitete Descrybe-Produkte an den Shop (erstellt oder aktualisiert passende Remote-Produkte). Importiert den Shop-Katalog nicht nach Descrybe.", + "productSync.directionTitle": "Produkte: Descrybe → Shop", + "productSync.outbound": "Descrybe → {channel}", + "productSync.outboundBody": "— sendet verarbeitete Descrybe-Produkte an den Shop (erstellt oder aktualisiert passende Remote-Produkte). Importiert den Shop-Katalog nicht nach Descrybe.", "productSync.firstSync": "Erste Sync", - "productSync.firstSyncBody": "— nicht gematchte Produkte werden in {channel} erstellt. Spätere Syncs aktualisieren bereits per ID oder Match-Strategie verknüpfte Produkte.", + "productSync.firstSyncBody": "— nicht gematchte Produkte werden in {channel} erstellt. Spätere Syncs aktualisieren bereits per ID oder Match-Strategie verknüpfte Produkte.", "productSync.reSync": "Erneut synchronisieren", - "productSync.reSyncBody": "— gematchte Remote-Produkte können mit Descrybe-Inhalt überschrieben werden ({count} bisher verknüpft).", + "productSync.reSyncBody": "— gematchte Remote-Produkte können mit Descrybe-Inhalt überschrieben werden ({count} bisher verknüpft).", "productSync.queued": "Produktsync in Warteschlange", - "productSync.live.queued": "In Warteschlange — warte auf Worker", - "productSync.live.running": "Sync läuft", - "productSync.live.watching": "Status wird überwacht… Zähler erscheinen nach Abschluss.", - "productSync.live.success": "Sync fertig: {total} gesamt · {created} erstellt · {updated} aktualisiert · {failed} fehlgeschlagen · {skipped} übersprungen", - "productSync.live.partial": "Sync mit Fehlern: {total} gesamt · {created} erstellt · {updated} aktualisiert · {failed} fehlgeschlagen · {skipped} übersprungen", + "productSync.live.queued": "In Warteschlange — warte auf Worker", + "productSync.live.running": "Sync läuft", + "productSync.live.watching": "Status wird überwacht… Zähler erscheinen nach Abschluss.", + "productSync.live.success": "Sync fertig: {total} gesamt · {created} erstellt · {updated} aktualisiert · {failed} fehlgeschlagen · {skipped} übersprungen", + "productSync.live.partial": "Sync mit Fehlern: {total} gesamt · {created} erstellt · {updated} aktualisiert · {failed} fehlgeschlagen · {skipped} übersprungen", "productSync.live.failed": "Sync fehlgeschlagen{detail}.", - "productSync.live.timedOut": "Läuft noch — später aktualisieren für finalen Status und Zähler.", + "productSync.live.timedOut": "Läuft noch — später aktualisieren für finalen Status und Zähler.", "productSync.live.ordersSuccess": "Auftragssync fertig ({status}).", "productSync.live.reviewsSuccess": "Bewertungssync fertig ({status}).", "productSync.retry": "Sync erneut versuchen", @@ -5588,14 +5589,14 @@ export const de: MessageDict = { "productSync.dryRun": "Probelauf", "productSync.lastSyncAt": "Letzte Produktsync: {date}", "productSync.noneYet": "Noch keine Produktsync abgeschlossen.", - "productSync.lastRun": "Letzter Lauf: {total} gesamt · {created} erstellt · {updated} aktualisiert · {failed} fehlgeschlagen · {skipped} übersprungen", + "productSync.lastRun": "Letzter Lauf: {total} gesamt · {created} erstellt · {updated} aktualisiert · {failed} fehlgeschlagen · {skipped} übersprungen", "productSync.needsReconnect": "Produktsync kann erst laufen, wenn Zugangsdaten nach der Migration erneut verbunden sind. Im Reiter Verbindung: Speichern, dann Verbindung testen.", "productSync.scheduleTitle": "Automatischer Produkt-Sync-Zeitplan", - "productSync.scheduleHelp": "Wie bei Feed-Intervallen: Legen Sie fest, wie oft Produkte gepusht werden, oder pausieren Sie den Zeitplan. Manuelle Warteschlange funktioniert weiter. Store-Webhooks werden nicht verwendet — nur Abruf/Warteschlange.", + "productSync.scheduleHelp": "Wie bei Feed-Intervallen: Legen Sie fest, wie oft Produkte gepusht werden, oder pausieren Sie den Zeitplan. Manuelle Warteschlange funktioniert weiter. Store-Webhooks werden nicht verwendet — nur Abruf/Warteschlange.", "productSync.scheduleInterval": "Sync-Intervall (Stunden)", - "productSync.scheduleIntervalHint": "1–168 Stunden. Standard ist 6 Stunden, wenn serverseitig nicht gesetzt.", + "productSync.scheduleIntervalHint": "1–168 Stunden. Standard ist 6 Stunden, wenn serverseitig nicht gesetzt.", "productSync.schedulePause": "Automatischen Sync pausieren", - "productSync.schedulePauseHint": "Stoppt nur geplante Pushes. Manueller Produkt-Sync bleibt möglich.", + "productSync.schedulePauseHint": "Stoppt nur geplante Pushes. Manueller Produkt-Sync bleibt möglich.", "productSync.scheduleSave": "Zeitplan speichern", "productSync.scheduleSaved": "Produkt-Sync-Zeitplan gespeichert.", "productSync.schedulePausedSaved": "Automatischer Produkt-Sync pausiert.", @@ -5605,14 +5606,14 @@ export const de: MessageDict = { "productSync.scheduleNeedsConfig": "Zuerst Shop-Verbindung speichern", "productSync.scheduleAdminOnly": "Firmen-Admin erforderlich", "productSync.delivery.title": "Aktualisierungen per Abruf, nicht per Store-Webhooks", - "productSync.delivery.body": "Descrybe empfängt keine Shopify- oder WooCommerce-Webhooks. Produkt-Pushes laufen, wenn Sie sie in die Warteschlange stellen oder nach dem Automatik-Zeitplan. Diese Seite verfolgt den Fortschritt per Abfrage des Verbindungsstatus — nicht über Live-Push-Ereignisse aus dem Store.", + "productSync.delivery.body": "Descrybe empfängt keine Shopify- oder WooCommerce-Webhooks. Produkt-Pushes laufen, wenn Sie sie in die Warteschlange stellen oder nach dem Automatik-Zeitplan. Diese Seite verfolgt den Fortschritt per Abfrage des Verbindungsstatus — nicht über Live-Push-Ereignisse aus dem Store.", "productSync.delivery.inboundNote": "Bestellungen und Bewertungen nutzen ebenfalls geplante oder manuelle Abrufe, keine Live-Webhooks.", - "productSync.delivery.hubNote": "Store-Connectoren synchronisieren nach Zeitplan oder wenn Sie einen Job starten — nicht über Live-Store-Webhooks.", + "productSync.delivery.hubNote": "Store-Connectoren synchronisieren nach Zeitplan oder wenn Sie einen Job starten — nicht über Live-Store-Webhooks.", "productSync.delivery.badge.manual": "Manuelle Warteschlange", "productSync.delivery.badge.scheduled": "Geplant alle {hours} Std.", "productSync.delivery.badge.scheduledDefault": "Geplant (Server-Standard)", "productSync.delivery.badge.paused": "Zeitplan pausiert", - "productSync.delivery.badge.webhooksOff": "Store-Webhooks: nicht verfügbar", + "productSync.delivery.badge.webhooksOff": "Store-Webhooks: nicht verfügbar", "productSync.scope.title": "What to sync", "productSync.scope.hint": "Optional filters for this push only. Leave blank to sync the latest processed products up to the limit.", "productSync.scope.status": "Status", @@ -5627,20 +5628,20 @@ export const de: MessageDict = { "productSync.scope.products": "Specific products", "productSync.scope.productsHint": "Optional. Search and select processed products to push only those.", "productSync.scope.productsOverrideHint": "Selected products override status, category, and max-products filters for this sync.", - "productSync.scope.productsSearch": "Search products…", - "productSync.scope.productsLoading": "Loading products…", + "productSync.scope.productsSearch": "Search products…", + "productSync.scope.productsLoading": "Loading products…", "productSync.scope.productsEmpty": "No processed products found.", "productSync.scope.productsSelected": "{count} selected", "productSync.scope.productsSelectedList": "Selected products", "productSync.scope.productsClear": "Clear selection", "productSync.scope.productsMax": "Maximum {max} products", - "store.syncingLive": "Synchronisiere…", + "store.syncingLive": "Synchronisiere…", "files.recentUploads": "Aktuelle Uploads", "files.colFileName": "Dateiname", "files.colKind": "Art", "files.colUploaded": "Hochgeladen", "files.colRows": "Zeilen", - "files.loading": "Uploads werden geladen…", + "files.loading": "Uploads werden geladen…", "files.empty": "Noch keine Uploads.", "products.filters.sortProducts": "Produkte sortieren", "products.table.options": "Optionen", diff --git a/apps/web/src/lib/i18n/messages/en.ts b/apps/web/src/lib/i18n/messages/en.ts index 6930bc7..7a59aca 100644 --- a/apps/web/src/lib/i18n/messages/en.ts +++ b/apps/web/src/lib/i18n/messages/en.ts @@ -842,9 +842,9 @@ export const en: MessageDict = { "admin.users.fixA1": "Fix A1 catalog", "admin.users.fixA1Aria": "Repair AI prompts, categories, and enhance hashes for {name}", "admin.users.fixA1Title": "Fix company catalog", - "admin.users.fixA1Desc": "In-place repair: category attribute links, category enhance prompts (with attrs), weak enhance hashes, optional category backfill, attribute sanitize. No mass reprocess.", + "admin.users.fixA1Desc": "In-place repair: category attribute links, category enhance prompts, weak enhance hashes, bidirectional category backfill (mapped↔processed when data exists), attribute sanitize. No mass reprocess. Does not invent categories for unmapped SKUs.", "admin.users.fixA1Company": "Company: {name}", - "admin.users.fixA1Warning": "Prefer Platform Demo; A1 may be targeted in place with confirm. Never clears the catalog or uses A1 as a clone destination.", + "admin.users.fixA1Warning": "Repairs existing category data only. Products UI uses mapped_data.category — Fix cannot invent missing feed categories. For full A1 coverage run seed-a1 -mode backfill-categories with the MySQL dump, then clone A1 → sandbox.", "admin.users.fixA1Cancel": "Cancel", "admin.users.fixA1Confirm": "Fix catalog", "admin.users.noUsers": "No users match this filter.", @@ -2333,9 +2333,10 @@ export const en: MessageDict = { "flash.admin.staffRoleUpdated": "Staff role updated for {email}.", "flash.admin.staffRoleUnavailable": "Staff role updates are not available on this server yet.", "flash.admin.planAssigned": "Plan assigned to {name}.", - "flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} categories. Open Products and process catalog GTINs (EAN-only API calls need a matching feed product).", - "flash.admin.fixA1Success": "Catalog repair finished for {name}: {prompts} category prompts updated, {hashes} hashes cleared, {categories} categories backfilled.", + "flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} products with mapped category. Open Products — uncategorized SKUs need dump backfill or categorize, not another Fix.", + "flash.admin.fixA1Success": "Catalog repair finished for {name}: {prompts} prompts, {hashes} hashes, {categories} processed←mapped, {mapped_backfilled} mapped←processed. Coverage: {mapped_with}/{mapped_total} raw products have mapped categories ({taxonomy} taxonomy rows).", "flash.admin.fixA1Error": "Catalog repair failed for {name}.", + "flash.admin.cloneDestMissing": "No sandbox destination. Switch active company to Platform Demo (or your staff home), then clone again. Clone refuses to overwrite A1.", "flash.admin.planAssignedShort": "Plan assigned.", "flash.admin.creditsUpdated": "Credits updated.", "flash.admin.cyclesProcessed": "Billing cycles processed: {count}", diff --git a/apps/web/src/lib/i18n/messages/es.ts b/apps/web/src/lib/i18n/messages/es.ts index 5919631..931e17d 100644 --- a/apps/web/src/lib/i18n/messages/es.ts +++ b/apps/web/src/lib/i18n/messages/es.ts @@ -1,6 +1,6 @@ -import type { MessageDict } from "./types"; +import type { MessageDict } from "./types"; -/** Spanish (es) UI pack — keys must stay in sync with en.ts. */ +/** Spanish (es) UI pack — keys must stay in sync with en.ts. */ export const es: MessageDict = { "app.name": "Descrybe", "app.home": "Inicio de Descrybe", @@ -13,30 +13,30 @@ export const es: MessageDict = { "common.viewAll": "Ver todo", "common.close": "Cerrar", "common.askAdmin": "Pregunta a un administrador de la empresa", - "common.you": "Tú", + "common.you": "Tú", "common.active": "Activo", "common.pending": "Pendiente", - "common.email": "Correo electrónico", - "common.password": "Contraseña", + "common.email": "Correo electrónico", + "common.password": "Contraseña", "common.name": "Tu nombre", "common.viewPricing": "Ver precios", - "common.backToSignIn": "Volver a iniciar sesión", - "common.signingOut": "Cerrando sesión…", - "common.signOutAndContinue": "Cerrar sesión y continuar", + "common.backToSignIn": "Volver a iniciar sesión", + "common.signingOut": "Cerrando sesión…", + "common.signOutAndContinue": "Cerrar sesión y continuar", "common.staySignedIn": "Seguir conectado", "a11y.skipToContent": "Saltar al contenido", "theme.switchToDark": "Cambiar a tema oscuro", "theme.switchToLight": "Cambiar a tema claro", - "header.signOut": "Cerrar sesión", - "header.signingOut": "Cerrando sesión…", - "status.emDash": "—", + "header.signOut": "Cerrar sesión", + "header.signingOut": "Cerrando sesión…", + "status.emDash": "—", "status.pending": "Pendiente", "status.processing": "Procesando", "status.completed": "Completado", "status.failed": "Fallido", "status.cancelled": "Cancelado", "nav.section.overview": "Resumen", - "nav.section.catalog": "Catálogo", + "nav.section.catalog": "Catálogo", "nav.section.feeds": "Feeds", "nav.section.stores": "Tiendas", "nav.section.processing": "Procesando", @@ -46,209 +46,209 @@ export const es: MessageDict = { "nav.section.platform": "Plataforma", "nav.dashboard": "Panel", "nav.products": "Productos", - "nav.categories": "Categorías", + "nav.categories": "Categorías", "nav.attributes": "Atributos", "nav.fields": "Campos", "nav.feeds": "Feeds", "nav.exports": "Exportaciones", "nav.stores": "Tiendas", "nav.jobs": "Trabajos", - "nav.campaigns": "Campañas", + "nav.campaigns": "Campañas", "nav.calendar": "Calendario", "nav.seo": "SEO", "nav.brand": "Marca", - "nav.reviews": "Reseñas", + "nav.reviews": "Reseñas", "nav.ai": "IA", - "nav.email": "Correo electrónico", - "nav.billing": "Facturación", - "nav.settings": "Configuración", + "nav.email": "Correo electrónico", + "nav.billing": "Facturación", + "nav.settings": "Configuración", "nav.support": "Soporte", "nav.admin": "Admin", - "nav.main": "Navegación principal", + "nav.main": "Navegación principal", "nav.sidebar": "Barra lateral de la app", - "nav.close": "Cerrar navegación", - "nav.closeMenu": "Cerrar menú", - "nav.open": "Abrir navegación", - "nav.commandPalette": "Buscar páginas", + "nav.close": "Cerrar navegación", + "nav.closeMenu": "Cerrar menú", + "nav.open": "Abrir navegación", + "nav.commandPalette": "Buscar páginas", "nav.commandPaletteLabel": "Buscar", - "auth.login.title": "Iniciar sesión", - "auth.login.description": "Usa tu correo y contraseña de Descrybe.", - "auth.login.submit": "Iniciar sesión", - "auth.login.submitting": "Iniciando sesión…", - "auth.login.failed": "Error al iniciar sesión", - "auth.login.passwordNotSet": "Esta cuenta aún necesita una contraseña. Abre el enlace de invitación o pide a un administrador que emita uno nuevo.", - "auth.login.setPasswordFirstTitle": "Establece la contraseña primero:", - "auth.login.setPasswordFirstBody": "usa el enlace de invitación de tu correo. Si el enlace fue a una dirección antigua (cambio de correo), pide a un administrador de la empresa que emita una nueva invitación para establecer contraseña a {email}.", + "auth.login.title": "Iniciar sesión", + "auth.login.description": "Usa tu correo y contraseña de Descrybe.", + "auth.login.submit": "Iniciar sesión", + "auth.login.submitting": "Iniciando sesión…", + "auth.login.failed": "Error al iniciar sesión", + "auth.login.passwordNotSet": "Esta cuenta aún necesita una contraseña. Abre el enlace de invitación o pide a un administrador que emita uno nuevo.", + "auth.login.setPasswordFirstTitle": "Establece la contraseña primero:", + "auth.login.setPasswordFirstBody": "usa el enlace de invitación de tu correo. Si el enlace fue a una dirección antigua (cambio de correo), pide a un administrador de la empresa que emita una nueva invitación para establecer contraseña a {email}.", "auth.login.yourEmail": "tu correo", "auth.login.platformAdminsReissue": "Los administradores de plataforma pueden reemitir desde", - "auth.login.adminUsersLink": "Admin → Usuarios", - "auth.login.haveToken": "¿Tienes un token? Abrir aceptar invitación", - "auth.login.noAccount": "¿Sin cuenta?", + "auth.login.adminUsersLink": "Admin → Usuarios", + "auth.login.haveToken": "¿Tienes un token? Abrir aceptar invitación", + "auth.login.noAccount": "¿Sin cuenta?", "auth.login.createCompany": "Crear empresa", - "auth.login.haveInvite": "¿Tienes una invitación o un enlace para establecer contraseña?", - "auth.login.acceptInvite": "Aceptar invitación", - "auth.login.forgotPassword": "¿Olvidaste la contraseña?", - "auth.login.forgotPasswordHelp": "Introduce tu correo en la página de restablecimiento. Si nunca configuraste una contraseña, usa el enlace de invitación / establecer contraseña.", - "auth.forgot.title": "Olvidé la contraseña", + "auth.login.haveInvite": "¿Tienes una invitación o un enlace para establecer contraseña?", + "auth.login.acceptInvite": "Aceptar invitación", + "auth.login.forgotPassword": "¿Olvidaste la contraseña?", + "auth.login.forgotPasswordHelp": "Introduce tu correo en la página de restablecimiento. Si nunca configuraste una contraseña, usa el enlace de invitación / establecer contraseña.", + "auth.forgot.title": "Olvidé la contraseña", "auth.forgot.description": "Introduce el correo de tu cuenta. Si coincide con una cuenta activa, enviaremos un enlace de restablecimiento.", "auth.forgot.submit": "Enviar enlace", - "auth.forgot.submitting": "Enviando…", + "auth.forgot.submitting": "Enviando…", "auth.forgot.failed": "No se pudo solicitar el restablecimiento", "auth.forgot.sentTitle": "Revisa tu correo", - "auth.forgot.sentBody": "Si existe una cuenta con esa dirección, el enlace de restablecimiento está en camino. Caduca en una hora.", - "auth.forgot.backToSignIn": "Volver a iniciar sesión", - "auth.reset.title": "Restablecer contraseña", - "auth.reset.description": "Elige una nueva contraseña para tu cuenta de Descrybe (al menos 8 caracteres).", - "auth.reset.submit": "Guardar nueva contraseña", - "auth.reset.submitting": "Guardando…", - "auth.reset.failed": "No se pudo restablecer la contraseña", - "auth.reset.doneTitle": "Contraseña actualizada", - "auth.reset.doneDescription": "Inicia sesión con tu correo y la nueva contraseña.", - "auth.reset.goToSignIn": "Ir a iniciar sesión", - "auth.reset.passwordConfirm": "Confirmar contraseña", - "auth.reset.passwordMismatch": "Las contraseñas no coinciden", + "auth.forgot.sentBody": "Si existe una cuenta con esa dirección, el enlace de restablecimiento está en camino. Caduca en una hora.", + "auth.forgot.backToSignIn": "Volver a iniciar sesión", + "auth.reset.title": "Restablecer contraseña", + "auth.reset.description": "Elige una nueva contraseña para tu cuenta de Descrybe (al menos 8 caracteres).", + "auth.reset.submit": "Guardar nueva contraseña", + "auth.reset.submitting": "Guardando…", + "auth.reset.failed": "No se pudo restablecer la contraseña", + "auth.reset.doneTitle": "Contraseña actualizada", + "auth.reset.doneDescription": "Inicia sesión con tu correo y la nueva contraseña.", + "auth.reset.goToSignIn": "Ir a iniciar sesión", + "auth.reset.passwordConfirm": "Confirmar contraseña", + "auth.reset.passwordMismatch": "Las contraseñas no coinciden", "auth.reset.missingTitle": "Falta el enlace de restablecimiento", - "auth.reset.missingDescription": "Abre el enlace de tu correo para elegir una nueva contraseña.", + "auth.reset.missingDescription": "Abre el enlace de tu correo para elegir una nueva contraseña.", "auth.reset.requestNewLink": "Solicitar un nuevo enlace de restablecimiento", - "auth.reset.tokenMissing": "No se proporcionó un enlace de restablecimiento. Usa el enlace de tu correo o solicita uno nuevo.", - "auth.reset.tokenInvalid": "Este enlace de restablecimiento no es válido o ha caducado. Solicita uno nuevo en la página de olvidé la contraseña.", - "auth.reset.linkRecognized": "Enlace de restablecimiento reconocido. Introduce una nueva contraseña abajo — el secreto no se muestra en esta página.", + "auth.reset.tokenMissing": "No se proporcionó un enlace de restablecimiento. Usa el enlace de tu correo o solicita uno nuevo.", + "auth.reset.tokenInvalid": "Este enlace de restablecimiento no es válido o ha caducado. Solicita uno nuevo en la página de olvidé la contraseña.", + "auth.reset.linkRecognized": "Enlace de restablecimiento reconocido. Introduce una nueva contraseña abajo — el secreto no se muestra en esta página.", "auth.reset.tokenLabel": "Token de restablecimiento", "auth.reset.passwordHint": "Al menos 8 caracteres. Sin otras reglas de complejidad.", "auth.register.title": "Crear empresa", "auth.register.description": "Registra una empresa y su usuario administrador.", "auth.register.companyName": "Nombre de la empresa", "auth.register.submit": "Crear cuenta", - "auth.register.submitting": "Creando…", + "auth.register.submitting": "Creando…", "auth.register.failed": "Error en el registro", - "auth.register.haveAccount": "¿Ya tienes una cuenta?", - "auth.register.signIn": "Iniciar sesión", - "auth.invite.title": "Aceptar invitación", - "auth.invite.setPasswordTitle": "Establecer contraseña", - "auth.invite.description": "Establece tu contraseña para unirte a la empresa. Tu administrador asignó Miembro (trabajo diario) o Admin (equipo y facturación).", - "auth.invite.setPasswordDescription": "Elige una contraseña para tu cuenta Descrybe migrada (al menos 8 caracteres).", - "auth.invite.checking": "Comprobando invitación…", - "auth.invite.forEmail": "Invitación para {email}.", - "auth.invite.linkRecognized": "Enlace de invitación reconocido. Introduce una contraseña abajo para continuar — el secreto no se muestra en esta página.", - "auth.invite.resetLinkRecognized": "Enlace de restablecimiento reconocido. Introduce una contraseña abajo para continuar — el secreto no se muestra en esta página.", - "auth.invite.tokenLabel": "Token de invitación", + "auth.register.haveAccount": "¿Ya tienes una cuenta?", + "auth.register.signIn": "Iniciar sesión", + "auth.invite.title": "Aceptar invitación", + "auth.invite.setPasswordTitle": "Establecer contraseña", + "auth.invite.description": "Establece tu contraseña para unirte a la empresa. Tu administrador asignó Miembro (trabajo diario) o Admin (equipo y facturación).", + "auth.invite.setPasswordDescription": "Elige una contraseña para tu cuenta Descrybe migrada (al menos 8 caracteres).", + "auth.invite.checking": "Comprobando invitación…", + "auth.invite.forEmail": "Invitación para {email}.", + "auth.invite.linkRecognized": "Enlace de invitación reconocido. Introduce una contraseña abajo para continuar — el secreto no se muestra en esta página.", + "auth.invite.resetLinkRecognized": "Enlace de restablecimiento reconocido. Introduce una contraseña abajo para continuar — el secreto no se muestra en esta página.", + "auth.invite.tokenLabel": "Token de invitación", "auth.invite.resetTokenLabel": "Token de restablecimiento", - "auth.invite.tokenHelp": "Pega el token del correo de invitación. Se muestra enmascarado en este campo.", + "auth.invite.tokenHelp": "Pega el token del correo de invitación. Se muestra enmascarado en este campo.", "auth.invite.passwordHint": "Al menos 8 caracteres. Sin otras reglas de complejidad.", - "auth.invite.submit": "Aceptar invitación", - "auth.invite.setPasswordSubmit": "Establecer contraseña", - "auth.invite.accepting": "Aceptando…", - "auth.invite.saving": "Guardando…", - "auth.invite.verifyFailed": "No se pudo verificar la invitación", - "auth.invite.verifySetPasswordFailed": "No se pudo verificar el enlace para establecer contraseña", - "auth.invite.acceptFailed": "No se pudo aceptar la invitación", - "auth.invite.setPasswordFailed": "No se pudo establecer la contraseña", - "auth.invite.expired": "Esta invitación no es válida o ha caducado. Pide a tu administrador de la empresa que envíe una nueva invitación y abre el nuevo enlace (o pega el nuevo token abajo).", - "auth.invite.setPasswordExpired": "Este enlace para establecer contraseña no es válido o ha caducado. Pide a un administrador de la empresa o de la plataforma que lo reemita y abre el nuevo enlace (o pega el nuevo token abajo).", - "auth.invite.emailMismatchDefault": "Has iniciado sesión con un correo distinto al de esta invitación.", - "auth.invite.expiredFooter": "¿Enlace caducado? Pide a un administrador que lo reemita — no hay API de reenvío autoservicio. Administradores de plataforma:", - "auth.invite.adminUsersLink": "Admin → Usuarios", + "auth.invite.submit": "Aceptar invitación", + "auth.invite.setPasswordSubmit": "Establecer contraseña", + "auth.invite.accepting": "Aceptando…", + "auth.invite.saving": "Guardando…", + "auth.invite.verifyFailed": "No se pudo verificar la invitación", + "auth.invite.verifySetPasswordFailed": "No se pudo verificar el enlace para establecer contraseña", + "auth.invite.acceptFailed": "No se pudo aceptar la invitación", + "auth.invite.setPasswordFailed": "No se pudo establecer la contraseña", + "auth.invite.expired": "Esta invitación no es válida o ha caducado. Pide a tu administrador de la empresa que envíe una nueva invitación y abre el nuevo enlace (o pega el nuevo token abajo).", + "auth.invite.setPasswordExpired": "Este enlace para establecer contraseña no es válido o ha caducado. Pide a un administrador de la empresa o de la plataforma que lo reemita y abre el nuevo enlace (o pega el nuevo token abajo).", + "auth.invite.emailMismatchDefault": "Has iniciado sesión con un correo distinto al de esta invitación.", + "auth.invite.expiredFooter": "¿Enlace caducado? Pide a un administrador que lo reemita — no hay API de reenvío autoservicio. Administradores de plataforma:", + "auth.invite.adminUsersLink": "Admin → Usuarios", "auth.invite.doneTitle": "Ya formas parte del equipo", - "auth.invite.doneSetPasswordTitle": "Contraseña guardada", - "auth.invite.doneDescription": "Tu cuenta está lista. A continuación, abre el panel para trabajar con feeds y productos, o revisa la configuración de la empresa.", - "auth.invite.doneSetPasswordDescription": "Inicia sesión con tu correo y la nueva contraseña para abrir tu espacio de trabajo.", + "auth.invite.doneSetPasswordTitle": "Contraseña guardada", + "auth.invite.doneDescription": "Tu cuenta está lista. A continuación, abre el panel para trabajar con feeds y productos, o revisa la configuración de la empresa.", + "auth.invite.doneSetPasswordDescription": "Inicia sesión con tu correo y la nueva contraseña para abrir tu espacio de trabajo.", "auth.invite.openDashboard": "Abrir panel", - "auth.invite.companySettings": "Configuración de la empresa", - "auth.invite.goToSignIn": "Ir a iniciar sesión", - "auth.invite.afterSignInNote": "Tras iniciar sesión llegas a tu espacio de trabajo — se omite el recorrido de configuración inicial.", - "auth.invite.mismatchTitle": "Cuenta incorrecta para esta invitación", - "auth.invite.mismatchDescription": "Este enlace es para un correo distinto al de la sesión actual. Cierra sesión para continuar como el usuario invitado, o permanece conectado y pide a un administrador que reemita la invitación.", - "auth.invite.mismatchDetail": "Sesión iniciada como {session}, pero esta invitación es para {invite}.", - "auth.invite.mismatchFallback": "El correo de la sesión no coincide con esta invitación.", + "auth.invite.companySettings": "Configuración de la empresa", + "auth.invite.goToSignIn": "Ir a iniciar sesión", + "auth.invite.afterSignInNote": "Tras iniciar sesión llegas a tu espacio de trabajo — se omite el recorrido de configuración inicial.", + "auth.invite.mismatchTitle": "Cuenta incorrecta para esta invitación", + "auth.invite.mismatchDescription": "Este enlace es para un correo distinto al de la sesión actual. Cierra sesión para continuar como el usuario invitado, o permanece conectado y pide a un administrador que reemita la invitación.", + "auth.invite.mismatchDetail": "Sesión iniciada como {session}, pero esta invitación es para {invite}.", + "auth.invite.mismatchFallback": "El correo de la sesión no coincide con esta invitación.", "auth.invite.switchAccountTitle": "Cambiar de cuenta:", - "auth.invite.switchAccountBody": "cierra sesión y completa este formulario con el correo invitado{emailSuffix}.", - "auth.invite.reissueTitle": "Vía de reemisión:", - "auth.invite.reissueBody": "si cambió tu correo real de acceso (desfase de correo), pide a un administrador de la empresa que revoque esta invitación y envíe una nueva al correo con el que inicias sesión. Los administradores de plataforma también pueden reemitir enlaces para establecer contraseña desde Admin → Usuarios.", + "auth.invite.switchAccountBody": "cierra sesión y completa este formulario con el correo invitado{emailSuffix}.", + "auth.invite.reissueTitle": "Vía de reemisión:", + "auth.invite.reissueBody": "si cambió tu correo real de acceso (desfase de correo), pide a un administrador de la empresa que revoque esta invitación y envíe una nueva al correo con el que inicias sesión. Los administradores de plataforma también pueden reemitir enlaces para establecer contraseña desde Admin → Usuarios.", "locale.switcher": "Idioma de la interfaz", "locale.menu": "Elegir idioma de la interfaz", "locale.label": "Idioma del panel", - "locale.help": "Cambia las etiquetas de la navegación y la configuración. El idioma del contenido generado se define por separado en Empresa.", + "locale.help": "Cambia las etiquetas de la navegación y la configuración. El idioma del contenido generado se define por separado en Empresa.", "settings.contentLanguage": "Idioma del contenido", - "settings.contentLanguageHelp": "Idioma usado para títulos, descripciones y otro contenido generado", + "settings.contentLanguageHelp": "Idioma usado para títulos, descripciones y otro contenido generado", "settings.tab.profile": "Perfil", "settings.tab.company": "Empresa", "settings.tab.alerts": "Alertas", "settings.tab.apiKeys": "Claves API", "settings.tab.team": "Equipo", - "settings.title": "Configuración", + "settings.title": "Configuración", "settings.description": "Cuenta, empresa, claves API y equipo.", - "settings.accessDenied": "No tienes permiso para abrir la configuración de la empresa. Pide ayuda a un administrador de la empresa.", - "settings.loadFailed": "Error al cargar la configuración", + "settings.accessDenied": "No tienes permiso para abrir la configuración de la empresa. Pide ayuda a un administrador de la empresa.", + "settings.loadFailed": "Error al cargar la configuración", "settings.profileHeading": "Perfil", - "settings.personalInfo": "Información personal", + "settings.personalInfo": "Información personal", "settings.personalInfoHelp": "Actualiza tus datos personales", "settings.firstName": "Nombre", "settings.firstNamePlaceholder": "Tu nombre", "settings.lastName": "Apellidos", "settings.lastNamePlaceholder": "Tus apellidos", - "settings.email": "Correo electrónico", + "settings.email": "Correo electrónico", "settings.profileUpdated": "Perfil actualizado.", "settings.profileUpdateFailed": "No se pudo actualizar el perfil", "settings.role.member": "Miembro", "settings.role.admin": "Admin", "settings.teamHeading": "Miembros del equipo", "settings.inviteUser": "Invitar usuario", - "settings.teamAdminOnly": "Solo los administradores de la empresa pueden invitar, ascender, degradar o eliminar compañeros.", - "settings.shareAcceptLink": "Compartir enlace de aceptación", - "settings.shareAcceptLinkHelp": "El correo saliente no está configurado. Copia este enlace de un solo uso y envíaselo al invitado. Establecerá una contraseña (al menos 8 caracteres) y se unirá con el rol que elegiste.", - "settings.acceptLinkLabel": "Enlace de aceptación de invitación de un solo uso", + "settings.teamAdminOnly": "Solo los administradores de la empresa pueden invitar, ascender, degradar o eliminar compañeros.", + "settings.shareAcceptLink": "Compartir enlace de aceptación", + "settings.shareAcceptLinkHelp": "El correo saliente no está configurado. Copia este enlace de un solo uso y envíaselo al invitado. Establecerá una contraseña (al menos 8 caracteres) y se unirá con el rol que elegiste.", + "settings.acceptLinkLabel": "Enlace de aceptación de invitación de un solo uso", "settings.copyLink": "Copiar enlace", - "settings.linkCopied": "Enlace de aceptación copiado.", - "settings.table.email": "Correo electrónico", + "settings.linkCopied": "Enlace de aceptación copiado.", + "settings.table.email": "Correo electrónico", "settings.table.role": "Rol", "settings.table.status": "Estado", "settings.table.joined": "Alta / caduca", "settings.table.actions": "Acciones", "settings.teamForbidden": "No tienes permiso para ver la lista del equipo. Pide ayuda a un administrador de la empresa.", - "settings.noTeammates": "Aún no hay compañeros", - "settings.noTeammatesHelp": "Invita a colegas como Miembro (productos y feeds) o Admin (equipo y configuración de la empresa). Las invitaciones pendientes aparecen aquí hasta que se acepten.", - "settings.noTeammatesMemberHelp": "Aún no hay compañeros en la lista. Pide a un administrador de la empresa que envíe invitaciones.", + "settings.noTeammates": "Aún no hay compañeros", + "settings.noTeammatesHelp": "Invita a colegas como Miembro (productos y feeds) o Admin (equipo y configuración de la empresa). Las invitaciones pendientes aparecen aquí hasta que se acepten.", + "settings.noTeammatesMemberHelp": "Aún no hay compañeros en la lista. Pide a un administrador de la empresa que envíe invitaciones.", "settings.memberActions": "Acciones del miembro", "settings.makeAdmin": "Hacer admin", "settings.makeMember": "Hacer miembro", "settings.removeMember": "Eliminar", - "settings.revokeInvite": "Revocar invitación", + "settings.revokeInvite": "Revocar invitación", "settings.needOneAdmin": "Las empresas necesitan al menos un administrador", "settings.expires": "Caduca el {date}", - "settings.invalidEmail": "Introduce una dirección de correo válida.", - "settings.inviteCreatedNoMail": "Invitación creada para {email} como {role}. Copia el enlace de aceptación abajo y compártelo — el correo saliente no está configurado.", - "settings.inviteSent": "Invitación enviada a {email} como {role}. Debe abrir el correo y aceptar antes de que caduque.", - "settings.inviteFailed": "No se pudo enviar la invitación", - "settings.revokeConfirm": "¿Revocar esta invitación?", - "settings.revoked": "Invitación revocada.", - "settings.revokeFailed": "No se pudo revocar la invitación", - "settings.removeConfirm": "¿Eliminar a {email} de esta empresa?", + "settings.invalidEmail": "Introduce una dirección de correo válida.", + "settings.inviteCreatedNoMail": "Invitación creada para {email} como {role}. Copia el enlace de aceptación abajo y compártelo — el correo saliente no está configurado.", + "settings.inviteSent": "Invitación enviada a {email} como {role}. Debe abrir el correo y aceptar antes de que caduque.", + "settings.inviteFailed": "No se pudo enviar la invitación", + "settings.revokeConfirm": "¿Revocar esta invitación?", + "settings.revoked": "Invitación revocada.", + "settings.revokeFailed": "No se pudo revocar la invitación", + "settings.removeConfirm": "¿Eliminar a {email} de esta empresa?", "settings.memberRemoved": "{email} eliminado.", "settings.removeFailed": "No se pudo eliminar al usuario", - "settings.roleChangeConfirm": "¿{action} a {email} a {role}?", + "settings.roleChangeConfirm": "¿{action} a {email} a {role}?", "settings.roleChanged": "{email} ahora es {role}.", "settings.roleChangeFailed": "No se pudo actualizar el rol", "settings.promote": "Ascender", "settings.demote": "Degradar", - "settings.inviteTitle": "Invitar compañero", - "settings.inviteDescription": "Recibirá un enlace para establecer una contraseña (al menos 8 caracteres) y unirse a esta empresa.", - "settings.inviteEmail": "Correo electrónico", + "settings.inviteTitle": "Invitar compañero", + "settings.inviteDescription": "Recibirá un enlace para establecer una contraseña (al menos 8 caracteres) y unirse a esta empresa.", + "settings.inviteEmail": "Correo electrónico", "settings.inviteEmailPlaceholder": "colega@ejemplo.com", "settings.inviteRole": "Rol", - "settings.inviteRoleHint": "Los miembros gestionan productos y feeds. Los administradores también pueden invitar compañeros y cambiar la configuración de la empresa.", - "settings.sendInvite": "Enviar invitación", - "settings.companyHeading": "Configuración de la empresa", + "settings.inviteRoleHint": "Los miembros gestionan productos y feeds. Los administradores también pueden invitar compañeros y cambiar la configuración de la empresa.", + "settings.sendInvite": "Enviar invitación", + "settings.companyHeading": "Configuración de la empresa", "settings.activeCompany": "Empresa activa", - "settings.creditsOverview": "Resumen de créditos", + "settings.creditsOverview": "Resumen de créditos", "settings.plan": "Plan tarifario", "settings.used": "Usados", - "settings.companyInfo": "Información de la empresa", + "settings.companyInfo": "Información de la empresa", "settings.companyInfoHelp": "Actualiza los datos de tu empresa", "settings.companyName": "Nombre de la empresa", "settings.companyNamePlaceholder": "Nombre de tu empresa", - "settings.contentSettings": "Configuración de contenido", + "settings.contentSettings": "Configuración de contenido", "settings.mergeProducts": "Fusionar productos con el mismo GTIN", - "settings.emailIntegration": "Integración de correo", + "settings.emailIntegration": "Integración de correo", "settings.aiIntegrations": "Integraciones de IA", "settings.alertsHeading": "Alertas del operador", "settings.inAppToasts": "Toasts en la app", @@ -259,19 +259,19 @@ export const es: MessageDict = { "settings.createApiKeyTitle": "Crear clave API", "settings.apiKeyLabel": "Clave API", "settings.keyName": "Nombre de la clave", - "settings.storeKeySafe": "Guárdala en un lugar seguro — no podrás ver el secreto completo de nuevo.", - "settings.apiKeysIntro": "Crea una clave API de empresa para llamar a los endpoints públicos /api/v1. El secreto completo se muestra solo una vez al crearla — cópialo de inmediato.", - "settings.apiKeysUseWhere": "Envíala como Authorization: Bearer (preferido) o X-API-Key.", - "settings.apiKeysDocsLink": "Documentación de autenticación API", - "settings.apiKeyOnceWarning": "Esta es la única vez que se muestra el secreto completo. Cópialo ahora antes de cerrar este diálogo.", + "settings.storeKeySafe": "Guárdala en un lugar seguro — no podrás ver el secreto completo de nuevo.", + "settings.apiKeysIntro": "Crea una clave API de empresa para llamar a los endpoints públicos /api/v1. El secreto completo se muestra solo una vez al crearla — cópialo de inmediato.", + "settings.apiKeysUseWhere": "Envíala como Authorization: Bearer (preferido) o X-API-Key.", + "settings.apiKeysDocsLink": "Documentación de autenticación API", + "settings.apiKeyOnceWarning": "Esta es la única vez que se muestra el secreto completo. Cópialo ahora antes de cerrar este diálogo.", "settings.table.name": "Nombre", "settings.table.key": "Clave", - "settings.table.lastUsed": "Último uso", + "settings.table.lastUsed": "Último uso", "dashboard.demoSandbox": "Zona de pruebas demo", - "dashboard.demoEmptyTitle": "La zona de pruebas demo está vacía", - "dashboard.demoEmptyHint": "La zona de pruebas demo está vacía — cambia a A1 o conecta un feed para ver estadísticas reales del catálogo.", + "dashboard.demoEmptyTitle": "La zona de pruebas demo está vacía", + "dashboard.demoEmptyHint": "La zona de pruebas demo está vacía — cambia a A1 o conecta un feed para ver estadísticas reales del catálogo.", "dashboard.overviewTitle": "Resumen", - "dashboard.quickLinks": "Enlaces rápidos", + "dashboard.quickLinks": "Enlaces rápidos", "dashboard.whatsNew": "Novedades", "dashboard.startTutorial": "Iniciar tutorial", "dashboard.resumeTutorial": "Reanudar tutorial", @@ -284,9 +284,9 @@ export const es: MessageDict = { "dashboard.welcomeTo": "Bienvenido a {name}", "dashboard.trialBadge": "Prueba", "dashboard.actions": "Acciones del panel", - "dashboard.emptyPaygHint": "Descrybe importa un catálogo, lo enriquece y procesa, y luego exporta o lo envía a las tiendas. Usa Primeros pasos abajo.", - "dashboard.emptyCreditsHint": "Descrybe importa un catálogo, lo enriquece y procesa, y luego exporta o lo envía a las tiendas. Tienes {credits} — empieza con Primeros pasos abajo.", - "dashboard.workflowTitle": "Flujo del catálogo", + "dashboard.emptyPaygHint": "Descrybe importa un catálogo, lo enriquece y procesa, y luego exporta o lo envía a las tiendas. Usa Primeros pasos abajo.", + "dashboard.emptyCreditsHint": "Descrybe importa un catálogo, lo enriquece y procesa, y luego exporta o lo envía a las tiendas. Tienes {credits} — empieza con Primeros pasos abajo.", + "dashboard.workflowTitle": "Flujo del catálogo", "dashboard.recentActivity": "Actividad reciente", "dashboard.loadFailed": "No se pudo cargar el panel", "dashboard.workspaceFallback": "Este espacio de trabajo", @@ -294,10 +294,10 @@ export const es: MessageDict = { "dashboard.workflow.feeds.connect": "Conectar un origen", "dashboard.workflow.feeds.sources": "{count} fuente", "dashboard.workflow.feeds.sourcesPlural": "{count} fuentes", - "dashboard.workflow.products.build": "Crear catálogo", - "dashboard.workflow.products.count": "{count} en el catálogo", + "dashboard.workflow.products.build": "Crear catálogo", + "dashboard.workflow.products.count": "{count} en el catálogo", "dashboard.workflow.map": "Map", - "dashboard.workflow.map.detail": "Empareja columnas después de añadir un feed", + "dashboard.workflow.map.detail": "Empareja columnas después de añadir un feed", "dashboard.workflow.map.ready": "Abrir Map en un feed", "dashboard.workflow.sync": "Sync", "dashboard.workflow.sync.detail": "Extrae una muestra tras el mapeo", @@ -310,116 +310,116 @@ export const es: MessageDict = { "dashboard.workflow.export": "Exportar", "dashboard.workflow.exportReady": "Plantillas y descarga", "dashboard.workflow.exportMap": "Mapear y exportar", - "dashboard.workflowHint": "Catálogo dentro → enriquecer / procesar → exportar o enviar a tiendas. Salta al siguiente paso para {name}.", + "dashboard.workflowHint": "Catálogo dentro → enriquecer / procesar → exportar o enviar a tiendas. Salta al siguiente paso para {name}.", "dashboard.overviewHint": "Totales en vivo para {name}", - "dashboard.demoEmptyMessage": "Cambia a A1 (u otra empresa con datos) en el encabezado, o conecta un feed aquí para poblar esta zona de pruebas.", - "dashboard.emptyTitle": "Importa un catálogo", - "dashboard.emptyMessage": "Catálogo dentro → enriquecer / procesar → exportar o enviar a tiendas. Empieza con Primeros pasos abajo (o conecta un feed / sube un CSV).", + "dashboard.demoEmptyMessage": "Cambia a A1 (u otra empresa con datos) en el encabezado, o conecta un feed aquí para poblar esta zona de pruebas.", + "dashboard.emptyTitle": "Importa un catálogo", + "dashboard.emptyMessage": "Catálogo dentro → enriquecer / procesar → exportar o enviar a tiendas. Empieza con Primeros pasos abajo (o conecta un feed / sube un CSV).", "dashboard.connectFeedAnyway": "Conectar feed de todos modos", "dashboard.connectFeedShort": "Conectar feed", "dashboard.uploadCsv": "Subir CSV", - "dashboard.goToBilling": "Ir a Facturación", - "dashboard.freePlanTitle": "Estás en el plan Free", - "dashboard.freePlanMessageWithLimit": "{used} de {max} productos usados. El mapeo de feeds, la limpieza básica y las etiquetas energéticas de la UE (EPREL) están incluidos; actualiza para títulos y descripciones con IA, y más capacidad.", - "dashboard.freePlanMessage": "El mapeo de feeds, la limpieza básica y las etiquetas energéticas de la UE (EPREL) están incluidos; actualiza para títulos y descripciones con IA, y más capacidad.", - "dashboard.outOfCreditsTitle": "Te has quedado sin créditos de IA", - "dashboard.outOfCreditsMessage": "Compra más créditos o actualiza tu plan para seguir procesando.", - "dashboard.productLimitTitle": "Límite de productos alcanzado", - "dashboard.productLimitMessage": "Tu plan {plan} permite {max} productos ({count} en el catálogo). Actualiza para procesar más.", - "dashboard.productLimitMessageFull": "Se alcanzó el límite de productos de tu plan {plan}. Actualiza para procesar más.", + "dashboard.goToBilling": "Ir a Facturación", + "dashboard.freePlanTitle": "Estás en el plan Free", + "dashboard.freePlanMessageWithLimit": "{used} de {max} productos usados. El mapeo de feeds, la limpieza básica y las etiquetas energéticas de la UE (EPREL) están incluidos; actualiza para títulos y descripciones con IA, y más capacidad.", + "dashboard.freePlanMessage": "El mapeo de feeds, la limpieza básica y las etiquetas energéticas de la UE (EPREL) están incluidos; actualiza para títulos y descripciones con IA, y más capacidad.", + "dashboard.outOfCreditsTitle": "Te has quedado sin créditos de IA", + "dashboard.outOfCreditsMessage": "Compra más créditos o actualiza tu plan para seguir procesando.", + "dashboard.productLimitTitle": "Límite de productos alcanzado", + "dashboard.productLimitMessage": "Tu plan {plan} permite {max} productos ({count} en el catálogo). Actualiza para procesar más.", + "dashboard.productLimitMessageFull": "Se alcanzó el límite de productos de tu plan {plan}. Actualiza para procesar más.", "dashboard.comparePlans": "Comparar planes", "dashboard.viewPlans": "Ver planes", - "dashboard.trialTitle": "Prueba · {plan}", - "dashboard.trialMessageDated": "La prueba termina el {date}. {credits} créditos restantes.", - "dashboard.trialMessage": "{credits} créditos restantes en tu prueba.", - "dashboard.lowCreditsTitle": "Créditos bajos", - "dashboard.lowCreditsMessage": "Quedan {remaining} de {total} créditos. Recarga o actualiza antes de que se detengan los trabajos.", - "dashboard.latestJobs": "Últimos trabajos de procesamiento", - "dashboard.noJobsEmpty": "Aún no hay trabajos — importa productos primero.", - "dashboard.noJobsReady": "No hay trabajos recientes. Inicia uno desde Productos cuando estés listo.", + "dashboard.trialTitle": "Prueba · {plan}", + "dashboard.trialMessageDated": "La prueba termina el {date}. {credits} créditos restantes.", + "dashboard.trialMessage": "{credits} créditos restantes en tu prueba.", + "dashboard.lowCreditsTitle": "Créditos bajos", + "dashboard.lowCreditsMessage": "Quedan {remaining} de {total} créditos. Recarga o actualiza antes de que se detengan los trabajos.", + "dashboard.latestJobs": "Últimos trabajos de procesamiento", + "dashboard.noJobsEmpty": "Aún no hay trabajos — importa productos primero.", + "dashboard.noJobsReady": "No hay trabajos recientes. Inicia uno desde Productos cuando estés listo.", "dashboard.startJob": "Iniciar un trabajo desde Productos", - "dashboard.quickLinksHint": "Feeds, productos, trabajos y exportación.", + "dashboard.quickLinksHint": "Feeds, productos, trabajos y exportación.", "dashboard.feedsImportMap": "Importar y mapear", "dashboard.productsBrowse": "Explorar y procesar", "dashboard.jobsMonitor": "Supervisar tareas", "dashboard.exportsTemplates": "Plantillas y descarga", "activation.title": "Primeros pasos", - "activation.description": "Descrybe importa un catálogo, lo enriquece y procesa, y luego exporta o lo envía a las tiendas. Termina el paso actual y continúa — el recorrido demo explica las pantallas sin cambiar el progreso de la lista.", - "activation.descriptionShort": "Empieza por el paso resaltado abajo — una acción a la vez. Conectar tienda es opcional.", + "activation.description": "Descrybe importa un catálogo, lo enriquece y procesa, y luego exporta o lo envía a las tiendas. Termina el paso actual y continúa — el recorrido demo explica las pantallas sin cambiar el progreso de la lista.", + "activation.descriptionShort": "Empieza por el paso resaltado abajo — una acción a la vez. Conectar tienda es opcional.", "activation.nextCta": "Hacer este paso", - "activation.valueProp": "Descrybe importa un catálogo, lo enriquece y procesa, y luego exporta o lo envía a tus tiendas.", + "activation.valueProp": "Descrybe importa un catálogo, lo enriquece y procesa, y luego exporta o lo envía a tus tiendas.", "activation.alreadyDone": "Ya hecho", "activation.skipForNow": "Omitir por ahora", "activation.showAllSteps": "Mostrar los {total} pasos", "activation.showFewerSteps": "Mostrar menos pasos", "activation.corePathLabel": "En resumen", - "activation.corePath": "Catálogo dentro → Enriquecer / procesar → Exportar o enviar a tiendas", - "activation.storeWizardHint": "No hace falta para feeds o exportaciones — omítelo salvo que quieras enviar productos a una tienda en vivo.", - "activation.storeWizardCta": "Iniciar configuración guiada", - "activation.focus.map": "Siguiente: abre Map en un feed, empareja columnas y guarda. Añade un feed primero si la lista está vacía.", - "activation.focus.sync": "Siguiente: sincroniza una muestra tras guardar el mapeo. Usa Sync en un feed mapeado — evita sincronizar orígenes sin mapear.", + "activation.corePath": "Catálogo dentro → Enriquecer / procesar → Exportar o enviar a tiendas", + "activation.storeWizardHint": "No hace falta para feeds o exportaciones — omítelo salvo que quieras enviar productos a una tienda en vivo.", + "activation.storeWizardCta": "Iniciar configuración guiada", + "activation.focus.map": "Siguiente: abre Map en un feed, empareja columnas y guarda. Añade un feed primero si la lista está vacía.", + "activation.focus.sync": "Siguiente: sincroniza una muestra tras guardar el mapeo. Usa Sync en un feed mapeado — evita sincronizar orígenes sin mapear.", "activation.focus.dismiss": "Cerrar aviso", "activation.dismiss": "Descartar lista", "hypercare.report.title": "Hypercare de corte", - "hypercare.report.message": "¿Faltan o están incorrectos datos tras la migración? Repórtalo para que podamos corregir tu espacio de trabajo.", + "hypercare.report.message": "¿Faltan o están incorrectos datos tras la migración? Repórtalo para que podamos corregir tu espacio de trabajo.", "hypercare.report.cta": "Reportar datos faltantes o incorrectos", "hypercare.report.dismiss": "Descartar", "hypercare.report.adminTriage": "Abrir cola de hypercare", "etl.gaps.title": "What did not migrate", - "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", + "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", "etl.gaps.dismiss": "Dismiss", "etl.gaps.apiKeys.title": "API keys", - "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", + "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", "etl.gaps.apiKeys.cta": "Open API keys", "etl.gaps.blobs.title": "File contents (blobs)", - "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", + "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", "etl.gaps.blobs.countHint": "{count} file records are metadata-only (bytes were not migrated).", "etl.gaps.blobs.cta": "Open Files", "etl.gaps.jobs.title": "Processing history", "etl.gaps.jobs.body": "Legacy job and task history was not backfilled for cutover. New jobs you start here will appear normally.", - "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", + "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", "etl.gaps.jobs.migratedHint": "{count} jobs were tagged migrated from an optional backfill.", "etl.gaps.jobs.cta": "Open Processing", "etl.gaps.woo.title": "Store credentials", - "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", + "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", "etl.gaps.woo.cta": "Open Stores", "etl.gaps.settings.title": "Company settings", "etl.gaps.settings.body": "Only language and merge-products settings were imported. Re-check other company preferences in Settings.", "etl.gaps.settings.cta": "Open company settings", "activation.progress": "{done} de {total} completados", - "activation.stepsLabel": "Pasos de activación", + "activation.stepsLabel": "Pasos de activación", "activation.pausedTitle": "Primeros pasos en pausa", - "activation.pausedBody": "Reanuda cuando quieras — desde campos de producto hasta exportar. Conectar tienda sigue siendo opcional.", + "activation.pausedBody": "Reanuda cuando quieras — desde campos de producto hasta exportar. Conectar tienda sigue siendo opcional.", "activation.resume": "Reanudar lista", "activation.step.enable-fields.title": "Activar campos de producto", - "activation.step.enable-fields.body": "Elige qué columnas de producto estándar debe mapear y limpiar Descrybe.", - "activation.step.connect-source.title": "Añadir un feed de productos", - "activation.step.connect-source.body": "Añade un feed de catálogo CSV o XML para que los productos entren en Descrybe. Conectar una tienda en vivo es un paso opcional posterior.", + "activation.step.enable-fields.body": "Elige qué columnas de producto estándar debe mapear y limpiar Descrybe.", + "activation.step.connect-source.title": "Añadir un feed de productos", + "activation.step.connect-source.body": "Añade un feed de catálogo CSV o XML para que los productos entren en Descrybe. Conectar una tienda en vivo es un paso opcional posterior.", "activation.step.map.title": "Mapear columnas del feed", "activation.step.map.body": "En Feeds, abre Map en tu feed, empareja las columnas del proveedor con Descrybe y guarda.", "activation.step.sync-sample.title": "Sincronizar una muestra", - "activation.step.sync-sample.body": "En Feeds, sincroniza una muestra pequeña de un feed mapeado para verificar el mapeo antes de la ejecución completa.", + "activation.step.sync-sample.body": "En Feeds, sincroniza una muestra pequeña de un feed mapeado para verificar el mapeo antes de la ejecución completa.", "activation.step.process.title": "Procesar productos", - "activation.step.process.body": "Abre productos sin procesar y ejecuta el procesamiento para generar contenido de catálogo limpio.", + "activation.step.process.body": "Abre productos sin procesar y ejecuta el procesamiento para generar contenido de catálogo limpio.", "activation.step.store-connect.title": "Conectar una tienda", "activation.step.store-connect.body": "Opcional. Vincula WooCommerce o Shopify para enviar productos a tu tienda. Omite si solo usas feeds y exportaciones.", - "activation.step.export.title": "Crear una exportación", - "activation.step.export.body": "Crea un feed de exportación para descargar o publicar productos limpios como XML o CSV.", + "activation.step.export.title": "Crear una exportación", + "activation.step.export.body": "Crea un feed de exportación para descargar o publicar productos limpios como XML o CSV.", "stats.products": "Productos importados", - "stats.categories": "Categorías", + "stats.categories": "Categorías", "stats.attributes": "Atributos", "stats.feeds": "Feeds", - "stats.credits": "Créditos", - "stats.openCatalog": "Abrir catálogo", - "stats.productsHint": "Catálogo {processed} · cola {unprocessed} (conteos separados)", - "stats.catalogTree": "Árbol del catálogo", + "stats.credits": "Créditos", + "stats.openCatalog": "Abrir catálogo", + "stats.productsHint": "Catálogo {processed} · cola {unprocessed} (conteos separados)", + "stats.catalogTree": "Árbol del catálogo", "stats.attributeLibrary": "Biblioteca de atributos", - "stats.importSources": "Orígenes de importación", + "stats.importSources": "Orígenes de importación", "stats.payAsYouGo": "Pago por uso", - "stats.walletBilling": "Monedero · Facturación", - "stats.enterpriseBilling": "Empresarial · Facturación", - "stats.usedBilling": "{used} usados · Facturación", + "stats.walletBilling": "Monedero · Facturación", + "stats.enterpriseBilling": "Empresarial · Facturación", + "stats.usedBilling": "{used} usados · Facturación", "processing.jobStatus.processing": "Procesando", "processing.jobStatus.completed": "Completado", "processing.jobStatus.failed": "Fallido", @@ -437,50 +437,50 @@ export const es: MessageDict = { "processing.step.ai_enhance": "Mejora con IA", "processing.type.full": "Procesamiento completo", "processing.type.enhance_only": "Solo mejorar", - "processing.type.title": "Solo título", - "processing.type.description": "Solo descripción", + "processing.type.title": "Solo título", + "processing.type.description": "Solo descripción", "processing.type.attributes": "Atributos", - "processing.type.category": "Categoría", + "processing.type.category": "Categoría", "processing.type.eprel": "EPREL", "processing.type.seo": "SEO", "processing.type.normalize": "Normalizar", "errors.requestFailed": "Error en la solicitud", - "errors.maintenance": "El sistema está en mantenimiento. Inténtalo más tarde.", - "errors.readOnly": "El sistema está en modo de solo lectura. Los cambios están temporalmente deshabilitados.", + "errors.maintenance": "El sistema está en mantenimiento. Inténtalo más tarde.", + "errors.readOnly": "El sistema está en modo de solo lectura. Los cambios están temporalmente deshabilitados.", "errors.companyAdminDenied": "Solo los administradores de la empresa pueden {action}. Pide ayuda a un administrador.", "errors.companyAdminDenied.actionDefault": "hacer esto", - "docs.tryIt.memberCannotCreate": "Solo los admins de la empresa pueden crear claves API. Las antiguas no se migraron — pega una clave abajo o pide a un admin que cree una nueva.", - "docs.tryIt.noKeysLegacyAdmin": "Las claves API antiguas no se migraron. Crea una nueva con Use my API key o Ajustes → Claves API — el secreto solo se muestra una vez.", - "docs.tryIt.noKeysLegacyMember": "No hay claves API. Las antiguas no se migraron — pide a un admin que cree una, o pega una clave dk_.", + "docs.tryIt.memberCannotCreate": "Solo los admins de la empresa pueden crear claves API. Las antiguas no se migraron — pega una clave abajo o pide a un admin que cree una nueva.", + "docs.tryIt.noKeysLegacyAdmin": "Las claves API antiguas no se migraron. Crea una nueva con Use my API key o Ajustes → Claves API — el secreto solo se muestra una vez.", + "docs.tryIt.noKeysLegacyMember": "No hay claves API. Las antiguas no se migraron — pide a un admin que cree una, o pega una clave dk_.", "errors.couldNotUpdateLanguage": "No se pudo actualizar el idioma", "toast.support.replyTitle": "Respuesta de soporte", - "toast.support.replyBody": "El equipo respondió a tu ticket de soporte.", + "toast.support.replyBody": "El equipo respondió a tu ticket de soporte.", "toast.support.replyRe": "Re: {subject}", "toast.support.statusTitle": "Estado del ticket actualizado", - "toast.support.statusBody": "El estado de tu ticket de soporte cambió.", - "toast.support.updateTitle": "Actualización de soporte", + "toast.support.statusBody": "El estado de tu ticket de soporte cambió.", + "toast.support.updateTitle": "Actualización de soporte", "assistant.label": "Asistente", "assistant.open": "Abrir el asistente del sistema", "assistant.close": "Cerrar el asistente del sistema", "tutorial.demoTour": "Tour demo", "tutorial.jumpToTopic": "Ir a un tema", - "tutorial.whereNeedHelp": "¿En qué necesitas ayuda?", + "tutorial.whereNeedHelp": "¿En qué necesitas ayuda?", "tutorial.skipTour": "Omitir tour", "tutorial.skipAria": "Omitir tutorial", - "tutorial.pickerBody": "Elige una sección para reabrir esa parte de la demo. Explorar el tour no cambia los datos de tu cuenta.", + "tutorial.pickerBody": "Elige una sección para reabrir esa parte de la demo. Explorar el tour no cambia los datos de tu cuenta.", "tutorial.sectionsAria": "Secciones del tutorial", "tutorial.open": "Abrir", "tutorial.close": "Cerrar", - "tutorial.resumeLastStep": "Reanudar último paso", + "tutorial.resumeLastStep": "Reanudar último paso", "tutorial.startFromBeginning": "Empezar desde el principio", "tutorial.stepOf": "Paso {current} de {total}", - "tutorial.jumpTo": "Ir a…", - "tutorial.jumpToSectionAria": "Ir a la sección", - "tutorial.back": "Atrás", + "tutorial.jumpTo": "Ir a…", + "tutorial.jumpToSectionAria": "Ir a la sección", + "tutorial.back": "Atrás", "tutorial.pause": "Pausar", "tutorial.continue": "Continuar", "tutorial.finishTour": "Finalizar tour", - "tutorial.missingTargetHint": "Ese control aún no está en esta pantalla. Aun así puedes Continuar: el tour nunca exige guardar ni sincronizar.", + "tutorial.missingTargetHint": "Ese control aún no está en esta pantalla. Aun así puedes Continuar: el tour nunca exige guardar ni sincronizar.", "tutorial.section.welcome": "Welcome", "tutorial.section.catalog": "Catalog setup", "tutorial.section.sources": "Feeds", @@ -490,66 +490,66 @@ export const es: MessageDict = { "tutorial.section.grow": "Grow", "tutorial.section.done": "Done", "tutorial.step.welcome.title": "Bienvenido a Descrybe", - "tutorial.step.welcome.body": "El bucle principal de Descrybe es Feeds → Process → Export / Stores. Esta demo guiada destaca esas pantallas en tu panel real — sin pedirte guardar, sincronizar, activar campos ni crear feeds. Pausa cuando quieras; reanuda desde la cabecera. Salta a una sección si solo necesitas ayuda con un tema.", - "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", + "tutorial.step.welcome.body": "El bucle principal de Descrybe es Feeds → Process → Export / Stores. Esta demo guiada destaca esas pantallas en tu panel real — sin pedirte guardar, sincronizar, activar campos ni crear feeds. Pausa cuando quieras; reanuda desde la cabecera. Salta a una sección si solo necesitas ayuda con un tema.", + "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", "tutorial.step.welcome.nextLabel": "Start tour", - "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", + "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", "tutorial.step.dashboard-overview.title": "Tu centro de mando", - "tutorial.step.dashboard-overview.body": "La franja de flujo del catálogo muestra el camino diario: Feeds → Map → Sync → Process. Getting started sigue el progreso real del espacio de trabajo (aparte de esta demo). Cuando quieras trabajar de verdad, usa Manage feeds o Start processing — luego exporta o conecta una tienda.", - "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", + "tutorial.step.dashboard-overview.body": "La franja de flujo del catálogo muestra el camino diario: Feeds → Map → Sync → Process. Getting started sigue el progreso real del espacio de trabajo (aparte de esta demo). Cuando quieras trabajar de verdad, usa Manage feeds o Start processing — luego exporta o conecta una tienda.", + "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", "tutorial.step.dashboard-overview.missingHint": "The workflow strip and checklist appear after the dashboard loads.", - "tutorial.step.enable-fields.title": "Campos estándar", - "tutorial.step.enable-fields.body": "Standard Fields son las columnas de producto que Descrybe mapea, procesa y exporta — título, descripción, GTIN, imágenes y más. Enable recommended activa un conjunto por defecto sensato para la mayoría de catálogos. Puedes refinar la lista después sin romper mapeos existentes.", - "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", + "tutorial.step.enable-fields.title": "Campos estándar", + "tutorial.step.enable-fields.body": "Standard Fields son las columnas de producto que Descrybe mapea, procesa y exporta — título, descripción, GTIN, imágenes y más. Enable recommended activa un conjunto por defecto sensato para la mayoría de catálogos. Puedes refinar la lista después sin romper mapeos existentes.", + "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", "tutorial.step.enable-fields.warning": "Enabling or disabling fields affects mapping and processing for this company. Prefer Enable recommended once, then tweak carefully.", "tutorial.step.enable-fields.missingHint": "Wait for the Fields page to load, or open Fields from the Catalog section in the sidebar.", - "tutorial.step.catalog-depth.title": "Categorías y atributos", - "tutorial.step.catalog-depth.body": "En la sección Catalog de la barra lateral también están Categories y Attributes. Categories organizan el catálogo; los atributos impulsan filtros y descripciones estructuradas. No hace falta configurarlos para terminar este tour.", - "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", + "tutorial.step.catalog-depth.title": "Categorías y atributos", + "tutorial.step.catalog-depth.body": "En la sección Catalog de la barra lateral también están Categories y Attributes. Categories organizan el catálogo; los atributos impulsan filtros y descripciones estructuradas. No hace falta configurarlos para terminar este tour.", + "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", "tutorial.step.catalog-depth.missingHint": "Expand Catalog in the sidebar to open Categories or Attributes after the tour.", - "tutorial.step.connect-source.title": "Añadir un origen de productos", - "tutorial.step.connect-source.body": "Los feeds son cómo entran los catálogos de proveedores en Descrybe — archivos CSV, XML o por URL. Add Feed crea un origen nuevo; cada fila muestra el estado (listo para mapear, mapeado, activo). Map abre la pantalla de correspondencia de campos de ese feed.", - "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", + "tutorial.step.connect-source.title": "Añadir un origen de productos", + "tutorial.step.connect-source.body": "Los feeds son cómo entran los catálogos de proveedores en Descrybe — archivos CSV, XML o por URL. Add Feed crea un origen nuevo; cada fila muestra el estado (listo para mapear, mapeado, activo). Map abre la pantalla de correspondencia de campos de ese feed.", + "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", "tutorial.step.connect-source.warning": "Avoid deleting live feeds unless you intend to remove that source and its sync history.", - "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", + "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", "tutorial.step.map.title": "Mapear campos de origen", - "tutorial.step.map.body": "En la pantalla Map de un feed emparejas columnas del proveedor con los standard fields de Descrybe. Auto-map sugiere coincidencias por nombres de columna; confirma las aproximadas y corrige lo que falle. Save Mappings guarda el mapa para que la sincronización y el procesamiento sepan leer cada fila.", - "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", - "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", + "tutorial.step.map.body": "En la pantalla Map de un feed emparejas columnas del proveedor con los standard fields de Descrybe. Auto-map sugiere coincidencias por nombres de columna; confirma las aproximadas y corrige lo que falle. Save Mappings guarda el mapa para que la sincronización y el procesamiento sepan leer cada fila.", + "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", + "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", "tutorial.step.map.missingHint": "Add a feed and click Map to see the mapping UI; or Continue to keep learning.", - "tutorial.step.sync-sample.title": "Sincronizar una muestra (cuando estés listo)", - "tutorial.step.sync-sample.body": "Tras guardar los mapeos, Sync + Process sample extrae un lote pequeño y ejecuta el procesamiento para verificar títulos, imágenes y atributos antes de una ejecución completa. Full Sync now en la lista de feeds sirve para importaciones mayores cuando la muestra se vea bien.", - "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", + "tutorial.step.sync-sample.title": "Sincronizar una muestra (cuando estés listo)", + "tutorial.step.sync-sample.body": "Tras guardar los mapeos, Sync + Process sample extrae un lote pequeño y ejecuta el procesamiento para verificar títulos, imágenes y atributos antes de una ejecución completa. Full Sync now en la lista de feeds sirve para importaciones mayores cuando la muestra se vea bien.", + "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", "tutorial.step.sync-sample.warning": "Syncing writes products into this company. Prefer a sample first; avoid Sync now on unmapped feeds.", "tutorial.step.sync-sample.missingHint": "Sync controls appear on feed rows and on the mapping screen footer.", "tutorial.step.process.title": "Revisar productos", - "tutorial.step.process.body": "Products lista ítems sincronizados y procesados. Filtra por estado, abre una fila para el detalle y usa insignias EPREL cuando haya etiqueta energética. Aquí detectas errores de mapeo antes de exportar o sincronizar tiendas.", - "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", + "tutorial.step.process.body": "Products lista ítems sincronizados y procesados. Filtra por estado, abre una fila para el detalle y usa insignias EPREL cuando haya etiqueta energética. Aquí detectas errores de mapeo antes de exportar o sincronizar tiendas.", + "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", "tutorial.step.process.missingHint": "Wait for the products table, or Continue if the catalog is still empty.", "tutorial.step.processing-hub.title": "Procesamiento en segundo plano", - "tutorial.step.processing-hub.body": "Los trabajos en Processing muestran el progreso de AI y del pipeline: ejecuciones completadas y fallos. Inicia trabajos desde el panel o productos cuando quieras gastar créditos en un lote a propósito.", - "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", + "tutorial.step.processing-hub.body": "Los trabajos en Processing muestran el progreso de AI y del pipeline: ejecuciones completadas y fallos. Inicia trabajos desde el panel o productos cuando quieras gastar créditos en un lote a propósito.", + "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", "tutorial.step.processing-hub.missingHint": "Open Jobs from the Processing section in the sidebar if the page is empty.", "tutorial.step.stores-hub.title": "Tiendas y plataformas", - "tutorial.step.stores-hub.body": "Tras procesar productos, Stores conecta WooCommerce o Shopify para enviar el catálogo limpio a tu tienda. Úsalo cuando un marketplace o CMS sea el destino — o salta a Export feeds si los partners solo necesitan un archivo/URL.", - "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", + "tutorial.step.stores-hub.body": "Tras procesar productos, Stores conecta WooCommerce o Shopify para enviar el catálogo limpio a tu tienda. Úsalo cuando un marketplace o CMS sea el destino — o salta a Export feeds si los partners solo necesitan un archivo/URL.", + "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", "tutorial.step.stores-hub.missingHint": "Open Stores from the sidebar to see connection cards.", "tutorial.step.export.title": "Exportar productos limpios", - "tutorial.step.export.body": "Los export feeds publican productos limpios como XML o CSV para canales, partners o tu tienda. Crea una exportación, elige formato y filtros, luego comparte la URL del feed o descarga. Las exportaciones leen datos de catálogo procesados — mapea y procesa primero para mejores resultados.", - "tutorial.step.export.tip": "You don’t need to create an export during the demo.", - "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", + "tutorial.step.export.body": "Los export feeds publican productos limpios como XML o CSV para canales, partners o tu tienda. Crea una exportación, elige formato y filtros, luego comparte la URL del feed o descarga. Las exportaciones leen datos de catálogo procesados — mapea y procesa primero para mejores resultados.", + "tutorial.step.export.tip": "You don’t need to create an export during the demo.", + "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", "tutorial.step.export.missingHint": "Wait for Export feeds to load, or open Exports from the Feeds section in the sidebar.", - "tutorial.step.billing-hub.title": "Créditos y facturación", - "tutorial.step.billing-hub.body": "Billing muestra tu plan, monedero y créditos restantes. El procesamiento y algunas funciones de AI consumen este saldo. Vigila el uso antes de ejecuciones grandes de catálogo.", - "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", + "tutorial.step.billing-hub.title": "Créditos y facturación", + "tutorial.step.billing-hub.body": "Billing muestra tu plan, monedero y créditos restantes. El procesamiento y algunas funciones de AI consumen este saldo. Vigila el uso antes de ejecuciones grandes de catálogo.", + "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", "tutorial.step.billing-hub.missingHint": "Open Billing from the Account section in the sidebar.", - "tutorial.step.grow-hub.title": "Campañas, SEO y reseñas", - "tutorial.step.grow-hub.body": "En Marketing: Campaigns genera contenido, Content calendar planifica publicaciones, SEO comprueba listados y Reviews se integra con WooCommerce. Se apoyan en un catálogo bien mapeado — termina Feeds → Process → Export / Stores antes de depender de ellos.", - "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", + "tutorial.step.grow-hub.title": "Campañas, SEO y reseñas", + "tutorial.step.grow-hub.body": "En Marketing: Campaigns genera contenido, Content calendar planifica publicaciones, SEO comprueba listados y Reviews se integra con WooCommerce. Se apoyan en un catálogo bien mapeado — termina Feeds → Process → Export / Stores antes de depender de ellos.", + "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", "tutorial.step.grow-hub.missingHint": "Open Campaigns from Marketing in the sidebar, or Continue.", "tutorial.step.tour-done.title": "Listo para explorar", - "tutorial.step.tour-done.body": "Ese es el mapa del producto: Feeds → Map → Sync → Process → Export / Stores. Usa Getting started en el panel para la configuración real. Reanuda o reinicia este tour desde la cabecera en cualquier momento, o Jump to… una sección cuando necesites un repaso. Skip tour termina la demo sin cambiar tu checklist.", - "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", + "tutorial.step.tour-done.body": "Ese es el mapa del producto: Feeds → Map → Sync → Process → Export / Stores. Usa Getting started en el panel para la configuración real. Reanuda o reinicia este tour desde la cabecera en cualquier momento, o Jump to… una sección cuando necesites un repaso. Skip tour termina la demo sin cambiar tu checklist.", + "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", "tutorial.step.tour-done.nextLabel": "Finish tour", "tutorial.step.tour-done.missingHint": "Return to the dashboard to finish.", "news.uxImprovements.title": "Mejoras de experiencia de usuario", @@ -558,14 +558,14 @@ export const es: MessageDict = { "theme.lightMode": "Modo claro", "forbidden.title.accessRestricted": "Acceso restringido", "forbidden.title.permissionDenied": "Permiso denegado", - "forbidden.message.support": "Esta área solo está disponible para personal de soporte y administradores de la plataforma.", - "forbidden.message.platform": "Esta área solo está disponible para administradores de la plataforma.", + "forbidden.message.support": "Esta área solo está disponible para personal de soporte y administradores de la plataforma.", + "forbidden.message.platform": "Esta área solo está disponible para administradores de la plataforma.", "forbidden.message.company": "No tienes permiso para esto. Pide ayuda a un administrador de la empresa.", "forbidden.backToDashboard": "Volver al panel", "admin.chrome.platformOps": "Ops de plataforma", "admin.chrome.sidebar": "Barra lateral de ops de plataforma", "admin.chrome.nav": "Ops de plataforma", - "admin.chrome.mobileMenu": "Menú móvil de ops de plataforma", + "admin.chrome.mobileMenu": "Menú móvil de ops de plataforma", "admin.chrome.opsBadge": "Ops", "admin.chrome.backToApp": "Volver a la app", "admin.chrome.uiLanguage": "Idioma de la UI", @@ -580,22 +580,22 @@ export const es: MessageDict = { "admin.nav.section.commerce": "Comercio", "admin.nav.section.system": "Sistema", "admin.nav.commandCenter": "Centro de mando", - "admin.nav.analytics": "Analíticas", + "admin.nav.analytics": "Analíticas", "admin.nav.usersOrgs": "Usuarios y orgs", "admin.nav.tickets": "Tickets", "admin.nav.knowledge": "Conocimiento", - "admin.nav.diagnostics": "Diagnósticos", + "admin.nav.diagnostics": "Diagnósticos", "admin.nav.stuckProducts": "Productos atascados", "admin.nav.orphanProcessed": "Orphan processed", - "admin.nav.billing": "Facturación", + "admin.nav.billing": "Facturación", "admin.nav.sales": "Sales", "admin.nav.translations": "Traducciones", - "admin.nav.settings": "Configuración", + "admin.nav.settings": "Configuración", "admin.sales.title": "Sales leads", "admin.sales.description": "Inbound Contact sales messages and custom payment quotes.", "admin.sales.listTitle": "Leads", "admin.sales.listDesc": "{total} matching leads", - "admin.sales.searchPlaceholder": "Search name, email, company…", + "admin.sales.searchPlaceholder": "Search name, email, company…", "admin.sales.statusAll": "All statuses", "admin.sales.status.new": "New", "admin.sales.status.contacted": "Contacted", @@ -643,7 +643,7 @@ export const es: MessageDict = { "admin.sales.col.status": "Status", "admin.sales.col.created": "Created", "sales.contact.title": "Contact sales", - "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", + "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", "sales.contact.formTitle": "Send a message", "sales.contact.formLead": "Enterprise and custom deals are prepared by our team, then paid via Stripe Checkout.", "sales.contact.name": "Name", @@ -653,26 +653,26 @@ export const es: MessageDict = { "sales.contact.estimatedSkus": "Estimated SKUs (optional)", "sales.contact.message": "How can we help?", "sales.contact.submit": "Send message", - "sales.contact.submitting": "Sending…", + "sales.contact.submitting": "Sending…", "sales.contact.error": "Could not send your message. Please try again.", - "sales.contact.toast.success": "Message sent — we will follow up soon.", - "sales.contact.thanksTitle": "Thanks — we got your message", + "sales.contact.toast.success": "Message sent — we will follow up soon.", + "sales.contact.thanksTitle": "Thanks — we got your message", "sales.contact.thanksBody": "A platform admin will review your request and can send a Checkout link for a custom plan.", "sales.contact.bookDemo": "Book a live demo", "sales.contact.orBookDemo": "Or book a Calendly demo", "sales.contact.backPricing": "Back to pricing", "admin.overview.eyebrow": "Centro de mando", "admin.overview.title": "Resumen de la plataforma", - "admin.overview.description": "Pulso en vivo de la plataforma desde el resumen de analíticas — salta a operaciones, información y soporte.", + "admin.overview.description": "Pulso en vivo de la plataforma desde el resumen de analíticas — salta a operaciones, información y soporte.", "admin.overview.tokens": "Fichas", - "admin.overview.tokensHint": "Todo el tiempo · período", - "admin.overview.credits": "Créditos", + "admin.overview.tokensHint": "Todo el tiempo · período", + "admin.overview.credits": "Créditos", "admin.overview.creditsHint": "En todas las empresas", "admin.overview.jobs": "Trabajos", - "admin.overview.jobsHint": "Instantánea de cola", + "admin.overview.jobsHint": "Instantánea de cola", "admin.overview.platform": "Plataforma", - "admin.overview.platformHint": "Inquilinos · volumen", - "admin.overview.signals": "Señales recientes", + "admin.overview.platformHint": "Inquilinos · volumen", + "admin.overview.signals": "Señales recientes", "admin.overview.shortcuts": "Atajos de ops", "admin.overview.providers": "Mix de proveedores de IA", "admin.overview.internalAi": "IA interna", @@ -681,60 +681,60 @@ export const es: MessageDict = { "admin.overview.popularKeysHint": "Proveedores populares del inquilino", "admin.overview.customUrl": "URL personalizada", "admin.overview.customUrlHint": "URL base personalizada del inquilino", - "admin.overview.linkBilling": "Facturación", - "admin.overview.linkSettings": "Configuración", - "admin.overview.shortcut.diagnostics.title": "Diagnósticos", + "admin.overview.linkBilling": "Facturación", + "admin.overview.linkSettings": "Configuración", + "admin.overview.shortcut.diagnostics.title": "Diagnósticos", "admin.overview.shortcut.diagnostics.desc": "Comprobaciones de salud, cola, fallos recientes", - "admin.overview.shortcut.analytics.title": "Analíticas", + "admin.overview.shortcut.analytics.title": "Analíticas", "admin.overview.shortcut.analytics.desc": "Tokens, trabajos, altas, proveedores", "admin.overview.shortcut.knowledge.title": "Conocimiento", - "admin.overview.shortcut.knowledge.desc": "Artículos, plantillas, respuesta automática", + "admin.overview.shortcut.knowledge.desc": "Artículos, plantillas, respuesta automática", "admin.overview.shortcut.users.title": "Usuarios y orgs", "admin.overview.shortcut.users.desc": "Cuentas, empresas, invitaciones", "admin.overview.shortcut.stuck.title": "Productos atascados", - "admin.overview.shortcut.stuck.desc": "En ejecución más de 2 horas", + "admin.overview.shortcut.stuck.desc": "En ejecución más de 2 horas", "admin.overview.signal.stuckTitle": "{count} trabajo atascado", "admin.overview.signal.stuckTitlePlural": "{count} trabajos atascados", - "admin.overview.signal.stuckDetail": "En ejecución más de 2 horas — revisa y restablece si hace falta.", + "admin.overview.signal.stuckDetail": "En ejecución más de 2 horas — revisa y restablece si hace falta.", "admin.overview.signal.stuckCta": "Abrir trabajos atascados", - "admin.overview.signal.failedTitle": "{count} fallidos en los últimos {days} d", + "admin.overview.signal.failedTitle": "{count} fallidos en los últimos {days} d", "admin.overview.signal.failedDetail": "{completed} completados en la misma ventana.", - "admin.overview.signal.failedDetailRate": "{rate}% tasa de fallos · {completed} completados.", - "admin.overview.signal.failedCta": "Abrir diagnósticos", - "admin.overview.signal.runningTitle": "{count} trabajo en ejecución", - "admin.overview.signal.runningTitlePlural": "{count} trabajos en ejecución", + "admin.overview.signal.failedDetailRate": "{rate}% tasa de fallos · {completed} completados.", + "admin.overview.signal.failedCta": "Abrir diagnósticos", + "admin.overview.signal.runningTitle": "{count} trabajo en ejecución", + "admin.overview.signal.runningTitlePlural": "{count} trabajos en ejecución", "admin.overview.signal.runningDetail": "Trabajos de procesamiento activos ahora mismo.", "admin.overview.signal.runningCta": "Ver cola", "admin.overview.signal.ticketsTitle": "{count} ticket de soporte abierto", "admin.overview.signal.ticketsTitlePlural": "{count} tickets de soporte abiertos", "admin.overview.signal.ticketsDetail": "Tickets abiertos o pendientes en la mesa de soporte.", "admin.overview.signal.ticketsCta": "Abrir soporte", - "admin.overview.signal.clearTitle": "Sin señales elevadas", - "admin.overview.signal.clearDetail": "Sin trabajos atascados, fallos del período ni tickets abiertos en el resumen en vivo (últimos {days} d).", - "admin.overview.signal.clearCta": "Confirmar en diagnósticos", - "admin.overview.badge.action": "Acción", + "admin.overview.signal.clearTitle": "Sin señales elevadas", + "admin.overview.signal.clearDetail": "Sin trabajos atascados, fallos del período ni tickets abiertos en el resumen en vivo (últimos {days} d).", + "admin.overview.signal.clearCta": "Confirmar en diagnósticos", + "admin.overview.badge.action": "Acción", "admin.overview.badge.watch": "Vigilar", "admin.overview.badge.live": "En vivo", "admin.overview.badge.clear": "Limpiar", "admin.overview.summaryLoadFailed": "No se pudo cargar el resumen en vivo. Los atajos de abajo siguen funcionando.", - "admin.overview.keyMetrics": "Métricas clave", - "admin.overview.summaryWindow": "Últimos {days} d · endpoint de resumen", - "admin.overview.tokensPeriod": "{count} en los últimos {days} d", + "admin.overview.keyMetrics": "Métricas clave", + "admin.overview.summaryWindow": "Últimos {days} d · endpoint de resumen", + "admin.overview.tokensPeriod": "{count} en los últimos {days} d", "admin.overview.creditsFoot": "{remaining} restantes de {allocated} asignados", - "admin.overview.jobsFoot": "{failed} fallidos · {running} en curso · {stuck} atascados", - "admin.overview.platformFoot": "{users} usuarios · {processed} procesados · {feeds} feeds de entrada", - "admin.overview.fullDiagnostics": "Diagnósticos completos", - "admin.overview.also": "También:", + "admin.overview.jobsFoot": "{failed} fallidos · {running} en curso · {stuck} atascados", + "admin.overview.platformFoot": "{users} usuarios · {processed} procesados · {feeds} feeds de entrada", + "admin.overview.fullDiagnostics": "Diagnósticos completos", + "admin.overview.also": "También:", "admin.overview.linkSupport": "Mesa de soporte", - "admin.overview.charts": "Gráficos", - "admin.overview.providerFoot": "{jobs} trabajos · {products} productos", + "admin.overview.charts": "Gráficos", + "admin.overview.providerFoot": "{jobs} trabajos · {products} productos", "admin.analytics.eyebrow": "Insights", - "admin.analytics.title": "Analítica e informes", - "admin.analytics.description": "KPI y tendencias en vivo de la plataforma a partir de tokens, trabajos, altas, feeds, tickets y facturación.", - "admin.analytics.period": "Período", - "admin.analytics.refreshing": "Actualizando…", + "admin.analytics.title": "Analítica e informes", + "admin.analytics.description": "KPI y tendencias en vivo de la plataforma a partir de tokens, trabajos, altas, feeds, tickets y facturación.", + "admin.analytics.period": "Período", + "admin.analytics.refreshing": "Actualizando…", "admin.analytics.llmTokens": "Tokens LLM", - "admin.analytics.credits": "Créditos", + "admin.analytics.credits": "Créditos", "admin.analytics.jobs": "Trabajos", "admin.analytics.volume": "Volumen", "admin.analytics.failureRate": "Tasa de fallos", @@ -744,24 +744,24 @@ export const es: MessageDict = { "admin.analytics.internalAi": "IA interna", "admin.analytics.internalAiHint": "OpenAI de plataforma (ajustes admin)", "admin.analytics.popularKeys": "Claves populares", - "admin.analytics.popularKeysHint": "OpenAI / Groq / … del inquilino", + "admin.analytics.popularKeysHint": "OpenAI / Groq / … del inquilino", "admin.analytics.customUrl": "URL/modelo personalizado", "admin.analytics.customUrlHint": "URL base del inquilino + modelo + clave", - "admin.analytics.tokensByDay": "Tokens por día", + "admin.analytics.tokensByDay": "Tokens por día", "admin.analytics.tokensByProvider": "Tokens por clase de proveedor", "admin.analytics.tokensByProviderAria": "Tokens por clase de proveedor", "admin.analytics.internalCount": "Interno {count}", "admin.analytics.popularCount": "Popular {count}", "admin.analytics.customCount": "Personalizado {count}", - "admin.analytics.jobsByDay": "Trabajos por día", + "admin.analytics.jobsByDay": "Trabajos por día", "admin.analytics.jobsByDayHint": "Trabajos creados (secundario = fallidos).", - "admin.analytics.signupsByDay": "Altas por día", + "admin.analytics.signupsByDay": "Altas por día", "admin.analytics.signupsByDayHint": "Nuevos usuarios (principal) y empresas (secundario)", "admin.analytics.processingJobsStatus": "processing_jobs por estado", "admin.analytics.feedSyncStatus": "feed_sync_jobs por estado", "admin.analytics.ticketsStatus": "support_tickets por estado", "admin.analytics.providerDetail": "Detalle del proveedor", - "admin.analytics.providerDetailHint": "Modos de proveedor principales (limitados por tamaño de payload).", + "admin.analytics.providerDetailHint": "Modos de proveedor principales (limitados por tamaño de payload).", "admin.analytics.noProviderRows": "Sin filas de proveedor", "admin.analytics.provider": "Proveedor", "admin.analytics.class": "Clase", @@ -769,18 +769,18 @@ export const es: MessageDict = { "admin.analytics.productsCol": "Productos", "admin.analytics.companiesHint": "Principales empresas por tokens con desglose de proveedor", "admin.analytics.noCompanies": "Sin empresas", - "admin.analytics.noCompaniesMsg": "La lista de empresas está vacía.", + "admin.analytics.noCompaniesMsg": "La lista de empresas está vacía.", "admin.analytics.company": "Empresa", "admin.analytics.internal": "Interno", "admin.analytics.popular": "Popular", "admin.analytics.custom": "Personalizado", - "admin.analytics.noBillingCycles": "Aún no hay ciclos de facturación", - "admin.analytics.linkDiagnostics": "Diagnósticos", + "admin.analytics.noBillingCycles": "Aún no hay ciclos de facturación", + "admin.analytics.linkDiagnostics": "Diagnósticos", "admin.analytics.linkStuck": "Productos atascados", "admin.users.eyebrow": "Admin de plataforma", "admin.users.title": "Usuarios y organizaciones", - "admin.users.description": "Directorio de usuarios de la plataforma, roles de personal y asignación de planes de empresa.", - "admin.users.staffRoleUnavailable": "Las actualizaciones de rol de personal aún no están disponibles en este despliegue. Contacta al administrador de la plataforma si las necesitas.", + "admin.users.description": "Directorio de usuarios de la plataforma, roles de personal y asignación de planes de empresa.", + "admin.users.staffRoleUnavailable": "Las actualizaciones de rol de personal aún no están disponibles en este despliegue. Contacta al administrador de la plataforma si las necesitas.", "admin.users.search": "Buscar", "admin.users.tabUsers": "Usuarios", "admin.users.tabCompanies": "Empresas", @@ -792,60 +792,60 @@ export const es: MessageDict = { "admin.users.colStatus": "Estado", "admin.users.colCreated": "Creado", "admin.users.colActions": "Acciones", - "admin.users.mustSetPassword": "Debe establecer contraseña", + "admin.users.mustSetPassword": "Debe establecer contraseña", "admin.users.inactive": "Inactivo", - "admin.users.reissueInvite": "Reemitir invitación", - "admin.users.setLocalPassword": "Establecer contraseña local", + "admin.users.reissueInvite": "Reemitir invitación", + "admin.users.setLocalPassword": "Establecer contraseña local", "admin.users.switchToUser": "Cambiar a usuario", "admin.users.colCompany": "Empresa", "admin.users.colPlan": "Plan tarifario", - "admin.users.colCredits": "Créditos", + "admin.users.colCredits": "Créditos", "admin.users.colLanguage": "Idioma", "admin.users.assignPlan": "Asignar plan", "admin.users.cloneCatalog": "Copiar a mi empresa", - "admin.users.cloneCatalogAria": "Copiar el catálogo de {name} a tu empresa sandbox", - "admin.users.cloneCatalogTitle": "Copiar catálogo de empresa", + "admin.users.cloneCatalogAria": "Copiar el catálogo de {name} a tu empresa sandbox", + "admin.users.cloneCatalogTitle": "Copiar catálogo de empresa", "admin.users.cloneCatalogDesc": "Sigues en tu cuenta de admin. Los datos de origen no cambian.", "admin.users.cloneCatalogFrom": "Origen: {name}", "admin.users.cloneCatalogInto": "Destino: {name}", - "admin.users.cloneCatalogWarning": "Sustituye categorías, feeds, productos, atributos, mappings y marca en el destino. Plan, facturación, miembros, claves API y conectores de tienda no se copian.", + "admin.users.cloneCatalogWarning": "Sustituye categorías, feeds, productos, atributos, mappings y marca en el destino. Plan, facturación, miembros, claves API y conectores de tienda no se copian.", "admin.users.cloneCatalogCancel": "Cancelar", - "admin.users.cloneCatalogConfirm": "Copiar catálogo", + "admin.users.cloneCatalogConfirm": "Copiar catálogo", "admin.users.cloneDestFallback": "tu empresa sandbox", - "admin.users.fixA1": "Reparar catálogo A1", - "admin.users.fixA1Aria": "Reparar prompts de IA, categorías y hashes de enhance para {name}", - "admin.users.fixA1Title": "Reparar catálogo de la empresa", - "admin.users.fixA1Desc": "Vuelve a aplicar prompts de IA corregidos, limpia hashes de enhance débiles y completa categorías desde mapped_data.", + "admin.users.fixA1": "Reparar catálogo A1", + "admin.users.fixA1Aria": "Reparar prompts de IA, categorías y hashes de enhance para {name}", + "admin.users.fixA1Title": "Reparar catálogo de la empresa", + "admin.users.fixA1Desc": "Vuelve a aplicar prompts de IA corregidos, limpia hashes de enhance débiles y completa categorías desde mapped_data.", "admin.users.fixA1Company": "Empresa: {name}", - "admin.users.fixA1Warning": "Prefiera Platform Demo o una empresa explícita. No elimina feeds, mapeos ni productos en bruto. Protege las reglas de sobrescritura de la cohorte A1.", + "admin.users.fixA1Warning": "Prefiera Platform Demo o una empresa explícita. No elimina feeds, mapeos ni productos en bruto. Protege las reglas de sobrescritura de la cohorte A1.", "admin.users.fixA1Cancel": "Cancelar", - "admin.users.fixA1Confirm": "Reparar catálogo", - "admin.users.noUsers": "Ningún usuario coincide con este filtro.", + "admin.users.fixA1Confirm": "Reparar catálogo", + "admin.users.noUsers": "Ningún usuario coincide con este filtro.", "admin.users.noCompanies": "Ninguna empresa coincide con este filtro.", "admin.users.assignRoleTitle": "Asignar rol de personal", "admin.users.assignRoleDesc": "Los roles de plataforma controlan el panel admin (Admin y Developer) y la mesa de soporte (personal de soporte).", "admin.users.staffRole": "Rol del personal", "admin.users.saveRole": "Guardar rol", "admin.users.assignPlanTitle": "Asignar plan", - "admin.users.assignPlanDesc": "Adjuntar un plan público, legacy o personalizado a esta empresa.", + "admin.users.assignPlanDesc": "Adjuntar un plan público, legacy o personalizado a esta empresa.", "admin.users.selectPlan": "Seleccionar plan", "admin.users.assign": "Asignar", "admin.settings.title": "Ajustes de plataforma", "admin.settings.description": "Credenciales de plataforma, roles de IA, correo e integraciones para este despliegue", - "admin.settings.intro": "Configure aquí roles de IA de plataforma, SMTP, OAuth, EPREL, Pinecone y Stripe. Deje en blanco los secretos para conservar el valor guardado. Las claves por empresa quedan en Integraciones del inquilino.", - "admin.settings.aiRolesUnavailable": "Los roles de IA completos aún no están disponibles en este despliegue. El procesamiento sigue guardándose vía ajustes OpenAI de plataforma; otros roles se persistirán cuando estén soportados.", + "admin.settings.intro": "Configure aquí roles de IA de plataforma, SMTP, OAuth, EPREL, Pinecone y Stripe. Deje en blanco los secretos para conservar el valor guardado. Las claves por empresa quedan en Integraciones del inquilino.", + "admin.settings.aiRolesUnavailable": "Los roles de IA completos aún no están disponibles en este despliegue. El procesamiento sigue guardándose vía ajustes OpenAI de plataforma; otros roles se persistirán cuando estén soportados.", "admin.settings.tab.integrations": "Resumen", "admin.settings.tab.ai": "Roles de IA", "admin.settings.tab.mail": "Correo", "admin.settings.tab.other": "Otro", "admin.settings.tab.admins": "Usuarios admin", - "admin.settings.mailCardDesc": "Invitaciones para establecer contraseña y correo saliente de la plataforma", + "admin.settings.mailCardDesc": "Invitaciones para establecer contraseña y correo saliente de la plataforma", "admin.settings.integrationsCardDesc": "OAuth, EPREL, Pinecone, Stripe, feeds", "admin.settings.tenantVsPlatform": "Inquilino vs plataforma", - "admin.settings.hostSecrets": "Secretos de base de datos, sesión y firma del servidor — configurar solo en el host", + "admin.settings.hostSecrets": "Secretos de base de datos, sesión y firma del servidor — configurar solo en el host", "admin.settings.linkAi": "IA", "admin.settings.linkEmail": "Correo", - "admin.settings.linkBilling": "Facturación", + "admin.settings.linkBilling": "Facturación", "admin.settings.provider": "Proveedor", "admin.settings.model": "Modelo", "admin.settings.baseUrl": "URL base", @@ -854,7 +854,7 @@ export const es: MessageDict = { "admin.settings.smtpHost": "Host SMTP", "admin.settings.port": "Puerto", "admin.settings.username": "Usuario", - "admin.settings.fromAddress": "Dirección remitente", + "admin.settings.fromAddress": "Dirección remitente", "admin.settings.testRecipient": "Destinatario de prueba (opcional)", "admin.settings.testRecipientPlaceholder": "Por defecto tu correo de admin", "admin.settings.googleOauth": "Google OAuth", @@ -879,7 +879,7 @@ export const es: MessageDict = { "admin.settings.priceScaleMo": "Scale monthly price ID", "admin.settings.priceScaleYr": "Scale yearly price ID", "admin.settings.creditPackPrices": "AI credit pack price IDs (one-time)", - "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", + "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", "admin.settings.syncCreditPacks": "Sync Stripe packs", "admin.settings.syncCreditPacksOk": "Synced {count} credit pack price(s) ({mode} mode).", "admin.settings.syncCreditPacksModeHint": "Stripe mode for this sync: {mode}. Switch the secret key (sk_test_ vs sk_live_) to sync the other environment.", @@ -894,30 +894,30 @@ export const es: MessageDict = { "admin.settings.colUserId": "ID de usuario", "admin.settings.colEmail": "Correo", "admin.settings.colName": "Nombre", - "admin.settings.colAddedOn": "Añadido el", + "admin.settings.colAddedOn": "Añadido el", "admin.settings.colRole": "Rol", "admin.settings.platformAdminBadge": "Admin de plataforma", "admin.settings.noAdmins": "No se encontraron usuarios admin", - "admin.settings.adminStatusCheck": "Comprobación de estado admin", - "admin.settings.bootstrapPage": "página bootstrap", - "admin.readiness.title": "Preparación del corte", - "admin.readiness.detail": "Contadores de hypercare que aún requieren atención antes del cambio de DNS.", - "admin.readiness.mustSetPassword": "{count} usuarios deben establecer contraseña", + "admin.settings.adminStatusCheck": "Comprobación de estado admin", + "admin.settings.bootstrapPage": "página bootstrap", + "admin.readiness.title": "Preparación del corte", + "admin.readiness.detail": "Contadores de hypercare que aún requieren atención antes del cambio de DNS.", + "admin.readiness.mustSetPassword": "{count} usuarios deben establecer contraseña", "admin.readiness.withoutAdmin": "{count} empresas sin administrador", "admin.readiness.withoutPlan": "{count} empresas sin plan activo", "admin.readiness.withoutApiKeys": "{count} companies needing API key reissue", - "admin.readiness.linksAria": "Enlaces profundos de preparación", + "admin.readiness.linksAria": "Enlaces profundos de preparación", "admin.readiness.linkUsers": "Usuarios", - "admin.readiness.linkBilling": "Facturación", + "admin.readiness.linkBilling": "Facturación", "admin.readiness.linkSettings": "Ajustes", "admin.readiness.linkApiKeys": "Keys needing reissue", "admin.diagnostics.eyebrow": "Plataforma", - "admin.diagnostics.title": "Diagnósticos", - "admin.diagnostics.description": "Consola ops de salud de la app, profundidad de cola, trabajos recientes y flags de configuración. Nunca se muestran secretos ni DSN; los errores de trabajos están sanitizados.", + "admin.diagnostics.title": "Diagnósticos", + "admin.diagnostics.description": "Consola ops de salud de la app, profundidad de cola, trabajos recientes y flags de configuración. Nunca se muestran secretos ni DSN; los errores de trabajos están sanitizados.", "admin.diagnostics.filterAria": "Filtro de estado del trabajo", "admin.diagnostics.queue": "Cola", "admin.diagnostics.noJobsInQueue": "No hay trabajos en cola.", - "admin.diagnostics.sanitizedErrors": "Errores sanitizados · máx. 25", + "admin.diagnostics.sanitizedErrors": "Errores sanitizados · máx. 25", "admin.diagnostics.colId": "ID", "admin.diagnostics.colCompany": "Empresa", "admin.diagnostics.colStatus": "Estado", @@ -925,18 +925,18 @@ export const es: MessageDict = { "admin.diagnostics.colUpdated": "Actualizado", "admin.diagnostics.colError": "Error", "admin.diagnostics.colTicket": "Ticket", - "admin.diagnostics.colWhen": "Cuándo", + "admin.diagnostics.colWhen": "Cuándo", "admin.diagnostics.noJobsFilter": "No hay trabajos para este filtro.", "admin.stuck.title": "Productos atascados", - "admin.stuck.description": "Revisa trabajos de procesamiento recientes y restablece los atascados más de 2 horas", + "admin.stuck.description": "Revisa trabajos de procesamiento recientes y restablece los atascados más de 2 horas", "admin.stuck.noJobs": "No se encontraron trabajos.", "admin.stuck.filterAria": "Filtrar trabajos por estado", "admin.orphan.title": "Orphan processed", - "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", + "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", "admin.orphan.cutoverHint": "Safe by default: refresh and dry-run never delete. Confirm delete sends confirm=true only after you approve the dialog.", "admin.orphan.refreshReport": "Refresh report", "admin.orphan.dryRunBtn": "Dry-run cleanup", - "admin.orphan.deleteBtn": "Confirm delete…", + "admin.orphan.deleteBtn": "Confirm delete…", "admin.orphan.loadFailed": "Could not load orphan report", "admin.orphan.dryRunFailed": "Dry-run cleanup failed", "admin.orphan.deleteFailed": "Confirmed orphan cleanup failed", @@ -947,7 +947,7 @@ export const es: MessageDict = { "admin.orphan.samplesDesc": "Up to 25 most recently updated orphan catalog rows", "admin.orphan.cleanBadge": "Clean", "admin.orphan.needsCleanupBadge": "Needs cleanup", - "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", + "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", "admin.orphan.noSamples": "No sample rows in this report.", "admin.orphan.colProcessed": "Processed ID", "admin.orphan.colCompany": "Company", @@ -962,48 +962,48 @@ export const es: MessageDict = { "admin.orphan.confirmTitle": "Delete orphan processed rows?", "admin.orphan.confirmDesc": "This permanently deletes {total} processed_products row(s) whose raw is missing or unprocessed. Job product links use ON DELETE SET NULL.", "admin.orphan.confirmDelete": "Delete orphans", - "admin.billing.title": "Admin de facturación", - "admin.billing.description": "Gestiona planes, créditos, permisos de funciones por paquete e interruptores de funciones de toda la plataforma.", + "admin.billing.title": "Admin de facturación", + "admin.billing.description": "Gestiona planes, créditos, permisos de funciones por paquete e interruptores de funciones de toda la plataforma.", "admin.billing.noCompanies": "No se encontraron empresas.", "admin.billing.noCompaniesFilter": "Ninguna empresa coincide con este filtro.", "admin.billing.assignPlanTitle": "Asignar plan", - "admin.billing.assignPlanDesc": "Adjunta un plan de facturación a una empresa. Los créditos de prueba opcionales restablecen el saldo de la empresa para el período de prueba.", - "admin.billing.creditsTitle": "Añadir / ajustar créditos", + "admin.billing.assignPlanDesc": "Adjunta un plan de facturación a una empresa. Los créditos de prueba opcionales restablecen el saldo de la empresa para el período de prueba.", + "admin.billing.creditsTitle": "Añadir / ajustar créditos", "admin.billing.creditsDesc": "Acreditar o debitar el saldo de una empresa.", - "admin.billing.searchCompany": "Buscar empresa…", + "admin.billing.searchCompany": "Buscar empresa…", "admin.knowledge.draft": "Borrador", "admin.knowledge.badge.draft": "Borrador", - "admin.knowledge.newArticle": "Nuevo artículo", - "admin.knowledge.editArticle": "Editar artículo", - "admin.knowledge.noMatchingArticles": "No hay artículos coincidentes", - "admin.knowledge.noArticles": "No hay artículos de conocimiento", - "admin.knowledge.emptyCategoryMsg": "La categoría “{category}” está lista — añade un artículo base para que un agente de contenido lo complete.", - "admin.knowledge.emptyArticlesMsg": "Añade plantillas tipo FAQ con categorías y palabras clave. Deja marcadores en el cuerpo para agentes de contenido.", - "admin.knowledge.col.title": "Título", + "admin.knowledge.newArticle": "Nuevo artículo", + "admin.knowledge.editArticle": "Editar artículo", + "admin.knowledge.noMatchingArticles": "No hay artículos coincidentes", + "admin.knowledge.noArticles": "No hay artículos de conocimiento", + "admin.knowledge.emptyCategoryMsg": "La categoría “{category}” está lista — añade un artículo base para que un agente de contenido lo complete.", + "admin.knowledge.emptyArticlesMsg": "Añade plantillas tipo FAQ con categorías y palabras clave. Deja marcadores en el cuerpo para agentes de contenido.", + "admin.knowledge.col.title": "Título", "admin.knowledge.col.name": "Nombre", "admin.knowledge.edit": "Editar", "admin.knowledge.newTemplate": "Nueva plantilla", "admin.knowledge.editTemplate": "Editar plantilla", "admin.knowledge.allCategories": "Todo", "admin.settings.enablePlatformSmtp": "Activar SMTP de plataforma", - "admin.plans.title": "Planes de suscripción", - "admin.plans.description": "Público ladder, A1 / Legado, Plataforma Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Oculto.", - "admin.plans.searchPlaceholder": "Buscar nombre o descripción…", + "admin.plans.title": "Planes de suscripción", + "admin.plans.description": "Público ladder, A1 / Legado, Plataforma Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Oculto.", + "admin.plans.searchPlaceholder": "Buscar nombre o descripción…", "admin.plans.searchAria": "Buscar planes", "admin.plans.filterAria": "Filtrar planes por visibilidad", - "admin.plans.filter.catalog": "Catálogo", - "admin.plans.filter.public": "Público", + "admin.plans.filter.catalog": "Catálogo", + "admin.plans.filter.public": "Público", "admin.plans.filter.legacy": "Legacy", "admin.plans.filter.custom": "Personalizado", "admin.plans.filter.hidden": "Oculto", "admin.plans.filter.all": "Todo", "admin.plans.col.plan": "Plan tarifario", "admin.plans.col.visibility": "Visibilidad", - "admin.plans.col.monthlyCredits": "Créditos mensuales", - "admin.plans.col.maxProducts": "Productos máx.", + "admin.plans.col.monthlyCredits": "Créditos mensuales", + "admin.plans.col.maxProducts": "Productos máx.", "admin.plans.col.term": "Plazo", "admin.plans.customPackageFlag": "Marca de paquete personalizado", - "admin.plans.visibility.public": "Público", + "admin.plans.visibility.public": "Público", "admin.plans.visibility.legacy": "Legacy", "admin.plans.visibility.hidden": "Oculto", "admin.plans.visibility.custom": "Personalizado", @@ -1015,9 +1015,9 @@ export const es: MessageDict = { "admin.plans.permissionsAria": "Editar permisos del plan for {name}", "admin.plans.showing": "Mostrando {filtered} de {total} planes", "admin.plans.unlimited": "Ilimitado", - "admin.plans.optionLabel": "{name} ({credits} créditos) · {kind}", + "admin.plans.optionLabel": "{name} ({credits} créditos) · {kind}", "admin.permissions.noteStrong": "Solo derechos del plan.", - "admin.permissions.noteBody": "These toggles set what this package may include. Plataforma-wide on/desactivado masters are on the {global} tab — a plan can enable a feature that still stays desactivado when the platform switch is desactivado.", + "admin.permissions.noteBody": "These toggles set what this package may include. Plataforma-wide on/desactivado masters are on the {global} tab — a plan can enable a feature that still stays desactivado when the platform switch is desactivado.", "admin.permissions.globalTab": "Interruptores globales", "admin.permissions.title": "Permisos del plan", "admin.permissions.descCount": "{enabled}/{total} activados", @@ -1025,8 +1025,8 @@ export const es: MessageDict = { "admin.permissions.customizedOverrides": "anulaciones personalizadas", "admin.permissions.planDefaults": "valores predeterminados del plan", "admin.permissions.badge.legacy": "Paquete legado migrado", - "admin.permissions.badge.publicLadder": "Público ladder", - "admin.permissions.badge.ladderCustom": "Público ladder · personalizado flag", + "admin.permissions.badge.publicLadder": "Público ladder", + "admin.permissions.badge.ladderCustom": "Público ladder · personalizado flag", "admin.permissions.badge.customDeal": "Personalizado deal", "admin.permissions.badge.clientDeal": "Acuerdo con cliente", "admin.permissions.badge.customOverrides": "Personalizado overrides", @@ -1034,10 +1034,10 @@ export const es: MessageDict = { "admin.permissions.badge.customFlag": "Personalizado flag", "admin.permissions.package": "Paquete", "admin.permissions.noPlans": "Sin planes", - "admin.permissions.suffix.legacy": "· legacy", - "admin.permissions.suffix.default": " · predeterminado", - "admin.permissions.suffix.custom": " · personalizado", - "admin.permissions.section": "Sección", + "admin.permissions.suffix.legacy": "· legacy", + "admin.permissions.suffix.default": " · predeterminado", + "admin.permissions.suffix.custom": " · personalizado", + "admin.permissions.section": "Sección", "admin.permissions.allSections": "Todas las secciones", "admin.permissions.state": "Estado", "admin.permissions.stateAll": "Todo", @@ -1056,9 +1056,9 @@ export const es: MessageDict = { "admin.permissions.disableAll": "Desactivar todo", "admin.permissions.clearOverrides": "Borrar anulaciones", "admin.permissions.globallyOff": "Globally desactivado", - "admin.permissions.enableSection": "Activar sección", - "admin.permissions.disableSection": "Desactivar sección", - "admin.permissions.noMatch": "Ninguna función coincide con los filtros actuales.", + "admin.permissions.enableSection": "Activar sección", + "admin.permissions.disableSection": "Desactivar sección", + "admin.permissions.noMatch": "Ninguna función coincide con los filtros actuales.", "admin.permissions.differs": "Difiere", "admin.permissions.platformOffHint": "Desactivado en toda la plataforma even if this plan enables it.", "admin.permissions.sectionToggled": "{label} {state} para este plan.", @@ -1066,26 +1066,26 @@ export const es: MessageDict = { "admin.permissions.state.disabled": "desactivado", "admin.permissions.loadFailed": "Error al cargar permisos del plan", "admin.permissions.saveFailed": "Error al guardar feature", - "admin.permissions.enableAllFailed": "Activar todo falló", - "admin.permissions.disableAllFailed": "Desactivar todo falló", + "admin.permissions.enableAllFailed": "Activar todo falló", + "admin.permissions.disableAllFailed": "Desactivar todo falló", "admin.permissions.profileFailed": "Error al apply profile", "admin.permissions.resetFailed": "Error al reset defaults", - "admin.permissions.sectionFailed": "Sección update falló", + "admin.permissions.sectionFailed": "Sección update falló", "admin.profile.legacy.label": "Legacy", - "admin.profile.legacy.description": "Migrated legacy navigation: catalog, feeds, facturación, and configuración; no Atrásground Tasks, tiendas, or marketing.", + "admin.profile.legacy.description": "Migrated legacy navigation: catalog, feeds, facturación, and configuración; no Atrásground Tasks, tiendas, or marketing.", "admin.profile.free.label": "Gratis", - "admin.profile.free.description": "Público Free ladder — AI, clave APIs, live email, and own-key AI desactivado.", + "admin.profile.free.description": "Público Free ladder — AI, clave APIs, live email, and own-key AI desactivado.", "admin.profile.starter.label": "Starter", - "admin.profile.starter.description": "Público Starter — AI on; own-key AI desactivado.", + "admin.profile.starter.description": "Público Starter — AI on; own-key AI desactivado.", "admin.profile.growth.label": "Growth", - "admin.profile.growth.description": "Todas las funciones del catálogo activadas.", + "admin.profile.growth.description": "Todas las funciones del catálogo activadas.", "admin.profile.business.label": "Business", - "admin.profile.business.description": "Todas las funciones del catálogo activadas.", + "admin.profile.business.description": "Todas las funciones del catálogo activadas.", "admin.profile.enterprise.label": "Enterprise / todo activado", "admin.profile.enterprise.description": "Full matriz de funciones (custom and Enterprise default).", "admin.gates.noteStrong": "Plataforma-wide masters.", - "admin.gates.noteBody": "Estos interruptores se aplican a todos los paquetes. El acceso efectivo es {combo}. Los derechos por paquete están en la pestaña {permissions}.", - "admin.gates.combo": "permiso del plan Y sección global Y función global", + "admin.gates.noteBody": "Estos interruptores se aplican a todos los paquetes. El acceso efectivo es {combo}. Los derechos por paquete están en la pestaña {permissions}.", + "admin.gates.combo": "permiso del plan Y sección global Y función global", "admin.gates.permissionsTab": "Permisos del plan", "admin.gates.sectionsOff": "{count} section desactivado", "admin.gates.sectionsOffPlural": "{count} sections desactivado", @@ -1093,20 +1093,20 @@ export const es: MessageDict = { "admin.gates.featuresOffPlural": "{count} feature masters desactivado", "admin.gates.title": "Maestros de funciones globales", "admin.gates.description": "Disable a feature here to turn it desactivado for every package, even when a plan enables it.", - "admin.gates.section": "Sección", + "admin.gates.section": "Sección", "admin.gates.allSections": "Todas las secciones", "admin.gates.search": "Buscar", "admin.gates.searchPlaceholder": "Filtrar por clave o etiqueta", - "admin.gates.sectionOff": "Sección desactivado", - "admin.gates.noMatch": "Ninguna función coincide con los filtros actuales.", + "admin.gates.sectionOff": "Sección desactivado", + "admin.gates.noMatch": "Ninguna función coincide con los filtros actuales.", "admin.gates.featureAria": "{label} global", - "admin.gates.sectionsTitle": "Interruptores de sección global", - "admin.gates.sectionsDesc": "Turn an entire producto area on or desactivado for all packages. “Sección + features” also updates every feature master in that section.", - "admin.gates.sectionAria": "Sección global {label}", - "admin.gates.enableSectionFeatures": "Activar sección + funciones", - "admin.gates.disableSectionFeatures": "Desactivar sección + funciones", + "admin.gates.sectionsTitle": "Interruptores de sección global", + "admin.gates.sectionsDesc": "Turn an entire producto area on or desactivado for all packages. “Sección + features” also updates every feature master in that section.", + "admin.gates.sectionAria": "Sección global {label}", + "admin.gates.enableSectionFeatures": "Activar sección + funciones", + "admin.gates.disableSectionFeatures": "Desactivar sección + funciones", "admin.gates.sectionSuccess": "{label} {state} para todos los paquetes.", - "admin.gates.sectionSuccessWithFeatures": "{label} {state} para todos los paquetes (maestros de sección y función).", + "admin.gates.sectionSuccessWithFeatures": "{label} {state} para todos los paquetes (maestros de sección y función).", "admin.gates.featureSuccess": "{key} {state} globalmente.", "admin.gates.state.enabled": "activado", "admin.gates.state.disabled": "desactivado", @@ -1116,22 +1116,22 @@ export const es: MessageDict = { "admin.billing.createPlan": "Crear plan", "admin.billing.assignPlanBtn": "Asignar plan", "admin.billing.stat.plans": "Planes", - "admin.billing.stat.catalogHidden": "{catalog} catálogo · {hidden} ocultos", - "admin.billing.stat.creditsAllocated": "Créditos allocated", + "admin.billing.stat.catalogHidden": "{catalog} catálogo · {hidden} ocultos", + "admin.billing.stat.creditsAllocated": "Créditos allocated", "admin.billing.stat.acrossCompanies": "Across empresas on this page (first 50)", - "admin.billing.stat.creditsUsed": "Créditos used", - "admin.billing.stat.creditsConsumed": "Créditos consumed on this page", + "admin.billing.stat.creditsUsed": "Créditos used", + "admin.billing.stat.creditsConsumed": "Créditos consumed on this page", "admin.billing.stat.noActivePlan": "Sin plan activo", "admin.billing.stat.noActivePlanHint": "Empresas with no active subscription (this page)", "admin.billing.tab.plans": "Planes", "admin.billing.tab.permissions": "Permisos del plan", "admin.billing.tab.global": "Interruptores globales", "admin.billing.tab.companies": "Empresas", - "admin.billing.cyclesTitle": "Facturación cycles", - "admin.billing.cyclesDesc": "Process due renewals for empresas on scheduled ciclos de facturación.", - "admin.billing.runCycles": "Run due ciclos de facturación", + "admin.billing.cyclesTitle": "Facturación cycles", + "admin.billing.cyclesDesc": "Process due renewals for empresas on scheduled ciclos de facturación.", + "admin.billing.runCycles": "Run due ciclos de facturación", "admin.billing.companiesTitle": "Empresas", - "admin.billing.companiesDesc": "Saldos de créditos y estado del plan — asigna planes o ajusta créditos.", + "admin.billing.companiesDesc": "Saldos de créditos y estado del plan — asigna planes o ajusta créditos.", "admin.billing.searchCompaniesAria": "Buscar empresas", "admin.billing.planStatusAria": "Estado del plan", "admin.billing.filter.all": "Todo empresas", @@ -1139,106 +1139,106 @@ export const es: MessageDict = { "admin.billing.filter.withoutPlan": "Sin plan activo", "admin.billing.col.company": "Empresa", "admin.billing.col.planStatus": "Estado del plan", - "admin.billing.col.creditsRemaining": "Créditos restantes", + "admin.billing.col.creditsRemaining": "Créditos restantes", "admin.billing.col.total": "Total", "admin.billing.col.used": "Usados", "admin.billing.col.usagePct": "% de uso", "admin.billing.badge.noPlan": "Sin plan", "admin.billing.badge.active": "Activo", "admin.billing.assignPlanAria": "Asignar plan a {name}", - "admin.billing.addCredits": "Añadir créditos", - "admin.billing.addCreditsAria": "Añadir credits for {name}", + "admin.billing.addCredits": "Añadir créditos", + "admin.billing.addCreditsAria": "Añadir credits for {name}", "admin.billing.showingCompanies": "Mostrando {filtered} de {total} empresas", "admin.billing.editPlanTitle": "Editar plan", "admin.billing.createPlanTitle": "Crear plan", "admin.billing.editPlanDesc": "Update credits, producto caps, and whether this plan is marked custom.", "admin.billing.createPlanDesc": "Crear a package. Personalizado plans stay hidden from public pricing.", "admin.billing.field.name": "Nombre", - "admin.billing.field.description": "Descripción", + "admin.billing.field.description": "Descripción", "admin.billing.field.descriptionPlaceholder": "Opcional short summary for admins", - "admin.billing.field.monthlyCredits": "Créditos mensuales", - "admin.billing.field.yearlyCredits": "Créditos anuales", - "admin.billing.field.maxProducts": "Productos máx.", - "admin.billing.field.maxProductsPlaceholder": "Vacío = ilimitado", + "admin.billing.field.monthlyCredits": "Créditos mensuales", + "admin.billing.field.yearlyCredits": "Créditos anuales", + "admin.billing.field.maxProducts": "Productos máx.", + "admin.billing.field.maxProductsPlaceholder": "Vacío = ilimitado", "admin.billing.field.term": "Plazo", "admin.billing.term.monthly": "Mensual", "admin.billing.term.yearly": "Anual", "admin.billing.customPackage": "Personalizado package", - "admin.billing.customPackageHint": "Oculto from public pricing. Use for client deals; leave desactivado for Free–Business.", + "admin.billing.customPackageHint": "Oculto from public pricing. Use for client deals; leave desactivado for Free–Business.", "admin.billing.previewBadge": "Insignia de vista previa: {preview}.", "admin.billing.company": "Empresa", "admin.billing.selectCompany": "Seleccionar empresa", - "admin.billing.noPlanSuffix": "· no plan", + "admin.billing.noPlanSuffix": "· no plan", "admin.billing.plan": "Plan tarifario", "admin.billing.selectPlan": "Seleccionar plan", - "admin.billing.trialAssignment": "Asignación de prueba", + "admin.billing.trialAssignment": "Asignación de prueba", "admin.billing.trialHint": "Opcional trial flag + credit grant for sales or evaluation trials.", - "admin.billing.trialCredits": "Créditos de prueba", + "admin.billing.trialCredits": "Créditos de prueba", "admin.billing.assign": "Asignar", "admin.billing.amount": "Importe", "admin.billing.amountHint": "Usa un valor negativo para debitar.", "admin.billing.apply": "Aplicar", "admin.billing.planUpdated": "Plan actualizado.", "admin.billing.planCreated": "Plan creado.", - "admin.billing.loadFailed": "Error al cargar facturación data", - "admin.billing.updateFailed": "Update plan falló", - "admin.billing.createFailed": "Crear plan falló", - "admin.billing.assignFailed": "Assign falló", - "admin.billing.creditsFailed": "Add credits falló", - "admin.billing.cyclesFailed": "Run cycles falló", + "admin.billing.loadFailed": "Error al cargar facturación data", + "admin.billing.updateFailed": "Update plan falló", + "admin.billing.createFailed": "Crear plan falló", + "admin.billing.assignFailed": "Assign falló", + "admin.billing.creditsFailed": "Add credits falló", + "admin.billing.cyclesFailed": "Run cycles falló", "admin.knowledge.supportInbox": "Soporte inbox", "admin.knowledge.aiRoles": "Roles de IA", - "admin.knowledge.tab.articles": "Artículos", + "admin.knowledge.tab.articles": "Artículos", "admin.knowledge.tab.templates": "Plantillas", - "admin.knowledge.tab.settings": "Respuesta automática", + "admin.knowledge.tab.settings": "Respuesta automática", "admin.knowledge.allStatuses": "Todo statuses", "admin.knowledge.published": "Publicado", "admin.knowledge.createArticle": "Crear article", - "admin.knowledge.col.categories": "Categorías", + "admin.knowledge.col.categories": "Categorías", "admin.knowledge.col.status": "Estado", "admin.knowledge.col.keywords": "Palabras clave", "admin.knowledge.badge.published": "Publicado", "admin.knowledge.createTemplate": "Crear template", "admin.knowledge.badge.active": "Activo", "admin.knowledge.badge.inactive": "Inactivo", - "admin.knowledge.autoFirstResponses": "Activar primeras respuestas automáticas", + "admin.knowledge.autoFirstResponses": "Activar primeras respuestas automáticas", "admin.knowledge.faqMatching": "Coincidencia FAQ / plantilla", "admin.knowledge.retryOnReply": "Reintentar on first customer reply (if no prior auto)", "admin.knowledge.matchThreshold": "Umbral de confianza de coincidencia", "admin.knowledge.enableAiFallback": "Activar respaldo de IA", "admin.knowledge.deliveryMode": "Modo de entrega", "admin.knowledge.delivery.draft": "Solo borrador (nota interna)", - "admin.knowledge.delivery.autoSend": "Envío automático al cliente", + "admin.knowledge.delivery.autoSend": "Envío automático al cliente", "admin.knowledge.aiThreshold": "Umbral de confianza de la IA", "admin.knowledge.usePlatformRole": "Use platform soporte AI role (recommended)", "admin.knowledge.modelOverride": "Modelo override", "admin.knowledge.providerOverride": "Proveedor override", - "admin.knowledge.baseUrlOverride": "Anulación de URL base", + "admin.knowledge.baseUrlOverride": "Anulación de URL base", "admin.knowledge.supportAiRoleTitle": "Soporte AI role (fallback provider)", "admin.knowledge.configured": "Configurado", "admin.knowledge.notReadyBadge": "No listo", "admin.knowledge.enabled": "Activado", "admin.knowledge.disabled": "Desactivado", - "admin.knowledge.openAiRoles": "Abrir Plataforma configuración → AI roles", - "admin.knowledge.field.title": "Título", + "admin.knowledge.openAiRoles": "Abrir Plataforma configuración → AI roles", + "admin.knowledge.field.title": "Título", "admin.knowledge.field.slug": "Slug", "admin.knowledge.field.body": "Cuerpo (markdown)", "admin.knowledge.field.keywords": "Palabras clave", "admin.knowledge.keywordsPlaceholder": "separados por comas", - "admin.knowledge.field.intents": "Claves de intención", + "admin.knowledge.field.intents": "Claves de intención", "admin.knowledge.intentsPlaceholder": "separados por comas", - "admin.knowledge.field.categories": "Categoría slugs", - "admin.knowledge.categoriesPlaceholder": "facturación, account…", + "admin.knowledge.field.categories": "Categoría slugs", + "admin.knowledge.categoriesPlaceholder": "facturación, account…", "admin.knowledge.field.weight": "Peso de prioridad", "admin.knowledge.publishedEligible": "Publicado (elegible para coincidencia)", "admin.knowledge.field.name": "Nombre", "admin.knowledge.field.templateBody": "Cuerpo", "admin.knowledge.active": "Activo", "admin.settings.card.aiRolesTitle": "Plataforma AI roles", - "admin.settings.card.aiRolesDesc": "Procesamiento, vectorization, docs/API, and soporte — separate keys/models", + "admin.settings.card.aiRolesDesc": "Procesamiento, vectorization, docs/API, and soporte — separate keys/models", "admin.settings.roleOff": " (desactivado)", - "admin.settings.roleNotSet": "· not set", - "admin.settings.someRolesUnavailable": "Some AI roles are not disponible on this deployment yet. Procesamiento still uses the platform AbrirAI configuración until all roles are soporteed.", + "admin.settings.roleNotSet": "· not set", + "admin.settings.someRolesUnavailable": "Some AI roles are not disponible on this deployment yet. Procesamiento still uses the platform AbrirAI configuración until all roles are soporteed.", "admin.settings.configure": "Configurar", "admin.settings.card.smtpTitle": "Plataforma SMTP", "admin.settings.configured": "Configurado", @@ -1246,7 +1246,7 @@ export const es: MessageDict = { "admin.settings.source": "origen: {source}", "admin.settings.smtpEnabled": "SMTP activado", "admin.settings.smtpDisabled": "SMTP desactivado", - "admin.settings.passwordSet": "· password set", + "admin.settings.passwordSet": "· password set", "admin.settings.card.otherTitle": "Otras integraciones", "admin.settings.oauthSet": "Google OAuth configurado", "admin.settings.oauthOff": "Google OAuth desactivado", @@ -1256,26 +1256,26 @@ export const es: MessageDict = { "admin.settings.pineconeOff": "Pinecone desactivado", "admin.settings.stripeSet": "Stripe configurado", "admin.settings.stripeOff": "Stripe desactivado", - "admin.settings.password": "Contraseña", - "admin.settings.passwordSavedHint": "(guardado — leave blank to keep)", + "admin.settings.password": "Contraseña", + "admin.settings.passwordSavedHint": "(guardado — leave blank to keep)", "admin.settings.secretKey": "Clave secreta", - "admin.settings.secretConfiguredHint": "(configurado — deja en blanco para mantener)", - "admin.settings.passwordConfigured": "Contraseña configured", - "admin.settings.noSmtpPassword": "Sin contraseña SMTP", + "admin.settings.secretConfiguredHint": "(configurado — deja en blanco para mantener)", + "admin.settings.passwordConfigured": "Contraseña configured", + "admin.settings.noSmtpPassword": "Sin contraseña SMTP", "admin.settings.enabled": "Activado", "admin.settings.disabled": "Desactivado", "admin.settings.saveRole": "Guardar {label}", - "admin.settings.testConnection": "Probar conexión", - "admin.settings.saveMail": "Guardar mail configuración", + "admin.settings.testConnection": "Probar conexión", + "admin.settings.saveMail": "Guardar mail configuración", "admin.settings.saveIntegrations": "Guardar integrations", "admin.settings.eprelEnabled": "EPREL enrichment activado", - "admin.settings.loadFailed": "Plataforma configuración could not be loaded. Saving is desactivado until reload succeeds.", + "admin.settings.loadFailed": "Plataforma configuración could not be loaded. Saving is desactivado until reload succeeds.", "admin.settings.testAccepted": "Mensaje de prueba aceptado por SMTP", - "admin.stuck.cleanupBtn": "Limpieza de trabajos atascados (>2 h en ejecución)", + "admin.stuck.cleanupBtn": "Limpieza de trabajos atascados (>2 h en ejecución)", "admin.stuck.jobsTitle": "Trabajos de procesamiento", - "admin.stuck.jobsDesc": "Últimos 100 trabajos · {running} en ejecución", + "admin.stuck.jobsDesc": "Últimos 100 trabajos · {running} en ejecución", "admin.stuck.filterAll": "Todo", - "admin.stuck.filterRunning": "En ejecución", + "admin.stuck.filterRunning": "En ejecución", "admin.stuck.filterFailed": "Fallido", "admin.stuck.filterPending": "Pendiente", "admin.stuck.filterCompleted": "Completado", @@ -1286,17 +1286,17 @@ export const es: MessageDict = { "admin.stuck.colUpdated": "Actualizado", "admin.stuck.colError": "Error", "admin.stuck.loadFailed": "No se pudieron cargar los trabajos", - "admin.stuck.cleanupFailed": "Falló la limpieza", - "admin.support.knowledgeLink": "Conocimiento y respuesta automática", + "admin.stuck.cleanupFailed": "Falló la limpieza", + "admin.support.knowledgeLink": "Conocimiento y respuesta automática", "admin.support.queueTitle": "Cola de tickets", - "admin.support.queueMeta": "{total} · ámbito {scope}", - "admin.support.queueMetaStatus": "· estado {status}", + "admin.support.queueMeta": "{total} · ámbito {scope}", + "admin.support.queueMetaStatus": "· estado {status}", "admin.support.ticketCountOne": "{count} ticket", "admin.support.ticketCountMany": "{count} tickets", "admin.support.statusAll": "Todo statuses", "admin.support.scopeAll": "Todo tickets", "admin.support.scopeInbox": "Bandeja", - "admin.support.scopeMine": "Míos", + "admin.support.scopeMine": "Míos", "admin.support.scopeUnassigned": "Sin asignar", "admin.support.flagAny": "Cualquier estado auto", "admin.support.flagNeedsHuman": "Necesita humano", @@ -1313,13 +1313,13 @@ export const es: MessageDict = { "admin.support.claim": "Reclamar", "admin.support.claimAria": "Reclamar ticket {subject}", "admin.support.unassigned": "Sin asignar", - "admin.support.you": "Tú", + "admin.support.you": "Tú", "admin.support.assigned": "Asignado", "admin.support.loadQueueFailed": "No se pudo cargar la cola de soporte", "admin.support.claimFailed": "No se pudo reclamar el ticket", "admin.support.ticketFallbackTitle": "Soporte ticket", - "admin.support.ticketMeta": "{company} · {requester}", - "admin.support.ticketMetaFallback": "Hilo de revisión del personal", + "admin.support.ticketMeta": "{company} · {requester}", + "admin.support.ticketMetaFallback": "Hilo de revisión del personal", "admin.support.companyFallback": "Empresa", "admin.support.requesterFallback": "solicitante", "admin.support.backQueue": "Cola", @@ -1327,35 +1327,35 @@ export const es: MessageDict = { "admin.support.markPending": "Marcar pendiente", "admin.support.reopen": "Reabrir", "admin.support.assigneeLabel": "Asignado:", - "admin.support.unassign": "Quitar asignación", + "admin.support.unassign": "Quitar asignación", "admin.support.assignToStaff": "Asignar al personal", "admin.support.apply": "Aplicar", "admin.support.autoPanelTitle": "Auto-match / asistencia IA", - "admin.support.autoPanelDesc": "Resultado solo para el personal del match FAQ y borrador/envío IA. Los clientes nunca ven borradores.", + "admin.support.autoPanelDesc": "Resultado solo para el personal del match FAQ y borrador/envío IA. Los clientes nunca ven borradores.", "admin.support.autoDisabledBadge": "Auto desactivado", "admin.support.autoStatusLabel": "Estado:", - "admin.support.lastAttempt": "Último intento:", + "admin.support.lastAttempt": "Último intento:", "admin.support.reenableAuto": "Reactivar auto", "admin.support.disableAuto": "Desactivar auto para este ticket", "admin.support.aiDraftTitle": "Borrador IA (aprobar o editar)", - "admin.support.aiDraftDesc": "El modo solo borrador dejó una nota interna. Edite si hace falta, luego envíe al cliente — o descarte y tome el control manualmente.", + "admin.support.aiDraftDesc": "El modo solo borrador dejó una nota interna. Edite si hace falta, luego envíe al cliente — o descarte y tome el control manualmente.", "admin.support.confidence": "Confianza {value}", - "admin.support.statusAfterSend": "Estado tras el envío", + "admin.support.statusAfterSend": "Estado tras el envío", "admin.support.approveSend": "Aprobar y enviar", "admin.support.discardDraft": "Descartar borrador", "admin.support.threadTitle": "Hilo", - "admin.support.threadMeta": "{count} · última actividad {when}", + "admin.support.threadMeta": "{count} · última actividad {when}", "admin.support.messageCountOne": "{count} mensaje", "admin.support.messageCountMany": "{count} mensajes", "admin.support.replyTitle": "Responder", - "admin.support.replyDesc": "Las respuestas públicas notifican al cliente. Las notas internas solo las ve el personal. El estado por defecto tras una respuesta pública es pendiente.", + "admin.support.replyDesc": "Las respuestas públicas notifican al cliente. Las notas internas solo las ve el personal. El estado por defecto tras una respuesta pública es pendiente.", "admin.support.internalNote": "Nota interna (no visible para el cliente)", "admin.support.setStatus": "Establecer estado", "admin.support.statusDefault": "Predeterminado", "admin.support.saveNote": "Guardar nota", "admin.support.sendReply": "Enviar respuesta", "admin.support.replyAndResolve": "Responder y resolver", - "admin.support.closedBanner": "Este ticket está cerrado. Reábralo para continuar la conversación.", + "admin.support.closedBanner": "Este ticket está cerrado. Reábralo para continuar la conversación.", "admin.support.priorityMeta": "prioridad {priority}", "admin.support.authorAiDraft": "Borrador IA (solo personal)", "admin.support.authorInternal": "Nota interna", @@ -1367,121 +1367,121 @@ export const es: MessageDict = { "admin.support.flash.pending": "Ticket marcado como pendiente (esperando al cliente).", "admin.support.flash.reopened": "Ticket reabierto.", "admin.support.flash.statusSet": "Estado del ticket establecido en {status}.", - "admin.support.flash.autoDisabled": "Respuestas automáticas desactivadas para este ticket.", - "admin.support.flash.autoEnabled": "Respuestas automáticas reactivadas para este ticket.", + "admin.support.flash.autoDisabled": "Respuestas automáticas desactivadas para este ticket.", + "admin.support.flash.autoEnabled": "Respuestas automáticas reactivadas para este ticket.", "admin.support.loadTicketFailed": "Error al cargar el ticket", "admin.support.replyFailed": "No se pudo enviar la respuesta", "admin.support.statusFailed": "No se pudo actualizar el estado", - "admin.support.unassignFailed": "No se pudo quitar la asignación", + "admin.support.unassignFailed": "No se pudo quitar la asignación", "admin.support.assignFailed": "No se pudo asignar el ticket", - "admin.support.autoFailed": "No se pudo actualizar la respuesta automática", + "admin.support.autoFailed": "No se pudo actualizar la respuesta automática", "admin.support.approveFailed": "No se pudo aprobar el borrador IA", "admin.support.discardFailed": "No se pudo descartar el borrador IA", "admin.settings.sourceResolved": "Resuelto desde {sources}", - "admin.settings.sourceUpdated": " · actualizado {when}", + "admin.settings.sourceUpdated": " · actualizado {when}", "admin.settings.updatedAt": "Actualizado {when}", - "admin.settings.tenantDesc": "Las claves de IA y el correo de marketing de la empresa permanecen en Integraciones. Los secretos de sesión y cifrado quedan en el entorno del servidor y no se editan aquí.", - "admin.settings.perCompanyAiEmail": "IA/correo por empresa —", - "admin.settings.plansCredits": "Planes y créditos —", + "admin.settings.tenantDesc": "Las claves de IA y el correo de marketing de la empresa permanecen en Integraciones. Los secretos de sesión y cifrado quedan en el entorno del servidor y no se editan aquí.", + "admin.settings.perCompanyAiEmail": "IA/correo por empresa —", + "admin.settings.plansCredits": "Planes y créditos —", "admin.settings.fromDatabase": "Desde la base de datos", "admin.settings.fromEnvironment": "Desde el entorno", "admin.settings.sourceBadge": "Origen: {source}", "admin.settings.storedKey": "Clave guardada: {masked}", "admin.settings.enableRole": "Activar este rol", "admin.settings.clearApiKey": "Borrar clave API guardada", - "admin.settings.apiKeyKeepPlaceholder": "•••• déjela en blanco para conservar", - "admin.settings.apiKeyNewPlaceholder": "sk-… o local", + "admin.settings.apiKeyKeepPlaceholder": "•••• déjela en blanco para conservar", + "admin.settings.apiKeyNewPlaceholder": "sk-… o local", "admin.settings.smtpCardTitle": "Plataforma SMTP", - "admin.settings.smtpCardDesc": "Se usa para invitaciones de contraseña y correo saliente de plataforma. Resend/SMTP de marketing sigue por empresa en Integraciones → Correo.", + "admin.settings.smtpCardDesc": "Se usa para invitaciones de contraseña y correo saliente de plataforma. Resend/SMTP de marketing sigue por empresa en Integraciones → Correo.", "admin.settings.smtpBadgeOn": "SMTP activado", "admin.settings.smtpBadgeOff": "SMTP desactivado", "admin.settings.enableSmtp": "Activar SMTP de plataforma", - "admin.settings.storedPassword": "Contraseña guardada: {masked}", - "admin.settings.clearSmtpPassword": "Borrar contraseña SMTP guardada", + "admin.settings.storedPassword": "Contraseña guardada: {masked}", + "admin.settings.clearSmtpPassword": "Borrar contraseña SMTP guardada", "admin.settings.sendTestEmail": "Enviar correo de prueba", "admin.settings.enableGoogle": "Activar Google OAuth", "admin.settings.clientSecret": "Secreto de cliente", - "admin.settings.leaveBlankKeep": "(déjelo en blanco para conservar)", + "admin.settings.leaveBlankKeep": "(déjelo en blanco para conservar)", "admin.settings.storedSecret": "Secreto guardado: {masked}", "admin.settings.clearClientSecret": "Borrar secreto de cliente guardado", - "admin.settings.eprelDesc": "Datos públicos gratuitos de etiquetas energéticas de la UE durante el procesamiento. Activado por defecto en todos los planes — sin activación ni mejora de pago. Use los controles solo para desactivar o ajustar el cliente.", + "admin.settings.eprelDesc": "Datos públicos gratuitos de etiquetas energéticas de la UE durante el procesamiento. Activado por defecto en todos los planes — sin activación ni mejora de pago. Use los controles solo para desactivar o ajustar el cliente.", "admin.settings.optionalKeySaved": "Clave API opcional guardada", "admin.settings.noApiKeyNeeded": "No se necesita clave API", "admin.settings.optionalApiKey": "Clave API opcional", - "admin.settings.optionalApiKeySavedHint": "(guardado — leave blank to keep)", - "admin.settings.optionalApiKeyPublicHint": "(la API pública funciona sin ella)", + "admin.settings.optionalApiKeySavedHint": "(guardado — leave blank to keep)", + "admin.settings.optionalApiKeyPublicHint": "(la API pública funciona sin ella)", "admin.settings.clearEprelKey": "Borrar clave API EPREL guardada", - "admin.settings.pineconeDesc": "Sugerencias opcionales de categoría vectorial durante el procesamiento. Se usan valores del entorno del host cuando estos campos quedan vacíos.", + "admin.settings.pineconeDesc": "Sugerencias opcionales de categoría vectorial durante el procesamiento. Se usan valores del entorno del host cuando estos campos quedan vacíos.", "admin.settings.apiKeyConfigured": "Clave API configurada", "admin.settings.noApiKey": "Sin clave API", "admin.settings.apiKeyLabel": "Clave API", "admin.settings.clearPineconeKey": "Borrar clave API Pinecone guardada", - "admin.settings.stripeDesc": "Anulaciones opcionales de la configuración Stripe del servidor. Prefiera campos de contraseña; los valores no se vuelven a mostrar tras guardar.", - "admin.settings.stripeMock": "Forzar modo mock de Stripe (solo no producción — desactiva cargos reales)", + "admin.settings.stripeDesc": "Anulaciones opcionales de la configuración Stripe del servidor. Prefiera campos de contraseña; los valores no se vuelven a mostrar tras guardar.", + "admin.settings.stripeMock": "Forzar modo mock de Stripe (solo no producción — desactiva cargos reales)", "admin.settings.webhookSecret": "Secreto del webhook", "admin.settings.clearStripeSecret": "Borrar clave secreta de Stripe", "admin.settings.clearStripeWebhook": "Borrar secreto de webhook de Stripe", "admin.settings.feedAllowlistDesc": "Hosts/CIDR separados por comas permitidos para URL de feeds privadas.", "admin.settings.adminsDesc": "Administradores de plataforma actualmente en este despliegue", - "admin.settings.onboardingTitle": "Ayudas de incorporación de admins", - "admin.settings.onboardingDesc": "Use correos de invitación set-password para incorporar usuarios elegibles que aún necesitan una contraseña.", + "admin.settings.onboardingTitle": "Ayudas de incorporación de admins", + "admin.settings.onboardingDesc": "Use correos de invitación set-password para incorporar usuarios elegibles que aún necesitan una contraseña.", "admin.settings.sendInvites": "Enviar correos set-password", "admin.settings.adminStatusBefore": "Los admins de plataforma no se pueden crear desde esta pantalla. Confirme su acceso en la", "admin.settings.adminStatusAfter": ", o pida a un admin/ops existente que promocione su cuenta.", "admin.settings.loadUsersFailed": "No se pudieron cargar los usuarios admin", - "admin.settings.sendFailed": "Envío fallido", + "admin.settings.sendFailed": "Envío fallido", "admin.settings.saveMailFailed": "No se pudieron guardar los ajustes de correo", - "admin.settings.smtpNotConfigured": "SMTP no está configurado — active y guarde los ajustes de correo primero.", + "admin.settings.smtpNotConfigured": "SMTP no está configurado — active y guarde los ajustes de correo primero.", "admin.settings.smtpTestFailed": "Prueba SMTP fallida", "admin.settings.testEmailFailed": "No se pudo enviar el correo de prueba", - "admin.settings.saveIntegrationFailed": "No se pudieron guardar los ajustes de integración", - "admin.settings.aiSaved": "Configuración de IA de {label} guardada. Las claves API no se vuelven a mostrar.", + "admin.settings.saveIntegrationFailed": "No se pudieron guardar los ajustes de integración", + "admin.settings.aiSaved": "Configuración de IA de {label} guardada. Las claves API no se vuelven a mostrar.", "admin.settings.aiSaveFailed": "No se pudieron guardar los ajustes de IA de {label}", - "admin.settings.aiTestOk": "{label}: conexión correcta", - "admin.settings.aiTestSkipped": "{label}: omitido — guarde credenciales (y active el rol) para probar.", - "admin.settings.aiTestFailed": "{label}: conexión fallida", - "admin.settings.aiTestError": "No se pudo probar la conexión de {label}", + "admin.settings.aiTestOk": "{label}: conexión correcta", + "admin.settings.aiTestSkipped": "{label}: omitido — guarde credenciales (y active el rol) para probar.", + "admin.settings.aiTestFailed": "{label}: conexión fallida", + "admin.settings.aiTestError": "No se pudo probar la conexión de {label}", "admin.settings.aiRole.processing.label": "Procesamiento", - "admin.settings.aiRole.processing.desc": "Chat/completions del pipeline de productos (títulos, descripciones, mejora).", - "admin.settings.aiRole.vectorization.label": "Vectorización", - "admin.settings.aiRole.vectorization.desc": "Embeddings para búsqueda / indexación Pinecone (coincidir dimensiones del índice).", + "admin.settings.aiRole.processing.desc": "Chat/completions del pipeline de productos (títulos, descripciones, mejora).", + "admin.settings.aiRole.vectorization.label": "Vectorización", + "admin.settings.aiRole.vectorization.desc": "Embeddings para búsqueda / indexación Pinecone (coincidir dimensiones del índice).", "admin.settings.aiRole.docs_api.label": "Docs / API", - "admin.settings.aiRole.docs_api.desc": "Ranura futura de asistente docs/API — /docs Ask sigue basado en reglas y no debe llamar nunca a este rol.", + "admin.settings.aiRole.docs_api.desc": "Ranura futura de asistente docs/API — /docs Ask sigue basado en reglas y no debe llamar nunca a este rol.", "admin.settings.aiRole.support.label": "Soporte", - "admin.settings.aiRole.support.desc": "IA de respaldo para auto-respuesta de tickets — configure proveedor/clave/modelo aquí; active el envío en Conocimiento de soporte → Auto-respuesta.", + "admin.settings.aiRole.support.desc": "IA de respaldo para auto-respuesta de tickets — configure proveedor/clave/modelo aquí; active el envío en Conocimiento de soporte → Auto-respuesta.", "admin.settings.providerOption.openai": "OpenAI", "admin.settings.providerOption.openrouter": "OpenRouter", "admin.settings.providerOption.azure": "Azure OpenAI", "admin.settings.providerOption.ollama": "Ollama", "admin.settings.providerOption.custom": "Personalizado / otro", "admin.support.title": "Centro de soporte", - "admin.support.description": "Bandeja del personal — reclama de la cola, filtra por ámbito, abre hilos y resuelve", - "admin.support.unavailable": "La cola de soporte no está disponible. Contacta al administrador de la plataforma si persiste.", + "admin.support.description": "Bandeja del personal — reclama de la cola, filtra por ámbito, abre hilos y resuelve", + "admin.support.unavailable": "La cola de soporte no está disponible. Contacta al administrador de la plataforma si persiste.", "admin.support.noTickets": "No hay tickets en esta cola.", "admin.support.ticketNotFound": "Ticket no encontrado.", - "admin.support.notAvailable": "El soporte no está disponible en este despliegue.", + "admin.support.notAvailable": "El soporte no está disponible en este despliegue.", "admin.support.loadFailed": "No se pudo cargar este ticket.", - "admin.support.noMessages": "Aún no hay mensajes.", - "admin.support.queueScopeAria": "Ámbito de cola", + "admin.support.noMessages": "Aún no hay mensajes.", + "admin.support.queueScopeAria": "Ámbito de cola", "admin.support.statusFilterAria": "Filtro de estado", "admin.support.autoAssistFilterAria": "Filtro de autoasistencia", "admin.support.searchPlaceholder": "Buscar asunto, correo o empresa", "admin.support.searchAria": "Buscar tickets", "admin.support.assignStaffAria": "Asignar al personal", "admin.support.aiDraftAria": "Borrador IA", - "admin.support.replyPlaceholder": "Escribe una respuesta…", + "admin.support.replyPlaceholder": "Escribe una respuesta…", "admin.support.replyAria": "Cuerpo de la respuesta", "admin.knowledge.eyebrow": "Admin de plataforma", "admin.knowledge.title": "Base de conocimiento", - "admin.knowledge.description": "Estructura artículos de ayuda para coincidencia automática de FAQ. Los agentes de contenido rellenan cuerpos — mantén los hechos precisos.", - "admin.knowledge.notReady": "El conocimiento de soporte no está listo", + "admin.knowledge.description": "Estructura artículos de ayuda para coincidencia automática de FAQ. Los agentes de contenido rellenan cuerpos — mantén los hechos precisos.", + "admin.knowledge.notReady": "El conocimiento de soporte no está listo", "admin.knowledge.noTemplates": "Sin plantillas de respuesta", - "admin.knowledge.articleDesc": "El cuerpo Markdown admite imágenes mediante subida segura. No inventes hechos de producto — deja marcadores para agentes de contenido.", + "admin.knowledge.articleDesc": "El cuerpo Markdown admite imágenes mediante subida segura. No inventes hechos de producto — deja marcadores para agentes de contenido.", "admin.knowledge.templateDesc": "Marcadores permitidos: subject, category.", - "admin.knowledge.searchPlaceholder": "Buscar título, slug, palabras clave…", - "admin.knowledge.searchAria": "Buscar artículos", - "admin.knowledge.publishFilterAria": "Filtro de estado de publicación", - "admin.knowledge.deleteArticleAria": "Eliminar artículo", + "admin.knowledge.searchPlaceholder": "Buscar título, slug, palabras clave…", + "admin.knowledge.searchAria": "Buscar artículos", + "admin.knowledge.publishFilterAria": "Filtro de estado de publicación", + "admin.knowledge.deleteArticleAria": "Eliminar artículo", "admin.knowledge.deleteTemplateAria": "Eliminar plantilla", "admin.support.autoReplyStatus.matched": "FAQ coincidente", "admin.support.autoReplyStatus.aiDraft": "Borrador IA pendiente", @@ -1494,30 +1494,30 @@ export const es: MessageDict = { "admin.support.autoSource.template": "Plantilla", "admin.support.autoSource.ai": "Asistido por IA", "admin.support.autoSource.automated": "Automatizado", - "admin.knowledge.categoriesHeading": "Categorías", - "admin.knowledge.categoriesHint": "Cubos vacíos semilla para agentes de contenido.", - "admin.knowledge.showingArticles": "Mostrando {shown} artículos (el cuerpo se carga al editar).", - "admin.knowledge.showingArticlesOf": "Mostrando {shown} de {total} artículos (el cuerpo se carga al editar).", + "admin.knowledge.categoriesHeading": "Categorías", + "admin.knowledge.categoriesHint": "Cubos vacíos semilla para agentes de contenido.", + "admin.knowledge.showingArticles": "Mostrando {shown} artículos (el cuerpo se carga al editar).", + "admin.knowledge.showingArticlesOf": "Mostrando {shown} de {total} artículos (el cuerpo se carga al editar).", "admin.knowledge.templatesHint": "Respuestas predefinidas con marcadores opcionales {{subject}} / {{category}}.", - "admin.knowledge.faqAutoMatchTitle": "Coincidencia FAQ automática", - "admin.knowledge.faqAutoMatchDesc": "Coincidencia de palabras clave al crear el ticket. Umbral por defecto 0.78 (rango 0.50–0.95).", + "admin.knowledge.faqAutoMatchTitle": "Coincidencia FAQ automática", + "admin.knowledge.faqAutoMatchDesc": "Coincidencia de palabras clave al crear el ticket. Umbral por defecto 0.78 (rango 0.50–0.95).", "admin.knowledge.aiFallbackTitle": "Respaldo de IA", - "admin.knowledge.aiFallbackDesc": "Se usa cuando la coincidencia FAQ está por debajo del umbral. Las respuestas usan el rol de IA de plataforma {role}.", + "admin.knowledge.aiFallbackDesc": "Se usa cuando la coincidencia FAQ está por debajo del umbral. Las respuestas usan el rol de IA de plataforma {role}.", "admin.knowledge.noModel": "sin modelo", - "admin.knowledge.keyLast4": "clave …{last4}", + "admin.knowledge.keyLast4": "clave …{last4}", "admin.knowledge.sourceLabel": "origen {source}", "admin.knowledge.apiKeyNote": "La clave API siempre proviene de este rol; los overrides de arriba solo cambian proveedor / modelo / URL base.", "admin.knowledge.saveAutoSettings": "Guardar ajustes de auto-respuesta", "admin.knowledge.insertImage": "Insertar imagen", - "admin.knowledge.uploading": "Subiendo…", - "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, máx. 2 MiB. Se almacena en UPLOAD_DIR/support-kb (URL pública HMAC).", - "admin.knowledge.unavailableMsg": "La base de conocimiento de soporte no está disponible en este despliegue. Contacte a su administrador de plataforma.", + "admin.knowledge.uploading": "Subiendo…", + "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, máx. 2 MiB. Se almacena en UPLOAD_DIR/support-kb (URL pública HMAC).", + "admin.knowledge.unavailableMsg": "La base de conocimiento de soporte no está disponible en este despliegue. Contacte a su administrador de plataforma.", "admin.knowledge.loadFailed": "No se pudo cargar el conocimiento de soporte", - "admin.knowledge.loadArticleFailed": "No se pudo cargar el artículo", + "admin.knowledge.loadArticleFailed": "No se pudo cargar el artículo", "admin.knowledge.loadTemplateFailed": "No se pudo cargar la plantilla", - "admin.knowledge.saveArticleFailed": "No se pudo guardar el artículo", + "admin.knowledge.saveArticleFailed": "No se pudo guardar el artículo", "admin.knowledge.saveTemplateFailed": "No se pudo guardar la plantilla", - "admin.knowledge.deleteArticleFailed": "No se pudo eliminar el artículo", + "admin.knowledge.deleteArticleFailed": "No se pudo eliminar el artículo", "admin.knowledge.deleteTemplateFailed": "No se pudo eliminar la plantilla", "admin.knowledge.saveAutoFailed": "No se pudieron guardar los ajustes de auto-respuesta", "admin.knowledge.uploadImageFailed": "No se pudo subir la imagen", @@ -1541,37 +1541,37 @@ export const es: MessageDict = { "admin.translations.filterTranslated": "Solo traducidos", "admin.translations.filterAll": "Todas las claves", "admin.translations.search": "Buscar", - "admin.translations.searchPlaceholder": "Clave o texto…", + "admin.translations.searchPlaceholder": "Clave o texto…", "admin.translations.noKeysMatch": "Ninguna clave coincide", "admin.translations.badgeMissing": "Faltantes", "admin.translations.badgeUnsaved": "Sin guardar", - "admin.translations.english": "Inglés", + "admin.translations.english": "Inglés", "admin.bootstrap.title": "Acceso admin bootstrap", "admin.bootstrap.description": "Confirma si tu cuenta ya tiene acceso de admin de plataforma. Los nuevos admins deben ser concedidos por un administrador existente.", "admin.bootstrap.statusTitle": "Estado de admin de plataforma", "admin.bootstrap.statusDesc": "El acceso de admin de plataforma lo concede un administrador existente. No hay bootstrap de autoservicio para este rol.", "admin.bootstrap.alreadyAdmin": "Ya tienes acceso de admin de plataforma.", - "admin.bootstrap.signedInAs": "Sesión iniciada como {email}. Abre el panel admin para continuar.", - "admin.bootstrap.signedInAsShort": "Sesión iniciada como {email}", + "admin.bootstrap.signedInAs": "Sesión iniciada como {email}. Abre el panel admin para continuar.", + "admin.bootstrap.signedInAsShort": "Sesión iniciada como {email}", "admin.bootstrap.notAdminTitle": "No eres admin de plataforma", - "admin.bootstrap.notAdminMsg": "Tu cuenta ha iniciado sesión pero no está marcada como admin de plataforma. Pide a un admin existente que te conceda acceso, luego cierra sesión y vuelve a entrar.", + "admin.bootstrap.notAdminMsg": "Tu cuenta ha iniciado sesión pero no está marcada como admin de plataforma. Pide a un admin existente que te conceda acceso, luego cierra sesión y vuelve a entrar.", "admin.bootstrap.goToPanel": "Ir al panel admin", "admin.bootstrap.loadFailed": "Error al cargar el perfil", - "admin.migrate.title": "Migración de organización", - "admin.migrate.description": "Esta herramienta de migración está retirada y no cambia ningún dato.", + "admin.migrate.title": "Migración de organización", + "admin.migrate.description": "Esta herramienta de migración está retirada y no cambia ningún dato.", "admin.migrate.notAvailable": "No disponible", - "admin.migrate.body": "La migración de organización del proveedor de identidad anterior ya no es necesaria. Las empresas y la auth local se gestionan en Usuarios y organizaciones.", - "admin.migrate.hint": "Si abriste esto desde un marcador antiguo, continúa con Usuarios y organizaciones, Facturación de plataforma o Productos atascados.", + "admin.migrate.body": "La migración de organización del proveedor de identidad anterior ya no es necesaria. Las empresas y la auth local se gestionan en Usuarios y organizaciones.", + "admin.migrate.hint": "Si abriste esto desde un marcador antiguo, continúa con Usuarios y organizaciones, Facturación de plataforma o Productos atascados.", "admin.migrate.adminHome": "Inicio admin", "admin.migrate.users": "Usuarios", - "admin.redirect.diagnostics": "Redirigiendo a Diagnósticos…", - "admin.redirect.stuck": "Redirigiendo a Productos atascados…", + "admin.redirect.diagnostics": "Redirigiendo a Diagnósticos…", + "admin.redirect.stuck": "Redirigiendo a Productos atascados…", "common.refresh": "Actualizar", "common.delete": "Eliminar", - "common.clearSearch": "Borrar búsqueda", - "common.loading": "Cargando…", + "common.clearSearch": "Borrar búsqueda", + "common.loading": "Cargando…", "common.never": "Nunca", - "common.back": "Atrás", + "common.back": "Atrás", "common.startOver": "Empezar de nuevo", "common.create": "Crear", "common.required": "Obligatorio", @@ -1579,22 +1579,22 @@ export const es: MessageDict = { "common.status": "Estado", "common.nameCol": "Nombre", "common.products": "Productos", - "common.more": "+{count} más", + "common.more": "+{count} más", "feeds.title": "Tus feeds", - "feeds.loadingDesc": "Cargando tus feeds de proveedor…", - "feeds.desc": "{page} en esta página · {total} feeds en total — URL CSV/XML de proveedor y subidas. Conecta desde Tiendas para opciones guiadas.", + "feeds.loadingDesc": "Cargando tus feeds de proveedor…", + "feeds.desc": "{page} en esta página · {total} feeds en total — URL CSV/XML de proveedor y subidas. Conecta desde Tiendas para opciones guiadas.", "feeds.storesHub": "Centro de tiendas", - "feeds.addFeed": "Añadir Feed", + "feeds.addFeed": "Añadir Feed", "feeds.searchPlaceholder": "Buscar feeds...", - "feeds.emptyTitle": "Aún no hay feeds de productos", - "feeds.emptyMessage": "Conecta una URL CSV/XML de proveedor o sube un archivo para sincronizar productos en tu catálogo.", + "feeds.emptyTitle": "Aún no hay feeds de productos", + "feeds.emptyMessage": "Conecta una URL CSV/XML de proveedor o sube un archivo para sincronizar productos en tu catálogo.", "feeds.connectFeed": "Conectar feed", "feeds.uploadCsvCta": "Subir CSV", "feeds.noMatchTitle": "No hay feeds coincidentes", - "feeds.noMatchMessage": "Prueba otro término de búsqueda, o limpia la búsqueda para ver todos los feeds.", + "feeds.noMatchMessage": "Prueba otro término de búsqueda, o limpia la búsqueda para ver todos los feeds.", "feeds.col.source": "Origen", "feeds.col.mapping": "Mapeo", - "feeds.col.lastData": "Última sync", + "feeds.col.lastData": "Última sync", "feeds.copyUrl": "Copiar URL", "feeds.fieldsMapped": "{count} campos", "feeds.fieldsMappedTitle": "{count} campo mapeado", @@ -1602,47 +1602,47 @@ export const es: MessageDict = { "feeds.mappingsSaved": "Mapeos de campos guardados", "feeds.mapped": "Mapeado", "feeds.notMapped": "Sin mapear", - "feeds.notMappedTitle": "Aún no hay mapeos de campos — abre Mapear para configurar", + "feeds.notMappedTitle": "Aún no hay mapeos de campos — abre Mapear para configurar", "feeds.productsFromFeed": "{count} productos de este feed", - "feeds.noProductsYet": "Aún no se han importado productos de este feed", - "feeds.syncing": "Sincronizando…", + "feeds.noProductsYet": "Aún no se han importado productos de este feed", + "feeds.syncing": "Sincronizando…", "feeds.syncingShort": "Sincronizando", "feeds.syncingHint": "Puede tardar unos minutos en feeds grandes", "feeds.liveSync": "Sync del feed", - "feeds.productData": "Datos del catálogo", + "feeds.productData": "Datos del catálogo", "feeds.mapFields": "Mapear campos", "feeds.map": "Mapear", "feeds.sync": "Sincronizar", "feeds.syncNow": "Sincronizar ahora", - "feeds.syncManualTitle": "Ejecutar una sincronización puntual ahora. La sincronización automática usa el intervalo definido al editar el feed.", + "feeds.syncManualTitle": "Ejecutar una sincronización puntual ahora. La sincronización automática usa el intervalo definido al editar el feed.", "feeds.syncInProgress": "Sync en curso", - "feeds.addTitle": "Añadir Feed", + "feeds.addTitle": "Añadir Feed", "feeds.addDesc": "Conecta una URL de feed de productos o sube un CSV. Usa las muestras de abajo para coincidir con la estructura esperada.", "feeds.field.name": "Nombre", "feeds.field.namePlaceholder": "Mi feed de productos", "feeds.tab.url": "URL del feed", "feeds.tab.file": "Archivo CSV", "feeds.field.url": "URL del feed", - "feeds.field.urlPlaceholder": "https://…", + "feeds.field.urlPlaceholder": "https://…", "feeds.field.type": "Tipo", "feeds.field.file": "Archivo CSV", - "feeds.fileHint": "Máx. 5 MiB. Tras crear, mapea columnas y luego sincroniza — mismo flujo que feeds por URL.", - "feeds.field.interval": "Intervalo de sincronización automática (minutos)", - "feeds.field.intervalHint": "Cada cuánto debe Descrybe tirar de este feed automáticamente mientras esté activo. Usa Sync en la lista para un tirón puntual — eso no cambia este horario.", + "feeds.fileHint": "Máx. 5 MiB. Tras crear, mapea columnas y luego sincroniza — mismo flujo que feeds por URL.", + "feeds.field.interval": "Intervalo de sincronización automática (minutos)", + "feeds.field.intervalHint": "Cada cuánto debe Descrybe tirar de este feed automáticamente mientras esté activo. Usa Sync en la lista para un tirón puntual — eso no cambia este horario.", "feeds.createFeed": "Crear feed", "feeds.editTitle": "Editar Feed", - "feeds.editDesc": "Actualiza nombre, tipo, programación de sincronización automática o URL de origen. Sync en la lista de feeds ejecuta un tirón puntual.", + "feeds.editDesc": "Actualiza nombre, tipo, programación de sincronización automática o URL de origen. Sync en la lista de feeds ejecuta un tirón puntual.", "feeds.csvSource": "Origen CSV", "feeds.uploadedCsv": "CSV subido", "feeds.replaceFileHint": "Para reemplazar el archivo, crea un feed nuevo. La sync vuelve a leer la subida guardada.", "feeds.csvTypeLocked": "Los feeds CSV subidos siguen siendo de tipo CSV.", "feeds.saveChanges": "Guardar cambios", "feeds.historyTitle": "Historial de sync", - "feeds.historyDesc": "Trabajos de sync recientes de “{name}”.", - "feeds.historyLastSynced": "Última sync correcta {relative} ({absolute}).", - "feeds.historyNeverSynced": "Aún no hay una sync correcta.", - "feeds.historyLoading": "Cargando historial de sync…", - "feeds.historyEmpty": "Aún no hay trabajos de sync.", + "feeds.historyDesc": "Trabajos de sync recientes de “{name}”.", + "feeds.historyLastSynced": "Última sync correcta {relative} ({absolute}).", + "feeds.historyNeverSynced": "Aún no hay una sync correcta.", + "feeds.historyLoading": "Cargando historial de sync…", + "feeds.historyEmpty": "Aún no hay trabajos de sync.", "feeds.history.started": "Iniciado", "feeds.history.completed": "Completado", "feeds.loadFailed": "Error al cargar feeds", @@ -1651,21 +1651,21 @@ export const es: MessageDict = { "feeds.updated": "Feed actualizado.", "feeds.mapBeforeSync": "Mapea los campos antes de sincronizar este feed.", "feeds.activateBeforeSync": "Activa el feed antes de sincronizar.", - "feeds.syncFinished": "Sincronización finalizada", + "feeds.syncFinished": "Sincronización finalizada", "feeds.viewProducts": "Ver productos", "feeds.processing": "Procesamiento", - "feeds.syncFailed": "Error de sincronización", + "feeds.syncFailed": "Error de sincronización", "feeds.statusUpdateFailed": "No se pudo actualizar el estado", - "feeds.deleteConfirm": "¿Eliminar el feed “{name}”? Esto no se puede deshacer.", + "feeds.deleteConfirm": "¿Eliminar el feed “{name}”? Esto no se puede deshacer.", "feeds.deleted": "Feed eliminado.", "feeds.deleteFailed": "No se pudo eliminar el feed", "feeds.historyLoadFailed": "No se pudo cargar el historial de sync", - "feeds.ftpUnsupported": "La sync FTP/FTPS no está disponible. Pide a tu proveedor una URL HTTPS pública, sube un feed CSV aquí o importa un archivo desde Uploads.", + "feeds.ftpUnsupported": "La sync FTP/FTPS no está disponible. Pide a tu proveedor una URL HTTPS pública, sube un feed CSV aquí o importa un archivo desde Uploads.", "feeds.ftpUnsupportedShort": "Sync FTP no disponible", "feeds.ftpBadge": "FTP", - "feeds.ftpMigrateBanner": "Algunos feeds aún usan FTP/FTPS. Descrybe no puede descargarlos. Cambia a una URL HTTPS pública, añade un feed CSV o sube desde Uploads.", + "feeds.ftpMigrateBanner": "Algunos feeds aún usan FTP/FTPS. Descrybe no puede descargarlos. Cambia a una URL HTTPS pública, añade un feed CSV o sube desde Uploads.", "feeds.ftpUploadCta": "Ir a Uploads", - "feeds.ftpHttpsCta": "Añadir feed HTTPS", + "feeds.ftpHttpsCta": "Añadir feed HTTPS", "feeds.ftpCsvCta": "Subir feed CSV", "feeds.status.mappingIncomplete": "Mapeo incompleto", "feeds.status.readyForMapping": "Listo para mapear", @@ -1679,30 +1679,30 @@ export const es: MessageDict = { "feeds.actions.editFeed": "Editar Feed", "feeds.actions.editMapping": "Editar mapeo", "feeds.actions.syncNow": "Sincronizar ahora", - "feeds.actions.syncInProgress": "Sync en curso…", + "feeds.actions.syncInProgress": "Sync en curso…", "feeds.actions.activateToSync": "Activar feed para sincronizar", "feeds.actions.viewHistory": "Ver historial de sync", "feeds.actions.deactivate": "Desactivar feed", "feeds.actions.activate": "Activar feed", "feeds.actions.delete": "Eliminar feed", "feeds.stats.totalFeeds": "Feeds totales", - "feeds.stats.activeMapped": "{active} activos · {mapped} mapeados", + "feeds.stats.activeMapped": "{active} activos · {mapped} mapeados", "feeds.stats.activeOnly": "{active} activos", "feeds.stats.totalProducts": "Productos importados", - "feeds.stats.acrossFeeds": "Filas en bruto (no catálogo + cola)", - "feeds.stats.processed": "En catálogo", - "feeds.stats.readyCatalog": "Filas de catálogo — no es parte del total importado", + "feeds.stats.acrossFeeds": "Filas en bruto (no catálogo + cola)", + "feeds.stats.processed": "En catálogo", + "feeds.stats.readyCatalog": "Filas de catálogo — no es parte del total importado", "feeds.stats.unprocessed": "En espera de procesar", - "feeds.stats.waiting": "Cola en bruto — no es parte del total importado", - "feeds.format.howTo": "Cómo estructurar tu feed", + "feeds.stats.waiting": "Cola en bruto — no es parte del total importado", + "feeds.format.howTo": "Cómo estructurar tu feed", "feeds.format.required": "Obligatorio:", "feeds.preview.title": "Vista previa del origen del feed", "feeds.preview.truncated": "Truncado", "feeds.preview.refresh": "Actualizar vista previa", "feeds.preview.copy": "Copiar vista previa", - "feeds.preview.loading": "Cargando vista previa…", + "feeds.preview.loading": "Cargando vista previa…", "feeds.preview.empty": "Extrae el esquema para previsualizar el origen del feed.", - "feeds.schema.search": "Buscar campos…", + "feeds.schema.search": "Buscar campos…", "feeds.schema.fieldName": "Nombre del campo", "feeds.schema.sourcePath": "Ruta de origen", "feeds.schema.confirm": "Confirmar", @@ -1710,37 +1710,37 @@ export const es: MessageDict = { "feeds.preflight.missingItemPath": "Selecciona una ruta de elemento de producto antes de sincronizar.", "feeds.preflight.emptyMappings": "Mapea al menos un campo de origen antes de sincronizar.", "feeds.preflight.missingRequired": "Mapea los campos obligatorios antes de sincronizar: {fields}.", - "feeds.preflight.unknownSource": "Algunas fuentes mapeadas no se encontraron en el esquema extraído: {fields}{more}. Vuelve a extraer o corrige rutas antes de confiar en valores de muestra.", - "feeds.preflight.emptySample": "Los campos obligatorios tienen valores de muestra vacíos: {fields}. Revisa las columnas de origen antes de una sync completa.", + "feeds.preflight.unknownSource": "Algunas fuentes mapeadas no se encontraron en el esquema extraído: {fields}{more}. Vuelve a extraer o corrige rutas antes de confiar en valores de muestra.", + "feeds.preflight.emptySample": "Los campos obligatorios tienen valores de muestra vacíos: {fields}. Revisa las columnas de origen antes de una sync completa.", "feeds.preflight.fix": "Corrige los mapeos de campos antes de sincronizar.", "mapping.title": "Mapeo del feed", "mapping.titleNamed": "Mapear: {name}", - "mapping.description": "Selecciona el elemento de producto que se repite, extrae los campos de origen y asígnalos a los campos de producto de Descrybe.", + "mapping.description": "Selecciona el elemento de producto que se repite, extrae los campos de origen y asígnalos a los campos de producto de Descrybe.", "mapping.autoMap": "Auto-mapear", "mapping.fuzzy": "{count} aproximados", "mapping.extractSchema": "Extraer esquema", "mapping.backToFeeds": "Volver a Feeds", - "mapping.ftpStillEdit": "{message} Aún puedes editar los mapeos. Para actualizar productos, pasa a HTTPS o sube un archivo.", + "mapping.ftpStillEdit": "{message} Aún puedes editar los mapeos. Para actualizar productos, pasa a HTTPS o sube un archivo.", "mapping.ftpUploadCta": "Ir a Uploads", - "mapping.ftpHttpsCta": "Añadir feed HTTPS", + "mapping.ftpHttpsCta": "Añadir feed HTTPS", "mapping.ftpCsvCta": "Subir feed CSV", - "mapping.loading": "Cargando detalles del feed…", + "mapping.loading": "Cargando detalles del feed…", "mapping.step1": "Seleccionar elemento de producto", "mapping.step2": "Mapear campos", "mapping.step1Heading": "Paso 1: Seleccionar elemento de producto", - "mapping.csvHint": "Los feeds CSV usan los encabezados de columna como campos de origen. Extrae el esquema para cargar las columnas y continúa con el mapeo.", - "mapping.howToSelect": "Cómo seleccionar el elemento de producto:", - "mapping.howToHint": "Guía opcional", + "mapping.csvHint": "Los feeds CSV usan los encabezados de columna como campos de origen. Extrae el esquema para cargar las columnas y continúa con el mapeo.", + "mapping.howToSelect": "Cómo seleccionar el elemento de producto:", + "mapping.howToHint": "Guía opcional", "mapping.howTo.1": "Extrae el esquema o haz clic en una etiqueta repetida en la vista previa", "mapping.howTo.2": "Cada elemento debe contener los datos de un solo producto", "mapping.howTo.3": "Confirma la ruta (por ejemplo", - "mapping.howTo.4": "Continúa mapeando los campos de origen a los campos de producto", + "mapping.howTo.4": "Continúa mapeando los campos de origen a los campos de producto", "mapping.productElementPath": "Ruta del elemento de producto", "mapping.pathPlaceholder": "p. ej. rss/channel/item o products/product", - "mapping.continue": "Continuar →", - "mapping.continueFields": "Continuar al mapeo de campos →", + "mapping.continue": "Continuar →", + "mapping.continueFields": "Continuar al mapeo de campos →", "mapping.discovered": "Se descubrieron {fields} campos de origen en {rows} fila(s) de muestra.", - "mapping.suggestionsCount": "· {count} sugerencia(s) de auto-mapeo", + "mapping.suggestionsCount": "· {count} sugerencia(s) de auto-mapeo", "mapping.step2Heading": "Paso 2: Mapear campos", "mapping.requiredFieldsBadge": "{count} campos obligatorios", "mapping.unmappedRequired": "{count} obligatorios sin mapear", @@ -1748,8 +1748,8 @@ export const es: MessageDict = { "mapping.suggestedBadge": "{count} sugeridos", "mapping.step2Help": "Asigna columnas o nodos XPath a tus campos de producto. Los obligatorios llevan *. Pasa el cursor por el icono de ayuda para ver una tip breve.", "mapping.requiredFields": "Campos obligatorios", - "mapping.requiredMapped": "· {mapped}/{total} mapeados", - "mapping.requiredProgressDone": "Todos los campos obligatorios asignados — listo para el siguiente paso.", + "mapping.requiredMapped": "· {mapped}/{total} mapeados", + "mapping.requiredProgressDone": "Todos los campos obligatorios asignados — listo para el siguiente paso.", "mapping.requiredProgressHint": "Los campos marcados con * deben mapearse antes de que este feed pueda sincronizar productos.", "mapping.requiredProgressAria": "Progreso de campos obligatorios: {mapped} de {total} mapeados", "mapping.nextAfterSaveReady": "Mappings saved. Next, sync a small sample to check products look right.", @@ -1758,12 +1758,12 @@ export const es: MessageDict = { "mapping.nextCtaFinishRequired": "Show missing required fields", "mapping.highConfidence": "{count} mapeo de alta confianza listo", "mapping.highConfidencePlural": "{count} mapeos de alta confianza listos", - "mapping.highConfidenceHelp": "Coincidencias exactas y alias (por ejemplo EAN → GTIN). Aplica todas o acepta chips por fila en la tabla.", + "mapping.highConfidenceHelp": "Coincidencias exactas y alias (por ejemplo EAN → GTIN). Aplica todas o acepta chips por fila en la tabla.", "mapping.reviewMappings": "Revisar mapeos", "mapping.needItemPath": "Introduce una ruta de elemento de producto antes de mapear campos.", "mapping.removeMapping": "Quitar mapeo", "mapping.sourcePlaceholder": "nombre de columna o xpath", - "mapping.processAfterSync": "Productos a procesar tras la sincronización", + "mapping.processAfterSync": "Productos a procesar tras la sincronización", "mapping.noFuzzyLeft": "No quedan coincidencias aproximadas por confirmar.", "mapping.syncedQueued": "Feed sincronizado y {queued} producto(s) en cola para procesar{jobId}.", "mapping.saveMappings": "Guardar mapeos", @@ -1774,45 +1774,45 @@ export const es: MessageDict = { "mapping.confirmFuzzy": "Confirmar aproximados ({count})", "mapping.fuzzyNeedConfirm": "{count} coincidencia aproximada por confirmar", "mapping.fuzzyNeedConfirmPlural": "{count} coincidencias aproximadas por confirmar", - "mapping.fuzzyHelp": "Las coincidencias de baja confianza no se aplican solas. Confírmalas aquí o acéptalas por fila en la tabla.", - "mapping.missingRequiredTitle": "Los campos obligatorios aún necesitan un mapeo de origen:", - "mapping.applyTip": "Consejo: aplica las sugerencias de arriba — muchos campos obligatorios coinciden con nombres habituales.", + "mapping.fuzzyHelp": "Las coincidencias de baja confianza no se aplican solas. Confírmalas aquí o acéptalas por fila en la tabla.", + "mapping.missingRequiredTitle": "Los campos obligatorios aún necesitan un mapeo de origen:", + "mapping.applyTip": "Consejo: aplica las sugerencias de arriba — muchos campos obligatorios coinciden con nombres habituales.", "mapping.formatLabel": "Formato:", - "mapping.itemPathLabel": "Ruta del ítem:", + "mapping.itemPathLabel": "Ruta del ítem:", "mapping.reExtract": "Volver a extraer", "mapping.manualRows": "Filas manuales", "mapping.schemaTable": "Tabla de esquema", - "mapping.addField": "Añadir campo", - "mapping.noSchemaYet": "Aún no hay esquema extraído.", + "mapping.addField": "Añadir campo", + "mapping.noSchemaYet": "Aún no hay esquema extraído.", "mapping.orManualRows": "o usa las filas manuales abajo.", "mapping.sourceField": "Campo de origen", - "mapping.selectSource": "Seleccionar origen…", + "mapping.selectSource": "Seleccionar origen…", "mapping.mapsTo": "Se asigna a", "mapping.none": "Ninguno", - "mapping.backToItem": "← Volver a selección de elemento", + "mapping.backToItem": "← Volver a selección de elemento", "mapping.unsaved": "Cambios sin guardar", "mapping.requiredFieldsColon": "Campos obligatorios:", "mapping.sampleOptions": "Opciones de muestra", - "mapping.sampleSize": "Tamaño de muestra", + "mapping.sampleSize": "Tamaño de muestra", "mapping.noExactAlias": "No hay sugerencias exactas/alias que aplicar. Revisa las coincidencias aproximadas abajo.", - "mapping.noSuggestionsExtract": "No hay sugerencias — extrae primero el esquema.", - "mapping.schemaExtracted": "Esquema extraído: {fields} campos de {rows} fila(s) de muestra.", + "mapping.noSuggestionsExtract": "No hay sugerencias — extrae primero el esquema.", + "mapping.schemaExtracted": "Esquema extraído: {fields} campos de {rows} fila(s) de muestra.", "mapping.saved": "Mapeos de campos guardados{version}.", "mapping.savedVersion": " (v{version})", - "mapping.syncNoProducts": "Sincronización terminada; no hay productos que procesar.", + "mapping.syncNoProducts": "Sincronización terminada; no hay productos que procesar.", "mapping.jobSuffix": " (trabajo {jobId})", "mapping.appliedReplace": "Se aplicaron {count} mapeo(s) {kind}.", "mapping.appliedNew": "Se aplicaron {count} mapeo(s) {kind} nuevos ({total} en total).", "mapping.kindHighConfidence": "de alta confianza", "mapping.kindFuzzy": "aproximado(s)", - "mapping.fuzzyConfirmFlash": "{count} coincidencia aproximada por confirmar — usa Confirmar aproximados abajo o los chips por fila.", - "mapping.fuzzyConfirmFlashPlural": "{count} coincidencias aproximadas por confirmar — usa Confirmar aproximados abajo o los chips por fila.", - "mapping.formatHelp.title": "Cómo estructurar tu feed", + "mapping.fuzzyConfirmFlash": "{count} coincidencia aproximada por confirmar — usa Confirmar aproximados abajo o los chips por fila.", + "mapping.fuzzyConfirmFlashPlural": "{count} coincidencias aproximadas por confirmar — usa Confirmar aproximados abajo o los chips por fila.", + "mapping.formatHelp.title": "Cómo estructurar tu feed", "mapping.formatHelp.required": "Obligatorio:", "mapping.formatHelp.requiredBody": "{gtin} (EAN/UPC), {title} (o {name}), {brand}", - "mapping.formatHelp.https": "Usa URLs HTTPS públicas para feeds remotos (no FTP ni localhost). La carga CSV sirve para archivos locales.", + "mapping.formatHelp.https": "Usa URLs HTTPS públicas para feeds remotos (no FTP ni localhost). La carga CSV sirve para archivos locales.", "mapping.formatHelp.specs": "Especificaciones como pares Etiqueta: valor (p. ej. {ram}). Dimensiones: {height}, {width}, {depth}, {mass}", - "mapping.formatHelp.also": "También admitidos: precios, stock, imágenes, categoría, garantía, ID EPREL, descripciones HTML, imágenes extra, URL de vídeo y más — descarga la muestra completa.", + "mapping.formatHelp.also": "También admitidos: precios, stock, imágenes, categoría, garantía, ID EPREL, descripciones HTML, imágenes extra, URL de vídeo y más — descarga la muestra completa.", "mapping.formatHelp.downloadXml": "Descargar XML de muestra", "mapping.formatHelp.downloadCsv": "Descargar CSV de muestra", "mapping.formatHelp.xmlExample": "Ejemplo XML", @@ -1821,15 +1821,15 @@ export const es: MessageDict = { "mapping.sourcePreview.truncated": "Truncado", "mapping.sourcePreview.refresh": "Actualizar vista previa", "mapping.sourcePreview.copy": "Copiar vista previa", - "mapping.sourcePreview.loading": "Cargando muestra del feed…", - "mapping.sourcePreview.errorHint": "Aún puedes introducir la ruta del elemento de producto a mano. Extrae el esquema cuando la URL del feed sea accesible.", + "mapping.sourcePreview.loading": "Cargando muestra del feed…", + "mapping.sourcePreview.errorHint": "Aún puedes introducir la ruta del elemento de producto a mano. Extrae el esquema cuando la URL del feed sea accesible.", "mapping.sourcePreview.retry": "Reintentar", - "mapping.sourcePreview.empty": "Aún no hay vista previa", - "mapping.sourcePreview.emptyHintXml": "Haz clic en «Extraer esquema» para descargar una muestra y descubrir campos, o introduce una ruta de ítem a mano.", - "mapping.sourcePreview.emptyHintCsv": "Haz clic en «Extraer esquema» para descargar una muestra y descubrir campos.", + "mapping.sourcePreview.empty": "Aún no hay vista previa", + "mapping.sourcePreview.emptyHintXml": "Haz clic en «Extraer esquema» para descargar una muestra y descubrir campos, o introduce una ruta de ítem a mano.", + "mapping.sourcePreview.emptyHintCsv": "Haz clic en «Extraer esquema» para descargar una muestra y descubrir campos.", "mapping.sourcePreview.selectPath": "Seleccionar ruta: {path}", - "mapping.sourcePreview.clickTag": "Haz clic en una línea de etiqueta para fijar la ruta del elemento de producto.", - "mapping.table.search": "Buscar campos…", + "mapping.sourcePreview.clickTag": "Haz clic en una línea de etiqueta para fijar la ruta del elemento de producto.", + "mapping.table.search": "Buscar campos…", "mapping.table.all": "Todos los campos", "mapping.table.mapped": "Mapeado", "mapping.table.unmapped": "Sin mapear", @@ -1838,98 +1838,98 @@ export const es: MessageDict = { "mapping.table.sampleValues": "Valores de muestra", "mapping.table.type": "Tipo", "mapping.table.mapTo": "Mapear a", - "mapping.table.emptySchema": "Extrae el esquema del feed para rellenar los campos de origen, o añade mapeos a mano.", - "mapping.table.noMatch": "Ningún campo coincide con tus criterios.", - "mapping.table.unique": "{count} únicos", + "mapping.table.emptySchema": "Extrae el esquema del feed para rellenar los campos de origen, o añade mapeos a mano.", + "mapping.table.noMatch": "Ningún campo coincide con tus criterios.", + "mapping.table.unique": "{count} únicos", "mapping.table.nested": "anidado", "mapping.table.apply": "Aplicar", "mapping.table.confirm": "Confirmar", "mapping.table.suggestedMatch": "Coincidencia sugerida ({confidence})", "mapping.table.confirmFuzzyMatch": "Confirmar coincidencia aproximada ({percent}%)", "mapping.preview.title": "Vista previa del mapeo", - "mapping.preview.subtitle": "Forma de producto de muestra según tus mapeos actuales", - "mapping.preview.usingSamples": "· usando muestras extraídas", + "mapping.preview.subtitle": "Forma de producto de muestra según tus mapeos actuales", + "mapping.preview.usingSamples": "· usando muestras extraídas", "mapping.preview.formatCsv": "formato: csv", - "mapping.preview.item": "ítem: {path}", - "mapping.preview.sourceFields": "· {count} campos de origen", - "mapping.preview.empty": "Aún no hay campos mapeados", - "mapping.preview.emptyHint": "Asigna columnas o nodos XPath a campos de producto. Aquí aparecerá una vista previa de muestra.", + "mapping.preview.item": "ítem: {path}", + "mapping.preview.sourceFields": "· {count} campos de origen", + "mapping.preview.empty": "Aún no hay campos mapeados", + "mapping.preview.emptyHint": "Asigna columnas o nodos XPath a campos de producto. Aquí aparecerá una vista previa de muestra.", "mapping.preview.rawSample": "Fragmento de muestra en bruto", "imports.title": "Subidas", - "imports.description": "Importaciones CSV guardadas en este espacio de trabajo: productos, categorías y atributos.", + "imports.description": "Importaciones CSV guardadas en este espacio de trabajo: productos, categorías y atributos.", "imports.importProducts": "Importar productos", - "imports.emptyTitle": "Aún no hay subidas", - "imports.emptyMessage": "Las importaciones CSV de productos, categorías y atributos aparecerán aquí tras subirlas.", + "imports.emptyTitle": "Aún no hay subidas", + "imports.emptyMessage": "Las importaciones CSV de productos, categorías y atributos aparecerán aquí tras subirlas.", "imports.goProducts": "Ir a productos", - "imports.categories": "Categorías", + "imports.categories": "Categorías", "imports.recent": "Subidas recientes", "imports.fileCount": "{count} archivo", "imports.fileCountPlural": "{count} archivos", "imports.col.fileName": "Nombre de archivo", "imports.col.kind": "Tipo", "imports.col.uploaded": "Subido", - "imports.col.size": "Tamaño", + "imports.col.size": "Tamaño", "imports.actions": "Acciones de subida", "imports.loadFailed": "Error al cargar las subidas", - "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", + "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", "imports.metadataOnlyBadge": "Metadata only (blob not migrated)", - "imports.deleteConfirm": "¿Eliminar “{name}”? Se elimina el registro de subida (y el blob local si existe).", + "imports.deleteConfirm": "¿Eliminar “{name}”? Se elimina el registro de subida (y el blob local si existe).", "imports.deleted": "Subida eliminada.", "imports.deleteFailed": "No se pudo eliminar la subida", "imports.status.uploaded": "Subido", - "reviews.redirectLoading": "Abriendo reseñas de WooCommerce…", - "reviews.tab": "Reseñas", - "reviews.syncTitle": "Importación de reseñas (tienda → Descrybe)", - "reviews.syncDesc": "Importación entrante — trae reseñas de productos WooCommerce a Descrybe para campañas y reputación", - "reviews.syncQueued": "Sync de reseñas en cola", - "reviews.statusBadge": "Reseñas: {status}", + "reviews.redirectLoading": "Abriendo reseñas de WooCommerce…", + "reviews.tab": "Reseñas", + "reviews.syncTitle": "Importación de reseñas (tienda → Descrybe)", + "reviews.syncDesc": "Importación entrante — trae reseñas de productos WooCommerce a Descrybe para campañas y reputación", + "reviews.syncQueued": "Sync de reseñas en cola", + "reviews.statusBadge": "Reseñas: {status}", "reviews.syncedCount": "{count} sincronizados", - "reviews.lastSync": "Última sync: {date}", - "reviews.noSyncYet": "Aún no se ha completado ninguna sync de reseñas.", - "reviews.needsReconnect": "La importación de reseñas no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", - "reviews.queueImport": "Encolar importación de reseñas (tienda → Descrybe)", + "reviews.lastSync": "Última sync: {date}", + "reviews.noSyncYet": "Aún no se ha completado ninguna sync de reseñas.", + "reviews.needsReconnect": "La importación de reseñas no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", + "reviews.queueImport": "Encolar importación de reseñas (tienda → Descrybe)", "reviews.queueing": "Encolando...", - "reviews.saveTestFirst": "Guarda las credenciales y prueba la conexión antes de sincronizar", + "reviews.saveTestFirst": "Guarda las credenciales y prueba la conexión antes de sincronizar", "reviews.refreshList": "Actualizar lista", - "reviews.loading": "Cargando reseñas…", - "reviews.emptyTitle": "Aún no hay reseñas", - "reviews.emptyMessage": "Encola una sincronización de reseñas tras conectar tu tienda. Esta pestaña sigue usable con lista vacía.", + "reviews.loading": "Cargando reseñas…", + "reviews.emptyTitle": "Aún no hay reseñas", + "reviews.emptyMessage": "Encola una sincronización de reseñas tras conectar tu tienda. Esta pestaña sigue usable con lista vacía.", "reviews.col.product": "Producto", - "reviews.col.reviewer": "Reseñador", - "reviews.col.rating": "Valoración", + "reviews.col.reviewer": "Reseñador", + "reviews.col.rating": "Valoración", "reviews.col.review": "Revisar", - "reviews.queuedSuccess": "Sincronización de reseñas en cola. Se ejecutará en breve.", - "reviews.queueFailed": "No se pudo encolar la sincronización de reseñas", - "campaigns.title": "Campañas", - "campaigns.description": "Crea campañas de email de temporada a partir de tu catálogo: elige una temporada, selecciona productos, define la audiencia y genera.", - "campaigns.new": "Nueva campaña", - "campaigns.loading": "Cargando campañas…", - "campaigns.loadFailed": "Error al cargar campañas", - "campaigns.deleteConfirm": "¿Eliminar la campaña “{name}”? Esto no se puede deshacer.", - "campaigns.deleted": "Campaña eliminada", - "campaigns.deleteFailed": "Error al eliminar la campaña", - "campaigns.partialUnavailable": "Las campañas no están del todo accesibles ahora. Generar y enviar pueden fallar hasta que vuelva el servicio.", - "campaigns.searchPlaceholder": "Buscar campañas…", - "campaigns.unavailableTitle": "Campañas no disponibles", - "campaigns.unavailableMessage": "El servicio de campañas no está accesible. Puedes abrir el asistente, pero generar y enviar esperarán a que vuelva.", - "campaigns.openWizard": "Abrir asistente de creación", + "reviews.queuedSuccess": "Sincronización de reseñas en cola. Se ejecutará en breve.", + "reviews.queueFailed": "No se pudo encolar la sincronización de reseñas", + "campaigns.title": "Campañas", + "campaigns.description": "Crea campañas de email de temporada a partir de tu catálogo: elige una temporada, selecciona productos, define la audiencia y genera.", + "campaigns.new": "Nueva campaña", + "campaigns.loading": "Cargando campañas…", + "campaigns.loadFailed": "Error al cargar campañas", + "campaigns.deleteConfirm": "¿Eliminar la campaña “{name}”? Esto no se puede deshacer.", + "campaigns.deleted": "Campaña eliminada", + "campaigns.deleteFailed": "Error al eliminar la campaña", + "campaigns.partialUnavailable": "Las campañas no están del todo accesibles ahora. Generar y enviar pueden fallar hasta que vuelva el servicio.", + "campaigns.searchPlaceholder": "Buscar campañas…", + "campaigns.unavailableTitle": "Campañas no disponibles", + "campaigns.unavailableMessage": "El servicio de campañas no está accesible. Puedes abrir el asistente, pero generar y enviar esperarán a que vuelva.", + "campaigns.openWizard": "Abrir asistente de creación", "campaigns.backDashboard": "Volver al panel", "campaigns.browseProducts": "Explorar productos", - "campaigns.emptyTitle": "Aún no hay campañas", + "campaigns.emptyTitle": "Aún no hay campañas", "campaigns.noMatches": "Sin coincidencias", - "campaigns.emptyMessage": "Cree una campaña de Black Friday, Navidad o personalizada en pocos pasos — hay plantillas de temporada listas para empezar.", + "campaigns.emptyMessage": "Cree una campaña de Black Friday, Navidad o personalizada en pocos pasos — hay plantillas de temporada listas para empezar.", "campaigns.noMatchesMessage": "Prueba otro nombre, temporada o estado.", - "campaigns.create": "Crear campaña", + "campaigns.create": "Crear campaña", "campaigns.col.season": "Temporada", "campaigns.col.updated": "Actualizado", "campaigns.scheduled": "Programado {date}", - "campaigns.newTitle": "Nueva campaña", + "campaigns.newTitle": "Nueva campaña", "campaigns.newDesc": "Elige una temporada, selecciona productos y audiencia, escribe el prompt, luego genera, prueba y programa.", - "campaigns.editTitle": "Editar campaña", - "campaigns.editDesc": "Actualiza la temporada, los productos y la audiencia; luego vuelve a generar, envía una prueba o programa.", - "campaignWizard.loading": "Cargando asistente de campaña…", - "campaignWizard.apiMissing": "La API de campañas no está disponible temporalmente. Puedes explorar el asistente; guardar / generar / enviar necesitan /api/campaigns accesible.", - "campaignWizard.upgradeTitle": "Las campañas IA son una función de pago", + "campaigns.editTitle": "Editar campaña", + "campaigns.editDesc": "Actualiza la temporada, los productos y la audiencia; luego vuelve a generar, envía una prueba o programa.", + "campaignWizard.loading": "Cargando asistente de campaña…", + "campaignWizard.apiMissing": "La API de campañas no está disponible temporalmente. Puedes explorar el asistente; guardar / generar / enviar necesitan /api/campaigns accesible.", + "campaignWizard.upgradeTitle": "Las campañas IA son una función de pago", "campaignWizard.upgradeMessage": "Los planes Free pueden preparar temporadas y audiencias, pero Generar IA requiere Starter o superior. Mejora el plan para desbloquear borradores de email IA.", "campaignWizard.comparePlans": "Comparar planes", "campaignWizard.step.season": "Temporada", @@ -1939,136 +1939,136 @@ export const es: MessageDict = { "campaignWizard.step.preview": "Vista previa", "campaignWizard.step.send": "Enviar", "campaignWizard.pickSeason": "Elige una temporada", - "campaignWizard.pickSeasonHelp": "Empieza desde una plantilla — puedes editarlo todo después.", - "campaignWizard.name": "Nombre de campaña", + "campaignWizard.pickSeasonHelp": "Empieza desde una plantilla — puedes editarlo todo después.", + "campaignWizard.name": "Nombre de campaña", "campaignWizard.namePlaceholder": "Black Friday 2026", - "campaignWizard.catalogTitle": "Categorías y productos", - "campaignWizard.catalogHelp": "Elige qué debe destacar este email. Solo categorías bastan para un inicio rápido.", - "campaignWizard.categories": "Categorías", - "campaignWizard.noCategories": "Aún no hay categorías — añade algunas en Catálogo.", - "campaignWizard.categoriesSelected": "{count} categoría seleccionada", - "campaignWizard.categoriesSelectedPlural": "{count} categorías seleccionadas", + "campaignWizard.catalogTitle": "Categorías y productos", + "campaignWizard.catalogHelp": "Elige qué debe destacar este email. Solo categorías bastan para un inicio rápido.", + "campaignWizard.categories": "Categorías", + "campaignWizard.noCategories": "Aún no hay categorías — añade algunas en Catálogo.", + "campaignWizard.categoriesSelected": "{count} categoría seleccionada", + "campaignWizard.categoriesSelectedPlural": "{count} categorías seleccionadas", "campaignWizard.productsOptional": "Productos (opcional)", "campaignWizard.selectedCount": "{count} seleccionados", - "campaignWizard.searchProducts": "Buscar productos…", + "campaignWizard.searchProducts": "Buscar productos…", "campaignWizard.noProducts": "No se encontraron productos.", - "campaignWizard.audienceTitle": "¿Quién debería recibirlo?", - "campaignWizard.audienceHelp": "Por defecto a todos. Acota con categorías o compradores previos cuando haya pedidos sincronizados.", + "campaignWizard.audienceTitle": "¿Quién debería recibirlo?", + "campaignWizard.audienceHelp": "Por defecto a todos. Acota con categorías o compradores previos cuando haya pedidos sincronizados.", "campaignWizard.audience.all": "Todos los contactos", - "campaignWizard.audience.allHint": "Enviar a toda tu lista (cuando el proveedor de email esté configurado).", - "campaignWizard.audience.byCategory": "Por interés de categoría", - "campaignWizard.audience.byCategoryHint": "Personas asociadas a las categorías seleccionadas.", - "campaignWizard.audience.purchased": "Comprado en categoría", - "campaignWizard.audience.purchasedHint": "Clientes que compraron productos en las categorías de audiencia (desde pedidos sync).", - "campaignWizard.audience.notPurchased": "Aún no comprado", - "campaignWizard.audience.notPurchasedHint": "Contactos que no han comprado esas categorías — ideal para recuperar.", - "campaignWizard.ordersHint": "La segmentación comprado / no comprado aparece tras sync de pedidos WooCommerce.", - "campaignWizard.audienceCategories": "Categorías de audiencia", + "campaignWizard.audience.allHint": "Enviar a toda tu lista (cuando el proveedor de email esté configurado).", + "campaignWizard.audience.byCategory": "Por interés de categoría", + "campaignWizard.audience.byCategoryHint": "Personas asociadas a las categorías seleccionadas.", + "campaignWizard.audience.purchased": "Comprado en categoría", + "campaignWizard.audience.purchasedHint": "Clientes que compraron productos en las categorías de audiencia (desde pedidos sync).", + "campaignWizard.audience.notPurchased": "Aún no comprado", + "campaignWizard.audience.notPurchasedHint": "Contactos que no han comprado esas categorías — ideal para recuperar.", + "campaignWizard.ordersHint": "La segmentación comprado / no comprado aparece tras sync de pedidos WooCommerce.", + "campaignWizard.audienceCategories": "Categorías de audiencia", "campaignWizard.promptTitle": "Prompt del email", - "campaignWizard.promptHelp": "Rellenamos un valor sólido por defecto para {season}. Edítalo o déjalo.", + "campaignWizard.promptHelp": "Rellenamos un valor sólido por defecto para {season}. Edítalo o déjalo.", "campaignWizard.promptSeasonFallback": "esta temporada", "campaignWizard.useDefaultPrompt": "Usar prompt estacional por defecto", "campaignWizard.promptLabel": "Prompt", "campaignWizard.advanced": "Opciones avanzadas", - "campaignWizard.advancedHelp": "La generación IA usa tu kit de marca (si hay) y productos seleccionados. La vista previa solo plantilla omite la IA y sirve de borrador de diseño.", + "campaignWizard.advancedHelp": "La generación IA usa tu kit de marca (si hay) y productos seleccionados. La vista previa solo plantilla omite la IA y sirve de borrador de diseño.", "campaignWizard.planFree": "Gratis", "campaignWizard.planPaid": "De pago", "campaignWizard.planLine": "Plan:", - "campaignWizard.aiLocked": "— Generar IA está bloqueado.", + "campaignWizard.aiLocked": "— Generar IA está bloqueado.", "campaignWizard.generateAi": "Generar IA", "campaignWizard.templatePreview": "Vista previa de plantilla", "campaignWizard.saveDraft": "Guardar borrador", "campaignWizard.previewTitle": "Vista previa", "campaignWizard.status": "Estado:", "campaignWizard.generateToSee": "Genera un borrador para ver el cuerpo del email.", - "campaignWizard.noPreview": "Aún no hay vista previa. Vuelve a Prompt y ejecuta Generar IA o Vista previa de plantilla.", + "campaignWizard.noPreview": "Aún no hay vista previa. Vuelve a Prompt y ejecuta Generar IA o Vista previa de plantilla.", "campaignWizard.backToPrompt": "Volver al prompt", "campaignWizard.subject": "Asunto", "campaignWizard.emailPreview": "Vista previa del email", "campaignWizard.regenerateAi": "Regenerar con IA", "campaignWizard.regenerate": "Regenerar", "campaignWizard.continueSend": "Continuar para enviar", - "campaignWizard.testSend": "Envío de prueba", - "campaignWizard.testSendHelp": "Envíate una copia antes de programar.", + "campaignWizard.testSend": "Envío de prueba", + "campaignWizard.testSendHelp": "Envíate una copia antes de programar.", "campaignWizard.testEmail": "Email de prueba", "campaignWizard.testEmailPlaceholder": "tu@empresa.com", "campaignWizard.sendTest": "Enviar prueba", "campaignWizard.scheduleTitle": "Programar", - "campaignWizard.scheduleHelp": "Elige cuándo debe salir esta campaña.", + "campaignWizard.scheduleHelp": "Elige cuándo debe salir esta campaña.", "campaignWizard.sendAt": "Enviar a las", - "campaignWizard.schedule": "Programar campaña", + "campaignWizard.schedule": "Programar campaña", "campaignWizard.generateToContinue": "Genera para continuar", "campaignWizard.done": "Hecho", "campaignWizard.loadFailed": "Error al cargar el asistente", - "campaignWizard.pickCatalog": "Elige al menos una categoría o producto", - "campaignWizard.pickAudienceCats": "Elige categorías de audiencia para este filtro", + "campaignWizard.pickCatalog": "Elige al menos una categoría o producto", + "campaignWizard.pickAudienceCats": "Elige categorías de audiencia para este filtro", "campaignWizard.completeStep": "Completa este paso para continuar", "campaignWizard.aiDraftReady": "Borrador de IA generado", "campaignWizard.templateReady": "Vista previa de plantilla lista", - "campaignWizard.unavailableSave": "Las campañas no están disponibles ahora. No se pueden guardar borradores hasta que la función esté activa.", + "campaignWizard.unavailableSave": "Las campañas no están disponibles ahora. No se pueden guardar borradores hasta que la función esté activa.", "campaignWizard.generateFailed": "Error al generar", "campaignWizard.generateFirst": "Genera primero una vista previa", - "campaignWizard.enterTestEmail": "Introduce una dirección de correo de prueba", - "campaignWizard.testFailed": "Error en el envío de prueba", + "campaignWizard.enterTestEmail": "Introduce una dirección de correo de prueba", + "campaignWizard.testFailed": "Error en el envío de prueba", "campaignWizard.pickSchedule": "Elige una fecha y hora", - "campaignWizard.scheduled": "Campaña programada", + "campaignWizard.scheduled": "Campaña programada", "campaignWizard.scheduleFailed": "Error al programar", "campaignWizard.draftSaved": "Borrador guardado", - "campaignWizard.unavailableShort": "Las campañas no están disponibles ahora.", + "campaignWizard.unavailableShort": "Las campañas no están disponibles ahora.", "campaignWizard.saveFailed": "Error al guardar", "marketing.calendarTitle": "Calendario de contenido", - "marketing.calendarDesc": "Vincula campañas estacionales a fechas y prepara un feed de exportación con valores de shopping.", + "marketing.calendarDesc": "Vincula campañas estacionales a fechas y prepara un feed de exportación con valores de shopping.", "marketing.loadFailed": "Error al cargar el calendario", - "marketing.prepared": "Campaña preparada", - "marketing.alreadyReady": "La campaña ya está lista", - "marketing.exportFeedsHint": "{name} → Feeds de exportación", - "marketing.prepareFailed": "No se pudo preparar la campaña", + "marketing.prepared": "Campaña preparada", + "marketing.alreadyReady": "La campaña ya está lista", + "marketing.exportFeedsHint": "{name} → Feeds de exportación", + "marketing.prepareFailed": "No se pudo preparar la campaña", "marketing.requestFailed": "Error en la solicitud", "marketing.emptyTitle": "No hay presets estacionales", - "marketing.emptyMessage": "Los presets del calendario aparecerán aquí cuando la API de marketing esté disponible.", - "marketing.openCampaigns": "Abrir campañas de email", + "marketing.emptyMessage": "Los presets del calendario aparecerán aquí cuando la API de marketing esté disponible.", + "marketing.openCampaigns": "Abrir campañas de email", "marketing.window": "Ventana:", - "marketing.linkedExport": "Exportación vinculada:", + "marketing.linkedExport": "Exportación vinculada:", "marketing.openPrepared": "Abrir feed preparado", - "marketing.preparing": "Preparando…", - "marketing.prepareNamed": "Preparar campaña {name}", - "marketing.footer": "Las campañas de email están en {link} — esta página solo prepara feeds de exportación del catálogo.", + "marketing.preparing": "Preparando…", + "marketing.prepareNamed": "Preparar campaña {name}", + "marketing.footer": "Las campañas de email están en {link} — esta página solo prepara feeds de exportación del catálogo.", "common.done": "Hecho", "common.copied": "Copiado al portapapeles.", - "common.copyFailed": "No se pudo copiar. Selecciona el texto y cópialo manualmente.", - "common.submitting": "Enviando…", - "common.sending": "Enviando…", - "settings.companyAdminOnlyView": "Solo los admins de la empresa pueden cambiar la configuración. Puedes ver los detalles del espacio de trabajo actual.", - "settings.activeCompanyHelp": "Espacio de trabajo para catálogo, feeds, facturación y claves API. Cámbialo cuando quieras desde aquí o la cabecera.", + "common.copyFailed": "No se pudo copiar. Selecciona el texto y cópialo manualmente.", + "common.submitting": "Enviando…", + "common.sending": "Enviando…", + "settings.companyAdminOnlyView": "Solo los admins de la empresa pueden cambiar la configuración. Puedes ver los detalles del espacio de trabajo actual.", + "settings.activeCompanyHelp": "Espacio de trabajo para catálogo, feeds, facturación y claves API. Cámbialo cuando quieras desde aquí o la cabecera.", "settings.noCompanySelected": "Ninguna empresa seleccionada", - "settings.creditsOverviewHelp": "Saldo de créditos de IA de la empresa activa. El uso detallado está en Facturación.", - "settings.billingLabel": "Facturación", + "settings.creditsOverviewHelp": "Saldo de créditos de IA de la empresa activa. El uso detallado está en Facturación.", + "settings.billingLabel": "Facturación", "settings.remainingLabel": "Restantes", - "settings.creditsUnavailable": "El saldo de créditos aún no está disponible para este espacio de trabajo.", - "settings.openBilling": "Abrir uso y facturación", - "settings.companyNameHelp": "Este nombre aparece en invitaciones y ajustes de la organización", + "settings.creditsUnavailable": "El saldo de créditos aún no está disponible para este espacio de trabajo.", + "settings.openBilling": "Abrir uso y facturación", + "settings.companyNameHelp": "Este nombre aparece en invitaciones y ajustes de la organización", "settings.contentSettingsHelp": "Configura el idioma y la coincidencia de productos para el contenido generado", - "settings.mergeProductsHelp": "Si está activado, las importaciones CSV combinan filas con el mismo GTIN en un producto. Desactívalo para mantener cada fila independiente.", - "settings.emailIntegrationHelp": "Configura Resend o SMTP para invitaciones, campañas y correo transaccional.", + "settings.mergeProductsHelp": "Si está activado, las importaciones CSV combinan filas con el mismo GTIN en un producto. Desactívalo para mantener cada fila independiente.", + "settings.emailIntegrationHelp": "Configura Resend o SMTP para invitaciones, campañas y correo transaccional.", "settings.configureEmail": "Configurar correo", - "settings.aiIntegrationsHelp": "Créditos de plataforma o tu propia clave, más prompts editables para títulos, descripciones, SEO y campañas. Claves cifradas en reposo.", + "settings.aiIntegrationsHelp": "Créditos de plataforma o tu propia clave, más prompts editables para títulos, descripciones, SEO y campañas. Claves cifradas en reposo.", "settings.openAiIntegrations": "Abrir integraciones de IA", "settings.companyNameRequired": "Introduce un nombre de empresa.", "settings.companySaved": "Ajustes de empresa guardados.", "settings.companyUpdateFailed": "No se pudo actualizar la empresa", - "settings.mergeOn": "Los productos con el mismo GTIN se fusionarán entre feeds.", + "settings.mergeOn": "Los productos con el mismo GTIN se fusionarán entre feeds.", "settings.mergeOff": "Los productos con el mismo GTIN se mantienen separados.", - "settings.mergeUpdateFailed": "No se pudo actualizar el ajuste de fusión", - "settings.inAppToastsHelp": "Solo en este navegador. Los fallos están activados por defecto; las finalizaciones se silencian para reducir ruido. El feedback de formularios y Deshacer nunca se silencian.", - "settings.emailAlertsHelp": "Las preferencias de alertas por correo llegarán pronto. Las alertas de fallo estarán activas por defecto (como en la app); los correos de finalización permanecerán desactivados salvo que te suscribas.", - "settings.emailAlertsBody": "Por ahora, configura el correo transaccional en Empresa → Integración de correo. Las alertas in-app de arriba siguen aplicando.", - "settings.apiKeysLegacyNotice": "Las claves API antiguas no se migraron. Crea una nueva para restaurar el acceso — el secreto se muestra solo una vez.", + "settings.mergeUpdateFailed": "No se pudo actualizar el ajuste de fusión", + "settings.inAppToastsHelp": "Solo en este navegador. Los fallos están activados por defecto; las finalizaciones se silencian para reducir ruido. El feedback de formularios y Deshacer nunca se silencian.", + "settings.emailAlertsHelp": "Las preferencias de alertas por correo llegarán pronto. Las alertas de fallo estarán activas por defecto (como en la app); los correos de finalización permanecerán desactivados salvo que te suscribas.", + "settings.emailAlertsBody": "Por ahora, configura el correo transaccional en Empresa → Integración de correo. Las alertas in-app de arriba siguen aplicando.", + "settings.apiKeysLegacyNotice": "Las claves API antiguas no se migraron. Crea una nueva para restaurar el acceso — el secreto se muestra solo una vez.", "settings.apiKeysAdminOnly": "Solo los administradores pueden crear o revocar claves API. Puedes ver los prefijos existentes.", - "settings.apiKeysCopyUnavailableNotice": "Copia no disponible para claves existentes — solo se guarda el prefijo. Crea una nueva para copiar el secreto completo una vez y revoca la antigua si hace falta.", + "settings.apiKeysCopyUnavailableNotice": "Copia no disponible para claves existentes — solo se guarda el prefijo. Crea una nueva para copiar el secreto completo una vez y revoca la antigua si hace falta.", "settings.apiKeysForbidden": "No tienes permiso para ver las claves API. Pide ayuda a un administrador de la empresa.", - "settings.noApiKeys": "Aún no hay claves API", + "settings.noApiKeys": "Aún no hay claves API", "settings.noApiKeysHelpAdmin": "Las claves API antiguas no se migraron. Crea una nueva para autenticar solicitudes Descrybe (X-API-Key). El secreto completo se muestra solo una vez.", - "settings.noApiKeysHelpMember": "Aún no hay claves API para esta empresa. Las antiguas no se migraron — pide a un administrador que cree una.", + "settings.noApiKeysHelpMember": "Aún no hay claves API para esta empresa. Las antiguas no se migraron — pide a un administrador que cree una.", "settings.unnamedKey": "Clave sin nombre", "settings.neverUsed": "Nunca usado", "settings.apiKeyActions": "Acciones de clave API", @@ -2076,30 +2076,30 @@ export const es: MessageDict = { "settings.copyUnavailableTitle": "El secreto completo se muestra solo una vez al crear la clave", "settings.revoke": "Revocar", "settings.apiKeyNameRequired": "Introduce un nombre para esta clave API.", - "settings.apiKeyCreatedOnce": "Clave API creada. Cópiala ahora: no se volverá a mostrar.", + "settings.apiKeyCreatedOnce": "Clave API creada. Cópiala ahora: no se volverá a mostrar.", "settings.apiKeyCreated": "Clave API creada.", "settings.apiKeyCreateFailed": "No se pudo crear la clave API", - "settings.apiKeyRevokeConfirm": "¿Revocar esta clave API? Las solicitudes que la usen dejarán de funcionar.", + "settings.apiKeyRevokeConfirm": "¿Revocar esta clave API? Las solicitudes que la usen dejarán de funcionar.", "settings.apiKeyRevoked": "Clave API revocada.", "settings.apiKeyRevokeFailed": "No se pudo revocar la clave API", "settings.apiKeyCopied": "Clave API copiada.", - "settings.createApiKeyOnceHelp": "Copia esta clave ahora — no se volverá a mostrar. Úsala como Authorization: Bearer o X-API-Key en /api/v1.", - "settings.createApiKeyNameHelp": "Ponle nombre a la clave para distinguirla después. Tras crearla, envíala como Authorization: Bearer (preferido) o X-API-Key.", + "settings.createApiKeyOnceHelp": "Copia esta clave ahora — no se volverá a mostrar. Úsala como Authorization: Bearer o X-API-Key en /api/v1.", + "settings.createApiKeyNameHelp": "Ponle nombre a la clave para distinguirla después. Tras crearla, envíala como Authorization: Bearer (preferido) o X-API-Key.", "settings.keyNamePlaceholder": "p. ej. Production", "settings.newApiKeyAria": "Nueva clave API mostrada una vez", "settings.copyApiKeyAria": "Copiar clave API", "settings.alert.sync_fail.title": "Fallos de sync", - "settings.alert.sync_fail.description": "Cuando una sincronización de feed agota el tiempo o la API devuelve un error.", + "settings.alert.sync_fail.description": "Cuando una sincronización de feed agota el tiempo o la API devuelve un error.", "settings.alert.sync_done.title": "Sync completada", - "settings.alert.sync_done.description": "Cuando una sincronización de feed termina correctamente.", + "settings.alert.sync_done.description": "Cuando una sincronización de feed termina correctamente.", "settings.alert.ai_fail.title": "Fallos de IA / procesamiento", - "settings.alert.ai_fail.description": "Cuando falla el inicio o la ejecución de un trabajo de procesamiento.", + "settings.alert.ai_fail.description": "Cuando falla el inicio o la ejecución de un trabajo de procesamiento.", "settings.alert.ai_done.title": "IA / procesamiento completado", "settings.alert.ai_done.description": "Cuando un trabajo en segundo plano termina correctamente. Los toasts de inicio permanecen siempre activos para que Deshacer siga disponible.", - "settings.alert.export_fail.title": "Fallos de exportación", - "settings.alert.export_fail.description": "Cuando falla la exportación de un producto o feed de exportación.", - "settings.alert.export_done.title": "Exportación completada", - "settings.alert.export_done.description": "Cuando una exportación termina correctamente.", + "settings.alert.export_fail.title": "Fallos de exportación", + "settings.alert.export_fail.description": "Cuando falla la exportación de un producto o feed de exportación.", + "settings.alert.export_done.title": "Exportación completada", + "settings.alert.export_done.description": "Cuando una exportación termina correctamente.", "settings.alert.support_reply.title": "Respuestas del personal de soporte", "settings.alert.support_reply.description": "Cuando un agente de la plataforma responde a tu ticket de soporte.", "settings.alert.support_status.title": "Cambios de estado de soporte", @@ -2107,47 +2107,47 @@ export const es: MessageDict = { "empty.forbidden.title.company": "Permiso denegado", "empty.forbidden.title.platform": "Acceso restringido", "empty.forbidden.message.company": "No tienes permiso para esto. Pide ayuda a un administrador de la empresa.", - "empty.forbidden.message.platform": "Esta área solo está disponible para administradores de la plataforma.", - "empty.forbidden.message.support": "Esta área solo está disponible para personal de soporte y administradores de la plataforma.", + "empty.forbidden.message.platform": "Esta área solo está disponible para administradores de la plataforma.", + "empty.forbidden.message.support": "Esta área solo está disponible para personal de soporte y administradores de la plataforma.", "empty.forbidden.backDashboard": "Volver al panel", "empty.forbidden.apiKeys": "No tienes permiso para ver las claves API. Pide ayuda a un administrador de la empresa.", - "empty.forbidden.ai": "No tienes permiso para ver la configuración del proveedor de IA. Pide ayuda a un administrador.", - "empty.forbidden.email": "No tienes permiso para ver la configuración del proveedor de correo. Pide ayuda a un administrador.", - "confirm.defaultTitle": "Confirmar eliminación", - "confirm.defaultDescription": "¿Estás seguro?", + "empty.forbidden.ai": "No tienes permiso para ver la configuración del proveedor de IA. Pide ayuda a un administrador.", + "empty.forbidden.email": "No tienes permiso para ver la configuración del proveedor de correo. Pide ayuda a un administrador.", + "confirm.defaultTitle": "Confirmar eliminación", + "confirm.defaultDescription": "¿Estás seguro?", "confirm.defaultConfirm": "Confirmar", - "confirm.deleteFeed": "¿Eliminar el feed “{name}”? Esto no se puede deshacer.", - "confirm.deleteCampaign": "¿Eliminar la campaña “{name}”? Esto no se puede deshacer.", - "confirm.deleteExportFeed": "¿Seguro que quieres eliminar este feed de exportación?", + "confirm.deleteFeed": "¿Eliminar el feed “{name}”? Esto no se puede deshacer.", + "confirm.deleteCampaign": "¿Eliminar la campaña “{name}”? Esto no se puede deshacer.", + "confirm.deleteExportFeed": "¿Seguro que quieres eliminar este feed de exportación?", "confirm.rotateExportToken": "Rotar el token de la URL del feed? La URL publica anterior dejara de funcionar de inmediato.", - "confirm.deleteUpload": "¿Eliminar “{name}”? Se elimina el registro de subida (y el blob local si existe).", - "confirm.revokeApiKey": "¿Revocar esta clave API? Las solicitudes que la usen dejarán de funcionar.", - "confirm.deleteKnowledgeArticle": "¿Eliminar este artículo de conocimiento?", - "confirm.deleteReplyTemplate": "¿Eliminar esta plantilla de respuesta?", - "confirm.deleteStructuredField": "¿Seguro que quieres eliminar este campo? Esta acción no se puede deshacer.", - "toast.campaign.pickAudience": "Elige al menos una categoría o producto", - "toast.campaign.pickCategories": "Elige categorías de audiencia para este filtro", + "confirm.deleteUpload": "¿Eliminar “{name}”? Se elimina el registro de subida (y el blob local si existe).", + "confirm.revokeApiKey": "¿Revocar esta clave API? Las solicitudes que la usen dejarán de funcionar.", + "confirm.deleteKnowledgeArticle": "¿Eliminar este artículo de conocimiento?", + "confirm.deleteReplyTemplate": "¿Eliminar esta plantilla de respuesta?", + "confirm.deleteStructuredField": "¿Seguro que quieres eliminar este campo? Esta acción no se puede deshacer.", + "toast.campaign.pickAudience": "Elige al menos una categoría o producto", + "toast.campaign.pickCategories": "Elige categorías de audiencia para este filtro", "toast.campaign.completeStep": "Completa este paso para continuar", "toast.campaign.aiDraft": "Borrador de IA generado", "toast.campaign.templatePreview": "Vista previa de plantilla lista", "toast.campaign.generateFirst": "Genera primero una vista previa", "toast.campaign.testSent": "Correo de prueba enviado a {email}", - "toast.campaign.scheduled": "Campaña programada", + "toast.campaign.scheduled": "Campaña programada", "toast.campaign.draftSaved": "Borrador guardado", - "toast.campaign.deleted": "Campaña eliminada", - "toast.campaign.prepared": "Campaña preparada", - "toast.campaign.alreadyReady": "La campaña ya está lista", - "toast.campaign.prepareFailed": "No se pudo preparar la campaña", - "toast.campaign.deleteFailed": "Error al eliminar la campaña", + "toast.campaign.deleted": "Campaña eliminada", + "toast.campaign.prepared": "Campaña preparada", + "toast.campaign.alreadyReady": "La campaña ya está lista", + "toast.campaign.prepareFailed": "No se pudo preparar la campaña", + "toast.campaign.deleteFailed": "Error al eliminar la campaña", "toast.feed.copyFailed": "No se pudo copiar la URL", "toast.feed.created": "Feed creado", "toast.feed.updated": "Feed actualizado.", "toast.feed.mapBeforeSync": "Mapea los campos antes de sincronizar este feed.", "toast.feed.activateBeforeSync": "Activa el feed antes de sincronizar.", - "toast.feed.syncFinished": "Sincronización finalizada", + "toast.feed.syncFinished": "Sincronización finalizada", "toast.feed.deleted": "Feed eliminado.", "toast.feed.mappingLoadFailed": "No se pudieron cargar las asignaciones. Abre el mapeo para corregirlas antes de sincronizar.", - "toast.feed.syncFailed": "Error de sincronización", + "toast.feed.syncFailed": "Error de sincronización", "toast.feed.statusFailed": "No se pudo actualizar el estado", "toast.feed.deleteFailed": "No se pudo eliminar el feed", "toast.feed.beforeSampling": "Antes del muestreo", @@ -2155,17 +2155,17 @@ export const es: MessageDict = { "toast.processing.jobFailed": "Procesamiento fallido", "toast.products.startFailed": "No se pudo iniciar el procesamiento", "toast.products.jobStarted": "Trabajo de procesamiento iniciado", - "toast.products.acceptUndone": "Aceptación deshecha", + "toast.products.acceptUndone": "Aceptación deshecha", "toast.products.resetComplete": "Restablecimiento completado", - "toast.products.nameAcceptUndone": "Aceptación del nombre deshecha", - "toast.products.descAcceptUndone": "Aceptación de la descripción deshecha", + "toast.products.nameAcceptUndone": "Aceptación del nombre deshecha", + "toast.products.descAcceptUndone": "Aceptación de la descripción deshecha", "toast.products.cancelOne": "Procesamiento cancelado", "toast.products.cancelMany": "Trabajos de procesamiento cancelados", "toast.products.startJobFailed": "No se pudo iniciar el trabajo de procesamiento", "toast.products.acceptFailed": "No se pudo aceptar el enriquecimiento", "toast.products.updateFailed": "No se pudo actualizar el producto", - "toast.products.undoAcceptFailed": "No se pudo deshacer la aceptación", - "toast.products.undoFieldAcceptFailed": "No se pudo deshacer la aceptación del campo", + "toast.products.undoAcceptFailed": "No se pudo deshacer la aceptación", + "toast.products.undoFieldAcceptFailed": "No se pudo deshacer la aceptación del campo", "toast.products.undoFieldDiscardFailed": "No se pudo deshacer el descarte del campo", "toast.products.rejectFailed": "No se pudo rechazar el enriquecimiento", "toast.products.exportFailed": "No se pudieron exportar los productos seleccionados", @@ -2173,37 +2173,37 @@ export const es: MessageDict = { "toast.products.cancelFailed": "No se pudo cancelar el trabajo de procesamiento", "toast.support.ticketCreated": "Ticket creado", "toast.support.replySent": "Respuesta enviada", - "toast.support.thanksFeedback": "Gracias por tu opinión", + "toast.support.thanksFeedback": "Gracias por tu opinión", "toast.support.createFailed": "No se pudo crear el ticket", "toast.support.unavailable": "Soporte no disponible", "toast.support.loadFailed": "Error al cargar los tickets de soporte", "toast.support.loadTicketFailed": "Error al cargar el ticket", "toast.support.replyFailed": "No se pudo enviar la respuesta", - "toast.support.ratingUnavailable": "Valoración no disponible", + "toast.support.ratingUnavailable": "Valoración no disponible", "toast.support.alreadyRated": "Ya valorado", - "toast.support.ratingFailed": "No se pudo enviar la valoración", - "toast.structured.fieldAdded": "Campo añadido", - "toast.structured.fieldAddedBody": "Se ha añadido el campo de descripción estructurada.", + "toast.support.ratingFailed": "No se pudo enviar la valoración", + "toast.structured.fieldAdded": "Campo añadido", + "toast.structured.fieldAddedBody": "Se ha añadido el campo de descripción estructurada.", "toast.structured.fieldDeleted": "Campo eliminado", - "toast.structured.fieldDeletedBody": "Se ha eliminado el campo de descripción estructurada.", - "toast.structured.addFailed": "Error al añadir el campo", + "toast.structured.fieldDeletedBody": "Se ha eliminado el campo de descripción estructurada.", + "toast.structured.addFailed": "Error al añadir el campo", "toast.structured.deleteFailed": "No se pudo eliminar el campo", "toast.brand.saved": "Kit de marca guardado", "toast.brand.logoUploaded": "Logo subido", "toast.brand.saveFailed": "Error al guardar el kit de marca", "toast.brand.uploadFailed": "Error al subir el logo", - "toast.vector.indexCreated": "Índice vectorial creado correctamente", + "toast.vector.indexCreated": "Índice vectorial creado correctamente", "toast.vector.dbInitialized": "Base de datos vectorial inicializada correctamente", - "toast.vector.indexFailed": "Error al crear el índice vectorial", + "toast.vector.indexFailed": "Error al crear el índice vectorial", "toast.vector.initFailed": "Error al inicializar la base de datos vectorial", - "toast.vector.searchFailed": "Error al buscar categorías", + "toast.vector.searchFailed": "Error al buscar categorías", "toast.export.refreshFailed": "Error al actualizar el feed", "toast.mapping.loadFailed": "Error al cargar el mapeo del feed", "toast.mapping.extractFailed": "Error al extraer el esquema", "toast.mapping.saveFailed": "Error al guardar las asignaciones de campos", - "toast.mapping.sampleFailed": "Falló sincronizar + procesar la muestra", + "toast.mapping.sampleFailed": "Falló sincronizar + procesar la muestra", "toast.attrs.createFailed": "Error al crear", - "toast.attrs.importFailed": "Error de importación", + "toast.attrs.importFailed": "Error de importación", "toast.attrs.updateFailed": "Error al actualizar", "toast.attrs.deleteFailed": "Error al eliminar", "toast.switcher.loadUsersFailed": "No se pudieron cargar los usuarios conmutables", @@ -2211,12 +2211,12 @@ export const es: MessageDict = { "toast.switcher.returnFailed": "No se pudo volver al usuario original", "toast.switcher.companyFailed": "No se pudo cambiar de empresa", "toast.requestFailed": "Error en la solicitud", - "flash.campaign.unavailableDraft": "Las campañas no están disponibles ahora. No se pueden guardar borradores hasta que la función esté activa.", - "flash.campaign.testEmailRequired": "Introduce una dirección de correo de prueba", + "flash.campaign.unavailableDraft": "Las campañas no están disponibles ahora. No se pueden guardar borradores hasta que la función esté activa.", + "flash.campaign.testEmailRequired": "Introduce una dirección de correo de prueba", "flash.campaign.scheduleRequired": "Elige una fecha y hora", - "flash.campaign.unavailable": "Las campañas no están disponibles ahora.", + "flash.campaign.unavailable": "Las campañas no están disponibles ahora.", "flash.campaign.generateFailed": "Error al generar", - "flash.campaign.testFailed": "Error en el envío de prueba", + "flash.campaign.testFailed": "Error en el envío de prueba", "flash.campaign.scheduleFailed": "Error al programar", "flash.campaign.saveFailed": "Error al guardar", "flash.feed.copyFailed": "No se pudo copiar la URL", @@ -2224,32 +2224,32 @@ export const es: MessageDict = { "flash.feed.csvFileRequired": "Elige un archivo CSV.", "flash.feed.urlRequired": "La URL del feed es obligatoria.", "flash.feed.updated": "Feed actualizado.", - "flash.feed.syncFinishedNamed": "Sincronización terminada para \"{name}\" ({status}: {products}).", + "flash.feed.syncFinishedNamed": "Sincronización terminada para \"{name}\" ({status}: {products}).", "flash.feed.deleted": "Feed eliminado.", "flash.feed.createFailed": "No se pudo crear el feed", "flash.feed.updateFailed": "No se pudo actualizar el feed", "flash.settings.companyNameRequired": "Introduce un nombre de empresa.", "flash.settings.companySaved": "Ajustes de empresa guardados.", "flash.settings.companyFailed": "No se pudo actualizar la empresa", - "flash.settings.mergeFailed": "No se pudo actualizar el ajuste de fusión", + "flash.settings.mergeFailed": "No se pudo actualizar el ajuste de fusión", "flash.settings.apiKeyNameRequired": "Introduce un nombre para esta clave API.", "flash.settings.apiKeyCreatedFailed": "No se pudo crear la clave API", "flash.settings.apiKeyRevoked": "Clave API revocada.", "flash.settings.apiKeyRevokeFailed": "No se pudo revocar la clave API", - "flash.settings.copyFailed": "No se pudo copiar. Selecciona el texto y cópialo manualmente.", - "flash.products.accepted": "Se aceptaron {count} producto(s) — movidos a Procesados.", + "flash.settings.copyFailed": "No se pudo copiar. Selecciona el texto y cópialo manualmente.", + "flash.products.accepted": "Se aceptaron {count} producto(s) — movidos a Procesados.", "flash.products.updated": "Producto actualizado.", - "flash.products.enrichmentAccepted": "Enriquecimiento aceptado — movido a Procesados.", - "flash.products.originalEmpty": "El valor original está vacío; el enriquecimiento no se puede borrar vía PATCH.", + "flash.products.enrichmentAccepted": "Enriquecimiento aceptado — movido a Procesados.", + "flash.products.originalEmpty": "El valor original está vacío; el enriquecimiento no se puede borrar vía PATCH.", "flash.products.selectExport": "Selecciona al menos un producto para exportar.", - "flash.products.exported": "Se exportaron {count} producto(s) vía feed de exportación.", + "flash.products.exported": "Se exportaron {count} producto(s) vía feed de exportación.", "flash.support.missingId": "Falta el id del ticket", "flash.support.notFound": "Ticket no encontrado", - "flash.support.unavailable": "El soporte no está disponible temporalmente.", - "flash.support.ratingUnavailable": "La valoración no está disponible temporalmente. Inténtalo más tarde.", + "flash.support.unavailable": "El soporte no está disponible temporalmente.", + "flash.support.ratingUnavailable": "La valoración no está disponible temporalmente. Inténtalo más tarde.", "flash.support.alreadyRated": "Ya valoraste este ticket.", - "flash.support.queueUnavailable": "La cola de soporte no está disponible en este despliegue.", - "flash.support.deploymentUnavailable": "El soporte no está disponible en este despliegue.", + "flash.support.queueUnavailable": "La cola de soporte no está disponible en este despliegue.", + "flash.support.deploymentUnavailable": "El soporte no está disponible en este despliegue.", "flash.support.replyRequired": "El cuerpo de la respuesta es obligatorio.", "flash.support.draftRequired": "El cuerpo del borrador es obligatorio antes de aprobar.", "flash.support.claimed": "Ticket reclamado.", @@ -2259,39 +2259,39 @@ export const es: MessageDict = { "flash.support.draftApproved": "Borrador de IA aprobado y enviado al cliente.", "flash.support.draftSent": "Borrador enviado como respuesta del personal.", "flash.support.draftDiscarded": "Borrador de IA descartado. Ticket enviado a la cola humana.", - "flash.support.autoReplyDisabled": "Respuesta automática desactivada (el borrador queda como nota interna).", + "flash.support.autoReplyDisabled": "Respuesta automática desactivada (el borrador queda como nota interna).", "flash.structured.keyRequired": "La clave del campo es obligatoria", - "flash.category.nameRequired": "El nombre y el ID único son obligatorios.", - "flash.category.textEmpty": "El texto no puede estar vacío", - "flash.export.noConfigs": "Aún no hay feeds de exportación. Cree uno en Feeds de exportación y vuelva para exportar su selección.", - "flash.export.selectFormat": "Seleccione un feed de exportación.", + "flash.category.nameRequired": "El nombre y el ID único son obligatorios.", + "flash.category.textEmpty": "El texto no puede estar vacío", + "flash.export.noConfigs": "Aún no hay feeds de exportación. Cree uno en Feeds de exportación y vuelva para exportar su selección.", + "flash.export.selectFormat": "Seleccione un feed de exportación.", "flash.files.deleted": "Subida eliminada.", - "flash.mapping.noSuggestions": "No hay sugerencias — revisa los nombres de los campos de origen.", - "flash.mapping.allMapped": "Todas las sugerencias ya están mapeadas. Revisa los chips de confianza en la tabla.", - "flash.mapping.extractFirst": "No hay sugerencias — extrae primero el esquema.", + "flash.mapping.noSuggestions": "No hay sugerencias — revisa los nombres de los campos de origen.", + "flash.mapping.allMapped": "Todas las sugerencias ya están mapeadas. Revisa los chips de confianza en la tabla.", + "flash.mapping.extractFirst": "No hay sugerencias — extrae primero el esquema.", "flash.mapping.pathRequired": "Introduce una ruta de elemento de producto antes de mapear campos.", - "flash.billing.checkoutCanceled": "El pago se canceló. No se hicieron cambios.", - "flash.billing.portalReturn": "Regresaste del portal de facturación. Gestiona tu plan aquí o en Planes.", - "flash.billing.invalidAmount": "Introduce una cantidad de créditos válida.", + "flash.billing.checkoutCanceled": "El pago se canceló. No se hicieron cambios.", + "flash.billing.portalReturn": "Regresaste del portal de facturación. Gestiona tu plan aquí o en Planes.", + "flash.billing.invalidAmount": "Introduce una cantidad de créditos válida.", "flash.billing.companyNotFound": "Empresa no encontrada.", - "flash.billing.creditsAdded": "Se han añadido {amount} créditos.", + "flash.billing.creditsAdded": "Se han añadido {amount} créditos.", "flash.unsubscribe.missingToken": "Falta el token de baja.", "flash.unsubscribe.loadFailed": "No se pudo cargar el estado de baja.", "flash.unsubscribe.failed": "Error al darse de baja.", - "flash.seo.filledMeta": "Meta rellenada para “{label}” ({mode}).", - "flash.shopify.saved": "Configuración de Shopify guardada.", - "flash.woo.saved": "Configuración de WooCommerce guardada.", - "flash.woo.syncSaved": "Configuración de sincronización guardada.", - "flash.woo.autoCategories": "Se mapearon automáticamente {count} categorías.", - "flash.woo.autoAttributes": "Se mapearon automáticamente {count} atributos.", - "flash.ai.promptsSaved": "Plantillas de prompt guardadas. Se aplican a la próxima ejecución de IA.", + "flash.seo.filledMeta": "Meta rellenada para “{label}” ({mode}).", + "flash.shopify.saved": "Configuración de Shopify guardada.", + "flash.woo.saved": "Configuración de WooCommerce guardada.", + "flash.woo.syncSaved": "Configuración de sincronización guardada.", + "flash.woo.autoCategories": "Se mapearon automáticamente {count} categorías.", + "flash.woo.autoAttributes": "Se mapearon automáticamente {count} atributos.", + "flash.ai.promptsSaved": "Plantillas de prompt guardadas. Se aplican a la próxima ejecución de IA.", "flash.ai.promptRestored": "Prompt predeterminado restaurado.", - "flash.ai.connectionOk": "Conexión OK ({detail}).", + "flash.ai.connectionOk": "Conexión OK ({detail}).", "flash.ai.connectionByok": ", tu propia clave", - "flash.email.saved": "Proveedor de correo guardado. Verifica el dominio y envía una prueba.", - "flash.email.testDryRun": "Prueba registrada en modo dry-run — no se envió ningún correo.", - "flash.email.testSent": "Correo de prueba enviado. La dirección de origen se marca como verificada si la entrega tiene éxito.", - "flash.fields.apiUnavailable": "La API de campos estándar no está disponible. No se pueden guardar los cambios.", + "flash.email.saved": "Proveedor de correo guardado. Verifica el dominio y envía una prueba.", + "flash.email.testDryRun": "Prueba registrada en modo dry-run — no se envió ningún correo.", + "flash.email.testSent": "Correo de prueba enviado. La dirección de origen se marca como verificada si la entrega tiene éxito.", + "flash.fields.apiUnavailable": "La API de campos estándar no está disponible. No se pueden guardar los cambios.", "flash.fields.updated": "Campo actualizado correctamente", "flash.fields.created": "Campo creado correctamente", "flash.fields.enabledRecommended": "Campos de ecommerce recomendados activados", @@ -2299,186 +2299,187 @@ export const es: MessageDict = { "flash.fields.groupUpdated": "Grupo actualizado correctamente", "flash.fields.groupCreated": "Grupo creado correctamente", "flash.fields.groupDeleted": "Grupo eliminado correctamente", - "flash.processing.cancelled": "\"{name}\" se canceló.", + "flash.processing.cancelled": "\"{name}\" se canceló.", "flash.processing.retried": "\"{name}\" en cola para reintento.", "flash.admin.staffRoleUpdated": "Rol de personal actualizado para {email}.", - "flash.admin.staffRoleUnavailable": "Las actualizaciones de rol de personal aún no están disponibles en este servidor.", - "flash.admin.catalogCloned": "Se copió {source} en {dest}: {products} productos, {categories} categorías.", - "flash.admin.fixA1Success": "Reparación del catálogo de {name} finalizada: {prompts} prompts actualizados, {hashes} hashes borrados, {categories} categorías rellenadas.", - "flash.admin.fixA1Error": "Falló la reparación del catálogo de {name}.", + "flash.admin.staffRoleUnavailable": "Las actualizaciones de rol de personal aún no están disponibles en este servidor.", + "flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.", + "flash.admin.fixA1Success": "Catalog repair finished for {name}: {prompts} prompts, {hashes} hashes, {categories} processed←mapped, {mapped_backfilled} mapped←processed. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).", + "flash.admin.fixA1Error": "Falló la reparación del catálogo de {name}.", + "flash.admin.cloneDestMissing": "No sandbox destination. Switch to Platform Demo (staff home), then clone again.", "flash.admin.planAssigned": "Plan asignado a {name}.", "flash.admin.planAssignedShort": "Plan asignado.", - "flash.admin.creditsUpdated": "Créditos actualizados.", - "flash.admin.cyclesProcessed": "Ciclos de facturación procesados: {count}", - "flash.admin.invitesSummary": "Invitaciones para establecer contraseña: {parts}. Entrega de correo: {smtp}.", + "flash.admin.creditsUpdated": "Créditos actualizados.", + "flash.admin.cyclesProcessed": "Ciclos de facturación procesados: {count}", + "flash.admin.invitesSummary": "Invitaciones para establecer contraseña: {parts}. Entrega de correo: {smtp}.", "flash.admin.smtpOn": "activado", "flash.admin.smtpOff": "desactivado", - "flash.admin.localPasswordSet": "Contraseña local establecida para {email}.", - "flash.admin.localPasswordUnavailable": "Las herramientas de contraseña local no están disponibles en este entorno.", - "flash.admin.switchedUser": "Usuario cambiado. Recargando…", - "flash.admin.switchUnavailable": "El cambio de usuario no está disponible en este entorno.", - "flash.admin.diagnosticsRateLimit": "Límite de diagnósticos alcanzado (20/min). Espera un minuto y actualiza.", - "flash.admin.smtpSaved": "Configuración SMTP de la plataforma guardada. Las contraseñas permanecen ocultas.", - "flash.admin.integrationSaved": "Configuración de integración guardada. Los campos secretos nunca se vuelven a mostrar completos.", - "flash.admin.aiSaved": "Configuración de IA de {label} guardada. Las claves API no se vuelven a mostrar.", + "flash.admin.localPasswordSet": "Contraseña local establecida para {email}.", + "flash.admin.localPasswordUnavailable": "Las herramientas de contraseña local no están disponibles en este entorno.", + "flash.admin.switchedUser": "Usuario cambiado. Recargando…", + "flash.admin.switchUnavailable": "El cambio de usuario no está disponible en este entorno.", + "flash.admin.diagnosticsRateLimit": "Límite de diagnósticos alcanzado (20/min). Espera un minuto y actualiza.", + "flash.admin.smtpSaved": "Configuración SMTP de la plataforma guardada. Las contraseñas permanecen ocultas.", + "flash.admin.integrationSaved": "Configuración de integración guardada. Los campos secretos nunca se vuelven a mostrar completos.", + "flash.admin.aiSaved": "Configuración de IA de {label} guardada. Las claves API no se vuelven a mostrar.", "flash.admin.cleanup": "Limpieza: {jobs} trabajos fallaron, {products} productos restablecidos.", - "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", + "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", "flash.admin.orphanDeleted": "Deleted {deleted} orphan row(s). Remaining: {remaining}.", - "flash.admin.articleUpdated": "Artículo actualizado.", - "flash.admin.articleCreated": "Artículo creado.", + "flash.admin.articleUpdated": "Artículo actualizado.", + "flash.admin.articleCreated": "Artículo creado.", "flash.admin.templateUpdated": "Plantilla actualizada.", "flash.admin.templateCreated": "Plantilla creada.", - "flash.admin.articleDeleted": "Artículo eliminado.", + "flash.admin.articleDeleted": "Artículo eliminado.", "flash.admin.templateDeleted": "Plantilla eliminada.", - "flash.admin.autoReplySaved": "Configuración de respuesta automática guardada.", + "flash.admin.autoReplySaved": "Configuración de respuesta automática guardada.", "flash.admin.imageUploaded": "Imagen subida e insertada en markdown.", - "flash.admin.translationsSaved": "Se guardaron {count} cadena(s) para {locale}. Haz commit del pack cuando esté listo.", + "flash.admin.translationsSaved": "Se guardaron {count} cadena(s) para {locale}. Haz commit del pack cuando esté listo.", "flash.admin.featuresUpdated": "Actualizado {key}.", "flash.admin.featuresAllOn": "Todas las funciones activadas para este plan.", "flash.admin.featuresAllOff": "Todas las funciones desactivadas para este plan.", "flash.admin.profileApplied": "Perfil {label} aplicado a {name}.", - "flash.admin.overridesCleared": "Anulaciones borradas — se usan los valores predeterminados del plan.", + "flash.admin.overridesCleared": "Anulaciones borradas — se usan los valores predeterminados del plan.", "empty.plans.none": "No se encontraron planes.", - "empty.plans.noMatch": "Ningún plan coincide con este filtro.", + "empty.plans.noMatch": "Ningún plan coincide con este filtro.", "empty.plans.selectPackage": "Selecciona un paquete para editar funciones.", "empty.products.processingTitle": "No hay productos en procesamiento", - "empty.products.processingMessageCan": "El progreso en vivo está en Procesamiento. Abre un trabajo en curso allí para ver el estado de los pasos; esta pestaña listará productos en vuelo cuando el filtrado por ítems esté disponible.", - "empty.products.processingMessageCannot": "Los productos en un trabajo aparecen aquí cuando el procesamiento ha comenzado desde el catálogo.", - "empty.products.reviewTitle": "No hay productos que necesiten revisión", - "empty.products.reviewMessage": "Cuando termina un trabajo, los productos enriquecidos aparecen aquí. Abre una fila para comparar original vs enriquecido y Aceptar, editar o Rechazar.", + "empty.products.processingMessageCan": "El progreso en vivo está en Procesamiento. Abre un trabajo en curso allí para ver el estado de los pasos; esta pestaña listará productos en vuelo cuando el filtrado por ítems esté disponible.", + "empty.products.processingMessageCannot": "Los productos en un trabajo aparecen aquí cuando el procesamiento ha comenzado desde el catálogo.", + "empty.products.reviewTitle": "No hay productos que necesiten revisión", + "empty.products.reviewMessage": "Cuando termina un trabajo, los productos enriquecidos aparecen aquí. Abre una fila para comparar original vs enriquecido y Aceptar, editar o Rechazar.", "empty.products.errorTitle": "No hay productos con errores", - "empty.products.errorMessage": "Cuando un trabajo falla para un producto, aparecerá aquí para que puedas reintentar.", + "empty.products.errorMessage": "Cuando un trabajo falla para un producto, aparecerá aquí para que puedas reintentar.", "empty.products.filterTitleUnprocessed": "Sin coincidencias sin procesar", - "empty.products.filterTitle": "Ningún producto coincide", - "empty.products.filterMessage": "Prueba otra búsqueda, categoría o feed — o borra los filtros para verlo todo.", - "empty.products.unprocessedTitle": "Aún no hay productos sin procesar", - "empty.products.unprocessedMessage": "Conecta un feed de proveedor o sube un CSV para importar productos al catálogo.", - "empty.products.noneTitle": "Aún no hay productos", - "empty.products.noneMessageStores": "Importa desde un feed o tienda y luego inicia un trabajo para construir el catálogo.", - "empty.products.noneMessage": "Importa desde un feed o sube un CSV y luego inicia un trabajo para construir el catálogo.", + "empty.products.filterTitle": "Ningún producto coincide", + "empty.products.filterMessage": "Prueba otra búsqueda, categoría o feed — o borra los filtros para verlo todo.", + "empty.products.unprocessedTitle": "Aún no hay productos sin procesar", + "empty.products.unprocessedMessage": "Conecta un feed de proveedor o sube un CSV para importar productos al catálogo.", + "empty.products.noneTitle": "Aún no hay productos", + "empty.products.noneMessageStores": "Importa desde un feed o tienda y luego inicia un trabajo para construir el catálogo.", + "empty.products.noneMessage": "Importa desde un feed o sube un CSV y luego inicia un trabajo para construir el catálogo.", "empty.products.viewJobs": "Ver trabajos", "empty.products.startJob": "Iniciar un trabajo", "empty.products.clearFilters": "Borrar filtros", "empty.products.viewProcessed": "Ver procesados", - "empty.products.retryCatalog": "Reintentar desde el catálogo", + "empty.products.retryCatalog": "Reintentar desde el catálogo", "empty.products.connectFeed": "Conectar feed", - "empty.products.addProduct": "Añadir producto", + "empty.products.addProduct": "Añadir producto", "empty.products.uploadCsv": "Subir CSV", - "empty.feeds.noneTitle": "Aún no hay feeds de productos", - "empty.feeds.noneMessage": "Conecta una URL CSV/XML de proveedor o sube un archivo. Siguiente: Map → Sync → Process.", + "empty.feeds.noneTitle": "Aún no hay feeds de productos", + "empty.feeds.noneMessage": "Conecta una URL CSV/XML de proveedor o sube un archivo. Siguiente: Map → Sync → Process.", "empty.feeds.noMatchTitle": "No hay feeds coincidentes", - "empty.feeds.noMatchMessage": "Prueba otro término de búsqueda, o limpia la búsqueda para ver todos los feeds.", - "empty.export.loadFailedTitle": "No se pudieron cargar los feeds de exportación", - "empty.export.loadFailedMessage": "Algo falló al cargar tus exportaciones. Reintenta o revisa el error de arriba.", - "empty.export.noneTitle": "Aún no hay feeds de exportación", - "empty.export.noneMessage": "Cree un feed de Google Shopping, Meta o CSV/XML personalizado para elegir qué productos y campos salen. Genere una URL pública para Merchant Center o cualquier socio — o exporte un subconjunto desde Productos.", + "empty.feeds.noMatchMessage": "Prueba otro término de búsqueda, o limpia la búsqueda para ver todos los feeds.", + "empty.export.loadFailedTitle": "No se pudieron cargar los feeds de exportación", + "empty.export.loadFailedMessage": "Algo falló al cargar tus exportaciones. Reintenta o revisa el error de arriba.", + "empty.export.noneTitle": "Aún no hay feeds de exportación", + "empty.export.noneMessage": "Cree un feed de Google Shopping, Meta o CSV/XML personalizado para elegir qué productos y campos salen. Genere una URL pública para Merchant Center o cualquier socio — o exporte un subconjunto desde Productos.", "empty.export.noMatchTitle": "No hay feeds coincidentes", - "empty.export.noMatchMessage": "Prueba otro término de búsqueda.", - "empty.files.noneTitle": "Aún no hay subidas", - "empty.files.noneMessage": "Las importaciones CSV de productos, categorías y atributos aparecen aquí tras subirlas. Tras una migración de plataforma, no se copiaron los contenidos de archivo (blobs) — vuelve a subirlos si los necesitas.", + "empty.export.noMatchMessage": "Prueba otro término de búsqueda.", + "empty.files.noneTitle": "Aún no hay subidas", + "empty.files.noneMessage": "Las importaciones CSV de productos, categorías y atributos aparecen aquí tras subirlas. Tras una migración de plataforma, no se copiaron los contenidos de archivo (blobs) — vuelve a subirlos si los necesitas.", "empty.files.uploadCta": "Subir CSV", "empty.export.fromProductsCta": "Exportar desde Productos", "empty.dashboard.noJobsTitle": "No hay trabajos recientes", - "empty.dashboard.noJobsMessage": "Los trabajos aparecen aquí cuando inicias el procesamiento desde Productos. Enriquece títulos y descripciones antes de exportar.", - "empty.stores.noneTitle": "Aún no hay tienda conectada", - "empty.stores.noneMessage": "Conecta WooCommerce o Shopify para sincronizar catálogo y pedidos. ¿Prefieres un archivo de proveedor? Usa URL de feed o subida CSV.", - "empty.stores.noneTitleMember": "Aún no hay tienda conectada", + "empty.dashboard.noJobsMessage": "Los trabajos aparecen aquí cuando inicias el procesamiento desde Productos. Enriquece títulos y descripciones antes de exportar.", + "empty.stores.noneTitle": "Aún no hay tienda conectada", + "empty.stores.noneMessage": "Conecta WooCommerce o Shopify para sincronizar catálogo y pedidos. ¿Prefieres un archivo de proveedor? Usa URL de feed o subida CSV.", + "empty.stores.noneTitleMember": "Aún no hay tienda conectada", "empty.stores.noneMessageMember": "Solo los admins de la empresa pueden conectar WooCommerce o Shopify. Pide ayuda a un admin, o usa Feed URL/CSV si tu rol lo permite.", - "empty.woo.openConnection": "Abrir ajustes de conexión", - "empty.shopify.openConnection": "Abrir ajustes de conexión", - "empty.processing.noneTitle": "Aún no hay trabajos", - "empty.processing.noneMessage": "Inicia un trabajo desde Productos cuando quieras. El progreso y el historial aparecerán aquí.", - "empty.campaigns.unavailableTitle": "Campañas no disponibles", - "empty.campaigns.unavailableMessage": "El servicio de campañas no está accesible. Puedes abrir el asistente, pero generar y enviar esperarán a que vuelva.", + "empty.woo.openConnection": "Abrir ajustes de conexión", + "empty.shopify.openConnection": "Abrir ajustes de conexión", + "empty.processing.noneTitle": "Aún no hay trabajos", + "empty.processing.noneMessage": "Inicia un trabajo desde Productos cuando quieras. El progreso y el historial aparecerán aquí.", + "empty.campaigns.unavailableTitle": "Campañas no disponibles", + "empty.campaigns.unavailableMessage": "El servicio de campañas no está accesible. Puedes abrir el asistente, pero generar y enviar esperarán a que vuelva.", "empty.calendar.noneTitle": "No hay presets estacionales", - "empty.calendar.noneMessage": "Los presets del calendario aparecerán aquí cuando la API de marketing esté disponible.", - "empty.seo.noneTitle": "No hay catálogo para puntuar", - "empty.seo.noneMessage": "Procesa productos o añade categorías primero. Las puntuaciones SEO aparecen cuando hay datos de catálogo.", - "empty.vector.unavailableTitle": "Categorías vectoriales no disponibles", - "empty.vector.noMatchTitle": "Aún no hay coincidencias", - "empty.vector.noMatchMessage": "Introduce una descripción de producto y busca para ver coincidencias de categorías vectoriales.", + "empty.calendar.noneMessage": "Los presets del calendario aparecerán aquí cuando la API de marketing esté disponible.", + "empty.seo.noneTitle": "No hay catálogo para puntuar", + "empty.seo.noneMessage": "Procesa productos o añade categorías primero. Las puntuaciones SEO aparecen cuando hay datos de catálogo.", + "empty.vector.unavailableTitle": "Categorías vectoriales no disponibles", + "empty.vector.noMatchTitle": "Aún no hay coincidencias", + "empty.vector.noMatchMessage": "Introduce una descripción de producto y busca para ver coincidencias de categorías vectoriales.", "empty.structured.unavailableTitle": "Descripciones estructuradas no disponibles", - "empty.structured.unavailableMessage": "Esta API aún no está en este backend. No puedes gestionar campos Export ID aquí hasta que /api/structured-descriptions esté conectada.", - "empty.structured.noneTitle": "Aún no hay campos de descripción estructurada", - "empty.structured.noneMessage": "Añade un campo aquí o crea Export IDs en una fórmula de descripción de categoría — aparecerán para usar en feeds de exportación.", + "empty.structured.unavailableMessage": "Esta API aún no está en este backend. No puedes gestionar campos Export ID aquí hasta que /api/structured-descriptions esté conectada.", + "empty.structured.noneTitle": "Aún no hay campos de descripción estructurada", + "empty.structured.noneMessage": "Añade un campo aquí o crea Export IDs en una fórmula de descripción de categoría — aparecerán para usar en feeds de exportación.", "empty.support.unavailableTitle": "Soporte no disponible", - "empty.support.noneTitle": "Aún no hay tickets", - "empty.support.unavailableMessage": "La API de soporte no está accesible. Inténtalo pronto o abre un ticket nuevo cuando el servicio esté activo.", - "empty.support.filterMessage": "Ningún ticket coincide con este estado. Prueba otro filtro o crea uno nuevo.", - "empty.support.noneMessage": "Describe tu problema y el equipo responderá en este hilo. También recibirás una notificación en la app cuando responda el personal.", + "empty.support.noneTitle": "Aún no hay tickets", + "empty.support.unavailableMessage": "La API de soporte no está accesible. Inténtalo pronto o abre un ticket nuevo cuando el servicio esté activo.", + "empty.support.filterMessage": "Ningún ticket coincide con este estado. Prueba otro filtro o crea uno nuevo.", + "empty.support.noneMessage": "Describe tu problema y el equipo responderá en este hilo. También recibirás una notificación en la app cuando responda el personal.", "empty.support.createTicket": "Crear ticket", "empty.support.clearFilter": "Borrar filtro", "empty.support.ticketNotFoundTitle": "Ticket no encontrado", "empty.support.ticketNotFoundMessage": "Este ticket puede haberse eliminado o no tienes acceso.", "empty.support.noMessagesTitle": "Sin mensajes", - "empty.support.noMessagesMessage": "Este hilo aún no tiene mensajes.", - "empty.settings.noApiKeysTitle": "Aún no hay claves API", - "empty.shopify.noOrdersTitle": "Aún no hay pedidos", - "empty.shopify.noOrdersMessage": "Los pedidos aparecen tras conectar Shopify y ejecutar una importación de pedidos. Las listas vacías son normales hasta el primer sync.", - "empty.woo.noOrdersTitle": "Aún no hay pedidos", - "empty.woo.noOrdersMessage": "Los pedidos aparecen tras conectar WooCommerce y ejecutar una sincronización de pedidos. Las listas vacías son normales hasta el primer sync.", - "empty.woo.noReviewsTitle": "Aún no hay reseñas", - "empty.woo.noReviewsMessage": "Las reseñas aparecen tras poner en cola una importación desde una tienda conectada. Esta pestaña sigue usable con la lista vacía.", + "empty.support.noMessagesMessage": "Este hilo aún no tiene mensajes.", + "empty.settings.noApiKeysTitle": "Aún no hay claves API", + "empty.shopify.noOrdersTitle": "Aún no hay pedidos", + "empty.shopify.noOrdersMessage": "Los pedidos aparecen tras conectar Shopify y ejecutar una importación de pedidos. Las listas vacías son normales hasta el primer sync.", + "empty.woo.noOrdersTitle": "Aún no hay pedidos", + "empty.woo.noOrdersMessage": "Los pedidos aparecen tras conectar WooCommerce y ejecutar una sincronización de pedidos. Las listas vacías son normales hasta el primer sync.", + "empty.woo.noReviewsTitle": "Aún no hay reseñas", + "empty.woo.noReviewsMessage": "Las reseñas aparecen tras poner en cola una importación desde una tienda conectada. Esta pestaña sigue usable con la lista vacía.", "empty.admin.noProviderTitle": "Sin filas de proveedor", - "empty.admin.noProviderMessage": "Los tokens aparecen aquí cuando los productos registran un tipo de proveedor.", + "empty.admin.noProviderMessage": "Los tokens aparecen aquí cuando los productos registran un tipo de proveedor.", "empty.admin.noCompaniesTitle": "Sin empresas", - "empty.admin.noCompaniesMessage": "La lista de empresas está vacía.", - "empty.admin.noCyclesTitle": "Aún no hay ciclos de facturación", - "empty.admin.noCyclesMessage": "Los ciclos aparecen cuando las ejecuciones de facturación crean filas históricas.", + "empty.admin.noCompaniesMessage": "La lista de empresas está vacía.", + "empty.admin.noCyclesTitle": "Aún no hay ciclos de facturación", + "empty.admin.noCyclesMessage": "Los ciclos aparecen cuando las ejecuciones de facturación crean filas históricas.", "empty.admin.noCompaniesFound": "No se encontraron empresas.", "empty.admin.noCompaniesMatch": "Ninguna empresa coincide con este filtro.", "empty.admin.notPlatformTitle": "No eres admin de plataforma", - "empty.admin.notPlatformMessage": "Tu cuenta ha iniciado sesión pero no está marcada como admin de plataforma. Pide a un admin existente que te conceda acceso, luego cierra sesión y vuelve a entrar.", + "empty.admin.notPlatformMessage": "Tu cuenta ha iniciado sesión pero no está marcada como admin de plataforma. Pide a un admin existente que te conceda acceso, luego cierra sesión y vuelve a entrar.", "empty.admin.noJobsFilter": "No hay trabajos para este filtro.", "empty.admin.noAdminUsers": "No se encontraron usuarios admin", "empty.admin.noJobs": "No se encontraron trabajos.", - "empty.admin.queueUnavailable": "La cola de soporte no está disponible. Contacta al administrador de la plataforma si persiste.", + "empty.admin.queueUnavailable": "La cola de soporte no está disponible. Contacta al administrador de la plataforma si persiste.", "empty.admin.noTicketsQueue": "No hay tickets en esta cola.", "empty.admin.knowledgeTitle": "Base de conocimiento", - "empty.admin.knowledgeNotReadyTitle": "El conocimiento de soporte no está listo", - "empty.admin.knowledgeNotReadyMessage": "Los artículos y la respuesta automática aún no están configurados en este despliegue.", + "empty.admin.knowledgeNotReadyTitle": "El conocimiento de soporte no está listo", + "empty.admin.knowledgeNotReadyMessage": "Los artículos y la respuesta automática aún no están configurados en este despliegue.", "empty.admin.noTemplatesTitle": "Sin plantillas de respuesta", - "empty.admin.noTemplatesMessage": "Las plantillas se emparejan como artículos y se publican como respuestas automáticas etiquetadas.", + "empty.admin.noTemplatesMessage": "Las plantillas se emparejan como artículos y se publican como respuestas automáticas etiquetadas.", "empty.admin.ticketNotFound": "Ticket no encontrado.", - "empty.admin.supportUnavailable": "El soporte no está disponible en este despliegue.", + "empty.admin.supportUnavailable": "El soporte no está disponible en este despliegue.", "empty.admin.ticketLoadFailed": "No se pudo cargar este ticket.", - "empty.admin.noMessages": "Aún no hay mensajes.", + "empty.admin.noMessages": "Aún no hay mensajes.", "empty.admin.translationsUnavailableTitle": "Traducciones no disponibles", - "empty.admin.translationsUnavailableMessage": "El endpoint del catálogo de traducciones no está disponible en esta build.", + "empty.admin.translationsUnavailableMessage": "El endpoint del catálogo de traducciones no está disponible en esta build.", "empty.admin.noKeysMatchTitle": "Ninguna clave coincide", - "empty.admin.noKeysMatchMessage": "Prueba otro filtro o búsqueda, o actualiza cuando se añadan claves nuevas al inglés.", - "empty.admin.noUsersMatch": "Ningún usuario coincide con este filtro.", + "empty.admin.noKeysMatchMessage": "Prueba otro filtro o búsqueda, o actualiza cuando se añadan claves nuevas al inglés.", + "empty.admin.noUsersMatch": "Ningún usuario coincide con este filtro.", "empty.admin.noCompaniesMatchFilter": "Ninguna empresa coincide con este filtro.", - "blast.title": "Confirmar envío masivo", - "blast.dryRunDescription": "El modo de prueba está activo — no saldrá ningún correo real de Descrybe. Confirma para registrar el envío de prueba.", - "blast.liveDescription": "Esto enviará correos reales a tu audiencia. Escribe I understand para continuar.", + "blast.title": "Confirmar envío masivo", + "blast.dryRunDescription": "El modo de prueba está activo — no saldrá ningún correo real de Descrybe. Confirma para registrar el envío de prueba.", + "blast.liveDescription": "Esto enviará correos reales a tu audiencia. Escribe I understand para continuar.", "blast.recipients": "Destinatarios en esta solicitud: {count}", - "blast.typePhrase": "Escribe “I understand”", + "blast.typePhrase": "Escribe “I understand”", "blast.placeholder": "I understand", "blast.runDryRun": "Ejecutar prueba", "blast.send": "Enviar blast", - "marketing.footerBefore": "Las campañas de email están en", - "marketing.footerAfter": "— esta página solo prepara feeds de exportación del catálogo.", + "marketing.footerBefore": "Las campañas de email están en", + "marketing.footerAfter": "— esta página solo prepara feeds de exportación del catálogo.", "support.title": "Centro de soporte", - "support.description": "Abrir a ticket for facturación, bugs, or account help. Personal replies show here and as in-app notifications.", + "support.description": "Abrir a ticket for facturación, bugs, or account help. Personal replies show here and as in-app notifications.", "support.newTicket": "Nuevo ticket", "support.createTicket": "Crear ticket", - "support.loadingTickets": "Cargando tickets…", + "support.loadingTickets": "Cargando tickets…", "support.loadFailed": "Error al cargar los tickets de soporte", "support.unavailableBanner": "Soporte is not fully disponible yet. You can still prepare a ticket; submitting may wait until the service is ready.", "support.yourTickets": "Tus tickets", "support.ticketCount": "{count} tickets", "support.ticketCountOne": "{count} ticket", - "support.statusFilterSuffix": "· estado {status}", + "support.statusFilterSuffix": "· estado {status}", "support.filterByStatus": "Filtrar by status", "support.unavailableTitle": "Soporte no disponible", - "support.emptyTitle": "Aún no hay tickets", - "support.unavailableEmpty": "La API de soporte no está accesible. Inténtalo pronto o abre un ticket nuevo cuando el servicio esté activo.", - "support.emptyFiltered": "Ningún ticket coincide con este estado. Prueba otro filtro o crea uno nuevo.", - "support.emptyHelp": "Describe tu problema y el equipo responderá en este hilo. También recibirás una notificación en la app cuando responda el personal.", + "support.emptyTitle": "Aún no hay tickets", + "support.unavailableEmpty": "La API de soporte no está accesible. Inténtalo pronto o abre un ticket nuevo cuando el servicio esté activo.", + "support.emptyFiltered": "Ningún ticket coincide con este estado. Prueba otro filtro o crea uno nuevo.", + "support.emptyHelp": "Describe tu problema y el equipo responderá en este hilo. También recibirás una notificación en la app cuando responda el personal.", "support.clearFilter": "Borrar filtro", "support.table.subject": "Asunto", - "support.table.category": "Categoría", + "support.table.category": "Categoría", "support.table.status": "Estado", "support.table.priority": "Prioridad", "support.table.updated": "Actualizado", @@ -2489,143 +2490,143 @@ export const es: MessageDict = { "support.status.resolved": "Resuelto", "support.status.closed": "Cerrado", "support.new.title": "Nuevo ticket de soporte", - "support.new.description": "Cuéntanos en qué necesitas ayuda. Incluye pasos, mensajes de error o datos de factura si aplica.", - "support.new.back": "Atrás to tickets", + "support.new.description": "Cuéntanos en qué necesitas ayuda. Incluye pasos, mensajes de error o datos de factura si aplica.", + "support.new.back": "Atrás to tickets", "support.new.details": "Detalles del ticket", "support.new.detailsHelp": "Estado starts as open. You may get an automated answer first; a human teammate can take over anytime from the same thread.", "support.new.subject": "Asunto", "support.new.subjectPlaceholder": "Resumen breve", - "support.new.category": "Categoría", + "support.new.category": "Categoría", "support.new.priority": "Prioridad", "support.new.optional": "Opcional details", - "support.new.optionalHint": "(SKU, etiquetas — ayuda al enrutado)", + "support.new.optionalHint": "(SKU, etiquetas — ayuda al enrutado)", "support.new.relatedSku": "SKU relacionado", "support.new.relatedSkuPlaceholder": "p. ej. ABC-123", "support.new.relatedSkuHelp": "Producto or feed SKU if this is about a specific item.", "support.new.tags": "Etiquetas", "support.new.tagsPlaceholder": "login, factura (separados por comas)", - "support.new.tagsHelp": "Hasta 10 etiquetas cortas. Normalizamos espacios y puntuación.", - "support.new.tagsWillSend": "Se enviará: {tags}", + "support.new.tagsHelp": "Hasta 10 etiquetas cortas. Normalizamos espacios y puntuación.", + "support.new.tagsWillSend": "Se enviará: {tags}", "support.new.message": "Mensaje", "support.new.messagePlaceholder": "Describe el problema, lo que esperabas y cualquier detalle que ayude a reproducirlo.", "support.new.createdTitle": "Ticket creado", "support.new.createdBody": "Responderemos en este hilo. Atiende las notificaciones in-app.", "support.new.viewTicket": "Ver ticket", - "support.new.unavailable": "Soporte is temporarily no disponible. Your message was not submitted — try again shortly.", + "support.new.unavailable": "Soporte is temporarily no disponible. Your message was not submitted — try again shortly.", "support.new.unavailableTitle": "Soporte no disponible", "support.new.createFailed": "No se pudo crear el ticket", "support.ticket.fallbackTitle": "Soporte ticket", "support.ticket.description": "Conversation thread with Descrybe soporte.", - "support.ticket.meta": "{category} · {priority} · Actualizado {when}", + "support.ticket.meta": "{category} · {priority} · Actualizado {when}", "support.ticket.allTickets": "Todo tickets", - "support.ticket.loading": "Cargando ticket…", + "support.ticket.loading": "Cargando ticket…", "support.ticket.missingId": "Falta el id del ticket", "support.ticket.notFound": "Ticket no encontrado", "support.ticket.notFoundMessage": "Este ticket puede haberse eliminado o no tienes acceso.", - "support.ticket.backCenter": "Atrás to Soporte Center", - "support.ticket.unavailable": "El soporte no está disponible temporalmente.", + "support.ticket.backCenter": "Atrás to Soporte Center", + "support.ticket.unavailable": "El soporte no está disponible temporalmente.", "support.ticket.loadFailed": "Error al cargar el ticket", - "support.ticket.openedMeta": "Abrired {when} · {category} · {priority} priority", + "support.ticket.openedMeta": "Abrired {when} · {category} · {priority} priority", "support.ticket.sku": "SKU {sku}", "support.ticket.messagesAria": "Mensajes del ticket", "support.ticket.noMessages": "Sin mensajes", - "support.ticket.noMessagesHelp": "Este hilo aún no tiene mensajes.", + "support.ticket.noMessagesHelp": "Este hilo aún no tiene mensajes.", "support.ticket.yourReply": "Tu respuesta", - "support.ticket.replyPlaceholder": "Add details or reply to soporte…", + "support.ticket.replyPlaceholder": "Add details or reply to soporte…", "support.ticket.sendReply": "Enviar respuesta", "support.ticket.replySent": "Respuesta enviada", - "support.ticket.reopened": "Ticket reabierto para revisión del equipo.", - "support.ticket.replyAdded": "Tu mensaje se añadió al hilo.", + "support.ticket.reopened": "Ticket reabierto para revisión del equipo.", + "support.ticket.replyAdded": "Tu mensaje se añadió al hilo.", "support.ticket.replyFailed": "No se pudo enviar la respuesta", "support.ticket.reopenHint": "Responder reabre este ticket para el equipo.", - "support.ticket.humanHint": "Replying asks a human teammate to continue from aquí.", + "support.ticket.humanHint": "Replying asks a human teammate to continue from aquí.", "support.ticket.closedBanner": "This ticket is closed. Crear a new ticket if you still need help.", - "support.kind.you": "Tú", + "support.kind.you": "Tú", "support.kind.human": "Soporte", "support.kind.auto": "Automatizado", "support.kind.ai": "Asistido por IA", "support.kind.system": "Sistema", - "support.kind.autoBadge": "Respuesta automática", + "support.kind.autoBadge": "Respuesta automática", "support.kind.aiBadge": "Asistido por IA", "support.progress.closed.title": "Ticket cerrado", "support.progress.closed.message": "This conversation is closed. Abrir a new ticket if you still need help.", "support.progress.resolved.title": "Marcado como resuelto", - "support.progress.resolved.message": "Creemos que está resuelto. Responde para reabrir, o deja una valoración rápida abajo.", - "support.progress.quickAnswer.title": "Respuesta rápida enviada", - "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply aquí — a human will take over.", + "support.progress.resolved.message": "Creemos que está resuelto. Responde para reabrir, o deja una valoración rápida abajo.", + "support.progress.quickAnswer.title": "Respuesta rápida enviada", + "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply aquí — a human will take over.", "support.progress.onIt.title": "Estamos en ello", "support.progress.onIt.handedMessage": "A soporte teammate has your ticket and will reply in this thread.", "support.progress.onIt.pendingMessage": "Soporte is reviewing your message. You will see updates in this thread.", "support.progress.received.title": "Ticket recibido", - "support.progress.received.message": "Gracias — tenemos tu solicitud. Puede aparecer ayuda automática pronto, o un compañero responderá.", - "support.category.billing": "Facturación", + "support.progress.received.message": "Gracias — tenemos tu solicitud. Puede aparecer ayuda automática pronto, o un compañero responderá.", + "support.category.billing": "Facturación", "support.category.billing.help": "Facturas, payment methods, plan changes, and Stripe receipts.", - "support.category.billing_credits": "Facturación / credits", - "support.category.billing_credits.help": "Saldo de créditos, cuotas de uso y recargas.", + "support.category.billing_credits": "Facturación / credits", + "support.category.billing_credits.help": "Saldo de créditos, cuotas de uso y recargas.", "support.category.bug": "Bug / error", "support.category.bug.help": "Errores inesperados, pantallas rotas o pasos que fallan siempre.", "support.category.account": "Cuenta / acceso", "support.category.account.help": "Login, invites, empresa membership, and permissions.", "support.category.integrations": "Integraciones", - "support.category.integrations.help": "WooCommerce, Shopify, API pública o configuración del conector.", + "support.category.integrations.help": "WooCommerce, Shopify, API pública o configuración del conector.", "support.category.processing": "Procesamiento / AI", "support.category.processing.help": "Producto procesamiento, AI prompts, and generation quality.", "support.category.export": "Exportar / channels", "support.category.export.help": "Exportar feeds, channels, and sync destinations.", - "support.category.migration": "Migración / datos", - "support.category.migration.help": "Datos faltantes o incorrectos tras el corte — productos, feeds, tiendas, facturación o equipo.", + "support.category.migration": "Migración / datos", + "support.category.migration.help": "Datos faltantes o incorrectos tras el corte — productos, feeds, tiendas, facturación o equipo.", "support.category.other": "Otro", - "support.category.other.help": "Cualquier otra cosa — lo enviaremos al compañero adecuado.", + "support.category.other.help": "Cualquier otra cosa — lo enviaremos al compañero adecuado.", "support.priority.low": "Bajo", - "support.priority.low.help": "Deseable o no bloqueante — lo atenderemos en orden.", + "support.priority.low.help": "Deseable o no bloqueante — lo atenderemos en orden.", "support.priority.normal": "Normal", - "support.priority.normal.help": "Solicitud estándar. La mayoría de tickets usan esto.", + "support.priority.normal.help": "Solicitud estándar. La mayoría de tickets usan esto.", "support.priority.high": "Alto", - "support.priority.high.help": "Bloquea el trabajo o afecta a ingresos — úsalo con moderación.", - "support.csat.thanks": "Gracias por tu opinión", - "support.csat.unavailable": "La valoración no está disponible temporalmente. Inténtalo más tarde.", - "support.csat.unavailableTitle": "Valoración no disponible", + "support.priority.high.help": "Bloquea el trabajo o afecta a ingresos — úsalo con moderación.", + "support.csat.thanks": "Gracias por tu opinión", + "support.csat.unavailable": "La valoración no está disponible temporalmente. Inténtalo más tarde.", + "support.csat.unavailableTitle": "Valoración no disponible", "support.csat.alreadyRated": "Ya valoraste este ticket.", "support.csat.alreadyRatedTitle": "Ya valorado", - "support.csat.submitFailed": "No se pudo enviar la valoración", - "support.csat.yourRating": "Tu valoración", + "support.csat.submitFailed": "No se pudo enviar la valoración", + "support.csat.yourRating": "Tu valoración", "support.csat.ratedOutOf": "Valoraste este ticket con {score} de 5", - "support.csat.howDidWeDo": "¿Cómo lo hicimos?", - "support.csat.formHelp": "This ticket is {status}. Rate your experience (1–5). Opcional comment helps us improve.", - "support.csat.rating": "Valoración", - "support.csat.scoreAria": "{value} — {label}", + "support.csat.howDidWeDo": "¿Cómo lo hicimos?", + "support.csat.formHelp": "This ticket is {status}. Rate your experience (1–5). Opcional comment helps us improve.", + "support.csat.rating": "Valoración", + "support.csat.scoreAria": "{value} — {label}", "support.csat.whatWentWrong": "What went wrong? (opcional)", "support.csat.whatWentWrongPlaceholder": "Una nota breve nos ayuda a hacer seguimiento.", "support.csat.anythingElse": "Anything else? (opcional)", "support.csat.optionalFeedback": "Opcional feedback", - "support.csat.submit": "Enviar valoración", + "support.csat.submit": "Enviar valoración", "support.csat.score.1": "Muy insatisfecho", "support.csat.score.2": "Insatisfecho", "support.csat.score.3": "Aceptar", "support.csat.score.4": "Satisfecho", "support.csat.score.5": "Muy satisfecho", "catalog.delete": "Eliminar", - "catalog.deleting": "Eliminando…", - "catalog.saving": "Guardando…", - "catalog.adding": "Añadiendo…", - "catalog.assigning": "Asignando…", - "catalog.uploading": "Subiendo…", + "catalog.deleting": "Eliminando…", + "catalog.saving": "Guardando…", + "catalog.adding": "Añadiendo…", + "catalog.assigning": "Asignando…", + "catalog.uploading": "Subiendo…", "catalog.create": "Crear", "catalog.createFailed": "Error al crear", "catalog.updateFailed": "Error al actualizar", "catalog.deleteFailed": "Error al eliminar", - "catalog.importFailed": "Error de importación", + "catalog.importFailed": "Error de importación", "catalog.confirm": "Confirmar", - "catalog.confirmDeletion": "Confirmar eliminación", - "catalog.areYouSure": "¿Estás seguro?", + "catalog.confirmDeletion": "Confirmar eliminación", + "catalog.areYouSure": "¿Estás seguro?", "catalog.previous": "Anterior", "catalog.next": "Siguiente", "catalog.expand": "Expandir", "catalog.collapse": "Contraer", - "catalog.clearSearch": "Borrar búsqueda", + "catalog.clearSearch": "Borrar búsqueda", "catalog.clearFilters": "Borrar filtros", - "catalog.clearSelection": "Limpiar selección", - "catalog.add": "Añadir", + "catalog.clearSelection": "Limpiar selección", + "catalog.add": "Añadir", "catalog.update": "Actualizar", "catalog.edit": "Editar", "catalog.accept": "Aceptar", @@ -2634,77 +2635,77 @@ export const es: MessageDict = { "catalog.undo": "Deshacer", "catalog.close": "Cerrar", "catalog.closePanel": "Cerrar panel", - "catalog.closeMenus": "Cerrar menús", - "catalog.openMenu": "Abrir menú", - "catalog.loading": "Cargando…", - "catalog.empty": "Vacío", + "catalog.closeMenus": "Cerrar menús", + "catalog.openMenu": "Abrir menú", + "catalog.loading": "Cargando…", + "catalog.empty": "Vacío", "catalog.required": "Obligatorio", "catalog.optional": "Opcional", "catalog.features": "Funciones", - "catalog.csvImportFinished": "Importación CSV finalizada.", + "catalog.csvImportFinished": "Importación CSV finalizada.", "catalog.comparePlans": "Comparar planes", "catalog.saveChanges": "Guardar cambios", - "catalog.saveFormula": "Guardar fórmula", - "catalog.saveFormulaShort": "Guardar fórmula", + "catalog.saveFormula": "Guardar fórmula", + "catalog.saveFormulaShort": "Guardar fórmula", "catalog.noResults": "Sin resultados", "products.title": "Productos", - "products.description": "Explora, revisa y procesa tu catálogo.", + "products.description": "Explora, revisa y procesa tu catálogo.", "products.loadFailed": "Error al cargar productos", "products.unnamed": "Producto sin nombre", "products.tabs.navLabel": "Vistas de productos", "products.tab.processed": "Procesados", "products.tab.processedHint": "Productos terminados listos para exportar o sincronizar", - "products.tab.needsReview": "Necesita revisión", + "products.tab.needsReview": "Necesita revisión", "products.tab.needsReviewHint": "Productos enriquecidos pendientes de aceptar, editar o rechazar", "products.tab.needsReviewShort": "Revisar", "products.tab.error": "Errores", "products.tab.errorHint": "Productos que fallaron durante un trabajo", "products.tab.processing": "En curso", - "products.tab.processingHint": "Productos en un trabajo en ejecución", + "products.tab.processingHint": "Productos en un trabajo en ejecución", "products.tab.busy": "En curso", "products.tab.unprocessed": "Sin procesar", - "products.tab.unprocessedHint": "Productos del catálogo aún no procesados", + "products.tab.unprocessedHint": "Productos del catálogo aún no procesados", "products.tab.raw": "Sin procesar", "products.status.processed": "Procesados", - "products.status.needsReview": "Necesita revisión", + "products.status.needsReview": "Necesita revisión", "products.status.processing": "Procesamiento", "products.status.error": "Error", "products.status.failed": "Fallido", "products.status.unprocessed": "Sin procesar", "products.status.pending": "Pendiente", "products.status.unknown": "Desconocido", - "products.pagination.showing": "Mostrando {start}–{end} de {total}", - "products.empty.processing.title": "Aún no hay trabajos", - "products.empty.processing.messageJobs": "No hay nada en ejecución. Inicia un trabajo desde Sin procesar, o abre Procesamiento para ver el progreso.", - "products.empty.processing.messageBasic": "Los productos aparecen aquí mientras hay un trabajo en curso.", - "products.empty.needsReview.title": "No hay productos que necesiten revisión", - "products.empty.needsReview.message": "Cuando termina un trabajo, los productos enriquecidos aparecen aquí. Abre una fila para comparar original vs enriquecido y Aceptar, editar o Rechazar.", + "products.pagination.showing": "Mostrando {start}–{end} de {total}", + "products.empty.processing.title": "Aún no hay trabajos", + "products.empty.processing.messageJobs": "No hay nada en ejecución. Inicia un trabajo desde Sin procesar, o abre Procesamiento para ver el progreso.", + "products.empty.processing.messageBasic": "Los productos aparecen aquí mientras hay un trabajo en curso.", + "products.empty.needsReview.title": "No hay productos que necesiten revisión", + "products.empty.needsReview.message": "Cuando termina un trabajo, los productos enriquecidos aparecen aquí. Abre una fila para comparar original vs enriquecido y Aceptar, editar o Rechazar.", "products.empty.error.title": "No hay productos con errores", - "products.empty.error.message": "Cuando un trabajo falla para un producto, aparecerá aquí para que puedas reintentar.", + "products.empty.error.message": "Cuando un trabajo falla para un producto, aparecerá aquí para que puedas reintentar.", "products.empty.noUnprocessedMatches": "Sin coincidencias sin procesar", - "products.empty.noMatch": "Ningún producto coincide", - "products.empty.filtersHint": "Prueba otra búsqueda, categoría o feed — o borra los filtros para verlo todo.", - "products.empty.noUnprocessed.title": "Aún no hay productos sin procesar", - "products.empty.noUnprocessed.message": "Conecta un feed de proveedor o sube un CSV para importar productos al catálogo.", - "products.empty.none.title": "Aún no hay productos", - "products.empty.none.messageStores": "Completa primero Feeds → Map → Sync y luego Process. Importa desde un feed o una tienda.", - "products.empty.none.messageBasic": "Completa primero Feeds → Map → Sync y luego Process. Conecta un feed o sube un CSV.", + "products.empty.noMatch": "Ningún producto coincide", + "products.empty.filtersHint": "Prueba otra búsqueda, categoría o feed — o borra los filtros para verlo todo.", + "products.empty.noUnprocessed.title": "Aún no hay productos sin procesar", + "products.empty.noUnprocessed.message": "Conecta un feed de proveedor o sube un CSV para importar productos al catálogo.", + "products.empty.none.title": "Aún no hay productos", + "products.empty.none.messageStores": "Completa primero Feeds → Map → Sync y luego Process. Importa desde un feed o una tienda.", + "products.empty.none.messageBasic": "Completa primero Feeds → Map → Sync y luego Process. Conecta un feed o sube un CSV.", "products.actions.viewJobs": "Ver trabajos", "products.actions.startJob": "Iniciar un trabajo", "products.actions.viewProcessed": "Ver procesados", - "products.actions.retryFromCatalog": "Reintentar desde el catálogo", + "products.actions.retryFromCatalog": "Reintentar desde el catálogo", "products.actions.connectFeed": "Conectar feed", - "products.actions.addProduct": "Añadir producto", + "products.actions.addProduct": "Añadir producto", "products.actions.uploadCsv": "Subir CSV", "products.actions.exportSelected": "Exportar seleccionados", "products.export.title": "Exportar productos seleccionados", - "products.export.confirm": "Confirmar exportación", - "products.export.loadFailed": "No se pudieron cargar las opciones de feed de exportación. Inténtalo de nuevo.", - "products.export.noneFound": "Aún no hay feeds de exportación. Cree uno en Feeds de exportación y vuelva para exportar su selección.", - "products.export.selectFormat": "Seleccione un feed de exportación.", + "products.export.confirm": "Confirmar exportación", + "products.export.loadFailed": "No se pudieron cargar las opciones de feed de exportación. Inténtalo de nuevo.", + "products.export.noneFound": "Aún no hay feeds de exportación. Cree uno en Feeds de exportación y vuelva para exportar su selección.", + "products.export.selectFormat": "Seleccione un feed de exportación.", "products.export.failed": "No se pudieron exportar los productos seleccionados", "products.upload.title": "Subir CSV", - "products.upload.description": "Importa productos desde un CSV (GTIN/EAN, nombre, categoría, …). Descarga la muestra para ver el conjunto completo de columnas.", + "products.upload.description": "Importa productos desde un CSV (GTIN/EAN, nombre, categoría, …). Descarga la muestra para ver el conjunto completo de columnas.", "products.upload.submit": "Subir e importar", "products.upload.chooseFirst": "Elige primero un archivo CSV.", "products.upload.csvOnly": "Sube un archivo CSV.", @@ -2715,251 +2716,251 @@ export const es: MessageDict = { "products.processing.cancelled": "Procesamiento cancelado", "products.processing.jobsCancelled": "Trabajos de procesamiento cancelados", "products.processing.cancelFailed": "No se pudo cancelar el trabajo de procesamiento", - "products.processing.justCancelled": "Se canceló el trabajo recién iniciado.", + "products.processing.justCancelled": "Se canceló el trabajo recién iniciado.", "products.processing.viewInProcessing": "Ver en Procesamiento", "products.processing.confirm": "Confirmar procesamiento", - "products.processing.freePlanTitle": "Plan Free — procesamiento sin IA", - "products.processing.freePlanBody": "Normalizar, especificaciones, completar y EPREL no consumen créditos. Los títulos/descripciones con AI requieren un plan de pago o créditos.", - "products.enrichment.acceptTitle": "¿Aceptar enriquecimiento?", + "products.processing.freePlanTitle": "Plan Free — procesamiento sin IA", + "products.processing.freePlanBody": "Normalizar, especificaciones, completar y EPREL no consumen créditos. Los títulos/descripciones con AI requieren un plan de pago o créditos.", + "products.enrichment.acceptTitle": "¿Aceptar enriquecimiento?", "products.enrichment.acceptConfirm": "Confirmar aceptar enriquecimiento", - "products.enrichment.acceptSelected": "¿Aceptar el enriquecimiento de {count} producto(s) seleccionado(s)? Pasarán a Procesados.", + "products.enrichment.acceptSelected": "¿Aceptar el enriquecimiento de {count} producto(s) seleccionado(s)? Pasarán a Procesados.", "products.enrichment.rejectConfirm": "Confirmar rechazar enriquecimiento", - "products.enrichment.rejectBody": "¿Rechazar el enriquecimiento y devolver este producto a sin procesar? Puedes volver a procesar después.", + "products.enrichment.rejectBody": "¿Rechazar el enriquecimiento y devolver este producto a sin procesar? Puedes volver a procesar después.", "products.enrichment.rejectSelectedConfirm": "Confirmar rechazar seleccionados", "products.enrichment.resetConfirm": "Confirmar restablecer a sin procesar", - "products.enrichment.resetSelected": "¿Restablecer {count} producto(s) seleccionado(s) a sin procesar? Volverán a aparecer como elementos sin procesar.", - "products.enrichment.accepted": "Enriquecimiento aceptado — movido a Procesados.", - "products.enrichment.rejected": "Enriquecimiento rechazado — producto devuelto a sin procesar.", + "products.enrichment.resetSelected": "¿Restablecer {count} producto(s) seleccionado(s) a sin procesar? Volverán a aparecer como elementos sin procesar.", + "products.enrichment.accepted": "Enriquecimiento aceptado — movido a Procesados.", + "products.enrichment.rejected": "Enriquecimiento rechazado — producto devuelto a sin procesar.", "products.enrichment.acceptFailed": "No se pudo aceptar el enriquecimiento", "products.enrichment.rejectFailed": "No se pudo rechazar el enriquecimiento", - "products.enrichment.acceptUndone": "Aceptación deshecha", - "products.enrichment.undoAcceptFailed": "No se pudo deshacer la aceptación", + "products.enrichment.acceptUndone": "Aceptación deshecha", + "products.enrichment.undoAcceptFailed": "No se pudo deshacer la aceptación", "products.enrichment.resetDone": "Producto devuelto a sin procesar.", "products.enrichment.resetFailed": "No se pudieron restablecer los productos", "products.enrichment.valueReset": "Valor enriquecido restablecido al original.", - "products.enrichment.originalEmpty": "El valor original está vacío; el enriquecimiento no se puede borrar vía PATCH.", + "products.enrichment.originalEmpty": "El valor original está vacío; el enriquecimiento no se puede borrar vía PATCH.", "products.enrichment.staysNeedsReview": "El producto permanece en Needs Review hasta que aceptes todo.", - "products.field.nameAcceptUndone": "Aceptación del nombre deshecha", - "products.field.descriptionAcceptUndone": "Aceptación de la descripción deshecha", + "products.field.nameAcceptUndone": "Aceptación del nombre deshecha", + "products.field.descriptionAcceptUndone": "Aceptación de la descripción deshecha", "products.field.nameDiscardUndone": "Descarte del nombre deshecho", - "products.field.descriptionDiscardUndone": "Descarte de la descripción deshecho", - "products.field.undoAcceptFailed": "No se pudo deshacer la aceptación del campo", + "products.field.descriptionDiscardUndone": "Descarte de la descripción deshecho", + "products.field.undoAcceptFailed": "No se pudo deshacer la aceptación del campo", "products.field.undoDiscardFailed": "No se pudo deshacer el descarte del campo", "products.updateFailed": "No se pudo actualizar el producto", "products.keyboardTips": "Atajos de teclado", "products.keyboardTipsShort": "Atajos de teclado (?)", - "products.option.categories": "Categorías", + "products.option.categories": "Categorías", "products.option.attributes": "Atributos / especificaciones", - "products.option.titlesAi": "Títulos (IA)", + "products.option.titlesAi": "Títulos (IA)", "products.option.descriptionsAi": "Descripciones (IA)", "products.enrichment.piece.name": "Nombre", - "products.enrichment.piece.description": "Descripción", + "products.enrichment.piece.description": "Descripción", "products.enrichment.piece.attributes": "Atributos", - "products.enrichment.piece.category": "Categoría", + "products.enrichment.piece.category": "Categoría", "products.enrichment.state.processed": "Procesados", "products.enrichment.state.feed": "Del feed", "products.enrichment.state.missing": "Faltantes", - "products.enrichment.help.name": "Título del producto. Verde = nombre procesado con AI; naranja = solo nombre del feed/original; gris = ausente.", - "products.enrichment.help.description": "Descripción del producto. Verde = procesada con AI; naranja = solo feed/original; gris = ausente.", + "products.enrichment.help.name": "Título del producto. Verde = nombre procesado con AI; naranja = solo nombre del feed/original; gris = ausente.", + "products.enrichment.help.description": "Descripción del producto. Verde = procesada con AI; naranja = solo feed/original; gris = ausente.", "products.enrichment.help.attributes": "Especificaciones y atributos. Verde = atributos AI/enriquecidos; naranja = solo del feed; gris = ninguno.", - "products.enrichment.help.category": "Categoría asignada. Verde = categoría definida; gris = ausente.", + "products.enrichment.help.category": "Categoría asignada. Verde = categoría definida; gris = ausente.", "products.enrichment.chipTitle": "{label}: {state}. {help}", - "products.enrichment.complete": "Completo — {parts}", - "products.enrichment.missingSummary": "Falta {missing} — {parts}", - "products.issue.title": "título", + "products.enrichment.complete": "Completo — {parts}", + "products.enrichment.missingSummary": "Falta {missing} — {parts}", + "products.issue.title": "título", "products.issue.gtin": "GTIN", - "products.issue.category": "categoría", - "products.filters.allCategories": "Todas las categorías", + "products.issue.category": "categoría", + "products.filters.allCategories": "Todas las categorías", "products.filters.allFeeds": "Todos los feeds", "products.filters.allCoverage": "Toda la cobertura", "products.filters.anyFeedChange": "Cualquier cambio de feed", "products.filters.eprelAll": "EPREL: todos", "products.filters.feedChangesAll": "Cambios de feed: todos", - "products.filters.byCategory": "Filtrar por categoría", + "products.filters.byCategory": "Filtrar por categoría", "products.filters.byCoverage": "Filtrar por cobertura", "products.filters.byFeed": "Filtrar por feed", "products.filters.byEprel": "Filtrar por EPREL", - "products.filters.byFeedSync": "Filtrar por cambios de sincronización del feed", - "products.filters.coverageHint": "Filtrar por completitud de Nombre / Descripción / Atributos / Categoría", - "products.filters.feedSyncHint": "Filtrar por cambios de precio/stock/título de la última sincronización del feed", - "products.filters.eprelHint": "Filtrar productos que tienen o carecen de un id de registro EPREL de etiqueta energética", + "products.filters.byFeedSync": "Filtrar por cambios de sincronización del feed", + "products.filters.coverageHint": "Filtrar por completitud de Nombre / Descripción / Atributos / Categoría", + "products.filters.feedSyncHint": "Filtrar por cambios de precio/stock/título de la última sincronización del feed", + "products.filters.eprelHint": "Filtrar productos que tienen o carecen de un id de registro EPREL de etiqueta energética", "products.filters.availabilityChanged": "Disponibilidad cambiada", "products.eprel.badgeTitle": "Id EPREL presente en este producto (European Product Registry for Energy Labelling).", - "products.eprel.help": "El id del European Product Registry for Energy Labelling (EPREL) está presente en este producto.", + "products.eprel.help": "El id del European Product Registry for Energy Labelling (EPREL) está presente en este producto.", "products.feedData": "Datos del feed", "attributes.title": "Atributos", - "attributes.description": "Define campos de producto, valores de lista y asignaciones de categoría.", + "attributes.description": "Define campos de producto, valores de lista y asignaciones de categoría.", "attributes.loadFailed": "No se pudieron cargar los atributos", - "attributes.loading": "Cargando atributos…", + "attributes.loading": "Cargando atributos…", "attributes.zero": "0 atributos", - "attributes.addNew": "Añadir nuevo atributo", + "attributes.addNew": "Añadir nuevo atributo", "attributes.create": "Crear atributo", "attributes.edit": "Editar atributo", "attributes.delete": "Eliminar atributo", "attributes.displayName": "Nombre para mostrar del atributo", "attributes.actions": "Acciones de atributo", "attributes.created": "Atributo creado.", - "attributes.createdAssignFailed": "Atributo creado, pero falló la asignación de categoría.", + "attributes.createdAssignFailed": "Atributo creado, pero falló la asignación de categoría.", "attributes.updated": "Atributo actualizado.", "attributes.deleted": "Atributo eliminado.", - "attributes.addValue": "Añadir valor", - "attributes.manageValues": "Añade, edita o elimina valores de este atributo de lista.", - "attributes.valueTypeHint": "Elige cómo se introducen los valores de este atributo.", - "attributes.createDescription": "Crea una nueva definición de atributo. Puedes asignarlo a una categoría durante la creación.", - "attributes.assignToCategories": "Asignar atributos a categorías", - "attributes.assignFailed": "No se pudo asignar el atributo a la categoría seleccionada.", - "attributes.bulkAssignFailed": "Falló la asignación masiva", - "attributes.filterByCategory": "Filtrar por categoría", + "attributes.addValue": "Añadir valor", + "attributes.manageValues": "Añade, edita o elimina valores de este atributo de lista.", + "attributes.valueTypeHint": "Elige cómo se introducen los valores de este atributo.", + "attributes.createDescription": "Crea una nueva definición de atributo. Puedes asignarlo a una categoría durante la creación.", + "attributes.assignToCategories": "Asignar atributos a categorías", + "attributes.assignFailed": "No se pudo asignar el atributo a la categoría seleccionada.", + "attributes.bulkAssignFailed": "Falló la asignación masiva", + "attributes.filterByCategory": "Filtrar por categoría", "attributes.saveValueFailed": "No se pudo guardar el valor", "attributes.deleteValueFailed": "No se pudo eliminar el valor", "attributes.csvNeedHeader": "El CSV debe incluir una cabecera y al menos una fila", "attributes.csvNeedColumns": "El CSV debe incluir las columnas \"category_id\" y \"attribute_key\"", "attributes.type.string": "Texto", - "attributes.type.stringHint": "Texto libre — nombres, modelos, notas cortas", - "attributes.type.number": "Número", - "attributes.type.numberHint": "Valor numérico; añade unidad si ayuda (cm, kg, W)", - "attributes.type.boolean": "Sí / No", - "attributes.type.booleanHint": "Verdadero o falso — p. ej. tiene GPS, carga inalámbrica", + "attributes.type.stringHint": "Texto libre — nombres, modelos, notas cortas", + "attributes.type.number": "Número", + "attributes.type.numberHint": "Valor numérico; añade unidad si ayuda (cm, kg, W)", + "attributes.type.boolean": "Sí / No", + "attributes.type.booleanHint": "Verdadero o falso — p. ej. tiene GPS, carga inalámbrica", "attributes.type.date": "Fecha", - "attributes.type.dateHint": "Una fecha de calendario (lanzamiento, fin de garantía, …)", + "attributes.type.dateHint": "Una fecha de calendario (lanzamiento, fin de garantía, …)", "attributes.type.list": "Lista desplegable", - "attributes.type.listHint": "Elige exactamente una opción de una lista definida", - "attributes.type.multiselect": "Selección múltiple", - "attributes.type.multiselectHint": "Elige una o más opciones de una lista", + "attributes.type.listHint": "Elige exactamente una opción de una lista definida", + "attributes.type.multiselect": "Selección múltiple", + "attributes.type.multiselectHint": "Elige una o más opciones de una lista", "attributes.color": "Color", - "categories.title": "Categorías", - "categories.description": "Organiza la jerarquía del catálogo. Edita una categoría para abrir fórmulas de título/descripción y prompts IA.", - "categories.loadFailed": "Error al cargar las categorías", - "categories.add": "Añadir categoría", - "categories.edit": "Editar categoría", - "categories.delete": "Eliminar categoría", - "categories.deleteConfirm": "¿Seguro que quieres eliminar esta categoría? Esta acción no se puede deshacer.", - "categories.name": "Nombre de categoría", - "categories.namePlaceholder": "Nombre de categoría", - "categories.descriptionPlaceholder": "Descripción opcional de la categoría", - "categories.uniqueIdPlaceholder": "Identificador único opcional", + "categories.title": "Categorías", + "categories.description": "Organiza la jerarquía del catálogo. Edita una categoría para abrir fórmulas de título/descripción y prompts IA.", + "categories.loadFailed": "Error al cargar las categorías", + "categories.add": "Añadir categoría", + "categories.edit": "Editar categoría", + "categories.delete": "Eliminar categoría", + "categories.deleteConfirm": "¿Seguro que quieres eliminar esta categoría? Esta acción no se puede deshacer.", + "categories.name": "Nombre de categoría", + "categories.namePlaceholder": "Nombre de categoría", + "categories.descriptionPlaceholder": "Descripción opcional de la categoría", + "categories.uniqueIdPlaceholder": "Identificador único opcional", "categories.searchPlaceholder": "Buscar por nombre o ID...", "categories.created": "{name} se ha creado.", - "categories.updated": "La categoría se actualizó correctamente.", - "categories.deleted": "La categoría se eliminó correctamente.", - "categories.notFound": "Categoría no encontrada.", - "categories.loadCategoryFailed": "Error al cargar la categoría", - "categories.noCategoriesYet": "Aún no hay categorías", - "categories.noMatch": "Ninguna categoría coincide con “{query}”. Borra la búsqueda o prueba otro término.", - "categories.emptyHint": "Añade una categoría o importa un CSV para construir tu árbol.", - "categories.promptCountOne": "{count} categoría tiene un prompt de generación IA. Abre el menú ⋮ → Editar prompt IA, o edita una categoría y elige Editar prompt IA.", - "categories.promptCountMany": "{count} categorías tienen un prompt de generación IA. Abre el menú ⋮ → Editar prompt IA, o edita una categoría y elige Editar prompt IA.", - "categories.actions": "Acciones de categoría", + "categories.updated": "La categoría se actualizó correctamente.", + "categories.deleted": "La categoría se eliminó correctamente.", + "categories.notFound": "Categoría no encontrada.", + "categories.loadCategoryFailed": "Error al cargar la categoría", + "categories.noCategoriesYet": "Aún no hay categorías", + "categories.noMatch": "Ninguna categoría coincide con “{query}”. Borra la búsqueda o prueba otro término.", + "categories.emptyHint": "Añade una categoría o importa un CSV para construir tu árbol.", + "categories.promptCountOne": "{count} categoría tiene un prompt de generación IA. Abre el menú â‹® → Editar prompt IA, o edita una categoría y elige Editar prompt IA.", + "categories.promptCountMany": "{count} categorías tienen un prompt de generación IA. Abre el menú â‹® → Editar prompt IA, o edita una categoría y elige Editar prompt IA.", + "categories.actions": "Acciones de categoría", "categories.chooseCsv": "Elegir CSV", - "categories.createSingleOrImport": "Crea una sola categoría o importa muchas desde CSV.", - "categories.createSingle": "Crear una sola categoría.", + "categories.createSingleOrImport": "Crea una sola categoría o importa muchas desde CSV.", + "categories.createSingle": "Crear una sola categoría.", "categories.missingNameColumn": "Falta la columna obligatoria 'name'", "categories.missingUniqueIdColumn": "Falta la columna obligatoria 'unique_id'", - "categories.nameAndIdRequired": "El nombre y el ID único son obligatorios.", + "categories.nameAndIdRequired": "El nombre y el ID único son obligatorios.", "categories.csvNeedRows": "El archivo debe tener una fila de cabecera y al menos una fila de datos", - "categories.titleFormula": "Fórmula de título", - "categories.descriptionFormula": "Fórmula de descripción", - "categories.setTitleFormula": "Definir fórmula de título", - "categories.editTitleFormula": "Editar fórmula de título", - "categories.setDescriptionFormula": "Definir fórmula de descripción", - "categories.editDescriptionFormula": "Editar fórmula de descripción", + "categories.titleFormula": "Fórmula de título", + "categories.descriptionFormula": "Fórmula de descripción", + "categories.setTitleFormula": "Definir fórmula de título", + "categories.editTitleFormula": "Editar fórmula de título", + "categories.setDescriptionFormula": "Definir fórmula de descripción", + "categories.editDescriptionFormula": "Editar fórmula de descripción", "categories.setAiPrompt": "Definir prompt IA", "categories.editAiPrompt": "Editar prompt IA", "categories.editAiPromptShort": "Editar prompt IA", - "categories.aiPromptSet": "Hay un prompt de generación IA configurado", - "categories.aiPromptTitle": "Prompt IA de categoría", - "categories.aiPromptDescription": "Plantilla de generación por categoría usada al enriquecer productos de esta categoría.", + "categories.aiPromptSet": "Hay un prompt de generación IA configurado", + "categories.aiPromptTitle": "Prompt IA de categoría", + "categories.aiPromptDescription": "Plantilla de generación por categoría usada al enriquecer productos de esta categoría.", "categories.aiPromptSaved": "Prompt IA guardado.", - "categories.aiPromptCleared": "Prompt IA borrado (se aplicará el predeterminado de la empresa).", + "categories.aiPromptCleared": "Prompt IA borrado (se aplicará el predeterminado de la empresa).", "categories.aiPromptSaveFailed": "Error al guardar el prompt", "categories.aiPromptAssignFailed": "Error al asignar el prompt", "categories.assignAiPrompt": "Asignar prompt IA", - "categories.assignAiPromptHelp": "Copia este prompt de generación IA a otras categorías.", - "categories.loadingPrompt": "Cargando prompt…", + "categories.assignAiPromptHelp": "Copia este prompt de generación IA a otras categorías.", + "categories.loadingPrompt": "Cargando prompt…", "categories.brandVoice": "Voz de marca", "categories.productName": "Nombre del producto", "categories.gtin": "GTIN", - "categories.backToCategories": "Volver a categorías", - "categories.cancelReturn": "Cancelar y volver a categorías", - "categories.assignFormula": "Asignar fórmula", - "categories.assignFormulaOther": "Asignar fórmula a otras categorías", - "categories.assignTitleFormula": "Asignar fórmula de título", - "categories.assignDescriptionFormula": "Asignar fórmula de descripción", - "categories.assignSelectHelp": "Selecciona las categorías a las que aplicar esta plantilla.", - "categories.assignTitleHelp": "Selecciona las categorías a las que aplicar esta plantilla de fórmula de título.", - "categories.assignDescriptionHelp": "Selecciona las categorías a las que aplicar esta plantilla de fórmula de descripción.", - "categories.searchCategories": "Buscar categorías…", + "categories.backToCategories": "Volver a categorías", + "categories.cancelReturn": "Cancelar y volver a categorías", + "categories.assignFormula": "Asignar fórmula", + "categories.assignFormulaOther": "Asignar fórmula a otras categorías", + "categories.assignTitleFormula": "Asignar fórmula de título", + "categories.assignDescriptionFormula": "Asignar fórmula de descripción", + "categories.assignSelectHelp": "Selecciona las categorías a las que aplicar esta plantilla.", + "categories.assignTitleHelp": "Selecciona las categorías a las que aplicar esta plantilla de fórmula de título.", + "categories.assignDescriptionHelp": "Selecciona las categorías a las que aplicar esta plantilla de fórmula de descripción.", + "categories.searchCategories": "Buscar categorías…", "categories.matching": " coincidentes", - "categories.titleFormulaHelp": "Construye títulos de producto con variables y texto fijo para esta categoría.", - "categories.descriptionFormulaHelp": "Define el texto meta SEO y las secciones de cuerpo que la IA debe generar para esta categoría.", - "categories.loadingFormula": "Cargando fórmula…", - "categories.titleFormulaSaved": "Fórmula de título guardada correctamente", - "categories.titleFormulaRemoved": "Fórmula de título eliminada correctamente", - "categories.titleFormulaSaveFailed": "Error al guardar la fórmula de título", - "categories.titleFormulaAssignFailed": "Error al asignar la fórmula de título", - "categories.descriptionFormulaRemoved": "Fórmula de descripción eliminada correctamente", - "categories.descriptionFormulaSaved": "Fórmula de descripción guardada correctamente", - "categories.descriptionFormulaSavedWithExports": "Fórmula de descripción guardada correctamente y sincronizados {count} IDs de exportación", - "categories.descriptionFormulaSaveFailed": "Error al guardar la fórmula de descripción", - "categories.descriptionFormulaAssignFailed": "Error al asignar la fórmula de descripción", - "categories.seoTitlePlaceholder": "Indica a la IA cómo escribir el título SEO…", - "categories.seoDescriptionPlaceholder": "Indica a la IA cómo escribir la descripción SEO…", - "categories.sectionPromptPlaceholder": "¿Qué debe escribir la IA en esta sección?", - "categories.sectionKeyPlaceholder": "p. ej., short_description (letras, números, _)", - "categories.formulaElementTypes": "Tipos de elemento de fórmula", - "categories.formulaElements": "Elementos de fórmula", + "categories.titleFormulaHelp": "Construye títulos de producto con variables y texto fijo para esta categoría.", + "categories.descriptionFormulaHelp": "Define el texto meta SEO y las secciones de cuerpo que la IA debe generar para esta categoría.", + "categories.loadingFormula": "Cargando fórmula…", + "categories.titleFormulaSaved": "Fórmula de título guardada correctamente", + "categories.titleFormulaRemoved": "Fórmula de título eliminada correctamente", + "categories.titleFormulaSaveFailed": "Error al guardar la fórmula de título", + "categories.titleFormulaAssignFailed": "Error al asignar la fórmula de título", + "categories.descriptionFormulaRemoved": "Fórmula de descripción eliminada correctamente", + "categories.descriptionFormulaSaved": "Fórmula de descripción guardada correctamente", + "categories.descriptionFormulaSavedWithExports": "Fórmula de descripción guardada correctamente y sincronizados {count} IDs de exportación", + "categories.descriptionFormulaSaveFailed": "Error al guardar la fórmula de descripción", + "categories.descriptionFormulaAssignFailed": "Error al asignar la fórmula de descripción", + "categories.seoTitlePlaceholder": "Indica a la IA cómo escribir el título SEO…", + "categories.seoDescriptionPlaceholder": "Indica a la IA cómo escribir la descripción SEO…", + "categories.sectionPromptPlaceholder": "¿Qué debe escribir la IA en esta sección?", + "categories.sectionKeyPlaceholder": "p. ej., short_description (letras, números, _)", + "categories.formulaElementTypes": "Tipos de elemento de fórmula", + "categories.formulaElements": "Elementos de fórmula", "categories.elementSeparator": "Separador de elementos", "categories.elementSeparatorHint": "Espacio, guion, etc.", "categories.dragToReorder": "Arrastra para reordenar", - "categories.addCustomVariable": "Añadir variable personalizada", + "categories.addCustomVariable": "Añadir variable personalizada", "categories.editCustomVariable": "Editar variable personalizada", - "categories.customVariableHelp": "Define una variable reutilizable para fórmulas de título.", + "categories.customVariableHelp": "Define una variable reutilizable para fórmulas de título.", "categories.manageVariables": "Gestionar variables", - "categories.manageVariablesHelp": "Ver, editar y añadir variables para tus fórmulas de título.", - "categories.searchVariables": "Buscar variables…", - "categories.variableAdded": "Variable añadida correctamente", + "categories.manageVariablesHelp": "Ver, editar y añadir variables para tus fórmulas de título.", + "categories.searchVariables": "Buscar variables…", + "categories.variableAdded": "Variable añadida correctamente", "categories.variableUpdated": "Variable actualizada correctamente", "categories.variableDeleted": "Variable eliminada correctamente", "categories.variableDeleteFailed": "Error al eliminar la variable", "categories.variableNameRequired": "El nombre de la variable es obligatorio", "categories.displayNameRequired": "El nombre para mostrar es obligatorio", - "categories.variableNamePattern": "El nombre solo puede contener letras, números y guiones bajos", - "categories.deleteVariableConfirm": "¿Seguro que quieres eliminar esta variable? Puede afectar a fórmulas que la usan.", - "categories.removeElementConfirm": "¿Seguro que quieres quitar este elemento de tu fórmula?", - "categories.addTextElement": "Añadir elemento de texto", - "categories.addTextElementHelp": "Añade un elemento de texto fijo a tu fórmula.", + "categories.variableNamePattern": "El nombre solo puede contener letras, números y guiones bajos", + "categories.deleteVariableConfirm": "¿Seguro que quieres eliminar esta variable? Puede afectar a fórmulas que la usan.", + "categories.removeElementConfirm": "¿Seguro que quieres quitar este elemento de tu fórmula?", + "categories.addTextElement": "Añadir elemento de texto", + "categories.addTextElementHelp": "Añade un elemento de texto fijo a tu fórmula.", "categories.editTextElement": "Editar elemento de texto", - "categories.editTextElementHelp": "Edita el elemento de texto de tu fórmula.", + "categories.editTextElementHelp": "Edita el elemento de texto de tu fórmula.", "categories.staticTextPlaceholder": "Introducir texto fijo", - "categories.textCannotBeEmpty": "El texto no puede estar vacío", + "categories.textCannotBeEmpty": "El texto no puede estar vacío", "categories.exampleProductName": "Nombre del producto", "categories.exampleWidget": "Acme Widget Pro (ejemplo)", - "fields.title": "Campos estándar", - "fields.description": "Define campos de producto estándar y organízalos en grupos", - "fields.loading": "Cargando campos estándar…", + "fields.title": "Campos estándar", + "fields.description": "Define campos de producto estándar y organízalos en grupos", + "fields.loading": "Cargando campos estándar…", "fields.loadFailed": "No se pudieron cargar los campos", "fields.loadGroupsFailed": "No se pudieron cargar los grupos de campos", - "fields.addField": "Añadir campo nuevo", - "fields.addGroup": "Añadir grupo nuevo", + "fields.addField": "Añadir campo nuevo", + "fields.addGroup": "Añadir grupo nuevo", "fields.createField": "Crear campo", "fields.createGroup": "Crear grupo", "fields.editField": "Editar campo", "fields.editGroup": "Editar grupo", - "fields.basicInfo": "Información básica", - "fields.createFieldHelp": "Crea un nuevo campo estándar para tus datos de producto", - "fields.editFieldHelp": "Actualiza los detalles de este campo estándar", - "fields.createGroupHelp": "Crea un nuevo grupo para organizar tus campos estándar", + "fields.basicInfo": "Información básica", + "fields.createFieldHelp": "Crea un nuevo campo estándar para tus datos de producto", + "fields.editFieldHelp": "Actualiza los detalles de este campo estándar", + "fields.createGroupHelp": "Crea un nuevo grupo para organizar tus campos estándar", "fields.editGroupHelp": "Actualiza los detalles de este grupo de campos", "fields.dataTypeHint": "Tipo de datos de este campo", "fields.defaultValueOptional": "Valor predeterminado (opcional)", - "fields.fieldDescriptionPlaceholder": "Introduce una descripción para este campo", - "fields.groupDescriptionPlaceholder": "Introduce una descripción para este grupo", - "fields.keyHint": "Solo letras minúsculas, números y guiones bajos", - "fields.exampleTitle": "Título del producto", - "fields.noFields": "No se encontraron campos. Haz clic en \"Añadir campo\" para crear uno.", - "fields.noFieldsMatch": "Ningún campo coincide con tu búsqueda", + "fields.fieldDescriptionPlaceholder": "Introduce una descripción para este campo", + "fields.groupDescriptionPlaceholder": "Introduce una descripción para este grupo", + "fields.keyHint": "Solo letras minúsculas, números y guiones bajos", + "fields.exampleTitle": "Título del producto", + "fields.noFields": "No se encontraron campos. Haz clic en \"Añadir campo\" para crear uno.", + "fields.noFieldsMatch": "Ningún campo coincide con tu búsqueda", "fields.noGroups": "No se encontraron grupos. Crea tu primer grupo.", - "fields.noGroupsMatch": "Ningún grupo coincide con tu búsqueda", + "fields.noGroupsMatch": "Ningún grupo coincide con tu búsqueda", "fields.fieldCreated": "Campo creado correctamente", "fields.fieldUpdated": "Campo actualizado correctamente", "fields.fieldDeleted": "Campo eliminado correctamente", @@ -2972,69 +2973,69 @@ export const es: MessageDict = { "fields.updateUnitFailed": "No se pudo actualizar la unidad", "fields.deleteFieldFailed": "No se pudo eliminar el campo", "fields.deleteGroupFailed": "No se pudo eliminar el grupo", - "fields.bulkUpdateFailed": "Falló la actualización masiva", + "fields.bulkUpdateFailed": "Falló la actualización masiva", "fields.enableRecommendedFailed": "No se pudieron activar los campos recomendados", "fields.enabledRecommended": "Campos de ecommerce recomendados activados", - "fields.deleteFieldConfirm": "Esta acción no se puede deshacer. Eliminará permanentemente el campo y lo quitará de cualquier plantilla que lo use.", - "fields.deleteGroupConfirm": "Esta acción no se puede deshacer. Eliminará permanentemente el grupo. Los campos de este grupo deberán reasignarse.", + "fields.deleteFieldConfirm": "Esta acción no se puede deshacer. Eliminará permanentemente el campo y lo quitará de cualquier plantilla que lo use.", + "fields.deleteGroupConfirm": "Esta acción no se puede deshacer. Eliminará permanentemente el grupo. Los campos de este grupo deberán reasignarse.", "fields.type.string": "Texto", - "fields.type.stringHint": "Texto libre — nombres, códigos, notas cortas", - "fields.type.number": "Número", - "fields.type.numberHint": "Valor numérico; añade unidad si ayuda (EUR, uds)", - "fields.type.boolean": "Sí / No", + "fields.type.stringHint": "Texto libre — nombres, códigos, notas cortas", + "fields.type.number": "Número", + "fields.type.numberHint": "Valor numérico; añade unidad si ayuda (EUR, uds)", + "fields.type.boolean": "Sí / No", "fields.type.booleanHint": "Verdadero o falso", "fields.type.date": "Fecha", "fields.type.dateHint": "Una fecha de calendario", "fields.type.url": "URL", - "fields.type.urlHint": "Enlace web (página de producto, vídeo, fabricante)", + "fields.type.urlHint": "Enlace web (página de producto, vídeo, fabricante)", "fields.type.image": "Imagen", - "fields.type.imageHint": "URL de imagen o imagen de galería", - "fields.type.dimension": "Dimensión", + "fields.type.imageHint": "URL de imagen o imagen de galería", + "fields.type.dimension": "Dimensión", "fields.type.dimensionHint": "Medida de longitud (ancho, alto, fondo)", "fields.type.weight": "Peso", - "fields.type.weightHint": "Masa / peso de envío", + "fields.type.weightHint": "Masa / peso de envío", "fields.type.color": "Color", - "fields.type.colorHint": "Nombre o código de color", + "fields.type.colorHint": "Nombre o código de color", "fields.type.custom": "Personalizado", "fields.type.customHint": "Campo especial / de forma libre", "empty.admin.knowledgeHeading": "Base de conocimiento", "empty.admin.translationsHeading": "Traducciones", - "flash.attrs.createdLinkFailed": "Atributo creado, pero falló la asignación de categoría.", + "flash.attrs.createdLinkFailed": "Atributo creado, pero falló la asignación de categoría.", "flash.attrs.created": "Atributo creado.", - "flash.attrs.csvImported": "Importación CSV finalizada.", + "flash.attrs.csvImported": "Importación CSV finalizada.", "flash.attrs.updated": "Atributo actualizado.", "flash.attrs.deleted": "Atributo eliminado.", "flash.attrs.valueDeleted": "Valor eliminado.", - "flash.attrs.assignedLinks": "Se asignaron {count} vínculo(s) categoría–atributo.", + "flash.attrs.assignedLinks": "Se asignaron {count} vínculo(s) categoría–atributo.", "flash.brand.saved": "Kit de marca guardado.", "flash.brand.logoType": "El logo debe ser PNG, JPEG o WebP", - "flash.brand.logoSize": "El logo supera el límite de 2 MiB", + "flash.brand.logoSize": "El logo supera el límite de 2 MiB", "flash.brand.logoUploaded": "Logo subido.", - "flash.categories.updated": "La categoría se actualizó correctamente.", - "flash.categories.deleted": "La categoría se eliminó correctamente.", - "flash.categories.csvImported": "Importación CSV finalizada.", + "flash.categories.updated": "La categoría se actualizó correctamente.", + "flash.categories.deleted": "La categoría se eliminó correctamente.", + "flash.categories.csvImported": "Importación CSV finalizada.", "flash.products.csvImported": "Product CSV import finished.", - "flash.categories.descFormulaAssigned": "Fórmula de descripción asignada a {count} categorías", + "flash.categories.descFormulaAssigned": "Fórmula de descripción asignada a {count} categorías", "flash.categories.promptAssigned": "Prompt asignado a {count} {noun}.", - "flash.categories.promptNounOne": "categoría", - "flash.categories.promptNounMany": "categorías", - "flash.categories.titleFormulaAssigned": "Fórmula de título asignada a {count} {noun}", + "flash.categories.promptNounOne": "categoría", + "flash.categories.promptNounMany": "categorías", + "flash.categories.titleFormulaAssigned": "Fórmula de título asignada a {count} {noun}", "flash.categories.variableDeleted": "Variable eliminada correctamente", - "flash.export.updated": "Feed de exportación actualizado.", - "flash.export.created": "Feed de exportación creado.", - "flash.export.urlCopied": "URL pública del feed {format} copiada. Pégala en cualquier sistema que obtenga feeds de productos.", + "flash.export.updated": "Feed de exportación actualizado.", + "flash.export.created": "Feed de exportación creado.", + "flash.export.urlCopied": "URL pública del feed {format} copiada. Pégala en cualquier sistema que obtenga feeds de productos.", "flash.export.copyFailed": "Error al copiar la URL al portapapeles", "flash.export.refreshed": "Feed actualizado.", "flash.export.refreshedWithCount": "Feed actualizado ({count} productos).", - "flash.export.deleted": "Feed de exportación eliminado correctamente.", + "flash.export.deleted": "Feed de exportación eliminado correctamente.", "flash.export.tokenRotated": "Token de URL publica rotado. Actualiza los sistemas que usen la URL anterior.", "common.edit": "Editar", "common.previous": "Anterior", "common.next": "Siguiente", - "common.saving": "Guardando…", - "common.deleting": "Eliminando…", - "common.adding": "Añadiendo…", - "common.processing": "Procesando…", + "common.saving": "Guardando…", + "common.deleting": "Eliminando…", + "common.adding": "Añadiendo…", + "common.processing": "Procesando…", "common.upload": "Subir", "common.expand": "Expandir", "common.collapse": "Contraer", @@ -3047,62 +3048,62 @@ export const es: MessageDict = { "common.unit": "Unidad", "common.group": "Grupo", "common.search": "Buscar", - "common.openMenu": "Abrir menú", - "common.areYouSure": "¿Estás seguro?", + "common.openMenu": "Abrir menú", + "common.areYouSure": "¿Estás seguro?", "common.selectGroup": "Seleccionar un grupo", - "attributes.addAttribute": "Añadir atributo", - "attributes.searchPlaceholder": "Buscar atributos…", + "attributes.addAttribute": "Añadir atributo", + "attributes.searchPlaceholder": "Buscar atributos…", "attributes.searchAria": "Buscar atributos (pulsa Enter para buscar)", - "attributes.filterCategoryAria": "Filtrar por categoría", - "attributes.allCategories": "Todas las categorías", + "attributes.filterCategoryAria": "Filtrar por categoría", + "attributes.allCategories": "Todas las categorías", "attributes.col.name": "Nombre", "attributes.col.key": "Clave de atributo", "attributes.col.type": "Tipo", "attributes.col.unit": "Unidad", - "attributes.col.categories": "Categorías", - "attributes.col.updated": "Última actualización", + "attributes.col.categories": "Categorías", + "attributes.col.updated": "Última actualización", "attributes.col.actions": "Acciones", "attributes.emptyTitle": "No se encontraron atributos", - "attributes.emptyFiltered": "Prueba a borrar la búsqueda o el filtro de categoría.", - "attributes.emptyHint": "Añade un atributo o importa un CSV para empezar.", + "attributes.emptyFiltered": "Prueba a borrar la búsqueda o el filtro de categoría.", + "attributes.emptyHint": "Añade un atributo o importa un CSV para empezar.", "attributes.noValues": "Sin valores", "attributes.actionsAria": "Acciones de atributo", "attributes.editDetails": "Editar detalles", "attributes.loadingValues": "Cargando valores...", - "attributes.noValuesYetHint": "Aún no hay valores. Usa \"Gestionar valores\" para añadirlos.", + "attributes.noValuesYetHint": "Aún no hay valores. Usa \"Gestionar valores\" para añadirlos.", "attributes.pageZero": "0 atributos", - "attributes.pageShowing": "Mostrando {from}–{to} de {total} atributos", - "attributes.linkCategoryFailed": "No se pudo asignar el atributo a la categoría seleccionada.", - "attributes.createdLinkFailed": "Atributo creado, pero falló la asignación de categoría.", + "attributes.pageShowing": "Mostrando {from}–{to} de {total} atributos", + "attributes.linkCategoryFailed": "No se pudo asignar el atributo a la categoría seleccionada.", + "attributes.createdLinkFailed": "Atributo creado, pero falló la asignación de categoría.", "attributes.createFailed": "Error al crear", - "attributes.importFinished": "Importación CSV finalizada.", - "attributes.importFailed": "Error de importación", + "attributes.importFinished": "Importación CSV finalizada.", + "attributes.importFailed": "Error de importación", "attributes.updateFailed": "Error al actualizar", "attributes.deleteFailed": "Error al eliminar", "attributes.valueUpdated": "Valor actualizado.", - "attributes.valueAdded": "Valor añadido.", + "attributes.valueAdded": "Valor añadido.", "attributes.valueSaveFailed": "No se pudo guardar el valor", "attributes.valueDeleted": "Valor eliminado.", "attributes.valueDeleteFailed": "No se pudo eliminar el valor", "attributes.csvNeedRows": "El CSV debe incluir una cabecera y al menos una fila", - "attributes.rowUnknown": "Fila {row}: categoría o atributo desconocido", + "attributes.rowUnknown": "Fila {row}: categoría o atributo desconocido", "attributes.rowLinkFailed": "Fila {row}: {detail}", - "attributes.linkFailedShort": "falló el vínculo", - "attributes.assignedLinks": "Se asignaron {count} vínculo(s) categoría–atributo.", + "attributes.linkFailedShort": "falló el vínculo", + "attributes.assignedLinks": "Se asignaron {count} vínculo(s) categoría–atributo.", "attributes.rowsFailed": "{count} fila(s) fallaron.", - "attributes.addTitle": "Añadir nuevo atributo", - "attributes.addDesc": "Crea una nueva definición de atributo. Puedes asignarlo a una categoría durante la creación.", + "attributes.addTitle": "Añadir nuevo atributo", + "attributes.addDesc": "Crea una nueva definición de atributo. Puedes asignarlo a una categoría durante la creación.", "attributes.tab.single": "Individual", - "attributes.tab.bulk": "Importación masiva", + "attributes.tab.bulk": "Importación masiva", "attributes.field.key": "Clave de atributo", "attributes.field.keyPlaceholder": "atributo-key", "attributes.field.displayName": "Nombre para mostrar", "attributes.field.displayNamePlaceholder": "Nombre para mostrar del atributo", "attributes.field.type": "Tipo", - "attributes.field.typeDefaultHint": "Elige cómo se introducen los valores de este atributo.", - "attributes.field.category": "Categoría", - "attributes.field.categoryPlaceholder": "Selecciona una categoría…", - "attributes.field.categoryHint": "Selecciona la categoría a la que pertenece este atributo. Los atributos deben asignarse a una categoría.", + "attributes.field.typeDefaultHint": "Elige cómo se introducen los valores de este atributo.", + "attributes.field.category": "Categoría", + "attributes.field.categoryPlaceholder": "Selecciona una categoría…", + "attributes.field.categoryHint": "Selecciona la categoría a la que pertenece este atributo. Los atributos deben asignarse a una categoría.", "attributes.field.unitOptional": "Unidad (opcional)", "attributes.field.unitPlaceholder": "p. ej., cm, kg, etc.", "attributes.field.exampleOptional": "Ejemplo (opcional)", @@ -3112,61 +3113,61 @@ export const es: MessageDict = { "attributes.bulk.downloadCsv": "Descargar plantilla CSV", "attributes.bulk.downloadTsv": "Descargar plantilla TSV", "attributes.bulk.uploadHint": "Sube un archivo CSV o TSV con las siguientes columnas:", - "attributes.bulk.col.key": "Identificador único (obligatorio)", + "attributes.bulk.col.key": "Identificador único (obligatorio)", "attributes.bulk.col.name": "Nombre para mostrar (obligatorio)", - "attributes.bulk.col.valueType": "string (Texto), number, boolean (Sí/No), date, list (Desplegable), multiselect", - "attributes.bulk.col.categoryId": "ID único de categoría", + "attributes.bulk.col.valueType": "string (Texto), number, boolean (Sí/No), date, list (Desplegable), multiselect", + "attributes.bulk.col.categoryId": "ID único de categoría", "attributes.bulk.col.unitExample": "opcional", "attributes.bulk.col.parentKey": "Clave padre para valores de lista", "attributes.editTitle": "Editar atributo", "attributes.editDesc": "Actualiza los detalles del atributo \"{name}\"", - "attributes.field.keyHint": "Identificador único de este atributo", - "attributes.field.displayNameHint": "El nombre que verán los usuarios", + "attributes.field.keyHint": "Identificador único de este atributo", + "attributes.field.displayNameHint": "El nombre que verán los usuarios", "attributes.deleteTitle": "Eliminar atributo", - "attributes.deleteDesc": "¿Seguro que quieres eliminar \"{name}\"? Esta acción no se puede deshacer.", - "attributes.deleteWarningValues": "Aviso: también se eliminarán todos los valores asociados a este atributo.", + "attributes.deleteDesc": "¿Seguro que quieres eliminar \"{name}\"? Esta acción no se puede deshacer.", + "attributes.deleteWarningValues": "Aviso: también se eliminarán todos los valores asociados a este atributo.", "attributes.manageTitleNamed": "Gestionar valores de {name}", "attributes.manageTitle": "Gestionar valores", - "attributes.manageDesc": "Añade, edita o elimina valores de este atributo de lista.", + "attributes.manageDesc": "Añade, edita o elimina valores de este atributo de lista.", "attributes.valueKey": "Clave del valor", - "attributes.valueKeyHint": "Identificador único de este valor", + "attributes.valueKeyHint": "Identificador único de este valor", "attributes.displayValue": "Valor para mostrar", "attributes.displayValuePlaceholder": "Valor a mostrar", - "attributes.displayValueHint": "El nombre que se mostrará para este valor", + "attributes.displayValueHint": "El nombre que se mostrará para este valor", "attributes.updateValue": "Actualizar valor", - "attributes.noValuesYet": "Aún no hay valores.", - "attributes.assignTitle": "Asignar atributos a categorías", - "attributes.assignDesc": "Sube un CSV que mapee IDs únicos de categoría a claves de atributo.", + "attributes.noValuesYet": "Aún no hay valores.", + "attributes.assignTitle": "Asignar atributos a categorías", + "attributes.assignDesc": "Sube un CSV que mapee IDs únicos de categoría a claves de atributo.", "attributes.downloadTemplate": "Descargar plantilla", "attributes.csvFile": "Archivo CSV", "attributes.assignSuccess": "Asignaciones aplicadas correctamente.", - "attributes.assigning": "Asignando…", + "attributes.assigning": "Asignando…", "attributes.uploadAndAssign": "Subir y asignar", "attributes.type.string.label": "Texto", - "attributes.type.string.hint": "Texto libre — nombres, modelos, notas cortas", - "attributes.type.number.label": "Número", - "attributes.type.number.hint": "Valor numérico; añade unidad si ayuda (cm, kg, W)", - "attributes.type.boolean.label": "Sí / No", - "attributes.type.boolean.hint": "Verdadero o falso — p. ej. tiene GPS, carga inalámbrica", + "attributes.type.string.hint": "Texto libre — nombres, modelos, notas cortas", + "attributes.type.number.label": "Número", + "attributes.type.number.hint": "Valor numérico; añade unidad si ayuda (cm, kg, W)", + "attributes.type.boolean.label": "Sí / No", + "attributes.type.boolean.hint": "Verdadero o falso — p. ej. tiene GPS, carga inalámbrica", "attributes.type.date.label": "Fecha", - "attributes.type.date.hint": "Una fecha de calendario (lanzamiento, fin de garantía, …)", + "attributes.type.date.hint": "Una fecha de calendario (lanzamiento, fin de garantía, …)", "attributes.type.list.label": "Lista desplegable", - "attributes.type.list.hint": "Elige exactamente una opción de una lista definida", - "attributes.type.multiselect.label": "Selección múltiple", - "attributes.type.multiselect.hint": "Elige una o más opciones de una lista", - "standardFields.title": "Campos estándar", - "standardFields.description": "Define campos de producto estándar y organízalos en grupos", - "standardFields.apiUnavailable": "La API de campos estándar no está disponible. No se pueden guardar los cambios.", - "standardFields.apiUnreachable": "La API de campos estándar no es accesible ahora. Crear/editar permanece desactivado hasta que respondan /api/standard-fields y /api/field-groups.", - "standardFields.loading": "Cargando campos estándar…", + "attributes.type.list.hint": "Elige exactamente una opción de una lista definida", + "attributes.type.multiselect.label": "Selección múltiple", + "attributes.type.multiselect.hint": "Elige una o más opciones de una lista", + "standardFields.title": "Campos estándar", + "standardFields.description": "Define campos de producto estándar y organízalos en grupos", + "standardFields.apiUnavailable": "La API de campos estándar no está disponible. No se pueden guardar los cambios.", + "standardFields.apiUnreachable": "La API de campos estándar no es accesible ahora. Crear/editar permanece desactivado hasta que respondan /api/standard-fields y /api/field-groups.", + "standardFields.loading": "Cargando campos estándar…", "standardFields.tab.fields": "Campos", "standardFields.tab.groups": "Grupos", - "standardFields.heading": "Campos estándar", - "standardFields.headingHint": "Activa campos para mapeo y procesamiento — un interruptor por fila.", + "standardFields.heading": "Campos estándar", + "standardFields.headingHint": "Activa campos para mapeo y procesamiento — un interruptor por fila.", "standardFields.enableRecommended": "Activar recomendados", "standardFields.enableSelected": "Activar seleccionados ({count})", "standardFields.disableSelected": "Desactivar seleccionados", - "standardFields.addField": "Añadir campo", + "standardFields.addField": "Añadir campo", "standardFields.searchFields": "Buscar campos...", "standardFields.col.enabled": "Activado", "standardFields.col.name": "Nombre", @@ -3175,17 +3176,17 @@ export const es: MessageDict = { "standardFields.col.unit": "Unidad", "standardFields.col.group": "Grupo", "standardFields.col.status": "Estado", - "standardFields.emptySearch": "Ningún campo coincide con tu búsqueda", - "standardFields.emptyHint": "No se encontraron campos. Haz clic en \"Añadir campo\" para crear uno.", + "standardFields.emptySearch": "Ningún campo coincide con tu búsqueda", + "standardFields.emptyHint": "No se encontraron campos. Haz clic en \"Añadir campo\" para crear uno.", "standardFields.selectFieldAria": "Seleccionar {name}", "standardFields.enableFieldAria": "Activar {name}", - "standardFields.systemFieldTitle": "Campo de sistema — no se puede eliminar", + "standardFields.systemFieldTitle": "Campo de sistema — no se puede eliminar", "standardFields.groupsHeading": "Grupos de campos", - "standardFields.addGroup": "Añadir grupo", + "standardFields.addGroup": "Añadir grupo", "standardFields.searchGroups": "Buscar grupos...", - "standardFields.col.description": "Descripción", - "standardFields.col.displayOrder": "Orden de visualización", - "standardFields.emptyGroupsSearch": "Ningún grupo coincide con tu búsqueda", + "standardFields.col.description": "Descripción", + "standardFields.col.displayOrder": "Orden de visualización", + "standardFields.emptyGroupsSearch": "Ningún grupo coincide con tu búsqueda", "standardFields.emptyGroupsHint": "No se encontraron grupos. Crea tu primer grupo.", "standardFields.unknownGroup": "Grupo desconocido", "standardFields.loadGroupsFailed": "No se pudieron cargar los grupos de campos", @@ -3199,7 +3200,7 @@ export const es: MessageDict = { "standardFields.updateUnitFailed": "No se pudo actualizar la unidad", "standardFields.bulkEnabled": "Se activaron {count} campo(s)", "standardFields.bulkDisabled": "Se desactivaron {count} campo(s)", - "standardFields.bulkFailed": "Falló la actualización masiva", + "standardFields.bulkFailed": "Falló la actualización masiva", "standardFields.recommendedEnabled": "Campos de ecommerce recomendados activados", "standardFields.recommendedFailed": "No se pudieron activar los campos recomendados", "standardFields.fieldDeleted": "Campo eliminado correctamente", @@ -3210,16 +3211,16 @@ export const es: MessageDict = { "standardFields.groupDeleted": "Grupo eliminado correctamente", "standardFields.deleteGroupFailed": "No se pudo eliminar el grupo", "standardFields.editField": "Editar campo", - "standardFields.addNewField": "Añadir campo nuevo", - "standardFields.editFieldDesc": "Actualiza los detalles de este campo estándar", - "standardFields.addFieldDesc": "Crea un nuevo campo estándar para tus datos de producto", + "standardFields.addNewField": "Añadir campo nuevo", + "standardFields.editFieldDesc": "Actualiza los detalles de este campo estándar", + "standardFields.addFieldDesc": "Crea un nuevo campo estándar para tus datos de producto", "standardFields.field.name": "Nombre", - "standardFields.field.namePlaceholder": "Título del producto", + "standardFields.field.namePlaceholder": "Título del producto", "standardFields.field.nameHint": "Nombre para mostrar de este campo", "standardFields.field.key": "Clave", "standardFields.field.keyPlaceholder": "titulo_producto", - "standardFields.field.keyTitle": "Solo letras minúsculas, números y guiones bajos", - "standardFields.field.keyHint": "Identificador único (minúsculas, sin espacios)", + "standardFields.field.keyTitle": "Solo letras minúsculas, números y guiones bajos", + "standardFields.field.keyHint": "Identificador único (minúsculas, sin espacios)", "standardFields.field.type": "Tipo", "standardFields.field.typeDefaultHint": "Tipo de datos de este campo", "standardFields.field.group": "Grupo", @@ -3229,10 +3230,10 @@ export const es: MessageDict = { "standardFields.field.required": "Campo obligatorio", "standardFields.field.requiredHint": "Los campos obligatorios deben mapearse en cada feed antes de poder sincronizar productos.", "standardFields.field.unit": "Unidad", - "standardFields.field.unitPlaceholder": "kg, EUR, cm…", + "standardFields.field.unitPlaceholder": "kg, EUR, cm…", "standardFields.field.unitHint": "Unidad opcional mostrada con este campo", - "standardFields.field.description": "Descripción", - "standardFields.field.descriptionPlaceholder": "Introduce una descripción para este campo", + "standardFields.field.description": "Descripción", + "standardFields.field.descriptionPlaceholder": "Introduce una descripción para este campo", "standardFields.field.default": "Valor predeterminado", "standardFields.field.defaultPlaceholder": "Valor predeterminado (opcional)", "standardFields.field.defaultHint": "Valor predeterminado cuando no se proporciona ninguno", @@ -3240,45 +3241,45 @@ export const es: MessageDict = { "standardFields.updateField": "Actualizar campo", "standardFields.createField": "Crear campo", "standardFields.editGroup": "Editar grupo", - "standardFields.addNewGroup": "Añadir grupo nuevo", + "standardFields.addNewGroup": "Añadir grupo nuevo", "standardFields.editGroupDesc": "Actualiza los detalles de este grupo de campos", - "standardFields.addGroupDesc": "Crea un nuevo grupo para organizar tus campos estándar", + "standardFields.addGroupDesc": "Crea un nuevo grupo para organizar tus campos estándar", "standardFields.group.name": "Nombre", - "standardFields.group.namePlaceholder": "Información básica", + "standardFields.group.namePlaceholder": "Información básica", "standardFields.group.nameHint": "Nombre para mostrar de este grupo", - "standardFields.group.description": "Descripción", - "standardFields.group.descriptionPlaceholder": "Introduce una descripción para este grupo", - "standardFields.group.descriptionHint": "Descripción opcional del propósito de este grupo", - "standardFields.group.order": "Orden de visualización", - "standardFields.group.orderHint": "Los números más bajos aparecen primero", + "standardFields.group.description": "Descripción", + "standardFields.group.descriptionPlaceholder": "Introduce una descripción para este grupo", + "standardFields.group.descriptionHint": "Descripción opcional del propósito de este grupo", + "standardFields.group.order": "Orden de visualización", + "standardFields.group.orderHint": "Los números más bajos aparecen primero", "standardFields.updateGroup": "Actualizar grupo", "standardFields.createGroup": "Crear grupo", - "standardFields.deleteFieldDesc": "Esta acción no se puede deshacer. Eliminará permanentemente el campo y lo quitará de cualquier plantilla que lo use.", - "standardFields.deleteGroupDesc": "Esta acción no se puede deshacer. Eliminará permanentemente el grupo. Los campos de este grupo deberán reasignarse.", + "standardFields.deleteFieldDesc": "Esta acción no se puede deshacer. Eliminará permanentemente el campo y lo quitará de cualquier plantilla que lo use.", + "standardFields.deleteGroupDesc": "Esta acción no se puede deshacer. Eliminará permanentemente el grupo. Los campos de este grupo deberán reasignarse.", "standardFields.type.string.label": "Texto", - "standardFields.type.string.hint": "Texto libre — nombres, códigos, notas cortas", - "standardFields.type.number.label": "Número", - "standardFields.type.number.hint": "Valor numérico; añade unidad si ayuda (EUR, uds)", - "standardFields.type.boolean.label": "Sí / No", + "standardFields.type.string.hint": "Texto libre — nombres, códigos, notas cortas", + "standardFields.type.number.label": "Número", + "standardFields.type.number.hint": "Valor numérico; añade unidad si ayuda (EUR, uds)", + "standardFields.type.boolean.label": "Sí / No", "standardFields.type.boolean.hint": "Verdadero o falso", "standardFields.type.date.label": "Fecha", "standardFields.type.date.hint": "Una fecha de calendario", "standardFields.type.url.label": "URL", - "standardFields.type.url.hint": "Enlace web (página de producto, vídeo, fabricante)", + "standardFields.type.url.hint": "Enlace web (página de producto, vídeo, fabricante)", "standardFields.type.image.label": "Imagen", - "standardFields.type.image.hint": "URL de imagen o imagen de galería", - "standardFields.type.dimension.label": "Dimensión", + "standardFields.type.image.hint": "URL de imagen o imagen de galería", + "standardFields.type.dimension.label": "Dimensión", "standardFields.type.dimension.hint": "Medida de longitud (ancho, alto, fondo)", "standardFields.type.weight.label": "Peso", - "standardFields.type.weight.hint": "Masa / peso de envío", + "standardFields.type.weight.hint": "Masa / peso de envío", "standardFields.type.color.label": "Color", - "standardFields.type.color.hint": "Nombre o código de color", + "standardFields.type.color.hint": "Nombre o código de color", "standardFields.type.custom.label": "Personalizado", "standardFields.type.custom.hint": "Campo especial / de forma libre", "standardFields.fallback.gtin": "GTIN/EAN", "standardFields.fallback.title": "Nombre del producto", "standardFields.fallback.brand": "Marca", - "standardFields.fallback.description": "Descripción", + "standardFields.fallback.description": "Descripción", "standardFields.fallback.product_model": "Modelo de producto", "standardFields.fallback.price": "Precio", "standardFields.fallback.sale_price": "Precio de oferta", @@ -3286,165 +3287,165 @@ export const es: MessageDict = { "standardFields.fallback.currency": "Moneda", "standardFields.fallback.image_url": "URL de imagen", "standardFields.fallback.main_image": "Imagen principal", - "standardFields.fallback.additional_image_urls": "Imágenes adicionales", + "standardFields.fallback.additional_image_urls": "Imágenes adicionales", "standardFields.fallback.product_url": "URL del producto", "standardFields.fallback.official_link": "Enlace oficial", "standardFields.fallback.sku": "SKU", "standardFields.fallback.mpn": "MPN", - "standardFields.fallback.category": "Categoría", + "standardFields.fallback.category": "Categoría", "standardFields.fallback.availability": "Disponibilidad", "standardFields.fallback.stock": "Existencias", "standardFields.fallback.color": "Color", - "standardFields.fallback.size": "Tamaño", + "standardFields.fallback.size": "Tamaño", "standardFields.fallback.material": "Material", - "standardFields.fallback.warranty": "Garantía", + "standardFields.fallback.warranty": "Garantía", "standardFields.fallback.service": "Servicio", "standardFields.fallback.weight": "Peso", "standardFields.fallback.net_depth": "Profundidad neta", "standardFields.fallback.net_height": "Altura neta", "standardFields.fallback.net_width": "Anchura neta", "standardFields.fallback.net_mass": "Masa neta", - "standardFields.fallback.video_url": "URL de vídeo", + "standardFields.fallback.video_url": "URL de vídeo", "standardFields.fallback.eprel_id": "ID EPREL", "standardFields.fallback.specs": "Especificaciones", "standardFields.fallback.specifications": "Especificaciones (legacy)", - "standardFields.tip.gtin": "Global Trade Item Number — código de barras/EAN/UPC que identifica el producto.", - "standardFields.tip.title": "Nombre del producto orientado al cliente en catálogos y canales.", + "standardFields.tip.gtin": "Global Trade Item Number — código de barras/EAN/UPC que identifica el producto.", + "standardFields.tip.title": "Nombre del producto orientado al cliente en catálogos y canales.", "standardFields.tip.brand": "Nombre del fabricante o marca (no el minorista).", "standardFields.tip.description": "Texto largo del producto; se usa para enriquecimiento y listados en canales.", - "standardFields.tip.product_model": "Nombre/número de modelo del fabricante.", - "standardFields.tip.price": "Precio de venta habitual (numérico; la moneda se mapea aparte).", + "standardFields.tip.product_model": "Nombre/número de modelo del fabricante.", + "standardFields.tip.price": "Precio de venta habitual (numérico; la moneda se mapea aparte).", "standardFields.tip.sale_price": "Precio rebajado o promocional cuando hay oferta.", "standardFields.tip.purchase_price": "Tu coste / precio de compra (interno).", - "standardFields.tip.currency": "Código ISO de moneda para precios (p. ej. EUR, USD).", + "standardFields.tip.currency": "Código ISO de moneda para precios (p. ej. EUR, USD).", "standardFields.tip.image_url": "URL de la imagen principal del producto.", - "standardFields.tip.main_image": "URL de la imagen principal de galería (alias de image).", + "standardFields.tip.main_image": "URL de la imagen principal de galería (alias de image).", "standardFields.tip.additional_image_urls": "URLs de imagen extra (separadas por comas o nodos repetidos).", - "standardFields.tip.product_url": "URL pública de la página de producto en tu tienda o sitio.", - "standardFields.tip.official_link": "URL de la página de producto del fabricante o marca.", - "standardFields.tip.sku": "Stock Keeping Unit — tu código interno de artículo.", - "standardFields.tip.mpn": "Manufacturer Part Number — código de pieza del proveedor.", - "standardFields.tip.category": "Categoría de producto o ruta de taxonomía.", + "standardFields.tip.product_url": "URL pública de la página de producto en tu tienda o sitio.", + "standardFields.tip.official_link": "URL de la página de producto del fabricante o marca.", + "standardFields.tip.sku": "Stock Keeping Unit — tu código interno de artículo.", + "standardFields.tip.mpn": "Manufacturer Part Number — código de pieza del proveedor.", + "standardFields.tip.category": "Categoría de producto o ruta de taxonomía.", "standardFields.tip.availability": "Estado tipo en stock / agotado / preventa.", - "standardFields.tip.stock": "Cantidad numérica de inventario.", + "standardFields.tip.stock": "Cantidad numérica de inventario.", "standardFields.tip.color": "Atributo de color para variantes.", "standardFields.tip.size": "Atributo de talla para variantes.", - "standardFields.tip.material": "Material principal o composición.", - "standardFields.tip.warranty": "Plazo o texto de garantía.", + "standardFields.tip.material": "Material principal o composición.", + "standardFields.tip.warranty": "Plazo o texto de garantía.", "standardFields.tip.service": "Notas de servicio o soporte.", - "standardFields.tip.weight": "Peso de envío o neto.", - "standardFields.tip.eprel_id": "Identificador de producto de etiqueta energética UE (EPREL).", - "standardFields.tip.specs": "Especificaciones técnicas estructuradas.", + "standardFields.tip.weight": "Peso de envío o neto.", + "standardFields.tip.eprel_id": "Identificador de producto de etiqueta energética UE (EPREL).", + "standardFields.tip.specs": "Especificaciones técnicas estructuradas.", "standardFields.tip.specifications": "Campo de specs legacy; prefiere specs cuando existan ambos.", "export.dialog.title": "Exportar productos seleccionados", - "export.dialog.description": "Exportar {count} producto(s) seleccionado(s). Elija el feed de exportación que define formato y campos — como elegir qué sincronizar, pero para una descarga o un socio.", - "export.dialog.loadFailed": "No se pudieron cargar las opciones de feed de exportación. Inténtalo de nuevo.", - "export.dialog.selectPlaceholder": "Seleccione un feed de exportación…", - "export.dialog.help": "Su selección elige los productos; el feed elige el formato del canal y los campos mapeados.", - "export.dialog.emptyTitle": "Aún no hay feeds de exportación", - "export.dialog.emptyMessage": "Cree un feed de exportación para elegir formato y campos, luego vuelva a exportar esta selección.", - "export.dialog.createFeedCta": "Crear feed de exportación", - "export.dialog.confirmAria": "Confirmar exportación", + "export.dialog.description": "Exportar {count} producto(s) seleccionado(s). Elija el feed de exportación que define formato y campos — como elegir qué sincronizar, pero para una descarga o un socio.", + "export.dialog.loadFailed": "No se pudieron cargar las opciones de feed de exportación. Inténtalo de nuevo.", + "export.dialog.selectPlaceholder": "Seleccione un feed de exportación…", + "export.dialog.help": "Su selección elige los productos; el feed elige el formato del canal y los campos mapeados.", + "export.dialog.emptyTitle": "Aún no hay feeds de exportación", + "export.dialog.emptyMessage": "Cree un feed de exportación para elegir formato y campos, luego vuelva a exportar esta selección.", + "export.dialog.createFeedCta": "Crear feed de exportación", + "export.dialog.confirmAria": "Confirmar exportación", "export.dialog.export": "Exportar", - "billing.title": "Uso y facturación", - "billing.loadFailed": "No se pudo cargar la facturación", + "billing.title": "Uso y facturación", + "billing.loadFailed": "No se pudo cargar la facturación", "billing.usageLoadFailed": "No se pudo cargar el uso", - "billing.checkoutComplete": "Pago completado. Tu plan y créditos se actualizarán en breve.", - "billing.checkoutCompletePlan": "Plan actualizado. Tus créditos de {plan} están listos.", - "billing.checkoutCanceled": "El pago se canceló. No se realizaron cambios.", - "billing.portalReturned": "Has vuelto del portal de facturación. Gestiona tu plan aquí o en Planes.", + "billing.checkoutComplete": "Pago completado. Tu plan y créditos se actualizarán en breve.", + "billing.checkoutCompletePlan": "Plan actualizado. Tus créditos de {plan} están listos.", + "billing.checkoutCanceled": "El pago se canceló. No se realizaron cambios.", + "billing.portalReturned": "Has vuelto del portal de facturación. Gestiona tu plan aquí o en Planes.", "billing.comparePlans": "Comparar planes", "billing.managePayment": "Gestionar pago", - "billing.addCredits": "Añadir créditos", - "billing.addingCredits": "Añadiendo…", - "billing.addCreditsTitle": "Añadir créditos", - "billing.addCreditsDescription": "Solo administradores de plataforma. Los créditos están disponibles de inmediato para títulos, descripciones y otros pasos de pago.", - "billing.creditAmount": "Cantidad de créditos", - "billing.invalidCreditAmount": "Introduce una cantidad de créditos válida.", + "billing.addCredits": "Añadir créditos", + "billing.addingCredits": "Añadiendo…", + "billing.addCreditsTitle": "Añadir créditos", + "billing.addCreditsDescription": "Solo administradores de plataforma. Los créditos están disponibles de inmediato para títulos, descripciones y otros pasos de pago.", + "billing.creditAmount": "Cantidad de créditos", + "billing.invalidCreditAmount": "Introduce una cantidad de créditos válida.", "billing.companyNotFound": "Empresa no encontrada.", - "billing.creditsAdded": "Se han añadido {amount} créditos.", - "billing.addCreditsFailed": "No se pudieron añadir créditos. Puede requerirse acceso de administrador de plataforma.", - "billing.planApplied": "Plan aplicado. Tus créditos están listos.", - "billing.checkoutFailed": "El pago falló", - "billing.portalFailed": "No se pudo abrir el portal de facturación", + "billing.creditsAdded": "Se han añadido {amount} créditos.", + "billing.addCreditsFailed": "No se pudieron añadir créditos. Puede requerirse acceso de administrador de plataforma.", + "billing.planApplied": "Plan aplicado. Tus créditos están listos.", + "billing.checkoutFailed": "El pago falló", + "billing.portalFailed": "No se pudo abrir el portal de facturación", "billing.noPlanAssigned": "Sin plan asignado", "billing.unlimited": "Ilimitado", "billing.payAsYouGo": "Pago por uso", - "billing.noMonthlyAiCredits": "Sin créditos de IA mensuales", - "billing.header.noPlan": "Aún no hay plan asignado. Elige un plan o pide ayuda a un administrador.", - "billing.header.free": "Mapea feeds y limpia datos de producto sin créditos de IA.", + "billing.noMonthlyAiCredits": "Sin créditos de IA mensuales", + "billing.header.noPlan": "Aún no hay plan asignado. Elige un plan o pide ayuda a un administrador.", + "billing.header.free": "Mapea feeds y limpia datos de producto sin créditos de IA.", "billing.header.enterprise": "Productos y capacidad de IA ilimitados.", - "billing.header.payg": "Pago por uso — los créditos salen del monedero de la empresa.", - "billing.header.remaining": "{remaining} créditos de IA restantes en este periodo.", + "billing.header.payg": "Pago por uso — los créditos salen del monedero de la empresa.", + "billing.header.remaining": "{remaining} créditos de IA restantes en este periodo.", "billing.na": "N/D", - "billing.range.7d": "últimos 7 días", - "billing.range.30d": "últimos 30 días", - "billing.range.cycle": "ciclo de facturación actual", + "billing.range.7d": "últimos 7 días", + "billing.range.30d": "últimos 30 días", + "billing.range.cycle": "ciclo de facturación actual", "billing.range.all": "todo el tiempo", - "billing.rangeOpt.7d": "Últimos 7 días", - "billing.rangeOpt.30d": "Últimos 30 días", + "billing.rangeOpt.7d": "Últimos 7 días", + "billing.rangeOpt.30d": "Últimos 30 días", "billing.rangeOpt.cycle": "Ciclo actual", "billing.rangeOpt.all": "Todo el tiempo", - "billing.freeBannerTitle": "Estás en el plan Free", - "billing.freeBannerMessage": "Mejora para títulos y descripciones con IA, y límites de producto más altos.", - "billing.outOfCreditsTitle": "Te has quedado sin créditos de IA", - "billing.productLimitTitle": "Límite de productos alcanzado", - "billing.outOfCreditsMessage": "Los títulos y descripciones con IA están pausados hasta que añadas créditos o mejores el plan.", - "billing.productLimitMessage": "Mejora el plan para más capacidad de productos.", - "billing.lowCreditsTitle": "Créditos bajos", - "billing.lowCreditsMessage": "Solo quedan {remaining} créditos en {plan}. Mejora antes del próximo lote grande.", + "billing.freeBannerTitle": "Estás en el plan Free", + "billing.freeBannerMessage": "Mejora para títulos y descripciones con IA, y límites de producto más altos.", + "billing.outOfCreditsTitle": "Te has quedado sin créditos de IA", + "billing.productLimitTitle": "Límite de productos alcanzado", + "billing.outOfCreditsMessage": "Los títulos y descripciones con IA están pausados hasta que añadas créditos o mejores el plan.", + "billing.productLimitMessage": "Mejora el plan para más capacidad de productos.", + "billing.lowCreditsTitle": "Créditos bajos", + "billing.lowCreditsMessage": "Solo quedan {remaining} créditos en {plan}. Mejora antes del próximo lote grande.", "billing.currentPlan": "Plan actual", - "billing.periodEnds": "El periodo de facturación termina el {date}", + "billing.periodEnds": "El periodo de facturación termina el {date}", "billing.openEndedContract": "Contrato abierto", - "billing.creditWallet": "Monedero de créditos", - "billing.creditsRemaining": "Créditos restantes", + "billing.creditWallet": "Monedero de créditos", + "billing.creditsRemaining": "Créditos restantes", "billing.enterpriseCapacity": "Capacidad gestionada Enterprise", - "billing.paygUsed": "{used} usados · sin asignación mensual", - "billing.trialLeftover": "Créditos de prueba / restantes", + "billing.paygUsed": "{used} usados · sin asignación mensual", + "billing.trialLeftover": "Créditos de prueba / restantes", "billing.aiLockedFree": "IA bloqueada en Free", "billing.usedOf": "{used} usados de {total}", - "billing.noBalanceTitle": "Aún no hay saldo de créditos", - "billing.noBalanceBody": "Los créditos de tu plan aparecerán aquí cuando la facturación esté configurada.", - "billing.needCapacity": "¿Necesitas más capacidad?", + "billing.noBalanceTitle": "Aún no hay saldo de créditos", + "billing.noBalanceBody": "Los créditos de tu plan aparecerán aquí cuando la facturación esté configurada.", + "billing.needCapacity": "¿Necesitas más capacidad?", "billing.selfServeUpgrade": "Mejora autoservicio a Starter, Growth o Business", - "billing.viaStripe": "vía Stripe", + "billing.viaStripe": "vía Stripe", "billing.checkoutUnavailable": "Las compras de autoservicio no estan disponibles hasta que Stripe este configurado. Contacta con ventas para un plan.", "billing.upgradeToGrowth": "Mejorar a Growth", "billing.askAdminPlan": "Pide a un administrador de la empresa que cambie el plan.", "billing.usage": "Uso", - "billing.productsProcessed": "{count} productos procesados · {range}", - "billing.updating": "Actualizando…", - "billing.productsByDay": "Productos por día", - "billing.chartAmber": "Ámbar = tokens. Rango: {range}.", + "billing.productsProcessed": "{count} productos procesados · {range}", + "billing.updating": "Actualizando…", + "billing.productsByDay": "Productos por día", + "billing.chartAmber": "Ámbar = tokens. Rango: {range}.", "billing.chartRange": "Rango: {range}.", - "billing.nothingToChartTitle": "Nada que graficar aún", - "billing.nothingToChartBody": "Añade productos o conecta un feed — el uso aparecerá aquí.", - "billing.dailyChartsHint": "Los gráficos diarios están para los últimos 7 días, 30 días o el ciclo de facturación actual.", + "billing.nothingToChartTitle": "Nada que graficar aún", + "billing.nothingToChartBody": "Añade productos o conecta un feed — el uso aparecerá aquí.", + "billing.dailyChartsHint": "Los gráficos diarios están para los últimos 7 días, 30 días o el ciclo de facturación actual.", "billing.noNewProducts": "No hay productos nuevos en {range}", - "billing.catalogOverall": "El catálogo tiene {count} productos en total.", + "billing.catalogOverall": "El catálogo tiene {count} productos en total.", "billing.chartProducts": "Productos", "billing.chartTokens": "Fichas", "billing.chartEmpty": "No hay productos en este periodo.", - "billing.adminStats": "{tokens} tokens · {jobs} trabajos · {input} entrada / {export} feeds de exportación", - "billing.whatUsesCredits": "Qué consume créditos", - "billing.burnsCredits": "Consume créditos", - "billing.noCreditCost": "Sin coste de créditos", - "billing.publicPricing": "Precios públicos", + "billing.adminStats": "{tokens} tokens · {jobs} trabajos · {input} entrada / {export} feeds de exportación", + "billing.whatUsesCredits": "Qué consume créditos", + "billing.burnsCredits": "Consume créditos", + "billing.noCreditCost": "Sin coste de créditos", + "billing.publicPricing": "Precios públicos", "billing.managePlanOnPlans": "Gestionar plan en Planes", "billing.recovery.pastDueTitle": "Pago atrasado", - "billing.recovery.pastDueAdmin": "Falló el pago de la suscripción. Actualiza el pago en el Customer Portal — el acceso sigue abierto durante este periodo de gracia.", - "billing.recovery.pastDueMember": "La facturación necesita atención. Pide a un administrador que actualice el pago en el Customer Portal. El acceso sigue abierto durante este periodo de gracia.", + "billing.recovery.pastDueAdmin": "Falló el pago de la suscripción. Actualiza el pago en el Customer Portal — el acceso sigue abierto durante este periodo de gracia.", + "billing.recovery.pastDueMember": "La facturación necesita atención. Pide a un administrador que actualice el pago en el Customer Portal. El acceso sigue abierto durante este periodo de gracia.", "billing.recovery.openPortal": "Abrir Customer Portal", "billing.recovery.contactAdmin": "Contactar a un administrador", - "billing.recovery.goToBilling": "Ir a Facturación", + "billing.recovery.goToBilling": "Ir a Facturación", "billing.recovery.missingPlanTitle": "Sin plan asignado", - "billing.recovery.missingPlanMessage": "Esta empresa no tiene un plan activo (a menudo tras una migración omitida). Asigna un plan vía Checkout o pide soporte — no asumas capacidad Ilimitada.", + "billing.recovery.missingPlanMessage": "Esta empresa no tiene un plan activo (a menudo tras una migración omitida). Asigna un plan vía Checkout o pide soporte — no asumas capacidad Ilimitada.", "billing.recovery.choosePlan": "Elegir un plan", "billing.upgrade": "Mejorar plan", "billing.askCompanyAdmin": "Preguntar a un administrador", "billing.memberHint": "Solo los administradores de la empresa pueden cambiar planes o abrir Checkout.", - "billing.unlimitedPlanWallet": "Plan ilimitado · monedero {wallet}", - "billing.creditsSuffix": "{label} créditos", + "billing.unlimitedPlanWallet": "Plan ilimitado · monedero {wallet}", + "billing.creditsSuffix": "{label} créditos", "billing.perMonth": "{amount} / mes", "billing.zeroPerMonth": "0 / mes", "billing.upTo": "Hasta {count}", @@ -3454,71 +3455,71 @@ export const es: MessageDict = { "billing.planKind.none": "Sin plan activo", "billing.planKind.enterprise": "Enterprise / personalizado", "billing.planKind.trial": "Prueba", - "billing.planKind.standard": "Plan estándar", + "billing.planKind.standard": "Plan estándar", "billing.creditUsage.normalize.label": "Normalizar, specs y relleno", - "billing.creditUsage.normalize.detail": "La limpieza de datos y el relleno de atributos no gastan créditos de IA.", - "billing.creditUsage.ai.label": "Títulos y descripciones con IA", - "billing.creditUsage.ai.detail": "Se cobra por producto según la función de IA y cuánto texto se genera.", - "billing.creditUsage.eprel.label": "EPREL / etiquetas energéticas", - "billing.creditUsage.eprel.detail": "Datos públicos EPREL de la UE gratis en todos los planes (sin créditos).", - "billing.creditUsage.campaign.label": "IA de campañas y marca", - "billing.creditUsage.campaign.detail": "Los pasos de IA de pago que usan el modelo gestionado gastan créditos de la empresa.", - "exports.title": "Feeds de exportación", - "exports.description": "Elija qué publicar por canal — qué productos y campos — y comparta una URL de feed pública (sin inicio de sesión).", - "exports.descriptionFiltered": "Enlaces públicos de Google Shopping, Meta y personalizados. Mostrando {filtered} de {total} feeds.", - "exports.loadFailed": "No se pudieron cargar los feeds de exportación", - "exports.loadFeedFailed": "No se pudo cargar el feed de exportación", + "billing.creditUsage.normalize.detail": "La limpieza de datos y el relleno de atributos no gastan créditos de IA.", + "billing.creditUsage.ai.label": "Títulos y descripciones con IA", + "billing.creditUsage.ai.detail": "Se cobra por producto según la función de IA y cuánto texto se genera.", + "billing.creditUsage.eprel.label": "EPREL / etiquetas energéticas", + "billing.creditUsage.eprel.detail": "Datos públicos EPREL de la UE gratis en todos los planes (sin créditos).", + "billing.creditUsage.campaign.label": "IA de campañas y marca", + "billing.creditUsage.campaign.detail": "Los pasos de IA de pago que usan el modelo gestionado gastan créditos de la empresa.", + "exports.title": "Feeds de exportación", + "exports.description": "Elija qué publicar por canal — qué productos y campos — y comparta una URL de feed pública (sin inicio de sesión).", + "exports.descriptionFiltered": "Enlaces públicos de Google Shopping, Meta y personalizados. Mostrando {filtered} de {total} feeds.", + "exports.loadFailed": "No se pudieron cargar los feeds de exportación", + "exports.loadFeedFailed": "No se pudo cargar el feed de exportación", "exports.refresh": "Actualizar", - "exports.refreshing": "Actualizando…", - "exports.create": "Crear feed de exportación", - "exports.edit": "Editar feed de exportación", - "exports.editDescription": "Actualice el nombre, el estado, qué productos se incluyen y qué campos se mapean.", - "exports.howToTitle": "Cómo elegir qué exportar", - "exports.howTo.choose": "Qué entra en el feed", - "exports.howTo.chooseBody": "— configure el feed de origen y los estados de producto al crear o editar para que la URL pública solo incluya esos productos.", + "exports.refreshing": "Actualizando…", + "exports.create": "Crear feed de exportación", + "exports.edit": "Editar feed de exportación", + "exports.editDescription": "Actualice el nombre, el estado, qué productos se incluyen y qué campos se mapean.", + "exports.howToTitle": "Cómo elegir qué exportar", + "exports.howTo.choose": "Qué entra en el feed", + "exports.howTo.chooseBody": "— configure el feed de origen y los estados de producto al crear o editar para que la URL pública solo incluya esos productos.", "exports.howTo.subset": "Subconjunto puntual", - "exports.howTo.subsetBody": "— en", + "exports.howTo.subsetBody": "— en", "exports.howTo.productsLink": "Productos", "exports.howTo.subsetTail": ", seleccione filas y Exporte para descargar solo esos productos con el formato y campos del feed.", "exports.howTo.google": "Google Shopping", - "exports.howTo.googleBody": "— crea un preset CSV o XML, Genera, copia la URL pública en Merchant Center → Productos → Feeds → obtención programada.", - "exports.howTo.meta": "Catálogo Meta", - "exports.howTo.metaBody": "— preset CSV para fuentes de datos de Commerce Manager.", + "exports.howTo.googleBody": "— crea un preset CSV o XML, Genera, copia la URL pública en Merchant Center → Productos → Feeds → obtención programada.", + "exports.howTo.meta": "Catálogo Meta", + "exports.howTo.metaBody": "— preset CSV para fuentes de datos de Commerce Manager.", "exports.howTo.custom": "CSV/XML personalizado", - "exports.howTo.customBody": "— cualquier partner; la misma URL pública sirve para cron / pollers tipo webhook.", + "exports.howTo.customBody": "— cualquier partner; la misma URL pública sirve para cron / pollers tipo webhook.", "exports.howTo.rest": "REST", - "exports.howTo.restBody": "— claves API en", - "exports.howTo.settingsApiKeys": "Ajustes → Claves API", + "exports.howTo.restBody": "— claves API en", + "exports.howTo.settingsApiKeys": "Ajustes → Claves API", "exports.howTo.restTail": "(las claves antiguas no se migraron) consultan", "exports.howTo.openapi": "OpenAPI", "exports.feedStatus": "Estado del feed", - "exports.generating": "Generando exportación — puede tardar un momento en catálogos grandes.", - "exports.generationFailed": "La generación falló. Mira el error arriba y vuelve a Actualizar feed.", + "exports.generating": "Generando exportación — puede tardar un momento en catálogos grandes.", + "exports.generationFailed": "La generación falló. Mira el error arriba y vuelve a Actualizar feed.", "exports.exportedProducts": "Exportados {count} productos", - "exports.lastGenerated": "Última generación: {time}", + "exports.lastGenerated": "Última generación: {time}", "exports.neverGenerated": "Nunca generado", "exports.searchPlaceholder": "Buscar feeds...", "exports.searchAria": "Buscar feeds", - "exports.clearSearch": "Limpiar búsqueda", - "exports.loading": "Cargando feeds…", - "exports.loadErrorTitle": "No se pudieron cargar los feeds de exportación", - "exports.loadErrorBody": "Algo falló al cargar tus exportaciones. Reintenta o revisa el error de arriba.", + "exports.clearSearch": "Limpiar búsqueda", + "exports.loading": "Cargando feeds…", + "exports.loadErrorTitle": "No se pudieron cargar los feeds de exportación", + "exports.loadErrorBody": "Algo falló al cargar tus exportaciones. Reintenta o revisa el error de arriba.", "exports.tryAgain": "Reintentar", - "exports.emptyTitle": "Aún no hay feeds de exportación", - "exports.emptyBody": "Cree un feed de Google Shopping, Meta o CSV/XML personalizado para elegir qué productos y campos salen. Genere una URL pública para Merchant Center o cualquier socio — o exporte un subconjunto desde Productos.", + "exports.emptyTitle": "Aún no hay feeds de exportación", + "exports.emptyBody": "Cree un feed de Google Shopping, Meta o CSV/XML personalizado para elegir qué productos y campos salen. Genere una URL pública para Merchant Center o cualquier socio — o exporte un subconjunto desde Productos.", "exports.emptyCta": "Crear feed de Google Shopping", - "exports.noMatchTitle": "Ningún feed coincide", - "exports.noMatchBody": "Prueba otro término de búsqueda.", + "exports.noMatchTitle": "Ningún feed coincide", + "exports.noMatchBody": "Prueba otro término de búsqueda.", "exports.col.name": "Nombre", "exports.col.format": "Formato", "exports.col.feedUrl": "URL del feed", - "exports.col.lastGenerated": "Última generación", + "exports.col.lastGenerated": "Última generación", "exports.col.status": "Estado", "exports.col.actions": "Acciones", - "exports.working": "Trabajando…", - "exports.generatingShort": "Generando…", + "exports.working": "Trabajando…", + "exports.generatingShort": "Generando…", "exports.copyUrl": "Copiar URL", - "exports.openMenu": "Abrir menú", + "exports.openMenu": "Abrir menú", "exports.preview": "Vista previa", "exports.download": "Descargar", "exports.refreshFeed": "Actualizar feed", @@ -3526,95 +3527,95 @@ export const es: MessageDict = { "exports.delete": "Eliminar", "exports.rotateToken": "Rotar token de URL", "exports.rotateFailed": "No se pudo rotar el token de URL del feed", - "exports.deleting": "Eliminando…", + "exports.deleting": "Eliminando…", "exports.channelPreset": "Preset de canal", "exports.name": "Nombre", "exports.format": "Formato", "exports.sourceFeed": "Feed de origen (opcional)", - "exports.sourceFeedHelp": "Limite este feed a productos de un feed de entrada, o deje Todos los productos — así elige qué incluye la URL pública.", + "exports.sourceFeedHelp": "Limite este feed a productos de un feed de entrada, o deje Todos los productos — así elige qué incluye la URL pública.", "exports.allProducts": "Todos los productos", - "exports.rootElement": "Elemento raíz", - "exports.itemElement": "Elemento de ítem", + "exports.rootElement": "Elemento raíz", + "exports.itemElement": "Elemento de ítem", "exports.productStatuses": "Estados de producto (separados por comas)", - "exports.productStatusesHelp": "Incluya solo productos con estos estados (p. ej. active). Déjelo vacío para todos los estados.", + "exports.productStatusesHelp": "Incluya solo productos con estos estados (p. ej. active). Déjelo vacío para todos los estados.", "exports.status": "Estado", "exports.active": "Activo", "exports.inactive": "Inactivo", "exports.fieldMappings": "Mapeo de campos", - "exports.addField": "Añadir campo", + "exports.addField": "Añadir campo", "exports.outputKey": "Clave de salida", "exports.source": "Origen", "exports.customSource": "Personalizado (attr.* / spec.*)", "exports.removeField": "Quitar campo", - "exports.fieldHelp": "Las exportaciones leen productos procesados (con mapped_data en bruto como respaldo). Usa eprel_* / energy_* para EPREL, spec.* para una especificación, o specifications.* para expandir todas las specs como nodos XML.", - "exports.saving": "Guardando…", + "exports.fieldHelp": "Las exportaciones leen productos procesados (con mapped_data en bruto como respaldo). Usa eprel_* / energy_* para EPREL, spec.* para una especificación, o specifications.* para expandir todas las specs como nodos XML.", + "exports.saving": "Guardando…", "exports.saveChanges": "Guardar cambios", "exports.createFeed": "Crear feed", - "exports.updated": "Feed de exportación actualizado.", - "exports.created": "Feed de exportación creado.", + "exports.updated": "Feed de exportación actualizado.", + "exports.created": "Feed de exportación creado.", "exports.saveFailed": "Error al guardar", - "exports.urlCopied": "URL pública del feed {format} copiada. Pégala en cualquier sistema que obtenga feeds de productos.", + "exports.urlCopied": "URL pública del feed {format} copiada. Pégala en cualquier sistema que obtenga feeds de productos.", "exports.copyFailed": "No se pudo copiar la URL al portapapeles", "exports.refreshed": "Feed actualizado", "exports.refreshedWithCount": "Feed actualizado ({count} productos).", "exports.refreshFailed": "No se pudo actualizar el feed", - "exports.deleteConfirm": "¿Seguro que quieres eliminar este feed de exportación?", - "exports.deleted": "Feed de exportación eliminado correctamente.", - "exports.deleteFailed": "No se pudo eliminar el feed de exportación", - "exports.defaultName": "Nuevo feed de exportación", - "exports.fallbackName": "Feed de exportación", + "exports.deleteConfirm": "¿Seguro que quieres eliminar este feed de exportación?", + "exports.deleted": "Feed de exportación eliminado correctamente.", + "exports.deleteFailed": "No se pudo eliminar el feed de exportación", + "exports.defaultName": "Nuevo feed de exportación", + "exports.fallbackName": "Feed de exportación", "exports.dialog.selectTitle": "Exportar productos seleccionados", - "exports.dialog.selectDescription": "Elige una configuración de feed de exportación para los {count} productos seleccionados.", - "exports.dialog.noneFound": "No hay configuraciones de feed de exportación. Crea una en la sección Feeds de exportación.", - "exports.dialog.loadFailed": "No se pudieron cargar las opciones de export. Inténtalo de nuevo.", - "exports.dialog.selectRequired": "Selecciona un formato de feed de exportación.", - "exports.dialog.selectPlaceholder": "Selecciona un formato de feed…", - "exports.dialog.confirmAria": "Confirmar exportación", + "exports.dialog.selectDescription": "Elige una configuración de feed de exportación para los {count} productos seleccionados.", + "exports.dialog.noneFound": "No hay configuraciones de feed de exportación. Crea una en la sección Feeds de exportación.", + "exports.dialog.loadFailed": "No se pudieron cargar las opciones de export. Inténtalo de nuevo.", + "exports.dialog.selectRequired": "Selecciona un formato de feed de exportación.", + "exports.dialog.selectPlaceholder": "Selecciona un formato de feed…", + "exports.dialog.confirmAria": "Confirmar exportación", "exports.dialog.export": "Exportar", "exports.preset.google_shopping_csv.label": "Google Shopping (CSV)", "exports.preset.google_shopping_csv.shortLabel": "Google Shopping CSV", - "exports.preset.google_shopping_csv.description": "Feed de productos de Merchant Center con las columnas estándar de Google (id, title, price, gtin, …).", - "exports.preset.google_shopping_csv.hint": "Tras actualizar el feed, copia la URL CSV pública en Google Merchant Center → Productos → Feeds → Añadir feed → Obtención programada.", + "exports.preset.google_shopping_csv.description": "Feed de productos de Merchant Center con las columnas estándar de Google (id, title, price, gtin, …).", + "exports.preset.google_shopping_csv.hint": "Tras actualizar el feed, copia la URL CSV pública en Google Merchant Center → Productos → Feeds → Añadir feed → Obtención programada.", "exports.preset.google_shopping_csv.defaultName": "Google Shopping CSV", "exports.preset.google_shopping_xml.label": "Google Shopping (XML)", "exports.preset.google_shopping_xml.shortLabel": "Google Shopping XML", - "exports.preset.google_shopping_xml.description": "Las mismas columnas de Google como elementos XML (g:id, g:title, …) para feeds XML de Merchant Center.", - "exports.preset.google_shopping_xml.hint": "Pega la URL XML pública en Merchant Center como obtención programada. Mapea campos de tienda faltantes (link, price) en Mapeo de campos si hace falta.", + "exports.preset.google_shopping_xml.description": "Las mismas columnas de Google como elementos XML (g:id, g:title, …) para feeds XML de Merchant Center.", + "exports.preset.google_shopping_xml.hint": "Pega la URL XML pública en Merchant Center como obtención programada. Mapea campos de tienda faltantes (link, price) en Mapeo de campos si hace falta.", "exports.preset.google_shopping_xml.defaultName": "Google Shopping XML", - "exports.preset.meta_csv.label": "Catálogo Meta (CSV)", + "exports.preset.meta_csv.label": "Catálogo Meta (CSV)", "exports.preset.meta_csv.shortLabel": "Meta CSV", - "exports.preset.meta_csv.description": "Columnas de catálogo de Facebook / Instagram Commerce (id, title, availability, price, image_link, …).", - "exports.preset.meta_csv.hint": "En Meta Commerce Manager → Catálogo → Fuentes de datos → Añadir artículos → Usar feed de datos, pega la URL CSV pública.", - "exports.preset.meta_csv.defaultName": "Catálogo Meta CSV", + "exports.preset.meta_csv.description": "Columnas de catálogo de Facebook / Instagram Commerce (id, title, availability, price, image_link, …).", + "exports.preset.meta_csv.hint": "En Meta Commerce Manager → Catálogo → Fuentes de datos → Añadir artículos → Usar feed de datos, pega la URL CSV pública.", + "exports.preset.meta_csv.defaultName": "Catálogo Meta CSV", "exports.preset.custom_csv.label": "CSV personalizado", "exports.preset.custom_csv.shortLabel": "CSV personalizado", - "exports.preset.custom_csv.description": "Elige tus propias columnas y orígenes de producto para cualquier partner o webhook.", - "exports.preset.custom_csv.hint": "Añade o renombra claves de salida libremente. La URL pública no requiere inicio de sesión.", - "exports.preset.custom_csv.defaultName": "Exportación CSV personalizada", + "exports.preset.custom_csv.description": "Elige tus propias columnas y orígenes de producto para cualquier partner o webhook.", + "exports.preset.custom_csv.hint": "Añade o renombra claves de salida libremente. La URL pública no requiere inicio de sesión.", + "exports.preset.custom_csv.defaultName": "Exportación CSV personalizada", "exports.preset.custom_xml.label": "XML personalizado", "exports.preset.custom_xml.shortLabel": "XML personalizado", "exports.preset.custom_xml.description": "Construye una forma XML personalizada con tus nombres root/item y mapeos.", "exports.preset.custom_xml.hint": "Define los elementos root e item, luego mapea cada clave de salida a un origen de producto.", - "exports.preset.custom_xml.defaultName": "Exportación XML personalizada", + "exports.preset.custom_xml.defaultName": "Exportación XML personalizada", "processing.title": "Procesamiento", - "processing.description": "Progreso en vivo de los trabajos de procesamiento de productos. Se actualiza solo mientras esta pestaña es visible. Los trabajos completados enlazan a Necesita revisión para aceptar / editar / rechazar.", + "processing.description": "Progreso en vivo de los trabajos de procesamiento de productos. Se actualiza solo mientras esta pestaña es visible. Los trabajos completados enlazan a Necesita revisión para aceptar / editar / rechazar.", "processing.refresh": "Actualizar", "processing.loadFailed": "No se pudieron cargar los trabajos de procesamiento", - "processing.tooManyRequests": "Demasiadas solicitudes — espera un momento e inténtalo de nuevo.", - "processing.serverError": "{fallback} (error del servidor {status}). Inténtalo en breve.", + "processing.tooManyRequests": "Demasiadas solicitudes — espera un momento e inténtalo de nuevo.", + "processing.serverError": "{fallback} (error del servidor {status}). Inténtalo en breve.", "processing.httpError": "{fallback} (HTTP {status})", "processing.cancelFailed": "No se pudo cancelar esta tarea", "processing.retryFailed": "No se pudo reintentar esta tarea", - "processing.cancelledMsg": "\"{name}\" se canceló.", + "processing.cancelledMsg": "\"{name}\" se canceló.", "processing.queuedRetry": "\"{name}\" en cola para reintentar.", "processing.jobFallback": "Trabajo {id}", "processing.tasks": "Tareas", - "processing.pipelineHint": "Pipeline: normalizar → specs → relleno → EPREL → IA. Los inicios grandes pueden dividirse en trabajos hermanos.", - "processing.emptyTitle": "Aún no hay tareas en segundo plano", - "processing.emptyBody": "Aún no hay trabajos en segundo plano. Inicia un trabajo nuevo desde Productos cuando quieras.", + "processing.pipelineHint": "Pipeline: normalizar → specs → relleno → EPREL → IA. Los inicios grandes pueden dividirse en trabajos hermanos.", + "processing.emptyTitle": "Aún no hay tareas en segundo plano", + "processing.emptyBody": "Aún no hay trabajos en segundo plano. Inicia un trabajo nuevo desde Productos cuando quieras.", "processing.startJob": "Iniciar un trabajo", "processing.connectFeed": "Conectar feed", - "processing.splitBatch": "Lote dividido · {jobs} trabajos · {products} productos", + "processing.splitBatch": "Lote dividido · {jobs} trabajos · {products} productos", "processing.col.task": "Tarea", "processing.col.status": "Estado", "processing.col.steps": "Pasos", @@ -3622,214 +3623,214 @@ export const es: MessageDict = { "processing.col.started": "Iniciado", "processing.col.completed": "Completado", "processing.col.actions": "Acciones", - "processing.partOfBatch": "· parte del lote", + "processing.partOfBatch": "· parte del lote", "processing.nowStep": "Ahora: {step}", "processing.skip": "(omitir)", "processing.reviewResults": "Revisar resultados", - "processing.reviewTitle": "Abrir Necesita revisión para aceptar, editar o rechazar el enriquecimiento", + "processing.reviewTitle": "Abrir Necesita revisión para aceptar, editar o rechazar el enriquecimiento", "processing.cancel": "Cancelar", - "processing.cancelling": "Cancelando…", - "processing.cancelTitle": "Cancelar este trabajo pendiente o en ejecución", + "processing.cancelling": "Cancelando…", + "processing.cancelTitle": "Cancelar este trabajo pendiente o en ejecución", "processing.retry": "Reintentar", - "processing.retrying": "Reintentando…", - "processing.actions.onPage": "{count} en esta página", - "processing.actions.clearSelection": "Limpiar selección", - "processing.actions.processSelected": "Procesar selección", + "processing.retrying": "Reintentando…", + "processing.actions.onPage": "{count} en esta página", + "processing.actions.clearSelection": "Limpiar selección", + "processing.actions.processSelected": "Procesar selección", "processing.actions.processAria": "Procesar productos seleccionados", - "processing.actions.processAriaCount": "Procesar {count} producto{plural} seleccionado{plural} en esta página", - "processing.actions.whatToProcess": "Qué procesar", - "processing.actions.freeNoAiTitle": "Plan Free — sin créditos de IA", - "processing.actions.freeNoAiBody": "Normalizar, specs, relleno y EPREL siguen funcionando. Los títulos/descripciones con IA requieren un plan de pago o créditos.", + "processing.actions.processAriaCount": "Procesar {count} producto{plural} seleccionado{plural} en esta página", + "processing.actions.whatToProcess": "Qué procesar", + "processing.actions.freeNoAiTitle": "Plan Free — sin créditos de IA", + "processing.actions.freeNoAiBody": "Normalizar, specs, relleno y EPREL siguen funcionando. Los títulos/descripciones con IA requieren un plan de pago o créditos.", "processing.actions.comparePlans": "Comparar planes", "processing.actions.selectAll": "Seleccionar todo", "processing.actions.selectAllAria": "Seleccionar todos los modos de proceso", "processing.actions.upgradeRequired": "{label} (requiere mejora)", - "processing.actions.upgradeSuffix": " · mejorar", - "processing.actions.credits": "{credits} créditos", + "processing.actions.upgradeSuffix": " · mejorar", + "processing.actions.credits": "{credits} créditos", "processing.actions.free": "gratis", - "processing.actions.autoCategorizeTitle": "Añadiendo categorización automáticamente", - "processing.actions.autoCategorizeBody": "{count} producto(s) necesitan categorización para el procesamiento de {types}", - "processing.actions.aiLocked": "Las opciones de IA están bloqueadas en Free. Mejora el plan para procesar títulos/descripciones.", - "processing.actions.totalCredits": "Créditos totales ({count} en esta página):", - "processing.actions.starting": "Iniciando…", - "processing.actions.processCount": "Procesar {count} en esta página", + "processing.actions.autoCategorizeTitle": "Añadiendo categorización automáticamente", + "processing.actions.autoCategorizeBody": "{count} producto(s) necesitan categorización para el procesamiento de {types}", + "processing.actions.aiLocked": "Las opciones de IA están bloqueadas en Free. Mejora el plan para procesar títulos/descripciones.", + "processing.actions.totalCredits": "Créditos totales ({count} en esta página):", + "processing.actions.starting": "Iniciando…", + "processing.actions.processCount": "Procesar {count} en esta página", "processing.actions.close": "Cerrar", "processing.actions.accept": "Aceptar", "processing.actions.acceptEnrichment": "Aceptar enriquecimiento", "processing.actions.export": "Exportar", - "processing.actions.exportSelected": "Exportar selección", + "processing.actions.exportSelected": "Exportar selección", "processing.actions.reject": "Rechazar", "processing.actions.rejectReset": "Rechazar (restablecer)", "processing.actions.resetUnprocessed": "Restablecer a sin procesar", "processing.actions.confirmTitle": "Confirmar procesamiento", - "processing.actions.confirmBody": "Procesar {count} producto(s) en esta página por {credits} créditos. Los créditos se consumen al iniciar el trabajo y no se pueden deshacer desde esta acción.", + "processing.actions.confirmBody": "Procesar {count} producto(s) en esta página por {credits} créditos. Los créditos se consumen al iniciar el trabajo y no se pueden deshacer desde esta acción.", "processing.actions.confirmStart": "Iniciar procesamiento", - "processing.option.category": "Categorías", + "processing.option.category": "Categorías", "processing.option.attributes": "Atributos / specs", - "processing.option.title": "Títulos (IA)", + "processing.option.title": "Títulos (IA)", "processing.option.description": "Descripciones (IA)", "processing.receipt.view": "Ver en Procesamiento", "processing.receipt.undo": "Deshacer", - "processing.receipt.format": "{succeeded} correctos · {skipped} omitidos · {failed} fallidos", + "processing.receipt.format": "{succeeded} correctos · {skipped} omitidos · {failed} fallidos", "processing.receipt.cancelledOne": "Procesamiento cancelado", "processing.receipt.cancelledMany": "Trabajos de procesamiento cancelados", - "processing.receipt.cancelledDesc": "El trabajo recién iniciado se canceló.", + "processing.receipt.cancelledDesc": "El trabajo recién iniciado se canceló.", "processing.receipt.cancelFailed": "No se pudo cancelar el trabajo de procesamiento", - "unsubscribe.title": "Cancelar suscripción", - "unsubscribe.me": "Cancelar mi suscripción", - "unsubscribe.invalidLink": "Enlace no válido", - "unsubscribe.failedShort": "Error al cancelar la suscripción", - "unsubscribe.already": "Ya estás dado de baja.", + "unsubscribe.title": "Cancelar suscripción", + "unsubscribe.me": "Cancelar mi suscripción", + "unsubscribe.invalidLink": "Enlace no válido", + "unsubscribe.failedShort": "Error al cancelar la suscripción", + "unsubscribe.already": "Ya estás dado de baja.", "unsubscribe.confirmPrompt": "Confirma abajo para darte de baja de los emails de marketing.", "unsubscribe.done": "Te has dado de baja.", "stores.title": "Tiendas y fuentes", - "stores.description": "Conecta cualquier tienda o proveedor en un solo lugar — Woo, Shopify, URL de feed o CSV. Tiendas en vivo: productos Descrybe → tienda; pedidos/reseñas tienda → Descrybe. Exporta cuando el catálogo esté listo.", + "stores.description": "Conecta cualquier tienda o proveedor en un solo lugar — Woo, Shopify, URL de feed o CSV. Tiendas en vivo: productos Descrybe → tienda; pedidos/reseñas tienda → Descrybe. Exporta cuando el catálogo esté listo.", "stores.allInputFeeds": "Todos los feeds de entrada", - "stores.exportFeeds": "Feeds de exportación", - "stores.migrationNote": "Tras una migración de plataforma Descrybe, puede que haya que volver a introducir las credenciales de WooCommerce y Shopify: es un paso de reconexión, no una sincronización rota.", + "stores.exportFeeds": "Feeds de exportación", + "stores.migrationNote": "Tras una migración de plataforma Descrybe, puede que haya que volver a introducir las credenciales de WooCommerce y Shopify: es un paso de reconexión, no una sincronización rota.", "stores.docsPrefix": "Docs:", "stores.docsApiOverview": "Resumen de API", - "stores.docsSuffix": "para acceso público a productos; use WooCommerce o Shopify abajo para la sincronización en vivo de la tienda.", - "stores.connectorsHeading": "Conectores de tienda y catálogo", + "stores.docsSuffix": "para acceso público a productos; use WooCommerce o Shopify abajo para la sincronización en vivo de la tienda.", + "stores.connectorsHeading": "Conectores de tienda y catálogo", "stores.statusAria": "Estado: {label}", "stores.ctaAria": "{cta}: {title}", - "stores.startTitle": "¿Por dónde empiezo?", - "stores.startBody": "Tienda Woo → WooCommerce. Shopify u otra plataforma → URL de feed o carga CSV. Listo para Merchant Center o partners → Feeds de exportación (preset Google Shopping o campos personalizados). Tras una migración, vuelva a conectar Woo/Shopify antes de esperar que la sync funcione.", - "stores.startBodyMember": "Pide a un admin de la empresa que conecte WooCommerce o Shopify. Aún puedes abrir tiendas conectadas para sincronizar y explorar, y usar Feed URL, CSV o feeds de exportación según el plan.", - "stores.wizard.title": "Configuración guiada de tienda", - "stores.wizard.description": "Conecta una tienda, prueba la conexión, encola la primera sincronización de productos y listo.", - "stores.wizard.guidedSetup": "Configuración guiada", - "stores.wizard.guidedSetupAria": "Iniciar configuración guiada de tienda", - "stores.wizard.adminOnly": "Solo los admins de la empresa pueden ejecutar la configuración guiada (guardar credenciales y primer sync). Aún puedes abrir tiendas conectadas.", + "stores.startTitle": "¿Por dónde empiezo?", + "stores.startBody": "Tienda Woo → WooCommerce. Shopify u otra plataforma → URL de feed o carga CSV. Listo para Merchant Center o partners → Feeds de exportación (preset Google Shopping o campos personalizados). Tras una migración, vuelva a conectar Woo/Shopify antes de esperar que la sync funcione.", + "stores.startBodyMember": "Pide a un admin de la empresa que conecte WooCommerce o Shopify. Aún puedes abrir tiendas conectadas para sincronizar y explorar, y usar Feed URL, CSV o feeds de exportación según el plan.", + "stores.wizard.title": "Configuración guiada de tienda", + "stores.wizard.description": "Conecta una tienda, prueba la conexión, encola la primera sincronización de productos y listo.", + "stores.wizard.guidedSetup": "Configuración guiada", + "stores.wizard.guidedSetupAria": "Iniciar configuración guiada de tienda", + "stores.wizard.adminOnly": "Solo los admins de la empresa pueden ejecutar la configuración guiada (guardar credenciales y primer sync). Aún puedes abrir tiendas conectadas.", "stores.wizard.pickChannel": "Elige un conector de tienda", - "stores.wizard.pickChannelBody": "Elige WooCommerce o Shopify. Completa conectar → probar → primera sync en la página del conector y vuelve aquí.", + "stores.wizard.pickChannelBody": "Elige WooCommerce o Shopify. Completa conectar → probar → primera sync en la página del conector y vuelve aquí.", "stores.wizard.channel.shopify": "Shopify", "stores.wizard.channel.woocommerce": "WooCommerce", "stores.wizard.channelLabel": "Configurando: {channel}", "stores.wizard.changeChannel": "Cambiar conector", "stores.wizard.noChannels": "No hay conectores de tienda en tu plan. Actualiza o pregunta a un admin.", "stores.wizard.progress": "{done} de {total} completado", - "stores.wizard.stepsLabel": "Pasos de configuración de tienda", + "stores.wizard.stepsLabel": "Pasos de configuración de tienda", "stores.wizard.step.connect.title": "Conectar", - "stores.wizard.step.connect.body": "Guarda las credenciales en la página del conector.", - "stores.wizard.step.test.title": "Probar conexión", - "stores.wizard.step.test.body": "Ejecuta Probar conexión hasta que tenga éxito.", - "stores.wizard.step.sync.title": "Primera sincronización", - "stores.wizard.step.sync.body": "Encola la primera sincronización de productos (activa sync si hace falta).", + "stores.wizard.step.connect.body": "Guarda las credenciales en la página del conector.", + "stores.wizard.step.test.title": "Probar conexión", + "stores.wizard.step.test.body": "Ejecuta Probar conexión hasta que tenga éxito.", + "stores.wizard.step.sync.title": "Primera sincronización", + "stores.wizard.step.sync.body": "Encola la primera sincronización de productos (activa sync si hace falta).", "stores.wizard.step.done.title": "Listo", - "stores.wizard.step.done.body": "Tu tienda está conectada y se ha iniciado o completado una sync.", + "stores.wizard.step.done.body": "Tu tienda está conectada y se ha iniciado o completado una sync.", "stores.wizard.openConnector": "Abrir conector", "stores.wizard.viewProducts": "Ver productos", "stores.wizard.backToHub": "Volver a tiendas", - "stores.wizard.banner.generic": "Configuración guiada: termina este paso y vuelve al asistente.", - "stores.wizard.banner.test": "Configuración guiada — prueba la conexión y vuelve al asistente.", - "stores.wizard.banner.sync": "Configuración guiada — encola la primera sync de productos y vuelve al asistente.", + "stores.wizard.banner.generic": "Configuración guiada: termina este paso y vuelve al asistente.", + "stores.wizard.banner.test": "Configuración guiada — prueba la conexión y vuelve al asistente.", + "stores.wizard.banner.sync": "Configuración guiada — encola la primera sync de productos y vuelve al asistente.", "stores.wizard.banner.return": "Volver al asistente", "stores.wizard.banner.dismiss": "Descartar", "stores.woo.title": "WooCommerce", - "stores.woo.description": "Envía productos Descrybe → WooCommerce. Importa pedidos y reseñas WooCommerce → Descrybe.", + "stores.woo.description": "Envía productos Descrybe → WooCommerce. Importa pedidos y reseñas WooCommerce → Descrybe.", "stores.woo.ctaReconnect": "Reconectar Woo", "stores.woo.ctaOpen": "Abrir Woo", "stores.woo.ctaConnect": "Conectar Woo", "stores.woo.ctaView": "Ver Woo", "stores.shopify.title": "Shopify", - "stores.shopify.description": "Envía productos Descrybe → Shopify. Importa pedidos Shopify → Descrybe. Las reseñas no están disponibles en la Admin API de Shopify.", + "stores.shopify.description": "Envía productos Descrybe → Shopify. Importa pedidos Shopify → Descrybe. Las reseñas no están disponibles en la Admin API de Shopify.", "stores.shopify.ctaReconnect": "Reconectar Shopify", "stores.shopify.ctaOpen": "Abrir Shopify", "stores.shopify.ctaConnect": "Conectar Shopify", "stores.shopify.ctaView": "Ver Shopify", "stores.feedUrl.title": "URL del feed", "stores.feedUrl.description": "Pull any supplier or tienda catalog from a public CSV or XML URL on a schedule. Map fields, then sync.", - "stores.feedUrl.cta": "Añadir URL del feed", + "stores.feedUrl.cta": "Añadir URL del feed", "stores.csv.title": "Subida CSV", "stores.csv.description": "Sube un CSV de productos como feed de entrada. Ideal para archivos de proveedor puntuales o exportaciones del admin de Shopify.", "stores.csv.cta": "Subir CSV", "stores.export.title": "Exportar / REST", - "stores.export.description": "Publica Google Shopping o CSV/XML personalizado con una URL pública. O obtén productos con una clave API (/api/v1).", + "stores.export.description": "Publica Google Shopping o CSV/XML personalizado con una URL pública. O obtén productos con una clave API (/api/v1).", "stores.export.cta": "Abrir exportaciones", "stores.apiKeys.title": "Claves API", - "stores.apiKeys.description": "Las claves API antiguas no se migraron. Crea una nueva clave en Ajustes para restaurar el acceso a /api/v1 — el secreto solo se muestra una vez.", - "stores.apiKeys.descriptionMember": "Claves API de la empresa para /api/v1. Las antiguas no se migraron — solo los admins pueden crear o revocar; puedes ver prefijos en Ajustes.", + "stores.apiKeys.description": "Las claves API antiguas no se migraron. Crea una nueva clave en Ajustes para restaurar el acceso a /api/v1 — el secreto solo se muestra una vez.", + "stores.apiKeys.descriptionMember": "Claves API de la empresa para /api/v1. Las antiguas no se migraron — solo los admins pueden crear o revocar; puedes ver prefijos en Ajustes.", "stores.apiKeys.cta": "Gestionar claves API", "stores.apiKeys.ctaView": "Ver claves API", - "stores.status.needsReconnect": "Necesita reconexión", + "stores.status.needsReconnect": "Necesita reconexión", "stores.status.connected": "Conectado", "stores.status.notConnected": "No conectado", "stores.status.ready": "Listo", "stores.status.outbound": "Saliente", "stores.status.reissue": "Reemitir", - "store.tab.connection": "Conexión", + "store.tab.connection": "Conexión", "store.tab.orders": "Pedidos", - "store.tab.settings": "Configuración", - "store.tab.categories": "Categorías", + "store.tab.settings": "Configuración", + "store.tab.categories": "Categorías", "store.tab.attributes": "Atributos", - "store.tab.reviews": "Reseñas", + "store.tab.reviews": "Reseñas", "store.badge.credentialsOnFile": "Credenciales guardadas", - "store.badge.syncEnabled": "Envío de productos activado", - "store.badge.syncDisabled": "Envío de productos desactivado", - "store.badge.syncQueued": "Envío de productos en cola", - "store.badge.dryRun": "Simulación", + "store.badge.syncEnabled": "Envío de productos activado", + "store.badge.syncDisabled": "Envío de productos desactivado", + "store.badge.syncQueued": "Envío de productos en cola", + "store.badge.dryRun": "Simulación", "store.badge.testStatus": "Prueba: {status}", - "store.badge.syncStatus": "Envío de productos: {status}", + "store.badge.syncStatus": "Envío de productos: {status}", "store.badge.ordersQueued": "Sync de pedidos en cola", "store.badge.ordersStatus": "Pedidos: {status}", "store.badge.syncedCount": "{count} sincronizados", "store.badge.mappedCount": "{count} mapeados", "store.badge.productsCount": "{count} productos", "store.badge.optionsCount": "{count} opciones", - "store.lastSync": "Última sync: {date}", - "store.noOrdersSyncYet": "Aún no se ha completado ninguna sync de pedidos.", + "store.lastSync": "Última sync: {date}", + "store.noOrdersSyncYet": "Aún no se ha completado ninguna sync de pedidos.", "store.save": "Guardar", "store.saving": "Guardando...", "store.testing": "Probando...", - "store.testConnection": "Probar conexión", + "store.testConnection": "Probar conexión", "store.queueing": "Encolando...", - "store.queueProductPush": "Encolar envío de productos (Descrybe → tienda)", - "store.queueFirstProductSync": "Encolar primer envío de productos (Descrybe → tienda)", - "store.queueOrdersImport": "Encolar importación de pedidos (tienda → Descrybe)", + "store.queueProductPush": "Encolar envío de productos (Descrybe → tienda)", + "store.queueFirstProductSync": "Encolar primer envío de productos (Descrybe → tienda)", + "store.queueOrdersImport": "Encolar importación de pedidos (tienda → Descrybe)", "store.refreshList": "Actualizar lista", "store.saveBeforeTest": "Guarda las credenciales antes de probar", - "store.saveTestBeforeQueue": "Guarda las credenciales y prueba la conexión antes de sincronizar", - "store.connectionOk": "Conexión OK", - "store.connectionSuccessful": "Conexión correcta", - "store.connectionSuccessfulDot": "Conexión correcta.", - "store.connectionFailed": "Conexión fallida", - "store.connectionFailedDot": "Conexión fallida.", - "store.connectionTestFailed": "Prueba de conexión fallida", + "store.saveTestBeforeQueue": "Guarda las credenciales y prueba la conexión antes de sincronizar", + "store.connectionOk": "Conexión OK", + "store.connectionSuccessful": "Conexión correcta", + "store.connectionSuccessfulDot": "Conexión correcta.", + "store.connectionFailed": "Conexión fallida", + "store.connectionFailedDot": "Conexión fallida.", + "store.connectionTestFailed": "Prueba de conexión fallida", "store.testFailed": "Prueba fallida", - "store.setupSteps": "Pasos de configuración", + "store.setupSteps": "Pasos de configuración", "store.col.order": "Pedido", "store.col.customer": "Cliente", "store.col.status": "Estado", "store.col.total": "Total", "store.col.date": "Fecha", - "store.loadingOrders": "Cargando pedidos…", + "store.loadingOrders": "Cargando pedidos…", "store.loadingOrdersDot": "Cargando pedidos.", - "flash.store.saveFailed": "No se pudo guardar la configuración", - "flash.store.queueSyncFailed": "No se pudo encolar la sincronización", - "flash.store.queueOrdersFailed": "No se pudo encolar la sincronización de pedidos", + "flash.store.saveFailed": "No se pudo guardar la configuración", + "flash.store.queueSyncFailed": "No se pudo encolar la sincronización", + "flash.store.queueOrdersFailed": "No se pudo encolar la sincronización de pedidos", "flash.store.connectedTo": "Conectado a {name}.", - "flash.shopify.loadFailed": "Error al cargar la configuración de Shopify", - "flash.shopify.productSyncQueued": "Sincronización de productos en cola. El worker la ejecutará en breve.", - "flash.shopify.ordersSyncQueued": "Sincronización de pedidos en cola. El worker la ejecutará en breve.", - "flash.woo.loadFailed": "Error al cargar la configuración de WooCommerce", - "flash.woo.productSyncQueued": "Sincronización de productos en cola. Se ejecutará en breve.", - "flash.woo.ordersSyncQueued": "Sincronización de pedidos en cola. Se ejecutará en breve.", - "flash.woo.reviewsSyncQueued": "Sincronización de reseñas en cola. Se ejecutará en breve.", - "flash.woo.queueReviewsFailed": "No se pudo encolar la sincronización de reseñas", + "flash.shopify.loadFailed": "Error al cargar la configuración de Shopify", + "flash.shopify.productSyncQueued": "Sincronización de productos en cola. El worker la ejecutará en breve.", + "flash.shopify.ordersSyncQueued": "Sincronización de pedidos en cola. El worker la ejecutará en breve.", + "flash.woo.loadFailed": "Error al cargar la configuración de WooCommerce", + "flash.woo.productSyncQueued": "Sincronización de productos en cola. Se ejecutará en breve.", + "flash.woo.ordersSyncQueued": "Sincronización de pedidos en cola. Se ejecutará en breve.", + "flash.woo.reviewsSyncQueued": "Sincronización de reseñas en cola. Se ejecutará en breve.", + "flash.woo.queueReviewsFailed": "No se pudo encolar la sincronización de reseñas", "flash.woo.remoteMapsFailed": "Error al cargar los mapas remotos", - "flash.woo.syncSettingsFailed": "No se pudo guardar la configuración de sincronización", - "flash.woo.categoryAutoMapFailed": "Falló el auto-mapeo de categorías", - "flash.woo.attributeAutoMapFailed": "Falló el auto-mapeo de atributos", - "shopify.title": "Integración Shopify", - "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", - "shopify.adminOnly": "Only empresa admins can change Shopify connection configuración. Sincronizar and browse stay disponible.", - "shopify.lockedTitle": "Conexión de Shopify bloqueada", - "shopify.noCredentialsMember": "Aún no hay credenciales de Shopify. Pide a un administrador de la empresa que conecte la tienda. La sincronización y los pedidos estarán disponibles cuando guarde y pruebe la conexión.", + "flash.woo.syncSettingsFailed": "No se pudo guardar la configuración de sincronización", + "flash.woo.categoryAutoMapFailed": "Falló el auto-mapeo de categorías", + "flash.woo.attributeAutoMapFailed": "Falló el auto-mapeo de atributos", + "shopify.title": "Integración Shopify", + "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", + "shopify.adminOnly": "Only empresa admins can change Shopify connection configuración. Sincronizar and browse stay disponible.", + "shopify.lockedTitle": "Conexión de Shopify bloqueada", + "shopify.noCredentialsMember": "Aún no hay credenciales de Shopify. Pide a un administrador de la empresa que conecte la tienda. La sincronización y los pedidos estarán disponibles cuando guarde y pruebe la conexión.", "shopify.enterToken": "Introducir credenciales", - "shopify.noCredentials": "No hay credenciales de Shopify. Introduce tu dominio *.myshopify.com y el Client ID + secret del Dev Dashboard (o un token Admin API heredado), luego Guarda y Prueba la conexión. Tras una migración de plataforma, los secretos antiguos no se transfieren: reconecta con un token nuevo.", + "shopify.noCredentials": "No hay credenciales de Shopify. Introduce tu dominio *.myshopify.com y el Client ID + secret del Dev Dashboard (o un token Admin API heredado), luego Guarda y Prueba la conexión. Tras una migración de plataforma, los secretos antiguos no se transfieren: reconecta con un token nuevo.", "shopify.allConnectors": "Todos los conectores de tienda", - "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", + "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", "shopify.setup.oauthNote": "Still manual: create/install the app in Shopify and paste Client ID + secret here. Descrybe does not host a one-click App Store install. Legacy permanent shpat_ tokens from older Admin custom apps still work.", "shopify.setup.scopesTitle": "Scopes de Admin API requeridos", "shopify.setup.scopesIntro": "Add these scopes on the app version in the Dev Dashboard before you release and install:", @@ -3841,366 +3842,366 @@ export const es: MessageDict = { "shopify.setup.step5.clientId": "Client ID", "shopify.setup.step5.and": "and", "shopify.setup.step5.clientSecret": "Client secret", - "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", + "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", "shopify.setup.step5.save": "Save", - "shopify.setup.step5.arrow": "→", + "shopify.setup.step5.arrow": "→", "shopify.setup.step5.test": "Test Connection", "shopify.setup.step5.after": ". Descrybe stores secrets encrypted and refreshes the short-lived access token automatically.", "shopify.setup.step6.products": "Products", - "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", + "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", "shopify.setup.step6.orders": "Orders", - "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", + "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", "shopify.setup.step7.before": "No live shop yet? Enable", "shopify.setup.step7.dryRun": "Dry run", "shopify.setup.step7.after": "(or use the special dry-run access token) to walk through the flow without calling Shopify.", "shopify.setup.openDevDashboard": "Open Dev Dashboard", "shopify.setup.openDevelopApps": "Open shop Develop apps", "shopify.setup.openDevelopAppsNeedDomain": "Enter your shop domain below to unlock a direct Admin link for this store.", - "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", + "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", "shopify.setup.copyScopes": "Copy required scopes", "shopify.setup.scopesCopied": "Scopes copied", "shopify.setup.docsCreate": "Create app docs", "shopify.setup.docsTokens": "Access token docs", - "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", + "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", "shopify.setup.hideLegacyToken": "Hide legacy token field", - "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", + "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", "shopify.field.clientId": "Client ID", "shopify.field.clientSecret": "Client secret", - "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", + "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", "shopify.field.accessTokenHelp": "Only for custom apps created in Shopify Admin before January 2026. New apps should use Client ID + secret instead.", "shopify.placeholder.clientId": "Client ID from Dev Dashboard", - "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", + "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", "shopify.placeholder.clientSecret": "Client secret", - "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", + "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", "shopify.setup.scope.write_products": "write_products", "shopify.setup.scope.write_productsWhy": "Crear y actualizar productos en Shopify (push saliente)", "shopify.setup.scope.read_products": "read_products", "shopify.setup.scope.read_productsWhy": "Encontrar productos existentes por SKU antes de actualizar", "shopify.setup.scope.read_orders": "read_orders", "shopify.setup.scope.read_ordersWhy": "Importar pedidos a Descrybe (entrante)", - "shopify.setup.step1": "Si conectaste Shopify antes de una migración de plataforma: crea una app nueva en el Dev Dashboard (o reconecta con un token heredado nuevo); los secretos antiguos no se transfieren.", + "shopify.setup.step1": "Si conectaste Shopify antes de una migración de plataforma: crea una app nueva en el Dev Dashboard (o reconecta con un token heredado nuevo); los secretos antiguos no se transfieren.", "shopify.setup.step2.before": "Open the", "shopify.setup.step2.path": "Shopify Dev Dashboard", - "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", + "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", "shopify.setup.step3.before": "Create a version: set App URL (default home is fine for API-only), add scopes", "shopify.setup.step3.after": ".", "shopify.setup.step4.before": "From the app Home tab,", "shopify.setup.step4.after": "on your store (merchant must approve scopes).", - "shopify.testSectionTitle": "Verificar conexión", - "shopify.testHint": "Guarde primero el dominio de la tienda y el token, luego ejecute Probar conexión. Una prueba correcta confirma el token y los scopes antes de encolar la sync.", - "shopify.overwriteTitle": "¿Sobrescribir productos de Shopify?", - "shopify.overwriteBodyCount": "Esto encola un envío de productos saliente. {count} producto(s) de Shopify previamente vinculados pueden actualizarse con el contenido de Descrybe.", - "shopify.overwriteBody": "Esto encola un envío de productos saliente. Los productos de Shopify coincidentes pueden actualizarse con el contenido de Descrybe.", + "shopify.testSectionTitle": "Verificar conexión", + "shopify.testHint": "Guarde primero el dominio de la tienda y el token, luego ejecute Probar conexión. Una prueba correcta confirma el token y los scopes antes de encolar la sync.", + "shopify.overwriteTitle": "¿Sobrescribir productos de Shopify?", + "shopify.overwriteBodyCount": "Esto encola un envío de productos saliente. {count} producto(s) de Shopify previamente vinculados pueden actualizarse con el contenido de Descrybe.", + "shopify.overwriteBody": "Esto encola un envío de productos saliente. Los productos de Shopify coincidentes pueden actualizarse con el contenido de Descrybe.", "shopify.credentialsTitle": "Credenciales de la tienda", "shopify.credentialsDesc.before": "El dominio de la tienda debe ser tu", "shopify.credentialsDesc.code": "*.myshopify.com", "shopify.credentialsDesc.after": "domain. Prefer Dev Dashboard Client ID + secret; legacy Admin API tokens still work.", "shopify.field.shopDomain": "Dominio de la tienda", "shopify.field.accessToken": "Token de acceso Admin API", - "shopify.field.apiVersion": "Versión de API", + "shopify.field.apiVersion": "Versión de API", "shopify.placeholder.tokenKeep": "******** (dejar en blanco para conservar)", - "shopify.enableSync": "Activar envío de productos (Descrybe → Shopify)", - "shopify.dryRunLabel": "Simulación (sin llamadas Shopify en vivo)", - "shopify.ordersTitle": "Importación de pedidos (Shopify → Descrybe)", - "shopify.ordersDesc": "Shopify → Descrybe — importa pedidos y líneas a Descrybe (no escribe de vuelta en Shopify).", - "shopify.ordersNeedsReconnect": "La importación de pedidos no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", + "shopify.enableSync": "Activar envío de productos (Descrybe → Shopify)", + "shopify.dryRunLabel": "Simulación (sin llamadas Shopify en vivo)", + "shopify.ordersTitle": "Importación de pedidos (Shopify → Descrybe)", + "shopify.ordersDesc": "Shopify → Descrybe — importa pedidos y líneas a Descrybe (no escribe de vuelta en Shopify).", + "shopify.ordersNeedsReconnect": "La importación de pedidos no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", "shopify.notesTitle": "Notas", "shopify.notesDesc": "Capacidades del conector Shopify", - "shopify.notes.productsLabel": "Productos (Descrybe → Shopify)", - "shopify.notes.productsBody": "— los productos Descrybe procesados se crean o actualizan en Shopify (coincidencia por SKU vía GraphQL cuando no hay id de producto Shopify en caché). Una nueva sync puede sobrescribir campos remotos coincidentes.", - "shopify.notes.ordersLabel": "Pedidos (Shopify → Descrybe)", - "shopify.notes.ordersBody": "— importados para informes y futuros flujos de audiencia.", - "shopify.notes.reviewsLabel": "Reseñas", + "shopify.notes.productsLabel": "Productos (Descrybe → Shopify)", + "shopify.notes.productsBody": "— los productos Descrybe procesados se crean o actualizan en Shopify (coincidencia por SKU vía GraphQL cuando no hay id de producto Shopify en caché). Una nueva sync puede sobrescribir campos remotos coincidentes.", + "shopify.notes.ordersLabel": "Pedidos (Shopify → Descrybe)", + "shopify.notes.ordersBody": "— importados para informes y futuros flujos de audiencia.", + "shopify.notes.reviewsLabel": "Reseñas", "shopify.notes.reviewsBody": "-- not soporteed. Shopify has no first-party producto reviews Admin API (third-party review apps are out of scope here).", "shopify.notes.encryption.before": "Los tokens se cifran en reposo con", - "woo.title": "Integración WooCommerce", - "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", + "woo.title": "Integración WooCommerce", + "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", "woo.allStores": "Todas las tiendas", - "woo.adminOnly": "Solo los administradores de la empresa pueden cambiar la conexión y el mapeo de WooCommerce. La sincronización y la navegación siguen disponibles.", + "woo.adminOnly": "Solo los administradores de la empresa pueden cambiar la conexión y el mapeo de WooCommerce. La sincronización y la navegación siguen disponibles.", "woo.enterCredentials": "Introducir credenciales", - "woo.noCredentials": "No hay credenciales de WooCommerce. Introduce la URL de la tienda, crea una clave REST API de lectura/escritura en WordPress, pega Consumer Key y Secret, luego Guarda y Prueba la conexión. Tras una migración de plataforma, los secretos antiguos no se transfieren: reconecta con una clave nueva.", - "woo.lockedTitle": "Conexión de WooCommerce bloqueada", - "woo.noCredentialsMember": "Aún no hay credenciales de WooCommerce. Pide a un administrador de la empresa que conecte la tienda. La sincronización, pedidos y reseñas estarán disponibles cuando guarde y pruebe la conexión.", + "woo.noCredentials": "No hay credenciales de WooCommerce. Introduce la URL de la tienda, crea una clave REST API de lectura/escritura en WordPress, pega Consumer Key y Secret, luego Guarda y Prueba la conexión. Tras una migración de plataforma, los secretos antiguos no se transfieren: reconecta con una clave nueva.", + "woo.lockedTitle": "Conexión de WooCommerce bloqueada", + "woo.noCredentialsMember": "Aún no hay credenciales de WooCommerce. Pide a un administrador de la empresa que conecte la tienda. La sincronización, pedidos y reseñas estarán disponibles cuando guarde y pruebe la conexión.", "woo.setupDesc": "Follow these steps to create a WooCommerce REST API key in WordPress and connect it here. Descrybe never creates keys on your store for you.", - "woo.setup.step1": "Si conectaste WooCommerce antes de una migración de plataforma: crea una clave REST API nueva; las credenciales guardadas antiguas no son utilizables.", + "woo.setup.step1": "Si conectaste WooCommerce antes de una migración de plataforma: crea una clave REST API nueva; las credenciales guardadas antiguas no son utilizables.", "woo.setup.step2.before": "Enter your store", "woo.setup.step2.path": "HTTPS URL", "woo.setup.step2.after": "in the form below (example: https://yourstore.com).", "woo.setup.step3.before": "In WordPress admin, open", - "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", + "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", "woo.setup.step3.after": "(or use the deep link once your store URL is filled in).", "woo.setup.step4.before": "Click", "woo.setup.step4.addKey": "Add key", "woo.setup.step4.mid": ", set permissions to", "woo.setup.step4.permissions": "Read/Write", - "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", + "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", "woo.setup.step5.before": "Paste the key and secret below, enable sync if ready, then", "woo.setup.step5.save": "Save", - "woo.setup.step5.arrow": "→", + "woo.setup.step5.arrow": "→", "woo.setup.step5.test": "Test Connection", "woo.setup.step5.after": ".", "woo.setup.step6.products": "Products", - "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", + "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", "woo.setup.step6.orders": "Orders", "woo.setup.step6.and": "and", "woo.setup.step6.reviews": "reviews", - "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", + "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", "woo.setup.openKeys": "Abrir claves de REST API", - "woo.setup.addKey": "Añadir clave", - "woo.setup.openKeysHint": "Abre WordPress admin → WooCommerce → Ajustes → Avanzado → REST API.", - "woo.setup.openKeysNeedUrl": "Guarde primero una URL de tienda válida para abrir enlaces de admin.", - "woo.setup.docsLink": "Documentación de la REST API de WooCommerce", - "woo.overwriteTitle": "¿Sobrescribir productos de WooCommerce?", - "woo.overwriteBodyCount": "Esto encola un envío de productos saliente. {count} producto(s) de WooCommerce previamente vinculados pueden actualizarse con el contenido de Descrybe.", - "woo.overwriteBody": "Esto encola un envío de productos saliente. Los productos de WooCommerce coincidentes pueden actualizarse con el contenido de Descrybe.", + "woo.setup.addKey": "Añadir clave", + "woo.setup.openKeysHint": "Abre WordPress admin → WooCommerce → Ajustes → Avanzado → REST API.", + "woo.setup.openKeysNeedUrl": "Guarde primero una URL de tienda válida para abrir enlaces de admin.", + "woo.setup.docsLink": "Documentación de la REST API de WooCommerce", + "woo.overwriteTitle": "¿Sobrescribir productos de WooCommerce?", + "woo.overwriteBodyCount": "Esto encola un envío de productos saliente. {count} producto(s) de WooCommerce previamente vinculados pueden actualizarse con el contenido de Descrybe.", + "woo.overwriteBody": "Esto encola un envío de productos saliente. Los productos de WooCommerce coincidentes pueden actualizarse con el contenido de Descrybe.", "woo.connectionTitle": "Store connection", "woo.connectionDesc": "Paste your store URL and a Read/Write REST API key pair. Save, then Test Connection before queuing syncs.", - "woo.enableSync": "Activar envío de productos (Descrybe → WooCommerce)", + "woo.enableSync": "Activar envío de productos (Descrybe → WooCommerce)", "woo.field.storeUrl": "URL de la tienda", - "woo.field.storeUrlHelp": "URL pública del sitio con https. Se usa para la REST API de WooCommerce y enlaces al admin de WordPress.", + "woo.field.storeUrlHelp": "URL pública del sitio con https. Se usa para la REST API de WooCommerce y enlaces al admin de WordPress.", "woo.field.consumerKey": "Consumer Key", "woo.field.consumerSecret": "Consumer Secret", - "woo.field.credentialsHelp": "Consumer Key y Secret con permisos de lectura/escritura. Déjelos en blanco para conservar las credenciales existentes.", + "woo.field.credentialsHelp": "Consumer Key y Secret con permisos de lectura/escritura. Déjelos en blanco para conservar las credenciales existentes.", "woo.placeholder.keep": "******** (sin cambios)", "woo.keepCredentialsHint": "Deja clave/secreto en blanco al guardar para conservar las credenciales existentes.", - "woo.saveConfiguration": "Guardar configuración", - "woo.categoryMappingTitle": "Mapeo de categorías", - "woo.categoryMappingDesc": "Asigne sus categorías internas a las categorías de WooCommerce", - "woo.autoMapCategories": "Mapear categorías automáticamente", - "woo.autoMapping": "Mapeo automático...", - "woo.refreshCategories": "Actualizar categorías", - "woo.availableCategories": "Categorías WooCommerce disponibles", - "woo.categoriesEmptyHint": "Prueba la conexión y luego actualiza para cargar categorías WooCommerce.", + "woo.saveConfiguration": "Guardar configuración", + "woo.categoryMappingTitle": "Mapeo de categorías", + "woo.categoryMappingDesc": "Asigne sus categorías internas a las categorías de WooCommerce", + "woo.autoMapCategories": "Mapear categorías automáticamente", + "woo.autoMapping": "Mapeo automático...", + "woo.refreshCategories": "Actualizar categorías", + "woo.availableCategories": "Categorías WooCommerce disponibles", + "woo.categoriesEmptyHint": "Prueba la conexión y luego actualiza para cargar categorías WooCommerce.", "woo.attributeMappingTitle": "Mapeo de atributos", "woo.attributeMappingDesc": "Asigne sus atributos internos a los atributos de WooCommerce", - "woo.autoMapAttributes": "Mapear atributos automáticamente", + "woo.autoMapAttributes": "Mapear atributos automáticamente", "woo.refreshAttributes": "Actualizar atributos", "woo.availableAttributes": "Atributos WooCommerce disponibles", - "woo.attributesEmptyHint": "Prueba la conexión y luego actualiza para cargar atributos WooCommerce.", - "woo.ordersTitle": "Importación de pedidos (WooCommerce → Descrybe)", - "woo.ordersDesc": "WooCommerce → Descrybe — importa pedidos y líneas a Descrybe (no escribe de vuelta en la tienda).", - "woo.ordersNeedsReconnect": "La importación de pedidos no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", + "woo.attributesEmptyHint": "Prueba la conexión y luego actualiza para cargar atributos WooCommerce.", + "woo.ordersTitle": "Importación de pedidos (WooCommerce → Descrybe)", + "woo.ordersDesc": "WooCommerce → Descrybe — importa pedidos y líneas a Descrybe (no escribe de vuelta en la tienda).", + "woo.ordersNeedsReconnect": "La importación de pedidos no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", "woo.syncSettingsTitle": "Ajustes de sync", - "woo.syncSettingsDesc": "Configura cómo se envían los productos Descrybe → WooCommerce", + "woo.syncSettingsDesc": "Configura cómo se envían los productos Descrybe → WooCommerce", "woo.matchStrategy": "Producto Matching Strategy", - "woo.matchStrategyHelp": "El envío de productos (Descrybe → WooCommerce) empareja productos remotos por SKU o EAN/GTIN. Encola syncs desde la pestaña Conexión (manual).", - "woo.lastSyncLabel": "Última sync", + "woo.matchStrategyHelp": "El envío de productos (Descrybe → WooCommerce) empareja productos remotos por SKU o EAN/GTIN. Encola syncs desde la pestaña Conexión (manual).", + "woo.lastSyncLabel": "Última sync", "woo.saveSyncSettings": "Guardar ajustes de sync", "woo.match.sku": "SKU", "woo.match.ean": "EAN/GTIN", "plan.feature.section.shell": "Entorno", "plan.feature.section.dashboard": "Panel", - "plan.feature.section.catalog": "Catálogo", + "plan.feature.section.catalog": "Catálogo", "plan.feature.section.feeds": "Feeds", "plan.feature.section.stores": "Tiendas", "plan.feature.section.processing": "Procesamiento", "plan.feature.section.marketing": "Marketing", "plan.feature.section.integrations": "Integraciones", - "plan.feature.section.billing": "Facturación", - "plan.feature.section.settings": "Configuración", + "plan.feature.section.billing": "Facturación", + "plan.feature.section.settings": "Configuración", "plan.feature.section.support": "Soporte", "plan.feature.section.capabilities": "Capacidades", - "plan.feature.shell.navigation": "Navegación lateral", + "plan.feature.shell.navigation": "Navegación lateral", "plan.feature.shell.command_palette": "Paleta de comandos", "plan.feature.shell.company_switcher": "Selector de empresa", "plan.feature.shell.support_notifications": "Campana de notificaciones de soporte", "plan.feature.shell.tutorial": "Tutorial del producto", - "plan.feature.shell.account_menu": "Menú de cuenta", - "plan.feature.shell.billing_recovery_banner": "Banner de recuperación de facturación", + "plan.feature.shell.account_menu": "Menú de cuenta", + "plan.feature.shell.billing_recovery_banner": "Banner de recuperación de facturación", "plan.feature.dashboard.overview": "Resumen del panel", - "plan.feature.dashboard.stats": "Tarjetas de estadísticas", - "plan.feature.dashboard.quick_links": "Enlaces rápidos", + "plan.feature.dashboard.stats": "Tarjetas de estadísticas", + "plan.feature.dashboard.quick_links": "Enlaces rápidos", "plan.feature.dashboard.recent_jobs": "Trabajos recientes", "plan.feature.dashboard.news_feed": "Feed de noticias", - "plan.feature.dashboard.activation_checklist": "Lista de activación", + "plan.feature.dashboard.activation_checklist": "Lista de activación", "plan.feature.dashboard.migrated_checklist": "Lista de cohorte migrada", "plan.feature.dashboard.etl_gaps": "Panel de gaps ETL", - "plan.feature.dashboard.store_reconnect": "Banner de reconexión de tienda", - "plan.feature.dashboard.upgrade_banners": "Banners de actualización", + "plan.feature.dashboard.store_reconnect": "Banner de reconexión de tienda", + "plan.feature.dashboard.upgrade_banners": "Banners de actualización", "plan.feature.catalog.products": "Productos", - "plan.feature.catalog.products.tab_processed": "Productos - pestaña Procesados", - "plan.feature.catalog.products.tab_needs_review": "Productos - pestaña Revisión pendiente", - "plan.feature.catalog.products.tab_error": "Productos - pestaña Error", - "plan.feature.catalog.products.tab_processing": "Productos - pestaña Procesando", - "plan.feature.catalog.products.tab_unprocessed": "Productos - pestaña Sin procesar", - "plan.feature.catalog.products.process_categories": "Procesar categorías", + "plan.feature.catalog.products.tab_processed": "Productos - pestaña Procesados", + "plan.feature.catalog.products.tab_needs_review": "Productos - pestaña Revisión pendiente", + "plan.feature.catalog.products.tab_error": "Productos - pestaña Error", + "plan.feature.catalog.products.tab_processing": "Productos - pestaña Procesando", + "plan.feature.catalog.products.tab_unprocessed": "Productos - pestaña Sin procesar", + "plan.feature.catalog.products.process_categories": "Procesar categorías", "plan.feature.catalog.products.process_attributes": "Procesar atributos / especificaciones", - "plan.feature.catalog.products.process_ai_titles": "Procesar títulos con IA", + "plan.feature.catalog.products.process_ai_titles": "Procesar títulos con IA", "plan.feature.catalog.products.process_ai_descriptions": "Procesar descripciones con IA", - "plan.feature.catalog.products.enrichment_review": "Panel de revisión de enriquecimiento", + "plan.feature.catalog.products.enrichment_review": "Panel de revisión de enriquecimiento", "plan.feature.catalog.products.export_selection": "Exportar productos seleccionados", - "plan.feature.catalog.products.upgrade_prompt": "Avisos de actualización de productos", - "plan.feature.catalog.categories": "Categorías", - "plan.feature.catalog.categories.title_formula": "Fórmula de título de categoría", - "plan.feature.catalog.categories.description_formula": "Fórmula de descripción de categoría", + "plan.feature.catalog.products.upgrade_prompt": "Avisos de actualización de productos", + "plan.feature.catalog.categories": "Categorías", + "plan.feature.catalog.categories.title_formula": "Fórmula de título de categoría", + "plan.feature.catalog.categories.description_formula": "Fórmula de descripción de categoría", "plan.feature.catalog.attributes": "Atributos", - "plan.feature.catalog.attributes.bulk_import": "Importación masiva de atributos", - "plan.feature.catalog.standard_fields": "Campos estándar", - "plan.feature.catalog.standard_fields.groups": "Grupos de campos estándar", - "plan.feature.catalog.structured_descriptions": "Campos de descripción estructurada", - "plan.feature.catalog.vector_categories": "Categorías vectoriales", - "plan.feature.feeds.list": "Feeds de importación", - "plan.feature.feeds.add_url": "Añadir URL del feed", - "plan.feature.feeds.add_csv": "Añadir feed por carga CSV", + "plan.feature.catalog.attributes.bulk_import": "Importación masiva de atributos", + "plan.feature.catalog.standard_fields": "Campos estándar", + "plan.feature.catalog.standard_fields.groups": "Grupos de campos estándar", + "plan.feature.catalog.structured_descriptions": "Campos de descripción estructurada", + "plan.feature.catalog.vector_categories": "Categorías vectoriales", + "plan.feature.feeds.list": "Feeds de importación", + "plan.feature.feeds.add_url": "Añadir URL del feed", + "plan.feature.feeds.add_csv": "Añadir feed por carga CSV", "plan.feature.feeds.sync": "Sincronizar feed", "plan.feature.feeds.mapping": "Mapeo de feed", - "plan.feature.feeds.mapping.select_item": "Mapeo - seleccionar elemento de ítem", + "plan.feature.feeds.mapping.select_item": "Mapeo - seleccionar elemento de ítem", "plan.feature.feeds.mapping.map_fields": "Mapeo - mapear campos", - "plan.feature.feeds.export_feeds": "Feeds de exportación", - "plan.feature.feeds.export_feeds.create": "Crear feed de exportación", - "plan.feature.feeds.export_feeds.generate": "Generar feed de exportación", + "plan.feature.feeds.export_feeds": "Feeds de exportación", + "plan.feature.feeds.export_feeds.create": "Crear feed de exportación", + "plan.feature.feeds.export_feeds.generate": "Generar feed de exportación", "plan.feature.feeds.uploads": "Cargas de archivos", "plan.feature.stores.hub": "Centro de tiendas", - "plan.feature.stores.woocommerce": "Integración WooCommerce", - "plan.feature.stores.woocommerce.connection": "Conexión WooCommerce", - "plan.feature.stores.woocommerce.categories": "Sincronización de categorías WooCommerce", - "plan.feature.stores.woocommerce.attributes": "Sincronización de atributos WooCommerce", + "plan.feature.stores.woocommerce": "Integración WooCommerce", + "plan.feature.stores.woocommerce.connection": "Conexión WooCommerce", + "plan.feature.stores.woocommerce.categories": "Sincronización de categorías WooCommerce", + "plan.feature.stores.woocommerce.attributes": "Sincronización de atributos WooCommerce", "plan.feature.stores.woocommerce.orders": "Pedidos WooCommerce", - "plan.feature.stores.woocommerce.reviews": "Reseñas WooCommerce", + "plan.feature.stores.woocommerce.reviews": "Reseñas WooCommerce", "plan.feature.stores.woocommerce.settings": "Ajustes WooCommerce", - "plan.feature.stores.shopify": "Integración Shopify", - "plan.feature.stores.shopify.connection": "Conexión Shopify", + "plan.feature.stores.shopify": "Integración Shopify", + "plan.feature.stores.shopify.connection": "Conexión Shopify", "plan.feature.stores.shopify.orders": "Pedidos Shopify", "plan.feature.stores.shopify.settings": "Ajustes Shopify", "plan.feature.processing.monitor": "Monitor de procesamiento", - "plan.feature.marketing.campaigns": "Campañas", - "plan.feature.marketing.campaigns.create": "Asistente de nueva campaña", - "plan.feature.marketing.campaigns.generate_ai": "Generación de campaña con IA", - "plan.feature.marketing.campaigns.send": "Envío / blast de campaña", + "plan.feature.marketing.campaigns": "Campañas", + "plan.feature.marketing.campaigns.create": "Asistente de nueva campaña", + "plan.feature.marketing.campaigns.generate_ai": "Generación de campaña con IA", + "plan.feature.marketing.campaigns.send": "Envío / blast de campaña", "plan.feature.marketing.content_calendar": "Calendario de contenido", "plan.feature.marketing.brand_kit": "Kit de marca", "plan.feature.marketing.brand_ai_apply": "Aplicar marca IA en prompts", "plan.feature.marketing.seo": "Recomendaciones SEO", "plan.feature.marketing.seo.template_fill": "Relleno de plantilla SEO", "plan.feature.marketing.seo.ai_rewrite": "Reescritura SEO con IA", - "plan.feature.marketing.reviews": "Reseñas", + "plan.feature.marketing.reviews": "Reseñas", "plan.feature.integrations.ai": "Integraciones de IA", "plan.feature.integrations.ai.byok": "Usa tu propia clave de IA", - "plan.feature.integrations.email": "Envío de correo", - "plan.feature.integrations.email.test": "Envío de prueba de correo", - "plan.feature.integrations.email.blast": "Envío masivo de correo", - "plan.feature.billing.overview": "Resumen de facturación", + "plan.feature.integrations.email": "Envío de correo", + "plan.feature.integrations.email.test": "Envío de prueba de correo", + "plan.feature.integrations.email.blast": "Envío masivo de correo", + "plan.feature.billing.overview": "Resumen de facturación", "plan.feature.billing.customer_portal": "Portal de cliente Stripe", - "plan.feature.billing.quick_upgrade": "Pago de actualización rápida", + "plan.feature.billing.quick_upgrade": "Pago de actualización rápida", "plan.feature.billing.plans_compare": "Comparar planes", "plan.feature.billing.checkout": "Pago con Stripe", "plan.feature.settings.profile": "Ajustes de perfil", - "plan.feature.settings.company": "Configuración de la empresa", + "plan.feature.settings.company": "Configuración de la empresa", "plan.feature.settings.alerts": "Preferencias de alertas", "plan.feature.settings.api_keys": "Claves API", - "plan.feature.settings.team": "Gestión del equipo", - "plan.feature.settings.team_invite": "Invitar compañero", + "plan.feature.settings.team": "Gestión del equipo", + "plan.feature.settings.team_invite": "Invitar compañero", "plan.feature.support.center": "Centro de soporte", "plan.feature.support.ticket_create": "Nuevo ticket de soporte", "plan.feature.support.ticket_thread": "Hilo del ticket de soporte", - "plan.feature.capability.sku_cap": "Límite de SKU de producto", - "plan.feature.capability.ai_credits": "Cartera de créditos de IA", + "plan.feature.capability.sku_cap": "Límite de SKU de producto", + "plan.feature.capability.ai_credits": "Cartera de créditos de IA", "plan.feature.capability.ai_processing": "Trabajos de procesamiento con IA", "plan.feature.capability.eprel": "Enriquecimiento EPREL", "plan.feature.capability.normalize_specs_fill": "Normalizar / especificaciones / completar", - "plan.feature.capability.campaign_ai": "Generación de campaña con IA", + "plan.feature.capability.campaign_ai": "Generación de campaña con IA", "plan.feature.capability.email_live_send": "Entrega de correo en vivo", "plan.feature.capability.brand_ai_apply": "Voz de marca en prompts de IA", "plan.feature.capability.seo_ai_rewrite": "Reescritura SEO con IA", - "plan.feature.capability.feed_source_limit": "Límite de fuentes de feed (marketing)", - "plan.feature.capability.export_feed_limit": "Límite de feeds de exportación (marketing)", - "plan.feature.capability.storage_limit": "Límite de almacenamiento (marketing)", + "plan.feature.capability.feed_source_limit": "Límite de fuentes de feed (marketing)", + "plan.feature.capability.export_feed_limit": "Límite de feeds de exportación (marketing)", + "plan.feature.capability.storage_limit": "Límite de almacenamiento (marketing)", "plan.feature.capability.api_access": "Acceso a la API REST (marketing)", "plan.feature.capability.byok": "Usa tu propia clave de IA", "billing.plan.free": "Gratis", "products.actions.selectAll": "Seleccionar todo", - "products.actions.upgradeSuffix": " · mejorar", + "products.actions.upgradeSuffix": " · mejorar", "products.actions.upgradeRequired": "{label} (mejora requerida)", "products.actions.free": "gratis", - "products.actions.credits": "{credits} créditos", - "products.actions.autoCategorizeTitle": "Añadiendo categorización automáticamente", - "products.actions.autoCategorizeBody": "{count} producto(s) necesitan categorización para el procesamiento de {types}", - "products.actions.aiLocked": "Las opciones de IA están bloqueadas en Free. Mejora el plan para procesar títulos/descripciones.", + "products.actions.credits": "{credits} créditos", + "products.actions.autoCategorizeTitle": "Añadiendo categorización automáticamente", + "products.actions.autoCategorizeBody": "{count} producto(s) necesitan categorización para el procesamiento de {types}", + "products.actions.aiLocked": "Las opciones de IA están bloqueadas en Free. Mejora el plan para procesar títulos/descripciones.", "products.actions.processSelected": "Procesar seleccionados", "products.actions.markProcessed": "Marcar como procesado", "products.actions.resetUnprocessed": "Restablecer a sin procesar", "products.actions.export": "Exportar", - "products.upload.dropHint": "Suelta un CSV aquí o haz clic para explorar", - "products.upload.supportsHint": "Admite importaciones de productos .csv (ean, name, category…)", - "products.export.chooseConfig": "Exportar {count} producto(s) seleccionado(s). Elija el feed de exportación que define formato y campos.", - "products.export.selectPlaceholder": "Seleccione un feed de exportación…", + "products.upload.dropHint": "Suelta un CSV aquí o haz clic para explorar", + "products.upload.supportsHint": "Admite importaciones de productos .csv (ean, name, category…)", + "products.export.chooseConfig": "Exportar {count} producto(s) seleccionado(s). Elija el feed de exportación que define formato y campos.", + "products.export.selectPlaceholder": "Seleccione un feed de exportación…", "fields.typeLabel": "Tipo", "fields.groupLabel": "Grupo", "fields.selectGroup": "Selecciona un grupo", "fields.groupBelongsHint": "Grupo al que pertenece este campo", - "fields.addFieldShort": "Añadir campo", + "fields.addFieldShort": "Añadir campo", "fields.enableRecommended": "Activar recomendados", "feeds.activated": "Feed activado.", "feeds.deactivated": "Feed desactivado.", - "feeds.syncTimeout": "Sincronizar timed out waiting for the server. The job may still finish — open Sincronizar History to check status.", + "feeds.syncTimeout": "Sincronizar timed out waiting for the server. The job may still finish — open Sincronizar History to check status.", "feeds.createdMapHint": "Feed creado. Mapea campos antes de sincronizar.", "feeds.createdPlain": "Feed creado.", "feeds.createdMapDesc": "Mapea columnas de origen a campos de producto y luego sincroniza.", - "feeds.lastLiveSync": "Última sync correcta del feed: {when}", - "feeds.noLiveSyncProducts": "Aún no hay sync correcta del feed. Catálogo actualizado por última vez {when}.", - "feeds.noDataYet": "Aún no hay sync ni datos de catálogo.", + "feeds.lastLiveSync": "Última sync correcta del feed: {when}", + "feeds.noLiveSyncProducts": "Aún no hay sync correcta del feed. Catálogo actualizado por última vez {when}.", + "feeds.noDataYet": "Aún no hay sync ni datos de catálogo.", "products.filters.incomplete": "Incompleto", "products.filters.complete44": "Completo (4/4)", "products.filters.missingName": "Nombre faltante", - "products.filters.missingDescription": "Descripción faltante", + "products.filters.missingDescription": "Descripción faltante", "products.filters.missingAttributes": "Atributos faltantes", - "products.filters.missingCategory": "Categoría faltante", + "products.filters.missingCategory": "Categoría faltante", "products.filters.hasEprel": "Tiene EPREL", "products.filters.noEprel": "Sin EPREL", "products.filters.priceChanged": "Precio cambiado", "products.filters.stockChanged": "Stock cambiado", - "products.filters.titleChanged": "Título cambiado", + "products.filters.titleChanged": "Título cambiado", "products.filters.newFromFeed": "Nuevo desde feed", "products.filters.otherFieldChange": "Otro cambio de campo", - "products.filters.sortUpdatedNewest": "Actualizado (más reciente)", - "products.filters.sortUpdatedOldest": "Actualizado (más antiguo)", + "products.filters.sortUpdatedNewest": "Actualizado (más reciente)", + "products.filters.sortUpdatedOldest": "Actualizado (más antiguo)", "products.filters.sortNameAsc": "Nombre (A-Z)", "products.filters.sortNameDesc": "Nombre (Z-A)", "products.filters.searchPlaceholder": "Buscar productos...", - "products.filters.searchCategories": "Buscar categorías...", + "products.filters.searchCategories": "Buscar categorías...", "products.filters.selectFeed": "Seleccionar feed", - "products.filters.loadingFeeds": "Cargando feeds…", + "products.filters.loadingFeeds": "Cargando feeds…", "products.table.loading": "Cargando productos", - "products.table.uncategorized": "Sin categoría", - "products.table.assignCategory": "Asignar categoría", - "products.table.changeCategory": "Cambiar categoría de {name}", - "products.table.selectCategory": "Seleccionar categoría…", - "products.table.saveCategory": "Guardar categoría", - "products.table.cancelCategory": "Cancelar edición de categoría", - "products.table.categoryRequired": "Elige una categoría", - "products.table.noCategoriesAvailable": "Aún no hay categorías — crea una en Catálogo", + "products.table.uncategorized": "Sin categoría", + "products.table.assignCategory": "Asignar categoría", + "products.table.changeCategory": "Cambiar categoría de {name}", + "products.table.selectCategory": "Seleccionar categoría…", + "products.table.saveCategory": "Guardar categoría", + "products.table.cancelCategory": "Cancelar edición de categoría", + "products.table.categoryRequired": "Elige una categoría", + "products.table.noCategoriesAvailable": "Aún no hay categorías — crea una en Catálogo", "products.table.qualityUnavailable": "Calidad no disponible", "products.table.full": "Completo", - "products.table.empty": "Vacío", + "products.table.empty": "Vacío", "products.table.saveName": "Guardar nombre", "products.table.cancelRename": "Cancelar renombre", - "products.table.noSyncYet": "Aún sin sync", - "products.feedSync.feedAndWhen": "{feed} · {when}", + "products.table.noSyncYet": "Aún sin sync", + "products.feedSync.feedAndWhen": "{feed} · {when}", "products.feedSync.syncedWhen": "Sincronizado {when}", "products.table.productOptions": "Opciones de producto", "products.edit.details": "Detalles del producto", "products.edit.noEprel": "No hay id EPREL en este producto.", - "products.edit.specsPresent": "Las especificaciones técnicas están presentes en este producto.", + "products.edit.specsPresent": "Las especificaciones técnicas están presentes en este producto.", "products.edit.noEnrichedName": "Sin nombre enriquecido", "products.edit.resetName": "Restablecer el nombre enriquecido al original", - "products.edit.cannotClearName": "El original está vacío — no se puede borrar el nombre enriquecido vía PATCH", + "products.edit.cannotClearName": "El original está vacío — no se puede borrar el nombre enriquecido vía PATCH", "products.edit.showPreview": "Mostrar vista previa", "products.edit.editHtml": "Editar HTML", - "products.edit.noEnrichedDescription": "Sin descripción enriquecida", - "products.edit.resetDescription": "Restablecer la descripción enriquecida al original", - "products.edit.cannotClearDescription": "El original está vacío — no se puede borrar la descripción enriquecida vía PATCH", + "products.edit.noEnrichedDescription": "Sin descripción enriquecida", + "products.edit.resetDescription": "Restablecer la descripción enriquecida al original", + "products.edit.cannotClearDescription": "El original está vacío — no se puede borrar la descripción enriquecida vía PATCH", "products.edit.unknownFeed": "Feed desconocido", "products.edit.noProcessedName": "No hay nombre procesado disponible", - "products.edit.feedNamed": "Feed · {name}", - "products.edit.noAiDescription": "Sin descripción de IA", + "products.edit.feedNamed": "Feed · {name}", + "products.edit.noAiDescription": "Sin descripción de IA", "products.edit.sourceLabel": "Etiqueta de origen", - "products.edit.coverageTitle": "Cuántos de Nombre, Descripción, Atributos y Categoría están presentes (feed o procesados).", + "products.edit.coverageTitle": "Cuántos de Nombre, Descripción, Atributos y Categoría están presentes (feed o procesados).", "products.edit.coverageReady": "{count}/4 listos", - "products.edit.eprelPresentTitle": "El id del European Product Registry for Energy Labelling (EPREL) está presente en este producto.", + "products.edit.eprelPresentTitle": "El id del European Product Registry for Energy Labelling (EPREL) está presente en este producto.", "products.edit.noEprelBadge": "Sin EPREL", "products.edit.specsBadge": "Especs", "products.edit.reviewBannerTitle": "Revisa los campos enriquecidos antes de aceptar", - "products.edit.reviewBannerHelp": "Usa la pestaña Revisar para comparar originales vs IA. Atajos: A aceptar · R rechazar · Alt+1/2 campo · ⌘/Ctrl+Enter aceptar todo.", + "products.edit.reviewBannerHelp": "Usa la pestaña Revisar para comparar originales vs IA. Atajos: A aceptar · R rechazar · Alt+1/2 campo · ⌘/Ctrl+Enter aceptar todo.", "products.edit.tab.review": "Revisar", "products.edit.tab.details": "Detalles", "products.edit.tab.content": "Contenido", @@ -4212,13 +4213,13 @@ export const es: MessageDict = { "products.edit.enriched": "Enriquecido", "products.edit.discardName": "Descartar nombre", "products.edit.acceptName": "Aceptar nombre", - "products.edit.discardDescription": "Descartar descripción", - "products.edit.acceptDescription": "Aceptar descripción", - "products.edit.noCategory": "No Categoría", - "products.edit.whatsFilledIn": "Qué está rellenado", - "products.edit.coverageLegend": "Gris = faltante · Naranja = del feed · Verde = procesado", + "products.edit.discardDescription": "Descartar descripción", + "products.edit.acceptDescription": "Aceptar descripción", + "products.edit.noCategory": "No Categoría", + "products.edit.whatsFilledIn": "Qué está rellenado", + "products.edit.coverageLegend": "Gris = faltante · Naranja = del feed · Verde = procesado", "products.edit.feedSource": "Origen del feed", - "products.edit.updatedRelative": "· actualizado {when}", + "products.edit.updatedRelative": "· actualizado {when}", "products.edit.viewAllFeedFields": "Ver all feed fields ({filled}/{total})", "products.edit.productIdentity": "Producto identity", "products.edit.aiProcessedName": "Nombre procesado con AI", @@ -4226,28 +4227,28 @@ export const es: MessageDict = { "products.edit.productIdSku": "Producto ID / SKU", "products.edit.rowUpdated": "Fila del producto actualizada {when}", "products.edit.noRawUpdateTime": "No raw producto update time", - "products.edit.feedSyncLabel": "· sincronización del feed {when}", + "products.edit.feedSyncLabel": "· sincronización del feed {when}", "products.edit.neverRecorded": "nunca registrado", - "products.edit.feedFilledCount": "{filled} rellenados · {total} campos", + "products.edit.feedFilledCount": "{filled} rellenados · {total} campos", "products.edit.noMappedFeedFields": "No mapped feed fields on this producto.", "products.edit.fieldCol": "Campo", "products.edit.valueFromFeed": "Valor from feed", - "products.edit.core": "Núcleo", - "products.edit.aiProcessedDescription": "AI-Processed Descripción", - "products.edit.originalDescription": "Descripción original", + "products.edit.core": "Núcleo", + "products.edit.aiProcessedDescription": "AI-Processed Descripción", + "products.edit.originalDescription": "Descripción original", "products.edit.noAttrsYet": "No atributo or specification data on this producto yet.", "products.edit.fromFeed": "Del feed", - "products.edit.feedAttrsHelp": "Valores analizados del feed (especificaciones HTML, garantía, dimensiones, EPREL). Las claves se vinculan a attribute_key cuando es posible.", + "products.edit.feedAttrsHelp": "Valores analizados del feed (especificaciones HTML, garantía, dimensiones, EPREL). Las claves se vinculan a attribute_key cuando es posible.", "products.edit.fieldsCount": "{count} campos", "products.edit.originalAttributes": "Atributos originales", "products.edit.aiAttributes": "Atributos IA / enriquecidos", "products.edit.editableAttributes": "Atributos editables", "products.edit.editableAttributesHelp": "Los cambios se guardan en el mapa de atributos del producto. Las filas de feed e IA abajo siguen como referencia cuando difieren.", - "products.edit.addAttribute": "Añadir atributo", + "products.edit.addAttribute": "Añadir atributo", "products.edit.attrKeyPlaceholder": "Clave", "products.edit.attrValuePlaceholder": "Valor", "products.edit.removeAttribute": "Eliminar {key}", - "products.edit.noEditableAttrs": "Aún no hay atributos editables. Añade un par clave/valor.", + "products.edit.noEditableAttrs": "Aún no hay atributos editables. Añade un par clave/valor.", "products.edit.reject": "Rechazar", "products.edit.accept": "Aceptar", "taskIndicator.title": "Tareas en segundo plano", @@ -4258,258 +4259,258 @@ export const es: MessageDict = { "taskIndicator.collapse": "Contraer lista de tareas", "taskIndicator.progressAria": "Progreso del trabajo {pct} por ciento", "taskIndicator.progressCounts": "{done} de {total} productos", - "attributes.assignBulk": "Asignar a categorías", + "attributes.assignBulk": "Asignar a categorías", "products.filters.search": "Buscar", "products.filters.sortAria": "Orden: {label}", "products.filters.sortLabel": "Orden: {label}", "products.table.colIdName": "ID/Nombre", "products.table.colCoverage": "Cobertura", - "products.table.coverageTitle": "Cobertura: N=Nombre, D=Descripción, A=Atributos, C=Categoría. Gris=ausente, naranja=desde el feed, verde=procesado. EPREL muestra el id del registro de etiqueta energética.", + "products.table.coverageTitle": "Cobertura: N=Nombre, D=Descripción, A=Atributos, C=Categoría. Gris=ausente, naranja=desde el feed, verde=procesado. EPREL muestra el id del registro de etiqueta energética.", "products.table.colFeed": "Feed", - "products.table.colCategory": "Categoría", + "products.table.colCategory": "Categoría", "products.table.colStatus": "Estado", - "products.table.colUpdated": "Última actualización", + "products.table.colUpdated": "Última actualización", "products.table.colActions": "Acciones", - "products.table.loadingDots": "Cargando productos…", + "products.table.loadingDots": "Cargando productos…", "products.table.noneFound": "No se encontraron productos.", "products.table.selectProduct": "Seleccionar producto {name}", "products.table.rename": "Renombrar {name}", "products.table.productNameAria": "Nombre del producto para {name}", "products.table.selectPage": "Seleccionar {count} on this page", - "products.table.deselectPage": "Deseleccionar {count} en esta página", + "products.table.deselectPage": "Deseleccionar {count} en esta página", "categories.assign": "Asignar", - "categories.titleFormulaSubtitle": "Configura cómo deben generarse los títulos de producto para {name}", - "categories.addText": "Añadir texto", - "categories.aboutTitleFormulas": "Acerca de las fórmulas de título", - "categories.aboutTitleFormulasHelp": "Los títulos se ensamblan de izquierda a derecha a partir de los elementos siguientes.", - "categories.variablesReplacedHelp": "Las variables se sustituyen por datos del producto cuando están disponibles. Los valores faltantes se omiten.", - "categories.variableTypeHelp": "Campo dinámico de los datos del producto (ejemplo: marca).", - "categories.textTypeHelp": "Texto estático que siempre aparece tal como se escribe.", - "categories.assignTitleCopyHelp": "Usa Asignar para copiar esta fórmula a otras categorías que deban compartir el mismo patrón de título.", - "categories.titleFormulaInvalid": "Esta página de fórmula de título necesita una categoría válida. Vuelve a categorías y abre de nuevo Editar fórmula de título.", - "categories.preview.title": "Vista previa del título", - "categories.preview.description": "Así se estructurarán los títulos de tus productos", + "categories.titleFormulaSubtitle": "Configura cómo deben generarse los títulos de producto para {name}", + "categories.addText": "Añadir texto", + "categories.aboutTitleFormulas": "Acerca de las fórmulas de título", + "categories.aboutTitleFormulasHelp": "Los títulos se ensamblan de izquierda a derecha a partir de los elementos siguientes.", + "categories.variablesReplacedHelp": "Las variables se sustituyen por datos del producto cuando están disponibles. Los valores faltantes se omiten.", + "categories.variableTypeHelp": "Campo dinámico de los datos del producto (ejemplo: marca).", + "categories.textTypeHelp": "Texto estático que siempre aparece tal como se escribe.", + "categories.assignTitleCopyHelp": "Usa Asignar para copiar esta fórmula a otras categorías que deban compartir el mismo patrón de título.", + "categories.titleFormulaInvalid": "Esta página de fórmula de título necesita una categoría válida. Vuelve a categorías y abre de nuevo Editar fórmula de título.", + "categories.preview.title": "Vista previa del título", + "categories.preview.description": "Así se estructurarán los títulos de tus productos", "categories.preview.exampleTab": "Vista previa de ejemplo", - "categories.preview.structureTab": "Estructura de la fórmula", - "categories.preview.noElements": "Aún no hay elementos", - "categories.brandTips.title": "Consejos según la marca", - "categories.brandTips.freePlan": "El kit de marca se puede editar en el plan Free; la aplicación con IA se desbloquea en planes de pago.", + "categories.preview.structureTab": "Estructura de la fórmula", + "categories.preview.noElements": "Aún no hay elementos", + "categories.brandTips.title": "Consejos según la marca", + "categories.brandTips.freePlan": "El kit de marca se puede editar en el plan Free; la aplicación con IA se desbloquea en planes de pago.", "categories.brandTips.editBrandKit": "Editar kit de marca", - "categories.brandTips.emptyBefore": "Añade voz o términos preferidos en ", - "categories.brandTips.emptyAfter": " para ver consejos aquí.", + "categories.brandTips.emptyBefore": "Añade voz o términos preferidos en ", + "categories.brandTips.emptyAfter": " para ver consejos aquí.", "categories.brandTips.brandKit": "Kit de marca", - "categories.brandTips.descGuidanceBefore": "Orientación de tu ", - "categories.brandTips.descGuidanceAfter": " para las secciones de descripción.", - "categories.formulaElementsTitle": "Elementos de la fórmula", + "categories.brandTips.descGuidanceBefore": "Orientación de tu ", + "categories.brandTips.descGuidanceAfter": " para las secciones de descripción.", + "categories.formulaElementsTitle": "Elementos de la fórmula", "categories.formulaElementsHelp": "Arrastra y suelta elementos para reordenarlos", - "categories.noElementsAdded": "No hay elementos añadidos", - "categories.addElementsHint": "Añade variables o texto desde el panel de la derecha", + "categories.noElementsAdded": "No hay elementos añadidos", + "categories.addElementsHint": "Añade variables o texto desde el panel de la derecha", "categories.editTextElementAria": "Editar elemento de texto {value}", "categories.removeElementAria": "Eliminar elemento {type} {value}", "categories.tab.single": "Individual", "categories.tab.bulk": "Carga masiva", - "categories.uniqueIdLabel": "ID único", + "categories.uniqueIdLabel": "ID único", "categories.parentLabel": "Padre", - "categories.noneRoot": "Ninguno (raíz)", - "categories.descriptionLabel": "Descripción", + "categories.noneRoot": "Ninguno (raíz)", + "categories.descriptionLabel": "Descripción", "categories.csvUploadHelp": "Sube un CSV con las columnas name, unique_id, y opcionalmente parent_unique_id y description.", "categories.downloadTemplate": "Descargar plantilla", "categories.variableNameKey": "Nombre (clave)", "categories.displayName": "Nombre visible", "categories.exampleValue": "Valor de ejemplo", "categories.variableExists": "Ya existe una variable con el nombre \"{name}\".", - "categories.addVariable": "Añadir variable", + "categories.addVariable": "Añadir variable", "categories.updateVariable": "Actualizar variable", "categories.col.displayName": "Nombre visible", "categories.col.key": "Clave", - "categories.col.description": "Descripción", + "categories.col.description": "Descripción", "categories.col.example": "Ejemplo", "categories.noVariablesFound": "No se encontraron variables", "categories.availableVariables": "Variables disponibles", "categories.manage": "Gestionar", - "categories.noVariablesMatch": "Ninguna variable coincide con “{query}”.", - "categories.noUnusedVariables": "No quedan variables sin usar. Añade una variable personalizada o elimina un elemento para liberar una.", + "categories.noVariablesMatch": "Ninguna variable coincide con “{query}”.", + "categories.noUnusedVariables": "No quedan variables sin usar. Añade una variable personalizada o elimina un elemento para liberar una.", "categories.exampleColon": "Ejemplo: {value}", "categories.editVariableAria": "Editar {label}", "categories.deleteVariableAria": "Eliminar {label}", - "categories.addVariableAria": "Añadir {label}", + "categories.addVariableAria": "Añadir {label}", "categories.textLabel": "Texto", - "categories.textAppearsAsWritten": "Este texto aparecerá exactamente como se escribe en tus títulos", - "categories.addTextButton": "Añadir texto", + "categories.textAppearsAsWritten": "Este texto aparecerá exactamente como se escribe en tus títulos", + "categories.addTextButton": "Añadir texto", "categories.updateTextButton": "Actualizar texto", "categories.structureDescriptionsFor": "Estructura las descripciones de producto para {name}", - "categories.metaInformation": "Información meta", - "categories.metaInformationHelp": "Instrucciones que usa la IA para las etiquetas de título SEO y meta descripción.", - "categories.metaTitleFormula": "Fórmula de meta título", - "categories.metaTitleHint": "Se muestra en resultados de búsqueda y pestañas del navegador (unos 50–60 caracteres).", - "categories.metaDescriptionFormula": "Fórmula de meta descripción", - "categories.metaDescriptionHint": "Se muestra bajo el título en los resultados de búsqueda (unos 120–155 caracteres).", + "categories.metaInformation": "Información meta", + "categories.metaInformationHelp": "Instrucciones que usa la IA para las etiquetas de título SEO y meta descripción.", + "categories.metaTitleFormula": "Fórmula de meta título", + "categories.metaTitleHint": "Se muestra en resultados de búsqueda y pestañas del navegador (unos 50–60 caracteres).", + "categories.metaDescriptionFormula": "Fórmula de meta descripción", + "categories.metaDescriptionHint": "Se muestra bajo el título en los resultados de búsqueda (unos 120–155 caracteres).", "categories.resetToDefault": "Restablecer predeterminado", - "categories.descriptionSections": "Secciones de descripción", - "categories.descriptionSectionsHelp": "Arrastra las secciones para definir el orden de la descripción generada.", - "categories.noSectionsYet": "Aún no hay secciones", - "categories.addSectionsHint": "Añade un encabezado, párrafo o lista para empezar.", + "categories.descriptionSections": "Secciones de descripción", + "categories.descriptionSectionsHelp": "Arrastra las secciones para definir el orden de la descripción generada.", + "categories.noSectionsYet": "Aún no hay secciones", + "categories.addSectionsHint": "Añade un encabezado, párrafo o lista para empezar.", "categories.aiInstructions": "Instrucciones de IA", - "categories.exportIdOptional": "ID de exportación (opcional)", - "categories.exportIdUnique": "El ID de exportación debe ser único", - "categories.addSection": "Añadir sección", - "categories.aboutDescriptionFormulas": "Acerca de las fórmulas de descripción", - "categories.aboutDescriptionFormulasHelp": "Estas instrucciones indican a la IA cómo escribir descripciones para productos de esta categoría.", - "categories.sectionTypesHeading": "Tipos de sección", - "categories.sectionTypeHeadings": "Encabezados (H1–H4):", - "categories.sectionTypeHeadingsHelp": "Títulos y subtítulos", - "categories.sectionTypeParagraphs": "Párrafos:", + "categories.exportIdOptional": "ID de exportación (opcional)", + "categories.exportIdUnique": "El ID de exportación debe ser único", + "categories.addSection": "Añadir sección", + "categories.aboutDescriptionFormulas": "Acerca de las fórmulas de descripción", + "categories.aboutDescriptionFormulasHelp": "Estas instrucciones indican a la IA cómo escribir descripciones para productos de esta categoría.", + "categories.sectionTypesHeading": "Tipos de sección", + "categories.sectionTypeHeadings": "Encabezados (H1–H4):", + "categories.sectionTypeHeadingsHelp": "Títulos y subtítulos", + "categories.sectionTypeParagraphs": "Párrafos:", "categories.sectionTypeParagraphsHelp": "Bloques de contenido principal", - "categories.sectionTypeLists": "Listas con viñetas:", - "categories.sectionTypeListsHelp": "Características y especificaciones", + "categories.sectionTypeLists": "Listas con viñetas:", + "categories.sectionTypeListsHelp": "Características y especificaciones", "categories.aiInstructionsHeading": "Instrucciones de IA", - "categories.aiInstructionsBody": "Escribe un objetivo claro por sección (qué cubrir, tono, longitud). Las consignas vagas producen textos vagos.", - "categories.exportIdsHeading": "IDs de exportación", - "categories.exportIdsBody": "Los IDs opcionales asignan una sección a feeds de exportación (por ejemplo short_description).", - "categories.assignDescCopyHelp": "Usa Asignar para copiar esta plantilla a otras categorías que deban compartir la misma estructura.", - "categories.descriptionFormulaInvalid": "Esta página de fórmula de descripción necesita una categoría válida. Vuelve a categorías y abre de nuevo Editar fórmula de descripción.", + "categories.aiInstructionsBody": "Escribe un objetivo claro por sección (qué cubrir, tono, longitud). Las consignas vagas producen textos vagos.", + "categories.exportIdsHeading": "IDs de exportación", + "categories.exportIdsBody": "Los IDs opcionales asignan una sección a feeds de exportación (por ejemplo short_description).", + "categories.assignDescCopyHelp": "Usa Asignar para copiar esta plantilla a otras categorías que deban compartir la misma estructura.", + "categories.descriptionFormulaInvalid": "Esta página de fórmula de descripción necesita una categoría válida. Vuelve a categorías y abre de nuevo Editar fórmula de descripción.", "categories.sectionType.h1": "Encabezado 1", "categories.sectionType.h2": "Encabezado 2", "categories.sectionType.h3": "Encabezado 3", "categories.sectionType.h4": "Encabezado 4", - "categories.sectionType.p": "Párrafo", - "categories.sectionType.ul": "Lista con viñetas", - "categories.aiGenerationPrompt": "Prompt de generación con IA", + "categories.sectionType.p": "Párrafo", + "categories.sectionType.ul": "Lista con viñetas", + "categories.aiGenerationPrompt": "Prompt de generación con IA", "categories.aiPromptOverrides": "Sustituye el prompt de usuario de mejora de producto de la empresa para {name}", "categories.promptTemplate": "Plantilla de prompt", - "categories.promptTemplateHelp": "Usa marcadores como {{name}} y {{description}}. Déjalo vacío para usar el valor predeterminado de la empresa en Integraciones → IA.", + "categories.promptTemplateHelp": "Usa marcadores como {{name}} y {{description}}. Déjalo vacío para usar el valor predeterminado de la empresa en Integraciones → IA.", "categories.clear": "Limpiar", "categories.promptLabel": "Prompt", "categories.charactersCount": "{count} caracteres", - "categories.activeOverride": "· anulación activa para esta categoría", - "categories.usingCompanyDefault": "· usando el valor predeterminado de la empresa / integrado", - "categories.usingCompanyDefaultForLang": "· vacío para este idioma — se aplica el predeterminado de la empresa / integrado", + "categories.activeOverride": "· anulación activa para esta categoría", + "categories.usingCompanyDefault": "· usando el valor predeterminado de la empresa / integrado", + "categories.usingCompanyDefaultForLang": "· vacío para este idioma — se aplica el predeterminado de la empresa / integrado", "categories.aiPromptSavedLang": "Prompt IA guardado para {lang}.", - "categories.aiPromptClearedLang": "Prompt IA borrado para {lang} (se aplicará el predeterminado de la empresa).", + "categories.aiPromptClearedLang": "Prompt IA borrado para {lang} (se aplicará el predeterminado de la empresa).", "contentLang.switcherLabel": "Idioma de contenido", "contentLang.primary": "principal", "contentLang.hasOverride": "personalizado", - "contentLang.addLanguage": "Añadir idioma…", - "contentLang.add": "Añadir", + "contentLang.addLanguage": "Añadir idioma…", + "contentLang.add": "Añadir", "contentLang.removeLanguage": "Quitar {lang}", - "contentLang.resultsHint": "Cambia de idioma para revisar títulos y descripciones de IA de cada idioma de contenido.", + "contentLang.resultsHint": "Cambia de idioma para revisar títulos y descripciones de IA de cada idioma de contenido.", "contentLang.settingsTitle": "Idiomas de contenido", - "contentLang.settingsHelp": "El idioma principal se usa por defecto. Los idiomas adicionales tienen sus propios prompts y resultados de IA (cada pasada consume créditos).", - "ai.prompts.languageHelp": "Edita los prompts de la empresa por idioma de contenido. Un idioma vacío usa el valor predeterminado integrado para ese idioma.", - "header.accountSettingsAria": "Configuración de la cuenta de {email}", + "contentLang.settingsHelp": "El idioma principal se usa por defecto. Los idiomas adicionales tienen sus propios prompts y resultados de IA (cada pasada consume créditos).", + "ai.prompts.languageHelp": "Edita los prompts de la empresa por idioma de contenido. Un idioma vacío usa el valor predeterminado integrado para ese idioma.", + "header.accountSettingsAria": "Configuración de la cuenta de {email}", "switcher.switchUserAria": "Cambiar de usuario: {label}", - "switcher.unavailable": "El cambio de usuario no está disponible en este entorno.", + "switcher.unavailable": "El cambio de usuario no está disponible en este entorno.", "switcher.loadFailed": "No se pudieron cargar los usuarios.", "support.notifications.aria": "Notificaciones de soporte", "support.notifications.ariaUnread": "Notificaciones de soporte, {count} sin leer", "time.never": "Nunca", - "time.invalid": "Fecha no válida", + "time.invalid": "Fecha no válida", "time.unknown": "Fecha desconocida", "time.justNow": "ahora mismo", "time.neverUsed": "Nunca usado", "billing.plan.enterprise": "Empresarial", "news.heading": "Actualizaciones de la plataforma", - "news.subtitle": "Últimas funciones y mejoras", + "news.subtitle": "Últimas funciones y mejoras", "news.keyFeatures": "Funciones clave:", "news.badge.new": "Nuevo", - "news.footer": "Eso es todo por ahora — vuelve tras la próxima versión.", + "news.footer": "Eso es todo por ahora — vuelve tras la próxima versión.", "news.category.enhancement": "Mejora", - "news.category.feature": "Función", - "news.category.integration": "Integración", - "news.category.newFeature": "Nueva función", - "news.category.billing": "Facturación", - "news.uxImprovements.description": "Usabilidad mejorada con controles del tour, mejoras de API y mejor navegación.", + "news.category.feature": "Función", + "news.category.integration": "Integración", + "news.category.newFeature": "Nueva función", + "news.category.billing": "Facturación", + "news.uxImprovements.description": "Usabilidad mejorada con controles del tour, mejoras de API y mejor navegación.", "news.uxImprovements.f1": "Omitir/ocultar el tour guiado", "news.uxImprovements.f2": "Mejoras de fiabilidad de la API", - "news.uxImprovements.f3": "Navegación de interfaz mejorada", + "news.uxImprovements.f3": "Navegación de interfaz mejorada", "news.uxImprovements.f4": "Mayor eficiencia del flujo de trabajo", - "news.multiselect.title": "Soporte de atributos multiselección", + "news.multiselect.title": "Soporte de atributos multiselección", "news.multiselect.description": "Los productos pueden tener varios valores en atributos de tipo lista.", - "news.multiselect.f1": "Tipo de atributo multiselección", - "news.multiselect.f2": "Selección múltiple al editar productos", + "news.multiselect.f1": "Tipo de atributo multiselección", + "news.multiselect.f2": "Selección múltiple al editar productos", "news.multiselect.f3": "Varios valores en un solo atributo", - "news.multiselect.f4": "Extracción mejorada para campos multiselección", - "news.multiselect.f5": "Mejor compatibilidad con feeds de exportación", + "news.multiselect.f4": "Extracción mejorada para campos multiselección", + "news.multiselect.f5": "Mejor compatibilidad con feeds de exportación", "news.csvEan.title": "Carga CSV de EAN", - "news.csvEan.description": "Sube CSV con códigos EAN para procesar cientos de productos a la vez.", + "news.csvEan.description": "Sube CSV con códigos EAN para procesar cientos de productos a la vez.", "news.csvEan.f1": "Carga CSV con arrastrar y soltar", - "news.csvEan.f2": "Validación de formato EAN (EAN-8, EAN-13, UPC-12, GTIN-14)", - "news.csvEan.f3": "Detección automática de duplicados", + "news.csvEan.f2": "Validación de formato EAN (EAN-8, EAN-13, UPC-12, GTIN-14)", + "news.csvEan.f3": "Detección automática de duplicados", "news.csvEan.f4": "Procesamiento masivo de productos", - "news.csvEan.f5": "Estadísticas detalladas de procesamiento", - "news.brick.title": "Soporte de atributos con código BRICK", - "news.brick.description": "Sistema de atributos con códigos BRICK para clasificación y exportación estandarizadas.", - "news.brick.f1": "Gestión de atributos con código BRICK", - "news.brick.f2": "Formato automático de códigos en exportaciones", - "news.brick.f3": "Integración de códigos BRICK en feeds XML", - "news.brick.f4": "Mejoras de compatibilidad de feeds de exportación", + "news.csvEan.f5": "Estadísticas detalladas de procesamiento", + "news.brick.title": "Soporte de atributos con código BRICK", + "news.brick.description": "Sistema de atributos con códigos BRICK para clasificación y exportación estandarizadas.", + "news.brick.f1": "Gestión de atributos con código BRICK", + "news.brick.f2": "Formato automático de códigos en exportaciones", + "news.brick.f3": "Integración de códigos BRICK en feeds XML", + "news.brick.f4": "Mejoras de compatibilidad de feeds de exportación", "news.apiV1.title": "Lanzamiento de API v1", - "news.apiV1.description": "Nuevos endpoints API v1 para categorías, atributos, feeds, productos y exportaciones.", + "news.apiV1.description": "Nuevos endpoints API v1 para categorías, atributos, feeds, productos y exportaciones.", "news.apiV1.f1": "Endpoints RESTful de la API v1", - "news.apiV1.f2": "Gestión de categorías y atributos", - "news.apiV1.f3": "Creación y gestión de feeds", - "news.apiV1.f4": "Procesamiento de productos vía API", - "news.apiV1.f5": "Acceso programático a feeds de exportación", - "news.apiV1.f6": "Autenticación y autorización", + "news.apiV1.f2": "Gestión de categorías y atributos", + "news.apiV1.f3": "Creación y gestión de feeds", + "news.apiV1.f4": "Procesamiento de productos vía API", + "news.apiV1.f5": "Acceso programático a feeds de exportación", + "news.apiV1.f6": "Autenticación y autorización", "news.feedFiltering.title": "Filtrado de feeds en productos", - "news.feedFiltering.description": "Página de productos con filtrado de feeds optimizado, estados de carga y mejor rendimiento.", + "news.feedFiltering.description": "Página de productos con filtrado de feeds optimizado, estados de carga y mejor rendimiento.", "news.feedFiltering.f1": "Filtrado de feeds mejorado", "news.feedFiltering.f2": "Estados de carga mejorados", "news.feedFiltering.f3": "Rendimiento de consultas optimizado", - "news.feedFiltering.f4": "Mejor manejo de la paginación", - "news.feedFiltering.f5": "Mejoras de la funcionalidad de exportación", - "news.exportFeeds.title": "Sistema de feeds de exportación", - "news.exportFeeds.description": "Sistema completo de feeds de exportación XML/CSV con configuraciones personalizadas.", - "news.exportFeeds.f1": "Formatos de exportación XML y CSV", + "news.feedFiltering.f4": "Mejor manejo de la paginación", + "news.feedFiltering.f5": "Mejoras de la funcionalidad de exportación", + "news.exportFeeds.title": "Sistema de feeds de exportación", + "news.exportFeeds.description": "Sistema completo de feeds de exportación XML/CSV con configuraciones personalizadas.", + "news.exportFeeds.f1": "Formatos de exportación XML y CSV", "news.exportFeeds.f2": "Mapeo personalizado de campos", - "news.exportFeeds.f3": "Vista previa de exportación", - "news.exportFeeds.f4": "Exportación de productos basada en trabajos", - "news.exportFeeds.f5": "Integración de datos EPREL", - "news.exportFeeds.f6": "URL públicas de feeds de exportación", - "news.woocommerce.title": "Integración WooCommerce", - "news.woocommerce.description": "Sincroniza productos, categorías y atributos con tiendas WooCommerce.", - "news.woocommerce.f1": "Configuración de credenciales de tienda", - "news.woocommerce.f2": "Mapeo de categorías y atributos", - "news.woocommerce.f3": "Sincronización bidireccional de productos", + "news.exportFeeds.f3": "Vista previa de exportación", + "news.exportFeeds.f4": "Exportación de productos basada en trabajos", + "news.exportFeeds.f5": "Integración de datos EPREL", + "news.exportFeeds.f6": "URL públicas de feeds de exportación", + "news.woocommerce.title": "Integración WooCommerce", + "news.woocommerce.description": "Sincroniza productos, categorías y atributos con tiendas WooCommerce.", + "news.woocommerce.f1": "Configuración de credenciales de tienda", + "news.woocommerce.f2": "Mapeo de categorías y atributos", + "news.woocommerce.f3": "Sincronización bidireccional de productos", "news.woocommerce.f4": "Opciones de estrategia de coincidencia", - "news.eprel.title": "Integración de etiquetas energéticas EPREL", - "news.eprel.description": "Integración con el registro europeo de etiquetado energético para obtener datos de eficiencia.", - "news.eprel.f1": "Procesamiento automático de ID EPREL", - "news.eprel.f2": "Recuperación de imágenes de etiqueta energética", - "news.eprel.f3": "Descargas de fichas energéticas del producto", - "news.eprel.f4": "Extracción de clase energética", - "news.eprel.f5": "Soporte multilingüe", - "news.aiCategorization.title": "Categorización de productos mejorada", - "news.aiCategorization.description": "Sistema de categorización IA con mejor precisión y soporte jerárquico.", - "news.aiCategorization.f1": "Navegación jerárquica de categorías", - "news.aiCategorization.f2": "Puntuación de confianza", - "news.aiCategorization.f3": "Soporte multilingüe", - "news.aiCategorization.f4": "Gestión automática de alternativas", - "news.standardFields.title": "Gestión de campos estándar", - "news.standardFields.description": "Gestiona campos de producto estándar con grupos, validación y valores por defecto.", - "news.standardFields.f1": "Organización por grupos de campos", + "news.eprel.title": "Integración de etiquetas energéticas EPREL", + "news.eprel.description": "Integración con el registro europeo de etiquetado energético para obtener datos de eficiencia.", + "news.eprel.f1": "Procesamiento automático de ID EPREL", + "news.eprel.f2": "Recuperación de imágenes de etiqueta energética", + "news.eprel.f3": "Descargas de fichas energéticas del producto", + "news.eprel.f4": "Extracción de clase energética", + "news.eprel.f5": "Soporte multilingüe", + "news.aiCategorization.title": "Categorización de productos mejorada", + "news.aiCategorization.description": "Sistema de categorización IA con mejor precisión y soporte jerárquico.", + "news.aiCategorization.f1": "Navegación jerárquica de categorías", + "news.aiCategorization.f2": "Puntuación de confianza", + "news.aiCategorization.f3": "Soporte multilingüe", + "news.aiCategorization.f4": "Gestión automática de alternativas", + "news.standardFields.title": "Gestión de campos estándar", + "news.standardFields.description": "Gestiona campos de producto estándar con grupos, validación y valores por defecto.", + "news.standardFields.f1": "Organización por grupos de campos", "news.standardFields.f2": "Campos de sistema y personalizados", - "news.standardFields.f3": "Reglas de validación de campos", + "news.standardFields.f3": "Reglas de validación de campos", "news.standardFields.f4": "Soporte de valores por defecto", - "news.standardFields.f5": "Configuración automática de campos", - "news.billingSystem.title": "Facturación basada en créditos", - "news.billingSystem.description": "Nuevo sistema de facturación por créditos con seguimiento de uso y opciones de pago flexibles.", - "news.billingSystem.f1": "Procesamiento basado en créditos", - "news.billingSystem.f2": "Analítica de uso", - "news.billingSystem.f3": "Ciclos de facturación flexibles", - "news.billingSystem.f4": "Gestión de métodos de pago", - "news.billingSystem.f5": "Generación de facturas", - "products.pageTitle": "Gestión de productos", - "products.pageDescriptionStoresBefore": "Gestiona, procesa y optimiza tu catálogo. Conecta una tienda o importa CSV vía", - "products.pageDescriptionBasic": "Gestiona, procesa y optimiza tu catálogo. Importa vía Feeds o sube un CSV.", - "products.keyboard.esc": "— cierra el panel de edición o los diálogos", - "products.keyboard.toggle": "— mostrar/ocultar este consejo", + "news.standardFields.f5": "Configuración automática de campos", + "news.billingSystem.title": "Facturación basada en créditos", + "news.billingSystem.description": "Nuevo sistema de facturación por créditos con seguimiento de uso y opciones de pago flexibles.", + "news.billingSystem.f1": "Procesamiento basado en créditos", + "news.billingSystem.f2": "Analítica de uso", + "news.billingSystem.f3": "Ciclos de facturación flexibles", + "news.billingSystem.f4": "Gestión de métodos de pago", + "news.billingSystem.f5": "Generación de facturas", + "products.pageTitle": "Gestión de productos", + "products.pageDescriptionStoresBefore": "Gestiona, procesa y optimiza tu catálogo. Conecta una tienda o importa CSV vía", + "products.pageDescriptionBasic": "Gestiona, procesa y optimiza tu catálogo. Importa vía Feeds o sube un CSV.", + "products.keyboard.esc": "— cierra el panel de edición o los diálogos", + "products.keyboard.toggle": "— mostrar/ocultar este consejo", "products.keyboard.reviewPrefix": "En el panel Needs Review:", "products.keyboard.acceptAll": "aceptar todo", "products.keyboard.rejectShort": "rechazar", - "products.keyboard.acceptFields": "aceptar nombre / descripción", + "products.keyboard.acceptFields": "aceptar nombre / descripción", "products.connectStore": "Conectar tienda", - "products.updating": "Actualizando…", + "products.updating": "Actualizando…", "products.needLinkedRaw": "Los productos seleccionados necesitan un producto en bruto vinculado para procesar.", "products.selectToProcess": "Selecciona al menos un producto para procesar.", "products.undoResetHint": "Deshacer devuelve el producto a sin procesar mediante restablecimiento.", @@ -4518,79 +4519,79 @@ export const es: MessageDict = { "products.field.discarded": "Enriquecimiento de {label} descartado.", "products.field.discardFailed": "No se pudo descartar {field}", "products.upgradeRequired": "Se requiere mejorar el plan", - "products.upgradeBody": "Esta función necesita un plan de pago o créditos de IA.", - "products.enrichment.rejectTitle": "¿Rechazar enriquecimiento?", - "products.enrichment.rejectSelectedTitle": "¿Rechazar productos seleccionados?", - "products.enrichment.resetTitle": "¿Restablecer a sin procesar?", - "products.selectedOnPage": "{count} seleccionados en esta página", - "products.selectionPageOnly": "Mostrando {shown} de {total} — la selección es solo esta página", - "products.edit.coverageHint": "Cuántos de Nombre, Descripción, Atributos y Categoría están presentes (feed o procesados).", + "products.upgradeBody": "Esta función necesita un plan de pago o créditos de IA.", + "products.enrichment.rejectTitle": "¿Rechazar enriquecimiento?", + "products.enrichment.rejectSelectedTitle": "¿Rechazar productos seleccionados?", + "products.enrichment.resetTitle": "¿Restablecer a sin procesar?", + "products.selectedOnPage": "{count} seleccionados en esta página", + "products.selectionPageOnly": "Mostrando {shown} de {total} — la selección es solo esta página", + "products.edit.coverageHint": "Cuántos de Nombre, Descripción, Atributos y Categoría están presentes (feed o procesados).", "products.edit.noEprelShort": "Sin EPREL", "products.edit.specs": "Especs", - "products.edit.reviewBannerBody": "Usa la pestaña Revisar para comparar originales vs IA. Atajos: A aceptar · R rechazar · Alt+1/2 campo · ⌘/Ctrl+Enter aceptar todo.", - "products.edit.whatsFilled": "Qué está completado", - "products.edit.legend": "Gris = ausente · Naranja = desde el feed · Verde = procesado", - "products.edit.updatedAgo": "· actualizado {relative}", + "products.edit.reviewBannerBody": "Usa la pestaña Revisar para comparar originales vs IA. Atajos: A aceptar · R rechazar · Alt+1/2 campo · ⌘/Ctrl+Enter aceptar todo.", + "products.edit.whatsFilled": "Qué está completado", + "products.edit.legend": "Gris = ausente · Naranja = desde el feed · Verde = procesado", + "products.edit.updatedAgo": "· actualizado {relative}", "products.edit.status": "Estado", "products.edit.noRawUpdate": "No raw producto update time", - "products.edit.feedSyncPart": "· sync de feed", - "products.edit.filledFields": "{filled} rellenados · {total} campos", + "products.edit.feedSyncPart": "· sync de feed", + "products.edit.filledFields": "{filled} rellenados · {total} campos", "products.edit.noMappedFields": "No mapped feed fields on this producto.", - "products.edit.emptyBadge": "Vacío", - "products.edit.coreBadge": "Núcleo", - "products.edit.feedAttrsHint": "Valores analizados del feed (especificaciones HTML, garantía, dimensiones, EPREL). Las claves se vinculan a attribute_key cuando es posible.", + "products.edit.emptyBadge": "Vacío", + "products.edit.coreBadge": "Núcleo", + "products.edit.feedAttrsHint": "Valores analizados del feed (especificaciones HTML, garantía, dimensiones, EPREL). Las claves se vinculan a attribute_key cuando es posible.", "products.edit.originalAttrs": "Atributos originales", "products.edit.aiAttrs": "Atributos IA / enriquecidos", "mapping.confidence.exact": "Exacto", "mapping.confidence.alias": "Alias", "mapping.confidence.fuzzy": "Aproximado", - "field.group.basic": "Información básica", + "field.group.basic": "Información básica", "field.group.pricing": "Precios", "field.group.media": "Medios", - "field.group.taxonomy": "Taxonomía", + "field.group.taxonomy": "Taxonomía", "field.group.inventory": "Inventario", "field.group.attributes": "Atributos", - "field.group.shipping": "Envío", + "field.group.shipping": "Envío", "field.group.compliance": "Cumplimiento", "field.group.other": "Otro", - "common.yes": "Sí", + "common.yes": "Sí", "common.no": "No", - "status.running": "En ejecución", - "flash.admin.analyticsLoadFailed": "No se pudieron cargar las analíticas", - "flash.admin.diagnosticsLoadFailed": "No se pudieron cargar los diagnósticos", - "flash.admin.diagnosticsUnavailable": "Los diagnósticos no están disponibles en este despliegue. Contacta al administrador de la plataforma.", - "flash.admin.diagnosticsUnreachable": "No se pudo alcanzar la API de diagnósticos. Comprueba que la API esté en marcha y que PUBLIC_API_URL / el proxy de Vite apunten a ella.", - "admin.charts.statusEmpty": "Aún no hay filas en este desglose.", - "admin.charts.seriesEmpty": "Aún no hay datos en este periodo.", + "status.running": "En ejecución", + "flash.admin.analyticsLoadFailed": "No se pudieron cargar las analíticas", + "flash.admin.diagnosticsLoadFailed": "No se pudieron cargar los diagnósticos", + "flash.admin.diagnosticsUnavailable": "Los diagnósticos no están disponibles en este despliegue. Contacta al administrador de la plataforma.", + "flash.admin.diagnosticsUnreachable": "No se pudo alcanzar la API de diagnósticos. Comprueba que la API esté en marcha y que PUBLIC_API_URL / el proxy de Vite apunten a ella.", + "admin.charts.statusEmpty": "Aún no hay filas en este desglose.", + "admin.charts.seriesEmpty": "Aún no hay datos en este periodo.", "admin.charts.primaryDefault": "Principal", - "admin.charts.statusAria": "Distribución por estado", - "admin.charts.seriesAria": "Gráfico de {label}", - "admin.analytics.lastNDaysAria": "Últimos {days} días", + "admin.charts.statusAria": "Distribución por estado", + "admin.charts.seriesAria": "Gráfico de {label}", + "admin.analytics.lastNDaysAria": "Últimos {days} días", "admin.analytics.overview": "Resumen", - "admin.analytics.overviewHint": "Totales de la plataforma con contexto del periodo de los últimos {days} días.", - "admin.analytics.tokensInPeriod": "{tokens} en el periodo · de productos procesados", + "admin.analytics.overviewHint": "Totales de la plataforma con contexto del periodo de los últimos {days} días.", + "admin.analytics.tokensInPeriod": "{tokens} en el periodo · de productos procesados", "admin.analytics.creditsRemainingOf": "{remaining} restantes de {allocated} asignados", - "admin.analytics.noJobsYet": "Aún no hay trabajos", - "admin.analytics.feedsVolume": "{input} de entrada · {export} feeds de exportación", - "admin.analytics.usersCompaniesRaw": "{users} usuarios · {companies} empresas · {raw} en bruto", + "admin.analytics.noJobsYet": "Aún no hay trabajos", + "admin.analytics.feedsVolume": "{input} de entrada · {export} feeds de exportación", + "admin.analytics.usersCompaniesRaw": "{users} usuarios · {companies} empresas · {raw} en bruto", "admin.analytics.operations": "Operaciones", - "admin.analytics.operationsHint": "Señales de fiabilidad, claves y crecimiento del periodo seleccionado.", - "admin.analytics.failedCompleted": "{failed} fallidos · {completed} completados", - "admin.analytics.runningOver2h": "En ejecución > 2 h ·", + "admin.analytics.operationsHint": "Señales de fiabilidad, claves y crecimiento del periodo seleccionado.", + "admin.analytics.failedCompleted": "{failed} fallidos · {completed} completados", + "admin.analytics.runningOver2h": "En ejecución > 2 h ·", "admin.analytics.apiKeysTotal": "{total} en total (incluidas las revocadas)", - "admin.analytics.signupsDetail": "usuarios · {companies} empresas · {tickets} tickets abiertos/pendientes", + "admin.analytics.signupsDetail": "usuarios · {companies} empresas · {tickets} tickets abiertos/pendientes", "admin.analytics.providerMix": "Mix de proveedores", - "admin.analytics.providerMixHint": "Gasto de tokens según cómo se configuran las credenciales de IA.", - "admin.analytics.productsJobs": "{products} productos · {jobs} trabajos", + "admin.analytics.providerMixHint": "Gasto de tokens según cómo se configuran las credenciales de IA.", + "admin.analytics.productsJobs": "{products} productos · {jobs} trabajos", "admin.analytics.trends": "Tendencias", "admin.analytics.trendsHint": "Series diarias de tokens, proveedores, trabajos y registros.", - "admin.analytics.tokensByDayHint": "Tokens del procesamiento de productos completado (secundaria = productos ese día)", + "admin.analytics.tokensByDayHint": "Tokens del procesamiento de productos completado (secundaria = productos ese día)", "admin.analytics.seriesTokens": "Fichas", "admin.analytics.seriesProducts": "Productos", "admin.analytics.emptyTokens": "No hay productos procesados con tokens en este periodo.", - "admin.analytics.tokensByProviderHint": "División diaria: interno / popular / personalizado (por tipo de proveedor)", - "admin.analytics.emptyProviderTokens": "Aún no hay tokens etiquetados por proveedor en este periodo.", - "admin.analytics.providerDayTip": "{date}: Interno {internal} · Popular {popular} · Personalizado {custom}", + "admin.analytics.tokensByProviderHint": "División diaria: interno / popular / personalizado (por tipo de proveedor)", + "admin.analytics.emptyProviderTokens": "Aún no hay tokens etiquetados por proveedor en este periodo.", + "admin.analytics.providerDayTip": "{date}: Interno {internal} · Popular {popular} · Personalizado {custom}", "admin.analytics.seriesCreated": "Creado", "admin.analytics.seriesFailed": "Fallido", "admin.analytics.emptyJobsSeries": "No se crearon trabajos de procesamiento en este periodo.", @@ -4598,53 +4599,53 @@ export const es: MessageDict = { "admin.analytics.seriesCompanies": "Empresas", "admin.analytics.emptySignups": "No hay registros de usuarios ni empresas en este periodo.", "admin.analytics.statusMix": "Mezcla de estados", - "admin.analytics.statusMixHint": "Colas históricas de trabajos, sincronización de feeds y soporte.", + "admin.analytics.statusMixHint": "Colas históricas de trabajos, sincronización de feeds y soporte.", "admin.analytics.jobStatus": "Estado de trabajos", "admin.analytics.feedSyncQueue": "Cola de sync de feeds", "admin.analytics.supportTickets": "Tickets de soporte", - "admin.analytics.emptyJobStatus": "Aún no hay trabajos de procesamiento.", - "admin.analytics.emptyFeedSync": "Aún no hay trabajos de sync de feeds.", - "admin.analytics.emptyTickets": "Aún no hay tickets de soporte.", + "admin.analytics.emptyJobStatus": "Aún no hay trabajos de procesamiento.", + "admin.analytics.emptyFeedSync": "Aún no hay trabajos de sync de feeds.", + "admin.analytics.emptyTickets": "Aún no hay tickets de soporte.", "admin.analytics.usageDetail": "Detalle de uso", - "admin.analytics.usageDetailHint": "Modos de proveedor, principales empresas y resúmenes de ciclo de facturación.", + "admin.analytics.usageDetailHint": "Modos de proveedor, principales empresas y resúmenes de ciclo de facturación.", "admin.analytics.companyUsage": "Uso por empresa", "admin.analytics.jobsCol": "Trabajos", - "admin.analytics.billingCycles": "Facturación cycles", - "admin.analytics.billingCyclesHint": "Resúmenes históricos de ciclos de facturación pasados (pueden retrasarse respecto a la suscripción activa)", - "admin.analytics.periodCol": "Período", - "admin.analytics.creditsCol": "Créditos", + "admin.analytics.billingCycles": "Facturación cycles", + "admin.analytics.billingCyclesHint": "Resúmenes históricos de ciclos de facturación pasados (pueden retrasarse respecto a la suscripción activa)", + "admin.analytics.periodCol": "Período", + "admin.analytics.creditsCol": "Créditos", "admin.analytics.dataNotes": "Notas de datos", "admin.diagnostics.endpointNotMounted": "Endpoint no montado", - "admin.diagnostics.noPayload": "Sin datos de diagnóstico", - "admin.diagnostics.unavailableShort": "Los diagnósticos no están disponibles en este despliegue.", + "admin.diagnostics.noPayload": "Sin datos de diagnóstico", + "admin.diagnostics.unavailableShort": "Los diagnósticos no están disponibles en este despliegue.", "admin.diagnostics.fixThenRefresh": "Corrige el error de arriba y luego actualiza.", - "admin.diagnostics.refreshOrConfirm": "Actualiza o confirma que la API está en buen estado.", + "admin.diagnostics.refreshOrConfirm": "Actualiza o confirma que la API está en buen estado.", "admin.diagnostics.systemStatus": "Estado del sistema", - "admin.diagnostics.snapshot": "Instantánea {when}", + "admin.diagnostics.snapshot": "Instantánea {when}", "admin.diagnostics.queueTotal": "{total} en total", - "admin.diagnostics.queueStuck": "processing_jobs · atascados en ejecución (>2 h):", + "admin.diagnostics.queueStuck": "processing_jobs · atascados en ejecución (>2 h):", "admin.diagnostics.driver": "Controlador: {driver}", "admin.diagnostics.openStuck": "Abrir productos atascados", - "admin.diagnostics.configPresence": "Presencia de configuración", - "admin.diagnostics.configHint": "Solo booleanos · env {env} · RPM {rpm} · lote {batch} · reintentos {retries}", - "admin.diagnostics.cutoverTitle": "Preparación de cutover", - "admin.diagnostics.cutoverHint": "Solo banderas de presencia — pistas de versión goose, antigüedad del worker, planes faltantes. Sin Stripe/SMTP en vivo.", + "admin.diagnostics.configPresence": "Presencia de configuración", + "admin.diagnostics.configHint": "Solo booleanos · env {env} · RPM {rpm} · lote {batch} · reintentos {retries}", + "admin.diagnostics.cutoverTitle": "Preparación de cutover", + "admin.diagnostics.cutoverHint": "Solo banderas de presencia — pistas de versión goose, antigüedad del worker, planes faltantes. Sin Stripe/SMTP en vivo.", "admin.diagnostics.cutoverGoose": "Goose", - "admin.diagnostics.cutoverGooseVersion": "version_max {max} · esperado ≥ {min}", + "admin.diagnostics.cutoverGooseVersion": "version_max {max} · esperado ≥ {min}", "admin.diagnostics.cutoverGooseRequired": "Migraciones requeridas", "admin.diagnostics.cutoverWorker": "Worker", - "admin.diagnostics.cutoverWorkerAge": "visto hace {age}s · obsoleto tras {stale}s", - "admin.diagnostics.cutoverWorkerAgeUnknown": "antigüedad no disponible · obsoleto tras {stale}s", + "admin.diagnostics.cutoverWorkerAge": "visto hace {age}s · obsoleto tras {stale}s", + "admin.diagnostics.cutoverWorkerAgeUnknown": "antigüedad no disponible · obsoleto tras {stale}s", "admin.diagnostics.cutoverPlansMissing": "Empresas sin plan", "admin.diagnostics.cutoverPlansUnavailable": "Conteo de planes no disponible", "admin.diagnostics.cutoverApiKeysMissing": "Companies without API keys", "admin.diagnostics.cutoverApiKeysUnavailable": "API key inventory unavailable", - "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", + "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", "admin.diagnostics.cutoverApiKeysLink": "List companies needing reissue", "admin.diagnostics.cutoverApplied": "aplicada", "admin.diagnostics.cutoverPending": "pendiente", "admin.diagnostics.etlInventoryTitle": "ETL gap inventory", - "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", + "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", "admin.diagnostics.etlInventoryFiles": "Files metadata-only", "admin.diagnostics.etlInventoryFilesDetail": "metadata-only / total file rows", "admin.diagnostics.etlInventoryJobs": "Jobs migrated tag", @@ -4654,21 +4655,21 @@ export const es: MessageDict = { "admin.diagnostics.etlInventoryTasksDetail": "legacy task history present in Postgres", "admin.diagnostics.recentJobs": "Trabajos recientes", "admin.diagnostics.recentAiFailures": "Fallos recientes de IA de soporte", - "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", + "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", "admin.diagnostics.relatedTools": "Herramientas ops relacionadas", "admin.diagnostics.toolStuckTitle": "Productos atascados", - "admin.diagnostics.toolStuckDesc": "Limpiar trabajos en ejecución más de 2 horas.", + "admin.diagnostics.toolStuckDesc": "Limpiar trabajos en ejecución más de 2 horas.", "admin.diagnostics.toolOrphanTitle": "Orphan processed", - "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", - "admin.diagnostics.toolAnalyticsTitle": "Analíticas", - "admin.diagnostics.toolAnalyticsDesc": "Tendencias y gráficos de uso de la plataforma.", + "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", + "admin.diagnostics.toolAnalyticsTitle": "Analíticas", + "admin.diagnostics.toolAnalyticsDesc": "Tendencias y gráficos de uso de la plataforma.", "admin.diagnostics.toolBootstrapTitle": "Bootstrap", "admin.diagnostics.toolBootstrapDesc": "Confirmar acceso de administrador de plataforma para esta cuenta.", - "admin.diagnostics.toolSettingsTitle": "Configuración", + "admin.diagnostics.toolSettingsTitle": "Configuración", "admin.diagnostics.toolSettingsDesc": "Correo, IA y modo del sistema de la plataforma.", "admin.diagnostics.config.maintenance_mode": "Modo mantenimiento", "admin.diagnostics.config.read_only_mode": "Modo solo lectura", - "admin.diagnostics.config.session_secure": "Cookie de sesión segura", + "admin.diagnostics.config.session_secure": "Cookie de sesión segura", "admin.diagnostics.config.smtp_enabled": "SMTP activado", "admin.diagnostics.config.email_dry_run": "Email dry-run", "admin.diagnostics.config.smtp_host_set": "Host SMTP configurado", @@ -4677,225 +4678,225 @@ export const es: MessageDict = { "admin.diagnostics.config.upload_dir_configured": "Directorio de subida configurado", "admin.diagnostics.config.trusted_proxies_configured": "Proxies de confianza definidos", "admin.diagnostics.config.web_origin_set": "Origen web definido", - "admin.diagnostics.config.public_api_url_set": "URL pública de API definida", + "admin.diagnostics.config.public_api_url_set": "URL pública de API definida", "admin.diagnostics.config.token_signing_secret_set": "Secreto de firma de tokens definido", "admin.diagnostics.config.openai_key_set": "Clave OpenAI definida", "admin.diagnostics.config.pinecone_key_set": "Clave Pinecone definida", "admin.diagnostics.config.stripe_secret_set": "Secreto Stripe definido", "admin.diagnostics.config.stripe_webhook_secret_set": "Secreto de webhook Stripe definido", - "admin.diagnostics.config.stripe_mock_rejected_in_prod": "Mock de Stripe rechazado en producción", + "admin.diagnostics.config.stripe_mock_rejected_in_prod": "Mock de Stripe rechazado en producción", "admin.diagnostics.config.credentials_encryption_key_set": "Clave de cifrado de credenciales definida", "categories.selectAll": "Seleccionar todo", "categories.selectedCount": "{count} seleccionados", - "categories.noMatchingCategories": "No hay categorías coincidentes", - "categories.assigningProgress": "Asignando… {progress}%", + "categories.noMatchingCategories": "No hay categorías coincidentes", + "categories.assigningProgress": "Asignando… {progress}%", "categories.assignToCount": "Asignar a {count}", - "categories.aiPromptSavedForCategory": "Hay un prompt de generación con IA guardado para esta categoría.", - "categories.titleAndDescriptionFormulasSaved": "Las fórmulas de título y descripción están guardadas para esta categoría.", - "categories.titleFormulaSavedForCategory": "Hay una fórmula de título guardada para esta categoría.", - "categories.descriptionFormulaSavedForCategory": "Hay una fórmula de descripción guardada para esta categoría.", + "categories.aiPromptSavedForCategory": "Hay un prompt de generación con IA guardado para esta categoría.", + "categories.titleAndDescriptionFormulasSaved": "Las fórmulas de título y descripción están guardadas para esta categoría.", + "categories.titleFormulaSavedForCategory": "Hay una fórmula de título guardada para esta categoría.", + "categories.descriptionFormulaSavedForCategory": "Hay una fórmula de descripción guardada para esta categoría.", "site.account": "Cuenta", "site.goToApp": "Ir a la app", - "site.logIn": "Iniciar sesión", + "site.logIn": "Iniciar sesión", "site.getStarted": "Empezar", "site.nav.primary": "Principal", - "site.nav.mobile": "Móvil", + "site.nav.mobile": "Móvil", "site.nav.home": "Inicio", "site.nav.pricing": "Precios", "site.nav.apiDocs": "Docs de la API", - "seo.home.title": "Descrybe — Convierte feeds de proveedores en fichas de producto listas", - "seo.home.description": "Conecta feeds CSV o XML de proveedores, asígnalos a tus categorías y atributos, genera títulos y descripciones según tus reglas y exporta o sincroniza con WooCommerce.", - "seo.pricing.title": "Precios — Free, Starter, Growth, Business | Descrybe", - "seo.pricing.description": "Empieza gratis con 100 productos y mapeo de feeds. Los planes de pago añaden títulos y descripciones con IA, más SKU, feeds de exportación y sync WooCommerce — desde 49 $/mes. Enterprise para catálogos ilimitados.", - "seo.privacy.title": "Política de privacidad | Descrybe", - "seo.privacy.description": "Cómo Descrybe recopila, usa y protege los datos de cuenta, catálogos de productos y feeds de proveedores cuando utilizas nuestra plataforma de datos de producto.", - "seo.terms.title": "Términos del servicio | Descrybe", - "seo.terms.description": "Términos de uso de Descrybe: importación de feeds, enriquecimiento de catálogo, contenido asistido por IA, exportaciones y sincronización con WooCommerce para tu negocio.", - "seo.features.title": "Funciones — Feeds, enriquecimiento y exportación | Descrybe", - "seo.features.description": "Descubre cómo Descrybe importa feeds de proveedores, mapea campos a tu taxonomía, enriquece datos de producto y envía catálogos mediante feeds de exportación, WooCommerce o API.", + "seo.home.title": "Descrybe — Convierte feeds de proveedores en fichas de producto listas", + "seo.home.description": "Conecta feeds CSV o XML de proveedores, asígnalos a tus categorías y atributos, genera títulos y descripciones según tus reglas y exporta o sincroniza con WooCommerce.", + "seo.pricing.title": "Precios — Free, Starter, Growth, Business | Descrybe", + "seo.pricing.description": "Empieza gratis con 100 productos y mapeo de feeds. Los planes de pago añaden títulos y descripciones con IA, más SKU, feeds de exportación y sync WooCommerce — desde 49 $/mes. Enterprise para catálogos ilimitados.", + "seo.privacy.title": "Política de privacidad | Descrybe", + "seo.privacy.description": "Cómo Descrybe recopila, usa y protege los datos de cuenta, catálogos de productos y feeds de proveedores cuando utilizas nuestra plataforma de datos de producto.", + "seo.terms.title": "Términos del servicio | Descrybe", + "seo.terms.description": "Términos de uso de Descrybe: importación de feeds, enriquecimiento de catálogo, contenido asistido por IA, exportaciones y sincronización con WooCommerce para tu negocio.", + "seo.features.title": "Funciones — Feeds, enriquecimiento y exportación | Descrybe", + "seo.features.description": "Descubre cómo Descrybe importa feeds de proveedores, mapea campos a tu taxonomía, enriquece datos de producto y envía catálogos mediante feeds de exportación, WooCommerce o API.", "pricing.page.eyebrow": "Precios", - "pricing.page.title": "Planes sencillos para catálogos en crecimiento", - "pricing.page.lead": "Empieza gratis con mapeo de feeds y limpieza básica. Mejora cuando necesites títulos y descripciones con IA, más productos, feeds de exportación o sincronización con WooCommerce — de Starter a Enterprise.", - "pricing.page.subscribedBefore": "¿Ya estás suscrito? Gestiona el uso en", + "pricing.page.title": "Planes sencillos para catálogos en crecimiento", + "pricing.page.lead": "Empieza gratis con mapeo de feeds y limpieza básica. Mejora cuando necesites títulos y descripciones con IA, más productos, feeds de exportación o sincronización con WooCommerce — de Starter a Enterprise.", + "pricing.page.subscribedBefore": "¿Ya estás suscrito? Gestiona el uso en", "pricing.page.subscribedMid": "o compara planes en", "pricing.page.plansLink": "Planes", "pricing.page.subscribedAfter": ".", - "legal.lastUpdated": "Última actualización: {date}", - "legal.backHome": "← Volver al inicio", - "legal.emailLabel": "Correo electrónico:", - "legal.postalLabel": "Dirección postal:", - "legal.privacy.title": "Política de privacidad", - "legal.privacy.intro.h": "Introducción", - "legal.privacy.intro.p1": "En Descrybe (\"nosotros\", \"nuestro\" o \"nos\"), respetamos su privacidad y nos comprometemos a proteger su información personal. Esta Política de privacidad explica cómo recopilamos, usamos, divulgamos y protegemos su información cuando utiliza la plataforma de datos de producto de Descrybe y los servicios relacionados (en conjunto, los \"Servicios\").", - "legal.privacy.intro.p2": "Al acceder o utilizar nuestros Servicios, usted acepta las prácticas descritas en esta Política de privacidad. Si no está de acuerdo con las políticas y prácticas aquí descritas, no utilice nuestros Servicios.", - "legal.privacy.collect.h": "Información que recopilamos", - "legal.privacy.collect.lead": "Recopilamos varios tipos de información de y sobre los usuarios de nuestros Servicios, entre ellos:", - "legal.privacy.collect.personal.h": "Información personal", - "legal.privacy.collect.personal.p": "Cuando se registra para obtener una cuenta, recopilamos información que podría usarse para identificarle, como su nombre, dirección de correo electrónico, número de teléfono, nombre de la empresa e información de facturación. Recopilamos esta información directamente de usted cuando nos la facilita.", + "legal.lastUpdated": "Última actualización: {date}", + "legal.backHome": "← Volver al inicio", + "legal.emailLabel": "Correo electrónico:", + "legal.postalLabel": "Dirección postal:", + "legal.privacy.title": "Política de privacidad", + "legal.privacy.intro.h": "Introducción", + "legal.privacy.intro.p1": "En Descrybe (\"nosotros\", \"nuestro\" o \"nos\"), respetamos su privacidad y nos comprometemos a proteger su información personal. Esta Política de privacidad explica cómo recopilamos, usamos, divulgamos y protegemos su información cuando utiliza la plataforma de datos de producto de Descrybe y los servicios relacionados (en conjunto, los \"Servicios\").", + "legal.privacy.intro.p2": "Al acceder o utilizar nuestros Servicios, usted acepta las prácticas descritas en esta Política de privacidad. Si no está de acuerdo con las políticas y prácticas aquí descritas, no utilice nuestros Servicios.", + "legal.privacy.collect.h": "Información que recopilamos", + "legal.privacy.collect.lead": "Recopilamos varios tipos de información de y sobre los usuarios de nuestros Servicios, entre ellos:", + "legal.privacy.collect.personal.h": "Información personal", + "legal.privacy.collect.personal.p": "Cuando se registra para obtener una cuenta, recopilamos información que podría usarse para identificarle, como su nombre, dirección de correo electrónico, número de teléfono, nombre de la empresa e información de facturación. Recopilamos esta información directamente de usted cuando nos la facilita.", "legal.privacy.collect.userData.h": "Datos de usuario", - "legal.privacy.collect.userData.p": "Para prestar nuestros Servicios, recopilamos y tratamos datos de producto, feeds de proveedores, descripciones de producto y otro contenido que usted carga, introduce o envía de otro modo a nuestra plataforma. Esto puede incluir atributos de producto, estructuras de taxonomía, plantillas y otros datos necesarios para el funcionamiento de nuestros Servicios.", - "legal.privacy.collect.usage.h": "Información de uso", - "legal.privacy.collect.usage.p": "Recopilamos automáticamente cierta información sobre su dispositivo y cómo interactúa con nuestros Servicios, incluida la dirección IP, el tipo de dispositivo, el tipo de navegador, el sistema operativo, las horas de acceso, las páginas vistas, las funciones utilizadas y otra actividad del sistema. Usamos esta información para mejorar nuestros Servicios y la experiencia de usuario.", - "legal.privacy.collect.cookies.h": "Cookies y tecnologías de seguimiento", - "legal.privacy.collect.cookies.p": "Utilizamos cookies, balizas web y tecnologías de seguimiento similares para recopilar información sobre sus actividades de navegación en nuestro sitio web. Puede controlar las cookies mediante la configuración de su navegador y otras herramientas. No obstante, si bloquea determinadas cookies, es posible que no pueda utilizar todas las funciones de nuestros Servicios.", - "legal.privacy.use.h": "Cómo usamos su información", - "legal.privacy.use.lead": "Usamos la información que recopilamos para diversos fines, entre ellos:", + "legal.privacy.collect.userData.p": "Para prestar nuestros Servicios, recopilamos y tratamos datos de producto, feeds de proveedores, descripciones de producto y otro contenido que usted carga, introduce o envía de otro modo a nuestra plataforma. Esto puede incluir atributos de producto, estructuras de taxonomía, plantillas y otros datos necesarios para el funcionamiento de nuestros Servicios.", + "legal.privacy.collect.usage.h": "Información de uso", + "legal.privacy.collect.usage.p": "Recopilamos automáticamente cierta información sobre su dispositivo y cómo interactúa con nuestros Servicios, incluida la dirección IP, el tipo de dispositivo, el tipo de navegador, el sistema operativo, las horas de acceso, las páginas vistas, las funciones utilizadas y otra actividad del sistema. Usamos esta información para mejorar nuestros Servicios y la experiencia de usuario.", + "legal.privacy.collect.cookies.h": "Cookies y tecnologías de seguimiento", + "legal.privacy.collect.cookies.p": "Utilizamos cookies, balizas web y tecnologías de seguimiento similares para recopilar información sobre sus actividades de navegación en nuestro sitio web. Puede controlar las cookies mediante la configuración de su navegador y otras herramientas. No obstante, si bloquea determinadas cookies, es posible que no pueda utilizar todas las funciones de nuestros Servicios.", + "legal.privacy.use.h": "Cómo usamos su información", + "legal.privacy.use.lead": "Usamos la información que recopilamos para diversos fines, entre ellos:", "legal.privacy.use.li1": "Prestar, mantener y mejorar nuestros Servicios", - "legal.privacy.use.li2": "Procesar transacciones y enviar información relacionada, incluidas confirmaciones, facturas y notificaciones del servicio", + "legal.privacy.use.li2": "Procesar transacciones y enviar información relacionada, incluidas confirmaciones, facturas y notificaciones del servicio", "legal.privacy.use.li3": "Desarrollar nuevos productos, servicios, funciones y funcionalidades", "legal.privacy.use.li4": "Personalizar su experiencia y ofrecer contenido y funciones relevantes para sus intereses", "legal.privacy.use.li5": "Responder a sus solicitudes, comentarios y preguntas", - "legal.privacy.use.li6": "Enviarle avisos técnicos, actualizaciones, alertas de seguridad y mensajes de soporte y administración", - "legal.privacy.use.li7": "Supervisar y analizar tendencias, uso y actividades en relación con nuestros Servicios", + "legal.privacy.use.li6": "Enviarle avisos técnicos, actualizaciones, alertas de seguridad y mensajes de soporte y administración", + "legal.privacy.use.li7": "Supervisar y analizar tendencias, uso y actividades en relación con nuestros Servicios", "legal.privacy.use.li8": "Detectar, investigar y prevenir transacciones fraudulentas y otras actividades ilegales", - "legal.privacy.use.li9": "Proteger nuestros derechos, propiedad y seguridad, así como los derechos, la propiedad y la seguridad de nuestros usuarios u otras personas", - "legal.privacy.use.li10": "Cumplir obligaciones legales y hacer cumplir nuestros términos del servicio", - "legal.privacy.ai.h": "IA y aprendizaje automático", - "legal.privacy.ai.p1": "Nuestros Servicios utilizan tecnologías de inteligencia artificial y aprendizaje automático para procesar datos de producto, generar contenido y ofrecer otras funciones automatizadas. Los datos que usted proporciona a nuestros Servicios pueden usarse para entrenar y mejorar nuestros modelos de IA. No obstante, aplicamos salvaguardas adecuadas para proteger sus datos y mantener su confidencialidad.", - "legal.privacy.ai.p2": "No usamos información de identificación personal para entrenar nuestros modelos generales de IA sin su consentimiento explícito. Los datos de producto usados para el entrenamiento de IA se anonimizan y agregan siempre que sea posible.", - "legal.privacy.share.h": "Cómo compartimos su información", - "legal.privacy.share.lead": "Podemos compartir su información en las siguientes circunstancias:", + "legal.privacy.use.li9": "Proteger nuestros derechos, propiedad y seguridad, así como los derechos, la propiedad y la seguridad de nuestros usuarios u otras personas", + "legal.privacy.use.li10": "Cumplir obligaciones legales y hacer cumplir nuestros términos del servicio", + "legal.privacy.ai.h": "IA y aprendizaje automático", + "legal.privacy.ai.p1": "Nuestros Servicios utilizan tecnologías de inteligencia artificial y aprendizaje automático para procesar datos de producto, generar contenido y ofrecer otras funciones automatizadas. Los datos que usted proporciona a nuestros Servicios pueden usarse para entrenar y mejorar nuestros modelos de IA. No obstante, aplicamos salvaguardas adecuadas para proteger sus datos y mantener su confidencialidad.", + "legal.privacy.ai.p2": "No usamos información de identificación personal para entrenar nuestros modelos generales de IA sin su consentimiento explícito. Los datos de producto usados para el entrenamiento de IA se anonimizan y agregan siempre que sea posible.", + "legal.privacy.share.h": "Cómo compartimos su información", + "legal.privacy.share.lead": "Podemos compartir su información en las siguientes circunstancias:", "legal.privacy.share.providers.h": "Proveedores de servicios", - "legal.privacy.share.providers.p": "Podemos compartir su información con proveedores externos, prestadores de servicios, contratistas o agentes que realizan servicios en nuestro nombre, como el procesamiento de pagos, el análisis de datos, el envío de correo electrónico, el alojamiento, la atención al cliente y la asistencia de marketing.", + "legal.privacy.share.providers.p": "Podemos compartir su información con proveedores externos, prestadores de servicios, contratistas o agentes que realizan servicios en nuestro nombre, como el procesamiento de pagos, el análisis de datos, el envío de correo electrónico, el alojamiento, la atención al cliente y la asistencia de marketing.", "legal.privacy.share.transfers.h": "Transferencias empresariales", - "legal.privacy.share.transfers.p": "Si participamos en una fusión, adquisición, financiación, reorganización, quiebra o venta de activos de la empresa, su información puede transferirse como parte de esa operación. Le informaremos de cualquier cambio de este tipo en la titularidad o el control de su información personal.", + "legal.privacy.share.transfers.p": "Si participamos en una fusión, adquisición, financiación, reorganización, quiebra o venta de activos de la empresa, su información puede transferirse como parte de esa operación. Le informaremos de cualquier cambio de este tipo en la titularidad o el control de su información personal.", "legal.privacy.share.legal.h": "Requisitos legales", - "legal.privacy.share.legal.p": "Podemos divulgar su información si la ley lo exige o en respuesta a solicitudes válidas de autoridades públicas (p. ej., un tribunal o un organismo gubernamental). También podemos divulgar su información para hacer cumplir nuestros términos del servicio, proteger nuestros derechos, privacidad, seguridad o propiedad, y/o los de nuestras filiales, usuarios u otras personas.", + "legal.privacy.share.legal.p": "Podemos divulgar su información si la ley lo exige o en respuesta a solicitudes válidas de autoridades públicas (p. ej., un tribunal o un organismo gubernamental). También podemos divulgar su información para hacer cumplir nuestros términos del servicio, proteger nuestros derechos, privacidad, seguridad o propiedad, y/o los de nuestras filiales, usuarios u otras personas.", "legal.privacy.share.consent.h": "Con su consentimiento", - "legal.privacy.share.consent.p": "Podemos compartir su información con terceros cuando usted nos haya dado su consentimiento para ello.", + "legal.privacy.share.consent.p": "Podemos compartir su información con terceros cuando usted nos haya dado su consentimiento para ello.", "legal.privacy.security.h": "Seguridad de los datos", - "legal.privacy.security.p1": "Hemos implementado medidas técnicas y organizativas adecuadas diseñadas para proteger su información personal frente a la pérdida accidental y frente al acceso, uso, alteración y divulgación no autorizados. Toda la información que nos facilita se almacena en servidores seguros detrás de cortafuegos.", - "legal.privacy.security.p2": "La seguridad de su información también depende de usted. Cuando le hayamos facilitado (o usted haya elegido) una contraseña para acceder a determinadas partes de nuestros Servicios, usted es responsable de mantener esa contraseña en confidencialidad. Le pedimos que no comparta su contraseña con nadie.", - "legal.privacy.security.p3": "Lamentablemente, la transmisión de información a través de Internet no es completamente segura. Aunque hacemos todo lo posible por proteger su información personal, no podemos garantizar la seguridad de la información personal transmitida a nuestros Servicios. Cualquier transmisión de información personal se realiza bajo su propio riesgo.", + "legal.privacy.security.p1": "Hemos implementado medidas técnicas y organizativas adecuadas diseñadas para proteger su información personal frente a la pérdida accidental y frente al acceso, uso, alteración y divulgación no autorizados. Toda la información que nos facilita se almacena en servidores seguros detrás de cortafuegos.", + "legal.privacy.security.p2": "La seguridad de su información también depende de usted. Cuando le hayamos facilitado (o usted haya elegido) una contraseña para acceder a determinadas partes de nuestros Servicios, usted es responsable de mantener esa contraseña en confidencialidad. Le pedimos que no comparta su contraseña con nadie.", + "legal.privacy.security.p3": "Lamentablemente, la transmisión de información a través de Internet no es completamente segura. Aunque hacemos todo lo posible por proteger su información personal, no podemos garantizar la seguridad de la información personal transmitida a nuestros Servicios. Cualquier transmisión de información personal se realiza bajo su propio riesgo.", "legal.privacy.rights.h": "Sus derechos y opciones", - "legal.privacy.rights.lead": "Nos esforzamos por ofrecerle opciones respecto a la información personal que nos facilita. Según su ubicación, puede tener determinados derechos sobre su información personal, entre ellos:", - "legal.privacy.rights.li1": "Acceder y actualizar su información personal", - "legal.privacy.rights.li2": "Solicitar la eliminación de su información personal", - "legal.privacy.rights.li3": "Oponerse o restringir el tratamiento de su información personal", + "legal.privacy.rights.lead": "Nos esforzamos por ofrecerle opciones respecto a la información personal que nos facilita. Según su ubicación, puede tener determinados derechos sobre su información personal, entre ellos:", + "legal.privacy.rights.li1": "Acceder y actualizar su información personal", + "legal.privacy.rights.li2": "Solicitar la eliminación de su información personal", + "legal.privacy.rights.li3": "Oponerse o restringir el tratamiento de su información personal", "legal.privacy.rights.li4": "Portabilidad de los datos", "legal.privacy.rights.li5": "Retirar el consentimiento (cuando proceda)", - "legal.privacy.rights.footer": "Para ejercer sus derechos, póngase en contacto con nosotros usando la información de contacto que figura al final de esta Política de privacidad. Tenga en cuenta que algunos de estos derechos pueden estar limitados o no ser aplicables según su ubicación y las circunstancias concretas.", - "legal.privacy.retention.h": "Conservación de datos", - "legal.privacy.retention.p1": "Conservaremos su información personal durante el tiempo necesario para cumplir los fines descritos en esta Política de privacidad, salvo que la ley exija o permita un plazo de conservación más largo. Al determinar cuánto tiempo conservar su información, consideramos la cantidad, la naturaleza y la sensibilidad de la información, el riesgo potencial de daño por uso o divulgación no autorizados, los fines del tratamiento y los requisitos legales aplicables.", - "legal.privacy.retention.p2": "Podemos conservar cierta información después de que cierre su cuenta, entre otros fines para cumplir nuestras obligaciones legales, resolver disputas y hacer cumplir nuestros acuerdos.", + "legal.privacy.rights.footer": "Para ejercer sus derechos, póngase en contacto con nosotros usando la información de contacto que figura al final de esta Política de privacidad. Tenga en cuenta que algunos de estos derechos pueden estar limitados o no ser aplicables según su ubicación y las circunstancias concretas.", + "legal.privacy.retention.h": "Conservación de datos", + "legal.privacy.retention.p1": "Conservaremos su información personal durante el tiempo necesario para cumplir los fines descritos en esta Política de privacidad, salvo que la ley exija o permita un plazo de conservación más largo. Al determinar cuánto tiempo conservar su información, consideramos la cantidad, la naturaleza y la sensibilidad de la información, el riesgo potencial de daño por uso o divulgación no autorizados, los fines del tratamiento y los requisitos legales aplicables.", + "legal.privacy.retention.p2": "Podemos conservar cierta información después de que cierre su cuenta, entre otros fines para cumplir nuestras obligaciones legales, resolver disputas y hacer cumplir nuestros acuerdos.", "legal.privacy.intl.h": "Transferencias internacionales de datos", - "legal.privacy.intl.p1": "Su información personal puede transferirse y tratarse en países distintos del país en el que usted reside. Dichos países pueden tener leyes de protección de datos diferentes de las de su país.", - "legal.privacy.intl.p2": "Si transferimos su información personal a países fuera del Espacio Económico Europeo u otras regiones con leyes integrales de protección de datos, nos aseguraremos de que existan salvaguardas adecuadas para proteger su información personal y de que la transferencia cumpla la normativa aplicable en materia de protección de datos.", + "legal.privacy.intl.p1": "Su información personal puede transferirse y tratarse en países distintos del país en el que usted reside. Dichos países pueden tener leyes de protección de datos diferentes de las de su país.", + "legal.privacy.intl.p2": "Si transferimos su información personal a países fuera del Espacio Económico Europeo u otras regiones con leyes integrales de protección de datos, nos aseguraremos de que existan salvaguardas adecuadas para proteger su información personal y de que la transferencia cumpla la normativa aplicable en materia de protección de datos.", "legal.privacy.children.h": "Privacidad de los menores", - "legal.privacy.children.p": "Nuestros Servicios no están destinados a menores de 16 años, y no recopilamos a sabiendas información personal de menores de 16 años. Si descubrimos que hemos recopilado o recibido información personal de un menor de 16 años sin verificación del consentimiento parental, eliminaremos esa información. Si cree que podríamos tener información de o sobre un menor de 16 años, póngase en contacto con nosotros.", - "legal.privacy.changes.h": "Cambios en nuestra Política de privacidad", - "legal.privacy.changes.p1": "Podemos actualizar nuestra Política de privacidad de vez en cuando. Si realizamos cambios sustanciales en el modo en que tratamos la información personal de los usuarios, se lo notificaremos por correo electrónico a la dirección indicada en su cuenta y/o mediante un aviso en nuestro sitio web.", - "legal.privacy.changes.p2": "La fecha de la última revisión de la Política de privacidad se indica en la parte superior de la página. Usted es responsable de asegurarse de que disponemos de una dirección de correo electrónico actualizada, activa y susceptible de entrega, y de visitar periódicamente nuestro sitio web y esta Política de privacidad para comprobar si hay cambios.", + "legal.privacy.children.p": "Nuestros Servicios no están destinados a menores de 16 años, y no recopilamos a sabiendas información personal de menores de 16 años. Si descubrimos que hemos recopilado o recibido información personal de un menor de 16 años sin verificación del consentimiento parental, eliminaremos esa información. Si cree que podríamos tener información de o sobre un menor de 16 años, póngase en contacto con nosotros.", + "legal.privacy.changes.h": "Cambios en nuestra Política de privacidad", + "legal.privacy.changes.p1": "Podemos actualizar nuestra Política de privacidad de vez en cuando. Si realizamos cambios sustanciales en el modo en que tratamos la información personal de los usuarios, se lo notificaremos por correo electrónico a la dirección indicada en su cuenta y/o mediante un aviso en nuestro sitio web.", + "legal.privacy.changes.p2": "La fecha de la última revisión de la Política de privacidad se indica en la parte superior de la página. Usted es responsable de asegurarse de que disponemos de una dirección de correo electrónico actualizada, activa y susceptible de entrega, y de visitar periódicamente nuestro sitio web y esta Política de privacidad para comprobar si hay cambios.", "legal.privacy.contact.h": "Contacto", - "legal.privacy.contact.lead": "Si tiene preguntas o inquietudes sobre nuestra Política de privacidad o nuestras prácticas de datos, póngase en contacto con nosotros en:", - "legal.terms.title": "Términos del servicio", - "legal.terms.s1.h": "1. Aceptación de los términos", - "legal.terms.s1.p": "Al acceder o utilizar la plataforma de datos de producto de Descrybe y los servicios relacionados (en conjunto, los \"Servicios\"), usted acepta quedar vinculado por estos Términos del servicio y por todas las leyes y normativas aplicables. Si no está de acuerdo con alguno de estos términos, tiene prohibido usar o acceder a los Servicios.", + "legal.privacy.contact.lead": "Si tiene preguntas o inquietudes sobre nuestra Política de privacidad o nuestras prácticas de datos, póngase en contacto con nosotros en:", + "legal.terms.title": "Términos del servicio", + "legal.terms.s1.h": "1. Aceptación de los términos", + "legal.terms.s1.p": "Al acceder o utilizar la plataforma de datos de producto de Descrybe y los servicios relacionados (en conjunto, los \"Servicios\"), usted acepta quedar vinculado por estos Términos del servicio y por todas las leyes y normativas aplicables. Si no está de acuerdo con alguno de estos términos, tiene prohibido usar o acceder a los Servicios.", "legal.terms.s2.h": "2. Licencia de uso", - "legal.terms.s2.p1": "Sujeto al cumplimiento de estos Términos del servicio, Descrybe le otorga una licencia limitada, no exclusiva, intransferible y revocable para acceder y usar los Servicios con fines empresariales.", + "legal.terms.s2.p1": "Sujeto al cumplimiento de estos Términos del servicio, Descrybe le otorga una licencia limitada, no exclusiva, intransferible y revocable para acceder y usar los Servicios con fines empresariales.", "legal.terms.s2.lead": "Esta licencia no incluye:", - "legal.terms.s2.li1": "Modificar o copiar los Servicios ni ningún contenido de los mismos", + "legal.terms.s2.li1": "Modificar o copiar los Servicios ni ningún contenido de los mismos", "legal.terms.s2.li2": "Usar los Servicios con cualquier fin comercial distinto del uso empresarial autorizado", - "legal.terms.s2.li3": "Intentar descompilar o realizar ingeniería inversa de cualquier software contenido en los Servicios", + "legal.terms.s2.li3": "Intentar descompilar o realizar ingeniería inversa de cualquier software contenido en los Servicios", "legal.terms.s2.li4": "Eliminar cualquier aviso de derechos de autor o de propiedad de los materiales", "legal.terms.s2.li5": "Transferir los materiales a otra persona o \"reflejar\" los materiales en cualquier otro servidor", - "legal.terms.s2.p2": "Esta licencia se extinguirá automáticamente si usted incumple cualquiera de estas restricciones y podrá ser terminada por Descrybe en cualquier momento.", - "legal.terms.s3.h": "3. Suscripción y pago", - "legal.terms.s3.p1": "El acceso a los Servicios puede requerir una suscripción de pago. Los términos de pago se especificarán durante el proceso de suscripción. Todos los pagos son no reembolsables salvo que Descrybe lo especifique por escrito.", - "legal.terms.s3.p2": "Descrybe se reserva el derecho a modificar las tarifas de suscripción con un preaviso razonable. El uso continuado de los Servicios tras un cambio de tarifa constituye la aceptación de las nuevas tarifas.", + "legal.terms.s2.p2": "Esta licencia se extinguirá automáticamente si usted incumple cualquiera de estas restricciones y podrá ser terminada por Descrybe en cualquier momento.", + "legal.terms.s3.h": "3. Suscripción y pago", + "legal.terms.s3.p1": "El acceso a los Servicios puede requerir una suscripción de pago. Los términos de pago se especificarán durante el proceso de suscripción. Todos los pagos son no reembolsables salvo que Descrybe lo especifique por escrito.", + "legal.terms.s3.p2": "Descrybe se reserva el derecho a modificar las tarifas de suscripción con un preaviso razonable. El uso continuado de los Servicios tras un cambio de tarifa constituye la aceptación de las nuevas tarifas.", "legal.terms.s4.h": "4. Contenido del usuario", - "legal.terms.s4.p1": "Usted conserva todos los derechos sobre cualquier contenido que envíe, publique o muestre en o a través de los Servicios (\"Contenido del usuario\"). Al proporcionar Contenido del usuario a Descrybe, usted otorga a Descrybe una licencia mundial, no exclusiva y libre de regalías para usar, reproducir, modificar, adaptar, publicar, traducir y distribuir dicho contenido en relación con la prestación de los Servicios.", + "legal.terms.s4.p1": "Usted conserva todos los derechos sobre cualquier contenido que envíe, publique o muestre en o a través de los Servicios (\"Contenido del usuario\"). Al proporcionar Contenido del usuario a Descrybe, usted otorga a Descrybe una licencia mundial, no exclusiva y libre de regalías para usar, reproducir, modificar, adaptar, publicar, traducir y distribuir dicho contenido en relación con la prestación de los Servicios.", "legal.terms.s4.lead": "Usted declara y garantiza que:", "legal.terms.s4.li1": "Posee o controla todos los derechos sobre el Contenido del usuario que proporciona", - "legal.terms.s4.li2": "El Contenido del usuario no vulnera estos Términos del servicio", - "legal.terms.s4.li3": "El Contenido del usuario no causará daño a ninguna persona o entidad", + "legal.terms.s4.li2": "El Contenido del usuario no vulnera estos Términos del servicio", + "legal.terms.s4.li3": "El Contenido del usuario no causará daño a ninguna persona o entidad", "legal.terms.s5.h": "5. Inteligencia artificial", - "legal.terms.s5.p1": "Los Servicios utilizan tecnologías de inteligencia artificial y aprendizaje automático. Usted reconoce que el contenido generado por IA puede no ser perfecto y acepta revisar todo el contenido generado por IA antes de usarlo en sus operaciones empresariales.", - "legal.terms.s5.p2": "Descrybe puede usar Contenido del usuario anonimizado y agregado para entrenar y mejorar nuestros modelos de IA, con sujeción a nuestra Política de privacidad. Puede optar por no permitir que sus datos se usen para el entrenamiento de IA contactándonos.", + "legal.terms.s5.p1": "Los Servicios utilizan tecnologías de inteligencia artificial y aprendizaje automático. Usted reconoce que el contenido generado por IA puede no ser perfecto y acepta revisar todo el contenido generado por IA antes de usarlo en sus operaciones empresariales.", + "legal.terms.s5.p2": "Descrybe puede usar Contenido del usuario anonimizado y agregado para entrenar y mejorar nuestros modelos de IA, con sujeción a nuestra Política de privacidad. Puede optar por no permitir que sus datos se usen para el entrenamiento de IA contactándonos.", "legal.terms.s6.h": "6. Propiedad intelectual", - "legal.terms.s6.p": "Los Servicios y su contenido, funciones y funcionalidad originales son propiedad de Descrybe y están protegidos por las leyes internacionales de derechos de autor, marcas, patentes, secretos comerciales y otros derechos de propiedad intelectual o de propiedad.", - "legal.terms.s7.h": "7. Exención de garantías", - "legal.terms.s7.p1": "Los Servicios se proporcionan \"tal cual\" y \"según disponibilidad\". Descrybe no formula garantías, expresas o implícitas, y por la presente renuncia a todas las garantías, incluidas, sin limitación, las garantías implícitas de comerciabilidad, idoneidad para un fin determinado, no infracción o curso de ejecución.", + "legal.terms.s6.p": "Los Servicios y su contenido, funciones y funcionalidad originales son propiedad de Descrybe y están protegidos por las leyes internacionales de derechos de autor, marcas, patentes, secretos comerciales y otros derechos de propiedad intelectual o de propiedad.", + "legal.terms.s7.h": "7. Exención de garantías", + "legal.terms.s7.p1": "Los Servicios se proporcionan \"tal cual\" y \"según disponibilidad\". Descrybe no formula garantías, expresas o implícitas, y por la presente renuncia a todas las garantías, incluidas, sin limitación, las garantías implícitas de comerciabilidad, idoneidad para un fin determinado, no infracción o curso de ejecución.", "legal.terms.s7.p2": "Descrybe no garantiza que los Servicios funcionen de forma ininterrumpida, segura o disponible en un momento o lugar concretos, ni que se corrijan errores o defectos.", - "legal.terms.s8.h": "8. Limitación de responsabilidad", - "legal.terms.s8.lead": "En ningún caso Descrybe será responsable de daños indirectos, incidentales, especiales, consecuentes o punitivos, incluidos, sin limitación, la pérdida de beneficios, datos, uso, fondo de comercio u otras pérdidas intangibles, derivados de:", + "legal.terms.s8.h": "8. Limitación de responsabilidad", + "legal.terms.s8.lead": "En ningún caso Descrybe será responsable de daños indirectos, incidentales, especiales, consecuentes o punitivos, incluidos, sin limitación, la pérdida de beneficios, datos, uso, fondo de comercio u otras pérdidas intangibles, derivados de:", "legal.terms.s8.li1": "Su acceso o uso, o la imposibilidad de acceder o usar, los Servicios", "legal.terms.s8.li2": "Cualquier conducta o contenido de terceros en los Servicios", "legal.terms.s8.li3": "Cualquier contenido obtenido de los Servicios", - "legal.terms.s8.li4": "El acceso, uso o alteración no autorizados de sus transmisiones o contenido", - "legal.terms.s9.h": "9. Terminación", - "legal.terms.s9.p1": "Descrybe puede terminar o suspender su acceso a los Servicios de inmediato, sin previo aviso ni responsabilidad, por cualquier motivo, incluido, sin limitación, si usted incumple estos Términos del servicio.", - "legal.terms.s9.p2": "Tras la terminación, su derecho a usar los Servicios cesará de inmediato. Si desea terminar su cuenta, puede simplemente dejar de usar los Servicios o contactarnos para solicitar la eliminación de la cuenta.", + "legal.terms.s8.li4": "El acceso, uso o alteración no autorizados de sus transmisiones o contenido", + "legal.terms.s9.h": "9. Terminación", + "legal.terms.s9.p1": "Descrybe puede terminar o suspender su acceso a los Servicios de inmediato, sin previo aviso ni responsabilidad, por cualquier motivo, incluido, sin limitación, si usted incumple estos Términos del servicio.", + "legal.terms.s9.p2": "Tras la terminación, su derecho a usar los Servicios cesará de inmediato. Si desea terminar su cuenta, puede simplemente dejar de usar los Servicios o contactarnos para solicitar la eliminación de la cuenta.", "legal.terms.s10.h": "10. Ley aplicable", - "legal.terms.s10.p": "Estos Términos se regirán e interpretarán de conformidad con las leyes de Eslovenia, sin tener en cuenta sus principios sobre conflicto de leyes.", - "legal.terms.s11.h": "11. Cambios en los términos", - "legal.terms.s11.p": "Descrybe se reserva el derecho a modificar o sustituir estos Términos del servicio en cualquier momento. Es su responsabilidad revisar periódicamente estos Términos por si hubiera cambios. El uso continuado de los Servicios tras la publicación de cualquier cambio constituye la aceptación de dichos cambios.", + "legal.terms.s10.p": "Estos Términos se regirán e interpretarán de conformidad con las leyes de Eslovenia, sin tener en cuenta sus principios sobre conflicto de leyes.", + "legal.terms.s11.h": "11. Cambios en los términos", + "legal.terms.s11.p": "Descrybe se reserva el derecho a modificar o sustituir estos Términos del servicio en cualquier momento. Es su responsabilidad revisar periódicamente estos Términos por si hubiera cambios. El uso continuado de los Servicios tras la publicación de cualquier cambio constituye la aceptación de dichos cambios.", "legal.terms.s12.h": "12. Contacto", - "legal.terms.s12.lead": "Si tiene preguntas sobre estos Términos del servicio, póngase en contacto con nosotros en:", + "legal.terms.s12.lead": "Si tiene preguntas sobre estos Términos del servicio, póngase en contacto con nosotros en:", "plans.loadFailed": "No se pudieron cargar los planes", - "plans.loading": "Cargando planes…", - "plans.apiUnavailable": "La API de planes aún no está disponible en este backend. Mostrando la comparación pública de precios.", + "plans.loading": "Cargando planes…", + "plans.apiUnavailable": "La API de planes aún no está disponible en este backend. Mostrando la comparación pública de precios.", "plans.title": "Elige tu plan", - "plans.sub.onPrefix": "Estás en", - "plans.sub.enterpriseSuffix": "— productos e IA ilimitados. No hace falta un upgrade de autoservicio.", - "plans.sub.paygSuffix": "— pago por uso. Compara los planes públicos abajo o habla con ventas para Enterprise.", - "plans.sub.creditsMid": "con {remaining} créditos de IA restantes.", - "plans.sub.creditsSuffix": "Mejora Starter → Growth → Business con Checkout, o habla con ventas para Enterprise.", - "plans.sub.none": "Aún no hay un plan asignado (por ejemplo tras una migración omitida). Elige un plan abajo — la capacidad no es Ilimitada hasta que Checkout o un administrador asigne uno.", + "plans.sub.onPrefix": "Estás en", + "plans.sub.enterpriseSuffix": "— productos e IA ilimitados. No hace falta un upgrade de autoservicio.", + "plans.sub.paygSuffix": "— pago por uso. Compara los planes públicos abajo o habla con ventas para Enterprise.", + "plans.sub.creditsMid": "con {remaining} créditos de IA restantes.", + "plans.sub.creditsSuffix": "Mejora Starter → Growth → Business con Checkout, o habla con ventas para Enterprise.", + "plans.sub.none": "Aún no hay un plan asignado (por ejemplo tras una migración omitida). Elige un plan abajo — la capacidad no es Ilimitada hasta que Checkout o un administrador asigne uno.", "plans.stripeHint": "Los upgrades de autoservicio usan Stripe Checkout.", "plans.checkoutUnavailable": "El checkout de autoservicio no esta disponible hasta que Stripe este configurado. Contacta con ventas para un plan.", "plans.fallbackName": "Plan tarifario", - "plans.fallbackDescription": "Capacidad para tu catálogo", + "plans.fallbackDescription": "Capacidad para tu catálogo", "plans.badge.current": "Actual", - "plans.badge.popular": "Más popular", + "plans.badge.popular": "Más popular", "plans.price.custom": "Personalizado", "plans.price.forever": "para siempre", "plans.price.perMonth": "/mes", "plans.price.seePricing": "Ver precios", "plans.capacity.unlimitedSkus": "SKU ilimitados", - "plans.capacity.unlimitedAi": "Créditos de IA ilimitados", + "plans.capacity.unlimitedAi": "Créditos de IA ilimitados", "plans.capacity.upToProducts": "Hasta {count} productos", - "plans.capacity.creditsPerMonth": "{count} créditos de IA / mes", + "plans.capacity.creditsPerMonth": "{count} créditos de IA / mes", "plans.cta.requestUpgrade": "Solicitar mejora", "plans.cta.current": "Plan actual", "plans.cta.contactSales": "Contactar ventas", - "plans.cta.switchInBilling": "Cambiar en facturación", + "plans.cta.switchInBilling": "Cambiar en facturación", "plans.cta.upgradeTo": "Mejorar a {name}", - "plans.cta.startingCheckout": "Iniciando checkout…", - "plans.planApplied": "Plan {plan} aplicado. Tus créditos están listos.", + "plans.cta.startingCheckout": "Iniciando checkout…", + "plans.planApplied": "Plan {plan} aplicado. Tus créditos están listos.", "plans.faq.title": "Preguntas frecuentes", - "plans.faq.limit.q": "¿Qué ocurre si alcanzo un límite?", - "plans.faq.limit.a": "Primero verás avisos suaves. Cuando te quedes sin créditos de IA o alcances el tope de SKU, los trabajos que necesiten esa capacidad se bloquean hasta que liberes espacio, esperes al siguiente ciclo o mejores el plan.", - "plans.faq.selfServe.q": "¿Puedo mejorar el plan yo mismo?", - "plans.faq.selfServe.a": "Los administradores de la empresa pueden contratar Starter, Growth y Business por autoservicio mediante Checkout en la tarjeta del plan. Los miembros deben pedir a un administrador — Checkout requiere el rol de administrador. Enterprise siempre va por ventas. Los administradores de plataforma aún pueden asignar planes en Billing Admin.", + "plans.faq.limit.q": "¿Qué ocurre si alcanzo un límite?", + "plans.faq.limit.a": "Primero verás avisos suaves. Cuando te quedes sin créditos de IA o alcances el tope de SKU, los trabajos que necesiten esa capacidad se bloquean hasta que liberes espacio, esperes al siguiente ciclo o mejores el plan.", + "plans.faq.selfServe.q": "¿Puedo mejorar el plan yo mismo?", + "plans.faq.selfServe.a": "Los administradores de la empresa pueden contratar Starter, Growth y Business por autoservicio mediante Checkout en la tarjeta del plan. Los miembros deben pedir a un administrador — Checkout requiere el rol de administrador. Enterprise siempre va por ventas. Los administradores de plataforma aún pueden asignar planes en Billing Admin.", "plans.faq.enterprise.q": "Enterprise y millones de SKU", - "plans.faq.enterprise.a": "La capacidad personalizada, la clave de IA propia (BYOK), el SLA y la gestión de cuenta van por ventas. Reserva tiempo en Calendly — Enterprise no es autoservicio a escala de millones de SKU. La app muestra Ilimitado para capacidad de SKU e IA.", - "plans.faq.pricing.q": "¿Dónde está el precio público?", - "plans.faq.pricing.aBefore": "Consulta la comparación de marketing en la", - "plans.faq.pricing.pricingPage": "página de Precios", - "plans.faq.pricing.aMid": "— los CTA son Empezar (registro) o Contactar ventas. Gestiona el uso en cualquier momento en", + "plans.faq.enterprise.a": "La capacidad personalizada, la clave de IA propia (BYOK), el SLA y la gestión de cuenta van por ventas. Reserva tiempo en Calendly — Enterprise no es autoservicio a escala de millones de SKU. La app muestra Ilimitado para capacidad de SKU e IA.", + "plans.faq.pricing.q": "¿Dónde está el precio público?", + "plans.faq.pricing.aBefore": "Consulta la comparación de marketing en la", + "plans.faq.pricing.pricingPage": "página de Precios", + "plans.faq.pricing.aMid": "— los CTA son Empezar (registro) o Contactar ventas. Gestiona el uso en cualquier momento en", "plans.faq.pricing.aAfter": ".", - "plans.custom.title": "¿Necesitas un plan personalizado?", + "plans.custom.title": "¿Necesitas un plan personalizado?", "plans.custom.body": "La capacidad Enterprise, la clave de IA propia y los SLA se gestionan con nuestro equipo.", - "plans.custom.looking": "¿Buscas detalles de los planes públicos?", + "plans.custom.looking": "¿Buscas detalles de los planes públicos?", "ai.title": "Integraciones de IA", - "ai.description": "Elige créditos de la plataforma o tu propia clave y personaliza los prompts con variables.", + "ai.description": "Elige créditos de la plataforma o tu propia clave y personaliza los prompts con variables.", "ai.crumb": "Integraciones de IA", - "ai.adminOnly": "Solo los administradores de la empresa pueden cambiar la configuración de IA. Puedes ver la configuración actual.", + "ai.adminOnly": "Solo los administradores de la empresa pueden cambiar la configuración de IA. Puedes ver la configuración actual.", "ai.badge.ownKey": "Tu propia clave", - "ai.badge.platform": "Créditos / clave de la plataforma", + "ai.badge.platform": "Créditos / clave de la plataforma", "ai.badge.active": "Activo: {label}", "ai.badge.platformKeyAvailable": "Clave de plataforma disponible", - "ai.badge.lastTest": "Última prueba: {status}", + "ai.badge.lastTest": "Última prueba: {status}", "ai.providerMode.title": "Modo del proveedor", - "ai.providerMode.desc": "La plataforma usa créditos de Descrybe y nuestra clave. Popular o Personalizado usa tu clave compatible con OpenAI (la llamada al proveedor no consume créditos de la plataforma; las reglas de créditos de las funciones sí se aplican).", - "ai.whoPays": "¿Quién paga el modelo?", - "ai.mode.internal": "Plataforma (créditos / clave de Descrybe)", - "ai.mode.popular": "Tu clave — proveedor popular", - "ai.mode.custom": "Tu clave — endpoint personalizado", - "ai.useCompanyKey": "Usar esta clave de empresa para procesamiento, SEO con IA y campañas con IA", + "ai.providerMode.desc": "La plataforma usa créditos de Descrybe y nuestra clave. Popular o Personalizado usa tu clave compatible con OpenAI (la llamada al proveedor no consume créditos de la plataforma; las reglas de créditos de las funciones sí se aplican).", + "ai.whoPays": "¿Quién paga el modelo?", + "ai.mode.internal": "Plataforma (créditos / clave de Descrybe)", + "ai.mode.popular": "Tu clave — proveedor popular", + "ai.mode.custom": "Tu clave — endpoint personalizado", + "ai.useCompanyKey": "Usar esta clave de empresa para procesamiento, SEO con IA y campañas con IA", "ai.popular.title": "Proveedor popular", - "ai.popular.desc": "Endpoints compatibles con OpenAI. Anthropic a través de OpenRouter.", + "ai.popular.desc": "Endpoints compatibles con OpenAI. Anthropic a través de OpenRouter.", "ai.field.provider": "Proveedor", "ai.field.model": "Modelo", "ai.placeholder.modelId": "id del modelo", @@ -4904,21 +4905,21 @@ export const es: MessageDict = { "ai.custom.desc": "Introduce la URL base HTTPS de tu proveedor de IA.", "ai.field.baseUrl": "URL base", "ai.apiKey.title": "Clave API", - "ai.apiKey.desc": "Déjalo en blanco para conservar la clave existente. Los secretos en bruto nunca se devuelven: solo un last4 enmascarado.", + "ai.apiKey.desc": "Déjalo en blanco para conservar la clave existente. Los secretos en bruto nunca se devuelven: solo un last4 enmascarado.", "ai.storedKey": "Clave guardada: {masked}", "ai.field.apiKey": "Clave API", - "ai.placeholder.keepKey": "•••• déjalo en blanco para conservar", + "ai.placeholder.keepKey": "•••• déjalo en blanco para conservar", "ai.clearStoredKey": "Borrar clave API guardada", "ai.saveProvider": "Guardar proveedor", - "ai.testConnection": "Probar conexión", + "ai.testConnection": "Probar conexión", "ai.prompts.title": "Plantillas de prompt", - "ai.prompts.descBefore": "Personaliza los prompts de sistema y de usuario para textos de producto, meta SEO y correos de campaña. Inserta variables como", - "ai.prompts.descMid": ": se rellenan en tiempo de ejecución. La voz del kit de marca está disponible como", + "ai.prompts.descBefore": "Personaliza los prompts de sistema y de usuario para textos de producto, meta SEO y correos de campaña. Inserta variables como", + "ai.prompts.descMid": ": se rellenan en tiempo de ejecución. La voz del kit de marca está disponible como", "ai.prompts.descAfter": ".", - "ai.field.feature": "Función", + "ai.field.feature": "Función", "ai.badge.custom": "Personalizado", "ai.badge.builtin": "Valor predeterminado integrado", - "ai.badge.disabledDefault": "Desactivado → se usa el predeterminado", + "ai.badge.disabledDefault": "Desactivado → se usa el predeterminado", "ai.useCustomPrompt": "Usar este prompt personalizado (desactivado = predeterminado integrado)", "ai.insertVariableInto": "Insertar variable en", "ai.insert.system": "Sistema", @@ -4928,30 +4929,30 @@ export const es: MessageDict = { "ai.savePrompts": "Guardar prompts", "ai.resetDefault": "Restablecer predeterminado", "ai.editBrandVoice": "Editar voz de marca", - "ai.flash.loadFailed": "No se pudo cargar la configuración de IA", - "ai.flash.usingPlatform": "Usando la IA de la plataforma (créditos / clave de Descrybe cuando estén configurados).", + "ai.flash.loadFailed": "No se pudo cargar la configuración de IA", + "ai.flash.usingPlatform": "Usando la IA de la plataforma (créditos / clave de Descrybe cuando estén configurados).", "ai.flash.providerSaved": "Proveedor de IA guardado. Las claves se cifran y no se muestran de nuevo.", "ai.flash.saveFailed": "No se pudo guardar", "ai.flash.savePromptsFailed": "No se pudieron guardar los prompts", "ai.flash.resetFailed": "No se pudo restablecer el prompt", - "ai.flash.connectionFailed": "Falló la conexión", - "ai.flash.testFailed": "Falló la prueba", - "ai.action.changeSettings": "cambiar la configuración del proveedor de IA", + "ai.flash.connectionFailed": "Falló la conexión", + "ai.flash.testFailed": "Falló la prueba", + "ai.action.changeSettings": "cambiar la configuración del proveedor de IA", "ai.action.changePrompts": "cambiar los prompts de IA", "ai.action.testProvider": "probar el proveedor de IA", - "email.title": "Envío de correo", - "email.description": "Resend o SMTP para campañas de marketing. Secretos cifrados en reposo.", - "email.adminOnly": "Solo los administradores de la empresa pueden cambiar la configuración del proveedor de correo. Puedes ver la configuración actual.", - "email.crumb": "Integración de correo", - "email.dryRunForced": "El modo de prueba está forzado ({reason}). Los planes Free y EMAIL_DRY_RUN nunca envían envíos masivos reales.", - "email.dryRunPolicy": "política", + "email.title": "Envío de correo", + "email.description": "Resend o SMTP para campañas de marketing. Secretos cifrados en reposo.", + "email.adminOnly": "Solo los administradores de la empresa pueden cambiar la configuración del proveedor de correo. Puedes ver la configuración actual.", + "email.crumb": "Integración de correo", + "email.dryRunForced": "El modo de prueba está forzado ({reason}). Los planes Free y EMAIL_DRY_RUN nunca envían envíos masivos reales.", + "email.dryRunPolicy": "política", "email.badge.verified": "Verificado", "email.badge.notVerified": "No verificado", "email.badge.canSendReal": "Puede enviar real", - "email.badge.realBlocked": "Envío real bloqueado", - "email.badge.lastTest": "Última prueba: {status}", + "email.badge.realBlocked": "Envío real bloqueado", + "email.badge.lastTest": "Última prueba: {status}", "email.provider.title": "Proveedor", - "email.provider.desc": "Configuración por empresa. El SMTP/Resend del entorno de la plataforma solo se usa como reserva si faltan secretos.", + "email.provider.desc": "Configuración por empresa. El SMTP/Resend del entorno de la plataforma solo se usa como reserva si faltan secretos.", "email.field.provider": "Proveedor", "email.provider.resend": "Resend", "email.provider.smtp": "SMTP", @@ -4960,51 +4961,51 @@ export const es: MessageDict = { "email.field.from": "De", "email.field.fromName": "Nombre del remitente", "email.field.replyTo": "Reply-To", - "email.resendKeySaved": "Clave API de Resend (guardada — déjala en blanco para conservar)", + "email.resendKeySaved": "Clave API de Resend (guardada — déjala en blanco para conservar)", "email.resendKey": "Clave API de Resend", "email.field.smtpHost": "Host SMTP", "email.field.port": "Puerto", "email.field.username": "Usuario", - "email.field.passwordSaved": "Contraseña (guardada)", - "email.field.password": "Contraseña", + "email.field.passwordSaved": "Contraseña (guardada)", + "email.field.password": "Contraseña", "email.verifyDomain": "Verificar dominio", - "email.testGate.title": "Prueba y control de envíos", - "email.testGate.desc": "Los envíos de prueba verifican la dirección del remitente. Los envíos masivos reales exigen escribir “I understand”.", + "email.testGate.title": "Prueba y control de envíos", + "email.testGate.desc": "Los envíos de prueba verifican la dirección del remitente. Los envíos masivos reales exigen escribir “I understand”.", "email.field.recipient": "Destinatario", "email.sendTest": "Enviar prueba", - "email.confirmBlast": "Confirmar envío masivo…", - "email.flash.loadFailed": "No se pudo cargar la configuración de correo", + "email.confirmBlast": "Confirmar envío masivo…", + "email.flash.loadFailed": "No se pudo cargar la configuración de correo", "email.flash.saveFailed": "No se pudo guardar", - "email.flash.verifyUpdated": "Verificación actualizada.", - "email.flash.verifyFailed": "Falló la verificación", - "email.flash.testFailed": "Falló el envío de prueba", - "email.flash.blastDryRun": "Comprobación de entrega registrada en modo de prueba: no se envió ningún correo.", - "email.flash.blastDone": "Comprobación de entrega finalizada: {sent} enviados, {failed} fallidos.", - "email.flash.blastFailed": "Falló el envío masivo", - "email.blast.subject": "Comprobación de entrega de correo de Descrybe", - "email.blast.body": "Esta es una comprobación de entrega a una sola dirección desde Descrybe para confirmar que tu integración de correo puede enviar. Destinatario: {recipient}", - "email.action.changeSettings": "cambiar la configuración del proveedor de correo", + "email.flash.verifyUpdated": "Verificación actualizada.", + "email.flash.verifyFailed": "Falló la verificación", + "email.flash.testFailed": "Falló el envío de prueba", + "email.flash.blastDryRun": "Comprobación de entrega registrada en modo de prueba: no se envió ningún correo.", + "email.flash.blastDone": "Comprobación de entrega finalizada: {sent} enviados, {failed} fallidos.", + "email.flash.blastFailed": "Falló el envío masivo", + "email.blast.subject": "Comprobación de entrega de correo de Descrybe", + "email.blast.body": "Esta es una comprobación de entrega a una sola dirección desde Descrybe para confirmar que tu integración de correo puede enviar. Destinatario: {recipient}", + "email.action.changeSettings": "cambiar la configuración del proveedor de correo", "email.action.verifyDomain": "verificar el dominio de correo", "email.action.sendTest": "enviar correo de prueba", - "email.action.sendBlasts": "enviar envíos masivos de correo", + "email.action.sendBlasts": "enviar envíos masivos de correo", "seo.title": "Recomendaciones SEO", - "seo.description": "Puntuaciones de checklist para meta del catálogo, títulos, imágenes y palabras clave. El relleno por plantilla es gratis; la reescritura con IA es de pago.", - "seo.upgradeTitle": "La reescritura con IA es una función de pago", - "seo.upgradeMessage": "Los planes Free aún pueden corregir meta faltante con plantillas basadas en reglas. Mejora el plan o añade créditos para usar reescrituras con IA.", + "seo.description": "Puntuaciones de checklist para meta del catálogo, títulos, imágenes y palabras clave. El relleno por plantilla es gratis; la reescritura con IA es de pago.", + "seo.upgradeTitle": "La reescritura con IA es una función de pago", + "seo.upgradeMessage": "Los planes Free aún pueden corregir meta faltante con plantillas basadas en reglas. Mejora el plan o añade créditos para usar reescrituras con IA.", "seo.comparePlans": "Comparar planes", "seo.openProducts": "Abrir productos", - "seo.overallScore": "Puntuación SEO global", + "seo.overallScore": "Puntuación SEO global", "seo.overallScoreHint": "Media de los elementos del checklist", "seo.productsScanned": "Productos analizados", "seo.productsScannedHint": "Productos procesados en la empresa", - "seo.categoriesScanned": "Categorías analizadas", - "seo.categoriesScannedHint": "Incluye comprobaciones de fórmulas meta", + "seo.categoriesScanned": "Categorías analizadas", + "seo.categoriesScannedHint": "Incluye comprobaciones de fórmulas meta", "seo.aiRewrite": "Reescritura con IA", "seo.available": "Disponible", "seo.gated": "Restringido", "seo.templateFree": "El relleno por plantilla sigue siendo gratis en todos los planes", "seo.checklist": "Checklist", - "seo.affectedFindings": "{affected} afectados · {count} hallazgos", + "seo.affectedFindings": "{affected} afectados · {count} hallazgos", "seo.fixable": "Corregible", "seo.clearFilter": "Quitar filtro", "seo.findings": "Hallazgos", @@ -5013,250 +5014,250 @@ export const es: MessageDict = { "seo.col.entity": "Entidad", "seo.col.severity": "Gravedad", "seo.col.actions": "Acciones", - "seo.filling": "Rellenando…", + "seo.filling": "Rellenando…", "seo.templateFill": "Relleno por plantilla", - "seo.aiTitleAllowed": "Reescribir con IA (usa créditos)", - "seo.aiTitleGated": "Requiere plan de pago o créditos", - "seo.rewriting": "Reescribiendo…", + "seo.aiTitleAllowed": "Reescribir con IA (usa créditos)", + "seo.aiTitleGated": "Requiere plan de pago o créditos", + "seo.rewriting": "Reescribiendo…", "seo.aiRewriteBtn": "Reescritura con IA", "seo.viewProduct": "Ver producto", "seo.flash.loadFailed": "No se pudieron cargar las recomendaciones SEO", - "seo.flash.aiPaid": "La reescritura con IA requiere un plan de pago o créditos.", - "seo.flash.applyFailed": "No se pudo aplicar la corrección", + "seo.flash.aiPaid": "La reescritura con IA requiere un plan de pago o créditos.", + "seo.flash.applyFailed": "No se pudo aplicar la corrección", "brand.title": "Kit de marca", - "brand.description": "Define la voz, las directrices y los colores para que los títulos y las descripciones de producto se mantengan fieles a la marca.", - "brand.loading": "Cargando kit de marca…", + "brand.description": "Define la voz, las directrices y los colores para que los títulos y las descripciones de producto se mantengan fieles a la marca.", + "brand.loading": "Cargando kit de marca…", "brand.adminOnly": "Solo los administradores de la empresa pueden editar el kit de marca. Puedes ver la voz, los colores y el logo actuales.", - "brand.aiApplyFreeAdmin": "Puedes editar tu kit de marca en Free. La aplicación con IA (inyectar la voz de marca en los prompts de mejora) se desbloquea a partir de Starter.", - "brand.aiApplyGated": "La aplicación con IA (inyectar la voz de marca en los prompts de mejora) se desbloquea a partir de Starter.", - "brand.aiEnhanceUses": "La mejora con IA usará esta voz de marca al procesar productos.", + "brand.aiApplyFreeAdmin": "Puedes editar tu kit de marca en Free. La aplicación con IA (inyectar la voz de marca en los prompts de mejora) se desbloquea a partir de Starter.", + "brand.aiApplyGated": "La aplicación con IA (inyectar la voz de marca en los prompts de mejora) se desbloquea a partir de Starter.", + "brand.aiEnhanceUses": "La mejora con IA usará esta voz de marca al procesar productos.", "brand.comparePlans": "Comparar planes", "brand.voice.title": "Voz y directrices", - "brand.voice.desc": "Tono, reglas de sí/no y redacción preferida", + "brand.voice.desc": "Tono, reglas de sí/no y redacción preferida", "brand.field.voiceTone": "Voz / tono", - "brand.placeholder.voiceTone": "p. ej. Segura, concisa, técnica pero cercana", - "brand.field.dos": "Hacer (uno por línea)", - "brand.placeholder.dos": "Empieza por el beneficio principal\nMantén los títulos por debajo de 80 caracteres", - "brand.field.donts": "No hacer (uno por línea)", - "brand.placeholder.donts": "Sin MAYÚSCULAS\nEvita superlativos sin pruebas", - "brand.field.preferredTerms": "Términos preferidos (uno por línea o separados por comas)", - "brand.placeholder.preferredTerms": "inalámbrico, premium, clase energética", + "brand.placeholder.voiceTone": "p. ej. Segura, concisa, técnica pero cercana", + "brand.field.dos": "Hacer (uno por línea)", + "brand.placeholder.dos": "Empieza por el beneficio principal\nMantén los títulos por debajo de 80 caracteres", + "brand.field.donts": "No hacer (uno por línea)", + "brand.placeholder.donts": "Sin MAYÚSCULAS\nEvita superlativos sin pruebas", + "brand.field.preferredTerms": "Términos preferidos (uno por línea o separados por comas)", + "brand.placeholder.preferredTerms": "inalámbrico, premium, clase energética", "brand.visual.title": "Identidad visual", - "brand.visual.desc": "Colores y logo usados en consejos y campañas conscientes de la marca", + "brand.visual.desc": "Colores y logo usados en consejos y campañas conscientes de la marca", "brand.field.primaryColor": "Color primario", "brand.field.secondaryColor": "Color secundario", "brand.field.logoImage": "Imagen del logo", "brand.logoHint": "PNG, JPEG o WebP de hasta 2 MiB. Se guarda en las cargas de tu empresa.", - "brand.uploading": "Subiendo…", + "brand.uploading": "Subiendo…", "brand.uploadLogo": "Subir logo", "brand.clear": "Borrar", "brand.field.logoUrl": "URL del logo", - "brand.placeholder.logoUrl": "https://… o subido /api/brand/logo/files/…", + "brand.placeholder.logoUrl": "https://… o subido /api/brand/logo/files/…", "brand.logoAlt": "Vista previa del logo de marca", - "brand.tipsTitle": "Consejos de fórmula / vista previa", - "brand.saving": "Guardando…", + "brand.tipsTitle": "Consejos de fórmula / vista previa", + "brand.saving": "Guardando…", "brand.save": "Guardar kit de marca", "brand.flash.loadFailed": "No se pudo cargar el kit de marca", - "structured.title": "Campos de descripción estructurada", - "structured.loading": "Cargando campos de descripción estructurada…", + "structured.title": "Campos de descripción estructurada", + "structured.loading": "Cargando campos de descripción estructurada…", "structured.backDashboard": "Volver al panel", - "structured.categoryFormulas": "Fórmulas de categoría", - "structured.exportFeeds": "Feeds de exportación", - "structured.intro": "Estos campos se crean automáticamente cuando añades Export IDs a las secciones de la fórmula de descripción. Puedes usarlos en tus feeds de exportación para incluir partes concretas de las descripciones de producto.", - "structured.addField": "Añadir campo", - "structured.openCategories": "Abrir categorías", - "structured.tableCaption": "Estos campos se usan para estructurar partes de las descripciones de producto para la exportación.", + "structured.categoryFormulas": "Fórmulas de categoría", + "structured.exportFeeds": "Feeds de exportación", + "structured.intro": "Estos campos se crean automáticamente cuando añades Export IDs a las secciones de la fórmula de descripción. Puedes usarlos en tus feeds de exportación para incluir partes concretas de las descripciones de producto.", + "structured.addField": "Añadir campo", + "structured.openCategories": "Abrir categorías", + "structured.tableCaption": "Estos campos se usan para estructurar partes de las descripciones de producto para la exportación.", "structured.col.fieldKey": "Clave del campo", "structured.col.type": "Tipo", "structured.col.created": "Creado", "structured.col.actions": "Acciones", - "structured.dialogTitle": "Añadir campo de descripción estructurada", + "structured.dialogTitle": "Añadir campo de descripción estructurada", "structured.fieldKeyLabel": "Clave del campo (obligatoria)", "structured.fieldKeyPlaceholder": "p. ej., features, specifications", "structured.fieldTypeLabel": "Tipo de campo", "structured.type.text": "Texto", - "structured.type.number": "Número", + "structured.type.number": "Número", "structured.type.boolean": "Booleano", "structured.type.list": "Lista", - "structured.adding": "Añadiendo...", - "structured.flash.loadFailed": "No se pudieron cargar los campos de descripción estructurada", + "structured.adding": "Añadiendo...", + "structured.flash.loadFailed": "No se pudieron cargar los campos de descripción estructurada", "assistant.ariaLabel": "Asistente del sistema", "assistant.title": "Asistente del sistema", - "assistant.subtitle": "Navega, guía y ejecuta acciones compatibles", - "assistant.resetAria": "Reiniciar conversación", + "assistant.subtitle": "Navega, guía y ejecuta acciones compatibles", + "assistant.resetAria": "Reiniciar conversación", "assistant.resetTitle": "Reiniciar", "assistant.closeAria": "Cerrar asistente", "assistant.messageLabel": "Mensaje", - "assistant.placeholder": "p. ej. añadir una URL de feed, claves API, atributos, procesamiento…", + "assistant.placeholder": "p. ej. añadir una URL de feed, claves API, atributos, procesamiento…", "assistant.sendAria": "Enviar", "site.bookDemo": "Reservar una demo", "site.demoShort": "Demo", "site.allRightsReserved": "Todos los derechos reservados.", - "site.cookiePolicy": "Política de cookies", + "site.cookiePolicy": "Política de cookies", "site.cookieSettings": "Ajustes de cookies", - "consent.title": "Cookies y analítica", - "consent.description": "Usamos cookies necesarias para que Descrybe funcione. Las cookies opcionales de analítica y marketing nos ayudan a entender el uso y medir campañas. Puede cambiar su elección en cualquier momento.", + "consent.title": "Cookies y analítica", + "consent.description": "Usamos cookies necesarias para que Descrybe funcione. Las cookies opcionales de analítica y marketing nos ayudan a entender el uso y medir campañas. Puede cambiar su elección en cualquier momento.", "consent.acceptAll": "Aceptar todo", "consent.rejectNonEssential": "Rechazar no esenciales", "consent.customize": "Personalizar", "consent.save": "Guardar preferencias", "consent.necessary": "Necesarias", - "consent.necessaryDesc": "Requeridas para inicio de sesión, seguridad (CSRF), tema, idioma y recordar esta elección.", + "consent.necessaryDesc": "Requeridas para inicio de sesión, seguridad (CSRF), tema, idioma y recordar esta elección.", "consent.alwaysOn": "Siempre activas", - "consent.analytics": "Analítica", - "consent.analyticsDesc": "Nos ayuda a entender cómo se usa el producto (Google Analytics vía GTM).", + "consent.analytics": "Analítica", + "consent.analyticsDesc": "Nos ayuda a entender cómo se usa el producto (Google Analytics vía GTM).", "consent.marketing": "Marketing", - "consent.marketingDesc": "Para medición publicitaria y personalización cuando hay etiquetas de anuncios en GTM.", - "consent.policyLink": "Leer la Política de cookies", - "seo.cookies.title": "Política de cookies | Descrybe", - "seo.cookies.description": "Cómo Descrybe usa cookies necesarias, de analítica y marketing, incluido GTM y GA4, y cómo cambiar el consentimiento.", - "legal.cookies.title": "Política de cookies", + "consent.marketingDesc": "Para medición publicitaria y personalización cuando hay etiquetas de anuncios en GTM.", + "consent.policyLink": "Leer la Política de cookies", + "seo.cookies.title": "Política de cookies | Descrybe", + "seo.cookies.description": "Cómo Descrybe usa cookies necesarias, de analítica y marketing, incluido GTM y GA4, y cómo cambiar el consentimiento.", + "legal.cookies.title": "Política de cookies", "legal.cookies.intro.h": "Resumen", - "legal.cookies.intro.p1": "Esta Política de cookies explica cómo Descrybe usa cookies y tecnologías similares en el sitio y la aplicación. Léala junto con nuestra Política de privacidad.", - "legal.cookies.intro.p2": "Cuando sea obligatorio, pedimos consentimiento antes de activar cookies de analítica o marketing. Las cookies necesarias permiten prestar el servicio de forma segura y no requieren consentimiento.", - "legal.cookies.types.h": "Categorías de cookies", + "legal.cookies.intro.p1": "Esta Política de cookies explica cómo Descrybe usa cookies y tecnologías similares en el sitio y la aplicación. Léala junto con nuestra Política de privacidad.", + "legal.cookies.intro.p2": "Cuando sea obligatorio, pedimos consentimiento antes de activar cookies de analítica o marketing. Las cookies necesarias permiten prestar el servicio de forma segura y no requieren consentimiento.", + "legal.cookies.types.h": "Categorías de cookies", "legal.cookies.necessary.h": "Necesarias", - "legal.cookies.necessary.p": "Mantienen la sesión, protegen formularios con CSRF, guardan tema e idioma y recuerdan su elección de cookies. Sin ellas el producto no funciona correctamente.", - "legal.cookies.analytics.h": "Analítica", - "legal.cookies.analytics.p": "Si permite analítica, cargamos etiquetas de Google Tag Manager que pueden establecer cookies de Google Analytics 4 para medir páginas y eventos. Los eventos se bloquean hasta conceder analytics_storage.", + "legal.cookies.necessary.p": "Mantienen la sesión, protegen formularios con CSRF, guardan tema e idioma y recuerdan su elección de cookies. Sin ellas el producto no funciona correctamente.", + "legal.cookies.analytics.h": "Analítica", + "legal.cookies.analytics.p": "Si permite analítica, cargamos etiquetas de Google Tag Manager que pueden establecer cookies de Google Analytics 4 para medir páginas y eventos. Los eventos se bloquean hasta conceder analytics_storage.", "legal.cookies.marketing.h": "Marketing", - "legal.cookies.marketing.p": "Si permite marketing, las etiquetas publicitarias en GTM pueden usar almacenamiento de anuncios y señales relacionadas para medición y personalización.", + "legal.cookies.marketing.p": "Si permite marketing, las etiquetas publicitarias en GTM pueden usar almacenamiento de anuncios y señales relacionadas para medición y personalización.", "legal.cookies.gtm.h": "Google Tag Manager y GA4", - "legal.cookies.gtm.p": "Cuando está configurado, Descrybe carga un contenedor de Google Tag Manager. GA4 se configura dentro de ese contenedor. Consent Mode v2 deniega por defecto el almacenamiento de analítica y anuncios hasta que acepte las categorías.", + "legal.cookies.gtm.p": "Cuando está configurado, Descrybe carga un contenedor de Google Tag Manager. GA4 se configura dentro de ese contenedor. Consent Mode v2 deniega por defecto el almacenamiento de analítica y anuncios hasta que acepte las categorías.", "legal.cookies.third.h": "Terceros", - "legal.cookies.third.p": "Google (Tag Manager / Analytics) puede procesar datos técnicos como URL, dispositivo/navegador y nombres de eventos cuando hay consentimiento. No enviamos intencionadamente contraseñas, claves API ni datos de contacto en eventos de analítica.", - "legal.cookies.manage.h": "Cómo cambiar el consentimiento", - "legal.cookies.manage.p": "Use Ajustes de cookies en el pie (o el botón de abajo) para reabrir el banner. También puede borrar los datos del sitio en el navegador.", - "site.privacyPolicy": "Política de privacidad", - "site.termsOfService": "Términos del servicio", + "legal.cookies.third.p": "Google (Tag Manager / Analytics) puede procesar datos técnicos como URL, dispositivo/navegador y nombres de eventos cuando hay consentimiento. No enviamos intencionadamente contraseñas, claves API ni datos de contacto en eventos de analítica.", + "legal.cookies.manage.h": "Cómo cambiar el consentimiento", + "legal.cookies.manage.p": "Use Ajustes de cookies en el pie (o el botón de abajo) para reabrir el banner. También puede borrar los datos del sitio en el navegador.", + "site.privacyPolicy": "Política de privacidad", + "site.termsOfService": "Términos del servicio", "site.legalNav": "Legal", "site.footer.aria": "Sitio", - "site.footer.description": "Descrybe convierte feeds de proveedores en catálogos de producto limpios y listos para canales: mapea campos, enriquece atributos y textos, luego exporta o sincroniza con WooCommerce.", - "site.footer.rightsLine": "© {year} {name}. Todos los derechos reservados.", - "site.footer.navTitle": "Navegación", + "site.footer.description": "Descrybe convierte feeds de proveedores en catálogos de producto limpios y listos para canales: mapea campos, enriquece atributos y textos, luego exporta o sincroniza con WooCommerce.", + "site.footer.rightsLine": "© {year} {name}. Todos los derechos reservados.", + "site.footer.navTitle": "Navegación", "site.footer.platform": "Plataforma", "site.footer.solutions": "Soluciones", "site.footer.contact": "Contacto", "home.hero.tagline": "Datos de producto para equipos de ecommerce", "home.hero.title": "De feeds de proveedores a fichas de producto", - "home.hero.lead": "Conecta feeds de proveedores, asígnalos a tus categorías, completa atributos obligatorios y escribe títulos y descripciones según tus reglas — luego exporta o sincroniza con tu tienda.", - "home.hero.learnMore": "Saber más", + "home.hero.lead": "Conecta feeds de proveedores, asígnalos a tus categorías, completa atributos obligatorios y escribe títulos y descripciones según tus reglas — luego exporta o sincroniza con tu tienda.", + "home.hero.learnMore": "Saber más", "home.hero.apply": "Solicitar acceso", "home.hero.supportedBy": "Con el apoyo de", "home.hero.msAlt": "Microsoft for Startups", "home.image.previewAlt": "Vista previa de la plataforma Descrybe: de feed a ficha de producto", - "home.how.title": "Así Descrybe te ahorra tiempo para llevar productos al mercado", + "home.how.title": "Así Descrybe te ahorra tiempo para llevar productos al mercado", "home.how.lead": "Importa datos desordenados de proveedores una sola vez. Descrybe te ayuda a categorizarlos, completar atributos, redactar fichas y enviar productos listos a tus canales.", "home.how.apply": "Solicitar acceso", - "home.how.step1.title": "Importa tu taxonomía", - "home.how.step1.desc": "Configura las categorías y atributos que tu tienda ya usa", - "home.how.step1.f1": "Define atributos obligatorios por categoría", - "home.how.step1.f2": "Configura fórmulas de título por categoría", - "home.how.step1.f3": "Define plantillas de descripción y snippet de búsqueda", + "home.how.step1.title": "Importa tu taxonomía", + "home.how.step1.desc": "Configura las categorías y atributos que tu tienda ya usa", + "home.how.step1.f1": "Define atributos obligatorios por categoría", + "home.how.step1.f2": "Configura fórmulas de título por categoría", + "home.how.step1.f3": "Define plantillas de descripción y snippet de búsqueda", "home.how.step2.title": "Importa datos de proveedores", "home.how.step2.desc": "Conecta una URL de feed o sube un archivo de productos", "home.how.step2.f1": "Importa desde CSV, XML o API", - "home.how.step2.f2": "Programa importaciones automáticas de tus proveedores", + "home.how.step2.f2": "Programa importaciones automáticas de tus proveedores", "home.how.step2.f3": "Mapea campos con una interfaz sencilla de arrastrar y soltar", "home.how.step3.title": "Transforma y enriquece", "home.how.step3.desc": "Elige los productos a procesar y deja que Descrybe:", - "home.how.step3.f1": "Asigne las categorías correctas", + "home.how.step3.f1": "Asigne las categorías correctas", "home.how.step3.f2": "Complete los atributos de producto obligatorios", - "home.how.step3.f3": "Cree títulos y descripciones claros y fáciles de buscar", + "home.how.step3.f3": "Cree títulos y descripciones claros y fáciles de buscar", "home.how.step4.title": "Exporta a canales", - "home.how.step4.desc": "Envía datos de producto listos a donde vendes", - "home.how.step4.f1": "Genera feeds de producto específicos por canal", - "home.how.step4.f2": "Mantén el control total de los campos que exportas", - "home.how.step4.f3": "Mantente al día cuando cambien los datos del proveedor", - "home.benefits.title": "Todo lo que necesitas para datos de producto más limpios", - "home.benefits.lead": "Desde la importación del feed hasta fichas listas para el canal — sin reconstruir cada archivo a mano.", + "home.how.step4.desc": "Envía datos de producto listos a donde vendes", + "home.how.step4.f1": "Genera feeds de producto específicos por canal", + "home.how.step4.f2": "Mantén el control total de los campos que exportas", + "home.how.step4.f3": "Mantente al día cuando cambien los datos del proveedor", + "home.benefits.title": "Todo lo que necesitas para datos de producto más limpios", + "home.benefits.lead": "Desde la importación del feed hasta fichas listas para el canal — sin reconstruir cada archivo a mano.", "home.benefits.shield.title": "Detecta fichas incompletas a tiempo", - "home.benefits.shield.desc": "Comprueba los datos frente a las reglas de categoría para corregir atributos faltantes y textos pobres antes de publicarlos.", - "home.benefits.chart.title": "Fichas más claras, mejor conversión", - "home.benefits.chart.desc": "Títulos y descripciones que destacan lo que importa al comprador: beneficios, especificaciones y términos de búsqueda de tu catálogo.", + "home.benefits.shield.desc": "Comprueba los datos frente a las reglas de categoría para corregir atributos faltantes y textos pobres antes de publicarlos.", + "home.benefits.chart.title": "Fichas más claras, mejor conversión", + "home.benefits.chart.desc": "Títulos y descripciones que destacan lo que importa al comprador: beneficios, especificaciones y términos de búsqueda de tu catálogo.", "home.benefits.database.title": "Una estructura de producto coherente", - "home.benefits.database.desc": "Mantén el mismo árbol de categorías y forma de atributos en exportaciones y canales para que los clientes encuentren productos igual en todas partes.", - "home.benefits.search.title": "Contenido de producto pensado para la búsqueda", - "home.benefits.search.desc": "Escribe títulos, descripciones y meta snippets más fáciles de entender para compradores y buscadores.", + "home.benefits.database.desc": "Mantén el mismo árbol de categorías y forma de atributos en exportaciones y canales para que los clientes encuentren productos igual en todas partes.", + "home.benefits.search.title": "Contenido de producto pensado para la búsqueda", + "home.benefits.search.desc": "Escribe títulos, descripciones y meta snippets más fáciles de entender para compradores y buscadores.", "home.benefits.cost.title": "Menos entrada manual de datos", - "home.benefits.cost.desc": "Automatiza el mapeo, el relleno de atributos y los textos para que tu equipo se centre en el merchandising — no en limpiar hojas de cálculo.", + "home.benefits.cost.desc": "Automatiza el mapeo, el relleno de atributos y los textos para que tu equipo se centre en el merchandising — no en limpiar hojas de cálculo.", "home.benefits.scale.title": "Listo para cada canal de venta", - "home.benefits.scale.desc": "Adapta feeds de exportación y la sync de WooCommerce a los formatos que espera cada canal, sin reconstruir el catálogo a mano.", + "home.benefits.scale.desc": "Adapta feeds de exportación y la sync de WooCommerce a los formatos que espera cada canal, sin reconstruir el catálogo a mano.", "home.cta.titleLead": "Lleva productos al mercado ", - "home.cta.titleHighlight": "más rápido", + "home.cta.titleHighlight": "más rápido", "home.cta.description": "Deja de reconstruir datos de producto en cada archivo de proveedor. Mapea una vez, enriquece con tus reglas y publica fichas listas para vender.", "home.cta.f1": "Demo personalizada", "home.cta.f2": "Consulta con expertos", - "home.cta.f3": "Próximos pasos claros", + "home.cta.f3": "Próximos pasos claros", "home.cta.apply": "Solicitar acceso", - "home.cta.imageAlt": "Páginas de producto de Descrybe", - "home.product.eyebrow": "Qué hace Descrybe", - "home.product.title": "Feeds de proveedor dentro. Fichas listas fuera — export, WooCommerce o API.", - "home.product.description": "Descrybe ayuda a equipos de ecommerce a convertir feeds CSV y XML de proveedores en catálogos limpios. Mapea campos a tus categorías, enriquece atributos y textos, y envía datos por feeds de exportación, sync de WooCommerce o la API pública.", + "home.cta.imageAlt": "Páginas de producto de Descrybe", + "home.product.eyebrow": "Qué hace Descrybe", + "home.product.title": "Feeds de proveedor dentro. Fichas listas fuera — export, WooCommerce o API.", + "home.product.description": "Descrybe ayuda a equipos de ecommerce a convertir feeds CSV y XML de proveedores en catálogos limpios. Mapea campos a tus categorías, enriquece atributos y textos, y envía datos por feeds de exportación, sync de WooCommerce o la API pública.", "home.product.pipelineAria": "Pipeline de producto", "home.product.p1.label": "Feeds de entrada", "home.product.p1.detail": "CSV / XML desde URLs de proveedor", "home.product.p2.label": "Mapear", "home.product.p2.detail": "Asocia columnas a tus campos", "home.product.p3.label": "Enriquecer", - "home.product.p3.detail": "Categorías, atributos, títulos", + "home.product.p3.detail": "Categorías, atributos, títulos", "home.product.p4.label": "Publicar", - "home.product.p4.detail": "Export · Woo · API", - "pricing.section.badge": "Capacidad de SKU + créditos de IA", - "pricing.section.title": "Empieza gratis. Escala cuando crezca tu catálogo.", - "pricing.section.lead": "Free incluye mapeo de feeds, limpieza básica de producto y etiquetas energéticas UE (EPREL) para hasta 100 SKU (sin créditos de IA). Los planes de pago añaden títulos y descripciones con IA, más capacidad y opciones de exportación — Starter, Growth, Business, o habla con ventas para Enterprise.", - "pricing.section.billingPeriod": "Periodo de facturación", + "home.product.p4.detail": "Export · Woo · API", + "pricing.section.badge": "Capacidad de SKU + créditos de IA", + "pricing.section.title": "Empieza gratis. Escala cuando crezca tu catálogo.", + "pricing.section.lead": "Free incluye mapeo de feeds, limpieza básica de producto y etiquetas energéticas UE (EPREL) para hasta 100 SKU (sin créditos de IA). Los planes de pago añaden títulos y descripciones con IA, más capacidad y opciones de exportación — Starter, Growth, Business, o habla con ventas para Enterprise.", + "pricing.section.billingPeriod": "Periodo de facturación", "pricing.section.monthly": "Mensual", "pricing.section.yearly": "Anual", "pricing.section.savePercent": "Ahorra 20%", - "pricing.section.publicBefore": "Planes públicos: Free, Starter, Growth, Business y Enterprise. Crea una cuenta Free y luego mejora en", + "pricing.section.publicBefore": "Planes públicos: Free, Starter, Growth, Business y Enterprise. Crea una cuenta Free y luego mejora en", "pricing.section.publicOr": "o", "pricing.section.publicAfter": "mediante Stripe Checkout. Enterprise sigue siendo con ventas.", "pricing.section.plansLink": "Planes", - "pricing.section.billingLink": "Facturación", - "pricing.section.capabilitiesTitle": "Para qué está pensado cada plan", - "pricing.section.capabilitiesLead": "Importa feeds, enriquece tu catálogo y luego exporta o sincroniza con WooCommerce", + "pricing.section.billingLink": "Facturación", + "pricing.section.capabilitiesTitle": "Para qué está pensado cada plan", + "pricing.section.capabilitiesLead": "Importa feeds, enriquece tu catálogo y luego exporta o sincroniza con WooCommerce", "pricing.section.faqTitle": "Preguntas frecuentes", - "pricing.section.readyTitle": "¿Listo para mapear tu primer feed?", - "pricing.section.readyLead": "Crea una cuenta Free — sin tarjeta. ¿Ya tienes una? Abre la app o compara planes.", + "pricing.section.readyTitle": "¿Listo para mapear tu primer feed?", + "pricing.section.readyLead": "Crea una cuenta Free — sin tarjeta. ¿Ya tienes una? Abre la app o compara planes.", "pricing.section.contactSales": "Contactar ventas", - "pricing.cap.feeds": "De feeds a catálogo", + "pricing.cap.feeds": "De feeds a catálogo", "pricing.cap.feeds.f1": "Feeds de proveedor CSV / XML / URL", - "pricing.cap.feeds.f2": "Mapeo y validación de campos", - "pricing.cap.feeds.f3": "Fusión multi-proveedor", - "pricing.cap.feeds.f4": "Sincronización programada", - "pricing.cap.feeds.f5": "Transformaciones según categoría", + "pricing.cap.feeds.f2": "Mapeo y validación de campos", + "pricing.cap.feeds.f3": "Fusión multi-proveedor", + "pricing.cap.feeds.f4": "Sincronización programada", + "pricing.cap.feeds.f5": "Transformaciones según categoría", "pricing.cap.processing": "Procesamiento e IA", "pricing.cap.processing.f1": "Limpieza de datos y relleno de atributos (todos los planes)", - "pricing.cap.processing.f2": "Títulos y descripciones con IA (de pago)", - "pricing.cap.processing.f3": "Etiquetas energéticas UE / EPREL (todos los planes)", - "pricing.cap.processing.f4": "Fórmulas, voz de marca, variables", - "pricing.cap.processing.f5": "Créditos gestionados o tu propia clave de IA", - "pricing.cap.export": "Exportación y canales", - "pricing.cap.export.f1": "Feeds de exportación XML / CSV", + "pricing.cap.processing.f2": "Títulos y descripciones con IA (de pago)", + "pricing.cap.processing.f3": "Etiquetas energéticas UE / EPREL (todos los planes)", + "pricing.cap.processing.f4": "Fórmulas, voz de marca, variables", + "pricing.cap.processing.f5": "Créditos gestionados o tu propia clave de IA", + "pricing.cap.export": "Exportación y canales", + "pricing.cap.export.f1": "Feeds de exportación XML / CSV", "pricing.cap.export.f2": "Sync WooCommerce / Shopify", "pricing.cap.export.f3": "API completa", - "pricing.cap.export.f4": "Formatos específicos por canal", + "pricing.cap.export.f4": "Formatos específicos por canal", "pricing.cap.export.f5": "Actualizaciones masivas", - "pricing.cap.limits": "Límites y control", - "pricing.cap.limits.f1": "Límites de SKU (productos)", - "pricing.cap.limits.f2": "Paquetes mensuales de créditos de IA", + "pricing.cap.limits": "Límites y control", + "pricing.cap.limits.f1": "Límites de SKU (productos)", + "pricing.cap.limits.f2": "Paquetes mensuales de créditos de IA", "pricing.cap.limits.f3": "Roles e invitaciones de equipo", "pricing.cap.limits.f4": "Opciones de SLA Enterprise", - "pricing.faq.credits.q": "¿Qué son los créditos de IA?", - "pricing.faq.credits.a": "Los créditos de IA pagan pasos como generar títulos y descripciones. Free incluye 0 créditos de IA — aún puedes mapear feeds y limpiar datos. Paquetes mensuales de pago: Starter 150, Plus 500, Growth 1.200, Business 4.000, Scale 8.000. Enterprise incluye un paquete gestionado grande (y tu propia clave). Desde Growth puedes usar opcionalmente tu propia clave en lugar de créditos gestionados.", + "pricing.faq.credits.q": "¿Qué son los créditos de IA?", + "pricing.faq.credits.a": "Los créditos de IA pagan pasos como generar títulos y descripciones. Free incluye 0 créditos de IA — aún puedes mapear feeds y limpiar datos. Paquetes mensuales de pago: Starter 150, Plus 500, Growth 1.200, Business 4.000, Scale 8.000. Enterprise incluye un paquete gestionado grande (y tu propia clave). Desde Growth puedes usar opcionalmente tu propia clave en lugar de créditos gestionados.", "pricing.faq.packs.q": "Can I buy extra AI credits?", "pricing.faq.packs.a": "Yes. One-time packs: Starter $19 / 500 credits, Growth $59 / 2,000, Catalog $199 / 10,000, Scale $599 / 40,000. Buy from Billing after you have a paid plan (or Free with leftover trial credits). Packs do not change your SKU or feed limits.", - "pricing.faq.limits.q": "¿Qué pasa si alcanzo el límite de productos o créditos?", - "pricing.faq.limits.a": "Te avisamos al acercarte. Cuando llegues al tope de productos o te quedes sin créditos de IA, los trabajos que necesiten esa capacidad se pausan hasta liberar espacio, esperar el siguiente ciclo o mejorar de plan.", - "pricing.faq.change.q": "¿Puedo subir o bajar de plan?", - "pricing.faq.change.a": "Sí. Empieza en Free y luego pasa a Starter, Plus, Growth, Business o Scale desde Planes o Facturación (Stripe Checkout). Enterprise siempre es con ventas.", - "pricing.faq.free.q": "¿Qué incluye Free?", - "pricing.faq.free.a": "Free para siempre: 50 productos, un feed, limpieza de datos y relleno de atributos, etiquetas energéticas UE (EPREL — datos públicos, sin créditos) y una exportación manual — con 0 créditos de IA. Sin tarjeta. Mejora cuando necesites títulos y descripciones con IA o más capacidad.", - "pricing.faq.why.q": "¿Por qué no pagar por producto como las herramientas solo de contenido?", - "pricing.faq.why.a": "Descrybe cubre el camino completo de feed de proveedor a catálogo a WooCommerce o exportación — no solo copy con IA. Pagas por capacidad de plataforma (productos y feeds); la IA es una capa de uso encima.", - "pricing.faq.annual.q": "¿Cómo funciona la facturación anual?", - "pricing.faq.annual.a": "La facturación anual es unos 20% menos que el precio mensual. Empieza gratis y elige anual en Checkout al mejorar (o contacta ventas).", + "pricing.faq.limits.q": "¿Qué pasa si alcanzo el límite de productos o créditos?", + "pricing.faq.limits.a": "Te avisamos al acercarte. Cuando llegues al tope de productos o te quedes sin créditos de IA, los trabajos que necesiten esa capacidad se pausan hasta liberar espacio, esperar el siguiente ciclo o mejorar de plan.", + "pricing.faq.change.q": "¿Puedo subir o bajar de plan?", + "pricing.faq.change.a": "Sí. Empieza en Free y luego pasa a Starter, Plus, Growth, Business o Scale desde Planes o Facturación (Stripe Checkout). Enterprise siempre es con ventas.", + "pricing.faq.free.q": "¿Qué incluye Free?", + "pricing.faq.free.a": "Free para siempre: 50 productos, un feed, limpieza de datos y relleno de atributos, etiquetas energéticas UE (EPREL — datos públicos, sin créditos) y una exportación manual — con 0 créditos de IA. Sin tarjeta. Mejora cuando necesites títulos y descripciones con IA o más capacidad.", + "pricing.faq.why.q": "¿Por qué no pagar por producto como las herramientas solo de contenido?", + "pricing.faq.why.a": "Descrybe cubre el camino completo de feed de proveedor a catálogo a WooCommerce o exportación — no solo copy con IA. Pagas por capacidad de plataforma (productos y feeds); la IA es una capa de uso encima.", + "pricing.faq.annual.q": "¿Cómo funciona la facturación anual?", + "pricing.faq.annual.a": "La facturación anual es unos 20% menos que el precio mensual. Empieza gratis y elige anual en Checkout al mejorar (o contacta ventas).", "pricing.calc.badge": "Plan calculator", "pricing.calc.title": "Find the right plan", "pricing.calc.lead": "Enter feeds, catalog size, and how many products you want to enhance with AI (count each language pass).", @@ -5265,12 +5266,12 @@ export const es: MessageDict = { "pricing.calc.skus": "Catalog products (SKUs)", "pricing.calc.skusHint": "Total products you will store and process", "pricing.calc.aiVolume": "AI process volume", - "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", + "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", "pricing.calc.recommendedLabel": "Recommended", "pricing.calc.budgetLabel": "Budget option", "pricing.calc.coversCredits": "Needs about {count} AI credits / month", "pricing.calc.aiIncluded": "Included monthly credits cover this AI volume", - "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", + "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", "pricing.calc.orYearly": "or ~{amount}/mo yearly", "pricing.calc.budgetNote": "Lower list price with yearly discount and/or credit packs when that still fits.", "pricing.calc.noBudget": "The recommended plan is already the leanest fit for these inputs.", @@ -5278,29 +5279,29 @@ export const es: MessageDict = { "pricing.calc.enterpriseBody": "Your feeds or catalog size exceed self-serve caps. Talk to sales for unlimited capacity and a managed AI grant or BYOK.", "pricing.calc.ctaPlan": "Choose {name}", "pricing.calc.disclaimer": "Estimates use list prices and ~2 credits per AI product enhance. Checkout prices come from Stripe. A1 and other client deals stay admin-only.", - "pricing.card.mostPopular": "Más popular", + "pricing.card.mostPopular": "Más popular", "pricing.card.custom": "Personalizado", "pricing.card.forever": "para siempre", "pricing.card.perMonth": "mes", - "pricing.card.perYear": "año", + "pricing.card.perYear": "año", "pricing.card.savePerMonth": "Ahorra ${amount}/mes", "pricing.card.discountBadge": "-20%", "pricing.card.unlimitedSkus": "SKU ilimitados", - "pricing.card.oneMSkus": "Más de 1M de SKU", + "pricing.card.oneMSkus": "Más de 1M de SKU", "pricing.card.upToSkus": "Hasta {count} SKU", - "pricing.card.unlimitedAi": "Créditos de IA ilimitados", - "pricing.card.zeroCredits": "0 créditos de IA / mes", - "pricing.card.creditsPerMonth": "{count} créditos de IA / mes", + "pricing.card.unlimitedAi": "Créditos de IA ilimitados", + "pricing.card.zeroCredits": "0 créditos de IA / mes", + "pricing.card.creditsPerMonth": "{count} créditos de IA / mes", "pricing.card.showLess": "Mostrar menos", - "pricing.card.showMoreFeature": "Mostrar {count} función más", - "pricing.card.showMoreFeatures": "Mostrar {count} funciones más", + "pricing.card.showMoreFeature": "Mostrar {count} función más", + "pricing.card.showMoreFeatures": "Mostrar {count} funciones más", "pricing.card.upgradeTo": "Mejorar a {name}", - "pricing.plan.free.description": "Mapea un feed de muestra y limpia datos de producto — sin tarjeta", - "pricing.plan.starter.description": "Catálogos pequeños que necesitan títulos y descripciones con IA", - "pricing.plan.plus.description": "Más productos, feeds e IA para catálogos en crecimiento", + "pricing.plan.free.description": "Mapea un feed de muestra y limpia datos de producto — sin tarjeta", + "pricing.plan.starter.description": "Catálogos pequeños que necesitan títulos y descripciones con IA", + "pricing.plan.plus.description": "Más productos, feeds e IA para catálogos en crecimiento", "pricing.plan.growth.description": "Feeds multi-proveedor hacia tiendas y exportaciones shopping", - "pricing.plan.business.description": "Catálogos mid-market con BYOK", - "pricing.plan.scale.description": "Catálogos a escala de distribuidor con soporte prioritario", + "pricing.plan.business.description": "Catálogos mid-market con BYOK", + "pricing.plan.scale.description": "Catálogos a escala de distribuidor con soporte prioritario", "pricing.plan.enterprise.description": "Capacidad ilimitada, SLA y un equipo de cuenta dedicado", "pricing.feature.credits100": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits100starter": "100 AI credits / month (~50% catalog cover)", @@ -5330,14 +5331,14 @@ export const es: MessageDict = { "pricing.feature.twelveFeedSources": "12 feed sources", "pricing.feature.twentyFiveFeedSources": "25 feed sources", "pricing.feature.cleanData": "Limpia datos, analiza specs y rellena campos", - "pricing.feature.eprel": "Etiquetas energéticas UE (EPREL)", - "pricing.feature.zeroCredits": "0 créditos de IA / mes", - "pricing.feature.oneManualExport": "1 feed de exportación manual", + "pricing.feature.eprel": "Etiquetas energéticas UE (EPREL)", + "pricing.feature.zeroCredits": "0 créditos de IA / mes", + "pricing.feature.oneManualExport": "1 feed de exportación manual", "pricing.feature.twoExports": "2 export feeds", "pricing.feature.fourExports": "4 export feeds", - "pricing.feature.wooTestOnly": "Solo prueba de conexión WooCommerce", + "pricing.feature.wooTestOnly": "Solo prueba de conexión WooCommerce", "pricing.feature.upTo2Seats": "Hasta 2 asientos", - "pricing.feature.aiTitles": "Títulos y descripciones con IA", + "pricing.feature.aiTitles": "Títulos y descripciones con IA", "pricing.feature.liveStoreSync": "Sync en vivo con la tienda", "pricing.feature.apiAccess": "Acceso a la API", "pricing.feature.byok": "Trae tu propia clave de IA", @@ -5355,7 +5356,7 @@ export const es: MessageDict = { "pricing.feature.credits12500": "12,500 AI credits / month (~25% catalog cover)", "pricing.feature.credits30000": "30,000 AI credits / month (~20% catalog cover)", "pricing.feature.upTo75kSkus": "Up to 75,000 SKUs", - "pricing.feature.threeExports": "3 feeds de exportación", + "pricing.feature.threeExports": "3 feeds de exportación", "pricing.feature.sixExports": "6 export feeds", "pricing.feature.tenExports": "10 export feeds", "pricing.feature.fullWooSync": "Sync completa de WooCommerce", @@ -5370,10 +5371,10 @@ export const es: MessageDict = { "pricing.feature.upTo55kSkus": "Up to 55,000 SKUs", "pricing.feature.upTo5000Skus": "Up to 5,000 SKUs", "pricing.feature.eightFeedSources": "8 fuentes de feed", - "pricing.feature.credits500": "500 créditos de IA / mes", + "pricing.feature.credits500": "500 créditos de IA / mes", "pricing.feature.credits1250": "1,250 AI credits / month (~25% catalog cover)", "pricing.feature.credits5000": "5,000 AI credits / month (~25% catalog cover)", - "pricing.feature.eightExports": "8 feeds de exportación", + "pricing.feature.eightExports": "8 feeds de exportación", "pricing.feature.fifteenExports": "15 export feeds", "pricing.feature.wooShopifySync": "Sync completa WooCommerce + Shopify", "pricing.feature.upTo10kSkus": "Hasta 10.000 SKU", @@ -5382,12 +5383,12 @@ export const es: MessageDict = { "pricing.feature.tenFeedSources": "10 feed sources", "pricing.feature.twentyFeedSources": "20 feed sources", "pricing.feature.thirtyFeedSources": "30 feed sources", - "pricing.feature.credits1200": "1.200 créditos de IA / mes", + "pricing.feature.credits1200": "1.200 créditos de IA / mes", "pricing.feature.credits10000": "10,000 AI credits / month (~50% catalog cover)", "pricing.feature.credits25000": "25,000 AI credits / month (~50% catalog cover)", - "pricing.feature.twentyExports": "20 feeds de exportación", + "pricing.feature.twentyExports": "20 feeds de exportación", "pricing.feature.fortyExports": "40 export feeds", - "pricing.feature.fullFormulas": "Fórmulas y variables completas", + "pricing.feature.fullFormulas": "Fórmulas y variables completas", "pricing.feature.fullApi": "Acceso completo a la API", "pricing.feature.byokAddon": "Complemento bring-your-own-key", "pricing.feature.emailSupport24h": "Soporte por email (24 h)", @@ -5395,10 +5396,10 @@ export const es: MessageDict = { "pricing.feature.upTo50kSkus": "Up to 50,000 SKUs", "pricing.feature.fortyFeedSources": "40 fuentes de feed", "pricing.feature.fiftyFeedSources": "50 feed sources", - "pricing.feature.credits4000": "4.000 créditos de IA / mes", + "pricing.feature.credits4000": "4.000 créditos de IA / mes", "pricing.feature.credits40000": "40,000 AI credits / month (~50% catalog cover)", "pricing.feature.credits50000half": "50,000 AI credits / month (~50% catalog cover)", - "pricing.feature.unlimitedExports": "Feeds de exportación ilimitados", + "pricing.feature.unlimitedExports": "Feeds de exportación ilimitados", "pricing.feature.fullApiWebhooks": "API completa", "pricing.feature.byokIncluded": "Tu propia clave de IA incluida", "pricing.feature.priorityEmail": "Soporte prioritario por email", @@ -5406,18 +5407,18 @@ export const es: MessageDict = { "pricing.feature.upTo150kSkus": "Up to 150,000 SKUs", "pricing.feature.hundredFeedSources": "100 fuentes de feed", "pricing.feature.hundredFiftyFeedSources": "150 feed sources", - "pricing.feature.credits8000": "8.000 créditos de IA / mes", + "pricing.feature.credits8000": "8.000 créditos de IA / mes", "pricing.feature.credits50000": "50,000 AI credits / month (~25% catalog cover)", "pricing.feature.credits120000": "120,000 AI credits / month (~40% catalog cover)", "pricing.feature.prioritySlack": "Soporte prioritario + Slack", "pricing.feature.unlimitedSkus": "SKU ilimitados", "pricing.feature.unlimitedFeeds": "Fuentes de feed ilimitadas", - "pricing.feature.unlimitedAiOwnKey": "Créditos de IA ilimitados / clave propia", + "pricing.feature.unlimitedAiOwnKey": "Créditos de IA ilimitados / clave propia", "pricing.feature.ssoWebhooksAm": "SSO, gestor de cuenta dedicado", "pricing.feature.customIntegrations": "Integraciones a medida", "pricing.feature.slaPriority": "SLA y soporte prioritario", "pricing.pack.tiny.name": "Nano pack", - "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", + "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", "pricing.pack.small.name": "Starter pack", "pricing.pack.small.desc": "Extra AI for fixes and tests (~250 products)", "pricing.pack.medium.name": "Growth pack", @@ -5427,97 +5428,97 @@ export const es: MessageDict = { "pricing.pack.xl.name": "Scale pack", "pricing.pack.xl.desc": "Heavy usage / agency bursts (~20,000 products)", "pricing.pack.xxl.name": "Business pack", - "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", + "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", "pricing.pack.mega.name": "Scale pack", - "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", - "pricing.section.faqDescription": "Respuestas claras sobre planes, créditos y lo que incluye Free.", + "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", + "pricing.section.faqDescription": "Respuestas claras sobre planes, créditos y lo que incluye Free.", "billing.buyCreditPacks": "Buy AI credit packs", - "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", - "billing.packCredits": "{credits} créditos", + "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", + "billing.packCredits": "{credits} créditos", "billing.packApproxProducts": "~{count} AI products", "billing.buyPack": "Buy", - "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", + "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", "billing.packCheckoutFailed": "Could not start credit pack checkout.", "empty.default.noItems": "No se encontraron elementos.", "settings.tabLockedHint": "Not on your plan", "stores.connectorLocked": "Not on your plan", "stores.connectorUpgrade": "Upgrade to unlock", - "plan.upgrade.title": "Esta función no está en tu plan", + "plan.upgrade.title": "Esta función no está en tu plan", "plan.upgrade.message": "Mejora tu plan para desbloquear esta parte de Descrybe.", - "plan.upgrade.defaultMessage": "Tu plan actual no incluye esta parte de Descrybe. Mejora el plan para desbloquearla, o pide a un administrador de la empresa si no puedes cambiar la facturación.", - "plan.upgrade.sectionOff.title": "Esta función no está disponible temporalmente", - "plan.upgrade.sectionOff.message": "Esta parte de Descrybe está desactivada en la plataforma ahora mismo. No es un problema de upgrade: inténtalo más tarde o contacta con soporte.", + "plan.upgrade.defaultMessage": "Tu plan actual no incluye esta parte de Descrybe. Mejora el plan para desbloquearla, o pide a un administrador de la empresa si no puedes cambiar la facturación.", + "plan.upgrade.sectionOff.title": "Esta función no está disponible temporalmente", + "plan.upgrade.sectionOff.message": "Esta parte de Descrybe está desactivada en la plataforma ahora mismo. No es un problema de upgrade: inténtalo más tarde o contacta con soporte.", "plan.upgrade.sectionOff.cta": "Volver al panel", "plan.upgrade.stores.message": "Los conectores de WooCommerce y Shopify requieren un plan que incluya Tiendas. Mejora el plan para conectar esas tiendas, o sigue con feeds y la API en tu plan actual.", "plan.upgrade.stillWorks.title": "Lo que sigue funcionando en tu plan", "plan.upgrade.stillWorks.feeds.label": "Feeds de entrada", - "plan.upgrade.stillWorks.feeds.description": "Añade URLs CSV o XML y cargas de archivos para sincronizar catálogos sin conectores de tienda.", - "plan.upgrade.stillWorks.export.label": "Feeds de exportación", + "plan.upgrade.stillWorks.feeds.description": "Añade URLs CSV o XML y cargas de archivos para sincronizar catálogos sin conectores de tienda.", + "plan.upgrade.stillWorks.export.label": "Feeds de exportación", "plan.upgrade.stillWorks.export.description": "Genera feeds salientes para canales de compra y partners.", "plan.upgrade.stillWorks.processing.label": "Tareas en segundo plano", - "plan.upgrade.stillWorks.processing.description": "Supervisa trabajos de IA y catálogo en Procesamiento: disponible en tu plan aunque no tengas conectores de tienda.", + "plan.upgrade.stillWorks.processing.description": "Supervisa trabajos de IA y catálogo en Procesamiento: disponible en tu plan aunque no tengas conectores de tienda.", "plan.upgrade.stillWorks.api.label": "Claves API", - "plan.upgrade.stillWorks.api.description": "Crea una clave en Ajustes para usar /api/v1 — el secreto solo se muestra una vez.", + "plan.upgrade.stillWorks.api.description": "Crea una clave en Ajustes para usar /api/v1 — el secreto solo se muestra una vez.", "plan.upgrade.stillWorks.docs.label": "Docs de la API", - "plan.upgrade.stillWorks.docs.description": "Lee la visión general de la API e intégrala sin WooCommerce ni Shopify.", + "plan.upgrade.stillWorks.docs.description": "Lee la visión general de la API e intégrala sin WooCommerce ni Shopify.", "plan.upgrade.feature.settings.api_keys": "Las claves API requieren un plan de pago", - "plan.upgrade.feature.catalog.products.process_ai_titles": "Los títulos con IA son una función de pago", - "plan.upgrade.feature.catalog.products.process_ai_descriptions": "Las descripciones con IA son una función de pago", - "plan.upgrade.feature.marketing.campaigns.generate_ai": "La IA de campañas requiere un plan de pago", - "plan.upgrade.feature.marketing.campaigns.send": "El envío real de campañas requiere un plan de pago", + "plan.upgrade.feature.catalog.products.process_ai_titles": "Los títulos con IA son una función de pago", + "plan.upgrade.feature.catalog.products.process_ai_descriptions": "Las descripciones con IA son una función de pago", + "plan.upgrade.feature.marketing.campaigns.generate_ai": "La IA de campañas requiere un plan de pago", + "plan.upgrade.feature.marketing.campaigns.send": "El envío real de campañas requiere un plan de pago", "plan.upgrade.feature.marketing.brand_ai_apply": "La voz de marca en la IA requiere un plan de pago", "plan.upgrade.feature.marketing.seo.ai_rewrite": "La reescritura SEO con IA requiere un plan de pago", "plan.upgrade.feature.integrations.ai.byok": "Traer tu propia clave de IA empieza en Growth", "plan.upgrade.feature.capability.byok": "Traer tu propia clave de IA empieza en Growth", - "plan.upgrade.feature.marketing.campaigns": "Las campañas no están en tu plan", - "plan.upgrade.feature.marketing.content_calendar": "El calendario de contenido no está en tu plan", - "plan.upgrade.feature.marketing.seo": "Las herramientas SEO no están en tu plan", - "plan.upgrade.feature.marketing.brand_kit": "El kit de marca no está en tu plan", - "plan.upgrade.feature.marketing.reviews": "Las reseñas no están en tu plan", - "plan.upgrade.feature.integrations.ai": "Las integraciones de IA no están en tu plan", - "plan.upgrade.feature.integrations.email": "El envío de email no está en tu plan", - "plan.upgrade.feature.processing.monitor": "Procesamiento no está en tu plan", - "plan.upgrade.feature.stores.hub": "Los conectores de tienda no están en tu plan", - "plan.upgrade.feature.stores.woocommerce": "WooCommerce no está en tu plan", - "plan.upgrade.feature.stores.shopify": "Shopify no está en tu plan", - "plan.upgrade.feature.support.center": "El Centro de soporte no está en tu plan", - "plan.upgrade.feature.support.ticket_create": "Crear tickets de soporte no está en tu plan", - "plan.upgrade.feature.support.ticket_thread": "Los hilos de tickets de soporte no están en tu plan", - "plan.upgrade.feature.catalog.structured_descriptions": "Las descripciones estructuradas no están en tu plan", - "plan.upgrade.feature.catalog.vector_categories": "Las categorías vectoriales no están en tu plan", - "plan.checkingAccess": "Comprobando acceso al plan…", + "plan.upgrade.feature.marketing.campaigns": "Las campañas no están en tu plan", + "plan.upgrade.feature.marketing.content_calendar": "El calendario de contenido no está en tu plan", + "plan.upgrade.feature.marketing.seo": "Las herramientas SEO no están en tu plan", + "plan.upgrade.feature.marketing.brand_kit": "El kit de marca no está en tu plan", + "plan.upgrade.feature.marketing.reviews": "Las reseñas no están en tu plan", + "plan.upgrade.feature.integrations.ai": "Las integraciones de IA no están en tu plan", + "plan.upgrade.feature.integrations.email": "El envío de email no está en tu plan", + "plan.upgrade.feature.processing.monitor": "Procesamiento no está en tu plan", + "plan.upgrade.feature.stores.hub": "Los conectores de tienda no están en tu plan", + "plan.upgrade.feature.stores.woocommerce": "WooCommerce no está en tu plan", + "plan.upgrade.feature.stores.shopify": "Shopify no está en tu plan", + "plan.upgrade.feature.support.center": "El Centro de soporte no está en tu plan", + "plan.upgrade.feature.support.ticket_create": "Crear tickets de soporte no está en tu plan", + "plan.upgrade.feature.support.ticket_thread": "Los hilos de tickets de soporte no están en tu plan", + "plan.upgrade.feature.catalog.structured_descriptions": "Las descripciones estructuradas no están en tu plan", + "plan.upgrade.feature.catalog.vector_categories": "Las categorías vectoriales no están en tu plan", + "plan.checkingAccess": "Comprobando acceso al plan…", "upgradeBanner.comparePlans": "Comparar planes", "upgradeBanner.talkToSales": "Hablar con ventas", - "commandPalette.closeAria": "Cerrar búsqueda", - "commandPalette.ariaLabel": "Buscar páginas", - "commandPalette.placeholder": "Buscar páginas…", - "commandPalette.searchAria": "Buscar páginas", - "commandPalette.destinationsAria": "Páginas", - "commandPalette.noMatches": "No hay páginas coincidentes", - "commandPalette.announceIdleOne": "Búsqueda. {count} página.", - "commandPalette.announceIdleMany": "Búsqueda. {count} páginas.", - "commandPalette.announceNone": "No hay páginas coincidentes.", - "commandPalette.announceMatchOne": "{count} página coincidente.", - "commandPalette.announceMatchMany": "{count} páginas coincidentes.", - "vector.title": "Prueba de categorías vectoriales", - "vector.description": "Busca en el índice de categorías vectoriales cuando Pinecone esté configurado. Crear índice e inicializar aún no están disponibles en v2.", - "vector.probing": "Comprobando la API de categorías vectoriales…", - "vector.unavailable": "Las categorías vectoriales aún no están en este backend. No hay nada que ejecutar aquí hasta que /api/vector-categories/* esté conectado.", - "vector.browseCategories": "Explorar categorías", + "commandPalette.closeAria": "Cerrar búsqueda", + "commandPalette.ariaLabel": "Buscar páginas", + "commandPalette.placeholder": "Buscar páginas…", + "commandPalette.searchAria": "Buscar páginas", + "commandPalette.destinationsAria": "Páginas", + "commandPalette.noMatches": "No hay páginas coincidentes", + "commandPalette.announceIdleOne": "Búsqueda. {count} página.", + "commandPalette.announceIdleMany": "Búsqueda. {count} páginas.", + "commandPalette.announceNone": "No hay páginas coincidentes.", + "commandPalette.announceMatchOne": "{count} página coincidente.", + "commandPalette.announceMatchMany": "{count} páginas coincidentes.", + "vector.title": "Prueba de categorías vectoriales", + "vector.description": "Busca en el índice de categorías vectoriales cuando Pinecone esté configurado. Crear índice e inicializar aún no están disponibles en v2.", + "vector.probing": "Comprobando la API de categorías vectoriales…", + "vector.unavailable": "Las categorías vectoriales aún no están en este backend. No hay nada que ejecutar aquí hasta que /api/vector-categories/* esté conectado.", + "vector.browseCategories": "Explorar categorías", "vector.initHeading": "Inicializar base de datos vectorial", - "vector.initComingSoon": "Crear índice e Inicializar BD vectorial aún no están disponibles en v2 (próximamente). La búsqueda sigue funcionando cuando Pinecone está configurado.", - "vector.createIndex": "Crear índice", + "vector.initComingSoon": "Crear índice e Inicializar BD vectorial aún no están disponibles en v2 (próximamente). La búsqueda sigue funcionando cuando Pinecone está configurado.", + "vector.createIndex": "Crear índice", "vector.initDb": "Inicializar BD vectorial", - "vector.searchHeading": "Buscar categorías", - "vector.searchPlaceholder": "Introduce la descripción del producto…", + "vector.searchHeading": "Buscar categorías", + "vector.searchPlaceholder": "Introduce la descripción del producto…", "vector.results": "Resultados:", - "vector.categoryLabel": "Categoría:", + "vector.categoryLabel": "Categoría:", "vector.idLabel": "ID:", - "vector.scoreLabel": "Puntuación:", - "switcher.switching": "Cambiando…", + "vector.scoreLabel": "Puntuación:", + "switcher.switching": "Cambiando…", "switcher.returnTo": "Volver a {email}", "switcher.switchUser": "Cambiar de usuario", - "switcher.loadingUsers": "Cargando usuarios…", + "switcher.loadingUsers": "Cargando usuarios…", "switcher.empty": "No se encontraron usuarios intercambiables.", "switcher.noCompany": "Sin empresa", "switcher.unknownCompany": "Empresa desconocida", @@ -5527,11 +5528,11 @@ export const es: MessageDict = { "companySwitcher.returnTo": "Volver a {name}", "companySwitcher.returnHome": "Volver a la empresa de origen", "storeReconnect.primaryLabel": "Reconectar tienda", - "storeReconnect.titlePlural": "Reconectar tiendas tras la migración", - "storeReconnect.titleChannel": "Reconectar {channel} tras la migración", - "storeReconnect.titleSingular": "Reconectar tienda tras la migración", - "storeReconnect.messageWithItems": "Las credenciales de la API de la tienda no se transfirieron (o no se pueden usar) tras la migración de la plataforma. Esto no es una sincronización rota: reconecta cada tienda y luego prueba la conexión antes de encolar una sincronización.", - "storeReconnect.messageSingle": "Las credenciales de la API de {channel} no se transfirieron (o no se pueden usar) tras la migración de la plataforma. Esto no es una sincronización rota: pega credenciales nuevas, guarda y prueba la conexión antes de encolar una sincronización.", + "storeReconnect.titlePlural": "Reconectar tiendas tras la migración", + "storeReconnect.titleChannel": "Reconectar {channel} tras la migración", + "storeReconnect.titleSingular": "Reconectar tienda tras la migración", + "storeReconnect.messageWithItems": "Las credenciales de la API de la tienda no se transfirieron (o no se pueden usar) tras la migración de la plataforma. Esto no es una sincronización rota: reconecta cada tienda y luego prueba la conexión antes de encolar una sincronización.", + "storeReconnect.messageSingle": "Las credenciales de la API de {channel} no se transfirieron (o no se pueden usar) tras la migración de la plataforma. Esto no es una sincronización rota: pega credenciales nuevas, guarda y prueba la conexión antes de encolar una sincronización.", "storeReconnect.channelFallback": "Tienda", "storeReconnect.askAdmin": "Pide a un administrador de la empresa que reconecte: solo los administradores pueden guardar credenciales de tienda.", "storeReconnect.reconnectItem": "Reconectar {label}", @@ -5556,7 +5557,7 @@ export const es: MessageDict = { "admin.storeReconnect.listTitle": "Connected but invalid", "admin.storeReconnect.metric.showing": "Rows shown", "admin.storeReconnect.metric.total": "Gaps total", - "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", + "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", "admin.storeReconnect.loadFailed": "Could not load store reconnect inventory.", "admin.storeReconnect.refresh": "Refresh", "admin.storeReconnect.description": "Companies with a connected store identity but missing or unusable API credentials (cutover credential gaps).", @@ -5564,50 +5565,50 @@ export const es: MessageDict = { "admin.nav.storeReconnect": "Store reconnect", "storeReconnect.wizardHint": "Prefer a step-by-step flow? Open Guided setup (/stores/wizard), or reconnect the channel below and Test Connection before syncing.", "storeReconnect.wizardLabel": "Guided setup", - "storeReconnect.reviewsHint": "La importación de reseñas no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", - "storeReconnect.ordersHint": "La importación de pedidos no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", - "productSync.directionTitle": "Productos: Descrybe → tienda", - "productSync.outbound": "Descrybe → {channel}", - "productSync.outboundBody": "— envía productos Descrybe procesados a la tienda (crea o actualiza productos remotos coincidentes). No importa el catálogo de la tienda a Descrybe.", - "productSync.firstSync": "Primera sincronización", - "productSync.firstSyncBody": "— los productos sin coincidencia se crean en {channel}. Las sincronizaciones posteriores actualizan productos ya vinculados por id o estrategia de coincidencia.", + "storeReconnect.reviewsHint": "La importación de reseñas no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", + "storeReconnect.ordersHint": "La importación de pedidos no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", + "productSync.directionTitle": "Productos: Descrybe → tienda", + "productSync.outbound": "Descrybe → {channel}", + "productSync.outboundBody": "— envía productos Descrybe procesados a la tienda (crea o actualiza productos remotos coincidentes). No importa el catálogo de la tienda a Descrybe.", + "productSync.firstSync": "Primera sincronización", + "productSync.firstSyncBody": "— los productos sin coincidencia se crean en {channel}. Las sincronizaciones posteriores actualizan productos ya vinculados por id o estrategia de coincidencia.", "productSync.reSync": "Re-sincronizar", - "productSync.reSyncBody": "— los productos remotos coincidentes pueden sobrescribirse con contenido de Descrybe ({count} vinculados hasta ahora).", - "productSync.queued": "Sincronización de productos en cola", - "productSync.live.queued": "En cola — esperando al worker", - "productSync.live.running": "Sincronización en curso", - "productSync.live.watching": "Observando el estado… los recuentos aparecen al terminar.", - "productSync.live.success": "Sincronización terminada: {total} total · {created} creados · {updated} actualizados · {failed} fallidos · {skipped} omitidos", - "productSync.live.partial": "Sincronización con fallos: {total} total · {created} creados · {updated} actualizados · {failed} fallidos · {skipped} omitidos", - "productSync.live.failed": "Sincronización fallida{detail}.", - "productSync.live.timedOut": "Aún en curso — actualiza más tarde para el estado y los recuentos finales.", - "productSync.live.ordersSuccess": "Sincronización de pedidos terminada ({status}).", - "productSync.live.reviewsSuccess": "Sincronización de reseñas terminada ({status}).", - "productSync.retry": "Reintentar sincronización", - "productSync.lastStatus": "Última: {status}", - "productSync.dryRun": "Simulación", - "productSync.lastSyncAt": "Última sincronización de productos: {date}", - "productSync.noneYet": "Aún no se ha completado ninguna sincronización de productos.", - "productSync.lastRun": "Última ejecución: {total} total · {created} creados · {updated} actualizados · {failed} fallidos · {skipped} omitidos", - "productSync.needsReconnect": "La sincronización de productos no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", - "productSync.scheduleTitle": "Programación de sync automática de productos", - "productSync.scheduleHelp": "Como los intervalos de feeds: define cada cuánto se envían productos a la tienda, o pausa la programación. La cola manual sigue disponible. No se usan webhooks de tienda: solo sondeo/cola.", + "productSync.reSyncBody": "— los productos remotos coincidentes pueden sobrescribirse con contenido de Descrybe ({count} vinculados hasta ahora).", + "productSync.queued": "Sincronización de productos en cola", + "productSync.live.queued": "En cola — esperando al worker", + "productSync.live.running": "Sincronización en curso", + "productSync.live.watching": "Observando el estado… los recuentos aparecen al terminar.", + "productSync.live.success": "Sincronización terminada: {total} total · {created} creados · {updated} actualizados · {failed} fallidos · {skipped} omitidos", + "productSync.live.partial": "Sincronización con fallos: {total} total · {created} creados · {updated} actualizados · {failed} fallidos · {skipped} omitidos", + "productSync.live.failed": "Sincronización fallida{detail}.", + "productSync.live.timedOut": "Aún en curso — actualiza más tarde para el estado y los recuentos finales.", + "productSync.live.ordersSuccess": "Sincronización de pedidos terminada ({status}).", + "productSync.live.reviewsSuccess": "Sincronización de reseñas terminada ({status}).", + "productSync.retry": "Reintentar sincronización", + "productSync.lastStatus": "Última: {status}", + "productSync.dryRun": "Simulación", + "productSync.lastSyncAt": "Última sincronización de productos: {date}", + "productSync.noneYet": "Aún no se ha completado ninguna sincronización de productos.", + "productSync.lastRun": "Última ejecución: {total} total · {created} creados · {updated} actualizados · {failed} fallidos · {skipped} omitidos", + "productSync.needsReconnect": "La sincronización de productos no puede ejecutarse hasta reconectar las credenciales tras la migración. En la pestaña Conexión: Guardar, luego Probar la conexión.", + "productSync.scheduleTitle": "Programación de sync automática de productos", + "productSync.scheduleHelp": "Como los intervalos de feeds: define cada cuánto se envían productos a la tienda, o pausa la programación. La cola manual sigue disponible. No se usan webhooks de tienda: solo sondeo/cola.", "productSync.scheduleInterval": "Intervalo de sync (horas)", - "productSync.scheduleIntervalHint": "1–168 horas. Por defecto 6 horas si no está definido en el servidor.", - "productSync.schedulePause": "Pausar sync automática", - "productSync.schedulePauseHint": "Detiene solo los envíos programados. Aún puedes encolar un sync manual.", - "productSync.scheduleSave": "Guardar programación", - "productSync.scheduleSaved": "Programación de sync de productos guardada.", - "productSync.schedulePausedSaved": "Sync automática de productos en pausa.", - "productSync.scheduleSaveFailed": "No se pudo guardar la programación de sync", - "productSync.schedulePausedBadge": "Programación en pausa", - "productSync.scheduleActiveBadge": "Programación activa", - "productSync.scheduleNeedsConfig": "Guarda primero la conexión de la tienda", + "productSync.scheduleIntervalHint": "1–168 horas. Por defecto 6 horas si no está definido en el servidor.", + "productSync.schedulePause": "Pausar sync automática", + "productSync.schedulePauseHint": "Detiene solo los envíos programados. Aún puedes encolar un sync manual.", + "productSync.scheduleSave": "Guardar programación", + "productSync.scheduleSaved": "Programación de sync de productos guardada.", + "productSync.schedulePausedSaved": "Sync automática de productos en pausa.", + "productSync.scheduleSaveFailed": "No se pudo guardar la programación de sync", + "productSync.schedulePausedBadge": "Programación en pausa", + "productSync.scheduleActiveBadge": "Programación activa", + "productSync.scheduleNeedsConfig": "Guarda primero la conexión de la tienda", "productSync.scheduleAdminOnly": "Se requiere admin de la empresa", "productSync.delivery.title": "Las actualizaciones usan sondeo, no webhooks de la tienda", - "productSync.delivery.body": "Descrybe no recibe webhooks de Shopify ni WooCommerce. Los envíos de productos se ejecutan al encolarlos o según el horario automático. Esta página sigue el progreso consultando el estado de la conexión — no con eventos push en vivo de la tienda.", - "productSync.delivery.inboundNote": "Pedidos y reseñas también usan descargas en cola (programadas o manuales), no webhooks en vivo.", - "productSync.delivery.hubNote": "Los conectores de tienda sincronizan según horario o al encolar un trabajo — no vía webhooks en vivo.", + "productSync.delivery.body": "Descrybe no recibe webhooks de Shopify ni WooCommerce. Los envíos de productos se ejecutan al encolarlos o según el horario automático. Esta página sigue el progreso consultando el estado de la conexión — no con eventos push en vivo de la tienda.", + "productSync.delivery.inboundNote": "Pedidos y reseñas también usan descargas en cola (programadas o manuales), no webhooks en vivo.", + "productSync.delivery.hubNote": "Los conectores de tienda sincronizan según horario o al encolar un trabajo — no vía webhooks en vivo.", "productSync.delivery.badge.manual": "Cola manual", "productSync.delivery.badge.scheduled": "Programado cada {hours} h", "productSync.delivery.badge.scheduledDefault": "Programado (predeterminado del servidor)", @@ -5627,21 +5628,21 @@ export const es: MessageDict = { "productSync.scope.products": "Specific products", "productSync.scope.productsHint": "Optional. Search and select processed products to push only those.", "productSync.scope.productsOverrideHint": "Selected products override status, category, and max-products filters for this sync.", - "productSync.scope.productsSearch": "Search products…", - "productSync.scope.productsLoading": "Loading products…", + "productSync.scope.productsSearch": "Search products…", + "productSync.scope.productsLoading": "Loading products…", "productSync.scope.productsEmpty": "No processed products found.", "productSync.scope.productsSelected": "{count} selected", "productSync.scope.productsSelectedList": "Selected products", "productSync.scope.productsClear": "Clear selection", "productSync.scope.productsMax": "Maximum {max} products", - "store.syncingLive": "Sincronizando…", + "store.syncingLive": "Sincronizando…", "files.recentUploads": "Cargas recientes", "files.colFileName": "Nombre del archivo", "files.colKind": "Tipo", "files.colUploaded": "Subido", "files.colRows": "Filas", - "files.loading": "Cargando archivos…", - "files.empty": "Aún no hay cargas.", + "files.loading": "Cargando archivos…", + "files.empty": "Aún no hay cargas.", "products.filters.sortProducts": "Ordenar productos", "products.table.options": "Opciones", }; diff --git a/apps/web/src/lib/i18n/messages/fr.ts b/apps/web/src/lib/i18n/messages/fr.ts index 372d3b8..4dbf599 100644 --- a/apps/web/src/lib/i18n/messages/fr.ts +++ b/apps/web/src/lib/i18n/messages/fr.ts @@ -1,6 +1,6 @@ -import type { MessageDict } from "./types"; +import type { MessageDict } from "./types"; -/** French (fr) UI pack — keys must stay in sync with en.ts. */ +/** French (fr) UI pack — keys must stay in sync with en.ts. */ export const fr: MessageDict = { "app.name": "Descrybe", "app.home": "Accueil Descrybe", @@ -9,10 +9,10 @@ export const fr: MessageDict = { "common.saveShort": "Enregistrer", "common.continue": "Continuer", "common.open": "Ouvrir", - "common.markDone": "Marquer comme terminé", + "common.markDone": "Marquer comme terminé", "common.viewAll": "Tout voir", "common.close": "Fermer", - "common.askAdmin": "Demandez à un administrateur de l'entreprise", + "common.askAdmin": "Demandez à un administrateur de l'entreprise", "common.you": "Vous", "common.active": "Actif", "common.pending": "En attente", @@ -20,39 +20,39 @@ export const fr: MessageDict = { "common.password": "Mot de passe", "common.name": "Votre nom", "common.viewPricing": "Voir les tarifs", - "common.backToSignIn": "Retour à la connexion", - "common.signingOut": "Déconnexion…", - "common.signOutAndContinue": "Se déconnecter et continuer", - "common.staySignedIn": "Rester connecté", + "common.backToSignIn": "Retour à la connexion", + "common.signingOut": "Déconnexion…", + "common.signOutAndContinue": "Se déconnecter et continuer", + "common.staySignedIn": "Rester connecté", "a11y.skipToContent": "Aller au contenu", - "theme.switchToDark": "Passer au thème sombre", - "theme.switchToLight": "Passer au thème clair", - "header.signOut": "Déconnexion", - "header.signingOut": "Déconnexion…", - "status.emDash": "—", + "theme.switchToDark": "Passer au thème sombre", + "theme.switchToLight": "Passer au thème clair", + "header.signOut": "Déconnexion", + "header.signingOut": "Déconnexion…", + "status.emDash": "—", "status.pending": "En attente", "status.processing": "Traitement", - "status.completed": "Terminé", - "status.failed": "Échoué", - "status.cancelled": "Annulé", + "status.completed": "Terminé", + "status.failed": "Échoué", + "status.cancelled": "Annulé", "nav.section.overview": "Vue d'ensemble", "nav.section.catalog": "Catalogue", "nav.section.feeds": "Feeds", "nav.section.stores": "Boutiques", "nav.section.processing": "Traitement", "nav.section.marketing": "Marketing", - "nav.section.integrations": "Intégrations", + "nav.section.integrations": "Intégrations", "nav.section.account": "Compte", "nav.section.platform": "Plateforme", "nav.dashboard": "Tableau de bord", "nav.products": "Produits", - "nav.categories": "Catégories", + "nav.categories": "Catégories", "nav.attributes": "Attributs", "nav.fields": "Champs", "nav.feeds": "Feeds", "nav.exports": "Exportations", "nav.stores": "Boutiques", - "nav.jobs": "Tâches", + "nav.jobs": "Tâches", "nav.campaigns": "Campagnes", "nav.calendar": "Calendrier", "nav.seo": "SEO", @@ -61,11 +61,11 @@ export const fr: MessageDict = { "nav.ai": "IA", "nav.email": "E-mail", "nav.billing": "Facturation", - "nav.settings": "Paramètres", + "nav.settings": "Paramètres", "nav.support": "Assistance", "nav.admin": "Admin", "nav.main": "Navigation principale", - "nav.sidebar": "Barre latérale de l'application", + "nav.sidebar": "Barre latérale de l'application", "nav.close": "Fermer la navigation", "nav.closeMenu": "Fermer le menu", "nav.open": "Ouvrir la navigation", @@ -74,205 +74,205 @@ export const fr: MessageDict = { "auth.login.title": "Se connecter", "auth.login.description": "Utilisez votre e-mail et mot de passe Descrybe.", "auth.login.submit": "Se connecter", - "auth.login.submitting": "Connexion…", - "auth.login.failed": "Échec de la connexion", - "auth.login.passwordNotSet": "Ce compte a encore besoin d'un mot de passe. Ouvrez votre lien d'invitation, ou demandez à un administrateur d'en émettre un nouveau.", - "auth.login.setPasswordFirstTitle": "Définissez d'abord le mot de passe :", - "auth.login.setPasswordFirstBody": "utilisez le lien d'invitation de votre e-mail. Si le lien a été envoyé à une ancienne adresse (dérive d'e-mail), demandez à un administrateur de l'entreprise de renvoyer une invitation de définition de mot de passe à {email}.", + "auth.login.submitting": "Connexion…", + "auth.login.failed": "Échec de la connexion", + "auth.login.passwordNotSet": "Ce compte a encore besoin d'un mot de passe. Ouvrez votre lien d'invitation, ou demandez à un administrateur d'en émettre un nouveau.", + "auth.login.setPasswordFirstTitle": "Définissez d'abord le mot de passe :", + "auth.login.setPasswordFirstBody": "utilisez le lien d'invitation de votre e-mail. Si le lien a été envoyé à une ancienne adresse (dérive d'e-mail), demandez à un administrateur de l'entreprise de renvoyer une invitation de définition de mot de passe à {email}.", "auth.login.yourEmail": "votre e-mail", - "auth.login.platformAdminsReissue": "Les administrateurs de la plateforme peuvent réémettre depuis", - "auth.login.adminUsersLink": "Admin → Utilisateurs", + "auth.login.platformAdminsReissue": "Les administrateurs de la plateforme peuvent réémettre depuis", + "auth.login.adminUsersLink": "Admin → Utilisateurs", "auth.login.haveToken": "Vous avez un jeton ? Ouvrir accepter l'invitation", "auth.login.noAccount": "Pas de compte ?", - "auth.login.createCompany": "Créer une entreprise", - "auth.login.haveInvite": "Vous avez une invitation ou un lien de définition de mot de passe ?", + "auth.login.createCompany": "Créer une entreprise", + "auth.login.haveInvite": "Vous avez une invitation ou un lien de définition de mot de passe ?", "auth.login.acceptInvite": "Accepter l'invitation", - "auth.login.forgotPassword": "Mot de passe oublié ?", - "auth.login.forgotPasswordHelp": "Saisissez votre e-mail sur la page de réinitialisation. Si vous n’avez jamais défini de mot de passe, utilisez le lien d’invitation / définition.", - "auth.forgot.title": "Mot de passe oublié", - "auth.forgot.description": "Saisissez l’e-mail de votre compte. S’il correspond à un compte actif, nous enverrons un lien de réinitialisation.", + "auth.login.forgotPassword": "Mot de passe oublié ?", + "auth.login.forgotPasswordHelp": "Saisissez votre e-mail sur la page de réinitialisation. Si vous n’avez jamais défini de mot de passe, utilisez le lien d’invitation / définition.", + "auth.forgot.title": "Mot de passe oublié", + "auth.forgot.description": "Saisissez l’e-mail de votre compte. S’il correspond à un compte actif, nous enverrons un lien de réinitialisation.", "auth.forgot.submit": "Envoyer le lien", - "auth.forgot.submitting": "Envoi…", - "auth.forgot.failed": "Impossible de demander une réinitialisation", - "auth.forgot.sentTitle": "Vérifiez votre e-mail", - "auth.forgot.sentBody": "Si un compte existe pour cette adresse, un lien de réinitialisation est en route. Le lien expire dans une heure.", - "auth.forgot.backToSignIn": "Retour à la connexion", - "auth.reset.title": "Réinitialiser le mot de passe", - "auth.reset.description": "Choisissez un nouveau mot de passe pour votre compte Descrybe (au moins 8 caractères).", + "auth.forgot.submitting": "Envoi…", + "auth.forgot.failed": "Impossible de demander une réinitialisation", + "auth.forgot.sentTitle": "Vérifiez votre e-mail", + "auth.forgot.sentBody": "Si un compte existe pour cette adresse, un lien de réinitialisation est en route. Le lien expire dans une heure.", + "auth.forgot.backToSignIn": "Retour à la connexion", + "auth.reset.title": "Réinitialiser le mot de passe", + "auth.reset.description": "Choisissez un nouveau mot de passe pour votre compte Descrybe (au moins 8 caractères).", "auth.reset.submit": "Enregistrer le nouveau mot de passe", - "auth.reset.submitting": "Enregistrement…", - "auth.reset.failed": "Impossible de réinitialiser le mot de passe", - "auth.reset.doneTitle": "Mot de passe mis à jour", + "auth.reset.submitting": "Enregistrement…", + "auth.reset.failed": "Impossible de réinitialiser le mot de passe", + "auth.reset.doneTitle": "Mot de passe mis à jour", "auth.reset.doneDescription": "Connectez-vous avec votre e-mail et le nouveau mot de passe.", - "auth.reset.goToSignIn": "Aller à la connexion", + "auth.reset.goToSignIn": "Aller à la connexion", "auth.reset.passwordConfirm": "Confirmer le mot de passe", "auth.reset.passwordMismatch": "Les mots de passe ne correspondent pas", - "auth.reset.missingTitle": "Lien de réinitialisation manquant", - "auth.reset.missingDescription": "Ouvrez le lien reçu par e-mail pour choisir un nouveau mot de passe.", - "auth.reset.requestNewLink": "Demander un nouveau lien de réinitialisation", - "auth.reset.tokenMissing": "Aucun lien de réinitialisation n’a été fourni. Utilisez le lien de votre e-mail, ou demandez-en un nouveau.", - "auth.reset.tokenInvalid": "Ce lien de réinitialisation est invalide ou expiré. Demandez-en un nouveau depuis la page mot de passe oublié.", - "auth.reset.linkRecognized": "Lien de réinitialisation reconnu. Saisissez un nouveau mot de passe ci-dessous — le secret n’est pas affiché sur cette page.", - "auth.reset.tokenLabel": "Jeton de réinitialisation", - "auth.reset.passwordHint": "Au moins 8 caractères. Pas d’autres règles de complexité.", - "auth.register.title": "Créer une entreprise", + "auth.reset.missingTitle": "Lien de réinitialisation manquant", + "auth.reset.missingDescription": "Ouvrez le lien reçu par e-mail pour choisir un nouveau mot de passe.", + "auth.reset.requestNewLink": "Demander un nouveau lien de réinitialisation", + "auth.reset.tokenMissing": "Aucun lien de réinitialisation n’a été fourni. Utilisez le lien de votre e-mail, ou demandez-en un nouveau.", + "auth.reset.tokenInvalid": "Ce lien de réinitialisation est invalide ou expiré. Demandez-en un nouveau depuis la page mot de passe oublié.", + "auth.reset.linkRecognized": "Lien de réinitialisation reconnu. Saisissez un nouveau mot de passe ci-dessous — le secret n’est pas affiché sur cette page.", + "auth.reset.tokenLabel": "Jeton de réinitialisation", + "auth.reset.passwordHint": "Au moins 8 caractères. Pas d’autres règles de complexité.", + "auth.register.title": "Créer une entreprise", "auth.register.description": "Enregistre une entreprise et son utilisateur administrateur.", "auth.register.companyName": "Nom de l'entreprise", - "auth.register.submit": "Créer un compte", - "auth.register.submitting": "Création…", - "auth.register.failed": "Échec de l'inscription", - "auth.register.haveAccount": "Vous avez déjà un compte ?", + "auth.register.submit": "Créer un compte", + "auth.register.submitting": "Création…", + "auth.register.failed": "Échec de l'inscription", + "auth.register.haveAccount": "Vous avez déjà un compte ?", "auth.register.signIn": "Se connecter", "auth.invite.title": "Accepter l'invitation", - "auth.invite.setPasswordTitle": "Définir le mot de passe", - "auth.invite.description": "Définissez votre mot de passe pour rejoindre l'entreprise. Votre administrateur a attribué Membre (travail quotidien) ou Admin (équipe et facturation).", - "auth.invite.setPasswordDescription": "Choisissez un mot de passe pour votre compte Descrybe migré (au moins 8 caractères).", - "auth.invite.checking": "Vérification de l'invitation…", + "auth.invite.setPasswordTitle": "Définir le mot de passe", + "auth.invite.description": "Définissez votre mot de passe pour rejoindre l'entreprise. Votre administrateur a attribué Membre (travail quotidien) ou Admin (équipe et facturation).", + "auth.invite.setPasswordDescription": "Choisissez un mot de passe pour votre compte Descrybe migré (au moins 8 caractères).", + "auth.invite.checking": "Vérification de l'invitation…", "auth.invite.forEmail": "Invitation pour {email}.", - "auth.invite.linkRecognized": "Lien d'invitation reconnu. Saisissez un mot de passe ci-dessous pour continuer — le secret n'est pas affiché sur cette page.", - "auth.invite.resetLinkRecognized": "Lien de réinitialisation reconnu. Saisissez un mot de passe ci-dessous pour continuer — le secret n'est pas affiché sur cette page.", + "auth.invite.linkRecognized": "Lien d'invitation reconnu. Saisissez un mot de passe ci-dessous pour continuer — le secret n'est pas affiché sur cette page.", + "auth.invite.resetLinkRecognized": "Lien de réinitialisation reconnu. Saisissez un mot de passe ci-dessous pour continuer — le secret n'est pas affiché sur cette page.", "auth.invite.tokenLabel": "Jeton d'invitation", - "auth.invite.resetTokenLabel": "Jeton de réinitialisation", - "auth.invite.tokenHelp": "Collez le jeton de votre e-mail d'invitation. Il est masqué dans ce champ.", - "auth.invite.passwordHint": "Au moins 8 caractères. Aucune autre règle de complexité.", + "auth.invite.resetTokenLabel": "Jeton de réinitialisation", + "auth.invite.tokenHelp": "Collez le jeton de votre e-mail d'invitation. Il est masqué dans ce champ.", + "auth.invite.passwordHint": "Au moins 8 caractères. Aucune autre règle de complexité.", "auth.invite.submit": "Accepter l'invitation", - "auth.invite.setPasswordSubmit": "Définir le mot de passe", - "auth.invite.accepting": "Acceptation…", - "auth.invite.saving": "Enregistrement…", - "auth.invite.verifyFailed": "Impossible de vérifier l'invitation", - "auth.invite.verifySetPasswordFailed": "Impossible de vérifier le lien de définition du mot de passe", + "auth.invite.setPasswordSubmit": "Définir le mot de passe", + "auth.invite.accepting": "Acceptation…", + "auth.invite.saving": "Enregistrement…", + "auth.invite.verifyFailed": "Impossible de vérifier l'invitation", + "auth.invite.verifySetPasswordFailed": "Impossible de vérifier le lien de définition du mot de passe", "auth.invite.acceptFailed": "Impossible d'accepter l'invitation", - "auth.invite.setPasswordFailed": "Impossible de définir le mot de passe", - "auth.invite.expired": "Cette invitation est invalide ou expirée. Demandez à votre administrateur d'envoyer une nouvelle invitation, puis ouvrez le nouveau lien (ou collez le nouveau jeton ci-dessous).", - "auth.invite.setPasswordExpired": "Ce lien de définition de mot de passe est invalide ou expiré. Demandez à un administrateur de l'entreprise ou de la plateforme de le réémettre, puis ouvrez le nouveau lien (ou collez le nouveau jeton ci-dessous).", - "auth.invite.emailMismatchDefault": "Vous êtes connecté avec un e-mail différent de celui de cette invitation.", - "auth.invite.expiredFooter": "Lien expiré ? Demandez à un administrateur de le réémettre — il n'y a pas d'API de renvoi en libre-service. Administrateurs de plateforme :", - "auth.invite.adminUsersLink": "Admin → Utilisateurs", - "auth.invite.doneTitle": "Vous faites partie de l'équipe", - "auth.invite.doneSetPasswordTitle": "Mot de passe enregistré", - "auth.invite.doneDescription": "Votre compte est prêt. Ensuite, ouvrez le tableau de bord pour travailler avec les flux et les produits, ou consultez les paramètres de l'entreprise.", + "auth.invite.setPasswordFailed": "Impossible de définir le mot de passe", + "auth.invite.expired": "Cette invitation est invalide ou expirée. Demandez à votre administrateur d'envoyer une nouvelle invitation, puis ouvrez le nouveau lien (ou collez le nouveau jeton ci-dessous).", + "auth.invite.setPasswordExpired": "Ce lien de définition de mot de passe est invalide ou expiré. Demandez à un administrateur de l'entreprise ou de la plateforme de le réémettre, puis ouvrez le nouveau lien (ou collez le nouveau jeton ci-dessous).", + "auth.invite.emailMismatchDefault": "Vous êtes connecté avec un e-mail différent de celui de cette invitation.", + "auth.invite.expiredFooter": "Lien expiré ? Demandez à un administrateur de le réémettre — il n'y a pas d'API de renvoi en libre-service. Administrateurs de plateforme :", + "auth.invite.adminUsersLink": "Admin → Utilisateurs", + "auth.invite.doneTitle": "Vous faites partie de l'équipe", + "auth.invite.doneSetPasswordTitle": "Mot de passe enregistré", + "auth.invite.doneDescription": "Votre compte est prêt. Ensuite, ouvrez le tableau de bord pour travailler avec les flux et les produits, ou consultez les paramètres de l'entreprise.", "auth.invite.doneSetPasswordDescription": "Connectez-vous avec votre e-mail et le nouveau mot de passe pour ouvrir votre espace de travail.", "auth.invite.openDashboard": "Ouvrir le tableau de bord", - "auth.invite.companySettings": "Paramètres de l'entreprise", - "auth.invite.goToSignIn": "Aller à la connexion", - "auth.invite.afterSignInNote": "Après la connexion, vous arrivez dans votre espace de travail — le parcours de configuration initiale est ignoré.", + "auth.invite.companySettings": "Paramètres de l'entreprise", + "auth.invite.goToSignIn": "Aller à la connexion", + "auth.invite.afterSignInNote": "Après la connexion, vous arrivez dans votre espace de travail — le parcours de configuration initiale est ignoré.", "auth.invite.mismatchTitle": "Mauvais compte pour cette invitation", - "auth.invite.mismatchDescription": "Ce lien est destiné à un e-mail différent de celui avec lequel vous êtes connecté. Déconnectez-vous pour continuer en tant qu'utilisateur invité, ou restez connecté et demandez à un administrateur de réémettre l'invitation.", - "auth.invite.mismatchDetail": "Connecté en tant que {session}, mais cette invitation est pour {invite}.", - "auth.invite.mismatchFallback": "L'e-mail de la session ne correspond pas à cette invitation.", + "auth.invite.mismatchDescription": "Ce lien est destiné à un e-mail différent de celui avec lequel vous êtes connecté. Déconnectez-vous pour continuer en tant qu'utilisateur invité, ou restez connecté et demandez à un administrateur de réémettre l'invitation.", + "auth.invite.mismatchDetail": "Connecté en tant que {session}, mais cette invitation est pour {invite}.", + "auth.invite.mismatchFallback": "L'e-mail de la session ne correspond pas à cette invitation.", "auth.invite.switchAccountTitle": "Changer de compte :", - "auth.invite.switchAccountBody": "déconnectez-vous, puis terminez ce formulaire avec l'e-mail invité{emailSuffix}.", - "auth.invite.reissueTitle": "Chemin de réémission :", - "auth.invite.reissueBody": "si votre vrai e-mail de connexion a changé (dérive d'e-mail), demandez à un administrateur de l'entreprise de révoquer cette invitation et d'en envoyer une nouvelle à l'e-mail que vous utilisez pour vous connecter. Les administrateurs de la plateforme peuvent aussi réémettre des liens de définition de mot de passe depuis Admin → Utilisateurs.", + "auth.invite.switchAccountBody": "déconnectez-vous, puis terminez ce formulaire avec l'e-mail invité{emailSuffix}.", + "auth.invite.reissueTitle": "Chemin de réémission :", + "auth.invite.reissueBody": "si votre vrai e-mail de connexion a changé (dérive d'e-mail), demandez à un administrateur de l'entreprise de révoquer cette invitation et d'en envoyer une nouvelle à l'e-mail que vous utilisez pour vous connecter. Les administrateurs de la plateforme peuvent aussi réémettre des liens de définition de mot de passe depuis Admin → Utilisateurs.", "locale.switcher": "Langue de l'interface", "locale.menu": "Choisir la langue de l'interface", "locale.label": "Langue du tableau de bord", - "locale.help": "Modifie les libellés de la navigation et des paramètres. La langue du contenu généré se règle séparément sous Entreprise.", + "locale.help": "Modifie les libellés de la navigation et des paramètres. La langue du contenu généré se règle séparément sous Entreprise.", "settings.contentLanguage": "Langue du contenu", - "settings.contentLanguageHelp": "Langue utilisée pour les titres, descriptions et autres contenus générés", + "settings.contentLanguageHelp": "Langue utilisée pour les titres, descriptions et autres contenus générés", "settings.tab.profile": "Profil", "settings.tab.company": "Entreprise", "settings.tab.alerts": "Alertes", - "settings.tab.apiKeys": "Clés API", - "settings.tab.team": "Équipe", - "settings.title": "Paramètres", - "settings.description": "Compte, entreprise, clés API et équipe.", - "settings.accessDenied": "Vous n'avez pas l'autorisation d'ouvrir les paramètres de l'entreprise. Demandez de l'aide à un administrateur.", - "settings.loadFailed": "Échec du chargement des paramètres", + "settings.tab.apiKeys": "Clés API", + "settings.tab.team": "Équipe", + "settings.title": "Paramètres", + "settings.description": "Compte, entreprise, clés API et équipe.", + "settings.accessDenied": "Vous n'avez pas l'autorisation d'ouvrir les paramètres de l'entreprise. Demandez de l'aide à un administrateur.", + "settings.loadFailed": "Échec du chargement des paramètres", "settings.profileHeading": "Profil", "settings.personalInfo": "Informations personnelles", - "settings.personalInfoHelp": "Mettez à jour vos informations personnelles", - "settings.firstName": "Prénom", - "settings.firstNamePlaceholder": "Votre prénom", + "settings.personalInfoHelp": "Mettez à jour vos informations personnelles", + "settings.firstName": "Prénom", + "settings.firstNamePlaceholder": "Votre prénom", "settings.lastName": "Nom", "settings.lastNamePlaceholder": "Votre nom", "settings.email": "E-mail", - "settings.profileUpdated": "Profil mis à jour.", - "settings.profileUpdateFailed": "Impossible de mettre à jour le profil", + "settings.profileUpdated": "Profil mis à jour.", + "settings.profileUpdateFailed": "Impossible de mettre à jour le profil", "settings.role.member": "Membre", "settings.role.admin": "Admin", - "settings.teamHeading": "Membres de l'équipe", + "settings.teamHeading": "Membres de l'équipe", "settings.inviteUser": "Inviter un utilisateur", - "settings.teamAdminOnly": "Seuls les administrateurs de l'entreprise peuvent inviter, promouvoir, rétrograder ou retirer des coéquipiers.", + "settings.teamAdminOnly": "Seuls les administrateurs de l'entreprise peuvent inviter, promouvoir, rétrograder ou retirer des coéquipiers.", "settings.shareAcceptLink": "Partager le lien d'acceptation", - "settings.shareAcceptLinkHelp": "L'e-mail sortant n'est pas configuré. Copiez ce lien à usage unique et envoyez-le à l'invité. Il définira un mot de passe (au moins 8 caractères) et rejoindra avec le rôle que vous avez choisi.", - "settings.acceptLinkLabel": "Lien d'acceptation d'invitation à usage unique", + "settings.shareAcceptLinkHelp": "L'e-mail sortant n'est pas configuré. Copiez ce lien à usage unique et envoyez-le à l'invité. Il définira un mot de passe (au moins 8 caractères) et rejoindra avec le rôle que vous avez choisi.", + "settings.acceptLinkLabel": "Lien d'acceptation d'invitation à usage unique", "settings.copyLink": "Copier le lien", - "settings.linkCopied": "Lien d'acceptation copié.", + "settings.linkCopied": "Lien d'acceptation copié.", "settings.table.email": "E-mail", - "settings.table.role": "Rôle", + "settings.table.role": "Rôle", "settings.table.status": "Statut", "settings.table.joined": "Inscription / expiration", "settings.table.actions": "Actions", - "settings.teamForbidden": "Vous n'avez pas l'autorisation de voir la liste de l'équipe. Demandez de l'aide à un administrateur.", - "settings.noTeammates": "Pas encore de coéquipiers", - "settings.noTeammatesHelp": "Invitez des collègues en tant que Membre (produits et flux) ou Admin (équipe et paramètres de l'entreprise). Les invitations en attente s'affichent ici jusqu'à acceptation.", - "settings.noTeammatesMemberHelp": "Aucun coéquipier listé pour le moment. Demandez à un administrateur d'envoyer des invitations.", + "settings.teamForbidden": "Vous n'avez pas l'autorisation de voir la liste de l'équipe. Demandez de l'aide à un administrateur.", + "settings.noTeammates": "Pas encore de coéquipiers", + "settings.noTeammatesHelp": "Invitez des collègues en tant que Membre (produits et flux) ou Admin (équipe et paramètres de l'entreprise). Les invitations en attente s'affichent ici jusqu'à acceptation.", + "settings.noTeammatesMemberHelp": "Aucun coéquipier listé pour le moment. Demandez à un administrateur d'envoyer des invitations.", "settings.memberActions": "Actions du membre", "settings.makeAdmin": "Rendre admin", "settings.makeMember": "Rendre membre", "settings.removeMember": "Retirer", - "settings.revokeInvite": "Révoquer l'invitation", + "settings.revokeInvite": "Révoquer l'invitation", "settings.needOneAdmin": "Les entreprises ont besoin d'au moins un administrateur", "settings.expires": "Expire le {date}", "settings.invalidEmail": "Saisissez une adresse e-mail valide.", - "settings.inviteCreatedNoMail": "Invitation créée pour {email} en tant que {role}. Copiez le lien d'acceptation ci-dessous et partagez-le — l'e-mail sortant n'est pas configuré.", - "settings.inviteSent": "Invitation envoyée à {email} en tant que {role}. La personne doit ouvrir l'e-mail et accepter avant expiration.", + "settings.inviteCreatedNoMail": "Invitation créée pour {email} en tant que {role}. Copiez le lien d'acceptation ci-dessous et partagez-le — l'e-mail sortant n'est pas configuré.", + "settings.inviteSent": "Invitation envoyée à {email} en tant que {role}. La personne doit ouvrir l'e-mail et accepter avant expiration.", "settings.inviteFailed": "Impossible d'envoyer l'invitation", - "settings.revokeConfirm": "Révoquer cette invitation ?", - "settings.revoked": "Invitation révoquée.", - "settings.revokeFailed": "Impossible de révoquer l'invitation", + "settings.revokeConfirm": "Révoquer cette invitation ?", + "settings.revoked": "Invitation révoquée.", + "settings.revokeFailed": "Impossible de révoquer l'invitation", "settings.removeConfirm": "Retirer {email} de cette entreprise ?", - "settings.memberRemoved": "{email} retiré.", + "settings.memberRemoved": "{email} retiré.", "settings.removeFailed": "Impossible de retirer l'utilisateur", "settings.roleChangeConfirm": "{action} {email} en {role} ?", "settings.roleChanged": "{email} est maintenant {role}.", - "settings.roleChangeFailed": "Impossible de mettre à jour le rôle", + "settings.roleChangeFailed": "Impossible de mettre à jour le rôle", "settings.promote": "Promouvoir", - "settings.demote": "Rétrograder", - "settings.inviteTitle": "Inviter un coéquipier", - "settings.inviteDescription": "Ils recevront un lien pour définir un mot de passe (au moins 8 caractères) et rejoindre cette entreprise.", + "settings.demote": "Rétrograder", + "settings.inviteTitle": "Inviter un coéquipier", + "settings.inviteDescription": "Ils recevront un lien pour définir un mot de passe (au moins 8 caractères) et rejoindre cette entreprise.", "settings.inviteEmail": "E-mail", "settings.inviteEmailPlaceholder": "collegue@exemple.com", - "settings.inviteRole": "Rôle", - "settings.inviteRoleHint": "Les membres gèrent les produits et les flux. Les administrateurs peuvent aussi inviter des coéquipiers et modifier les paramètres de l'entreprise.", + "settings.inviteRole": "Rôle", + "settings.inviteRoleHint": "Les membres gèrent les produits et les flux. Les administrateurs peuvent aussi inviter des coéquipiers et modifier les paramètres de l'entreprise.", "settings.sendInvite": "Envoyer l'invitation", - "settings.companyHeading": "Paramètres de l'entreprise", + "settings.companyHeading": "Paramètres de l'entreprise", "settings.activeCompany": "Entreprise active", - "settings.creditsOverview": "Aperçu des crédits", + "settings.creditsOverview": "Aperçu des crédits", "settings.plan": "Offre", - "settings.used": "Utilisé", + "settings.used": "Utilisé", "settings.companyInfo": "Informations sur l'entreprise", - "settings.companyInfoHelp": "Mettez à jour les détails de votre entreprise", + "settings.companyInfoHelp": "Mettez à jour les détails de votre entreprise", "settings.companyName": "Nom de l'entreprise", "settings.companyNamePlaceholder": "Le nom de votre entreprise", - "settings.contentSettings": "Paramètres de contenu", - "settings.mergeProducts": "Fusionner les produits avec le même GTIN", - "settings.emailIntegration": "Intégration e-mail", - "settings.aiIntegrations": "Intégrations IA", - "settings.alertsHeading": "Alertes opérateur", + "settings.contentSettings": "Paramètres de contenu", + "settings.mergeProducts": "Fusionner les produits avec le même GTIN", + "settings.emailIntegration": "Intégration e-mail", + "settings.aiIntegrations": "Intégrations IA", + "settings.alertsHeading": "Alertes opérateur", "settings.inAppToasts": "Toasts dans l'application", "settings.emailAlerts": "Alertes e-mail", - "settings.apiKeysHeading": "Clés API", - "settings.createApiKey": "Créer une clé API", - "settings.createApiKeyShort": "Créer une clé API", - "settings.createApiKeyTitle": "Créer une clé API", - "settings.apiKeyLabel": "Clé API", - "settings.keyName": "Nom de la clé", - "settings.storeKeySafe": "Conservez-la en lieu sûr — vous ne pourrez plus voir le secret complet.", - "settings.apiKeysIntro": "Créez une clé API d’entreprise pour appeler les endpoints publics /api/v1. Le secret complet n’est affiché qu’une fois à la création — copiez-le immédiatement.", - "settings.apiKeysUseWhere": "Envoyez-la en Authorization: Bearer (préféré) ou X-API-Key.", - "settings.apiKeysDocsLink": "Docs d’authentification API", - "settings.apiKeyOnceWarning": "C’est la seule fois où le secret complet est affiché. Copiez-le maintenant avant de fermer cette boîte de dialogue.", + "settings.apiKeysHeading": "Clés API", + "settings.createApiKey": "Créer une clé API", + "settings.createApiKeyShort": "Créer une clé API", + "settings.createApiKeyTitle": "Créer une clé API", + "settings.apiKeyLabel": "Clé API", + "settings.keyName": "Nom de la clé", + "settings.storeKeySafe": "Conservez-la en lieu sûr — vous ne pourrez plus voir le secret complet.", + "settings.apiKeysIntro": "Créez une clé API d’entreprise pour appeler les endpoints publics /api/v1. Le secret complet n’est affiché qu’une fois à la création — copiez-le immédiatement.", + "settings.apiKeysUseWhere": "Envoyez-la en Authorization: Bearer (préféré) ou X-API-Key.", + "settings.apiKeysDocsLink": "Docs d’authentification API", + "settings.apiKeyOnceWarning": "C’est la seule fois où le secret complet est affiché. Copiez-le maintenant avant de fermer cette boîte de dialogue.", "settings.table.name": "Nom", - "settings.table.key": "Clé", - "settings.table.lastUsed": "Dernière utilisation", - "dashboard.demoSandbox": "Bac à sable démo", - "dashboard.demoEmptyTitle": "Le bac à sable démo est vide", - "dashboard.demoEmptyHint": "Le bac à sable démo est vide — basculez vers A1 ou connectez un flux pour voir de vraies stats catalogue.", + "settings.table.key": "Clé", + "settings.table.lastUsed": "Dernière utilisation", + "dashboard.demoSandbox": "Bac à sable démo", + "dashboard.demoEmptyTitle": "Le bac à sable démo est vide", + "dashboard.demoEmptyHint": "Le bac à sable démo est vide — basculez vers A1 ou connectez un flux pour voir de vraies stats catalogue.", "dashboard.overviewTitle": "Vue d'ensemble", "dashboard.quickLinks": "Liens rapides", - "dashboard.whatsNew": "Nouveautés", + "dashboard.whatsNew": "Nouveautés", "dashboard.startTutorial": "Lancer le tutoriel", "dashboard.resumeTutorial": "Reprendre le tutoriel", "dashboard.restartTutorial": "Relancer le tutoriel", @@ -284,203 +284,203 @@ export const fr: MessageDict = { "dashboard.welcomeTo": "Bienvenue sur {name}", "dashboard.trialBadge": "Essai", "dashboard.actions": "Actions du tableau de bord", - "dashboard.emptyPaygHint": "Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques. Utilisez Premiers pas ci-dessous.", - "dashboard.emptyCreditsHint": "Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques. Vous avez {credits} — commencez avec Premiers pas ci-dessous.", + "dashboard.emptyPaygHint": "Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques. Utilisez Premiers pas ci-dessous.", + "dashboard.emptyCreditsHint": "Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques. Vous avez {credits} — commencez avec Premiers pas ci-dessous.", "dashboard.workflowTitle": "Flux catalogue", - "dashboard.recentActivity": "Activité récente", - "dashboard.loadFailed": "Échec du chargement du tableau de bord", + "dashboard.recentActivity": "Activité récente", + "dashboard.loadFailed": "Échec du chargement du tableau de bord", "dashboard.workspaceFallback": "Cet espace de travail", - "dashboard.jobFallback": "Tâche {id}", + "dashboard.jobFallback": "Tâche {id}", "dashboard.workflow.feeds.connect": "Connecter une source", "dashboard.workflow.feeds.sources": "{count} source", "dashboard.workflow.feeds.sourcesPlural": "{count} sources", "dashboard.workflow.products.build": "Construire le catalogue", "dashboard.workflow.products.count": "{count} dans le catalogue", "dashboard.workflow.map": "Map", - "dashboard.workflow.map.detail": "Associez les colonnes après avoir ajouté un flux", + "dashboard.workflow.map.detail": "Associez les colonnes après avoir ajouté un flux", "dashboard.workflow.map.ready": "Ouvrir Map sur un flux", "dashboard.workflow.sync": "Sync", - "dashboard.workflow.sync.detail": "Récupérez un échantillon après le mapping", - "dashboard.workflow.sync.ready": "Synchroniser un échantillon dans les produits", + "dashboard.workflow.sync.detail": "Récupérez un échantillon après le mapping", + "dashboard.workflow.sync.ready": "Synchroniser un échantillon dans les produits", "dashboard.workflow.process": "Traiter", "dashboard.workflow.processActive": "{count} actifs", "dashboard.workflow.processWaiting": "{count} en attente", - "dashboard.workflow.processDone": "{count} terminés", - "dashboard.workflow.processRun": "Lancer les tâches IA", + "dashboard.workflow.processDone": "{count} terminés", + "dashboard.workflow.processRun": "Lancer les tâches IA", "dashboard.workflow.export": "Exporter", - "dashboard.workflow.exportReady": "Modèles et téléchargement", + "dashboard.workflow.exportReady": "Modèles et téléchargement", "dashboard.workflow.exportMap": "Mapper puis exporter", - "dashboard.workflowHint": "Catalogue entrant → enrichir / traiter → exporter ou pousser vers les boutiques. Passez à l’étape suivante pour {name}.", + "dashboard.workflowHint": "Catalogue entrant → enrichir / traiter → exporter ou pousser vers les boutiques. Passez à l’étape suivante pour {name}.", "dashboard.overviewHint": "Totaux en direct pour {name}", - "dashboard.demoEmptyMessage": "Basculez vers A1 (ou une autre entreprise seedée) dans l'en-tête, ou connectez un flux ici pour remplir ce bac à sable.", + "dashboard.demoEmptyMessage": "Basculez vers A1 (ou une autre entreprise seedée) dans l'en-tête, ou connectez un flux ici pour remplir ce bac à sable.", "dashboard.emptyTitle": "Importez un catalogue", - "dashboard.emptyMessage": "Catalogue entrant → enrichir / traiter → exporter ou pousser vers les boutiques. Commencez avec Premiers pas ci-dessous (ou connectez un flux / téléversez un CSV).", - "dashboard.connectFeedAnyway": "Connecter un flux quand même", + "dashboard.emptyMessage": "Catalogue entrant → enrichir / traiter → exporter ou pousser vers les boutiques. Commencez avec Premiers pas ci-dessous (ou connectez un flux / téléversez un CSV).", + "dashboard.connectFeedAnyway": "Connecter un flux quand même", "dashboard.connectFeedShort": "Connecter un flux", - "dashboard.uploadCsv": "Téléverser un CSV", - "dashboard.goToBilling": "Aller à la facturation", - "dashboard.freePlanTitle": "Vous êtes sur l'offre Free", - "dashboard.freePlanMessageWithLimit": "{used} sur {max} produits utilisés. Le mapping des flux, le nettoyage de base et les labels énergétiques UE (EPREL) sont inclus ; passez à une offre supérieure pour les titres et descriptions IA, et plus de capacité.", - "dashboard.freePlanMessage": "Le mapping des flux, le nettoyage de base et les labels énergétiques UE (EPREL) sont inclus ; passez à une offre supérieure pour les titres et descriptions IA, et plus de capacité.", - "dashboard.outOfCreditsTitle": "Vous n'avez plus de crédits IA", - "dashboard.outOfCreditsMessage": "Achetez plus de crédits ou passez à une offre supérieure pour continuer le traitement.", + "dashboard.uploadCsv": "Téléverser un CSV", + "dashboard.goToBilling": "Aller à la facturation", + "dashboard.freePlanTitle": "Vous êtes sur l'offre Free", + "dashboard.freePlanMessageWithLimit": "{used} sur {max} produits utilisés. Le mapping des flux, le nettoyage de base et les labels énergétiques UE (EPREL) sont inclus ; passez à une offre supérieure pour les titres et descriptions IA, et plus de capacité.", + "dashboard.freePlanMessage": "Le mapping des flux, le nettoyage de base et les labels énergétiques UE (EPREL) sont inclus ; passez à une offre supérieure pour les titres et descriptions IA, et plus de capacité.", + "dashboard.outOfCreditsTitle": "Vous n'avez plus de crédits IA", + "dashboard.outOfCreditsMessage": "Achetez plus de crédits ou passez à une offre supérieure pour continuer le traitement.", "dashboard.productLimitTitle": "Limite de produits atteinte", - "dashboard.productLimitMessage": "Votre offre {plan} autorise {max} produits ({count} dans le catalogue). Passez à une offre supérieure pour en traiter plus.", - "dashboard.productLimitMessageFull": "La limite de produits de votre offre {plan} est atteinte. Passez à une offre supérieure pour en traiter plus.", + "dashboard.productLimitMessage": "Votre offre {plan} autorise {max} produits ({count} dans le catalogue). Passez à une offre supérieure pour en traiter plus.", + "dashboard.productLimitMessageFull": "La limite de produits de votre offre {plan} est atteinte. Passez à une offre supérieure pour en traiter plus.", "dashboard.comparePlans": "Comparer les offres", "dashboard.viewPlans": "Voir les offres", - "dashboard.trialTitle": "Essai · {plan}", - "dashboard.trialMessageDated": "L'essai se termine le {date}. {credits} crédits restants.", - "dashboard.trialMessage": "{credits} crédits restants sur votre essai.", - "dashboard.lowCreditsTitle": "Crédits bientôt épuisés", - "dashboard.lowCreditsMessage": "Il reste {remaining} crédits sur {total}. Rechargez ou passez à une offre supérieure avant que les tâches ne s'arrêtent.", - "dashboard.latestJobs": "Dernières tâches de traitement", - "dashboard.noJobsEmpty": "Pas encore de tâches — importez d'abord des produits.", - "dashboard.noJobsReady": "Aucune tâche récente. Démarrez-en une depuis Produits quand vous êtes prêt.", - "dashboard.startJob": "Démarrer un job depuis Produits", - "dashboard.quickLinksHint": "Flux, produits, tâches et export.", + "dashboard.trialTitle": "Essai · {plan}", + "dashboard.trialMessageDated": "L'essai se termine le {date}. {credits} crédits restants.", + "dashboard.trialMessage": "{credits} crédits restants sur votre essai.", + "dashboard.lowCreditsTitle": "Crédits bientôt épuisés", + "dashboard.lowCreditsMessage": "Il reste {remaining} crédits sur {total}. Rechargez ou passez à une offre supérieure avant que les tâches ne s'arrêtent.", + "dashboard.latestJobs": "Dernières tâches de traitement", + "dashboard.noJobsEmpty": "Pas encore de tâches — importez d'abord des produits.", + "dashboard.noJobsReady": "Aucune tâche récente. Démarrez-en une depuis Produits quand vous êtes prêt.", + "dashboard.startJob": "Démarrer un job depuis Produits", + "dashboard.quickLinksHint": "Flux, produits, tâches et export.", "dashboard.feedsImportMap": "Importer et mapper", "dashboard.productsBrowse": "Parcourir et traiter", - "dashboard.jobsMonitor": "Surveiller les tâches", - "dashboard.exportsTemplates": "Modèles et téléchargement", + "dashboard.jobsMonitor": "Surveiller les tâches", + "dashboard.exportsTemplates": "Modèles et téléchargement", "activation.title": "Premiers pas", - "activation.description": "Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques. Terminez l’étape en cours, puis continuez — le parcours démo explique les écrans sans modifier la progression de la checklist.", - "activation.descriptionShort": "Commencez par l’étape mise en évidence ci-dessous — une action à la fois. La connexion boutique est facultative.", - "activation.nextCta": "Faire cette étape", - "activation.valueProp": "Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques.", - "activation.alreadyDone": "Déjà fait", - "activation.skipForNow": "Passer pour l’instant", - "activation.showAllSteps": "Afficher les {total} étapes", - "activation.showFewerSteps": "Afficher moins d’étapes", + "activation.description": "Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques. Terminez l’étape en cours, puis continuez — le parcours démo explique les écrans sans modifier la progression de la checklist.", + "activation.descriptionShort": "Commencez par l’étape mise en évidence ci-dessous — une action à la fois. La connexion boutique est facultative.", + "activation.nextCta": "Faire cette étape", + "activation.valueProp": "Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques.", + "activation.alreadyDone": "Déjà fait", + "activation.skipForNow": "Passer pour l’instant", + "activation.showAllSteps": "Afficher les {total} étapes", + "activation.showFewerSteps": "Afficher moins d’étapes", "activation.corePathLabel": "En bref", - "activation.corePath": "Catalogue entrant → Enrichir / traiter → Exporter ou pousser vers les boutiques", - "activation.storeWizardHint": "Pas nécessaire pour les flux ou les exports — ignorez sauf si vous voulez pousser des produits vers une boutique en ligne.", - "activation.storeWizardCta": "Lancer la configuration guidée", - "activation.focus.map": "Ensuite : ouvrez Map sur un flux, associez les colonnes, puis enregistrez. Ajoutez d’abord un flux si la liste est vide.", - "activation.focus.sync": "Ensuite : synchronisez un échantillon après l’enregistrement du mapping. Utilisez Sync sur un flux mappé — évitez les sources non mappées.", - "activation.focus.dismiss": "Fermer l’indication", + "activation.corePath": "Catalogue entrant → Enrichir / traiter → Exporter ou pousser vers les boutiques", + "activation.storeWizardHint": "Pas nécessaire pour les flux ou les exports — ignorez sauf si vous voulez pousser des produits vers une boutique en ligne.", + "activation.storeWizardCta": "Lancer la configuration guidée", + "activation.focus.map": "Ensuite : ouvrez Map sur un flux, associez les colonnes, puis enregistrez. Ajoutez d’abord un flux si la liste est vide.", + "activation.focus.sync": "Ensuite : synchronisez un échantillon après l’enregistrement du mapping. Utilisez Sync sur un flux mappé — évitez les sources non mappées.", + "activation.focus.dismiss": "Fermer l’indication", "activation.dismiss": "Masquer la checklist", "hypercare.report.title": "Hypercare de bascule", - "hypercare.report.message": "Données manquantes ou incorrectes après la migration ? Signalez-le pour que nous corrigions votre espace de travail.", - "hypercare.report.cta": "Signaler des données manquantes ou incorrectes", + "hypercare.report.message": "Données manquantes ou incorrectes après la migration ? Signalez-le pour que nous corrigions votre espace de travail.", + "hypercare.report.cta": "Signaler des données manquantes ou incorrectes", "hypercare.report.dismiss": "Ignorer", "hypercare.report.adminTriage": "Ouvrir la file hypercare", "etl.gaps.title": "What did not migrate", - "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", + "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", "etl.gaps.dismiss": "Dismiss", "etl.gaps.apiKeys.title": "API keys", - "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", + "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", "etl.gaps.apiKeys.cta": "Open API keys", "etl.gaps.blobs.title": "File contents (blobs)", - "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", + "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", "etl.gaps.blobs.countHint": "{count} file records are metadata-only (bytes were not migrated).", "etl.gaps.blobs.cta": "Open Files", "etl.gaps.jobs.title": "Processing history", "etl.gaps.jobs.body": "Legacy job and task history was not backfilled for cutover. New jobs you start here will appear normally.", - "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", + "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", "etl.gaps.jobs.migratedHint": "{count} jobs were tagged migrated from an optional backfill.", "etl.gaps.jobs.cta": "Open Processing", "etl.gaps.woo.title": "Store credentials", - "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", + "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", "etl.gaps.woo.cta": "Open Stores", "etl.gaps.settings.title": "Company settings", "etl.gaps.settings.body": "Only language and merge-products settings were imported. Re-check other company preferences in Settings.", "etl.gaps.settings.cta": "Open company settings", - "activation.progress": "{done} sur {total} terminés", - "activation.stepsLabel": "Étapes d'activation", + "activation.progress": "{done} sur {total} terminés", + "activation.stepsLabel": "Étapes d'activation", "activation.pausedTitle": "Premiers pas en pause", - "activation.pausedBody": "Reprenez à tout moment — des champs produit jusqu’à l’export. La connexion boutique reste facultative.", + "activation.pausedBody": "Reprenez à tout moment — des champs produit jusqu’à l’export. La connexion boutique reste facultative.", "activation.resume": "Reprendre la checklist", "activation.step.enable-fields.title": "Activer les champs produit", "activation.step.enable-fields.body": "Choisissez les colonnes produit standard que Descrybe doit mapper et nettoyer.", "activation.step.connect-source.title": "Ajouter un flux produit", - "activation.step.connect-source.body": "Ajoutez un flux catalogue CSV ou XML pour faire entrer les produits dans Descrybe. Connecter une boutique en ligne est une étape facultative ultérieure.", + "activation.step.connect-source.body": "Ajoutez un flux catalogue CSV ou XML pour faire entrer les produits dans Descrybe. Connecter une boutique en ligne est une étape facultative ultérieure.", "activation.step.map.title": "Mapper les colonnes du flux", "activation.step.map.body": "Dans Feeds, ouvrez Map sur votre flux, faites correspondre les colonnes fournisseur, puis enregistrez.", - "activation.step.sync-sample.title": "Synchroniser un échantillon", - "activation.step.sync-sample.body": "Dans Feeds, synchronisez un petit échantillon depuis un flux mappé pour vérifier le mapping avant l’exécution complète.", + "activation.step.sync-sample.title": "Synchroniser un échantillon", + "activation.step.sync-sample.body": "Dans Feeds, synchronisez un petit échantillon depuis un flux mappé pour vérifier le mapping avant l’exécution complète.", "activation.step.process.title": "Traiter les produits", - "activation.step.process.body": "Ouvrez les produits non traités et lancez le traitement pour générer un contenu catalogue nettoyé.", + "activation.step.process.body": "Ouvrez les produits non traités et lancez le traitement pour générer un contenu catalogue nettoyé.", "activation.step.store-connect.title": "Connecter une boutique", - "activation.step.store-connect.body": "Facultatif. Liez WooCommerce ou Shopify pour pousser les produits vers votre boutique. Ignorez si vous n’utilisez que les flux et exports.", - "activation.step.export.title": "Créer un export", - "activation.step.export.body": "Créez un flux d’export pour télécharger ou publier les produits nettoyés en XML ou CSV.", - "stats.products": "Produits importés", - "stats.categories": "Catégories", + "activation.step.store-connect.body": "Facultatif. Liez WooCommerce ou Shopify pour pousser les produits vers votre boutique. Ignorez si vous n’utilisez que les flux et exports.", + "activation.step.export.title": "Créer un export", + "activation.step.export.body": "Créez un flux d’export pour télécharger ou publier les produits nettoyés en XML ou CSV.", + "stats.products": "Produits importés", + "stats.categories": "Catégories", "stats.attributes": "Attributs", "stats.feeds": "Feeds", - "stats.credits": "Crédits", + "stats.credits": "Crédits", "stats.openCatalog": "Ouvrir le catalogue", - "stats.productsHint": "Catalogue {processed} · file {unprocessed} (compteurs séparés)", + "stats.productsHint": "Catalogue {processed} · file {unprocessed} (compteurs séparés)", "stats.catalogTree": "Arborescence du catalogue", - "stats.attributeLibrary": "Bibliothèque d'attributs", + "stats.attributeLibrary": "Bibliothèque d'attributs", "stats.importSources": "Sources d'import", - "stats.payAsYouGo": "Paiement à l'usage", - "stats.walletBilling": "Portefeuille · Facturation", - "stats.enterpriseBilling": "Entreprise · Facturation", - "stats.usedBilling": "{used} utilisés · Facturation", + "stats.payAsYouGo": "Paiement à l'usage", + "stats.walletBilling": "Portefeuille · Facturation", + "stats.enterpriseBilling": "Entreprise · Facturation", + "stats.usedBilling": "{used} utilisés · Facturation", "processing.jobStatus.processing": "Traitement", - "processing.jobStatus.completed": "Terminé", - "processing.jobStatus.failed": "Échoué", - "processing.jobStatus.cancelled": "Annulé", + "processing.jobStatus.completed": "Terminé", + "processing.jobStatus.failed": "Échoué", + "processing.jobStatus.cancelled": "Annulé", "processing.jobStatus.pending": "En attente", "processing.jobStatus.queued": "En file", - "processing.jobStatus.skipped": "Ignoré", + "processing.jobStatus.skipped": "Ignoré", "processing.jobStatus.unknown": "Inconnu", - "processing.job.error.all_failed": "Les {count} produits ont échoué.", - "processing.job.error.partial_failed": "{count} produits ont échoué.", + "processing.job.error.all_failed": "Les {count} produits ont échoué.", + "processing.job.error.partial_failed": "{count} produits ont échoué.", "processing.step.normalize": "Normaliser", "processing.step.parse_specs": "Analyser les specs", "processing.step.fill_fields": "Remplir les champs", "processing.step.eprel": "EPREL", - "processing.step.ai_enhance": "Amélioration IA", + "processing.step.ai_enhance": "Amélioration IA", "processing.type.full": "Traitement complet", - "processing.type.enhance_only": "Améliorer uniquement", + "processing.type.enhance_only": "Améliorer uniquement", "processing.type.title": "Titre uniquement", "processing.type.description": "Description uniquement", "processing.type.attributes": "Attributs", - "processing.type.category": "Catégorie", + "processing.type.category": "Catégorie", "processing.type.eprel": "EPREL", "processing.type.seo": "SEO", "processing.type.normalize": "Normaliser", - "errors.requestFailed": "Échec de la requête", - "errors.maintenance": "Le système est en maintenance. Réessayez plus tard.", - "errors.readOnly": "Le système est en mode lecture seule. Les modifications sont temporairement désactivées.", - "errors.companyAdminDenied": "Seuls les administrateurs de l'entreprise peuvent {action}. Demandez de l'aide à un administrateur.", + "errors.requestFailed": "Échec de la requête", + "errors.maintenance": "Le système est en maintenance. Réessayez plus tard.", + "errors.readOnly": "Le système est en mode lecture seule. Les modifications sont temporairement désactivées.", + "errors.companyAdminDenied": "Seuls les administrateurs de l'entreprise peuvent {action}. Demandez de l'aide à un administrateur.", "errors.companyAdminDenied.actionDefault": "faire ceci", - "docs.tryIt.memberCannotCreate": "Seuls les admins peuvent créer des clés API. Les clés héritées n’ont pas été migrées — collez une clé ci-dessous ou demandez à un admin d’en créer une.", - "docs.tryIt.noKeysLegacyAdmin": "Les clés API héritées n’ont pas été migrées. Créez-en une via Use my API key ou Paramètres → Clés API — le secret n’est affiché qu’une fois.", - "docs.tryIt.noKeysLegacyMember": "Aucune clé API. Les clés héritées n’ont pas été migrées — demandez à un admin d’en créer une, ou collez une clé dk_.", - "errors.couldNotUpdateLanguage": "Impossible de mettre à jour la langue", - "toast.support.replyTitle": "Réponse du support", - "toast.support.replyBody": "L'équipe a répondu à votre ticket de support.", + "docs.tryIt.memberCannotCreate": "Seuls les admins peuvent créer des clés API. Les clés héritées n’ont pas été migrées — collez une clé ci-dessous ou demandez à un admin d’en créer une.", + "docs.tryIt.noKeysLegacyAdmin": "Les clés API héritées n’ont pas été migrées. Créez-en une via Use my API key ou Paramètres → Clés API — le secret n’est affiché qu’une fois.", + "docs.tryIt.noKeysLegacyMember": "Aucune clé API. Les clés héritées n’ont pas été migrées — demandez à un admin d’en créer une, ou collez une clé dk_.", + "errors.couldNotUpdateLanguage": "Impossible de mettre à jour la langue", + "toast.support.replyTitle": "Réponse du support", + "toast.support.replyBody": "L'équipe a répondu à votre ticket de support.", "toast.support.replyRe": "Re : {subject}", - "toast.support.statusTitle": "Statut du ticket mis à jour", - "toast.support.statusBody": "Le statut de votre ticket de support a changé.", - "toast.support.updateTitle": "Mise à jour du support", + "toast.support.statusTitle": "Statut du ticket mis à jour", + "toast.support.statusBody": "Le statut de votre ticket de support a changé.", + "toast.support.updateTitle": "Mise à jour du support", "assistant.label": "Assistant", - "assistant.open": "Ouvrir l'assistant système", - "assistant.close": "Fermer l'assistant système", - "tutorial.demoTour": "Visite démo", - "tutorial.jumpToTopic": "Aller à un sujet", - "tutorial.whereNeedHelp": "Où avez-vous besoin d'aide ?", + "assistant.open": "Ouvrir l'assistant système", + "assistant.close": "Fermer l'assistant système", + "tutorial.demoTour": "Visite démo", + "tutorial.jumpToTopic": "Aller à un sujet", + "tutorial.whereNeedHelp": "Où avez-vous besoin d'aide ?", "tutorial.skipTour": "Passer la visite", "tutorial.skipAria": "Passer le tutoriel", - "tutorial.pickerBody": "Choisissez une section pour rouvrir cette partie de la démo. Parcourir la visite ne modifie pas les données de votre compte.", + "tutorial.pickerBody": "Choisissez une section pour rouvrir cette partie de la démo. Parcourir la visite ne modifie pas les données de votre compte.", "tutorial.sectionsAria": "Sections du tutoriel", "tutorial.open": "Ouvrir", "tutorial.close": "Fermer", - "tutorial.resumeLastStep": "Reprendre la dernière étape", - "tutorial.startFromBeginning": "Reprendre depuis le début", - "tutorial.stepOf": "Étape {current} sur {total}", - "tutorial.jumpTo": "Aller à…", - "tutorial.jumpToSectionAria": "Aller à la section", + "tutorial.resumeLastStep": "Reprendre la dernière étape", + "tutorial.startFromBeginning": "Reprendre depuis le début", + "tutorial.stepOf": "Étape {current} sur {total}", + "tutorial.jumpTo": "Aller à…", + "tutorial.jumpToSectionAria": "Aller à la section", "tutorial.back": "Retour", "tutorial.pause": "Mettre en pause", "tutorial.continue": "Continuer", "tutorial.finishTour": "Terminer la visite", - "tutorial.missingTargetHint": "Ce contrôle n'est pas encore sur cet écran. Vous pouvez quand même Continuer — la visite n'exige jamais d'enregistrement ni de synchronisation.", + "tutorial.missingTargetHint": "Ce contrôle n'est pas encore sur cet écran. Vous pouvez quand même Continuer — la visite n'exige jamais d'enregistrement ni de synchronisation.", "tutorial.section.welcome": "Welcome", "tutorial.section.catalog": "Catalog setup", "tutorial.section.sources": "Feeds", @@ -490,112 +490,112 @@ export const fr: MessageDict = { "tutorial.section.grow": "Grow", "tutorial.section.done": "Done", "tutorial.step.welcome.title": "Bienvenue sur Descrybe", - "tutorial.step.welcome.body": "La boucle principale de Descrybe est Feeds → Process → Export / Stores. Cette démo guidée met en avant ces écrans sur votre vrai tableau de bord — sans vous demander d’enregistrer, synchroniser, activer des champs ou créer des feeds. Pause à tout moment ; reprise depuis l’en-tête. Sautez à une section si vous n’avez besoin d’aide que sur un sujet.", - "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", + "tutorial.step.welcome.body": "La boucle principale de Descrybe est Feeds → Process → Export / Stores. Cette démo guidée met en avant ces écrans sur votre vrai tableau de bord — sans vous demander d’enregistrer, synchroniser, activer des champs ou créer des feeds. Pause à tout moment ; reprise depuis l’en-tête. Sautez à une section si vous n’avez besoin d’aide que sur un sujet.", + "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", "tutorial.step.welcome.nextLabel": "Start tour", - "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", + "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", "tutorial.step.dashboard-overview.title": "Votre centre de commande", - "tutorial.step.dashboard-overview.body": "La bande de workflow catalogue montre le parcours quotidien : Feeds → Map → Sync → Process. Getting started suit le vrai progrès de l’espace de travail (séparé de cette démo). Quand vous êtes prêt, utilisez Manage feeds ou Start processing — puis exportez ou connectez une boutique.", - "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", + "tutorial.step.dashboard-overview.body": "La bande de workflow catalogue montre le parcours quotidien : Feeds → Map → Sync → Process. Getting started suit le vrai progrès de l’espace de travail (séparé de cette démo). Quand vous êtes prêt, utilisez Manage feeds ou Start processing — puis exportez ou connectez une boutique.", + "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", "tutorial.step.dashboard-overview.missingHint": "The workflow strip and checklist appear after the dashboard loads.", "tutorial.step.enable-fields.title": "Champs standard", - "tutorial.step.enable-fields.body": "Les Standard Fields sont les colonnes produit que Descrybe mappe, traite et exporte — titre, description, GTIN, images, etc. Enable recommended active un jeu par défaut adapté à la plupart des catalogues. Vous pourrez affiner la liste plus tard sans casser les mappings existants.", - "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", + "tutorial.step.enable-fields.body": "Les Standard Fields sont les colonnes produit que Descrybe mappe, traite et exporte — titre, description, GTIN, images, etc. Enable recommended active un jeu par défaut adapté à la plupart des catalogues. Vous pourrez affiner la liste plus tard sans casser les mappings existants.", + "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", "tutorial.step.enable-fields.warning": "Enabling or disabling fields affects mapping and processing for this company. Prefer Enable recommended once, then tweak carefully.", "tutorial.step.enable-fields.missingHint": "Wait for the Fields page to load, or open Fields from the Catalog section in the sidebar.", - "tutorial.step.catalog-depth.title": "Catégories et attributs", - "tutorial.step.catalog-depth.body": "Dans la section Catalog de la barre latérale vous trouverez aussi Categories et Attributes. Categories organisent le catalogue ; les attributs alimentent filtres et descriptions structurées. Pas besoin de les configurer pour finir cette visite.", - "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", + "tutorial.step.catalog-depth.title": "Catégories et attributs", + "tutorial.step.catalog-depth.body": "Dans la section Catalog de la barre latérale vous trouverez aussi Categories et Attributes. Categories organisent le catalogue ; les attributs alimentent filtres et descriptions structurées. Pas besoin de les configurer pour finir cette visite.", + "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", "tutorial.step.catalog-depth.missingHint": "Expand Catalog in the sidebar to open Categories or Attributes after the tour.", "tutorial.step.connect-source.title": "Ajouter une source produit", - "tutorial.step.connect-source.body": "Les feeds font entrer les catalogues fournisseurs dans Descrybe — fichiers CSV, XML ou URL. Add Feed crée une nouvelle source ; chaque ligne montre le statut (prêt pour le mapping, mappé, actif). Map ouvre l'écran de correspondance des champs pour ce feed.", - "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", + "tutorial.step.connect-source.body": "Les feeds font entrer les catalogues fournisseurs dans Descrybe — fichiers CSV, XML ou URL. Add Feed crée une nouvelle source ; chaque ligne montre le statut (prêt pour le mapping, mappé, actif). Map ouvre l'écran de correspondance des champs pour ce feed.", + "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", "tutorial.step.connect-source.warning": "Avoid deleting live feeds unless you intend to remove that source and its sync history.", - "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", + "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", "tutorial.step.map.title": "Mapper les champs source", - "tutorial.step.map.body": "Sur l'écran Map d'un feed, vous associez les colonnes fournisseur aux standard fields Descrybe. Auto-map propose des correspondances d'après les noms de colonnes ; confirmez les floues, puis corrigez le reste. Save Mappings enregistre la carte pour que sync et traitement sachent lire chaque ligne.", - "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", - "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", + "tutorial.step.map.body": "Sur l'écran Map d'un feed, vous associez les colonnes fournisseur aux standard fields Descrybe. Auto-map propose des correspondances d'après les noms de colonnes ; confirmez les floues, puis corrigez le reste. Save Mappings enregistre la carte pour que sync et traitement sachent lire chaque ligne.", + "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", + "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", "tutorial.step.map.missingHint": "Add a feed and click Map to see the mapping UI; or Continue to keep learning.", - "tutorial.step.sync-sample.title": "Synchroniser un échantillon (quand prêt)", - "tutorial.step.sync-sample.body": "Après enregistrement des mappings, Sync + Process sample tire un petit lot et lance le traitement pour vérifier titres, images et attributs avant un run complet. Full Sync now dans la liste des feeds sert aux imports plus larges une fois l'échantillon bon.", - "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", + "tutorial.step.sync-sample.title": "Synchroniser un échantillon (quand prêt)", + "tutorial.step.sync-sample.body": "Après enregistrement des mappings, Sync + Process sample tire un petit lot et lance le traitement pour vérifier titres, images et attributs avant un run complet. Full Sync now dans la liste des feeds sert aux imports plus larges une fois l'échantillon bon.", + "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", "tutorial.step.sync-sample.warning": "Syncing writes products into this company. Prefer a sample first; avoid Sync now on unmapped feeds.", "tutorial.step.sync-sample.missingHint": "Sync controls appear on feed rows and on the mapping screen footer.", "tutorial.step.process.title": "Revoir les produits", - "tutorial.step.process.body": "Products liste les articles synchronisés et traités. Filtrez par statut, ouvrez une ligne pour le détail, et utilisez les badges EPREL quand des données d’étiquette énergétique existent. C’est ici que vous repérez les erreurs de mapping avant export ou sync boutique.", - "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", + "tutorial.step.process.body": "Products liste les articles synchronisés et traités. Filtrez par statut, ouvrez une ligne pour le détail, et utilisez les badges EPREL quand des données d’étiquette énergétique existent. C’est ici que vous repérez les erreurs de mapping avant export ou sync boutique.", + "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", "tutorial.step.process.missingHint": "Wait for the products table, or Continue if the catalog is still empty.", - "tutorial.step.processing-hub.title": "Traitement en arrière-plan", - "tutorial.step.processing-hub.body": "Les jobs sous Processing montrent la progression AI et pipeline : exécutions terminées et échecs. Lancez des jobs depuis le tableau de bord ou les produits quand vous voulez dépenser des crédits sur un lot.", - "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", + "tutorial.step.processing-hub.title": "Traitement en arrière-plan", + "tutorial.step.processing-hub.body": "Les jobs sous Processing montrent la progression AI et pipeline : exécutions terminées et échecs. Lancez des jobs depuis le tableau de bord ou les produits quand vous voulez dépenser des crédits sur un lot.", + "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", "tutorial.step.processing-hub.missingHint": "Open Jobs from the Processing section in the sidebar if the page is empty.", "tutorial.step.stores-hub.title": "Boutiques et plateformes", - "tutorial.step.stores-hub.body": "Après traitement, Stores connecte WooCommerce ou Shopify pour pousser le catalogue nettoyé vers votre boutique. Utilisez-le quand un marketplace ou CMS est la destination — ou passez à Export feeds si les partenaires n’ont besoin que d’un fichier/URL.", - "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", + "tutorial.step.stores-hub.body": "Après traitement, Stores connecte WooCommerce ou Shopify pour pousser le catalogue nettoyé vers votre boutique. Utilisez-le quand un marketplace ou CMS est la destination — ou passez à Export feeds si les partenaires n’ont besoin que d’un fichier/URL.", + "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", "tutorial.step.stores-hub.missingHint": "Open Stores from the sidebar to see connection cards.", - "tutorial.step.export.title": "Exporter des produits nettoyés", - "tutorial.step.export.body": "Les export feeds publient des produits nettoyés en XML ou CSV pour canaux, partenaires ou votre boutique. Créez un export, choisissez format et filtres, puis partagez l'URL du feed ou téléchargez. Les exports lisent les données catalogue traitées — mappez et traitez d'abord pour de meilleurs résultats.", - "tutorial.step.export.tip": "You don’t need to create an export during the demo.", - "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", + "tutorial.step.export.title": "Exporter des produits nettoyés", + "tutorial.step.export.body": "Les export feeds publient des produits nettoyés en XML ou CSV pour canaux, partenaires ou votre boutique. Créez un export, choisissez format et filtres, puis partagez l'URL du feed ou téléchargez. Les exports lisent les données catalogue traitées — mappez et traitez d'abord pour de meilleurs résultats.", + "tutorial.step.export.tip": "You don’t need to create an export during the demo.", + "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", "tutorial.step.export.missingHint": "Wait for Export feeds to load, or open Exports from the Feeds section in the sidebar.", - "tutorial.step.billing-hub.title": "Crédits et facturation", - "tutorial.step.billing-hub.body": "Billing affiche votre plan, portefeuille et crédits restants. Le traitement et certaines fonctions AI puisent dans ce solde. Surveillez l'usage avant de grands runs catalogue.", - "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", + "tutorial.step.billing-hub.title": "Crédits et facturation", + "tutorial.step.billing-hub.body": "Billing affiche votre plan, portefeuille et crédits restants. Le traitement et certaines fonctions AI puisent dans ce solde. Surveillez l'usage avant de grands runs catalogue.", + "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", "tutorial.step.billing-hub.missingHint": "Open Billing from the Account section in the sidebar.", "tutorial.step.grow-hub.title": "Campagnes, SEO et avis", - "tutorial.step.grow-hub.body": "Dans Marketing : Campaigns génère du contenu, Content calendar planifie les posts, SEO vérifie les fiches et Reviews s’intègre à WooCommerce. Ils s’appuient sur un catalogue bien mappé — terminez Feeds → Process → Export / Stores avant de vous y appuyer.", - "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", + "tutorial.step.grow-hub.body": "Dans Marketing : Campaigns génère du contenu, Content calendar planifie les posts, SEO vérifie les fiches et Reviews s’intègre à WooCommerce. Ils s’appuient sur un catalogue bien mappé — terminez Feeds → Process → Export / Stores avant de vous y appuyer.", + "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", "tutorial.step.grow-hub.missingHint": "Open Campaigns from Marketing in the sidebar, or Continue.", - "tutorial.step.tour-done.title": "Prêt à explorer", - "tutorial.step.tour-done.body": "Voici la carte produit : Feeds → Map → Sync → Process → Export / Stores. Utilisez Getting started sur le tableau de bord pour la vraie configuration. Reprenez ou relancez cette visite depuis l’en-tête à tout moment, ou Jump to… une section pour un rappel. Skip tour termine la démo sans changer votre checklist.", - "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", + "tutorial.step.tour-done.title": "Prêt à explorer", + "tutorial.step.tour-done.body": "Voici la carte produit : Feeds → Map → Sync → Process → Export / Stores. Utilisez Getting started sur le tableau de bord pour la vraie configuration. Reprenez ou relancez cette visite depuis l’en-tête à tout moment, ou Jump to… une section pour un rappel. Skip tour termine la démo sans changer votre checklist.", + "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", "tutorial.step.tour-done.nextLabel": "Finish tour", "tutorial.step.tour-done.missingHint": "Return to the dashboard to finish.", - "news.uxImprovements.title": "Améliorations de l'expérience utilisateur", - "flash.contentLanguageUpdated": "Langue du contenu mise à jour.", + "news.uxImprovements.title": "Améliorations de l'expérience utilisateur", + "flash.contentLanguageUpdated": "Langue du contenu mise à jour.", "theme.darkMode": "Mode sombre", "theme.lightMode": "Mode clair", - "forbidden.title.accessRestricted": "Accès restreint", - "forbidden.title.permissionDenied": "Permission refusée", - "forbidden.message.support": "Cette zone est réservée au support et aux administrateurs de la plateforme.", - "forbidden.message.platform": "Cette zone est réservée aux administrateurs de la plateforme.", - "forbidden.message.company": "Vous n’avez pas l’autorisation. Demandez de l’aide à un administrateur de l’entreprise.", + "forbidden.title.accessRestricted": "Accès restreint", + "forbidden.title.permissionDenied": "Permission refusée", + "forbidden.message.support": "Cette zone est réservée au support et aux administrateurs de la plateforme.", + "forbidden.message.platform": "Cette zone est réservée aux administrateurs de la plateforme.", + "forbidden.message.company": "Vous n’avez pas l’autorisation. Demandez de l’aide à un administrateur de l’entreprise.", "forbidden.backToDashboard": "Retour au tableau de bord", "admin.chrome.platformOps": "Ops plateforme", - "admin.chrome.sidebar": "Barre latérale ops plateforme", + "admin.chrome.sidebar": "Barre latérale ops plateforme", "admin.chrome.nav": "Ops plateforme", "admin.chrome.mobileMenu": "Menu mobile ops plateforme", "admin.chrome.opsBadge": "Ops", - "admin.chrome.backToApp": "Retour à l'app", + "admin.chrome.backToApp": "Retour à l'app", "admin.chrome.uiLanguage": "Langue de l'interface", "admin.chrome.staff.supportDesk": "Bureau d'assistance", "admin.chrome.staff.platformAdmin": "Admin plateforme", - "admin.chrome.staff.staff": "Équipe", + "admin.chrome.staff.staff": "Équipe", "admin.chrome.staff.admin": "Admin", "admin.nav.section.overview": "Vue d'ensemble", "admin.nav.section.directory": "Annuaire", "admin.nav.section.support": "Assistance", - "admin.nav.section.ops": "Opérations", + "admin.nav.section.ops": "Opérations", "admin.nav.section.commerce": "Commerce", - "admin.nav.section.system": "Système", + "admin.nav.section.system": "Système", "admin.nav.commandCenter": "Centre de commande", "admin.nav.analytics": "Analytique", "admin.nav.usersOrgs": "Utilisateurs et orgs", "admin.nav.tickets": "Tickets", "admin.nav.knowledge": "Connaissance", "admin.nav.diagnostics": "Bilans", - "admin.nav.stuckProducts": "Produits bloqués", + "admin.nav.stuckProducts": "Produits bloqués", "admin.nav.orphanProcessed": "Orphan processed", "admin.nav.billing": "Facturation", "admin.nav.sales": "Sales", "admin.nav.translations": "Traductions", - "admin.nav.settings": "Paramètres", + "admin.nav.settings": "Paramètres", "admin.sales.title": "Sales leads", "admin.sales.description": "Inbound Contact sales messages and custom payment quotes.", "admin.sales.listTitle": "Leads", "admin.sales.listDesc": "{total} matching leads", - "admin.sales.searchPlaceholder": "Search name, email, company…", + "admin.sales.searchPlaceholder": "Search name, email, company…", "admin.sales.statusAll": "All statuses", "admin.sales.status.new": "New", "admin.sales.status.contacted": "Contacted", @@ -643,7 +643,7 @@ export const fr: MessageDict = { "admin.sales.col.status": "Status", "admin.sales.col.created": "Created", "sales.contact.title": "Contact sales", - "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", + "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", "sales.contact.formTitle": "Send a message", "sales.contact.formLead": "Enterprise and custom deals are prepared by our team, then paid via Stripe Checkout.", "sales.contact.name": "Name", @@ -653,134 +653,134 @@ export const fr: MessageDict = { "sales.contact.estimatedSkus": "Estimated SKUs (optional)", "sales.contact.message": "How can we help?", "sales.contact.submit": "Send message", - "sales.contact.submitting": "Sending…", + "sales.contact.submitting": "Sending…", "sales.contact.error": "Could not send your message. Please try again.", - "sales.contact.toast.success": "Message sent — we will follow up soon.", - "sales.contact.thanksTitle": "Thanks — we got your message", + "sales.contact.toast.success": "Message sent — we will follow up soon.", + "sales.contact.thanksTitle": "Thanks — we got your message", "sales.contact.thanksBody": "A platform admin will review your request and can send a Checkout link for a custom plan.", "sales.contact.bookDemo": "Book a live demo", "sales.contact.orBookDemo": "Or book a Calendly demo", "sales.contact.backPricing": "Back to pricing", "admin.overview.eyebrow": "Centre de commande", "admin.overview.title": "Vue d'ensemble de la plateforme", - "admin.overview.description": "Pouls en direct de la plateforme depuis le résumé analytique — accédez aux opérations, informations et support.", + "admin.overview.description": "Pouls en direct de la plateforme depuis le résumé analytique — accédez aux opérations, informations et support.", "admin.overview.tokens": "Jetons", - "admin.overview.tokensHint": "Tout le temps · période", - "admin.overview.credits": "Crédits", + "admin.overview.tokensHint": "Tout le temps · période", + "admin.overview.credits": "Crédits", "admin.overview.creditsHint": "Sur toutes les entreprises", - "admin.overview.jobs": "Tâches", - "admin.overview.jobsHint": "Instantané de file", + "admin.overview.jobs": "Tâches", + "admin.overview.jobsHint": "Instantané de file", "admin.overview.platform": "Plateforme", - "admin.overview.platformHint": "Locataires · volume", - "admin.overview.signals": "Signaux récents", + "admin.overview.platformHint": "Locataires · volume", + "admin.overview.signals": "Signaux récents", "admin.overview.shortcuts": "Raccourcis ops", "admin.overview.providers": "Mix de fournisseurs IA", "admin.overview.internalAi": "IA interne", - "admin.overview.internalAiHint": "Paramètres de la plateforme", - "admin.overview.popularKeys": "Clés populaires", + "admin.overview.internalAiHint": "Paramètres de la plateforme", + "admin.overview.popularKeys": "Clés populaires", "admin.overview.popularKeysHint": "Fournisseurs populaires du locataire", - "admin.overview.customUrl": "URL personnalisée", - "admin.overview.customUrlHint": "URL de base personnalisée du locataire", + "admin.overview.customUrl": "URL personnalisée", + "admin.overview.customUrlHint": "URL de base personnalisée du locataire", "admin.overview.linkBilling": "Facturation", - "admin.overview.linkSettings": "Paramètres", + "admin.overview.linkSettings": "Paramètres", "admin.overview.shortcut.diagnostics.title": "Bilans", - "admin.overview.shortcut.diagnostics.desc": "Contrôles de santé, file, échecs récents", + "admin.overview.shortcut.diagnostics.desc": "Contrôles de santé, file, échecs récents", "admin.overview.shortcut.analytics.title": "Analytique", - "admin.overview.shortcut.analytics.desc": "Jetons, tâches, inscriptions, fournisseurs", + "admin.overview.shortcut.analytics.desc": "Jetons, tâches, inscriptions, fournisseurs", "admin.overview.shortcut.knowledge.title": "Connaissance", - "admin.overview.shortcut.knowledge.desc": "Articles, modèles, réponse auto", + "admin.overview.shortcut.knowledge.desc": "Articles, modèles, réponse auto", "admin.overview.shortcut.users.title": "Utilisateurs et orgs", "admin.overview.shortcut.users.desc": "Comptes, entreprises, invitations", - "admin.overview.shortcut.stuck.title": "Produits bloqués", + "admin.overview.shortcut.stuck.title": "Produits bloqués", "admin.overview.shortcut.stuck.desc": "En cours depuis plus de 2 heures", - "admin.overview.signal.stuckTitle": "{count} tâche bloquée", - "admin.overview.signal.stuckTitlePlural": "{count} tâches bloquées", - "admin.overview.signal.stuckDetail": "En cours depuis plus de 2 heures — vérifiez et réinitialisez si besoin.", - "admin.overview.signal.stuckCta": "Ouvrir les tâches bloquées", - "admin.overview.signal.failedTitle": "{count} échecs sur les {days} derniers j", - "admin.overview.signal.failedDetail": "{completed} terminés dans la même fenêtre.", - "admin.overview.signal.failedDetailRate": "{rate}% de taux d'échec · {completed} terminés.", + "admin.overview.signal.stuckTitle": "{count} tâche bloquée", + "admin.overview.signal.stuckTitlePlural": "{count} tâches bloquées", + "admin.overview.signal.stuckDetail": "En cours depuis plus de 2 heures — vérifiez et réinitialisez si besoin.", + "admin.overview.signal.stuckCta": "Ouvrir les tâches bloquées", + "admin.overview.signal.failedTitle": "{count} échecs sur les {days} derniers j", + "admin.overview.signal.failedDetail": "{completed} terminés dans la même fenêtre.", + "admin.overview.signal.failedDetailRate": "{rate}% de taux d'échec · {completed} terminés.", "admin.overview.signal.failedCta": "Ouvrir les diagnostics", - "admin.overview.signal.runningTitle": "{count} tâche en cours", - "admin.overview.signal.runningTitlePlural": "{count} tâches en cours", - "admin.overview.signal.runningDetail": "Tâches de traitement actives en ce moment.", + "admin.overview.signal.runningTitle": "{count} tâche en cours", + "admin.overview.signal.runningTitlePlural": "{count} tâches en cours", + "admin.overview.signal.runningDetail": "Tâches de traitement actives en ce moment.", "admin.overview.signal.runningCta": "Voir la file", "admin.overview.signal.ticketsTitle": "{count} ticket de support ouvert", "admin.overview.signal.ticketsTitlePlural": "{count} tickets de support ouverts", "admin.overview.signal.ticketsDetail": "Tickets ouverts ou en attente dans le bureau d'assistance.", "admin.overview.signal.ticketsCta": "Ouvrir le support", - "admin.overview.signal.clearTitle": "Aucun signal élevé", - "admin.overview.signal.clearDetail": "Aucune tâche bloquée, échec de période ni ticket ouvert dans le résumé live (derniers {days} j).", + "admin.overview.signal.clearTitle": "Aucun signal élevé", + "admin.overview.signal.clearDetail": "Aucune tâche bloquée, échec de période ni ticket ouvert dans le résumé live (derniers {days} j).", "admin.overview.signal.clearCta": "Confirmer dans les diagnostics", "admin.overview.badge.action": "Action", "admin.overview.badge.watch": "Surveiller", "admin.overview.badge.live": "En direct", "admin.overview.badge.clear": "Effacer", - "admin.overview.summaryLoadFailed": "Impossible de charger le résumé live. Les raccourcis ci-dessous fonctionnent toujours.", - "admin.overview.keyMetrics": "Indicateurs clés", - "admin.overview.summaryWindow": "{days} j derniers · endpoint résumé", + "admin.overview.summaryLoadFailed": "Impossible de charger le résumé live. Les raccourcis ci-dessous fonctionnent toujours.", + "admin.overview.keyMetrics": "Indicateurs clés", + "admin.overview.summaryWindow": "{days} j derniers · endpoint résumé", "admin.overview.tokensPeriod": "{count} sur les {days} j derniers", - "admin.overview.creditsFoot": "{remaining} restants sur {allocated} alloués", - "admin.overview.jobsFoot": "{failed} échoués · {running} en cours · {stuck} bloqués", - "admin.overview.platformFoot": "{users} utilisateurs · {processed} traités · {feeds} flux d'entrée", + "admin.overview.creditsFoot": "{remaining} restants sur {allocated} alloués", + "admin.overview.jobsFoot": "{failed} échoués · {running} en cours · {stuck} bloqués", + "admin.overview.platformFoot": "{users} utilisateurs · {processed} traités · {feeds} flux d'entrée", "admin.overview.fullDiagnostics": "Diagnostics complets", "admin.overview.also": "Aussi :", "admin.overview.linkSupport": "Bureau d'assistance", "admin.overview.charts": "Graphiques", - "admin.overview.providerFoot": "{jobs} travaux · {products} produits", + "admin.overview.providerFoot": "{jobs} travaux · {products} produits", "admin.analytics.eyebrow": "Insights", "admin.analytics.title": "Analytique et rapports", - "admin.analytics.description": "KPI et tendances live de la plateforme à partir des jetons, tâches, inscriptions, feeds, tickets et facturation.", - "admin.analytics.period": "Période", - "admin.analytics.refreshing": "Actualisation…", + "admin.analytics.description": "KPI et tendances live de la plateforme à partir des jetons, tâches, inscriptions, feeds, tickets et facturation.", + "admin.analytics.period": "Période", + "admin.analytics.refreshing": "Actualisation…", "admin.analytics.llmTokens": "Jetons LLM", - "admin.analytics.credits": "Crédits", - "admin.analytics.jobs": "Tâches", + "admin.analytics.credits": "Crédits", + "admin.analytics.jobs": "Tâches", "admin.analytics.volume": "Volume", - "admin.analytics.failureRate": "Taux d'échec", - "admin.analytics.stuckJobs": "Tâches bloquées", - "admin.analytics.apiKeys": "Clés API", + "admin.analytics.failureRate": "Taux d'échec", + "admin.analytics.stuckJobs": "Tâches bloquées", + "admin.analytics.apiKeys": "Clés API", "admin.analytics.signups": "Inscriptions", "admin.analytics.internalAi": "IA interne", - "admin.analytics.internalAiHint": "OpenAI plateforme (paramètres admin)", - "admin.analytics.popularKeys": "Clés populaires", - "admin.analytics.popularKeysHint": "OpenAI / Groq / … du locataire", - "admin.analytics.customUrl": "URL/modèle personnalisé", - "admin.analytics.customUrlHint": "URL de base du locataire + modèle + clé", + "admin.analytics.internalAiHint": "OpenAI plateforme (paramètres admin)", + "admin.analytics.popularKeys": "Clés populaires", + "admin.analytics.popularKeysHint": "OpenAI / Groq / … du locataire", + "admin.analytics.customUrl": "URL/modèle personnalisé", + "admin.analytics.customUrlHint": "URL de base du locataire + modèle + clé", "admin.analytics.tokensByDay": "Jetons par jour", "admin.analytics.tokensByProvider": "Jetons par classe de fournisseur", "admin.analytics.tokensByProviderAria": "Jetons par classe de fournisseur", "admin.analytics.internalCount": "Interne {count}", "admin.analytics.popularCount": "Populaire {count}", - "admin.analytics.customCount": "Personnalisé {count}", - "admin.analytics.jobsByDay": "Tâches par jour", - "admin.analytics.jobsByDayHint": "Tâches créées (secondaire = échecs).", + "admin.analytics.customCount": "Personnalisé {count}", + "admin.analytics.jobsByDay": "Tâches par jour", + "admin.analytics.jobsByDayHint": "Tâches créées (secondaire = échecs).", "admin.analytics.signupsByDay": "Inscriptions par jour", "admin.analytics.signupsByDayHint": "Nouveaux utilisateurs (primaire) et entreprises (secondaire)", "admin.analytics.processingJobsStatus": "processing_jobs par statut", "admin.analytics.feedSyncStatus": "feed_sync_jobs par statut", "admin.analytics.ticketsStatus": "support_tickets par statut", - "admin.analytics.providerDetail": "Détail du fournisseur", - "admin.analytics.providerDetailHint": "Principaux modes fournisseur (plafonnés pour la taille de payload).", + "admin.analytics.providerDetail": "Détail du fournisseur", + "admin.analytics.providerDetailHint": "Principaux modes fournisseur (plafonnés pour la taille de payload).", "admin.analytics.noProviderRows": "Aucune ligne fournisseur", "admin.analytics.provider": "Fournisseur", "admin.analytics.class": "Classe", "admin.analytics.tokensCol": "Jetons", "admin.analytics.productsCol": "Produits", - "admin.analytics.companiesHint": "Principales entreprises par jetons avec répartition fournisseur", + "admin.analytics.companiesHint": "Principales entreprises par jetons avec répartition fournisseur", "admin.analytics.noCompanies": "Aucune entreprise", "admin.analytics.noCompaniesMsg": "La liste des entreprises est vide.", "admin.analytics.company": "Entreprise", "admin.analytics.internal": "Interne", "admin.analytics.popular": "Populaire", - "admin.analytics.custom": "Personnalisé", + "admin.analytics.custom": "Personnalisé", "admin.analytics.noBillingCycles": "Pas encore de cycles de facturation", "admin.analytics.linkDiagnostics": "Bilans", - "admin.analytics.linkStuck": "Produits bloqués", + "admin.analytics.linkStuck": "Produits bloqués", "admin.users.eyebrow": "Admin plateforme", "admin.users.title": "Utilisateurs et organisations", - "admin.users.description": "Annuaire utilisateurs de la plateforme, rôles du personnel et affectations de plans d'entreprise.", - "admin.users.staffRoleUnavailable": "Les mises à jour de rôle du personnel ne sont pas encore disponibles sur ce déploiement. Contactez votre administrateur de plateforme si besoin.", + "admin.users.description": "Annuaire utilisateurs de la plateforme, rôles du personnel et affectations de plans d'entreprise.", + "admin.users.staffRoleUnavailable": "Les mises à jour de rôle du personnel ne sont pas encore disponibles sur ce déploiement. Contactez votre administrateur de plateforme si besoin.", "admin.users.search": "Rechercher", "admin.users.tabUsers": "Utilisateurs", "admin.users.tabCompanies": "Entreprises", @@ -788,83 +788,83 @@ export const fr: MessageDict = { "admin.users.filterWithoutApiKeys": "Keys needing reissue", "admin.users.needsApiKeyReissue": "Needs API key reissue", "admin.users.colName": "Nom", - "admin.users.colStaffRole": "Rôle du personnel", + "admin.users.colStaffRole": "Rôle du personnel", "admin.users.colStatus": "Statut", - "admin.users.colCreated": "Créé", + "admin.users.colCreated": "Créé", "admin.users.colActions": "Actions", - "admin.users.mustSetPassword": "Doit définir un mot de passe", + "admin.users.mustSetPassword": "Doit définir un mot de passe", "admin.users.inactive": "Inactif", - "admin.users.reissueInvite": "Réémettre l'invitation", - "admin.users.setLocalPassword": "Définir un mot de passe local", + "admin.users.reissueInvite": "Réémettre l'invitation", + "admin.users.setLocalPassword": "Définir un mot de passe local", "admin.users.switchToUser": "Passer en utilisateur", "admin.users.colCompany": "Entreprise", "admin.users.colPlan": "Offre", - "admin.users.colCredits": "Crédits", + "admin.users.colCredits": "Crédits", "admin.users.colLanguage": "Langue", "admin.users.assignPlan": "Attribuer un forfait", "admin.users.cloneCatalog": "Copier vers mon entreprise", "admin.users.cloneCatalogAria": "Copier le catalogue de {name} vers votre entreprise sandbox", "admin.users.cloneCatalogTitle": "Copier le catalogue d'entreprise", - "admin.users.cloneCatalogDesc": "Vous restez sur votre compte admin. Les données source ne sont pas modifiées.", + "admin.users.cloneCatalogDesc": "Vous restez sur votre compte admin. Les données source ne sont pas modifiées.", "admin.users.cloneCatalogFrom": "Source : {name}", "admin.users.cloneCatalogInto": "Destination : {name}", - "admin.users.cloneCatalogWarning": "Remplace catégories, feeds, produits, attributs, mappings et marque sur la destination. Forfait, facturation, membres, clés API et connecteurs boutique ne sont pas copiés.", + "admin.users.cloneCatalogWarning": "Remplace catégories, feeds, produits, attributs, mappings et marque sur la destination. Forfait, facturation, membres, clés API et connecteurs boutique ne sont pas copiés.", "admin.users.cloneCatalogCancel": "Annuler", "admin.users.cloneCatalogConfirm": "Copier le catalogue", "admin.users.cloneDestFallback": "votre entreprise sandbox", - "admin.users.fixA1": "Réparer le catalogue A1", - "admin.users.fixA1Aria": "Réparer les prompts IA, catégories et hashes enhance pour {name}", - "admin.users.fixA1Title": "Réparer le catalogue entreprise", - "admin.users.fixA1Desc": "Réapplique les prompts IA corrigés, efface les hashes enhance faibles et complète les catégories depuis mapped_data.", + "admin.users.fixA1": "Réparer le catalogue A1", + "admin.users.fixA1Aria": "Réparer les prompts IA, catégories et hashes enhance pour {name}", + "admin.users.fixA1Title": "Réparer le catalogue entreprise", + "admin.users.fixA1Desc": "Réapplique les prompts IA corrigés, efface les hashes enhance faibles et complète les catégories depuis mapped_data.", "admin.users.fixA1Company": "Entreprise : {name}", - "admin.users.fixA1Warning": "Préférer Platform Demo ou une entreprise explicite. Ne supprime ni feeds, ni mappings, ni produits bruts. Protège les règles d'écrasement de la cohorte A1.", + "admin.users.fixA1Warning": "Préférer Platform Demo ou une entreprise explicite. Ne supprime ni feeds, ni mappings, ni produits bruts. Protège les règles d'écrasement de la cohorte A1.", "admin.users.fixA1Cancel": "Annuler", - "admin.users.fixA1Confirm": "Réparer le catalogue", - "admin.users.noUsers": "Aucun utilisateur ne correspond à ce filtre.", - "admin.users.noCompanies": "Aucune entreprise ne correspond à ce filtre.", - "admin.users.assignRoleTitle": "Assigner un rôle du personnel", - "admin.users.assignRoleDesc": "Les rôles plateforme contrôlent le panneau admin (Admin et Developer) et le bureau d'assistance (personnel support).", - "admin.users.staffRole": "Rôle du personnel", - "admin.users.saveRole": "Enregistrer le rôle", + "admin.users.fixA1Confirm": "Réparer le catalogue", + "admin.users.noUsers": "Aucun utilisateur ne correspond à ce filtre.", + "admin.users.noCompanies": "Aucune entreprise ne correspond à ce filtre.", + "admin.users.assignRoleTitle": "Assigner un rôle du personnel", + "admin.users.assignRoleDesc": "Les rôles plateforme contrôlent le panneau admin (Admin et Developer) et le bureau d'assistance (personnel support).", + "admin.users.staffRole": "Rôle du personnel", + "admin.users.saveRole": "Enregistrer le rôle", "admin.users.assignPlanTitle": "Assigner une offre", - "admin.users.assignPlanDesc": "Attacher une offre publique, legacy ou personnalisée à cette entreprise.", - "admin.users.selectPlan": "Sélectionner une offre", + "admin.users.assignPlanDesc": "Attacher une offre publique, legacy ou personnalisée à cette entreprise.", + "admin.users.selectPlan": "Sélectionner une offre", "admin.users.assign": "Assigner", - "admin.settings.title": "Paramètres de la plateforme", - "admin.settings.description": "Identifiants plateforme, rôles IA, e-mail et intégrations pour ce déploiement", - "admin.settings.intro": "Configurez ici les rôles IA plateforme, SMTP, OAuth, EPREL, Pinecone et Stripe. Laissez les secrets vides pour conserver la valeur stockée. Les clés par entreprise restent sous Intégrations du locataire.", - "admin.settings.aiRolesUnavailable": "Les rôles IA complets ne sont pas encore disponibles sur ce déploiement. Le traitement continue via les paramètres OpenAI plateforme ; les autres rôles seront persistés une fois pris en charge.", + "admin.settings.title": "Paramètres de la plateforme", + "admin.settings.description": "Identifiants plateforme, rôles IA, e-mail et intégrations pour ce déploiement", + "admin.settings.intro": "Configurez ici les rôles IA plateforme, SMTP, OAuth, EPREL, Pinecone et Stripe. Laissez les secrets vides pour conserver la valeur stockée. Les clés par entreprise restent sous Intégrations du locataire.", + "admin.settings.aiRolesUnavailable": "Les rôles IA complets ne sont pas encore disponibles sur ce déploiement. Le traitement continue via les paramètres OpenAI plateforme ; les autres rôles seront persistés une fois pris en charge.", "admin.settings.tab.integrations": "Vue d'ensemble", - "admin.settings.tab.ai": "Rôles IA", + "admin.settings.tab.ai": "Rôles IA", "admin.settings.tab.mail": "Mail", "admin.settings.tab.other": "Autre", "admin.settings.tab.admins": "Utilisateurs admin", - "admin.settings.mailCardDesc": "Invitations de définition de mot de passe et e-mail sortant de la plateforme", + "admin.settings.mailCardDesc": "Invitations de définition de mot de passe et e-mail sortant de la plateforme", "admin.settings.integrationsCardDesc": "OAuth, EPREL, Pinecone, Stripe, feeds", "admin.settings.tenantVsPlatform": "Locataire vs plateforme", - "admin.settings.hostSecrets": "Secrets de base de données, session et signature du serveur — configurer uniquement sur l'hôte", + "admin.settings.hostSecrets": "Secrets de base de données, session et signature du serveur — configurer uniquement sur l'hôte", "admin.settings.linkAi": "IA", "admin.settings.linkEmail": "Courriel", "admin.settings.linkBilling": "Facturation", "admin.settings.provider": "Fournisseur", - "admin.settings.model": "Modèle", + "admin.settings.model": "Modèle", "admin.settings.baseUrl": "URL de base", - "admin.settings.apiKey": "Clé API", + "admin.settings.apiKey": "Clé API", "admin.settings.embeddingDims": "Dimensions d'embedding (facultatif)", - "admin.settings.smtpHost": "Hôte SMTP", + "admin.settings.smtpHost": "Hôte SMTP", "admin.settings.port": "Port", "admin.settings.username": "Nom d'utilisateur", - "admin.settings.fromAddress": "Adresse d'expédition", + "admin.settings.fromAddress": "Adresse d'expédition", "admin.settings.testRecipient": "Destinataire de test (facultatif)", - "admin.settings.testRecipientPlaceholder": "Par défaut votre e-mail admin", + "admin.settings.testRecipientPlaceholder": "Par défaut votre e-mail admin", "admin.settings.googleOauth": "Google OAuth", "admin.settings.googleOauthDesc": "Identifiants client Google OAuth plateforme facultatifs.", "admin.settings.clientId": "ID client", "admin.settings.eprel": "EPREL", - "admin.settings.timeout": "Délai dépassé", + "admin.settings.timeout": "Délai dépassé", "admin.settings.ficheLanguage": "Langue de la fiche", "admin.settings.pinecone": "Pinecone", - "admin.settings.host": "Hôte", + "admin.settings.host": "Hôte", "admin.settings.namespace": "Espace de noms", "admin.settings.namespacePlaceholder": "facultatif", "admin.settings.stripe": "Stripe", @@ -879,7 +879,7 @@ export const fr: MessageDict = { "admin.settings.priceScaleMo": "Scale monthly price ID", "admin.settings.priceScaleYr": "Scale yearly price ID", "admin.settings.creditPackPrices": "AI credit pack price IDs (one-time)", - "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", + "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", "admin.settings.syncCreditPacks": "Sync Stripe packs", "admin.settings.syncCreditPacksOk": "Synced {count} credit pack price(s) ({mode} mode).", "admin.settings.syncCreditPacksModeHint": "Stripe mode for this sync: {mode}. Switch the secret key (sk_test_ vs sk_live_) to sync the other environment.", @@ -888,55 +888,55 @@ export const fr: MessageDict = { "admin.settings.pricePackMedium": "Growth pack (2,000 credits) price ID", "admin.settings.pricePackLarge": "Catalog pack (10,000 credits) price ID", "admin.settings.pricePackXL": "Scale pack (40,000 credits) price ID", - "admin.settings.feedAllowlist": "Liste d'autorisation d'URL privées de feeds", + "admin.settings.feedAllowlist": "Liste d'autorisation d'URL privées de feeds", "admin.settings.allowlist": "Liste d'autorisation", "admin.settings.platformAdmins": "Administrateurs de plateforme", "admin.settings.colUserId": "ID utilisateur", "admin.settings.colEmail": "Courriel", "admin.settings.colName": "Nom", - "admin.settings.colAddedOn": "Ajouté le", - "admin.settings.colRole": "Rôle", + "admin.settings.colAddedOn": "Ajouté le", + "admin.settings.colRole": "Rôle", "admin.settings.platformAdminBadge": "Admin plateforme", - "admin.settings.noAdmins": "Aucun utilisateur admin trouvé", - "admin.settings.adminStatusCheck": "Vérification du statut admin", + "admin.settings.noAdmins": "Aucun utilisateur admin trouvé", + "admin.settings.adminStatusCheck": "Vérification du statut admin", "admin.settings.bootstrapPage": "page bootstrap", - "admin.readiness.title": "Préparation de la bascule", - "admin.readiness.detail": "Compteurs hypercare qui nécessitent encore de l’attention avant le basculement DNS.", - "admin.readiness.mustSetPassword": "{count} utilisateurs doivent définir un mot de passe", + "admin.readiness.title": "Préparation de la bascule", + "admin.readiness.detail": "Compteurs hypercare qui nécessitent encore de l’attention avant le basculement DNS.", + "admin.readiness.mustSetPassword": "{count} utilisateurs doivent définir un mot de passe", "admin.readiness.withoutAdmin": "{count} entreprises sans administrateur", "admin.readiness.withoutPlan": "{count} entreprises sans forfait actif", "admin.readiness.withoutApiKeys": "{count} companies needing API key reissue", - "admin.readiness.linksAria": "Liens profonds de préparation", + "admin.readiness.linksAria": "Liens profonds de préparation", "admin.readiness.linkUsers": "Utilisateurs", "admin.readiness.linkBilling": "Facturation", - "admin.readiness.linkSettings": "Paramètres", + "admin.readiness.linkSettings": "Paramètres", "admin.readiness.linkApiKeys": "Keys needing reissue", "admin.diagnostics.eyebrow": "Plateforme", "admin.diagnostics.title": "Bilans", - "admin.diagnostics.description": "Console ops pour la santé de l'app, profondeur de file, tâches récentes et indicateurs de config. Secrets et DSN ne sont jamais affichés ; les erreurs de tâches sont sanitizées.", - "admin.diagnostics.filterAria": "Filtre d'état de la tâche", + "admin.diagnostics.description": "Console ops pour la santé de l'app, profondeur de file, tâches récentes et indicateurs de config. Secrets et DSN ne sont jamais affichés ; les erreurs de tâches sont sanitizées.", + "admin.diagnostics.filterAria": "Filtre d'état de la tâche", "admin.diagnostics.queue": "File", - "admin.diagnostics.noJobsInQueue": "Aucune tâche en file.", - "admin.diagnostics.sanitizedErrors": "Erreurs sanitizées · max 25", + "admin.diagnostics.noJobsInQueue": "Aucune tâche en file.", + "admin.diagnostics.sanitizedErrors": "Erreurs sanitizées · max 25", "admin.diagnostics.colId": "ID", "admin.diagnostics.colCompany": "Entreprise", "admin.diagnostics.colStatus": "Statut", "admin.diagnostics.colProgress": "Progression", - "admin.diagnostics.colUpdated": "Mis à jour", + "admin.diagnostics.colUpdated": "Mis à jour", "admin.diagnostics.colError": "Erreur", "admin.diagnostics.colTicket": "Ticket", "admin.diagnostics.colWhen": "Quand", - "admin.diagnostics.noJobsFilter": "Aucune tâche pour ce filtre.", - "admin.stuck.title": "Produits bloqués", - "admin.stuck.description": "Examinez les tâches de traitement récentes et réinitialisez celles bloquées plus de 2 heures", - "admin.stuck.noJobs": "Aucune tâche trouvée.", - "admin.stuck.filterAria": "Filtrer les tâches par statut", + "admin.diagnostics.noJobsFilter": "Aucune tâche pour ce filtre.", + "admin.stuck.title": "Produits bloqués", + "admin.stuck.description": "Examinez les tâches de traitement récentes et réinitialisez celles bloquées plus de 2 heures", + "admin.stuck.noJobs": "Aucune tâche trouvée.", + "admin.stuck.filterAria": "Filtrer les tâches par statut", "admin.orphan.title": "Orphan processed", - "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", + "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", "admin.orphan.cutoverHint": "Safe by default: refresh and dry-run never delete. Confirm delete sends confirm=true only after you approve the dialog.", "admin.orphan.refreshReport": "Refresh report", "admin.orphan.dryRunBtn": "Dry-run cleanup", - "admin.orphan.deleteBtn": "Confirm delete…", + "admin.orphan.deleteBtn": "Confirm delete…", "admin.orphan.loadFailed": "Could not load orphan report", "admin.orphan.dryRunFailed": "Dry-run cleanup failed", "admin.orphan.deleteFailed": "Confirmed orphan cleanup failed", @@ -947,7 +947,7 @@ export const fr: MessageDict = { "admin.orphan.samplesDesc": "Up to 25 most recently updated orphan catalog rows", "admin.orphan.cleanBadge": "Clean", "admin.orphan.needsCleanupBadge": "Needs cleanup", - "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", + "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", "admin.orphan.noSamples": "No sample rows in this report.", "admin.orphan.colProcessed": "Processed ID", "admin.orphan.colCompany": "Company", @@ -963,164 +963,164 @@ export const fr: MessageDict = { "admin.orphan.confirmDesc": "This permanently deletes {total} processed_products row(s) whose raw is missing or unprocessed. Job product links use ON DELETE SET NULL.", "admin.orphan.confirmDelete": "Delete orphans", "admin.billing.title": "Admin facturation", - "admin.billing.description": "Gérez les offres, crédits, permissions de fonctions par forfait et interrupteurs de fonctions à l'échelle de la plateforme.", - "admin.billing.noCompanies": "Aucune entreprise trouvée.", - "admin.billing.noCompaniesFilter": "Aucune entreprise ne correspond à ce filtre.", + "admin.billing.description": "Gérez les offres, crédits, permissions de fonctions par forfait et interrupteurs de fonctions à l'échelle de la plateforme.", + "admin.billing.noCompanies": "Aucune entreprise trouvée.", + "admin.billing.noCompaniesFilter": "Aucune entreprise ne correspond à ce filtre.", "admin.billing.assignPlanTitle": "Assigner une offre", - "admin.billing.assignPlanDesc": "Attachez une offre de facturation à une entreprise. Les crédits d'essai facultatifs réinitialisent le solde de l'entreprise pour la période d'essai.", - "admin.billing.creditsTitle": "Ajouter / ajuster des crédits", - "admin.billing.creditsDesc": "Créditer ou débiter le solde d'une entreprise.", - "admin.billing.searchCompany": "Rechercher une entreprise…", + "admin.billing.assignPlanDesc": "Attachez une offre de facturation à une entreprise. Les crédits d'essai facultatifs réinitialisent le solde de l'entreprise pour la période d'essai.", + "admin.billing.creditsTitle": "Ajouter / ajuster des crédits", + "admin.billing.creditsDesc": "Créditer ou débiter le solde d'une entreprise.", + "admin.billing.searchCompany": "Rechercher une entreprise…", "admin.knowledge.draft": "Brouillon", "admin.knowledge.badge.draft": "Brouillon", "admin.knowledge.newArticle": "Nouvel article", - "admin.knowledge.editArticle": "Modifier l’article", + "admin.knowledge.editArticle": "Modifier l’article", "admin.knowledge.noMatchingArticles": "Aucun article correspondant", "admin.knowledge.noArticles": "Aucun article de connaissance", - "admin.knowledge.emptyCategoryMsg": "La catégorie « {category} » est prête — ajoutez une coquille d’article pour qu’un agent contenu la remplisse.", - "admin.knowledge.emptyArticlesMsg": "Ajoutez des coquilles FAQ avec catégories et mots-clés. Laissez des placeholders dans le corps pour les agents contenu.", + "admin.knowledge.emptyCategoryMsg": "La catégorie « {category} » est prête — ajoutez une coquille d’article pour qu’un agent contenu la remplisse.", + "admin.knowledge.emptyArticlesMsg": "Ajoutez des coquilles FAQ avec catégories et mots-clés. Laissez des placeholders dans le corps pour les agents contenu.", "admin.knowledge.col.title": "Titre", "admin.knowledge.col.name": "Nom", "admin.knowledge.edit": "Modifier", - "admin.knowledge.newTemplate": "Nouveau modèle", - "admin.knowledge.editTemplate": "Modifier le modèle", + "admin.knowledge.newTemplate": "Nouveau modèle", + "admin.knowledge.editTemplate": "Modifier le modèle", "admin.knowledge.allCategories": "Tout", "admin.settings.enablePlatformSmtp": "Activer SMTP plateforme", "admin.plans.title": "Offres d'abonnement", - "admin.plans.description": "Public ladder, A1 / Hérité, Plateforme Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Masqué.", - "admin.plans.searchPlaceholder": "Rechercher nom ou description…", + "admin.plans.description": "Public ladder, A1 / Hérité, Plateforme Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Masqué.", + "admin.plans.searchPlaceholder": "Rechercher nom ou description…", "admin.plans.searchAria": "Rechercher des offres", - "admin.plans.filterAria": "Filtrer les offres par visibilité", + "admin.plans.filterAria": "Filtrer les offres par visibilité", "admin.plans.filter.catalog": "Catalogue", "admin.plans.filter.public": "Public", "admin.plans.filter.legacy": "Legacy", - "admin.plans.filter.custom": "Personnalisé", - "admin.plans.filter.hidden": "Masqué", + "admin.plans.filter.custom": "Personnalisé", + "admin.plans.filter.hidden": "Masqué", "admin.plans.filter.all": "Tout", "admin.plans.col.plan": "Offre", - "admin.plans.col.visibility": "Visibilité", - "admin.plans.col.monthlyCredits": "Crédits mensuels", + "admin.plans.col.visibility": "Visibilité", + "admin.plans.col.monthlyCredits": "Crédits mensuels", "admin.plans.col.maxProducts": "Produits max.", - "admin.plans.col.term": "Durée", - "admin.plans.customPackageFlag": "Indicateur de forfait personnalisé", + "admin.plans.col.term": "Durée", + "admin.plans.customPackageFlag": "Indicateur de forfait personnalisé", "admin.plans.visibility.public": "Public", "admin.plans.visibility.legacy": "Legacy", - "admin.plans.visibility.hidden": "Masqué", - "admin.plans.visibility.custom": "Personnalisé", + "admin.plans.visibility.hidden": "Masqué", + "admin.plans.visibility.custom": "Personnalisé", "admin.plans.edit": "Modifier", "admin.plans.editAria": "Modifier {name}", "admin.plans.assign": "Assigner", "admin.plans.assignAria": "Attribuer {name}", "admin.plans.permissions": "Autorisations du plan", - "admin.plans.permissionsAria": "Modifier permissions de l'désactivére for {name}", + "admin.plans.permissionsAria": "Modifier permissions de l'désactivére for {name}", "admin.plans.showing": "Affichage de {filtered} sur {total} plans", - "admin.plans.unlimited": "Illimité", - "admin.plans.optionLabel": "{name} ({credits} crédits) · {kind}", - "admin.permissions.noteStrong": "Désactivére entitlements only.", - "admin.permissions.noteBody": "These toggles set what this package may include. Plateforme-wide on/désactivé masters are on the {global} tab — a plan can enable a feature that still stays désactivé when the platform switch is désactivé.", + "admin.plans.unlimited": "Illimité", + "admin.plans.optionLabel": "{name} ({credits} crédits) · {kind}", + "admin.permissions.noteStrong": "Désactivére entitlements only.", + "admin.permissions.noteBody": "These toggles set what this package may include. Plateforme-wide on/désactivé masters are on the {global} tab — a plan can enable a feature that still stays désactivé when the platform switch is désactivé.", "admin.permissions.globalTab": "Interrupteurs globaux", "admin.permissions.title": "Autorisations du plan", - "admin.permissions.descCount": "{enabled}/{total} activés", - "admin.permissions.matchesProfile": "correspond à {profile}", - "admin.permissions.customizedOverrides": "remplacements personnalisés", - "admin.permissions.planDefaults": "valeurs par défaut du forfait", - "admin.permissions.badge.legacy": "Forfait legacy migré", - "admin.permissions.badge.publicLadder": "Échelle publique", - "admin.permissions.badge.ladderCustom": "Public ladder · personnalisé flag", - "admin.permissions.badge.customDeal": "Personnalisé deal", + "admin.permissions.descCount": "{enabled}/{total} activés", + "admin.permissions.matchesProfile": "correspond à {profile}", + "admin.permissions.customizedOverrides": "remplacements personnalisés", + "admin.permissions.planDefaults": "valeurs par défaut du forfait", + "admin.permissions.badge.legacy": "Forfait legacy migré", + "admin.permissions.badge.publicLadder": "Échelle publique", + "admin.permissions.badge.ladderCustom": "Public ladder · personnalisé flag", + "admin.permissions.badge.customDeal": "Personnalisé deal", "admin.permissions.badge.clientDeal": "Accord client", - "admin.permissions.badge.customOverrides": "Personnalisé overrides", - "admin.permissions.badge.defaults": "Valeurs par défaut", - "admin.permissions.badge.customFlag": "Personnalisé flag", + "admin.permissions.badge.customOverrides": "Personnalisé overrides", + "admin.permissions.badge.defaults": "Valeurs par défaut", + "admin.permissions.badge.customFlag": "Personnalisé flag", "admin.permissions.package": "Forfait", "admin.permissions.noPlans": "Aucune offre", - "admin.permissions.suffix.legacy": "· legacy", - "admin.permissions.suffix.default": " · par défaut", - "admin.permissions.suffix.custom": " · personnalisé", + "admin.permissions.suffix.legacy": "· legacy", + "admin.permissions.suffix.default": " · par défaut", + "admin.permissions.suffix.custom": " · personnalisé", "admin.permissions.section": "Section", "admin.permissions.allSections": "Toutes les sections", - "admin.permissions.state": "État", + "admin.permissions.state": "État", "admin.permissions.stateAll": "Tout", - "admin.permissions.stateOn": "Activé", - "admin.permissions.stateOff": "Désactivé", - "admin.permissions.stateDiffers": "Diffère from default", + "admin.permissions.stateOn": "Activé", + "admin.permissions.stateOff": "Désactivé", + "admin.permissions.stateDiffers": "Diffère from default", "admin.permissions.search": "Rechercher", - "admin.permissions.searchPlaceholder": "Filtrer par clé ou libellé", - "admin.permissions.profilesAria": "Désactivére feature profiles", + "admin.permissions.searchPlaceholder": "Filtrer par clé ou libellé", + "admin.permissions.profilesAria": "Désactivére feature profiles", "admin.permissions.applyProfile": "Appliquer le profil", - "admin.permissions.applyLegacy": "Appliquer le profil hérité", - "admin.permissions.profilesHint": "One-click matrices for public ladder packages and migrated legacy navigation. Enregistrers overrides for the sélectionné package only.", + "admin.permissions.applyLegacy": "Appliquer le profil hérité", + "admin.permissions.profilesHint": "One-click matrices for public ladder packages and migrated legacy navigation. Enregistrers overrides for the sélectionné package only.", "admin.permissions.applyNamed": "Appliquer {label}", "admin.permissions.applyGeneric": "Appliquer le profil", "admin.permissions.enableAll": "Tout activer", - "admin.permissions.disableAll": "Tout désactiver", + "admin.permissions.disableAll": "Tout désactiver", "admin.permissions.clearOverrides": "Effacer les substitutions", - "admin.permissions.globallyOff": "Globally désactivé", + "admin.permissions.globallyOff": "Globally désactivé", "admin.permissions.enableSection": "Activer la section", - "admin.permissions.disableSection": "Désactiver la section", - "admin.permissions.noMatch": "Aucune fonctionnalité ne correspond aux filtres actuels.", - "admin.permissions.differs": "Diffère", - "admin.permissions.platformOffHint": "Désactivé à l'échelle de la plateforme even if this plan enables it.", + "admin.permissions.disableSection": "Désactiver la section", + "admin.permissions.noMatch": "Aucune fonctionnalité ne correspond aux filtres actuels.", + "admin.permissions.differs": "Diffère", + "admin.permissions.platformOffHint": "Désactivé à l'échelle de la plateforme even if this plan enables it.", "admin.permissions.sectionToggled": "{label} {state} pour ce forfait.", - "admin.permissions.state.enabled": "activé", - "admin.permissions.state.disabled": "désactivé", - "admin.permissions.loadFailed": "Échec du chargement permissions de l'désactivére", - "admin.permissions.saveFailed": "Échec de l'enregistrement feature", - "admin.permissions.enableAllFailed": "Tout activer a échoué", - "admin.permissions.disableAllFailed": "Tout désactiver a échoué", - "admin.permissions.profileFailed": "Échec de apply profile", - "admin.permissions.resetFailed": "Échec de reset defaults", - "admin.permissions.sectionFailed": "Section update a échoué", + "admin.permissions.state.enabled": "activé", + "admin.permissions.state.disabled": "désactivé", + "admin.permissions.loadFailed": "Échec du chargement permissions de l'désactivére", + "admin.permissions.saveFailed": "Échec de l'enregistrement feature", + "admin.permissions.enableAllFailed": "Tout activer a échoué", + "admin.permissions.disableAllFailed": "Tout désactiver a échoué", + "admin.permissions.profileFailed": "Échec de apply profile", + "admin.permissions.resetFailed": "Échec de reset defaults", + "admin.permissions.sectionFailed": "Section update a échoué", "admin.profile.legacy.label": "Legacy", - "admin.profile.legacy.description": "Migrated legacy navigation: catalog, flux, facturation, and paramètres; no Retourground Tasks, boutiques, or marketing.", + "admin.profile.legacy.description": "Migrated legacy navigation: catalog, flux, facturation, and paramètres; no Retourground Tasks, boutiques, or marketing.", "admin.profile.free.label": "Gratuit", - "admin.profile.free.description": "Public Free ladder — AI, clé APIs, live email, and own-key AI désactivé.", + "admin.profile.free.description": "Public Free ladder — AI, clé APIs, live email, and own-key AI désactivé.", "admin.profile.starter.label": "Starter", - "admin.profile.starter.description": "Public Starter — AI on; own-key AI désactivé.", + "admin.profile.starter.description": "Public Starter — AI on; own-key AI désactivé.", "admin.profile.growth.label": "Growth", - "admin.profile.growth.description": "Toutes les fonctionnalités du catalogue activées.", + "admin.profile.growth.description": "Toutes les fonctionnalités du catalogue activées.", "admin.profile.business.label": "Business", - "admin.profile.business.description": "Toutes les fonctionnalités du catalogue activées.", - "admin.profile.enterprise.label": "Enterprise / tout activé", - "admin.profile.enterprise.description": "Full matrice de fonctionnalités (custom and Enterprise default).", + "admin.profile.business.description": "Toutes les fonctionnalités du catalogue activées.", + "admin.profile.enterprise.label": "Enterprise / tout activé", + "admin.profile.enterprise.description": "Full matrice de fonctionnalités (custom and Enterprise default).", "admin.gates.noteStrong": "Plateforme-wide masters.", - "admin.gates.noteBody": "Ces interrupteurs s’appliquent à tous les forfaits. L’accès effectif est {combo}. Les droits par forfait restent dans l’onglet {permissions}.", - "admin.gates.combo": "permission du forfait ET section globale ET fonctionnalité globale", + "admin.gates.noteBody": "Ces interrupteurs s’appliquent à tous les forfaits. L’accès effectif est {combo}. Les droits par forfait restent dans l’onglet {permissions}.", + "admin.gates.combo": "permission du forfait ET section globale ET fonctionnalité globale", "admin.gates.permissionsTab": "Autorisations du plan", - "admin.gates.sectionsOff": "{count} section désactivé", - "admin.gates.sectionsOffPlural": "{count} sections désactivé", - "admin.gates.featuresOff": "{count} feature master désactivé", - "admin.gates.featuresOffPlural": "{count} feature masters désactivé", - "admin.gates.title": "Maîtres de fonctionnalités globales", - "admin.gates.description": "Disable a feature here to turn it désactivé for every package, even when a plan enables it.", + "admin.gates.sectionsOff": "{count} section désactivé", + "admin.gates.sectionsOffPlural": "{count} sections désactivé", + "admin.gates.featuresOff": "{count} feature master désactivé", + "admin.gates.featuresOffPlural": "{count} feature masters désactivé", + "admin.gates.title": "Maîtres de fonctionnalités globales", + "admin.gates.description": "Disable a feature here to turn it désactivé for every package, even when a plan enables it.", "admin.gates.section": "Section", "admin.gates.allSections": "Toutes les sections", "admin.gates.search": "Rechercher", - "admin.gates.searchPlaceholder": "Filtrer par clé ou libellé", - "admin.gates.sectionOff": "Section désactivé", - "admin.gates.noMatch": "Aucune fonctionnalité ne correspond aux filtres actuels.", + "admin.gates.searchPlaceholder": "Filtrer par clé ou libellé", + "admin.gates.sectionOff": "Section désactivé", + "admin.gates.noMatch": "Aucune fonctionnalité ne correspond aux filtres actuels.", "admin.gates.featureAria": "{label} global", "admin.gates.sectionsTitle": "Interrupteurs de section globale", - "admin.gates.sectionsDesc": "Turn an entire produit area on or désactivé for all packages. “Section + features” also updates every feature master in that section.", + "admin.gates.sectionsDesc": "Turn an entire produit area on or désactivé for all packages. “Section + features” also updates every feature master in that section.", "admin.gates.sectionAria": "Section globale {label}", - "admin.gates.enableSectionFeatures": "Activer section + fonctionnalités", - "admin.gates.disableSectionFeatures": "Désactiver section + fonctionnalités", + "admin.gates.enableSectionFeatures": "Activer section + fonctionnalités", + "admin.gates.disableSectionFeatures": "Désactiver section + fonctionnalités", "admin.gates.sectionSuccess": "{label} {state} pour tous les forfaits.", - "admin.gates.sectionSuccessWithFeatures": "{label} {state} pour tous les forfaits (maîtres section et fonctionnalité).", + "admin.gates.sectionSuccessWithFeatures": "{label} {state} pour tous les forfaits (maîtres section et fonctionnalité).", "admin.gates.featureSuccess": "{key} {state} globalement.", - "admin.gates.state.enabled": "activé", - "admin.gates.state.disabled": "désactivé", - "admin.gates.loadFailed": "Échec du chargement global feature switches", - "admin.gates.sectionFailed": "Échec de update global section", - "admin.gates.saveFailed": "Échec de l'enregistrement global feature", - "admin.billing.createPlan": "Créer une offre", + "admin.gates.state.enabled": "activé", + "admin.gates.state.disabled": "désactivé", + "admin.gates.loadFailed": "Échec du chargement global feature switches", + "admin.gates.sectionFailed": "Échec de update global section", + "admin.gates.saveFailed": "Échec de l'enregistrement global feature", + "admin.billing.createPlan": "Créer une offre", "admin.billing.assignPlanBtn": "Assigner une offre", "admin.billing.stat.plans": "Offres", - "admin.billing.stat.catalogHidden": "{catalog} catalogue · {hidden} masqués", - "admin.billing.stat.creditsAllocated": "Crédits allocated", + "admin.billing.stat.catalogHidden": "{catalog} catalogue · {hidden} masqués", + "admin.billing.stat.creditsAllocated": "Crédits allocated", "admin.billing.stat.acrossCompanies": "Across entreprises on this page (first 50)", - "admin.billing.stat.creditsUsed": "Crédits used", - "admin.billing.stat.creditsConsumed": "Crédits consumed on this page", + "admin.billing.stat.creditsUsed": "Crédits used", + "admin.billing.stat.creditsConsumed": "Crédits consumed on this page", "admin.billing.stat.noActivePlan": "Aucune offre active", "admin.billing.stat.noActivePlanHint": "Entreprises with no active subscription (this page)", "admin.billing.tab.plans": "Offres", @@ -1131,7 +1131,7 @@ export const fr: MessageDict = { "admin.billing.cyclesDesc": "Process due renewals for entreprises on scheduled cycles de facturation.", "admin.billing.runCycles": "Run due cycles de facturation", "admin.billing.companiesTitle": "Entreprises", - "admin.billing.companiesDesc": "Soldes de crédits et statut du forfait — assignez des forfaits ou ajustez les crédits.", + "admin.billing.companiesDesc": "Soldes de crédits et statut du forfait — assignez des forfaits ou ajustez les crédits.", "admin.billing.searchCompaniesAria": "Rechercher entreprises", "admin.billing.planStatusAria": "Statut de l'offre", "admin.billing.filter.all": "Tout entreprises", @@ -1139,441 +1139,441 @@ export const fr: MessageDict = { "admin.billing.filter.withoutPlan": "Aucune offre active", "admin.billing.col.company": "Entreprise", "admin.billing.col.planStatus": "Statut de l'offre", - "admin.billing.col.creditsRemaining": "Crédits restants", + "admin.billing.col.creditsRemaining": "Crédits restants", "admin.billing.col.total": "Total", - "admin.billing.col.used": "Utilisés", - "admin.billing.col.usagePct": "% d’utilisation", + "admin.billing.col.used": "Utilisés", + "admin.billing.col.usagePct": "% d’utilisation", "admin.billing.badge.noPlan": "Aucun forfait", "admin.billing.badge.active": "Actif", - "admin.billing.assignPlanAria": "Assigner le forfait à {name}", - "admin.billing.addCredits": "Ajouter des crédits", + "admin.billing.assignPlanAria": "Assigner le forfait à {name}", + "admin.billing.addCredits": "Ajouter des crédits", "admin.billing.addCreditsAria": "Ajouter credits for {name}", "admin.billing.showingCompanies": "Affichage de {filtered} sur {total} entreprises", "admin.billing.editPlanTitle": "Modifier plan", - "admin.billing.createPlanTitle": "Créer une offre", + "admin.billing.createPlanTitle": "Créer une offre", "admin.billing.editPlanDesc": "Update credits, produit caps, and whether this plan is marked custom.", - "admin.billing.createPlanDesc": "Créer a package. Personnalisé plans stay hidden from public pricing.", + "admin.billing.createPlanDesc": "Créer a package. Personnalisé plans stay hidden from public pricing.", "admin.billing.field.name": "Nom", "admin.billing.field.description": "Description", "admin.billing.field.descriptionPlaceholder": "Facultatif short summary for admins", - "admin.billing.field.monthlyCredits": "Crédits mensuels", - "admin.billing.field.yearlyCredits": "Crédits annuels", + "admin.billing.field.monthlyCredits": "Crédits mensuels", + "admin.billing.field.yearlyCredits": "Crédits annuels", "admin.billing.field.maxProducts": "Produits max.", - "admin.billing.field.maxProductsPlaceholder": "Vide = illimité", - "admin.billing.field.term": "Durée", + "admin.billing.field.maxProductsPlaceholder": "Vide = illimité", + "admin.billing.field.term": "Durée", "admin.billing.term.monthly": "Mensuel", "admin.billing.term.yearly": "Annuel", - "admin.billing.customPackage": "Personnalisé package", - "admin.billing.customPackageHint": "Masqué from public pricing. Use for client deals; leave désactivé for Free–Business.", - "admin.billing.previewBadge": "Badge d’aperçu : {preview}.", + "admin.billing.customPackage": "Personnalisé package", + "admin.billing.customPackageHint": "Masqué from public pricing. Use for client deals; leave désactivé for Free–Business.", + "admin.billing.previewBadge": "Badge d’aperçu : {preview}.", "admin.billing.company": "Entreprise", - "admin.billing.selectCompany": "Sélectionner entreprise", - "admin.billing.noPlanSuffix": "· no plan", + "admin.billing.selectCompany": "Sélectionner entreprise", + "admin.billing.noPlanSuffix": "· no plan", "admin.billing.plan": "Offre", - "admin.billing.selectPlan": "Sélectionner une offre", - "admin.billing.trialAssignment": "Attribution d’essai", + "admin.billing.selectPlan": "Sélectionner une offre", + "admin.billing.trialAssignment": "Attribution d’essai", "admin.billing.trialHint": "Facultatif trial flag + credit grant for sales or evaluation trials.", - "admin.billing.trialCredits": "Crédits d’essai", + "admin.billing.trialCredits": "Crédits d’essai", "admin.billing.assign": "Assigner", "admin.billing.amount": "Montant", - "admin.billing.amountHint": "Utilisez une valeur négative pour débiter.", + "admin.billing.amountHint": "Utilisez une valeur négative pour débiter.", "admin.billing.apply": "Appliquer", - "admin.billing.planUpdated": "Offre mis à jour.", - "admin.billing.planCreated": "Offre créé.", - "admin.billing.loadFailed": "Échec du chargement facturation data", - "admin.billing.updateFailed": "Update plan a échoué", - "admin.billing.createFailed": "Créer plan a échoué", - "admin.billing.assignFailed": "Assign a échoué", - "admin.billing.creditsFailed": "Add credits a échoué", - "admin.billing.cyclesFailed": "Run cycles a échoué", + "admin.billing.planUpdated": "Offre mis à jour.", + "admin.billing.planCreated": "Offre créé.", + "admin.billing.loadFailed": "Échec du chargement facturation data", + "admin.billing.updateFailed": "Update plan a échoué", + "admin.billing.createFailed": "Créer plan a échoué", + "admin.billing.assignFailed": "Assign a échoué", + "admin.billing.creditsFailed": "Add credits a échoué", + "admin.billing.cyclesFailed": "Run cycles a échoué", "admin.knowledge.supportInbox": "Assistance inbox", - "admin.knowledge.aiRoles": "Rôles IA", + "admin.knowledge.aiRoles": "Rôles IA", "admin.knowledge.tab.articles": "Articles", - "admin.knowledge.tab.templates": "Modèles", - "admin.knowledge.tab.settings": "Réponse automatique", + "admin.knowledge.tab.templates": "Modèles", + "admin.knowledge.tab.settings": "Réponse automatique", "admin.knowledge.allStatuses": "Tout statuses", - "admin.knowledge.published": "Publié", - "admin.knowledge.createArticle": "Créer article", - "admin.knowledge.col.categories": "Catégories", + "admin.knowledge.published": "Publié", + "admin.knowledge.createArticle": "Créer article", + "admin.knowledge.col.categories": "Catégories", "admin.knowledge.col.status": "Statut", - "admin.knowledge.col.keywords": "Mots-clés", - "admin.knowledge.badge.published": "Publié", - "admin.knowledge.createTemplate": "Créer template", + "admin.knowledge.col.keywords": "Mots-clés", + "admin.knowledge.badge.published": "Publié", + "admin.knowledge.createTemplate": "Créer template", "admin.knowledge.badge.active": "Actif", "admin.knowledge.badge.inactive": "Inactif", - "admin.knowledge.autoFirstResponses": "Activer les premières réponses automatiques", - "admin.knowledge.faqMatching": "Correspondance FAQ / modèle", - "admin.knowledge.retryOnReply": "Réessayer on first customer reply (if no prior auto)", + "admin.knowledge.autoFirstResponses": "Activer les premières réponses automatiques", + "admin.knowledge.faqMatching": "Correspondance FAQ / modèle", + "admin.knowledge.retryOnReply": "Réessayer on first customer reply (if no prior auto)", "admin.knowledge.matchThreshold": "Seuil de confiance de correspondance", "admin.knowledge.enableAiFallback": "Activer le secours IA", "admin.knowledge.deliveryMode": "Mode de livraison", "admin.knowledge.delivery.draft": "Brouillon uniquement (note interne)", "admin.knowledge.delivery.autoSend": "Envoi auto au client", - "admin.knowledge.aiThreshold": "Seuil de confiance de l’IA", + "admin.knowledge.aiThreshold": "Seuil de confiance de l’IA", "admin.knowledge.usePlatformRole": "Use platform assistance AI role (recommended)", - "admin.knowledge.modelOverride": "Modèle override", + "admin.knowledge.modelOverride": "Modèle override", "admin.knowledge.providerOverride": "Fournisseur override", - "admin.knowledge.baseUrlOverride": "Remplacement de l’URL de base", + "admin.knowledge.baseUrlOverride": "Remplacement de l’URL de base", "admin.knowledge.supportAiRoleTitle": "Assistance AI role (fallback provider)", - "admin.knowledge.configured": "Configuré", - "admin.knowledge.notReadyBadge": "Pas prêt", - "admin.knowledge.enabled": "Activé", - "admin.knowledge.disabled": "Désactivé", - "admin.knowledge.openAiRoles": "Ouvrir Plateforme paramètres → AI roles", + "admin.knowledge.configured": "Configuré", + "admin.knowledge.notReadyBadge": "Pas prêt", + "admin.knowledge.enabled": "Activé", + "admin.knowledge.disabled": "Désactivé", + "admin.knowledge.openAiRoles": "Ouvrir Plateforme paramètres → AI roles", "admin.knowledge.field.title": "Titre", "admin.knowledge.field.slug": "Slug", "admin.knowledge.field.body": "Corps (markdown)", - "admin.knowledge.field.keywords": "Mots-clés", - "admin.knowledge.keywordsPlaceholder": "séparés par des virgules", - "admin.knowledge.field.intents": "Clés d’intention", - "admin.knowledge.intentsPlaceholder": "séparés par des virgules", - "admin.knowledge.field.categories": "Catégorie slugs", - "admin.knowledge.categoriesPlaceholder": "facturation, account…", - "admin.knowledge.field.weight": "Poids de priorité", - "admin.knowledge.publishedEligible": "Publié (éligible à la correspondance)", + "admin.knowledge.field.keywords": "Mots-clés", + "admin.knowledge.keywordsPlaceholder": "séparés par des virgules", + "admin.knowledge.field.intents": "Clés d’intention", + "admin.knowledge.intentsPlaceholder": "séparés par des virgules", + "admin.knowledge.field.categories": "Catégorie slugs", + "admin.knowledge.categoriesPlaceholder": "facturation, account…", + "admin.knowledge.field.weight": "Poids de priorité", + "admin.knowledge.publishedEligible": "Publié (éligible à la correspondance)", "admin.knowledge.field.name": "Nom", "admin.knowledge.field.templateBody": "Corps", "admin.knowledge.active": "Actif", "admin.settings.card.aiRolesTitle": "Plateforme AI roles", - "admin.settings.card.aiRolesDesc": "Traitement, vectorization, docs/API, and assistance — separate keys/models", - "admin.settings.roleOff": " (désactivé)", - "admin.settings.roleNotSet": "· not set", - "admin.settings.someRolesUnavailable": "Some AI roles are not disponible on this deployment yet. Traitement still uses the platform OuvrirAI paramètres until all roles are assistanceed.", + "admin.settings.card.aiRolesDesc": "Traitement, vectorization, docs/API, and assistance — separate keys/models", + "admin.settings.roleOff": " (désactivé)", + "admin.settings.roleNotSet": "· not set", + "admin.settings.someRolesUnavailable": "Some AI roles are not disponible on this deployment yet. Traitement still uses the platform OuvrirAI paramètres until all roles are assistanceed.", "admin.settings.configure": "Configurer", "admin.settings.card.smtpTitle": "Plateforme SMTP", - "admin.settings.configured": "Configuré", - "admin.settings.notConfigured": "Non configuré", + "admin.settings.configured": "Configuré", + "admin.settings.notConfigured": "Non configuré", "admin.settings.source": "source : {source}", - "admin.settings.smtpEnabled": "SMTP activé", - "admin.settings.smtpDisabled": "SMTP désactivé", - "admin.settings.passwordSet": "· password set", - "admin.settings.card.otherTitle": "Autres intégrations", - "admin.settings.oauthSet": "Google OAuth défini", - "admin.settings.oauthOff": "Google OAuth désactivé", - "admin.settings.eprelOn": "EPREL activé", - "admin.settings.eprelOff": "EPREL désactivé", - "admin.settings.pineconeSet": "Pinecone défini", - "admin.settings.pineconeOff": "Pinecone désactivé", - "admin.settings.stripeSet": "Stripe défini", - "admin.settings.stripeOff": "Stripe désactivé", + "admin.settings.smtpEnabled": "SMTP activé", + "admin.settings.smtpDisabled": "SMTP désactivé", + "admin.settings.passwordSet": "· password set", + "admin.settings.card.otherTitle": "Autres intégrations", + "admin.settings.oauthSet": "Google OAuth défini", + "admin.settings.oauthOff": "Google OAuth désactivé", + "admin.settings.eprelOn": "EPREL activé", + "admin.settings.eprelOff": "EPREL désactivé", + "admin.settings.pineconeSet": "Pinecone défini", + "admin.settings.pineconeOff": "Pinecone désactivé", + "admin.settings.stripeSet": "Stripe défini", + "admin.settings.stripeOff": "Stripe désactivé", "admin.settings.password": "Mot de passe", - "admin.settings.passwordSavedHint": "(enregistré — leave blank to keep)", - "admin.settings.secretKey": "Clé secrète", - "admin.settings.secretConfiguredHint": "(configuré — laissez vide pour conserver)", + "admin.settings.passwordSavedHint": "(enregistré — leave blank to keep)", + "admin.settings.secretKey": "Clé secrète", + "admin.settings.secretConfiguredHint": "(configuré — laissez vide pour conserver)", "admin.settings.passwordConfigured": "Mot de passe configured", "admin.settings.noSmtpPassword": "Pas de mot de passe SMTP", - "admin.settings.enabled": "Activé", - "admin.settings.disabled": "Désactivé", + "admin.settings.enabled": "Activé", + "admin.settings.disabled": "Désactivé", "admin.settings.saveRole": "Enregistrer {label}", "admin.settings.testConnection": "Tester la connexion", - "admin.settings.saveMail": "Enregistrer mail paramètres", + "admin.settings.saveMail": "Enregistrer mail paramètres", "admin.settings.saveIntegrations": "Enregistrer integrations", - "admin.settings.eprelEnabled": "EPREL enrichment activé", - "admin.settings.loadFailed": "Plateforme paramètres could not be loaded. Saving is désactivé until reload succeeds.", - "admin.settings.testAccepted": "Message de test accepté par SMTP", - "admin.stuck.cleanupBtn": "Nettoyage des jobs bloqués (>2 h en cours)", + "admin.settings.eprelEnabled": "EPREL enrichment activé", + "admin.settings.loadFailed": "Plateforme paramètres could not be loaded. Saving is désactivé until reload succeeds.", + "admin.settings.testAccepted": "Message de test accepté par SMTP", + "admin.stuck.cleanupBtn": "Nettoyage des jobs bloqués (>2 h en cours)", "admin.stuck.jobsTitle": "Jobs de traitement", - "admin.stuck.jobsDesc": "100 derniers jobs · {running} en cours", + "admin.stuck.jobsDesc": "100 derniers jobs · {running} en cours", "admin.stuck.filterAll": "Tout", "admin.stuck.filterRunning": "En cours", - "admin.stuck.filterFailed": "Échoué", + "admin.stuck.filterFailed": "Échoué", "admin.stuck.filterPending": "En attente", - "admin.stuck.filterCompleted": "Terminé", + "admin.stuck.filterCompleted": "Terminé", "admin.stuck.colId": "ID", "admin.stuck.colCompany": "Entreprise", "admin.stuck.colStatus": "Statut", "admin.stuck.colProgress": "Progression", - "admin.stuck.colUpdated": "Mis à jour", + "admin.stuck.colUpdated": "Mis à jour", "admin.stuck.colError": "Erreur", - "admin.stuck.loadFailed": "Échec du chargement des jobs", - "admin.stuck.cleanupFailed": "Échec du nettoyage", - "admin.support.knowledgeLink": "Connaissances et réponse auto", + "admin.stuck.loadFailed": "Échec du chargement des jobs", + "admin.stuck.cleanupFailed": "Échec du nettoyage", + "admin.support.knowledgeLink": "Connaissances et réponse auto", "admin.support.queueTitle": "File de tickets", - "admin.support.queueMeta": "{total} · portée {scope}", - "admin.support.queueMetaStatus": "· statut {status}", + "admin.support.queueMeta": "{total} · portée {scope}", + "admin.support.queueMetaStatus": "· statut {status}", "admin.support.ticketCountOne": "{count} ticket", "admin.support.ticketCountMany": "{count} tickets", "admin.support.statusAll": "Tout statuses", "admin.support.scopeAll": "Tout tickets", - "admin.support.scopeInbox": "Boîte de réception", + "admin.support.scopeInbox": "Boîte de réception", "admin.support.scopeMine": "Les miens", - "admin.support.scopeUnassigned": "Non assignés", - "admin.support.flagAny": "Tout état auto", - "admin.support.flagNeedsHuman": "Besoin d’un humain", + "admin.support.scopeUnassigned": "Non assignés", + "admin.support.flagAny": "Tout état auto", + "admin.support.flagNeedsHuman": "Besoin d’un humain", "admin.support.flagAiDraft": "Brouillon IA", "admin.support.colSubject": "Objet", "admin.support.colStatus": "Statut", "admin.support.colAuto": "Auto", - "admin.support.colPriority": "Priorité", - "admin.support.colAssignee": "Assigné", + "admin.support.colPriority": "Priorité", + "admin.support.colAssignee": "Assigné", "admin.support.colCompany": "Entreprise", - "admin.support.colUpdated": "Mis à jour", + "admin.support.colUpdated": "Mis à jour", "admin.support.colActions": "Actions", - "admin.support.autoOff": "Auto désactivé", + "admin.support.autoOff": "Auto désactivé", "admin.support.claim": "Prendre", "admin.support.claimAria": "Prendre le ticket {subject}", - "admin.support.unassigned": "Non assigné", + "admin.support.unassigned": "Non assigné", "admin.support.you": "Vous", - "admin.support.assigned": "Assigné", - "admin.support.loadQueueFailed": "Échec du chargement de la file support", - "admin.support.claimFailed": "Échec de la prise en charge", + "admin.support.assigned": "Assigné", + "admin.support.loadQueueFailed": "Échec du chargement de la file support", + "admin.support.claimFailed": "Échec de la prise en charge", "admin.support.ticketFallbackTitle": "Assistance ticket", - "admin.support.ticketMeta": "{company} · {requester}", + "admin.support.ticketMeta": "{company} · {requester}", "admin.support.ticketMetaFallback": "Fil de revue du staff", "admin.support.companyFallback": "Entreprise", "admin.support.requesterFallback": "demandeur", "admin.support.backQueue": "File", - "admin.support.resolve": "Résoudre", + "admin.support.resolve": "Résoudre", "admin.support.markPending": "Marquer en attente", "admin.support.reopen": "Rouvrir", - "admin.support.assigneeLabel": "Assigné :", - "admin.support.unassign": "Désassigner", + "admin.support.assigneeLabel": "Assigné :", + "admin.support.unassign": "Désassigner", "admin.support.assignToStaff": "Assigner au personnel", "admin.support.apply": "Appliquer", "admin.support.autoPanelTitle": "Auto-match / assistance IA", - "admin.support.autoPanelDesc": "Résultat réservé au staff du match FAQ et brouillon/envoi IA. Les clients ne voient jamais les brouillons.", - "admin.support.autoDisabledBadge": "Auto désactivé", + "admin.support.autoPanelDesc": "Résultat réservé au staff du match FAQ et brouillon/envoi IA. Les clients ne voient jamais les brouillons.", + "admin.support.autoDisabledBadge": "Auto désactivé", "admin.support.autoStatusLabel": "Statut :", - "admin.support.lastAttempt": "Dernière tentative :", - "admin.support.reenableAuto": "Réactiver l’auto", - "admin.support.disableAuto": "Désactiver l’auto pour ce ticket", + "admin.support.lastAttempt": "Dernière tentative :", + "admin.support.reenableAuto": "Réactiver l’auto", + "admin.support.disableAuto": "Désactiver l’auto pour ce ticket", "admin.support.aiDraftTitle": "Brouillon IA (approuver ou modifier)", - "admin.support.aiDraftDesc": "Le mode brouillon seul a laissé une note interne. Modifiez si besoin, puis envoyez au client — ou ignorez et reprenez manuellement.", + "admin.support.aiDraftDesc": "Le mode brouillon seul a laissé une note interne. Modifiez si besoin, puis envoyez au client — ou ignorez et reprenez manuellement.", "admin.support.confidence": "Confiance {value}", - "admin.support.statusAfterSend": "Statut après envoi", + "admin.support.statusAfterSend": "Statut après envoi", "admin.support.approveSend": "Approuver et envoyer", "admin.support.discardDraft": "Ignorer le brouillon", "admin.support.threadTitle": "Fil", - "admin.support.threadMeta": "{count} · dernière activité {when}", + "admin.support.threadMeta": "{count} · dernière activité {when}", "admin.support.messageCountOne": "{count} message", "admin.support.messageCountMany": "{count} messages", - "admin.support.replyTitle": "Répondre", - "admin.support.replyDesc": "Les réponses publiques notifient le client. Les notes internes restent réservées au staff. Le statut par défaut après une réponse publique est en attente.", + "admin.support.replyTitle": "Répondre", + "admin.support.replyDesc": "Les réponses publiques notifient le client. Les notes internes restent réservées au staff. Le statut par défaut après une réponse publique est en attente.", "admin.support.internalNote": "Note interne (invisible au client)", - "admin.support.setStatus": "Définir le statut", - "admin.support.statusDefault": "Par défaut", + "admin.support.setStatus": "Définir le statut", + "admin.support.statusDefault": "Par défaut", "admin.support.saveNote": "Enregistrer la note", - "admin.support.sendReply": "Envoyer la réponse", - "admin.support.replyAndResolve": "Répondre et résoudre", - "admin.support.closedBanner": "Ce ticket est fermé. Rouvrez-le pour poursuivre la conversation.", - "admin.support.priorityMeta": "priorité {priority}", + "admin.support.sendReply": "Envoyer la réponse", + "admin.support.replyAndResolve": "Répondre et résoudre", + "admin.support.closedBanner": "Ce ticket est fermé. Rouvrez-le pour poursuivre la conversation.", + "admin.support.priorityMeta": "priorité {priority}", "admin.support.authorAiDraft": "Brouillon IA (staff uniquement)", "admin.support.authorInternal": "Note interne", - "admin.support.authorStaff": "Équipe", + "admin.support.authorStaff": "Équipe", "admin.support.authorCustomer": "Client", - "admin.support.flash.noteSaved": "Note interne enregistrée.", - "admin.support.flash.replySent": "Réponse envoyée.", - "admin.support.flash.resolved": "Ticket marqué comme résolu.", - "admin.support.flash.pending": "Ticket marqué en attente (en attente du client).", + "admin.support.flash.noteSaved": "Note interne enregistrée.", + "admin.support.flash.replySent": "Réponse envoyée.", + "admin.support.flash.resolved": "Ticket marqué comme résolu.", + "admin.support.flash.pending": "Ticket marqué en attente (en attente du client).", "admin.support.flash.reopened": "Ticket rouvert.", - "admin.support.flash.statusSet": "Statut du ticket défini sur {status}.", - "admin.support.flash.autoDisabled": "Réponses automatiques désactivées pour ce ticket.", - "admin.support.flash.autoEnabled": "Réponses automatiques réactivées pour ce ticket.", - "admin.support.loadTicketFailed": "Échec du chargement du ticket", - "admin.support.replyFailed": "Échec de l’envoi de la réponse", - "admin.support.statusFailed": "Échec de la mise à jour du statut", - "admin.support.unassignFailed": "Échec de la désassignation", - "admin.support.assignFailed": "Échec de l’assignation", - "admin.support.autoFailed": "Échec de la mise à jour de la réponse auto", - "admin.support.approveFailed": "Échec de l’approbation du brouillon IA", - "admin.support.discardFailed": "Échec de l’abandon du brouillon IA", - "admin.settings.sourceResolved": "Résolu depuis {sources}", - "admin.settings.sourceUpdated": " · mis à jour {when}", - "admin.settings.updatedAt": "Mis à jour {when}", - "admin.settings.tenantDesc": "Les clés IA et l’e-mail marketing de l’entreprise restent sous Intégrations. Les secrets de session et de chiffrement restent dans l’environnement serveur et ne s’éditent pas ici.", - "admin.settings.perCompanyAiEmail": "IA/e-mail par entreprise —", - "admin.settings.plansCredits": "Forfaits et crédits —", - "admin.settings.fromDatabase": "Depuis la base de données", - "admin.settings.fromEnvironment": "Depuis l’environnement", + "admin.support.flash.statusSet": "Statut du ticket défini sur {status}.", + "admin.support.flash.autoDisabled": "Réponses automatiques désactivées pour ce ticket.", + "admin.support.flash.autoEnabled": "Réponses automatiques réactivées pour ce ticket.", + "admin.support.loadTicketFailed": "Échec du chargement du ticket", + "admin.support.replyFailed": "Échec de l’envoi de la réponse", + "admin.support.statusFailed": "Échec de la mise à jour du statut", + "admin.support.unassignFailed": "Échec de la désassignation", + "admin.support.assignFailed": "Échec de l’assignation", + "admin.support.autoFailed": "Échec de la mise à jour de la réponse auto", + "admin.support.approveFailed": "Échec de l’approbation du brouillon IA", + "admin.support.discardFailed": "Échec de l’abandon du brouillon IA", + "admin.settings.sourceResolved": "Résolu depuis {sources}", + "admin.settings.sourceUpdated": " · mis à jour {when}", + "admin.settings.updatedAt": "Mis à jour {when}", + "admin.settings.tenantDesc": "Les clés IA et l’e-mail marketing de l’entreprise restent sous Intégrations. Les secrets de session et de chiffrement restent dans l’environnement serveur et ne s’éditent pas ici.", + "admin.settings.perCompanyAiEmail": "IA/e-mail par entreprise —", + "admin.settings.plansCredits": "Forfaits et crédits —", + "admin.settings.fromDatabase": "Depuis la base de données", + "admin.settings.fromEnvironment": "Depuis l’environnement", "admin.settings.sourceBadge": "Source : {source}", - "admin.settings.storedKey": "Clé stockée : {masked}", - "admin.settings.enableRole": "Activer ce rôle", - "admin.settings.clearApiKey": "Effacer la clé API stockée", - "admin.settings.apiKeyKeepPlaceholder": "•••• laissez vide pour conserver", - "admin.settings.apiKeyNewPlaceholder": "sk-… ou local", + "admin.settings.storedKey": "Clé stockée : {masked}", + "admin.settings.enableRole": "Activer ce rôle", + "admin.settings.clearApiKey": "Effacer la clé API stockée", + "admin.settings.apiKeyKeepPlaceholder": "•••• laissez vide pour conserver", + "admin.settings.apiKeyNewPlaceholder": "sk-… ou local", "admin.settings.smtpCardTitle": "Plateforme SMTP", - "admin.settings.smtpCardDesc": "Utilisé pour les invitations mot de passe et l’e-mail sortant plateforme. Resend/SMTP marketing reste par entreprise sous Intégrations → E-mail.", - "admin.settings.smtpBadgeOn": "SMTP activé", - "admin.settings.smtpBadgeOff": "SMTP désactivé", + "admin.settings.smtpCardDesc": "Utilisé pour les invitations mot de passe et l’e-mail sortant plateforme. Resend/SMTP marketing reste par entreprise sous Intégrations → E-mail.", + "admin.settings.smtpBadgeOn": "SMTP activé", + "admin.settings.smtpBadgeOff": "SMTP désactivé", "admin.settings.enableSmtp": "Activer SMTP plateforme", - "admin.settings.storedPassword": "Mot de passe stocké : {masked}", - "admin.settings.clearSmtpPassword": "Effacer le mot de passe SMTP stocké", + "admin.settings.storedPassword": "Mot de passe stocké : {masked}", + "admin.settings.clearSmtpPassword": "Effacer le mot de passe SMTP stocké", "admin.settings.sendTestEmail": "Envoyer un e-mail de test", "admin.settings.enableGoogle": "Activer Google OAuth", "admin.settings.clientSecret": "Secret client", "admin.settings.leaveBlankKeep": "(laissez vide pour conserver)", - "admin.settings.storedSecret": "Secret stocké : {masked}", - "admin.settings.clearClientSecret": "Effacer le secret client stocké", - "admin.settings.eprelDesc": "Données publiques gratuites d’étiquettes énergétiques UE pendant le traitement. Activé par défaut pour tous les forfaits — aucune activation ni surclassement payant. Utilisez les contrôles uniquement pour désactiver ou régler le client.", - "admin.settings.optionalKeySaved": "Clé API optionnelle enregistrée", - "admin.settings.noApiKeyNeeded": "Aucune clé API requise", - "admin.settings.optionalApiKey": "Clé API optionnelle", - "admin.settings.optionalApiKeySavedHint": "(enregistré — leave blank to keep)", - "admin.settings.optionalApiKeyPublicHint": "(l’API publique fonctionne sans)", - "admin.settings.clearEprelKey": "Effacer la clé API EPREL stockée", - "admin.settings.pineconeDesc": "Suggestions optionnelles de catégories vectorielles pendant le traitement. Les valeurs d’environnement hôte sont utilisées si ces champs sont vides.", - "admin.settings.apiKeyConfigured": "Clé API configurée", - "admin.settings.noApiKey": "Pas de clé API", - "admin.settings.apiKeyLabel": "Clé API", - "admin.settings.clearPineconeKey": "Effacer la clé API Pinecone stockée", - "admin.settings.stripeDesc": "Remplacements optionnels de la configuration Stripe serveur. Préférez les champs mot de passe ; les valeurs ne sont plus réaffichées après enregistrement.", - "admin.settings.stripeMock": "Forcer le mode mock Stripe (hors production uniquement — désactive les vrais paiements)", + "admin.settings.storedSecret": "Secret stocké : {masked}", + "admin.settings.clearClientSecret": "Effacer le secret client stocké", + "admin.settings.eprelDesc": "Données publiques gratuites d’étiquettes énergétiques UE pendant le traitement. Activé par défaut pour tous les forfaits — aucune activation ni surclassement payant. Utilisez les contrôles uniquement pour désactiver ou régler le client.", + "admin.settings.optionalKeySaved": "Clé API optionnelle enregistrée", + "admin.settings.noApiKeyNeeded": "Aucune clé API requise", + "admin.settings.optionalApiKey": "Clé API optionnelle", + "admin.settings.optionalApiKeySavedHint": "(enregistré — leave blank to keep)", + "admin.settings.optionalApiKeyPublicHint": "(l’API publique fonctionne sans)", + "admin.settings.clearEprelKey": "Effacer la clé API EPREL stockée", + "admin.settings.pineconeDesc": "Suggestions optionnelles de catégories vectorielles pendant le traitement. Les valeurs d’environnement hôte sont utilisées si ces champs sont vides.", + "admin.settings.apiKeyConfigured": "Clé API configurée", + "admin.settings.noApiKey": "Pas de clé API", + "admin.settings.apiKeyLabel": "Clé API", + "admin.settings.clearPineconeKey": "Effacer la clé API Pinecone stockée", + "admin.settings.stripeDesc": "Remplacements optionnels de la configuration Stripe serveur. Préférez les champs mot de passe ; les valeurs ne sont plus réaffichées après enregistrement.", + "admin.settings.stripeMock": "Forcer le mode mock Stripe (hors production uniquement — désactive les vrais paiements)", "admin.settings.webhookSecret": "Secret webhook", - "admin.settings.clearStripeSecret": "Effacer la clé secrète Stripe", + "admin.settings.clearStripeSecret": "Effacer la clé secrète Stripe", "admin.settings.clearStripeWebhook": "Effacer le secret webhook Stripe", - "admin.settings.feedAllowlistDesc": "Hôtes/CIDR séparés par des virgules autorisés pour les URL de flux privés.", - "admin.settings.adminsDesc": "Administrateurs plateforme actuellement sur ce déploiement", - "admin.settings.onboardingTitle": "Aides d’onboarding admin", - "admin.settings.onboardingDesc": "Utilisez les e-mails d’invitation set-password pour intégrer les utilisateurs éligibles qui ont encore besoin d’un mot de passe.", + "admin.settings.feedAllowlistDesc": "Hôtes/CIDR séparés par des virgules autorisés pour les URL de flux privés.", + "admin.settings.adminsDesc": "Administrateurs plateforme actuellement sur ce déploiement", + "admin.settings.onboardingTitle": "Aides d’onboarding admin", + "admin.settings.onboardingDesc": "Utilisez les e-mails d’invitation set-password pour intégrer les utilisateurs éligibles qui ont encore besoin d’un mot de passe.", "admin.settings.sendInvites": "Envoyer les e-mails set-password", - "admin.settings.adminStatusBefore": "Les admins plateforme ne peuvent pas être créés depuis cet écran. Confirmez votre accès sur la", - "admin.settings.adminStatusAfter": ", ou demandez à un admin/ops existant de promouvoir votre compte.", - "admin.settings.loadUsersFailed": "Échec du chargement des utilisateurs admin", - "admin.settings.sendFailed": "Échec de l’envoi", - "admin.settings.saveMailFailed": "Impossible d’enregistrer les réglages mail", - "admin.settings.smtpNotConfigured": "SMTP n’est pas configuré — activez et enregistrez d’abord les réglages mail.", - "admin.settings.smtpTestFailed": "Échec du test SMTP", - "admin.settings.testEmailFailed": "Impossible d’envoyer l’e-mail de test", - "admin.settings.saveIntegrationFailed": "Impossible d’enregistrer les réglages d’intégration", - "admin.settings.aiSaved": "Paramètres IA {label} enregistrés. Les clés API ne sont plus jamais affichées.", - "admin.settings.aiSaveFailed": "Impossible d’enregistrer les réglages IA {label}", + "admin.settings.adminStatusBefore": "Les admins plateforme ne peuvent pas être créés depuis cet écran. Confirmez votre accès sur la", + "admin.settings.adminStatusAfter": ", ou demandez à un admin/ops existant de promouvoir votre compte.", + "admin.settings.loadUsersFailed": "Échec du chargement des utilisateurs admin", + "admin.settings.sendFailed": "Échec de l’envoi", + "admin.settings.saveMailFailed": "Impossible d’enregistrer les réglages mail", + "admin.settings.smtpNotConfigured": "SMTP n’est pas configuré — activez et enregistrez d’abord les réglages mail.", + "admin.settings.smtpTestFailed": "Échec du test SMTP", + "admin.settings.testEmailFailed": "Impossible d’envoyer l’e-mail de test", + "admin.settings.saveIntegrationFailed": "Impossible d’enregistrer les réglages d’intégration", + "admin.settings.aiSaved": "Paramètres IA {label} enregistrés. Les clés API ne sont plus jamais affichées.", + "admin.settings.aiSaveFailed": "Impossible d’enregistrer les réglages IA {label}", "admin.settings.aiTestOk": "{label} : connexion OK", - "admin.settings.aiTestSkipped": "{label} : ignoré — enregistrez les identifiants (et activez le rôle) pour tester.", - "admin.settings.aiTestFailed": "{label} : échec de connexion", + "admin.settings.aiTestSkipped": "{label} : ignoré — enregistrez les identifiants (et activez le rôle) pour tester.", + "admin.settings.aiTestFailed": "{label} : échec de connexion", "admin.settings.aiTestError": "Impossible de tester la connexion {label}", "admin.settings.aiRole.processing.label": "Traitement", - "admin.settings.aiRole.processing.desc": "Chat/completions du pipeline produits (titres, descriptions, amélioration).", + "admin.settings.aiRole.processing.desc": "Chat/completions du pipeline produits (titres, descriptions, amélioration).", "admin.settings.aiRole.vectorization.label": "Vectorisation", - "admin.settings.aiRole.vectorization.desc": "Embeddings pour recherche / indexation Pinecone (aligner les dimensions d’index).", + "admin.settings.aiRole.vectorization.desc": "Embeddings pour recherche / indexation Pinecone (aligner les dimensions d’index).", "admin.settings.aiRole.docs_api.label": "Docs / API", - "admin.settings.aiRole.docs_api.desc": "Emplacement futur d’assistant docs/API — /docs Ask reste à règles et ne doit jamais appeler ce rôle.", + "admin.settings.aiRole.docs_api.desc": "Emplacement futur d’assistant docs/API — /docs Ask reste à règles et ne doit jamais appeler ce rôle.", "admin.settings.aiRole.support.label": "Assistance", - "admin.settings.aiRole.support.desc": "IA de secours pour auto-réponse tickets — configurez fournisseur/clé/modèle ici ; activez l’envoi dans Connaissances support → Auto-réponse.", + "admin.settings.aiRole.support.desc": "IA de secours pour auto-réponse tickets — configurez fournisseur/clé/modèle ici ; activez l’envoi dans Connaissances support → Auto-réponse.", "admin.settings.providerOption.openai": "OpenAI", "admin.settings.providerOption.openrouter": "OpenRouter", "admin.settings.providerOption.azure": "Azure OpenAI", "admin.settings.providerOption.ollama": "Ollama", - "admin.settings.providerOption.custom": "Personnalisé / autre", + "admin.settings.providerOption.custom": "Personnalisé / autre", "admin.support.title": "Centre d'assistance", - "admin.support.description": "Boîte de réception du personnel — prenez depuis la file, filtrez par portée, ouvrez les fils et résolvez", + "admin.support.description": "Boîte de réception du personnel — prenez depuis la file, filtrez par portée, ouvrez les fils et résolvez", "admin.support.unavailable": "La file de support n'est pas disponible. Contactez votre administrateur de plateforme si cela persiste.", "admin.support.noTickets": "Aucun ticket dans cette file.", "admin.support.ticketNotFound": "Ticket introuvable.", - "admin.support.notAvailable": "Le support n'est pas disponible sur ce déploiement.", + "admin.support.notAvailable": "Le support n'est pas disponible sur ce déploiement.", "admin.support.loadFailed": "Impossible de charger ce ticket.", "admin.support.noMessages": "Pas encore de messages.", - "admin.support.queueScopeAria": "Portée de la file", - "admin.support.statusFilterAria": "Filtre d'état", + "admin.support.queueScopeAria": "Portée de la file", + "admin.support.statusFilterAria": "Filtre d'état", "admin.support.autoAssistFilterAria": "Filtre d'auto-assistance", "admin.support.searchPlaceholder": "Rechercher objet, e-mail ou entreprise", "admin.support.searchAria": "Rechercher des tickets", "admin.support.assignStaffAria": "Assigner au personnel", "admin.support.aiDraftAria": "Brouillon IA", - "admin.support.replyPlaceholder": "Écrire une réponse…", - "admin.support.replyAria": "Corps de la réponse", + "admin.support.replyPlaceholder": "Écrire une réponse…", + "admin.support.replyAria": "Corps de la réponse", "admin.knowledge.eyebrow": "Admin plateforme", "admin.knowledge.title": "Base de connaissances", - "admin.knowledge.description": "Structurez les articles d'aide pour la correspondance FAQ auto. Les agents de contenu remplissent les corps — gardez les faits exacts.", - "admin.knowledge.notReady": "La base de connaissance support n'est pas prête", - "admin.knowledge.noTemplates": "Aucun modèle de réponse", - "admin.knowledge.articleDesc": "Le corps Markdown prend en charge les images via téléversement sécurisé. N'inventez pas de faits produit — laissez des espaces réservés aux agents de contenu.", - "admin.knowledge.templateDesc": "Espaces réservés autorisés : subject, category.", - "admin.knowledge.searchPlaceholder": "Rechercher titre, slug, mots-clés…", + "admin.knowledge.description": "Structurez les articles d'aide pour la correspondance FAQ auto. Les agents de contenu remplissent les corps — gardez les faits exacts.", + "admin.knowledge.notReady": "La base de connaissance support n'est pas prête", + "admin.knowledge.noTemplates": "Aucun modèle de réponse", + "admin.knowledge.articleDesc": "Le corps Markdown prend en charge les images via téléversement sécurisé. N'inventez pas de faits produit — laissez des espaces réservés aux agents de contenu.", + "admin.knowledge.templateDesc": "Espaces réservés autorisés : subject, category.", + "admin.knowledge.searchPlaceholder": "Rechercher titre, slug, mots-clés…", "admin.knowledge.searchAria": "Rechercher des articles", - "admin.knowledge.publishFilterAria": "Filtre d'état de publication", + "admin.knowledge.publishFilterAria": "Filtre d'état de publication", "admin.knowledge.deleteArticleAria": "Supprimer l'article", - "admin.knowledge.deleteTemplateAria": "Supprimer le modèle", + "admin.knowledge.deleteTemplateAria": "Supprimer le modèle", "admin.support.autoReplyStatus.matched": "FAQ correspondante", "admin.support.autoReplyStatus.aiDraft": "Brouillon IA en attente", - "admin.support.autoReplyStatus.aiSent": "Réponse IA envoyée", - "admin.support.autoReplyStatus.skipped": "Auto ignoré", - "admin.support.autoReplyStatus.failed": "Auto échoué", + "admin.support.autoReplyStatus.aiSent": "Réponse IA envoyée", + "admin.support.autoReplyStatus.skipped": "Auto ignoré", + "admin.support.autoReplyStatus.failed": "Auto échoué", "admin.support.autoReplyStatus.handedOff": "Intervention humaine", "admin.support.autoReplyStatus.none": "Aucune tentative auto", "admin.support.autoSource.kb": "Base de connaissances", - "admin.support.autoSource.template": "Modèle", - "admin.support.autoSource.ai": "Assisté par l'IA", - "admin.support.autoSource.automated": "Automatisé", - "admin.knowledge.categoriesHeading": "Catégories", - "admin.knowledge.categoriesHint": "Seaux vides préparés pour les agents de contenu.", - "admin.knowledge.showingArticles": "Affichage de {shown} articles (corps chargé à l’édition).", - "admin.knowledge.showingArticlesOf": "Affichage de {shown} sur {total} articles (corps chargé à l’édition).", - "admin.knowledge.templatesHint": "Réponses types avec espaces réservés optionnels {{subject}} / {{category}}.", + "admin.support.autoSource.template": "Modèle", + "admin.support.autoSource.ai": "Assisté par l'IA", + "admin.support.autoSource.automated": "Automatisé", + "admin.knowledge.categoriesHeading": "Catégories", + "admin.knowledge.categoriesHint": "Seaux vides préparés pour les agents de contenu.", + "admin.knowledge.showingArticles": "Affichage de {shown} articles (corps chargé à l’édition).", + "admin.knowledge.showingArticlesOf": "Affichage de {shown} sur {total} articles (corps chargé à l’édition).", + "admin.knowledge.templatesHint": "Réponses types avec espaces réservés optionnels {{subject}} / {{category}}.", "admin.knowledge.faqAutoMatchTitle": "Correspondance FAQ auto", - "admin.knowledge.faqAutoMatchDesc": "Correspondance de mots-clés à la création du ticket. Seuil par défaut 0,78 (plage 0,50–0,95).", + "admin.knowledge.faqAutoMatchDesc": "Correspondance de mots-clés à la création du ticket. Seuil par défaut 0,78 (plage 0,50–0,95).", "admin.knowledge.aiFallbackTitle": "Secours IA", - "admin.knowledge.aiFallbackDesc": "Utilisé lorsque la correspondance FAQ est sous le seuil. Les réponses utilisent le rôle IA plateforme {role}.", - "admin.knowledge.noModel": "aucun modèle", - "admin.knowledge.keyLast4": "clé …{last4}", + "admin.knowledge.aiFallbackDesc": "Utilisé lorsque la correspondance FAQ est sous le seuil. Les réponses utilisent le rôle IA plateforme {role}.", + "admin.knowledge.noModel": "aucun modèle", + "admin.knowledge.keyLast4": "clé …{last4}", "admin.knowledge.sourceLabel": "source {source}", - "admin.knowledge.apiKeyNote": "La clé API vient toujours de ce rôle ; les overrides ci-dessus ne changent que fournisseur / modèle / URL de base.", - "admin.knowledge.saveAutoSettings": "Enregistrer les paramètres d’auto-réponse", - "admin.knowledge.insertImage": "Insérer une image", - "admin.knowledge.uploading": "Téléversement…", - "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, max 2 Mio. Stocké sous UPLOAD_DIR/support-kb (URL publique HMAC).", - "admin.knowledge.unavailableMsg": "La base de connaissances support n’est pas disponible sur ce déploiement. Contactez votre administrateur de plateforme.", - "admin.knowledge.loadFailed": "Échec du chargement des connaissances support", - "admin.knowledge.loadArticleFailed": "Échec du chargement de l’article", - "admin.knowledge.loadTemplateFailed": "Échec du chargement du modèle", - "admin.knowledge.saveArticleFailed": "Échec de l’enregistrement de l’article", - "admin.knowledge.saveTemplateFailed": "Échec de l’enregistrement du modèle", - "admin.knowledge.deleteArticleFailed": "Échec de la suppression de l’article", - "admin.knowledge.deleteTemplateFailed": "Échec de la suppression du modèle", - "admin.knowledge.saveAutoFailed": "Échec de l’enregistrement des paramètres d’auto-réponse", - "admin.knowledge.uploadImageFailed": "Échec du téléversement de l’image", + "admin.knowledge.apiKeyNote": "La clé API vient toujours de ce rôle ; les overrides ci-dessus ne changent que fournisseur / modèle / URL de base.", + "admin.knowledge.saveAutoSettings": "Enregistrer les paramètres d’auto-réponse", + "admin.knowledge.insertImage": "Insérer une image", + "admin.knowledge.uploading": "Téléversement…", + "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, max 2 Mio. Stocké sous UPLOAD_DIR/support-kb (URL publique HMAC).", + "admin.knowledge.unavailableMsg": "La base de connaissances support n’est pas disponible sur ce déploiement. Contactez votre administrateur de plateforme.", + "admin.knowledge.loadFailed": "Échec du chargement des connaissances support", + "admin.knowledge.loadArticleFailed": "Échec du chargement de l’article", + "admin.knowledge.loadTemplateFailed": "Échec du chargement du modèle", + "admin.knowledge.saveArticleFailed": "Échec de l’enregistrement de l’article", + "admin.knowledge.saveTemplateFailed": "Échec de l’enregistrement du modèle", + "admin.knowledge.deleteArticleFailed": "Échec de la suppression de l’article", + "admin.knowledge.deleteTemplateFailed": "Échec de la suppression du modèle", + "admin.knowledge.saveAutoFailed": "Échec de l’enregistrement des paramètres d’auto-réponse", + "admin.knowledge.uploadImageFailed": "Échec du téléversement de l’image", "admin.translations.eyebrow": "Plateforme", "admin.translations.title": "Traductions", - "admin.translations.description": "Examinez la couverture UI du tableau de bord et modifiez les packs de locale basés sur fichiers.", + "admin.translations.description": "Examinez la couverture UI du tableau de bord et modifiez les packs de locale basés sur fichiers.", "admin.translations.unavailable": "Traductions indisponibles", - "admin.translations.sourceOfTruth": "Source de vérité", - "admin.translations.sourceOfTruthLabel": "Source de vérité :", + "admin.translations.sourceOfTruth": "Source de vérité", + "admin.translations.sourceOfTruthLabel": "Source de vérité :", "admin.translations.colLocale": "Locale", "admin.translations.colTranslated": "Traduit", "admin.translations.colMissing": "Manquants", "admin.translations.colStatus": "Statut", "admin.translations.badgeBase": "Base", "admin.translations.badgeComplete": "Complet", - "admin.translations.badgeUnregistered": "Non enregistré", + "admin.translations.badgeUnregistered": "Non enregistré", "admin.translations.badgeGaps": "Lacunes", "admin.translations.language": "Langue", "admin.translations.show": "Afficher", "admin.translations.filterMissing": "Manquants uniquement", "admin.translations.filterTranslated": "Traduits uniquement", - "admin.translations.filterAll": "Toutes les clés", + "admin.translations.filterAll": "Toutes les clés", "admin.translations.search": "Rechercher", - "admin.translations.searchPlaceholder": "Clé ou texte…", - "admin.translations.noKeysMatch": "Aucune clé ne correspond", + "admin.translations.searchPlaceholder": "Clé ou texte…", + "admin.translations.noKeysMatch": "Aucune clé ne correspond", "admin.translations.badgeMissing": "Manquants", - "admin.translations.badgeUnsaved": "Non enregistré", + "admin.translations.badgeUnsaved": "Non enregistré", "admin.translations.english": "Anglais", - "admin.bootstrap.title": "Accès admin bootstrap", - "admin.bootstrap.description": "Confirmez si votre compte a déjà l'accès admin plateforme. Les nouveaux admins doivent être accordés par un administrateur existant.", + "admin.bootstrap.title": "Accès admin bootstrap", + "admin.bootstrap.description": "Confirmez si votre compte a déjà l'accès admin plateforme. Les nouveaux admins doivent être accordés par un administrateur existant.", "admin.bootstrap.statusTitle": "Statut admin plateforme", - "admin.bootstrap.statusDesc": "L'accès admin plateforme est accordé par un administrateur existant. Il n'y a pas de bootstrap en libre-service pour ce rôle.", - "admin.bootstrap.alreadyAdmin": "Vous avez déjà l'accès admin plateforme.", - "admin.bootstrap.signedInAs": "Connecté en tant que {email}. Ouvrez le panneau admin pour continuer.", - "admin.bootstrap.signedInAsShort": "Connecté en tant que {email}", - "admin.bootstrap.notAdminTitle": "Vous n'êtes pas admin plateforme", - "admin.bootstrap.notAdminMsg": "Votre compte est connecté mais n'est pas marqué admin plateforme. Demandez à un admin existant d'accorder l'accès, puis déconnectez-vous et reconnectez-vous.", + "admin.bootstrap.statusDesc": "L'accès admin plateforme est accordé par un administrateur existant. Il n'y a pas de bootstrap en libre-service pour ce rôle.", + "admin.bootstrap.alreadyAdmin": "Vous avez déjà l'accès admin plateforme.", + "admin.bootstrap.signedInAs": "Connecté en tant que {email}. Ouvrez le panneau admin pour continuer.", + "admin.bootstrap.signedInAsShort": "Connecté en tant que {email}", + "admin.bootstrap.notAdminTitle": "Vous n'êtes pas admin plateforme", + "admin.bootstrap.notAdminMsg": "Votre compte est connecté mais n'est pas marqué admin plateforme. Demandez à un admin existant d'accorder l'accès, puis déconnectez-vous et reconnectez-vous.", "admin.bootstrap.goToPanel": "Aller au panneau admin", - "admin.bootstrap.loadFailed": "Échec du chargement du profil", + "admin.bootstrap.loadFailed": "Échec du chargement du profil", "admin.migrate.title": "Migration d'organisation", - "admin.migrate.description": "Cet outil de migration est retiré et ne modifie aucune donnée.", + "admin.migrate.description": "Cet outil de migration est retiré et ne modifie aucune donnée.", "admin.migrate.notAvailable": "Indisponible", - "admin.migrate.body": "La migration d'organisation depuis l'ancien fournisseur d'identité n'est plus nécessaire. Les entreprises et l'auth locale sont gérées dans Utilisateurs et organisations.", - "admin.migrate.hint": "Si vous avez ouvert ceci depuis un ancien signet, continuez avec Utilisateurs et organisations, Facturation plateforme ou Produits bloqués.", + "admin.migrate.body": "La migration d'organisation depuis l'ancien fournisseur d'identité n'est plus nécessaire. Les entreprises et l'auth locale sont gérées dans Utilisateurs et organisations.", + "admin.migrate.hint": "Si vous avez ouvert ceci depuis un ancien signet, continuez avec Utilisateurs et organisations, Facturation plateforme ou Produits bloqués.", "admin.migrate.adminHome": "Accueil admin", "admin.migrate.users": "Utilisateurs", - "admin.redirect.diagnostics": "Redirection vers Diagnostics…", - "admin.redirect.stuck": "Redirection vers Produits bloqués…", + "admin.redirect.diagnostics": "Redirection vers Diagnostics…", + "admin.redirect.stuck": "Redirection vers Produits bloqués…", "common.refresh": "Actualiser", "common.delete": "Supprimer", "common.clearSearch": "Effacer la recherche", - "common.loading": "Chargement…", + "common.loading": "Chargement…", "common.never": "Jamais", "common.back": "Retour", "common.startOver": "Recommencer", - "common.create": "Créer", + "common.create": "Créer", "common.required": "Obligatoire", "common.actions": "Actions", "common.status": "Statut", @@ -1581,95 +1581,95 @@ export const fr: MessageDict = { "common.products": "Produits", "common.more": "+{count} de plus", "feeds.title": "Vos feeds", - "feeds.loadingDesc": "Chargement de vos feeds fournisseur…", - "feeds.desc": "{page} sur cette page · {total} feeds au total — URL CSV/XML fournisseur et téléversements. Connectez depuis Boutiques pour des options guidées.", + "feeds.loadingDesc": "Chargement de vos feeds fournisseur…", + "feeds.desc": "{page} sur cette page · {total} feeds au total — URL CSV/XML fournisseur et téléversements. Connectez depuis Boutiques pour des options guidées.", "feeds.storesHub": "Hub des boutiques", "feeds.addFeed": "Ajouter un feed", "feeds.searchPlaceholder": "Rechercher des feeds...", "feeds.emptyTitle": "Pas encore de feeds produits", - "feeds.emptyMessage": "Connectez une URL CSV/XML fournisseur ou téléversez un fichier pour synchroniser des produits dans votre catalogue.", + "feeds.emptyMessage": "Connectez une URL CSV/XML fournisseur ou téléversez un fichier pour synchroniser des produits dans votre catalogue.", "feeds.connectFeed": "Connecter un feed", - "feeds.uploadCsvCta": "Téléverser un CSV", + "feeds.uploadCsvCta": "Téléverser un CSV", "feeds.noMatchTitle": "Aucun feed correspondant", "feeds.noMatchMessage": "Essayez un autre terme de recherche, ou effacez la recherche pour voir tous les feeds.", "feeds.col.source": "Source", "feeds.col.mapping": "Correspondance", - "feeds.col.lastData": "Dernière sync", + "feeds.col.lastData": "Dernière sync", "feeds.copyUrl": "Copier l'URL", "feeds.fieldsMapped": "{count} champs", - "feeds.fieldsMappedTitle": "{count} champ mappé", - "feeds.fieldsMappedTitlePlural": "{count} champs mappés", - "feeds.mappingsSaved": "Correspondances de champs enregistrées", - "feeds.mapped": "Mappé", - "feeds.notMapped": "Non mappé", - "feeds.notMappedTitle": "Pas encore de correspondances de champs — ouvrez Mapper pour configurer", + "feeds.fieldsMappedTitle": "{count} champ mappé", + "feeds.fieldsMappedTitlePlural": "{count} champs mappés", + "feeds.mappingsSaved": "Correspondances de champs enregistrées", + "feeds.mapped": "Mappé", + "feeds.notMapped": "Non mappé", + "feeds.notMappedTitle": "Pas encore de correspondances de champs — ouvrez Mapper pour configurer", "feeds.productsFromFeed": "{count} produits de ce feed", - "feeds.noProductsYet": "Aucun produit importé depuis ce feed pour l'instant", - "feeds.syncing": "Synchronisation…", + "feeds.noProductsYet": "Aucun produit importé depuis ce feed pour l'instant", + "feeds.syncing": "Synchronisation…", "feeds.syncingShort": "Synchronisation", "feeds.syncingHint": "Peut prendre quelques minutes pour les grands feeds", "feeds.liveSync": "Sync du flux", - "feeds.productData": "Données catalogue", + "feeds.productData": "Données catalogue", "feeds.mapFields": "Mapper les champs", "feeds.map": "Mapper", "feeds.sync": "Synchroniser", "feeds.syncNow": "Synchroniser maintenant", - "feeds.syncManualTitle": "Lancer une synchronisation ponctuelle maintenant. La sync auto utilise l'intervalle défini à l'édition du feed.", + "feeds.syncManualTitle": "Lancer une synchronisation ponctuelle maintenant. La sync auto utilise l'intervalle défini à l'édition du feed.", "feeds.syncInProgress": "Sync en cours", "feeds.addTitle": "Ajouter un feed", - "feeds.addDesc": "Connectez une URL de feed produits ou téléversez un CSV. Utilisez les exemples ci-dessous pour correspondre à la structure attendue.", + "feeds.addDesc": "Connectez une URL de feed produits ou téléversez un CSV. Utilisez les exemples ci-dessous pour correspondre à la structure attendue.", "feeds.field.name": "Nom", "feeds.field.namePlaceholder": "Mon feed produits", "feeds.tab.url": "URL du feed", "feeds.tab.file": "Fichier CSV", "feeds.field.url": "URL du feed", - "feeds.field.urlPlaceholder": "https://…", + "feeds.field.urlPlaceholder": "https://…", "feeds.field.type": "Type", "feeds.field.file": "Fichier CSV", - "feeds.fileHint": "Max 5 MiB. Après création, mappez les colonnes puis synchronisez — même flux que les feeds URL.", + "feeds.fileHint": "Max 5 MiB. Après création, mappez les colonnes puis synchronisez — même flux que les feeds URL.", "feeds.field.interval": "Intervalle de sync auto (minutes)", - "feeds.field.intervalHint": "Fréquence à laquelle Descrybe doit tirer ce feed automatiquement tant qu'il est actif. Sync dans la liste lance un tirage ponctuel — cela ne modifie pas ce planning.", - "feeds.createFeed": "Créer un feed", + "feeds.field.intervalHint": "Fréquence à laquelle Descrybe doit tirer ce feed automatiquement tant qu'il est actif. Sync dans la liste lance un tirage ponctuel — cela ne modifie pas ce planning.", + "feeds.createFeed": "Créer un feed", "feeds.editTitle": "Modifier le feed", - "feeds.editDesc": "Mettre à jour le nom, le type, le planning de sync auto ou l'URL source. Sync dans la liste des feeds lance un tirage ponctuel.", + "feeds.editDesc": "Mettre à jour le nom, le type, le planning de sync auto ou l'URL source. Sync dans la liste des feeds lance un tirage ponctuel.", "feeds.csvSource": "Source CSV", - "feeds.uploadedCsv": "CSV téléversé", - "feeds.replaceFileHint": "Pour remplacer le fichier, créez un nouveau feed. La sync relit le téléversement stocké.", - "feeds.csvTypeLocked": "Les feeds CSV téléversés restent de type CSV.", + "feeds.uploadedCsv": "CSV téléversé", + "feeds.replaceFileHint": "Pour remplacer le fichier, créez un nouveau feed. La sync relit le téléversement stocké.", + "feeds.csvTypeLocked": "Les feeds CSV téléversés restent de type CSV.", "feeds.saveChanges": "Enregistrer les modifications", "feeds.historyTitle": "Historique de sync", - "feeds.historyDesc": "Tâches de sync récentes pour « {name} ».", - "feeds.historyLastSynced": "Dernière sync réussie {relative} ({absolute}).", - "feeds.historyNeverSynced": "Pas encore de sync réussie.", - "feeds.historyLoading": "Chargement de l'historique de sync…", - "feeds.historyEmpty": "Pas encore de tâches de sync.", - "feeds.history.started": "Démarré", - "feeds.history.completed": "Terminé", - "feeds.loadFailed": "Échec du chargement des feeds", + "feeds.historyDesc": "Tâches de sync récentes pour « {name} ».", + "feeds.historyLastSynced": "Dernière sync réussie {relative} ({absolute}).", + "feeds.historyNeverSynced": "Pas encore de sync réussie.", + "feeds.historyLoading": "Chargement de l'historique de sync…", + "feeds.historyEmpty": "Pas encore de tâches de sync.", + "feeds.history.started": "Démarré", + "feeds.history.completed": "Terminé", + "feeds.loadFailed": "Échec du chargement des feeds", "feeds.copyFailed": "Impossible de copier l'URL", - "feeds.created": "Feed créé", - "feeds.updated": "Feed mis à jour.", + "feeds.created": "Feed créé", + "feeds.updated": "Feed mis à jour.", "feeds.mapBeforeSync": "Mappez les champs avant de synchroniser ce feed.", "feeds.activateBeforeSync": "Activez le feed avant de synchroniser.", - "feeds.syncFinished": "Synchronisation terminée", + "feeds.syncFinished": "Synchronisation terminée", "feeds.viewProducts": "Voir les produits", "feeds.processing": "Traitement", - "feeds.syncFailed": "Échec de la synchronisation", - "feeds.statusUpdateFailed": "Impossible de mettre à jour le statut", - "feeds.deleteConfirm": "Supprimer le feed « {name} » ? Action irréversible.", - "feeds.deleted": "Feed supprimé.", + "feeds.syncFailed": "Échec de la synchronisation", + "feeds.statusUpdateFailed": "Impossible de mettre à jour le statut", + "feeds.deleteConfirm": "Supprimer le feed « {name} » ? Action irréversible.", + "feeds.deleted": "Feed supprimé.", "feeds.deleteFailed": "Impossible de supprimer le feed", "feeds.historyLoadFailed": "Impossible de charger l'historique de sync", - "feeds.ftpUnsupported": "La sync FTP/FTPS n'est pas prise en charge. Demandez une URL HTTPS publique à votre fournisseur, téléversez un feed CSV ici, ou importez un fichier depuis Uploads.", + "feeds.ftpUnsupported": "La sync FTP/FTPS n'est pas prise en charge. Demandez une URL HTTPS publique à votre fournisseur, téléversez un feed CSV ici, ou importez un fichier depuis Uploads.", "feeds.ftpUnsupportedShort": "Sync FTP non prise en charge", "feeds.ftpBadge": "FTP", - "feeds.ftpMigrateBanner": "Certains feeds utilisent encore FTP/FTPS. Descrybe ne peut pas les récupérer. Passez à une URL HTTPS publique, ajoutez un feed CSV, ou téléversez depuis Uploads.", + "feeds.ftpMigrateBanner": "Certains feeds utilisent encore FTP/FTPS. Descrybe ne peut pas les récupérer. Passez à une URL HTTPS publique, ajoutez un feed CSV, ou téléversez depuis Uploads.", "feeds.ftpUploadCta": "Aller aux Uploads", "feeds.ftpHttpsCta": "Ajouter un feed HTTPS", - "feeds.ftpCsvCta": "Téléverser un feed CSV", - "feeds.status.mappingIncomplete": "Correspondance incomplète", - "feeds.status.readyForMapping": "Prêt pour le mapping", - "feeds.status.mapped": "Mappé", + "feeds.ftpCsvCta": "Téléverser un feed CSV", + "feeds.status.mappingIncomplete": "Correspondance incomplète", + "feeds.status.readyForMapping": "Prêt pour le mapping", + "feeds.status.mapped": "Mappé", "feeds.status.active": "Actif", "feeds.status.inactive": "Inactif", "feeds.status.error": "Erreur", @@ -1679,314 +1679,314 @@ export const fr: MessageDict = { "feeds.actions.editFeed": "Modifier le feed", "feeds.actions.editMapping": "Modifier le mapping", "feeds.actions.syncNow": "Synchroniser maintenant", - "feeds.actions.syncInProgress": "Sync en cours…", + "feeds.actions.syncInProgress": "Sync en cours…", "feeds.actions.activateToSync": "Activer le feed pour synchroniser", "feeds.actions.viewHistory": "Voir l'historique de sync", - "feeds.actions.deactivate": "Désactiver le feed", + "feeds.actions.deactivate": "Désactiver le feed", "feeds.actions.activate": "Activer le feed", "feeds.actions.delete": "Supprimer le feed", "feeds.stats.totalFeeds": "Total des feeds", - "feeds.stats.activeMapped": "{active} actifs · {mapped} mappés", + "feeds.stats.activeMapped": "{active} actifs · {mapped} mappés", "feeds.stats.activeOnly": "{active} actifs", - "feeds.stats.totalProducts": "Produits importés", + "feeds.stats.totalProducts": "Produits importés", "feeds.stats.acrossFeeds": "Lignes brutes (pas catalogue + file)", "feeds.stats.processed": "Dans le catalogue", - "feeds.stats.readyCatalog": "Lignes catalogue — pas une part des importés", + "feeds.stats.readyCatalog": "Lignes catalogue — pas une part des importés", "feeds.stats.unprocessed": "En attente de traitement", - "feeds.stats.waiting": "File brute — pas une part des importés", + "feeds.stats.waiting": "File brute — pas une part des importés", "feeds.format.howTo": "Comment structurer votre feed", "feeds.format.required": "Obligatoire :", - "feeds.preview.title": "Aperçu de la source du feed", - "feeds.preview.truncated": "Tronqué", - "feeds.preview.refresh": "Actualiser l'aperçu", - "feeds.preview.copy": "Copier l'aperçu", - "feeds.preview.loading": "Chargement de l'aperçu…", - "feeds.preview.empty": "Extrayez le schéma pour prévisualiser la source du feed.", - "feeds.schema.search": "Rechercher des champs…", + "feeds.preview.title": "Aperçu de la source du feed", + "feeds.preview.truncated": "Tronqué", + "feeds.preview.refresh": "Actualiser l'aperçu", + "feeds.preview.copy": "Copier l'aperçu", + "feeds.preview.loading": "Chargement de l'aperçu…", + "feeds.preview.empty": "Extrayez le schéma pour prévisualiser la source du feed.", + "feeds.schema.search": "Rechercher des champs…", "feeds.schema.fieldName": "Nom du champ", "feeds.schema.sourcePath": "Chemin source", "feeds.schema.confirm": "Confirmer", "feeds.schema.apply": "Appliquer", - "feeds.preflight.missingItemPath": "Sélectionnez un chemin d'élément produit avant de synchroniser.", + "feeds.preflight.missingItemPath": "Sélectionnez un chemin d'élément produit avant de synchroniser.", "feeds.preflight.emptyMappings": "Mappez au moins un champ source avant de synchroniser.", "feeds.preflight.missingRequired": "Mappez les champs obligatoires avant de synchroniser : {fields}.", - "feeds.preflight.unknownSource": "Certaines sources mappées sont introuvables dans le schéma extrait : {fields}{more}. Ré-extrayez ou corrigez les chemins avant de vous fier aux valeurs d'exemple.", - "feeds.preflight.emptySample": "Les champs obligatoires ont des valeurs d'exemple vides : {fields}. Vérifiez les colonnes source avant une sync complète.", + "feeds.preflight.unknownSource": "Certaines sources mappées sont introuvables dans le schéma extrait : {fields}{more}. Ré-extrayez ou corrigez les chemins avant de vous fier aux valeurs d'exemple.", + "feeds.preflight.emptySample": "Les champs obligatoires ont des valeurs d'exemple vides : {fields}. Vérifiez les colonnes source avant une sync complète.", "feeds.preflight.fix": "Corrigez les correspondances de champs avant de synchroniser.", "mapping.title": "Mapping du feed", "mapping.titleNamed": "Mapper : {name}", - "mapping.description": "Sélectionnez l’élément produit répétitif, extrayez les champs source, puis mappez-les vers les champs produit Descrybe.", + "mapping.description": "Sélectionnez l’élément produit répétitif, extrayez les champs source, puis mappez-les vers les champs produit Descrybe.", "mapping.autoMap": "Auto-mapper", "mapping.fuzzy": "{count} approximatifs", - "mapping.extractSchema": "Extraire le schéma", + "mapping.extractSchema": "Extraire le schéma", "mapping.backToFeeds": "Retour aux Feeds", - "mapping.ftpStillEdit": "{message} Vous pouvez toujours modifier les mappings. Pour actualiser les produits, passez en HTTPS ou téléversez un fichier.", + "mapping.ftpStillEdit": "{message} Vous pouvez toujours modifier les mappings. Pour actualiser les produits, passez en HTTPS ou téléversez un fichier.", "mapping.ftpUploadCta": "Aller aux Uploads", "mapping.ftpHttpsCta": "Ajouter un feed HTTPS", - "mapping.ftpCsvCta": "Téléverser un feed CSV", - "mapping.loading": "Chargement des détails du feed…", - "mapping.step1": "Sélectionner l’élément produit", + "mapping.ftpCsvCta": "Téléverser un feed CSV", + "mapping.loading": "Chargement des détails du feed…", + "mapping.step1": "Sélectionner l’élément produit", "mapping.step2": "Mapper les champs", - "mapping.step1Heading": "Étape 1 : Sélectionner l’élément produit", - "mapping.csvHint": "Les feeds CSV utilisent les en-têtes de colonnes comme champs source. Extrayez le schéma pour charger les colonnes, puis continuez le mapping.", - "mapping.howToSelect": "Comment sélectionner l’élément produit :", + "mapping.step1Heading": "Étape 1 : Sélectionner l’élément produit", + "mapping.csvHint": "Les feeds CSV utilisent les en-têtes de colonnes comme champs source. Extrayez le schéma pour charger les colonnes, puis continuez le mapping.", + "mapping.howToSelect": "Comment sélectionner l’élément produit :", "mapping.howToHint": "Guide facultatif", - "mapping.howTo.1": "Extrayez le schéma ou cliquez sur une balise répétée dans l’aperçu", - "mapping.howTo.2": "Chaque élément doit contenir les détails d’un seul produit", + "mapping.howTo.1": "Extrayez le schéma ou cliquez sur une balise répétée dans l’aperçu", + "mapping.howTo.2": "Chaque élément doit contenir les détails d’un seul produit", "mapping.howTo.3": "Confirmez le chemin (par exemple", - "mapping.howTo.4": "Continuez à mapper les champs source vers les champs produit", - "mapping.productElementPath": "Chemin de l’élément produit", + "mapping.howTo.4": "Continuez à mapper les champs source vers les champs produit", + "mapping.productElementPath": "Chemin de l’élément produit", "mapping.pathPlaceholder": "ex. rss/channel/item ou products/product", - "mapping.continue": "Continuer →", - "mapping.continueFields": "Continuer vers le mapping des champs →", - "mapping.discovered": "{fields} champs source découverts sur {rows} ligne(s) d’échantillon.", - "mapping.suggestionsCount": "· {count} suggestion(s) d’auto-mapping", - "mapping.step2Heading": "Étape 2 : Mapper les champs", + "mapping.continue": "Continuer →", + "mapping.continueFields": "Continuer vers le mapping des champs →", + "mapping.discovered": "{fields} champs source découverts sur {rows} ligne(s) d’échantillon.", + "mapping.suggestionsCount": "· {count} suggestion(s) d’auto-mapping", + "mapping.step2Heading": "Étape 2 : Mapper les champs", "mapping.requiredFieldsBadge": "{count} champs obligatoires", - "mapping.unmappedRequired": "{count} obligatoires non mappés", + "mapping.unmappedRequired": "{count} obligatoires non mappés", "mapping.sourceFieldsBadge": "{count} champs source", - "mapping.suggestedBadge": "{count} suggérés", - "mapping.step2Help": "Mappez les colonnes ou nœuds XPath vers vos champs produit. Les obligatoires sont marqués *. Survolez l’aide pour une courte tip.", + "mapping.suggestedBadge": "{count} suggérés", + "mapping.step2Help": "Mappez les colonnes ou nÅ“uds XPath vers vos champs produit. Les obligatoires sont marqués *. Survolez l’aide pour une courte tip.", "mapping.requiredFields": "Champs obligatoires", - "mapping.requiredMapped": "· {mapped}/{total} mappés", - "mapping.requiredProgressDone": "Tous les champs obligatoires sont mappés — prêt pour l’étape suivante.", - "mapping.requiredProgressHint": "Les champs marqués * doivent être mappés avant que ce feed puisse synchroniser des produits.", - "mapping.requiredProgressAria": "Progression des champs obligatoires : {mapped} sur {total} mappés", + "mapping.requiredMapped": "· {mapped}/{total} mappés", + "mapping.requiredProgressDone": "Tous les champs obligatoires sont mappés — prêt pour l’étape suivante.", + "mapping.requiredProgressHint": "Les champs marqués * doivent être mappés avant que ce feed puisse synchroniser des produits.", + "mapping.requiredProgressAria": "Progression des champs obligatoires : {mapped} sur {total} mappés", "mapping.nextAfterSaveReady": "Mappings saved. Next, sync a small sample to check products look right.", "mapping.nextAfterSaveIncomplete": "Mappings saved. Finish the remaining required fields, then sync a sample.", "mapping.nextCtaSyncSample": "Sync + process sample", "mapping.nextCtaFinishRequired": "Show missing required fields", - "mapping.highConfidence": "{count} mapping haute confiance prêt", - "mapping.highConfidencePlural": "{count} mappings haute confiance prêts", - "mapping.highConfidenceHelp": "Correspondances exactes et alias (par ex. EAN → GTIN). Appliquez tout, ou acceptez les puces par ligne.", + "mapping.highConfidence": "{count} mapping haute confiance prêt", + "mapping.highConfidencePlural": "{count} mappings haute confiance prêts", + "mapping.highConfidenceHelp": "Correspondances exactes et alias (par ex. EAN → GTIN). Appliquez tout, ou acceptez les puces par ligne.", "mapping.reviewMappings": "Revoir les mappings", - "mapping.needItemPath": "Saisissez un chemin d’élément produit avant de mapper les champs.", + "mapping.needItemPath": "Saisissez un chemin d’élément produit avant de mapper les champs.", "mapping.removeMapping": "Supprimer le mapping", "mapping.sourcePlaceholder": "nom de colonne ou xpath", - "mapping.processAfterSync": "Produits à traiter après la synchro", - "mapping.noFuzzyLeft": "Plus de correspondances approximatives à confirmer.", - "mapping.syncedQueued": "Feed synchronisé et {queued} produit(s) mis en file pour traitement{jobId}.", + "mapping.processAfterSync": "Produits à traiter après la synchro", + "mapping.noFuzzyLeft": "Plus de correspondances approximatives à confirmer.", + "mapping.syncedQueued": "Feed synchronisé et {queued} produit(s) mis en file pour traitement{jobId}.", "mapping.saveMappings": "Enregistrer les mappings", - "mapping.syncProcessSample": "Synchroniser + traiter l’échantillon", + "mapping.syncProcessSample": "Synchroniser + traiter l’échantillon", "mapping.badgeCsv": "CSV", "mapping.requiredAria": "Aide champs obligatoires", "mapping.applySuggestions": "Appliquer les suggestions ({count})", "mapping.confirmFuzzy": "Confirmer les approximatifs ({count})", - "mapping.fuzzyNeedConfirm": "{count} correspondance approximative à confirmer", - "mapping.fuzzyNeedConfirmPlural": "{count} correspondances approximatives à confirmer", - "mapping.fuzzyHelp": "Les correspondances peu fiables ne sont pas appliquées automatiquement. Confirmez ici ou acceptez par ligne.", - "mapping.missingRequiredTitle": "Les champs obligatoires ont encore besoin d’un mapping source :", - "mapping.applyTip": "Astuce : appliquez les suggestions ci-dessus — beaucoup de champs obligatoires correspondent à des noms courants.", + "mapping.fuzzyNeedConfirm": "{count} correspondance approximative à confirmer", + "mapping.fuzzyNeedConfirmPlural": "{count} correspondances approximatives à confirmer", + "mapping.fuzzyHelp": "Les correspondances peu fiables ne sont pas appliquées automatiquement. Confirmez ici ou acceptez par ligne.", + "mapping.missingRequiredTitle": "Les champs obligatoires ont encore besoin d’un mapping source :", + "mapping.applyTip": "Astuce : appliquez les suggestions ci-dessus — beaucoup de champs obligatoires correspondent à des noms courants.", "mapping.formatLabel": "Format :", "mapping.itemPathLabel": "Chemin item :", - "mapping.reExtract": "Ré-extraire", + "mapping.reExtract": "Ré-extraire", "mapping.manualRows": "Lignes manuelles", - "mapping.schemaTable": "Table schéma", + "mapping.schemaTable": "Table schéma", "mapping.addField": "Ajouter un champ", - "mapping.noSchemaYet": "Aucun schéma extrait pour l’instant.", + "mapping.noSchemaYet": "Aucun schéma extrait pour l’instant.", "mapping.orManualRows": "ou utilisez les lignes manuelles ci-dessous.", "mapping.sourceField": "Champ source", - "mapping.selectSource": "Sélectionner la source…", - "mapping.mapsTo": "Correspond à", + "mapping.selectSource": "Sélectionner la source…", + "mapping.mapsTo": "Correspond à", "mapping.none": "Aucun", - "mapping.backToItem": "← Retour à la sélection d’élément", - "mapping.unsaved": "Modifications non enregistrées", + "mapping.backToItem": "← Retour à la sélection d’élément", + "mapping.unsaved": "Modifications non enregistrées", "mapping.requiredFieldsColon": "Champs obligatoires :", - "mapping.sampleOptions": "Options d'échantillon", - "mapping.sampleSize": "Taille d’échantillon", - "mapping.noExactAlias": "Aucune suggestion exacte/alias à appliquer. Vérifiez les approximatifs ci-dessous.", - "mapping.noSuggestionsExtract": "Aucune suggestion — extrayez d’abord le schéma.", - "mapping.schemaExtracted": "Schéma extrait : {fields} champs sur {rows} ligne(s) d’échantillon.", - "mapping.saved": "Mappings de champs enregistrés{version}.", + "mapping.sampleOptions": "Options d'échantillon", + "mapping.sampleSize": "Taille d’échantillon", + "mapping.noExactAlias": "Aucune suggestion exacte/alias à appliquer. Vérifiez les approximatifs ci-dessous.", + "mapping.noSuggestionsExtract": "Aucune suggestion — extrayez d’abord le schéma.", + "mapping.schemaExtracted": "Schéma extrait : {fields} champs sur {rows} ligne(s) d’échantillon.", + "mapping.saved": "Mappings de champs enregistrés{version}.", "mapping.savedVersion": " (v{version})", - "mapping.syncNoProducts": "Synchro terminée ; aucun produit à traiter.", - "mapping.jobSuffix": " (tâche {jobId})", - "mapping.appliedReplace": "{count} mapping(s) {kind} appliqué(s).", - "mapping.appliedNew": "{count} nouveau(x) mapping(s) {kind} appliqué(s) ({total} au total).", + "mapping.syncNoProducts": "Synchro terminée ; aucun produit à traiter.", + "mapping.jobSuffix": " (tâche {jobId})", + "mapping.appliedReplace": "{count} mapping(s) {kind} appliqué(s).", + "mapping.appliedNew": "{count} nouveau(x) mapping(s) {kind} appliqué(s) ({total} au total).", "mapping.kindHighConfidence": "haute confiance", "mapping.kindFuzzy": "approximatif(s)", - "mapping.fuzzyConfirmFlash": "{count} correspondance approximative à confirmer — utilisez Confirmer les approximatifs ou les puces par ligne.", - "mapping.fuzzyConfirmFlashPlural": "{count} correspondances approximatives à confirmer — utilisez Confirmer les approximatifs ou les puces par ligne.", + "mapping.fuzzyConfirmFlash": "{count} correspondance approximative à confirmer — utilisez Confirmer les approximatifs ou les puces par ligne.", + "mapping.fuzzyConfirmFlashPlural": "{count} correspondances approximatives à confirmer — utilisez Confirmer les approximatifs ou les puces par ligne.", "mapping.formatHelp.title": "Comment structurer votre feed", "mapping.formatHelp.required": "Obligatoire :", "mapping.formatHelp.requiredBody": "{gtin} (EAN/UPC), {title} (ou {name}), {brand}", - "mapping.formatHelp.https": "Utilisez des URL HTTPS publiques pour les feeds distants (pas FTP ni localhost). L’upload CSV convient aux fichiers locaux.", - "mapping.formatHelp.specs": "Specs en paires Libellé : valeur (ex. {ram}). Dimensions : {height}, {width}, {depth}, {mass}", - "mapping.formatHelp.also": "Aussi pris en charge : prix, stock, images, catégorie, garantie, ID EPREL, descriptions HTML, images supplémentaires, URL vidéo, et plus — téléchargez l’échantillon complet.", - "mapping.formatHelp.downloadXml": "Télécharger l’XML d’exemple", - "mapping.formatHelp.downloadCsv": "Télécharger le CSV d’exemple", + "mapping.formatHelp.https": "Utilisez des URL HTTPS publiques pour les feeds distants (pas FTP ni localhost). L’upload CSV convient aux fichiers locaux.", + "mapping.formatHelp.specs": "Specs en paires Libellé : valeur (ex. {ram}). Dimensions : {height}, {width}, {depth}, {mass}", + "mapping.formatHelp.also": "Aussi pris en charge : prix, stock, images, catégorie, garantie, ID EPREL, descriptions HTML, images supplémentaires, URL vidéo, et plus — téléchargez l’échantillon complet.", + "mapping.formatHelp.downloadXml": "Télécharger l’XML d’exemple", + "mapping.formatHelp.downloadCsv": "Télécharger le CSV d’exemple", "mapping.formatHelp.xmlExample": "Exemple XML", - "mapping.formatHelp.csvExample": "Exemple CSV (en-tête + lignes)", - "mapping.sourcePreview.title": "Aperçu de la source du feed", - "mapping.sourcePreview.truncated": "Tronqué", - "mapping.sourcePreview.refresh": "Actualiser l'aperçu", - "mapping.sourcePreview.copy": "Copier l'aperçu", - "mapping.sourcePreview.loading": "Chargement de l’échantillon…", - "mapping.sourcePreview.errorHint": "Vous pouvez encore saisir le chemin de l’élément produit manuellement. Extrayez le schéma quand l’URL est joignable.", - "mapping.sourcePreview.retry": "Réessayer", - "mapping.sourcePreview.empty": "Pas encore d’aperçu", - "mapping.sourcePreview.emptyHintXml": "Cliquez sur « Extraire le schéma » pour télécharger un échantillon et découvrir les champs, ou saisissez un chemin manuellement.", - "mapping.sourcePreview.emptyHintCsv": "Cliquez sur « Extraire le schéma » pour télécharger un échantillon et découvrir les champs.", - "mapping.sourcePreview.selectPath": "Sélectionner le chemin : {path}", - "mapping.sourcePreview.clickTag": "Cliquez sur une ligne de balise pour définir le chemin de l’élément produit.", - "mapping.table.search": "Rechercher des champs…", + "mapping.formatHelp.csvExample": "Exemple CSV (en-tête + lignes)", + "mapping.sourcePreview.title": "Aperçu de la source du feed", + "mapping.sourcePreview.truncated": "Tronqué", + "mapping.sourcePreview.refresh": "Actualiser l'aperçu", + "mapping.sourcePreview.copy": "Copier l'aperçu", + "mapping.sourcePreview.loading": "Chargement de l’échantillon…", + "mapping.sourcePreview.errorHint": "Vous pouvez encore saisir le chemin de l’élément produit manuellement. Extrayez le schéma quand l’URL est joignable.", + "mapping.sourcePreview.retry": "Réessayer", + "mapping.sourcePreview.empty": "Pas encore d’aperçu", + "mapping.sourcePreview.emptyHintXml": "Cliquez sur « Extraire le schéma » pour télécharger un échantillon et découvrir les champs, ou saisissez un chemin manuellement.", + "mapping.sourcePreview.emptyHintCsv": "Cliquez sur « Extraire le schéma » pour télécharger un échantillon et découvrir les champs.", + "mapping.sourcePreview.selectPath": "Sélectionner le chemin : {path}", + "mapping.sourcePreview.clickTag": "Cliquez sur une ligne de balise pour définir le chemin de l’élément produit.", + "mapping.table.search": "Rechercher des champs…", "mapping.table.all": "Tous les champs", - "mapping.table.mapped": "Mappé", - "mapping.table.unmapped": "Non mappés", + "mapping.table.mapped": "Mappé", + "mapping.table.unmapped": "Non mappés", "mapping.table.fieldName": "Nom du champ", "mapping.table.sourcePath": "Chemin source", - "mapping.table.sampleValues": "Valeurs d’échantillon", + "mapping.table.sampleValues": "Valeurs d’échantillon", "mapping.table.type": "Type", "mapping.table.mapTo": "Mapper vers", - "mapping.table.emptySchema": "Extrayez le schéma du feed pour remplir les champs source, ou ajoutez des mappings manuellement.", - "mapping.table.noMatch": "Aucun champ ne correspond à vos critères.", + "mapping.table.emptySchema": "Extrayez le schéma du feed pour remplir les champs source, ou ajoutez des mappings manuellement.", + "mapping.table.noMatch": "Aucun champ ne correspond à vos critères.", "mapping.table.unique": "{count} uniques", - "mapping.table.nested": "imbriqué", + "mapping.table.nested": "imbriqué", "mapping.table.apply": "Appliquer", "mapping.table.confirm": "Confirmer", - "mapping.table.suggestedMatch": "Correspondance suggérée ({confidence})", + "mapping.table.suggestedMatch": "Correspondance suggérée ({confidence})", "mapping.table.confirmFuzzyMatch": "Confirmer la correspondance approximative ({percent}%)", - "mapping.preview.title": "Aperçu du mapping", - "mapping.preview.subtitle": "Forme produit d’échantillon selon vos mappings actuels", - "mapping.preview.usingSamples": "· avec échantillons extraits", + "mapping.preview.title": "Aperçu du mapping", + "mapping.preview.subtitle": "Forme produit d’échantillon selon vos mappings actuels", + "mapping.preview.usingSamples": "· avec échantillons extraits", "mapping.preview.formatCsv": "format : csv", "mapping.preview.item": "item : {path}", - "mapping.preview.sourceFields": "· {count} champs source", - "mapping.preview.empty": "Aucun champ mappé pour l’instant", - "mapping.preview.emptyHint": "Mappez des colonnes ou nœuds XPath vers des champs produit. Un aperçu d’échantillon apparaîtra ici.", + "mapping.preview.sourceFields": "· {count} champs source", + "mapping.preview.empty": "Aucun champ mappé pour l’instant", + "mapping.preview.emptyHint": "Mappez des colonnes ou nÅ“uds XPath vers des champs produit. Un aperçu d’échantillon apparaîtra ici.", "mapping.preview.rawSample": "Extrait brut", - "imports.title": "Téléversements", - "imports.description": "Imports CSV enregistrés pour cet espace de travail — produits, catégories et attributs.", + "imports.title": "Téléversements", + "imports.description": "Imports CSV enregistrés pour cet espace de travail — produits, catégories et attributs.", "imports.importProducts": "Importer des produits", - "imports.emptyTitle": "Aucun upload pour l’instant", - "imports.emptyMessage": "Les imports CSV produits, catégories et attributs apparaîtront ici après téléversement.", + "imports.emptyTitle": "Aucun upload pour l’instant", + "imports.emptyMessage": "Les imports CSV produits, catégories et attributs apparaîtront ici après téléversement.", "imports.goProducts": "Aller aux produits", - "imports.categories": "Catégories", - "imports.recent": "Téléversements récents", + "imports.categories": "Catégories", + "imports.recent": "Téléversements récents", "imports.fileCount": "{count} fichier", "imports.fileCountPlural": "{count} fichiers", "imports.col.fileName": "Nom du fichier", "imports.col.kind": "Type", - "imports.col.uploaded": "Téléversé", + "imports.col.uploaded": "Téléversé", "imports.col.size": "Taille", - "imports.actions": "Actions de téléversement", - "imports.loadFailed": "Échec du chargement des téléversements", - "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", + "imports.actions": "Actions de téléversement", + "imports.loadFailed": "Échec du chargement des téléversements", + "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", "imports.metadataOnlyBadge": "Metadata only (blob not migrated)", - "imports.deleteConfirm": "Supprimer « {name} » ? Cela supprime l’enregistrement d’upload (et le blob local s’il existe).", - "imports.deleted": "Upload suppressé.", - "imports.deleteFailed": "Impossible de supprimer le téléversement", - "imports.status.uploaded": "Téléversé", - "reviews.redirectLoading": "Ouverture des avis WooCommerce…", + "imports.deleteConfirm": "Supprimer « {name} » ? Cela supprime l’enregistrement d’upload (et le blob local s’il existe).", + "imports.deleted": "Upload suppressé.", + "imports.deleteFailed": "Impossible de supprimer le téléversement", + "imports.status.uploaded": "Téléversé", + "reviews.redirectLoading": "Ouverture des avis WooCommerce…", "reviews.tab": "Avis", - "reviews.syncTitle": "Import d’avis (boutique → Descrybe)", - "reviews.syncDesc": "Import entrant — tirez les avis produits WooCommerce dans Descrybe pour campagnes et réputation", + "reviews.syncTitle": "Import d’avis (boutique → Descrybe)", + "reviews.syncDesc": "Import entrant — tirez les avis produits WooCommerce dans Descrybe pour campagnes et réputation", "reviews.syncQueued": "Sync des avis mis en file", "reviews.statusBadge": "Avis : {status}", - "reviews.syncedCount": "{count} synchronisés", - "reviews.lastSync": "Dernière sync : {date}", - "reviews.noSyncYet": "Aucune sync d'avis n'est encore terminée.", - "reviews.needsReconnect": "L’import d’avis ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", - "reviews.queueImport": "Mettre en file l’import d’avis (boutique → Descrybe)", + "reviews.syncedCount": "{count} synchronisés", + "reviews.lastSync": "Dernière sync : {date}", + "reviews.noSyncYet": "Aucune sync d'avis n'est encore terminée.", + "reviews.needsReconnect": "L’import d’avis ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", + "reviews.queueImport": "Mettre en file l’import d’avis (boutique → Descrybe)", "reviews.queueing": "Mise en file...", "reviews.saveTestFirst": "Enregistrez les identifiants et testez la connexion avant de synchroniser", "reviews.refreshList": "Actualiser la liste", - "reviews.loading": "Chargement des avis…", - "reviews.emptyTitle": "Aucun avis pour l’instant", - "reviews.emptyMessage": "Mettez en file une synchro d’avis après connexion de la boutique. Cet onglet reste utilisable avec une liste vide.", + "reviews.loading": "Chargement des avis…", + "reviews.emptyTitle": "Aucun avis pour l’instant", + "reviews.emptyMessage": "Mettez en file une synchro d’avis après connexion de la boutique. Cet onglet reste utilisable avec une liste vide.", "reviews.col.product": "Produit", "reviews.col.reviewer": "Auteur", "reviews.col.rating": "Note", "reviews.col.review": "Examiner", - "reviews.queuedSuccess": "Synchro avis en file. Elle s’exécutera bientôt.", + "reviews.queuedSuccess": "Synchro avis en file. Elle s’exécutera bientôt.", "reviews.queueFailed": "Impossible de mettre la synchro des avis en file", "campaigns.title": "Campagnes", - "campaigns.description": "Créez des campagnes e-mail saisonnières à partir de votre catalogue — choisissez une saison, sélectionnez des produits, définissez l’audience, puis générez.", + "campaigns.description": "Créez des campagnes e-mail saisonnières à partir de votre catalogue — choisissez une saison, sélectionnez des produits, définissez l’audience, puis générez.", "campaigns.new": "Nouvelle campagne", - "campaigns.loading": "Chargement campagnes…", - "campaigns.loadFailed": "Échec du chargement campagnes", - "campaigns.deleteConfirm": "Supprimer la campagne « {name} » ? Cette action est irréversible.", - "campaigns.deleted": "Campagne supprimée", - "campaigns.deleteFailed": "Échec de la suppression de la campagne", - "campaigns.partialUnavailable": "Les campagnes ne sont pas pleinement accessibles pour le moment. Générer et envoyer peuvent échouer jusqu’au retour du service.", - "campaigns.searchPlaceholder": "Rechercher campagnes…", + "campaigns.loading": "Chargement campagnes…", + "campaigns.loadFailed": "Échec du chargement campagnes", + "campaigns.deleteConfirm": "Supprimer la campagne « {name} » ? Cette action est irréversible.", + "campaigns.deleted": "Campagne supprimée", + "campaigns.deleteFailed": "Échec de la suppression de la campagne", + "campaigns.partialUnavailable": "Les campagnes ne sont pas pleinement accessibles pour le moment. Générer et envoyer peuvent échouer jusqu’au retour du service.", + "campaigns.searchPlaceholder": "Rechercher campagnes…", "campaigns.unavailableTitle": "Campagnes indisponibles", - "campaigns.unavailableMessage": "Le service campagnes est injoignable. Vous pouvez ouvrir l’assistant, mais générer et envoyer attendront le retour du service.", - "campaigns.openWizard": "Ouvrir l’assistant de création", + "campaigns.unavailableMessage": "Le service campagnes est injoignable. Vous pouvez ouvrir l’assistant, mais générer et envoyer attendront le retour du service.", + "campaigns.openWizard": "Ouvrir l’assistant de création", "campaigns.backDashboard": "Retour au tableau de bord", "campaigns.browseProducts": "Parcourir les produits", "campaigns.emptyTitle": "Pas encore de campagnes", "campaigns.noMatches": "Aucune correspondance", - "campaigns.emptyMessage": "Créez une campagne Black Friday, Noël ou personnalisée en quelques étapes — des modèles saisonniers sont prêts à l’emploi.", + "campaigns.emptyMessage": "Créez une campagne Black Friday, Noël ou personnalisée en quelques étapes — des modèles saisonniers sont prêts à l’emploi.", "campaigns.noMatchesMessage": "Essayez un autre nom, saison ou statut.", - "campaigns.create": "Créer campagne", + "campaigns.create": "Créer campagne", "campaigns.col.season": "Saison", - "campaigns.col.updated": "Mis à jour", - "campaigns.scheduled": "Planifié {date}", + "campaigns.col.updated": "Mis à jour", + "campaigns.scheduled": "Planifié {date}", "campaigns.newTitle": "Nouvelle campagne", - "campaigns.newDesc": "Choisissez une saison, sélectionnez produits et audience, rédigez le prompt, puis générez, testez et planifiez.", + "campaigns.newDesc": "Choisissez une saison, sélectionnez produits et audience, rédigez le prompt, puis générez, testez et planifiez.", "campaigns.editTitle": "Modifier campagne", - "campaigns.editDesc": "Mettez à jour la saison, les produits et l’audience — puis régénérez, envoyez un test ou planifiez.", - "campaignWizard.loading": "Chargement de l'assistant de campagne…", - "campaignWizard.apiMissing": "L'API campagnes est temporairement indisponible. Vous pouvez explorer l'assistant ; enregistrer / générer / envoyer nécessitent /api/campaigns joignable.", - "campaignWizard.upgradeTitle": "Les campagnes IA sont une fonctionnalité payante", - "campaignWizard.upgradeMessage": "Les offres Free peuvent préparer saisons et audiences, mais Générer IA nécessite Starter ou plus. Améliorez pour débloquer les brouillons e-mail IA.", + "campaigns.editDesc": "Mettez à jour la saison, les produits et l’audience — puis régénérez, envoyez un test ou planifiez.", + "campaignWizard.loading": "Chargement de l'assistant de campagne…", + "campaignWizard.apiMissing": "L'API campagnes est temporairement indisponible. Vous pouvez explorer l'assistant ; enregistrer / générer / envoyer nécessitent /api/campaigns joignable.", + "campaignWizard.upgradeTitle": "Les campagnes IA sont une fonctionnalité payante", + "campaignWizard.upgradeMessage": "Les offres Free peuvent préparer saisons et audiences, mais Générer IA nécessite Starter ou plus. Améliorez pour débloquer les brouillons e-mail IA.", "campaignWizard.comparePlans": "Comparer les offres", "campaignWizard.step.season": "Saison", "campaignWizard.step.catalog": "Produits", "campaignWizard.step.audience": "Audience", "campaignWizard.step.prompt": "Invite", - "campaignWizard.step.preview": "Aperçu", + "campaignWizard.step.preview": "Aperçu", "campaignWizard.step.send": "Envoyer", "campaignWizard.pickSeason": "Choisissez une saison", - "campaignWizard.pickSeasonHelp": "Parte d'un modèle — vous pourrez tout modifier ensuite.", + "campaignWizard.pickSeasonHelp": "Parte d'un modèle — vous pourrez tout modifier ensuite.", "campaignWizard.name": "Nom de la campagne", "campaignWizard.namePlaceholder": "Black Friday 2026", - "campaignWizard.catalogTitle": "Catégories et produits", - "campaignWizard.catalogHelp": "Sélectionnez ce que cet e-mail doit mettre en avant. Les catégories seules suffisent pour démarrer vite.", - "campaignWizard.categories": "Catégories", - "campaignWizard.noCategories": "Pas encore de catégories — ajoutez-en sous Catalogue.", - "campaignWizard.categoriesSelected": "{count} catégorie sélectionnée", - "campaignWizard.categoriesSelectedPlural": "{count} catégories sélectionnées", + "campaignWizard.catalogTitle": "Catégories et produits", + "campaignWizard.catalogHelp": "Sélectionnez ce que cet e-mail doit mettre en avant. Les catégories seules suffisent pour démarrer vite.", + "campaignWizard.categories": "Catégories", + "campaignWizard.noCategories": "Pas encore de catégories — ajoutez-en sous Catalogue.", + "campaignWizard.categoriesSelected": "{count} catégorie sélectionnée", + "campaignWizard.categoriesSelectedPlural": "{count} catégories sélectionnées", "campaignWizard.productsOptional": "Produits (facultatif)", - "campaignWizard.selectedCount": "{count} sélectionnés", - "campaignWizard.searchProducts": "Rechercher des produits…", - "campaignWizard.noProducts": "Aucun produits trouvé.", + "campaignWizard.selectedCount": "{count} sélectionnés", + "campaignWizard.searchProducts": "Rechercher des produits…", + "campaignWizard.noProducts": "Aucun produits trouvé.", "campaignWizard.audienceTitle": "Qui doit le recevoir ?", - "campaignWizard.audienceHelp": "Par défaut tout le monde. Affinez avec catégories ou acheteurs passés quand les commandes sont sync.", + "campaignWizard.audienceHelp": "Par défaut tout le monde. Affinez avec catégories ou acheteurs passés quand les commandes sont sync.", "campaignWizard.audience.all": "Tous les contacts", - "campaignWizard.audience.allHint": "Envoyer à toute votre liste (quand le fournisseur e-mail est configuré).", - "campaignWizard.audience.byCategory": "Par intérêt de catégorie", - "campaignWizard.audience.byCategoryHint": "Personnes associées aux catégories sélectionnées.", - "campaignWizard.audience.purchased": "Acheté dans la catégorie", - "campaignWizard.audience.purchasedHint": "Clients ayant acheté des produits des catégories d'audience (commandes sync).", - "campaignWizard.audience.notPurchased": "Pas encore acheté", - "campaignWizard.audience.notPurchasedHint": "Contacts n'ayant pas acheté ces catégories — idéal pour reconquérir.", - "campaignWizard.ordersHint": "Le ciblage acheté / non acheté apparaît après sync des commandes WooCommerce.", - "campaignWizard.audienceCategories": "Catégories d'audience", + "campaignWizard.audience.allHint": "Envoyer à toute votre liste (quand le fournisseur e-mail est configuré).", + "campaignWizard.audience.byCategory": "Par intérêt de catégorie", + "campaignWizard.audience.byCategoryHint": "Personnes associées aux catégories sélectionnées.", + "campaignWizard.audience.purchased": "Acheté dans la catégorie", + "campaignWizard.audience.purchasedHint": "Clients ayant acheté des produits des catégories d'audience (commandes sync).", + "campaignWizard.audience.notPurchased": "Pas encore acheté", + "campaignWizard.audience.notPurchasedHint": "Contacts n'ayant pas acheté ces catégories — idéal pour reconquérir.", + "campaignWizard.ordersHint": "Le ciblage acheté / non acheté apparaît après sync des commandes WooCommerce.", + "campaignWizard.audienceCategories": "Catégories d'audience", "campaignWizard.promptTitle": "Invite e-mail", - "campaignWizard.promptHelp": "Nous avons rempli un défaut solide pour {season}. Modifiez-le ou gardez-le.", + "campaignWizard.promptHelp": "Nous avons rempli un défaut solide pour {season}. Modifiez-le ou gardez-le.", "campaignWizard.promptSeasonFallback": "cette saison", - "campaignWizard.useDefaultPrompt": "Utiliser l'invite saisonnière par défaut", + "campaignWizard.useDefaultPrompt": "Utiliser l'invite saisonnière par défaut", "campaignWizard.promptLabel": "Invite", - "campaignWizard.advanced": "Options avancées", - "campaignWizard.advancedHelp": "La génération IA utilise votre kit de marque (si défini) et les produits sélectionnés. L'aperçu modèle seul ignore l'IA et sert de maquette.", + "campaignWizard.advanced": "Options avancées", + "campaignWizard.advancedHelp": "La génération IA utilise votre kit de marque (si défini) et les produits sélectionnés. L'aperçu modèle seul ignore l'IA et sert de maquette.", "campaignWizard.planFree": "Gratuit", "campaignWizard.planPaid": "Payant", "campaignWizard.planLine": "Offre :", - "campaignWizard.aiLocked": "— Générer IA est verrouillé.", - "campaignWizard.generateAi": "Générer IA", - "campaignWizard.templatePreview": "Aperçu du modèle", + "campaignWizard.aiLocked": "— Générer IA est verrouillé.", + "campaignWizard.generateAi": "Générer IA", + "campaignWizard.templatePreview": "Aperçu du modèle", "campaignWizard.saveDraft": "Enregistrer le brouillon", - "campaignWizard.previewTitle": "Aperçu", + "campaignWizard.previewTitle": "Aperçu", "campaignWizard.status": "Statut :", - "campaignWizard.generateToSee": "Générez un brouillon pour voir le corps de l'e-mail.", - "campaignWizard.noPreview": "Pas encore d'aperçu. Revenez à Invite et lancez Générer IA ou Aperçu du modèle.", - "campaignWizard.backToPrompt": "Retour à l'invite", + "campaignWizard.generateToSee": "Générez un brouillon pour voir le corps de l'e-mail.", + "campaignWizard.noPreview": "Pas encore d'aperçu. Revenez à Invite et lancez Générer IA ou Aperçu du modèle.", + "campaignWizard.backToPrompt": "Retour à l'invite", "campaignWizard.subject": "Objet", - "campaignWizard.emailPreview": "Aperçu de l'e-mail", - "campaignWizard.regenerateAi": "Régénérer avec l'IA", - "campaignWizard.regenerate": "Régénérer", + "campaignWizard.emailPreview": "Aperçu de l'e-mail", + "campaignWizard.regenerateAi": "Régénérer avec l'IA", + "campaignWizard.regenerate": "Régénérer", "campaignWizard.continueSend": "Continuer vers l'envoi", "campaignWizard.testSend": "Envoi test", "campaignWizard.testSendHelp": "Envoyez-vous une copie avant de planifier.", @@ -1995,1308 +1995,1309 @@ export const fr: MessageDict = { "campaignWizard.sendTest": "Envoyer le test", "campaignWizard.scheduleTitle": "Planifier", "campaignWizard.scheduleHelp": "Choisissez quand cette campagne doit partir.", - "campaignWizard.sendAt": "Envoyer à", + "campaignWizard.sendAt": "Envoyer à", "campaignWizard.schedule": "Planifier la campagne", - "campaignWizard.generateToContinue": "Générez pour continuer", - "campaignWizard.done": "Terminé", - "campaignWizard.loadFailed": "Échec du chargement de l'assistant", - "campaignWizard.pickCatalog": "Choisissez au moins une catégorie ou un produit", - "campaignWizard.pickAudienceCats": "Choisissez des catégories d’audience pour ce filtre", - "campaignWizard.completeStep": "Terminez cette étape pour continuer", - "campaignWizard.aiDraftReady": "Brouillon IA généré", - "campaignWizard.templateReady": "Aperçu du modèle prêt", - "campaignWizard.unavailableSave": "Les campagnes ne sont pas disponibles. Les brouillons ne peuvent pas être enregistrés tant que la fonctionnalité n’est pas en ligne.", - "campaignWizard.generateFailed": "Échec de la génération", - "campaignWizard.generateFirst": "Générez d’abord un aperçu", + "campaignWizard.generateToContinue": "Générez pour continuer", + "campaignWizard.done": "Terminé", + "campaignWizard.loadFailed": "Échec du chargement de l'assistant", + "campaignWizard.pickCatalog": "Choisissez au moins une catégorie ou un produit", + "campaignWizard.pickAudienceCats": "Choisissez des catégories d’audience pour ce filtre", + "campaignWizard.completeStep": "Terminez cette étape pour continuer", + "campaignWizard.aiDraftReady": "Brouillon IA généré", + "campaignWizard.templateReady": "Aperçu du modèle prêt", + "campaignWizard.unavailableSave": "Les campagnes ne sont pas disponibles. Les brouillons ne peuvent pas être enregistrés tant que la fonctionnalité n’est pas en ligne.", + "campaignWizard.generateFailed": "Échec de la génération", + "campaignWizard.generateFirst": "Générez d’abord un aperçu", "campaignWizard.enterTestEmail": "Saisissez une adresse e-mail de test", - "campaignWizard.testFailed": "Échec de l’envoi de test", + "campaignWizard.testFailed": "Échec de l’envoi de test", "campaignWizard.pickSchedule": "Choisissez une date et une heure", - "campaignWizard.scheduled": "Campagne planifiée", - "campaignWizard.scheduleFailed": "Échec de la planification", - "campaignWizard.draftSaved": "Brouillon enregistré", + "campaignWizard.scheduled": "Campagne planifiée", + "campaignWizard.scheduleFailed": "Échec de la planification", + "campaignWizard.draftSaved": "Brouillon enregistré", "campaignWizard.unavailableShort": "Les campagnes ne sont pas disponibles pour le moment.", - "campaignWizard.saveFailed": "Échec de l'enregistrement", + "campaignWizard.saveFailed": "Échec de l'enregistrement", "marketing.calendarTitle": "Calendrier de contenu", - "marketing.calendarDesc": "Liez les campagnes saisonnières aux dates, puis préparez un feed d'export avec les défauts shopping.", - "marketing.loadFailed": "Échec du chargement du calendrier", - "marketing.prepared": "Campagne préparée", - "marketing.alreadyReady": "La campagne est déjà prête", - "marketing.exportFeedsHint": "{name} → Feeds d'export", - "marketing.prepareFailed": "Impossible de préparer la campagne", - "marketing.requestFailed": "Échec de la requête", - "marketing.emptyTitle": "Aucun préréglage saisonnier", - "marketing.emptyMessage": "Les préréglages du calendrier apparaîtront ici lorsque l’API marketing sera disponible.", + "marketing.calendarDesc": "Liez les campagnes saisonnières aux dates, puis préparez un feed d'export avec les défauts shopping.", + "marketing.loadFailed": "Échec du chargement du calendrier", + "marketing.prepared": "Campagne préparée", + "marketing.alreadyReady": "La campagne est déjà prête", + "marketing.exportFeedsHint": "{name} → Feeds d'export", + "marketing.prepareFailed": "Impossible de préparer la campagne", + "marketing.requestFailed": "Échec de la requête", + "marketing.emptyTitle": "Aucun préréglage saisonnier", + "marketing.emptyMessage": "Les préréglages du calendrier apparaîtront ici lorsque l’API marketing sera disponible.", "marketing.openCampaigns": "Ouvrir les campagnes e-mail", - "marketing.window": "Fenêtre :", - "marketing.linkedExport": "Export lié :", - "marketing.openPrepared": "Ouvrir le feed préparé", - "marketing.preparing": "Préparation…", - "marketing.prepareNamed": "Préparer la campagne {name}", - "marketing.footer": "Les campagnes e-mail restent sur {link} — cette page prépare seulement les feeds d'export catalogue.", - "common.done": "Terminé", - "common.copied": "Copié dans le presse-papiers.", - "common.copyFailed": "Impossible de copier. Sélectionnez le texte et copiez-le manuellement.", - "common.submitting": "Envoi…", - "common.sending": "Envoi…", - "settings.companyAdminOnlyView": "Seuls les admins de l'entreprise peuvent modifier les paramètres. Vous pouvez voir les détails de l'espace de travail actuel.", - "settings.activeCompanyHelp": "Espace de travail pour catalogue, feeds, facturation et clés API. Changez à tout moment ici ou dans l'en-tête.", - "settings.noCompanySelected": "Aucune entreprise sélectionnée", - "settings.creditsOverviewHelp": "Solde de crédits IA de l'entreprise active. L'utilisation détaillée est dans Facturation.", + "marketing.window": "Fenêtre :", + "marketing.linkedExport": "Export lié :", + "marketing.openPrepared": "Ouvrir le feed préparé", + "marketing.preparing": "Préparation…", + "marketing.prepareNamed": "Préparer la campagne {name}", + "marketing.footer": "Les campagnes e-mail restent sur {link} — cette page prépare seulement les feeds d'export catalogue.", + "common.done": "Terminé", + "common.copied": "Copié dans le presse-papiers.", + "common.copyFailed": "Impossible de copier. Sélectionnez le texte et copiez-le manuellement.", + "common.submitting": "Envoi…", + "common.sending": "Envoi…", + "settings.companyAdminOnlyView": "Seuls les admins de l'entreprise peuvent modifier les paramètres. Vous pouvez voir les détails de l'espace de travail actuel.", + "settings.activeCompanyHelp": "Espace de travail pour catalogue, feeds, facturation et clés API. Changez à tout moment ici ou dans l'en-tête.", + "settings.noCompanySelected": "Aucune entreprise sélectionnée", + "settings.creditsOverviewHelp": "Solde de crédits IA de l'entreprise active. L'utilisation détaillée est dans Facturation.", "settings.billingLabel": "Facturation", "settings.remainingLabel": "Restants", - "settings.creditsUnavailable": "Le solde de crédits n'est pas encore disponible pour cet espace de travail.", + "settings.creditsUnavailable": "Le solde de crédits n'est pas encore disponible pour cet espace de travail.", "settings.openBilling": "Ouvrir utilisation et facturation", - "settings.companyNameHelp": "Ce nom apparaît dans les invitations et les paramètres de l'organisation", - "settings.contentSettingsHelp": "Configurez la langue et la correspondance produits pour le contenu généré", - "settings.mergeProductsHelp": "Lorsque activé, les imports CSV combinent les lignes partageant un GTIN en un produit. Désactivez pour garder chaque ligne indépendante.", + "settings.companyNameHelp": "Ce nom apparaît dans les invitations et les paramètres de l'organisation", + "settings.contentSettingsHelp": "Configurez la langue et la correspondance produits pour le contenu généré", + "settings.mergeProductsHelp": "Lorsque activé, les imports CSV combinent les lignes partageant un GTIN en un produit. Désactivez pour garder chaque ligne indépendante.", "settings.emailIntegrationHelp": "Configurez Resend ou SMTP pour invitations, campagnes et e-mails transactionnels.", "settings.configureEmail": "Configurer l'e-mail", - "settings.aiIntegrationsHelp": "Crédits plateforme ou votre propre clé, plus invites modifiables pour titres, descriptions, SEO et campagnes. Clés chiffrées au repos.", - "settings.openAiIntegrations": "Ouvrir les intégrations IA", + "settings.aiIntegrationsHelp": "Crédits plateforme ou votre propre clé, plus invites modifiables pour titres, descriptions, SEO et campagnes. Clés chiffrées au repos.", + "settings.openAiIntegrations": "Ouvrir les intégrations IA", "settings.companyNameRequired": "Saisissez un nom d'entreprise.", - "settings.companySaved": "Paramètres de l'entreprise enregistrés.", - "settings.companyUpdateFailed": "Impossible de mettre à jour l'entreprise", - "settings.mergeOn": "Les produits avec le même GTIN seront fusionnés entre feeds.", - "settings.mergeOff": "Les produits avec le même GTIN restent séparés.", - "settings.mergeUpdateFailed": "Impossible de mettre à jour le paramètre de fusion", - "settings.inAppToastsHelp": "Stocké uniquement dans ce navigateur. Les échecs sont activés par défaut ; les achèvements sont masqués pour réduire le bruit. Les retours de formulaire et Annuler ne sont jamais masqués.", - "settings.emailAlertsHelp": "Les préférences d’alertes e-mail arrivent bientôt. Les alertes d’échec seront activées par défaut (comme in-app) ; les e-mails d’achèvement resteront off sauf opt-in.", - "settings.emailAlertsBody": "Pour l’instant, configurez le mail transactionnel sous Entreprise → Intégration e-mail. Les alertes in-app ci-dessus s’appliquent toujours.", - "settings.apiKeysLegacyNotice": "Les clés API héritées n’ont pas été migrées. Créez-en une nouvelle pour restaurer l’accès — le secret n’est affiché qu’une fois.", - "settings.apiKeysAdminOnly": "Seuls les administrateurs peuvent créer ou révoquer des clés API. Vous pouvez voir les préfixes existants.", - "settings.apiKeysCopyUnavailableNotice": "Copie indisponible pour les clés existantes — seul le préfixe est stocké. Créez une nouvelle clé pour copier le secret une fois, puis révoquez l’ancienne si besoin.", - "settings.apiKeysForbidden": "Vous n’avez pas l’autorisation de voir les clés API. Demandez de l’aide à un administrateur.", - "settings.noApiKeys": "Pas encore de clés API", - "settings.noApiKeysHelpAdmin": "Les clés API héritées n’ont pas été migrées. Créez-en une pour authentifier les requêtes Descrybe (X-API-Key). Le secret complet n’est affiché qu’une fois.", - "settings.noApiKeysHelpMember": "Aucune clé API pour cette entreprise. Les clés héritées n’ont pas été migrées — demandez à un administrateur d’en créer une.", - "settings.unnamedKey": "Clé sans nom", - "settings.neverUsed": "Jamais utilisé", - "settings.apiKeyActions": "Actions de clé API", + "settings.companySaved": "Paramètres de l'entreprise enregistrés.", + "settings.companyUpdateFailed": "Impossible de mettre à jour l'entreprise", + "settings.mergeOn": "Les produits avec le même GTIN seront fusionnés entre feeds.", + "settings.mergeOff": "Les produits avec le même GTIN restent séparés.", + "settings.mergeUpdateFailed": "Impossible de mettre à jour le paramètre de fusion", + "settings.inAppToastsHelp": "Stocké uniquement dans ce navigateur. Les échecs sont activés par défaut ; les achèvements sont masqués pour réduire le bruit. Les retours de formulaire et Annuler ne sont jamais masqués.", + "settings.emailAlertsHelp": "Les préférences d’alertes e-mail arrivent bientôt. Les alertes d’échec seront activées par défaut (comme in-app) ; les e-mails d’achèvement resteront off sauf opt-in.", + "settings.emailAlertsBody": "Pour l’instant, configurez le mail transactionnel sous Entreprise → Intégration e-mail. Les alertes in-app ci-dessus s’appliquent toujours.", + "settings.apiKeysLegacyNotice": "Les clés API héritées n’ont pas été migrées. Créez-en une nouvelle pour restaurer l’accès — le secret n’est affiché qu’une fois.", + "settings.apiKeysAdminOnly": "Seuls les administrateurs peuvent créer ou révoquer des clés API. Vous pouvez voir les préfixes existants.", + "settings.apiKeysCopyUnavailableNotice": "Copie indisponible pour les clés existantes — seul le préfixe est stocké. Créez une nouvelle clé pour copier le secret une fois, puis révoquez l’ancienne si besoin.", + "settings.apiKeysForbidden": "Vous n’avez pas l’autorisation de voir les clés API. Demandez de l’aide à un administrateur.", + "settings.noApiKeys": "Pas encore de clés API", + "settings.noApiKeysHelpAdmin": "Les clés API héritées n’ont pas été migrées. Créez-en une pour authentifier les requêtes Descrybe (X-API-Key). Le secret complet n’est affiché qu’une fois.", + "settings.noApiKeysHelpMember": "Aucune clé API pour cette entreprise. Les clés héritées n’ont pas été migrées — demandez à un administrateur d’en créer une.", + "settings.unnamedKey": "Clé sans nom", + "settings.neverUsed": "Jamais utilisé", + "settings.apiKeyActions": "Actions de clé API", "settings.copyUnavailable": "Copie indisponible", - "settings.copyUnavailableTitle": "Le secret complet n’est affiché qu’une fois à la création de la clé", - "settings.revoke": "Révoquer", - "settings.apiKeyNameRequired": "Saisissez un nom pour cette clé API.", - "settings.apiKeyCreatedOnce": "Clé API créée. Copiez-la maintenant — elle ne sera plus affichée.", - "settings.apiKeyCreated": "Clé API créée.", - "settings.apiKeyCreateFailed": "Impossible de créer la clé API", - "settings.apiKeyRevokeConfirm": "Révoquer cette clé API ? Les requêtes qui l’utilisent cesseront de fonctionner.", - "settings.apiKeyRevoked": "Clé API révoquée.", - "settings.apiKeyRevokeFailed": "Impossible de révoquer la clé API", - "settings.apiKeyCopied": "Clé API copiée.", - "settings.createApiKeyOnceHelp": "Copiez cette clé maintenant — elle ne sera plus affichée. Utilisez-la en Authorization: Bearer ou X-API-Key sur /api/v1.", - "settings.createApiKeyNameHelp": "Nommez la clé pour la distinguer plus tard. Après création, envoyez-la en Authorization: Bearer (préféré) ou X-API-Key.", + "settings.copyUnavailableTitle": "Le secret complet n’est affiché qu’une fois à la création de la clé", + "settings.revoke": "Révoquer", + "settings.apiKeyNameRequired": "Saisissez un nom pour cette clé API.", + "settings.apiKeyCreatedOnce": "Clé API créée. Copiez-la maintenant — elle ne sera plus affichée.", + "settings.apiKeyCreated": "Clé API créée.", + "settings.apiKeyCreateFailed": "Impossible de créer la clé API", + "settings.apiKeyRevokeConfirm": "Révoquer cette clé API ? Les requêtes qui l’utilisent cesseront de fonctionner.", + "settings.apiKeyRevoked": "Clé API révoquée.", + "settings.apiKeyRevokeFailed": "Impossible de révoquer la clé API", + "settings.apiKeyCopied": "Clé API copiée.", + "settings.createApiKeyOnceHelp": "Copiez cette clé maintenant — elle ne sera plus affichée. Utilisez-la en Authorization: Bearer ou X-API-Key sur /api/v1.", + "settings.createApiKeyNameHelp": "Nommez la clé pour la distinguer plus tard. Après création, envoyez-la en Authorization: Bearer (préféré) ou X-API-Key.", "settings.keyNamePlaceholder": "p. ex. Production", - "settings.newApiKeyAria": "Nouvelle clé API affichée une fois", - "settings.copyApiKeyAria": "Copier la clé API", - "settings.alert.sync_fail.title": "Échecs de sync", - "settings.alert.sync_fail.description": "Lorsqu’une synchro de feed expire ou que l’API renvoie une erreur.", - "settings.alert.sync_done.title": "Sync terminée", - "settings.alert.sync_done.description": "Lorsqu’une synchro de feed se termine avec succès.", - "settings.alert.ai_fail.title": "Échecs IA / traitement", - "settings.alert.ai_fail.description": "Lorsqu’un démarrage ou une exécution de tâche de traitement échoue.", - "settings.alert.ai_done.title": "IA / traitement terminé", - "settings.alert.ai_done.description": "Lorsqu’une tâche d’arrière-plan se termine avec succès. Les toasts de démarrage restent toujours actifs pour qu’Annuler reste disponible.", - "settings.alert.export_fail.title": "Échecs d'export", - "settings.alert.export_fail.description": "Lorsqu’un export de produit ou de feed d’export échoue.", - "settings.alert.export_done.title": "Export terminé", - "settings.alert.export_done.description": "Lorsqu’un export se termine avec succès.", - "settings.alert.support_reply.title": "Réponses du personnel de support", - "settings.alert.support_reply.description": "Lorsqu’un agent de la plateforme répond à votre ticket de support.", + "settings.newApiKeyAria": "Nouvelle clé API affichée une fois", + "settings.copyApiKeyAria": "Copier la clé API", + "settings.alert.sync_fail.title": "Échecs de sync", + "settings.alert.sync_fail.description": "Lorsqu’une synchro de feed expire ou que l’API renvoie une erreur.", + "settings.alert.sync_done.title": "Sync terminée", + "settings.alert.sync_done.description": "Lorsqu’une synchro de feed se termine avec succès.", + "settings.alert.ai_fail.title": "Échecs IA / traitement", + "settings.alert.ai_fail.description": "Lorsqu’un démarrage ou une exécution de tâche de traitement échoue.", + "settings.alert.ai_done.title": "IA / traitement terminé", + "settings.alert.ai_done.description": "Lorsqu’une tâche d’arrière-plan se termine avec succès. Les toasts de démarrage restent toujours actifs pour qu’Annuler reste disponible.", + "settings.alert.export_fail.title": "Échecs d'export", + "settings.alert.export_fail.description": "Lorsqu’un export de produit ou de feed d’export échoue.", + "settings.alert.export_done.title": "Export terminé", + "settings.alert.export_done.description": "Lorsqu’un export se termine avec succès.", + "settings.alert.support_reply.title": "Réponses du personnel de support", + "settings.alert.support_reply.description": "Lorsqu’un agent de la plateforme répond à votre ticket de support.", "settings.alert.support_status.title": "Changements de statut du support", - "settings.alert.support_status.description": "Lorsqu’un ticket de support passe à en attente ou résolu.", - "empty.forbidden.title.company": "Permission refusée", - "empty.forbidden.title.platform": "Accès restreint", - "empty.forbidden.message.company": "Vous n’avez pas l’autorisation. Demandez de l’aide à un administrateur de l’entreprise.", - "empty.forbidden.message.platform": "Cette zone est réservée aux administrateurs de la plateforme.", - "empty.forbidden.message.support": "Cette zone est réservée au support et aux administrateurs de la plateforme.", + "settings.alert.support_status.description": "Lorsqu’un ticket de support passe à en attente ou résolu.", + "empty.forbidden.title.company": "Permission refusée", + "empty.forbidden.title.platform": "Accès restreint", + "empty.forbidden.message.company": "Vous n’avez pas l’autorisation. Demandez de l’aide à un administrateur de l’entreprise.", + "empty.forbidden.message.platform": "Cette zone est réservée aux administrateurs de la plateforme.", + "empty.forbidden.message.support": "Cette zone est réservée au support et aux administrateurs de la plateforme.", "empty.forbidden.backDashboard": "Retour au tableau de bord", - "empty.forbidden.apiKeys": "Vous n’avez pas l’autorisation de voir les clés API. Demandez de l’aide à un administrateur.", - "empty.forbidden.ai": "Vous n’avez pas l’autorisation de voir les paramètres du fournisseur d’IA. Demandez de l’aide à un administrateur.", - "empty.forbidden.email": "Vous n’avez pas l’autorisation de voir les paramètres du fournisseur d’e-mail. Demandez de l’aide à un administrateur.", + "empty.forbidden.apiKeys": "Vous n’avez pas l’autorisation de voir les clés API. Demandez de l’aide à un administrateur.", + "empty.forbidden.ai": "Vous n’avez pas l’autorisation de voir les paramètres du fournisseur d’IA. Demandez de l’aide à un administrateur.", + "empty.forbidden.email": "Vous n’avez pas l’autorisation de voir les paramètres du fournisseur d’e-mail. Demandez de l’aide à un administrateur.", "confirm.defaultTitle": "Confirmer la suppression", - "confirm.defaultDescription": "Êtes-vous sûr ?", + "confirm.defaultDescription": "Êtes-vous sûr ?", "confirm.defaultConfirm": "Confirmer", - "confirm.deleteFeed": "Supprimer le feed « {name} » ? Action irréversible.", - "confirm.deleteCampaign": "Supprimer la campagne « {name} » ? Cette action est irréversible.", + "confirm.deleteFeed": "Supprimer le feed « {name} » ? Action irréversible.", + "confirm.deleteCampaign": "Supprimer la campagne « {name} » ? Cette action est irréversible.", "confirm.deleteExportFeed": "Voulez-vous vraiment supprimer ce feed d'export ?", "confirm.rotateExportToken": "Renouveler le jeton d URL du feed? L ancienne URL publique cessera immediatement de fonctionner.", - "confirm.deleteUpload": "Supprimer « {name} » ? Cela supprime l’enregistrement d’upload (et le blob local s’il existe).", - "confirm.revokeApiKey": "Révoquer cette clé API ? Les requêtes qui l’utilisent cesseront de fonctionner.", + "confirm.deleteUpload": "Supprimer « {name} » ? Cela supprime l’enregistrement d’upload (et le blob local s’il existe).", + "confirm.revokeApiKey": "Révoquer cette clé API ? Les requêtes qui l’utilisent cesseront de fonctionner.", "confirm.deleteKnowledgeArticle": "Supprimer cet article de connaissances ?", - "confirm.deleteReplyTemplate": "Supprimer ce modèle de réponse ?", - "confirm.deleteStructuredField": "Voulez-vous vraiment supprimer ce champ ? Cette action est irréversible.", - "toast.campaign.pickAudience": "Choisissez au moins une catégorie ou un produit", - "toast.campaign.pickCategories": "Choisissez des catégories d’audience pour ce filtre", - "toast.campaign.completeStep": "Terminez cette étape pour continuer", - "toast.campaign.aiDraft": "Brouillon IA généré", - "toast.campaign.templatePreview": "Aperçu du modèle prêt", - "toast.campaign.generateFirst": "Générez d’abord un aperçu", - "toast.campaign.testSent": "E-mail de test envoyé à {email}", - "toast.campaign.scheduled": "Campagne planifiée", - "toast.campaign.draftSaved": "Brouillon enregistré", - "toast.campaign.deleted": "Campagne supprimée", - "toast.campaign.prepared": "Campagne préparée", - "toast.campaign.alreadyReady": "La campagne est déjà prête", - "toast.campaign.prepareFailed": "Impossible de préparer la campagne", - "toast.campaign.deleteFailed": "Échec de la suppression de la campagne", + "confirm.deleteReplyTemplate": "Supprimer ce modèle de réponse ?", + "confirm.deleteStructuredField": "Voulez-vous vraiment supprimer ce champ ? Cette action est irréversible.", + "toast.campaign.pickAudience": "Choisissez au moins une catégorie ou un produit", + "toast.campaign.pickCategories": "Choisissez des catégories d’audience pour ce filtre", + "toast.campaign.completeStep": "Terminez cette étape pour continuer", + "toast.campaign.aiDraft": "Brouillon IA généré", + "toast.campaign.templatePreview": "Aperçu du modèle prêt", + "toast.campaign.generateFirst": "Générez d’abord un aperçu", + "toast.campaign.testSent": "E-mail de test envoyé à {email}", + "toast.campaign.scheduled": "Campagne planifiée", + "toast.campaign.draftSaved": "Brouillon enregistré", + "toast.campaign.deleted": "Campagne supprimée", + "toast.campaign.prepared": "Campagne préparée", + "toast.campaign.alreadyReady": "La campagne est déjà prête", + "toast.campaign.prepareFailed": "Impossible de préparer la campagne", + "toast.campaign.deleteFailed": "Échec de la suppression de la campagne", "toast.feed.copyFailed": "Impossible de copier l'URL", - "toast.feed.created": "Feed créé", - "toast.feed.updated": "Feed mis à jour.", + "toast.feed.created": "Feed créé", + "toast.feed.updated": "Feed mis à jour.", "toast.feed.mapBeforeSync": "Mappez les champs avant de synchroniser ce feed.", "toast.feed.activateBeforeSync": "Activez le feed avant de synchroniser.", - "toast.feed.syncFinished": "Synchronisation terminée", - "toast.feed.deleted": "Feed supprimé.", + "toast.feed.syncFinished": "Synchronisation terminée", + "toast.feed.deleted": "Feed supprimé.", "toast.feed.mappingLoadFailed": "Impossible de charger les mappages. Ouvrez le mapping pour corriger avant de synchroniser.", - "toast.feed.syncFailed": "Échec de la synchronisation", - "toast.feed.statusFailed": "Impossible de mettre à jour le statut", + "toast.feed.syncFailed": "Échec de la synchronisation", + "toast.feed.statusFailed": "Impossible de mettre à jour le statut", "toast.feed.deleteFailed": "Impossible de supprimer le feed", - "toast.feed.beforeSampling": "Avant l’échantillonnage", - "toast.processing.jobCompleted": "Traitement terminé", - "toast.processing.jobFailed": "Échec du traitement", - "toast.products.startFailed": "Impossible de démarrer le traitement", - "toast.products.jobStarted": "Tâche de traitement démarrée", - "toast.products.acceptUndone": "Acceptation annulée", - "toast.products.resetComplete": "Réinitialisation terminée", - "toast.products.nameAcceptUndone": "Acceptation du nom annulée", - "toast.products.descAcceptUndone": "Acceptation de la description annulée", - "toast.products.cancelOne": "Traitement annulé", - "toast.products.cancelMany": "Tâches de traitement annulées", - "toast.products.startJobFailed": "Impossible de démarrer la tâche de traitement", + "toast.feed.beforeSampling": "Avant l’échantillonnage", + "toast.processing.jobCompleted": "Traitement terminé", + "toast.processing.jobFailed": "Échec du traitement", + "toast.products.startFailed": "Impossible de démarrer le traitement", + "toast.products.jobStarted": "Tâche de traitement démarrée", + "toast.products.acceptUndone": "Acceptation annulée", + "toast.products.resetComplete": "Réinitialisation terminée", + "toast.products.nameAcceptUndone": "Acceptation du nom annulée", + "toast.products.descAcceptUndone": "Acceptation de la description annulée", + "toast.products.cancelOne": "Traitement annulé", + "toast.products.cancelMany": "Tâches de traitement annulées", + "toast.products.startJobFailed": "Impossible de démarrer la tâche de traitement", "toast.products.acceptFailed": "Impossible d'accepter l'enrichissement", - "toast.products.updateFailed": "Impossible de mettre à jour le produit", + "toast.products.updateFailed": "Impossible de mettre à jour le produit", "toast.products.undoAcceptFailed": "Impossible d'annuler l'acceptation", "toast.products.undoFieldAcceptFailed": "Impossible d'annuler l'acceptation du champ", "toast.products.undoFieldDiscardFailed": "Impossible d'annuler le rejet du champ", "toast.products.rejectFailed": "Impossible de rejeter l'enrichissement", - "toast.products.exportFailed": "Impossible d'exporter les produits sélectionnés", - "toast.products.resetFailed": "Impossible de réinitialiser les produits", - "toast.products.cancelFailed": "Impossible d'annuler la tâche de traitement", - "toast.support.ticketCreated": "Ticket créé", - "toast.support.replySent": "Réponse envoyée", + "toast.products.exportFailed": "Impossible d'exporter les produits sélectionnés", + "toast.products.resetFailed": "Impossible de réinitialiser les produits", + "toast.products.cancelFailed": "Impossible d'annuler la tâche de traitement", + "toast.support.ticketCreated": "Ticket créé", + "toast.support.replySent": "Réponse envoyée", "toast.support.thanksFeedback": "Merci pour votre retour", - "toast.support.createFailed": "Impossible de créer le ticket", + "toast.support.createFailed": "Impossible de créer le ticket", "toast.support.unavailable": "Support indisponible", - "toast.support.loadFailed": "Échec du chargement des tickets de support", - "toast.support.loadTicketFailed": "Échec du chargement du ticket", - "toast.support.replyFailed": "Impossible d’envoyer la réponse", - "toast.support.ratingUnavailable": "Évaluation indisponible", - "toast.support.alreadyRated": "Déjà noté", - "toast.support.ratingFailed": "Impossible d’envoyer l’évaluation", - "toast.structured.fieldAdded": "Champ ajouté", - "toast.structured.fieldAddedBody": "Le champ de description structurée a été ajouté.", - "toast.structured.fieldDeleted": "Champ supprimé", - "toast.structured.fieldDeletedBody": "Le champ de description structurée a été supprimé.", - "toast.structured.addFailed": "Échec de l’ajout du champ", - "toast.structured.deleteFailed": "Échec de la suppression du champ", - "toast.brand.saved": "Kit de marque enregistré", - "toast.brand.logoUploaded": "Logo téléversé", - "toast.brand.saveFailed": "Échec de l’enregistrement du kit de marque", - "toast.brand.uploadFailed": "Échec du téléversement du logo", - "toast.vector.indexCreated": "Index vectoriel créé avec succès", - "toast.vector.dbInitialized": "Base de données vectorielle initialisée avec succès", - "toast.vector.indexFailed": "Échec de la création de l’index vectoriel", - "toast.vector.initFailed": "Échec de l’initialisation de la base vectorielle", - "toast.vector.searchFailed": "Échec de la recherche de catégories", - "toast.export.refreshFailed": "Échec de l'actualisation du feed", - "toast.mapping.loadFailed": "Échec du chargement du mapping du feed", - "toast.mapping.extractFailed": "Échec de l’extraction du schéma", - "toast.mapping.saveFailed": "Échec de l’enregistrement des mappages", - "toast.mapping.sampleFailed": "Échec de la synchro + traitement de l’échantillon", - "toast.attrs.createFailed": "Échec de la création", - "toast.attrs.importFailed": "Échec de l'import", - "toast.attrs.updateFailed": "Échec de la mise à jour", - "toast.attrs.deleteFailed": "Échec de la suppression", + "toast.support.loadFailed": "Échec du chargement des tickets de support", + "toast.support.loadTicketFailed": "Échec du chargement du ticket", + "toast.support.replyFailed": "Impossible d’envoyer la réponse", + "toast.support.ratingUnavailable": "Évaluation indisponible", + "toast.support.alreadyRated": "Déjà noté", + "toast.support.ratingFailed": "Impossible d’envoyer l’évaluation", + "toast.structured.fieldAdded": "Champ ajouté", + "toast.structured.fieldAddedBody": "Le champ de description structurée a été ajouté.", + "toast.structured.fieldDeleted": "Champ supprimé", + "toast.structured.fieldDeletedBody": "Le champ de description structurée a été supprimé.", + "toast.structured.addFailed": "Échec de l’ajout du champ", + "toast.structured.deleteFailed": "Échec de la suppression du champ", + "toast.brand.saved": "Kit de marque enregistré", + "toast.brand.logoUploaded": "Logo téléversé", + "toast.brand.saveFailed": "Échec de l’enregistrement du kit de marque", + "toast.brand.uploadFailed": "Échec du téléversement du logo", + "toast.vector.indexCreated": "Index vectoriel créé avec succès", + "toast.vector.dbInitialized": "Base de données vectorielle initialisée avec succès", + "toast.vector.indexFailed": "Échec de la création de l’index vectoriel", + "toast.vector.initFailed": "Échec de l’initialisation de la base vectorielle", + "toast.vector.searchFailed": "Échec de la recherche de catégories", + "toast.export.refreshFailed": "Échec de l'actualisation du feed", + "toast.mapping.loadFailed": "Échec du chargement du mapping du feed", + "toast.mapping.extractFailed": "Échec de l’extraction du schéma", + "toast.mapping.saveFailed": "Échec de l’enregistrement des mappages", + "toast.mapping.sampleFailed": "Échec de la synchro + traitement de l’échantillon", + "toast.attrs.createFailed": "Échec de la création", + "toast.attrs.importFailed": "Échec de l'import", + "toast.attrs.updateFailed": "Échec de la mise à jour", + "toast.attrs.deleteFailed": "Échec de la suppression", "toast.switcher.loadUsersFailed": "Impossible de charger les utilisateurs commutables", - "toast.switcher.switchFailed": "Impossible de changer d’utilisateur", - "toast.switcher.returnFailed": "Impossible de revenir à l’utilisateur d’origine", - "toast.switcher.companyFailed": "Impossible de changer d’entreprise", - "toast.requestFailed": "Échec de la requête", - "flash.campaign.unavailableDraft": "Les campagnes ne sont pas disponibles. Les brouillons ne peuvent pas être enregistrés tant que la fonctionnalité n’est pas en ligne.", + "toast.switcher.switchFailed": "Impossible de changer d’utilisateur", + "toast.switcher.returnFailed": "Impossible de revenir à l’utilisateur d’origine", + "toast.switcher.companyFailed": "Impossible de changer d’entreprise", + "toast.requestFailed": "Échec de la requête", + "flash.campaign.unavailableDraft": "Les campagnes ne sont pas disponibles. Les brouillons ne peuvent pas être enregistrés tant que la fonctionnalité n’est pas en ligne.", "flash.campaign.testEmailRequired": "Saisissez une adresse e-mail de test", "flash.campaign.scheduleRequired": "Choisissez une date et une heure", "flash.campaign.unavailable": "Les campagnes ne sont pas disponibles pour le moment.", - "flash.campaign.generateFailed": "Échec de la génération", - "flash.campaign.testFailed": "Échec de l’envoi de test", - "flash.campaign.scheduleFailed": "Échec de la planification", - "flash.campaign.saveFailed": "Échec de l'enregistrement", + "flash.campaign.generateFailed": "Échec de la génération", + "flash.campaign.testFailed": "Échec de l’envoi de test", + "flash.campaign.scheduleFailed": "Échec de la planification", + "flash.campaign.saveFailed": "Échec de l'enregistrement", "flash.feed.copyFailed": "Impossible de copier l'URL", "flash.feed.csvRequired": "Veuillez choisir un fichier .csv.", "flash.feed.csvFileRequired": "Veuillez choisir un fichier CSV.", - "flash.feed.urlRequired": "L’URL du feed est obligatoire.", - "flash.feed.updated": "Feed mis à jour.", - "flash.feed.syncFinishedNamed": "Synchronisation terminée pour « {name} » ({status} : {products}).", - "flash.feed.deleted": "Feed supprimé.", - "flash.feed.createFailed": "Impossible de créer le feed", - "flash.feed.updateFailed": "Impossible de mettre à jour le feed", + "flash.feed.urlRequired": "L’URL du feed est obligatoire.", + "flash.feed.updated": "Feed mis à jour.", + "flash.feed.syncFinishedNamed": "Synchronisation terminée pour « {name} » ({status} : {products}).", + "flash.feed.deleted": "Feed supprimé.", + "flash.feed.createFailed": "Impossible de créer le feed", + "flash.feed.updateFailed": "Impossible de mettre à jour le feed", "flash.settings.companyNameRequired": "Saisissez un nom d'entreprise.", - "flash.settings.companySaved": "Paramètres de l'entreprise enregistrés.", - "flash.settings.companyFailed": "Impossible de mettre à jour l'entreprise", - "flash.settings.mergeFailed": "Impossible de mettre à jour le paramètre de fusion", - "flash.settings.apiKeyNameRequired": "Saisissez un nom pour cette clé API.", - "flash.settings.apiKeyCreatedFailed": "Impossible de créer la clé API", - "flash.settings.apiKeyRevoked": "Clé API révoquée.", - "flash.settings.apiKeyRevokeFailed": "Impossible de révoquer la clé API", - "flash.settings.copyFailed": "Impossible de copier. Sélectionnez le texte et copiez-le manuellement.", - "flash.products.accepted": "{count} produit(s) accepté(s) — déplacés vers Traités.", - "flash.products.updated": "Produit mis à jour.", - "flash.products.enrichmentAccepted": "Enrichissement accepté — déplacé vers Traités.", - "flash.products.originalEmpty": "La valeur d'origine est vide ; l'enrichissement ne peut pas être effacé via PATCH.", - "flash.products.selectExport": "Sélectionnez au moins un produit à exporter.", - "flash.products.exported": "{count} produit(s) exporté(s) via le feed d’export.", + "flash.settings.companySaved": "Paramètres de l'entreprise enregistrés.", + "flash.settings.companyFailed": "Impossible de mettre à jour l'entreprise", + "flash.settings.mergeFailed": "Impossible de mettre à jour le paramètre de fusion", + "flash.settings.apiKeyNameRequired": "Saisissez un nom pour cette clé API.", + "flash.settings.apiKeyCreatedFailed": "Impossible de créer la clé API", + "flash.settings.apiKeyRevoked": "Clé API révoquée.", + "flash.settings.apiKeyRevokeFailed": "Impossible de révoquer la clé API", + "flash.settings.copyFailed": "Impossible de copier. Sélectionnez le texte et copiez-le manuellement.", + "flash.products.accepted": "{count} produit(s) accepté(s) — déplacés vers Traités.", + "flash.products.updated": "Produit mis à jour.", + "flash.products.enrichmentAccepted": "Enrichissement accepté — déplacé vers Traités.", + "flash.products.originalEmpty": "La valeur d'origine est vide ; l'enrichissement ne peut pas être effacé via PATCH.", + "flash.products.selectExport": "Sélectionnez au moins un produit à exporter.", + "flash.products.exported": "{count} produit(s) exporté(s) via le feed d’export.", "flash.support.missingId": "Identifiant de ticket manquant", "flash.support.notFound": "Ticket introuvable", "flash.support.unavailable": "Le support est temporairement indisponible.", - "flash.support.ratingUnavailable": "L’évaluation est temporairement indisponible. Réessayez plus tard.", - "flash.support.alreadyRated": "Vous avez déjà évalué ce ticket.", - "flash.support.queueUnavailable": "La file de support n’est pas disponible sur ce déploiement.", - "flash.support.deploymentUnavailable": "Le support n'est pas disponible sur ce déploiement.", - "flash.support.replyRequired": "Le corps de la réponse est obligatoire.", + "flash.support.ratingUnavailable": "L’évaluation est temporairement indisponible. Réessayez plus tard.", + "flash.support.alreadyRated": "Vous avez déjà évalué ce ticket.", + "flash.support.queueUnavailable": "La file de support n’est pas disponible sur ce déploiement.", + "flash.support.deploymentUnavailable": "Le support n'est pas disponible sur ce déploiement.", + "flash.support.replyRequired": "Le corps de la réponse est obligatoire.", "flash.support.draftRequired": "Le corps du brouillon est obligatoire avant approbation.", "flash.support.claimed": "Ticket pris en charge.", - "flash.support.unassigned": "Ticket non assigné.", - "flash.support.assigneeCleared": "Assigné effacé.", - "flash.support.assigneeUpdated": "Assigné mis à jour.", - "flash.support.draftApproved": "Brouillon IA approuvé et envoyé au client.", - "flash.support.draftSent": "Brouillon envoyé comme réponse du personnel.", - "flash.support.draftDiscarded": "Brouillon IA ignoré. Ticket remis à la file humaine.", - "flash.support.autoReplyDisabled": "Réponse auto désactivée (brouillon conservé comme note interne).", - "flash.structured.keyRequired": "La clé du champ est obligatoire", - "flash.category.nameRequired": "Le nom et l’ID unique sont obligatoires.", - "flash.category.textEmpty": "Le texte ne peut pas être vide", - "flash.export.noConfigs": "Aucun feed d'export pour l'instant. Créez-en un sous Feeds d'export, puis revenez exporter votre sélection.", - "flash.export.selectFormat": "Veuillez sélectionner un feed d'export.", - "flash.files.deleted": "Upload suppressé.", - "flash.mapping.noSuggestions": "Aucune suggestion — vérifiez les noms de champs source.", - "flash.mapping.allMapped": "Toutes les suggestions sont déjà mappées. Vérifiez les pastilles de confiance dans le tableau.", - "flash.mapping.extractFirst": "Aucune suggestion — extrayez d’abord le schéma.", - "flash.mapping.pathRequired": "Saisissez un chemin d’élément produit avant de mapper les champs.", - "flash.billing.checkoutCanceled": "Checkout a été annulé. Aucune modification n'a été effectuée.", - "flash.billing.portalReturn": "Retour du portail de facturation. Gérez votre plan ici ou dans Plans.", - "flash.billing.invalidAmount": "Veuillez saisir un montant de crédits valide.", + "flash.support.unassigned": "Ticket non assigné.", + "flash.support.assigneeCleared": "Assigné effacé.", + "flash.support.assigneeUpdated": "Assigné mis à jour.", + "flash.support.draftApproved": "Brouillon IA approuvé et envoyé au client.", + "flash.support.draftSent": "Brouillon envoyé comme réponse du personnel.", + "flash.support.draftDiscarded": "Brouillon IA ignoré. Ticket remis à la file humaine.", + "flash.support.autoReplyDisabled": "Réponse auto désactivée (brouillon conservé comme note interne).", + "flash.structured.keyRequired": "La clé du champ est obligatoire", + "flash.category.nameRequired": "Le nom et l’ID unique sont obligatoires.", + "flash.category.textEmpty": "Le texte ne peut pas être vide", + "flash.export.noConfigs": "Aucun feed d'export pour l'instant. Créez-en un sous Feeds d'export, puis revenez exporter votre sélection.", + "flash.export.selectFormat": "Veuillez sélectionner un feed d'export.", + "flash.files.deleted": "Upload suppressé.", + "flash.mapping.noSuggestions": "Aucune suggestion — vérifiez les noms de champs source.", + "flash.mapping.allMapped": "Toutes les suggestions sont déjà mappées. Vérifiez les pastilles de confiance dans le tableau.", + "flash.mapping.extractFirst": "Aucune suggestion — extrayez d’abord le schéma.", + "flash.mapping.pathRequired": "Saisissez un chemin d’élément produit avant de mapper les champs.", + "flash.billing.checkoutCanceled": "Checkout a été annulé. Aucune modification n'a été effectuée.", + "flash.billing.portalReturn": "Retour du portail de facturation. Gérez votre plan ici ou dans Plans.", + "flash.billing.invalidAmount": "Veuillez saisir un montant de crédits valide.", "flash.billing.companyNotFound": "Entreprise introuvable.", - "flash.billing.creditsAdded": "{amount} crédits ont été ajoutés.", - "flash.unsubscribe.missingToken": "Jeton de désabonnement manquant.", - "flash.unsubscribe.loadFailed": "Impossible de charger le statut de désabonnement.", - "flash.unsubscribe.failed": "Échec du désabonnement.", - "flash.seo.filledMeta": "Méta remplie pour « {label} » ({mode}).", - "flash.shopify.saved": "Paramètres Shopify enregistrés.", - "flash.woo.saved": "Paramètres WooCommerce enregistrés.", - "flash.woo.syncSaved": "Paramètres de synchronisation enregistrés.", - "flash.woo.autoCategories": "{count} catégories mappées automatiquement.", - "flash.woo.autoAttributes": "{count} attributs mappés automatiquement.", - "flash.ai.promptsSaved": "Modèles de prompt enregistrés. Ils s’appliquent au prochain run IA.", - "flash.ai.promptRestored": "Prompt par défaut intégré restauré.", + "flash.billing.creditsAdded": "{amount} crédits ont été ajoutés.", + "flash.unsubscribe.missingToken": "Jeton de désabonnement manquant.", + "flash.unsubscribe.loadFailed": "Impossible de charger le statut de désabonnement.", + "flash.unsubscribe.failed": "Échec du désabonnement.", + "flash.seo.filledMeta": "Méta remplie pour « {label} » ({mode}).", + "flash.shopify.saved": "Paramètres Shopify enregistrés.", + "flash.woo.saved": "Paramètres WooCommerce enregistrés.", + "flash.woo.syncSaved": "Paramètres de synchronisation enregistrés.", + "flash.woo.autoCategories": "{count} catégories mappées automatiquement.", + "flash.woo.autoAttributes": "{count} attributs mappés automatiquement.", + "flash.ai.promptsSaved": "Modèles de prompt enregistrés. Ils s’appliquent au prochain run IA.", + "flash.ai.promptRestored": "Prompt par défaut intégré restauré.", "flash.ai.connectionOk": "Connexion OK ({detail}).", - "flash.ai.connectionByok": ", votre propre clé", - "flash.email.saved": "Fournisseur e-mail enregistré. Vérifiez le domaine, puis envoyez un test.", - "flash.email.testDryRun": "Test enregistré en mode simulation — aucun e-mail envoyé.", - "flash.email.testSent": "E-mail de test envoyé. L’adresse d’expédition est marquée vérifiée en cas de succès.", - "flash.fields.apiUnavailable": "L'API des champs standard n'est pas disponible. Les modifications ne peuvent pas être enregistrées.", - "flash.fields.updated": "Champ mis à jour avec succès", - "flash.fields.created": "Champ créé avec succès", - "flash.fields.enabledRecommended": "Champs e-commerce recommandés activés", - "flash.fields.deleted": "Champ supprimé avec succès", - "flash.fields.groupUpdated": "Groupe mis à jour avec succès", - "flash.fields.groupCreated": "Groupe créé avec succès", - "flash.fields.groupDeleted": "Groupe supprimé avec succès", - "flash.processing.cancelled": "« {name} » a été annulé.", - "flash.processing.retried": "« {name} » mis en file pour nouvel essai.", - "flash.admin.staffRoleUpdated": "Rôle du personnel mis à jour pour {email}.", - "flash.admin.staffRoleUnavailable": "Les mises à jour de rôle personnel ne sont pas encore disponibles sur ce serveur.", - "flash.admin.catalogCloned": "{source} copié vers {dest} : {products} produits, {categories} catégories.", - "flash.admin.fixA1Success": "Réparation du catalogue pour {name} terminée : {prompts} prompts mis à jour, {hashes} hashes effacés, {categories} catégories complétées.", - "flash.admin.fixA1Error": "Échec de la réparation du catalogue pour {name}.", - "flash.admin.planAssigned": "Offre assignée à {name}.", - "flash.admin.planAssignedShort": "Offre assignée.", - "flash.admin.creditsUpdated": "Crédits mis à jour.", - "flash.admin.cyclesProcessed": "Cycles de facturation traités : {count}", - "flash.admin.invitesSummary": "Invitations de définition de mot de passe : {parts}. Livraison e-mail : {smtp}.", - "flash.admin.smtpOn": "activé", - "flash.admin.smtpOff": "désactivé", - "flash.admin.localPasswordSet": "Mot de passe local défini pour {email}.", + "flash.ai.connectionByok": ", votre propre clé", + "flash.email.saved": "Fournisseur e-mail enregistré. Vérifiez le domaine, puis envoyez un test.", + "flash.email.testDryRun": "Test enregistré en mode simulation — aucun e-mail envoyé.", + "flash.email.testSent": "E-mail de test envoyé. L’adresse d’expédition est marquée vérifiée en cas de succès.", + "flash.fields.apiUnavailable": "L'API des champs standard n'est pas disponible. Les modifications ne peuvent pas être enregistrées.", + "flash.fields.updated": "Champ mis à jour avec succès", + "flash.fields.created": "Champ créé avec succès", + "flash.fields.enabledRecommended": "Champs e-commerce recommandés activés", + "flash.fields.deleted": "Champ supprimé avec succès", + "flash.fields.groupUpdated": "Groupe mis à jour avec succès", + "flash.fields.groupCreated": "Groupe créé avec succès", + "flash.fields.groupDeleted": "Groupe supprimé avec succès", + "flash.processing.cancelled": "« {name} » a été annulé.", + "flash.processing.retried": "« {name} » mis en file pour nouvel essai.", + "flash.admin.staffRoleUpdated": "Rôle du personnel mis à jour pour {email}.", + "flash.admin.staffRoleUnavailable": "Les mises à jour de rôle personnel ne sont pas encore disponibles sur ce serveur.", + "flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.", + "flash.admin.fixA1Success": "Catalog repair finished for {name}: {prompts} prompts, {hashes} hashes, {categories} processed←mapped, {mapped_backfilled} mapped←processed. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).", + "flash.admin.fixA1Error": "Échec de la réparation du catalogue pour {name}.", + "flash.admin.cloneDestMissing": "No sandbox destination. Switch to Platform Demo (staff home), then clone again.", + "flash.admin.planAssigned": "Offre assignée à {name}.", + "flash.admin.planAssignedShort": "Offre assignée.", + "flash.admin.creditsUpdated": "Crédits mis à jour.", + "flash.admin.cyclesProcessed": "Cycles de facturation traités : {count}", + "flash.admin.invitesSummary": "Invitations de définition de mot de passe : {parts}. Livraison e-mail : {smtp}.", + "flash.admin.smtpOn": "activé", + "flash.admin.smtpOff": "désactivé", + "flash.admin.localPasswordSet": "Mot de passe local défini pour {email}.", "flash.admin.localPasswordUnavailable": "Les outils de mot de passe local ne sont pas disponibles dans cet environnement.", - "flash.admin.switchedUser": "Utilisateur changé. Rechargement…", - "flash.admin.switchUnavailable": "Le changement d’utilisateur n’est pas disponible dans cet environnement.", + "flash.admin.switchedUser": "Utilisateur changé. Rechargement…", + "flash.admin.switchUnavailable": "Le changement d’utilisateur n’est pas disponible dans cet environnement.", "flash.admin.diagnosticsRateLimit": "Limite de diagnostics atteinte (20/min). Attendez une minute et actualisez.", - "flash.admin.smtpSaved": "Paramètres SMTP de la plateforme enregistrés. Les mots de passe restent masqués.", - "flash.admin.integrationSaved": "Paramètres d’intégration enregistrés. Les champs secrets ne sont jamais réaffichés en entier.", - "flash.admin.aiSaved": "Paramètres IA {label} enregistrés. Les clés API ne sont plus jamais affichées.", - "flash.admin.cleanup": "Nettoyage : {jobs} tâches en échec, {products} produits réinitialisés.", - "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", + "flash.admin.smtpSaved": "Paramètres SMTP de la plateforme enregistrés. Les mots de passe restent masqués.", + "flash.admin.integrationSaved": "Paramètres d’intégration enregistrés. Les champs secrets ne sont jamais réaffichés en entier.", + "flash.admin.aiSaved": "Paramètres IA {label} enregistrés. Les clés API ne sont plus jamais affichées.", + "flash.admin.cleanup": "Nettoyage : {jobs} tâches en échec, {products} produits réinitialisés.", + "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", "flash.admin.orphanDeleted": "Deleted {deleted} orphan row(s). Remaining: {remaining}.", - "flash.admin.articleUpdated": "Article mis à jour.", - "flash.admin.articleCreated": "Article créé.", - "flash.admin.templateUpdated": "Modèle mis à jour.", - "flash.admin.templateCreated": "Modèle créé.", - "flash.admin.articleDeleted": "Article supprimé.", - "flash.admin.templateDeleted": "Modèle supprimé.", - "flash.admin.autoReplySaved": "Paramètres de réponse automatique enregistrés.", - "flash.admin.imageUploaded": "Image téléversée et insérée dans le markdown.", - "flash.admin.translationsSaved": "{count} chaîne(s) enregistrée(s) pour {locale}. Commitez le pack de messages quand prêt.", - "flash.admin.featuresUpdated": "{key} mis à jour.", - "flash.admin.featuresAllOn": "Toutes les fonctionnalités activées pour cette offre.", - "flash.admin.featuresAllOff": "Toutes les fonctionnalités désactivées pour cette offre.", - "flash.admin.profileApplied": "Profil {label} appliqué à {name}.", - "flash.admin.overridesCleared": "Overrides effacés — utilisation des valeurs par défaut du nom d’offre.", - "empty.plans.none": "Aucune offre trouvée.", - "empty.plans.noMatch": "Aucune offre ne correspond à ce filtre.", - "empty.plans.selectPackage": "Sélectionnez un forfait pour modifier les fonctionnalités.", + "flash.admin.articleUpdated": "Article mis à jour.", + "flash.admin.articleCreated": "Article créé.", + "flash.admin.templateUpdated": "Modèle mis à jour.", + "flash.admin.templateCreated": "Modèle créé.", + "flash.admin.articleDeleted": "Article supprimé.", + "flash.admin.templateDeleted": "Modèle supprimé.", + "flash.admin.autoReplySaved": "Paramètres de réponse automatique enregistrés.", + "flash.admin.imageUploaded": "Image téléversée et insérée dans le markdown.", + "flash.admin.translationsSaved": "{count} chaîne(s) enregistrée(s) pour {locale}. Commitez le pack de messages quand prêt.", + "flash.admin.featuresUpdated": "{key} mis à jour.", + "flash.admin.featuresAllOn": "Toutes les fonctionnalités activées pour cette offre.", + "flash.admin.featuresAllOff": "Toutes les fonctionnalités désactivées pour cette offre.", + "flash.admin.profileApplied": "Profil {label} appliqué à {name}.", + "flash.admin.overridesCleared": "Overrides effacés — utilisation des valeurs par défaut du nom d’offre.", + "empty.plans.none": "Aucune offre trouvée.", + "empty.plans.noMatch": "Aucune offre ne correspond à ce filtre.", + "empty.plans.selectPackage": "Sélectionnez un forfait pour modifier les fonctionnalités.", "empty.products.processingTitle": "Aucun produit en cours de traitement", - "empty.products.processingMessageCan": "La progression en direct est sur Traitement. Ouvrez une tâche en cours pour voir le statut des étapes ; cet onglet listera les produits en cours lorsque le filtrage par éléments sera disponible.", - "empty.products.processingMessageCannot": "Les produits actuellement dans une tâche apparaissent ici une fois le traitement démarré depuis le catalogue.", - "empty.products.reviewTitle": "Aucun produit nécessitant une révision", - "empty.products.reviewMessage": "Après une tâche, les produits enrichis arrivent ici. Ouvrez une ligne pour comparer original vs enrichi, puis Accepter, modifier ou Rejeter.", + "empty.products.processingMessageCan": "La progression en direct est sur Traitement. Ouvrez une tâche en cours pour voir le statut des étapes ; cet onglet listera les produits en cours lorsque le filtrage par éléments sera disponible.", + "empty.products.processingMessageCannot": "Les produits actuellement dans une tâche apparaissent ici une fois le traitement démarré depuis le catalogue.", + "empty.products.reviewTitle": "Aucun produit nécessitant une révision", + "empty.products.reviewMessage": "Après une tâche, les produits enrichis arrivent ici. Ouvrez une ligne pour comparer original vs enrichi, puis Accepter, modifier ou Rejeter.", "empty.products.errorTitle": "Aucun produit avec erreurs", - "empty.products.errorMessage": "Lorsqu’une tâche échoue pour un produit, il apparaît ici pour que vous puissiez réessayer.", - "empty.products.filterTitleUnprocessed": "Aucune correspondance non traitée", + "empty.products.errorMessage": "Lorsqu’une tâche échoue pour un produit, il apparaît ici pour que vous puissiez réessayer.", + "empty.products.filterTitleUnprocessed": "Aucune correspondance non traitée", "empty.products.filterTitle": "Aucun produit ne correspond", - "empty.products.filterMessage": "Essayez une autre recherche, catégorie ou feed — ou effacez les filtres pour tout voir.", - "empty.products.unprocessedTitle": "Pas encore de produits non traités", - "empty.products.unprocessedMessage": "Connectez un feed fournisseur ou téléversez un CSV pour importer des produits.", + "empty.products.filterMessage": "Essayez une autre recherche, catégorie ou feed — ou effacez les filtres pour tout voir.", + "empty.products.unprocessedTitle": "Pas encore de produits non traités", + "empty.products.unprocessedMessage": "Connectez un feed fournisseur ou téléversez un CSV pour importer des produits.", "empty.products.noneTitle": "Pas encore de produits", - "empty.products.noneMessageStores": "Importez depuis un feed ou une boutique, puis démarrez un traitement pour construire le catalogue.", - "empty.products.noneMessage": "Importez depuis un feed ou téléversez un CSV, puis démarrez un traitement.", - "empty.products.viewJobs": "Voir les tâches", - "empty.products.startJob": "Démarrer une tâche", + "empty.products.noneMessageStores": "Importez depuis un feed ou une boutique, puis démarrez un traitement pour construire le catalogue.", + "empty.products.noneMessage": "Importez depuis un feed ou téléversez un CSV, puis démarrez un traitement.", + "empty.products.viewJobs": "Voir les tâches", + "empty.products.startJob": "Démarrer une tâche", "empty.products.clearFilters": "Effacer les filtres", - "empty.products.viewProcessed": "Voir les traités", - "empty.products.retryCatalog": "Réessayer depuis le catalogue", + "empty.products.viewProcessed": "Voir les traités", + "empty.products.retryCatalog": "Réessayer depuis le catalogue", "empty.products.connectFeed": "Connecter un feed", "empty.products.addProduct": "Ajouter un produit", - "empty.products.uploadCsv": "Téléverser CSV", + "empty.products.uploadCsv": "Téléverser CSV", "empty.feeds.noneTitle": "Pas encore de feeds produits", - "empty.feeds.noneMessage": "Connectez une URL CSV/XML fournisseur ou téléversez un fichier. Ensuite : Map → Sync → Process.", + "empty.feeds.noneMessage": "Connectez une URL CSV/XML fournisseur ou téléversez un fichier. Ensuite : Map → Sync → Process.", "empty.feeds.noMatchTitle": "Aucun feed correspondant", "empty.feeds.noMatchMessage": "Essayez un autre terme de recherche, ou effacez la recherche pour voir tous les feeds.", - "empty.export.loadFailedTitle": "Impossible de charger les feeds d’export", - "empty.export.loadFailedMessage": "Une erreur s'est produite lors du chargement de vos exports. Réessayez ou consultez l'erreur ci-dessus pour plus de détails.", + "empty.export.loadFailedTitle": "Impossible de charger les feeds d’export", + "empty.export.loadFailedMessage": "Une erreur s'est produite lors du chargement de vos exports. Réessayez ou consultez l'erreur ci-dessus pour plus de détails.", "empty.export.noneTitle": "Pas encore de feeds d'export", - "empty.export.noneMessage": "Créez un feed Google Shopping, Meta ou CSV/XML personnalisé pour choisir quels produits et champs sortir. Générez une URL publique pour Merchant Center ou tout partenaire — ou exportez une sous-sélection depuis Produits.", + "empty.export.noneMessage": "Créez un feed Google Shopping, Meta ou CSV/XML personnalisé pour choisir quels produits et champs sortir. Générez une URL publique pour Merchant Center ou tout partenaire — ou exportez une sous-sélection depuis Produits.", "empty.export.noMatchTitle": "Aucun feed correspondant", "empty.export.noMatchMessage": "Essayez un autre terme de recherche.", - "empty.files.noneTitle": "Aucun upload pour l’instant", - "empty.files.noneMessage": "Les imports CSV (produits, catégories, attributs) apparaissent ici après upload. Après une migration plateforme, les contenus de fichiers (blobs) n’ont pas été copiés — ré-uploadez-les si besoin.", - "empty.files.uploadCta": "Téléverser un CSV", + "empty.files.noneTitle": "Aucun upload pour l’instant", + "empty.files.noneMessage": "Les imports CSV (produits, catégories, attributs) apparaissent ici après upload. Après une migration plateforme, les contenus de fichiers (blobs) n’ont pas été copiés — ré-uploadez-les si besoin.", + "empty.files.uploadCta": "Téléverser un CSV", "empty.export.fromProductsCta": "Exporter depuis Produits", - "empty.dashboard.noJobsTitle": "Aucun job récent", - "empty.dashboard.noJobsMessage": "Les jobs apparaissent ici après un démarrage depuis Produits. Enrichissez titres et descriptions avant d’exporter.", - "empty.stores.noneTitle": "Aucune boutique connectée", + "empty.dashboard.noJobsTitle": "Aucun job récent", + "empty.dashboard.noJobsMessage": "Les jobs apparaissent ici après un démarrage depuis Produits. Enrichissez titres et descriptions avant d’exporter.", + "empty.stores.noneTitle": "Aucune boutique connectée", "empty.stores.noneMessage": "Connectez WooCommerce ou Shopify pour synchroniser catalogue et commandes. Fichier fournisseur ? Utilisez une URL de flux ou un CSV.", - "empty.stores.noneTitleMember": "Aucune boutique connectée", - "empty.stores.noneMessageMember": "Seuls les admins de l'entreprise peuvent connecter WooCommerce ou Shopify. Demandez de l'aide à un admin, ou utilisez Feed URL/CSV si votre rôle le permet.", - "empty.woo.openConnection": "Ouvrir les paramètres de connexion", - "empty.shopify.openConnection": "Ouvrir les paramètres de connexion", + "empty.stores.noneTitleMember": "Aucune boutique connectée", + "empty.stores.noneMessageMember": "Seuls les admins de l'entreprise peuvent connecter WooCommerce ou Shopify. Demandez de l'aide à un admin, ou utilisez Feed URL/CSV si votre rôle le permet.", + "empty.woo.openConnection": "Ouvrir les paramètres de connexion", + "empty.shopify.openConnection": "Ouvrir les paramètres de connexion", "empty.processing.noneTitle": "Aucun job pour l'instant", - "empty.processing.noneMessage": "Démarrez un job depuis Produits quand vous êtes prêt. La progression et l'historique apparaîtront ici.", + "empty.processing.noneMessage": "Démarrez un job depuis Produits quand vous êtes prêt. La progression et l'historique apparaîtront ici.", "empty.campaigns.unavailableTitle": "Campagnes indisponibles", - "empty.campaigns.unavailableMessage": "Le service campagnes est injoignable. Vous pouvez ouvrir l’assistant, mais générer et envoyer attendront le retour du service.", - "empty.calendar.noneTitle": "Aucun préréglage saisonnier", - "empty.calendar.noneMessage": "Les préréglages du calendrier apparaîtront ici lorsque l’API marketing sera disponible.", - "empty.seo.noneTitle": "Aucun catalogue à scorer", - "empty.seo.noneMessage": "Traitez des produits ou ajoutez d’abord des catégories. Les scores SEO apparaissent dès qu’il y a des données catalogue.", - "empty.vector.unavailableTitle": "Catégories vectorielles indisponibles", - "empty.vector.noMatchTitle": "Aucune correspondance pour l’instant", + "empty.campaigns.unavailableMessage": "Le service campagnes est injoignable. Vous pouvez ouvrir l’assistant, mais générer et envoyer attendront le retour du service.", + "empty.calendar.noneTitle": "Aucun préréglage saisonnier", + "empty.calendar.noneMessage": "Les préréglages du calendrier apparaîtront ici lorsque l’API marketing sera disponible.", + "empty.seo.noneTitle": "Aucun catalogue à scorer", + "empty.seo.noneMessage": "Traitez des produits ou ajoutez d’abord des catégories. Les scores SEO apparaissent dès qu’il y a des données catalogue.", + "empty.vector.unavailableTitle": "Catégories vectorielles indisponibles", + "empty.vector.noMatchTitle": "Aucune correspondance pour l’instant", "empty.vector.noMatchMessage": "Saisissez une description produit et recherchez pour voir les correspondances vectorielles.", - "empty.structured.unavailableTitle": "Descriptions structurées indisponibles", - "empty.structured.unavailableMessage": "Cette API n’est pas encore sur ce backend. Vous ne pouvez pas gérer les champs Export ID ici tant que /api/structured-descriptions n’est pas branchée.", - "empty.structured.noneTitle": "Aucun champ de description structurée pour l’instant", - "empty.structured.noneMessage": "Ajoutez un champ ici, ou créez des Export ID dans une formule de description de catégorie — ils apparaîtront pour les feeds d’export.", + "empty.structured.unavailableTitle": "Descriptions structurées indisponibles", + "empty.structured.unavailableMessage": "Cette API n’est pas encore sur ce backend. Vous ne pouvez pas gérer les champs Export ID ici tant que /api/structured-descriptions n’est pas branchée.", + "empty.structured.noneTitle": "Aucun champ de description structurée pour l’instant", + "empty.structured.noneMessage": "Ajoutez un champ ici, ou créez des Export ID dans une formule de description de catégorie — ils apparaîtront pour les feeds d’export.", "empty.support.unavailableTitle": "Support indisponible", - "empty.support.noneTitle": "Aucun ticket pour l’instant", - "empty.support.unavailableMessage": "L’API support est injoignable. Réessayez sous peu, ou ouvrez un nouveau ticket une fois le service disponible.", - "empty.support.filterMessage": "Aucun ticket ne correspond à ce statut. Essayez un autre filtre ou créez un ticket.", - "empty.support.noneMessage": "Décrivez votre problème ; notre équipe répondra dans ce fil. Vous recevrez aussi une notification in-app lorsque le personnel répond.", - "empty.support.createTicket": "Créer un ticket", + "empty.support.noneTitle": "Aucun ticket pour l’instant", + "empty.support.unavailableMessage": "L’API support est injoignable. Réessayez sous peu, ou ouvrez un nouveau ticket une fois le service disponible.", + "empty.support.filterMessage": "Aucun ticket ne correspond à ce statut. Essayez un autre filtre ou créez un ticket.", + "empty.support.noneMessage": "Décrivez votre problème ; notre équipe répondra dans ce fil. Vous recevrez aussi une notification in-app lorsque le personnel répond.", + "empty.support.createTicket": "Créer un ticket", "empty.support.clearFilter": "Effacer le filtre", "empty.support.ticketNotFoundTitle": "Ticket introuvable", - "empty.support.ticketNotFoundMessage": "Ce ticket a peut-être été supprimé ou vous n’y avez pas accès.", + "empty.support.ticketNotFoundMessage": "Ce ticket a peut-être été supprimé ou vous n’y avez pas accès.", "empty.support.noMessagesTitle": "Aucun message", - "empty.support.noMessagesMessage": "Ce fil n’a pas encore de messages.", - "empty.settings.noApiKeysTitle": "Pas encore de clés API", + "empty.support.noMessagesMessage": "Ce fil n’a pas encore de messages.", + "empty.settings.noApiKeysTitle": "Pas encore de clés API", "empty.shopify.noOrdersTitle": "Pas encore de commandes", - "empty.shopify.noOrdersMessage": "Les commandes apparaissent après connexion Shopify et un import commandes. Les listes vides sont normales jusqu’au premier sync.", + "empty.shopify.noOrdersMessage": "Les commandes apparaissent après connexion Shopify et un import commandes. Les listes vides sont normales jusqu’au premier sync.", "empty.woo.noOrdersTitle": "Pas encore de commandes", - "empty.woo.noOrdersMessage": "Les commandes apparaissent après connexion WooCommerce et une sync commandes. Les listes vides sont normales jusqu’au premier sync.", - "empty.woo.noReviewsTitle": "Aucun avis pour l’instant", - "empty.woo.noReviewsMessage": "Les avis apparaissent après une mise en file d’import depuis une boutique connectée. Cet onglet reste utilisable avec une liste vide.", + "empty.woo.noOrdersMessage": "Les commandes apparaissent après connexion WooCommerce et une sync commandes. Les listes vides sont normales jusqu’au premier sync.", + "empty.woo.noReviewsTitle": "Aucun avis pour l’instant", + "empty.woo.noReviewsMessage": "Les avis apparaissent après une mise en file d’import depuis une boutique connectée. Cet onglet reste utilisable avec une liste vide.", "empty.admin.noProviderTitle": "Aucune ligne fournisseur", "empty.admin.noProviderMessage": "Les jetons apparaissent ici lorsque les produits enregistrent un type de fournisseur.", "empty.admin.noCompaniesTitle": "Aucune entreprise", "empty.admin.noCompaniesMessage": "La liste des entreprises est vide.", "empty.admin.noCyclesTitle": "Pas encore de cycles de facturation", - "empty.admin.noCyclesMessage": "Les cycles apparaissent après que les runs de facturation créent des lignes historiques.", - "empty.admin.noCompaniesFound": "Aucune entreprise trouvée.", - "empty.admin.noCompaniesMatch": "Aucune entreprise ne correspond à ce filtre.", - "empty.admin.notPlatformTitle": "Vous n'êtes pas admin plateforme", - "empty.admin.notPlatformMessage": "Votre compte est connecté mais n'est pas marqué admin plateforme. Demandez à un admin existant d'accorder l'accès, puis déconnectez-vous et reconnectez-vous.", - "empty.admin.noJobsFilter": "Aucune tâche pour ce filtre.", - "empty.admin.noAdminUsers": "Aucun utilisateur admin trouvé", - "empty.admin.noJobs": "Aucune tâche trouvée.", + "empty.admin.noCyclesMessage": "Les cycles apparaissent après que les runs de facturation créent des lignes historiques.", + "empty.admin.noCompaniesFound": "Aucune entreprise trouvée.", + "empty.admin.noCompaniesMatch": "Aucune entreprise ne correspond à ce filtre.", + "empty.admin.notPlatformTitle": "Vous n'êtes pas admin plateforme", + "empty.admin.notPlatformMessage": "Votre compte est connecté mais n'est pas marqué admin plateforme. Demandez à un admin existant d'accorder l'accès, puis déconnectez-vous et reconnectez-vous.", + "empty.admin.noJobsFilter": "Aucune tâche pour ce filtre.", + "empty.admin.noAdminUsers": "Aucun utilisateur admin trouvé", + "empty.admin.noJobs": "Aucune tâche trouvée.", "empty.admin.queueUnavailable": "La file de support n'est pas disponible. Contactez votre administrateur de plateforme si cela persiste.", "empty.admin.noTicketsQueue": "Aucun ticket dans cette file.", "empty.admin.knowledgeTitle": "Base de connaissances", - "empty.admin.knowledgeNotReadyTitle": "La base de connaissance support n'est pas prête", - "empty.admin.knowledgeNotReadyMessage": "Les articles et les paramètres de réponse auto ne sont pas encore configurés sur ce déploiement.", - "empty.admin.noTemplatesTitle": "Aucun modèle de réponse", - "empty.admin.noTemplatesMessage": "Les modèles sont appariés comme les articles et publiés comme réponses automatiques étiquetées.", + "empty.admin.knowledgeNotReadyTitle": "La base de connaissance support n'est pas prête", + "empty.admin.knowledgeNotReadyMessage": "Les articles et les paramètres de réponse auto ne sont pas encore configurés sur ce déploiement.", + "empty.admin.noTemplatesTitle": "Aucun modèle de réponse", + "empty.admin.noTemplatesMessage": "Les modèles sont appariés comme les articles et publiés comme réponses automatiques étiquetées.", "empty.admin.ticketNotFound": "Ticket introuvable.", - "empty.admin.supportUnavailable": "Le support n'est pas disponible sur ce déploiement.", + "empty.admin.supportUnavailable": "Le support n'est pas disponible sur ce déploiement.", "empty.admin.ticketLoadFailed": "Impossible de charger ce ticket.", "empty.admin.noMessages": "Pas encore de messages.", "empty.admin.translationsUnavailableTitle": "Traductions indisponibles", - "empty.admin.translationsUnavailableMessage": "L’endpoint du catalogue de traductions n’est pas disponible sur cette build.", - "empty.admin.noKeysMatchTitle": "Aucune clé ne correspond", - "empty.admin.noKeysMatchMessage": "Essayez un autre filtre ou recherche, ou actualisez après l’ajout de nouvelles clés en anglais.", - "empty.admin.noUsersMatch": "Aucun utilisateur ne correspond à ce filtre.", - "empty.admin.noCompaniesMatchFilter": "Aucune entreprise ne correspond à ce filtre.", - "blast.title": "Confirmer l’envoi groupé", - "blast.dryRunDescription": "Le mode simulation est actif — aucun e-mail réel ne quittera Descrybe. Confirmez pour enregistrer l’envoi simulé.", - "blast.liveDescription": "Cela enverra de vrais e-mails à votre audience. Tapez I understand pour continuer.", - "blast.recipients": "Destinataires dans cette requête : {count}", - "blast.typePhrase": "Tapez « I understand »", + "empty.admin.translationsUnavailableMessage": "L’endpoint du catalogue de traductions n’est pas disponible sur cette build.", + "empty.admin.noKeysMatchTitle": "Aucune clé ne correspond", + "empty.admin.noKeysMatchMessage": "Essayez un autre filtre ou recherche, ou actualisez après l’ajout de nouvelles clés en anglais.", + "empty.admin.noUsersMatch": "Aucun utilisateur ne correspond à ce filtre.", + "empty.admin.noCompaniesMatchFilter": "Aucune entreprise ne correspond à ce filtre.", + "blast.title": "Confirmer l’envoi groupé", + "blast.dryRunDescription": "Le mode simulation est actif — aucun e-mail réel ne quittera Descrybe. Confirmez pour enregistrer l’envoi simulé.", + "blast.liveDescription": "Cela enverra de vrais e-mails à votre audience. Tapez I understand pour continuer.", + "blast.recipients": "Destinataires dans cette requête : {count}", + "blast.typePhrase": "Tapez « I understand »", "blast.placeholder": "I understand", "blast.runDryRun": "Lancer la simulation", "blast.send": "Envoyer le blast", "marketing.footerBefore": "Les campagnes e-mail restent sur", - "marketing.footerAfter": "— cette page prépare seulement les feeds d'export catalogue.", + "marketing.footerAfter": "— cette page prépare seulement les feeds d'export catalogue.", "support.title": "Centre d'assistance", "support.description": "Ouvrir a ticket for facturation, bugs, or account help. Personnel replies show here and as in-app notifications.", "support.newTicket": "Nouveau ticket", - "support.createTicket": "Créer un ticket", - "support.loadingTickets": "Chargement tickets…", - "support.loadFailed": "Échec du chargement des tickets de support", + "support.createTicket": "Créer un ticket", + "support.loadingTickets": "Chargement tickets…", + "support.loadFailed": "Échec du chargement des tickets de support", "support.unavailableBanner": "Assistance is not fully disponible yet. You can still prepare a ticket; submitting may wait until the service is ready.", "support.yourTickets": "Vos tickets", "support.ticketCount": "{count} tickets", "support.ticketCountOne": "{count} ticket", - "support.statusFilterSuffix": "· statut {status}", + "support.statusFilterSuffix": "· statut {status}", "support.filterByStatus": "Filtrer by status", "support.unavailableTitle": "Support indisponible", - "support.emptyTitle": "Aucun ticket pour l’instant", - "support.unavailableEmpty": "L’API support est injoignable. Réessayez sous peu, ou ouvrez un nouveau ticket une fois le service disponible.", - "support.emptyFiltered": "Aucun ticket ne correspond à ce statut. Essayez un autre filtre ou créez un ticket.", - "support.emptyHelp": "Décrivez votre problème ; notre équipe répondra dans ce fil. Vous recevrez aussi une notification in-app lorsque le personnel répond.", + "support.emptyTitle": "Aucun ticket pour l’instant", + "support.unavailableEmpty": "L’API support est injoignable. Réessayez sous peu, ou ouvrez un nouveau ticket une fois le service disponible.", + "support.emptyFiltered": "Aucun ticket ne correspond à ce statut. Essayez un autre filtre ou créez un ticket.", + "support.emptyHelp": "Décrivez votre problème ; notre équipe répondra dans ce fil. Vous recevrez aussi une notification in-app lorsque le personnel répond.", "support.clearFilter": "Effacer le filtre", "support.table.subject": "Objet", - "support.table.category": "Catégorie", + "support.table.category": "Catégorie", "support.table.status": "Statut", - "support.table.priority": "Priorité", - "support.table.updated": "Mis à jour", + "support.table.priority": "Priorité", + "support.table.updated": "Mis à jour", "support.openTicketAria": "Ouvrir ticket {subject}", "support.status.all": "Tout", "support.status.open": "Ouvrir", "support.status.pending": "En attente", - "support.status.resolved": "Résolu", - "support.status.closed": "Fermé", + "support.status.resolved": "Résolu", + "support.status.closed": "Fermé", "support.new.title": "Nouveau ticket d'assistance", - "support.new.description": "Dites-nous de quoi vous avez besoin. Incluez étapes, messages d’erreur ou détails de facture si pertinent.", + "support.new.description": "Dites-nous de quoi vous avez besoin. Incluez étapes, messages d’erreur ou détails de facture si pertinent.", "support.new.back": "Retour to tickets", - "support.new.details": "Détails du ticket", + "support.new.details": "Détails du ticket", "support.new.detailsHelp": "Statut starts as open. You may get an automated answer first; a human teammate can take over anytime from the same thread.", "support.new.subject": "Objet", - "support.new.subjectPlaceholder": "Résumé court", - "support.new.category": "Catégorie", - "support.new.priority": "Priorité", + "support.new.subjectPlaceholder": "Résumé court", + "support.new.category": "Catégorie", + "support.new.priority": "Priorité", "support.new.optional": "Facultatif details", - "support.new.optionalHint": "(SKU, tags — aide au routage)", - "support.new.relatedSku": "SKU associé", + "support.new.optionalHint": "(SKU, tags — aide au routage)", + "support.new.relatedSku": "SKU associé", "support.new.relatedSkuPlaceholder": "p. ex. ABC-123", "support.new.relatedSkuHelp": "Produit or flux SKU if this is about a specific item.", "support.new.tags": "Tags", - "support.new.tagsPlaceholder": "login, facture (séparés par des virgules)", - "support.new.tagsHelp": "Jusqu’à 10 libellés courts. Nous normalisons espaces et ponctuation.", + "support.new.tagsPlaceholder": "login, facture (séparés par des virgules)", + "support.new.tagsHelp": "Jusqu’à 10 libellés courts. Nous normalisons espaces et ponctuation.", "support.new.tagsWillSend": "Envoi : {tags}", "support.new.message": "Message", - "support.new.messagePlaceholder": "Décrivez le problème, ce que vous attendiez et tout élément qui aide à le reproduire.", - "support.new.createdTitle": "Ticket créé", - "support.new.createdBody": "Nous répondrons dans ce fil. Surveillez les notifications in-app.", + "support.new.messagePlaceholder": "Décrivez le problème, ce que vous attendiez et tout élément qui aide à le reproduire.", + "support.new.createdTitle": "Ticket créé", + "support.new.createdBody": "Nous répondrons dans ce fil. Surveillez les notifications in-app.", "support.new.viewTicket": "Voir ticket", - "support.new.unavailable": "Assistance is temporarily indisponible. Your message was not submitted — try again shortly.", + "support.new.unavailable": "Assistance is temporarily indisponible. Your message was not submitted — try again shortly.", "support.new.unavailableTitle": "Support indisponible", - "support.new.createFailed": "Impossible de créer le ticket", + "support.new.createFailed": "Impossible de créer le ticket", "support.ticket.fallbackTitle": "Assistance ticket", "support.ticket.description": "Conversation thread with Descrybe assistance.", - "support.ticket.meta": "{category} · {priority} · Mis à jour {when}", + "support.ticket.meta": "{category} · {priority} · Mis à jour {when}", "support.ticket.allTickets": "Tout tickets", - "support.ticket.loading": "Chargement ticket…", + "support.ticket.loading": "Chargement ticket…", "support.ticket.missingId": "Identifiant de ticket manquant", "support.ticket.notFound": "Ticket introuvable", - "support.ticket.notFoundMessage": "Ce ticket a peut-être été supprimé ou vous n’y avez pas accès.", + "support.ticket.notFoundMessage": "Ce ticket a peut-être été supprimé ou vous n’y avez pas accès.", "support.ticket.backCenter": "Retour to Assistance Center", "support.ticket.unavailable": "Le support est temporairement indisponible.", - "support.ticket.loadFailed": "Échec du chargement du ticket", - "support.ticket.openedMeta": "Ouvrired {when} · {category} · {priority} priority", + "support.ticket.loadFailed": "Échec du chargement du ticket", + "support.ticket.openedMeta": "Ouvrired {when} · {category} · {priority} priority", "support.ticket.sku": "SKU {sku}", "support.ticket.messagesAria": "Messages du ticket", "support.ticket.noMessages": "Aucun message", - "support.ticket.noMessagesHelp": "Ce fil n’a pas encore de messages.", - "support.ticket.yourReply": "Votre réponse", - "support.ticket.replyPlaceholder": "Add details or reply to assistance…", - "support.ticket.sendReply": "Envoyer la réponse", - "support.ticket.replySent": "Réponse envoyée", - "support.ticket.reopened": "Ticket rouvert pour revue de l’équipe.", - "support.ticket.replyAdded": "Votre message a été ajouté au fil.", - "support.ticket.replyFailed": "Impossible d’envoyer la réponse", - "support.ticket.reopenHint": "Répondre rouvre ce ticket pour l’équipe.", + "support.ticket.noMessagesHelp": "Ce fil n’a pas encore de messages.", + "support.ticket.yourReply": "Votre réponse", + "support.ticket.replyPlaceholder": "Add details or reply to assistance…", + "support.ticket.sendReply": "Envoyer la réponse", + "support.ticket.replySent": "Réponse envoyée", + "support.ticket.reopened": "Ticket rouvert pour revue de l’équipe.", + "support.ticket.replyAdded": "Votre message a été ajouté au fil.", + "support.ticket.replyFailed": "Impossible d’envoyer la réponse", + "support.ticket.reopenHint": "Répondre rouvre ce ticket pour l’équipe.", "support.ticket.humanHint": "Replying asks a human teammate to continue from ici.", - "support.ticket.closedBanner": "This ticket is closed. Créer a new ticket if you still need help.", + "support.ticket.closedBanner": "This ticket is closed. Créer a new ticket if you still need help.", "support.kind.you": "Vous", "support.kind.human": "Assistance", - "support.kind.auto": "Automatisé", - "support.kind.ai": "Assisté par l'IA", - "support.kind.system": "Système", - "support.kind.autoBadge": "Réponse automatisée", - "support.kind.aiBadge": "Assisté par l'IA", - "support.progress.closed.title": "Ticket fermé", + "support.kind.auto": "Automatisé", + "support.kind.ai": "Assisté par l'IA", + "support.kind.system": "Système", + "support.kind.autoBadge": "Réponse automatisée", + "support.kind.aiBadge": "Assisté par l'IA", + "support.progress.closed.title": "Ticket fermé", "support.progress.closed.message": "This conversation is closed. Ouvrir a new ticket if you still need help.", - "support.progress.resolved.title": "Marqué comme résolu", - "support.progress.resolved.message": "Nous pensons que c’est réglé. Répondez pour rouvrir, ou laissez une note rapide ci-dessous.", - "support.progress.quickAnswer.title": "Réponse rapide envoyée", - "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply ici — a human will take over.", - "support.progress.onIt.title": "On s’en occupe", + "support.progress.resolved.title": "Marqué comme résolu", + "support.progress.resolved.message": "Nous pensons que c’est réglé. Répondez pour rouvrir, ou laissez une note rapide ci-dessous.", + "support.progress.quickAnswer.title": "Réponse rapide envoyée", + "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply ici — a human will take over.", + "support.progress.onIt.title": "On s’en occupe", "support.progress.onIt.handedMessage": "A assistance teammate has your ticket and will reply in this thread.", "support.progress.onIt.pendingMessage": "Assistance is reviewing your message. You will see updates in this thread.", - "support.progress.received.title": "Ticket reçu", - "support.progress.received.message": "Merci — nous avons votre demande. Une aide automatisée peut apparaître bientôt, ou un collègue répondra.", + "support.progress.received.title": "Ticket reçu", + "support.progress.received.message": "Merci — nous avons votre demande. Une aide automatisée peut apparaître bientôt, ou un collègue répondra.", "support.category.billing": "Facturation", "support.category.billing.help": "Factures, payment methods, plan changes, and Stripe receipts.", "support.category.billing_credits": "Facturation / credits", - "support.category.billing_credits.help": "Solde de crédits, quotas d’usage et recharges.", + "support.category.billing_credits.help": "Solde de crédits, quotas d’usage et recharges.", "support.category.bug": "Bug / erreur", - "support.category.bug.help": "Erreurs inattendues, écrans cassés ou étapes qui échouent à chaque fois.", - "support.category.account": "Compte / accès", + "support.category.bug.help": "Erreurs inattendues, écrans cassés ou étapes qui échouent à chaque fois.", + "support.category.account": "Compte / accès", "support.category.account.help": "Login, invites, entreprise membership, and permissions.", - "support.category.integrations": "Intégrations", + "support.category.integrations": "Intégrations", "support.category.integrations.help": "WooCommerce, Shopify, API publique ou configuration du connecteur.", "support.category.processing": "Traitement / AI", "support.category.processing.help": "Produit traitement, AI prompts, and generation quality.", "support.category.export": "Exporter / channels", "support.category.export.help": "Exporter flux, channels, and sync destinations.", - "support.category.migration": "Migration / données", - "support.category.migration.help": "Données manquantes ou incorrectes après la bascule — produits, feeds, boutiques, facturation ou équipe.", + "support.category.migration": "Migration / données", + "support.category.migration.help": "Données manquantes ou incorrectes après la bascule — produits, feeds, boutiques, facturation ou équipe.", "support.category.other": "Autre", - "support.category.other.help": "Autre chose — nous l’acheminerons vers le bon collègue.", + "support.category.other.help": "Autre chose — nous l’acheminerons vers le bon collègue.", "support.priority.low": "Faible", - "support.priority.low.help": "Souhaitable ou non bloquant — nous y viendrons à tour de rôle.", + "support.priority.low.help": "Souhaitable ou non bloquant — nous y viendrons à tour de rôle.", "support.priority.normal": "Normale", "support.priority.normal.help": "Demande standard. La plupart des tickets utilisent ceci.", - "support.priority.high": "Élevé", - "support.priority.high.help": "Bloque le travail ou impacte le chiffre d’affaires — à utiliser avec parcimonie.", + "support.priority.high": "Élevé", + "support.priority.high.help": "Bloque le travail ou impacte le chiffre d’affaires — à utiliser avec parcimonie.", "support.csat.thanks": "Merci pour votre retour", - "support.csat.unavailable": "L’évaluation est temporairement indisponible. Réessayez plus tard.", - "support.csat.unavailableTitle": "Évaluation indisponible", - "support.csat.alreadyRated": "Vous avez déjà évalué ce ticket.", - "support.csat.alreadyRatedTitle": "Déjà noté", - "support.csat.submitFailed": "Impossible d’envoyer l’évaluation", + "support.csat.unavailable": "L’évaluation est temporairement indisponible. Réessayez plus tard.", + "support.csat.unavailableTitle": "Évaluation indisponible", + "support.csat.alreadyRated": "Vous avez déjà évalué ce ticket.", + "support.csat.alreadyRatedTitle": "Déjà noté", + "support.csat.submitFailed": "Impossible d’envoyer l’évaluation", "support.csat.yourRating": "Votre note", - "support.csat.ratedOutOf": "Vous avez noté ce ticket {score} sur 5", - "support.csat.howDidWeDo": "Comment s’est passé le service ?", - "support.csat.formHelp": "This ticket is {status}. Rate your experience (1–5). Facultatif comment helps us improve.", + "support.csat.ratedOutOf": "Vous avez noté ce ticket {score} sur 5", + "support.csat.howDidWeDo": "Comment s’est passé le service ?", + "support.csat.formHelp": "This ticket is {status}. Rate your experience (1–5). Facultatif comment helps us improve.", "support.csat.rating": "Note", - "support.csat.scoreAria": "{value} — {label}", + "support.csat.scoreAria": "{value} — {label}", "support.csat.whatWentWrong": "What went wrong? (facultatif)", - "support.csat.whatWentWrongPlaceholder": "Une courte note nous aide à faire le suivi.", + "support.csat.whatWentWrongPlaceholder": "Une courte note nous aide à faire le suivi.", "support.csat.anythingElse": "Anything else? (facultatif)", "support.csat.optionalFeedback": "Facultatif fluxback", - "support.csat.submit": "Envoyer l’évaluation", - "support.csat.score.1": "Très insatisfait", + "support.csat.submit": "Envoyer l’évaluation", + "support.csat.score.1": "Très insatisfait", "support.csat.score.2": "Insatisfait", "support.csat.score.3": "OK", "support.csat.score.4": "Satisfait", - "support.csat.score.5": "Très satisfait", + "support.csat.score.5": "Très satisfait", "catalog.delete": "Supprimer", - "catalog.deleting": "Suppression…", - "catalog.saving": "Enregistrement…", - "catalog.adding": "Ajout…", - "catalog.assigning": "Attribution…", - "catalog.uploading": "Téléversement…", - "catalog.create": "Créer", - "catalog.createFailed": "Échec de la création", - "catalog.updateFailed": "Échec de la mise à jour", - "catalog.deleteFailed": "Échec de la suppression", - "catalog.importFailed": "Échec de l'import", + "catalog.deleting": "Suppression…", + "catalog.saving": "Enregistrement…", + "catalog.adding": "Ajout…", + "catalog.assigning": "Attribution…", + "catalog.uploading": "Téléversement…", + "catalog.create": "Créer", + "catalog.createFailed": "Échec de la création", + "catalog.updateFailed": "Échec de la mise à jour", + "catalog.deleteFailed": "Échec de la suppression", + "catalog.importFailed": "Échec de l'import", "catalog.confirm": "Confirmer", "catalog.confirmDeletion": "Confirmer la suppression", - "catalog.areYouSure": "Êtes-vous sûr ?", - "catalog.previous": "Précédent", + "catalog.areYouSure": "Êtes-vous sûr ?", + "catalog.previous": "Précédent", "catalog.next": "Suivant", - "catalog.expand": "Développer", - "catalog.collapse": "Réduire", + "catalog.expand": "Développer", + "catalog.collapse": "Réduire", "catalog.clearSearch": "Effacer la recherche", "catalog.clearFilters": "Effacer les filtres", - "catalog.clearSelection": "Effacer la sélection", + "catalog.clearSelection": "Effacer la sélection", "catalog.add": "Ajouter", - "catalog.update": "Mettre à jour", + "catalog.update": "Mettre à jour", "catalog.edit": "Modifier", "catalog.accept": "Accepter", "catalog.reject": "Rejeter", - "catalog.reset": "Réinitialiser", + "catalog.reset": "Réinitialiser", "catalog.undo": "Annuler", "catalog.close": "Fermer", "catalog.closePanel": "Fermer le panneau", "catalog.closeMenus": "Fermer les menus", "catalog.openMenu": "Ouvrir le menu", - "catalog.loading": "Chargement…", + "catalog.loading": "Chargement…", "catalog.empty": "Vide", "catalog.required": "Obligatoire", "catalog.optional": "Facultatif", - "catalog.features": "Fonctionnalités", - "catalog.csvImportFinished": "Import CSV terminé.", + "catalog.features": "Fonctionnalités", + "catalog.csvImportFinished": "Import CSV terminé.", "catalog.comparePlans": "Comparer les offres", "catalog.saveChanges": "Enregistrer les modifications", "catalog.saveFormula": "Enregistrer la formule", "catalog.saveFormulaShort": "Enregistrer la formule", - "catalog.noResults": "Aucun résultat", + "catalog.noResults": "Aucun résultat", "products.title": "Produits", "products.description": "Parcourez, examinez et traitez votre catalogue.", - "products.loadFailed": "Échec du chargement des produits", + "products.loadFailed": "Échec du chargement des produits", "products.unnamed": "Produit sans nom", "products.tabs.navLabel": "Vues produits", - "products.tab.processed": "Traités", - "products.tab.processedHint": "Produits terminés prêts à exporter ou synchroniser", - "products.tab.needsReview": "À revoir", - "products.tab.needsReviewHint": "Produits enrichis à accepter, modifier ou rejeter", + "products.tab.processed": "Traités", + "products.tab.processedHint": "Produits terminés prêts à exporter ou synchroniser", + "products.tab.needsReview": "À revoir", + "products.tab.needsReviewHint": "Produits enrichis à accepter, modifier ou rejeter", "products.tab.needsReviewShort": "Examiner", "products.tab.error": "Erreurs", - "products.tab.errorHint": "Produits ayant échoué pendant un job", + "products.tab.errorHint": "Produits ayant échoué pendant un job", "products.tab.processing": "En cours", "products.tab.processingHint": "Produits dans un job en cours", "products.tab.busy": "En cours", - "products.tab.unprocessed": "Non traités", - "products.tab.unprocessedHint": "Produits du catalogue pas encore traités", - "products.tab.raw": "Non traités", - "products.status.processed": "Traités", - "products.status.needsReview": "À revoir", + "products.tab.unprocessed": "Non traités", + "products.tab.unprocessedHint": "Produits du catalogue pas encore traités", + "products.tab.raw": "Non traités", + "products.status.processed": "Traités", + "products.status.needsReview": "À revoir", "products.status.processing": "Traitement", "products.status.error": "Erreur", - "products.status.failed": "Échoué", - "products.status.unprocessed": "Non traités", + "products.status.failed": "Échoué", + "products.status.unprocessed": "Non traités", "products.status.pending": "En attente", "products.status.unknown": "Inconnu", - "products.pagination.showing": "Affichage {start}–{end} sur {total}", + "products.pagination.showing": "Affichage {start}–{end} sur {total}", "products.empty.processing.title": "Aucun job pour l'instant", - "products.empty.processing.messageJobs": "Rien n'est en cours. Démarrez un job depuis Non traités, ou ouvrez Traitement pour suivre la progression.", + "products.empty.processing.messageJobs": "Rien n'est en cours. Démarrez un job depuis Non traités, ou ouvrez Traitement pour suivre la progression.", "products.empty.processing.messageBasic": "Les produits apparaissent ici pendant qu'un job tourne.", - "products.empty.needsReview.title": "Aucun produit nécessitant une révision", - "products.empty.needsReview.message": "Après une tâche, les produits enrichis arrivent ici. Ouvrez une ligne pour comparer original vs enrichi, puis Accepter, modifier ou Rejeter.", + "products.empty.needsReview.title": "Aucun produit nécessitant une révision", + "products.empty.needsReview.message": "Après une tâche, les produits enrichis arrivent ici. Ouvrez une ligne pour comparer original vs enrichi, puis Accepter, modifier ou Rejeter.", "products.empty.error.title": "Aucun produit avec erreurs", - "products.empty.error.message": "Lorsqu’une tâche échoue pour un produit, il apparaît ici pour que vous puissiez réessayer.", - "products.empty.noUnprocessedMatches": "Aucune correspondance non traitée", + "products.empty.error.message": "Lorsqu’une tâche échoue pour un produit, il apparaît ici pour que vous puissiez réessayer.", + "products.empty.noUnprocessedMatches": "Aucune correspondance non traitée", "products.empty.noMatch": "Aucun produit ne correspond", - "products.empty.filtersHint": "Essayez une autre recherche, catégorie ou feed — ou effacez les filtres pour tout voir.", - "products.empty.noUnprocessed.title": "Pas encore de produits non traités", - "products.empty.noUnprocessed.message": "Connectez un feed fournisseur ou téléversez un CSV pour importer des produits.", + "products.empty.filtersHint": "Essayez une autre recherche, catégorie ou feed — ou effacez les filtres pour tout voir.", + "products.empty.noUnprocessed.title": "Pas encore de produits non traités", + "products.empty.noUnprocessed.message": "Connectez un feed fournisseur ou téléversez un CSV pour importer des produits.", "products.empty.none.title": "Pas encore de produits", - "products.empty.none.messageStores": "Terminez d’abord Feeds → Map → Sync, puis Process. Importez depuis un flux ou une boutique.", - "products.empty.none.messageBasic": "Terminez d’abord Feeds → Map → Sync, puis Process. Connectez un flux ou téléversez un CSV.", - "products.actions.viewJobs": "Voir les tâches", - "products.actions.startJob": "Démarrer une tâche", - "products.actions.viewProcessed": "Voir les traités", - "products.actions.retryFromCatalog": "Réessayer depuis le catalogue", + "products.empty.none.messageStores": "Terminez d’abord Feeds → Map → Sync, puis Process. Importez depuis un flux ou une boutique.", + "products.empty.none.messageBasic": "Terminez d’abord Feeds → Map → Sync, puis Process. Connectez un flux ou téléversez un CSV.", + "products.actions.viewJobs": "Voir les tâches", + "products.actions.startJob": "Démarrer une tâche", + "products.actions.viewProcessed": "Voir les traités", + "products.actions.retryFromCatalog": "Réessayer depuis le catalogue", "products.actions.connectFeed": "Connecter un feed", "products.actions.addProduct": "Ajouter un produit", - "products.actions.uploadCsv": "Téléverser CSV", - "products.actions.exportSelected": "Exporter la sélection", - "products.export.title": "Exporter les produits sélectionnés", + "products.actions.uploadCsv": "Téléverser CSV", + "products.actions.exportSelected": "Exporter la sélection", + "products.export.title": "Exporter les produits sélectionnés", "products.export.confirm": "Confirmer l'export", - "products.export.loadFailed": "Échec du chargement des options de feed d'export. Veuillez réessayer.", - "products.export.noneFound": "Aucun feed d'export pour l'instant. Créez-en un sous Feeds d'export, puis revenez exporter votre sélection.", - "products.export.selectFormat": "Veuillez sélectionner un feed d'export.", - "products.export.failed": "Impossible d'exporter les produits sélectionnés", - "products.upload.title": "Téléverser CSV", - "products.upload.description": "Importez des produits depuis un CSV (GTIN/EAN, nom, catégorie, …). Téléchargez l'échantillon pour l'ensemble complet des colonnes.", - "products.upload.submit": "Téléverser et importer", + "products.export.loadFailed": "Échec du chargement des options de feed d'export. Veuillez réessayer.", + "products.export.noneFound": "Aucun feed d'export pour l'instant. Créez-en un sous Feeds d'export, puis revenez exporter votre sélection.", + "products.export.selectFormat": "Veuillez sélectionner un feed d'export.", + "products.export.failed": "Impossible d'exporter les produits sélectionnés", + "products.upload.title": "Téléverser CSV", + "products.upload.description": "Importez des produits depuis un CSV (GTIN/EAN, nom, catégorie, …). Téléchargez l'échantillon pour l'ensemble complet des colonnes.", + "products.upload.submit": "Téléverser et importer", "products.upload.chooseFirst": "Choisissez d'abord un fichier CSV.", - "products.upload.csvOnly": "Veuillez téléverser un fichier CSV.", + "products.upload.csvOnly": "Veuillez téléverser un fichier CSV.", "products.upload.tooLarge": "CSV must be 5 MB or smaller.", - "products.processing.started": "Tâche de traitement démarrée", - "products.processing.startFailed": "Impossible de démarrer le traitement", - "products.processing.startJobFailed": "Impossible de démarrer la tâche de traitement", - "products.processing.cancelled": "Traitement annulé", - "products.processing.jobsCancelled": "Tâches de traitement annulées", - "products.processing.cancelFailed": "Impossible d'annuler la tâche de traitement", - "products.processing.justCancelled": "La tâche qui vient de démarrer a été annulée.", + "products.processing.started": "Tâche de traitement démarrée", + "products.processing.startFailed": "Impossible de démarrer le traitement", + "products.processing.startJobFailed": "Impossible de démarrer la tâche de traitement", + "products.processing.cancelled": "Traitement annulé", + "products.processing.jobsCancelled": "Tâches de traitement annulées", + "products.processing.cancelFailed": "Impossible d'annuler la tâche de traitement", + "products.processing.justCancelled": "La tâche qui vient de démarrer a été annulée.", "products.processing.viewInProcessing": "Voir dans Traitement", "products.processing.confirm": "Confirmer le traitement", - "products.processing.freePlanTitle": "Offre Free — traitement sans IA", - "products.processing.freePlanBody": "Normalisation, spécifications, complétion et EPREL n’utilisent aucun crédit. Les titres/descriptions AI nécessitent une formule payante ou des crédits.", + "products.processing.freePlanTitle": "Offre Free — traitement sans IA", + "products.processing.freePlanBody": "Normalisation, spécifications, complétion et EPREL n’utilisent aucun crédit. Les titres/descriptions AI nécessitent une formule payante ou des crédits.", "products.enrichment.acceptTitle": "Accepter l'enrichissement ?", "products.enrichment.acceptConfirm": "Confirmer l'acceptation de l'enrichissement", - "products.enrichment.acceptSelected": "Accepter l'enrichissement pour {count} produit(s) sélectionné(s) ? Ils passeront en Traités.", + "products.enrichment.acceptSelected": "Accepter l'enrichissement pour {count} produit(s) sélectionné(s) ? Ils passeront en Traités.", "products.enrichment.rejectConfirm": "Confirmer le rejet de l'enrichissement", - "products.enrichment.rejectBody": "Rejeter l'enrichissement et renvoyer ce produit en non traité ? Vous pourrez relancer le traitement plus tard.", - "products.enrichment.rejectSelectedConfirm": "Confirmer le rejet de la sélection", - "products.enrichment.resetConfirm": "Confirmer la réinitialisation en non traité", - "products.enrichment.resetSelected": "Réinitialiser {count} produit(s) sélectionné(s) en non traité ? Ils réapparaîtront comme éléments non traités.", - "products.enrichment.accepted": "Enrichissement accepté — déplacé vers Traités.", - "products.enrichment.rejected": "Enrichissement rejeté — produit renvoyé en non traité.", + "products.enrichment.rejectBody": "Rejeter l'enrichissement et renvoyer ce produit en non traité ? Vous pourrez relancer le traitement plus tard.", + "products.enrichment.rejectSelectedConfirm": "Confirmer le rejet de la sélection", + "products.enrichment.resetConfirm": "Confirmer la réinitialisation en non traité", + "products.enrichment.resetSelected": "Réinitialiser {count} produit(s) sélectionné(s) en non traité ? Ils réapparaîtront comme éléments non traités.", + "products.enrichment.accepted": "Enrichissement accepté — déplacé vers Traités.", + "products.enrichment.rejected": "Enrichissement rejeté — produit renvoyé en non traité.", "products.enrichment.acceptFailed": "Impossible d'accepter l'enrichissement", "products.enrichment.rejectFailed": "Impossible de rejeter l'enrichissement", - "products.enrichment.acceptUndone": "Acceptation annulée", + "products.enrichment.acceptUndone": "Acceptation annulée", "products.enrichment.undoAcceptFailed": "Impossible d'annuler l'acceptation", - "products.enrichment.resetDone": "Produit renvoyé en non traité.", - "products.enrichment.resetFailed": "Impossible de réinitialiser les produits", - "products.enrichment.valueReset": "Valeur enrichie réinitialisée à l'original.", - "products.enrichment.originalEmpty": "La valeur d'origine est vide ; l'enrichissement ne peut pas être effacé via PATCH.", - "products.enrichment.staysNeedsReview": "Le produit reste dans Needs Review jusqu'à ce que vous acceptiez tout.", - "products.field.nameAcceptUndone": "Acceptation du nom annulée", - "products.field.descriptionAcceptUndone": "Acceptation de la description annulée", - "products.field.nameDiscardUndone": "Rejet du nom annulé", - "products.field.descriptionDiscardUndone": "Rejet de la description annulé", + "products.enrichment.resetDone": "Produit renvoyé en non traité.", + "products.enrichment.resetFailed": "Impossible de réinitialiser les produits", + "products.enrichment.valueReset": "Valeur enrichie réinitialisée à l'original.", + "products.enrichment.originalEmpty": "La valeur d'origine est vide ; l'enrichissement ne peut pas être effacé via PATCH.", + "products.enrichment.staysNeedsReview": "Le produit reste dans Needs Review jusqu'à ce que vous acceptiez tout.", + "products.field.nameAcceptUndone": "Acceptation du nom annulée", + "products.field.descriptionAcceptUndone": "Acceptation de la description annulée", + "products.field.nameDiscardUndone": "Rejet du nom annulé", + "products.field.descriptionDiscardUndone": "Rejet de la description annulé", "products.field.undoAcceptFailed": "Impossible d'annuler l'acceptation du champ", "products.field.undoDiscardFailed": "Impossible d'annuler le rejet du champ", - "products.updateFailed": "Impossible de mettre à jour le produit", + "products.updateFailed": "Impossible de mettre à jour le produit", "products.keyboardTips": "Raccourcis clavier", "products.keyboardTipsShort": "Raccourcis clavier (?)", - "products.option.categories": "Catégories", - "products.option.attributes": "Attributs / spécifications", + "products.option.categories": "Catégories", + "products.option.attributes": "Attributs / spécifications", "products.option.titlesAi": "Titres (IA)", "products.option.descriptionsAi": "Descriptions (IA)", "products.enrichment.piece.name": "Nom", "products.enrichment.piece.description": "Description", "products.enrichment.piece.attributes": "Attributs", - "products.enrichment.piece.category": "Catégorie", - "products.enrichment.state.processed": "Traités", + "products.enrichment.piece.category": "Catégorie", + "products.enrichment.state.processed": "Traités", "products.enrichment.state.feed": "Depuis le feed", "products.enrichment.state.missing": "Manquants", - "products.enrichment.help.name": "Titre du produit. Vert = nom traité par AI ; orange = nom du flux/original uniquement ; gris = manquant.", - "products.enrichment.help.description": "Description du produit. Vert = traitée par AI ; orange = flux/original uniquement ; gris = manquante.", - "products.enrichment.help.attributes": "Spécifications et attributs. Vert = attributs AI/enrichis ; orange = depuis le flux uniquement ; gris = aucun.", - "products.enrichment.help.category": "Catégorie assignée. Vert = catégorie définie ; gris = manquante.", + "products.enrichment.help.name": "Titre du produit. Vert = nom traité par AI ; orange = nom du flux/original uniquement ; gris = manquant.", + "products.enrichment.help.description": "Description du produit. Vert = traitée par AI ; orange = flux/original uniquement ; gris = manquante.", + "products.enrichment.help.attributes": "Spécifications et attributs. Vert = attributs AI/enrichis ; orange = depuis le flux uniquement ; gris = aucun.", + "products.enrichment.help.category": "Catégorie assignée. Vert = catégorie définie ; gris = manquante.", "products.enrichment.chipTitle": "{label} : {state}. {help}", - "products.enrichment.complete": "Complet — {parts}", - "products.enrichment.missingSummary": "Manquant {missing} — {parts}", + "products.enrichment.complete": "Complet — {parts}", + "products.enrichment.missingSummary": "Manquant {missing} — {parts}", "products.issue.title": "titre", "products.issue.gtin": "GTIN", - "products.issue.category": "catégorie", - "products.filters.allCategories": "Toutes les catégories", + "products.issue.category": "catégorie", + "products.filters.allCategories": "Toutes les catégories", "products.filters.allFeeds": "Tous les feeds", "products.filters.allCoverage": "Toute la couverture", "products.filters.anyFeedChange": "Tout changement de feed", "products.filters.eprelAll": "EPREL : tous", "products.filters.feedChangesAll": "Changements de feed : tous", - "products.filters.byCategory": "Filtrer par catégorie", + "products.filters.byCategory": "Filtrer par catégorie", "products.filters.byCoverage": "Filtrer par couverture", "products.filters.byFeed": "Filtrer par feed", "products.filters.byEprel": "Filtrer par EPREL", "products.filters.byFeedSync": "Filtrer par changements de synchronisation du feed", - "products.filters.coverageHint": "Filtrer par complétude Nom / Description / Attributs / Catégorie", - "products.filters.feedSyncHint": "Filtrer par changements de prix/stock/titre de la dernière synchronisation du feed", - "products.filters.eprelHint": "Filtrer les produits qui ont ou n’ont pas d’identifiant EPREL d’étiquette énergétique", - "products.filters.availabilityChanged": "Disponibilité modifiée", - "products.eprel.badgeTitle": "Id EPREL présent sur ce produit (European Product Registry for Energy Labelling).", - "products.eprel.help": "L'id European Product Registry for Energy Labelling (EPREL) est présent sur ce produit.", - "products.feedData": "Données du feed", + "products.filters.coverageHint": "Filtrer par complétude Nom / Description / Attributs / Catégorie", + "products.filters.feedSyncHint": "Filtrer par changements de prix/stock/titre de la dernière synchronisation du feed", + "products.filters.eprelHint": "Filtrer les produits qui ont ou n’ont pas d’identifiant EPREL d’étiquette énergétique", + "products.filters.availabilityChanged": "Disponibilité modifiée", + "products.eprel.badgeTitle": "Id EPREL présent sur ce produit (European Product Registry for Energy Labelling).", + "products.eprel.help": "L'id European Product Registry for Energy Labelling (EPREL) est présent sur ce produit.", + "products.feedData": "Données du feed", "attributes.title": "Attributs", - "attributes.description": "Définissez les champs produit, les valeurs de liste et les assignations de catégorie.", - "attributes.loadFailed": "Échec du chargement des attributs", - "attributes.loading": "Chargement des attributs…", + "attributes.description": "Définissez les champs produit, les valeurs de liste et les assignations de catégorie.", + "attributes.loadFailed": "Échec du chargement des attributs", + "attributes.loading": "Chargement des attributs…", "attributes.zero": "0 attributs", "attributes.addNew": "Ajouter un nouvel attribut", - "attributes.create": "Créer l'attribut", + "attributes.create": "Créer l'attribut", "attributes.edit": "Modifier l'attribut", "attributes.delete": "Supprimer l'attribut", - "attributes.displayName": "Nom affiché de l'attribut", + "attributes.displayName": "Nom affiché de l'attribut", "attributes.actions": "Actions sur l'attribut", - "attributes.created": "Attribut créé.", - "attributes.createdAssignFailed": "Attribut créé, mais l'assignation de catégorie a échoué.", - "attributes.updated": "Attribut mis à jour.", - "attributes.deleted": "Attribut supprimé.", + "attributes.created": "Attribut créé.", + "attributes.createdAssignFailed": "Attribut créé, mais l'assignation de catégorie a échoué.", + "attributes.updated": "Attribut mis à jour.", + "attributes.deleted": "Attribut supprimé.", "attributes.addValue": "Ajouter une valeur", "attributes.manageValues": "Ajouter, modifier ou supprimer des valeurs pour cet attribut de liste.", "attributes.valueTypeHint": "Choisissez comment les valeurs sont saisies pour cet attribut.", - "attributes.createDescription": "Créez une nouvelle définition d'attribut. Vous pouvez l'assigner à une catégorie pendant la création.", - "attributes.assignToCategories": "Assigner des attributs aux catégories", - "attributes.assignFailed": "Impossible d'assigner l'attribut à la catégorie sélectionnée.", - "attributes.bulkAssignFailed": "Échec de l'assignation en masse", - "attributes.filterByCategory": "Filtrer par catégorie", + "attributes.createDescription": "Créez une nouvelle définition d'attribut. Vous pouvez l'assigner à une catégorie pendant la création.", + "attributes.assignToCategories": "Assigner des attributs aux catégories", + "attributes.assignFailed": "Impossible d'assigner l'attribut à la catégorie sélectionnée.", + "attributes.bulkAssignFailed": "Échec de l'assignation en masse", + "attributes.filterByCategory": "Filtrer par catégorie", "attributes.saveValueFailed": "Impossible d'enregistrer la valeur", "attributes.deleteValueFailed": "Impossible de supprimer la valeur", - "attributes.csvNeedHeader": "Le CSV doit inclure un en-tête et au moins une ligne", - "attributes.csvNeedColumns": "Le CSV doit inclure les colonnes « category_id » et « attribute_key »", + "attributes.csvNeedHeader": "Le CSV doit inclure un en-tête et au moins une ligne", + "attributes.csvNeedColumns": "Le CSV doit inclure les colonnes « category_id » et « attribute_key »", "attributes.type.string": "Texte", - "attributes.type.stringHint": "Texte libre — noms, modèles, notes courtes", + "attributes.type.stringHint": "Texte libre — noms, modèles, notes courtes", "attributes.type.number": "Nombre", - "attributes.type.numberHint": "Valeur numérique ; ajoutez une unité si utile (cm, kg, W)", + "attributes.type.numberHint": "Valeur numérique ; ajoutez une unité si utile (cm, kg, W)", "attributes.type.boolean": "Oui / Non", - "attributes.type.booleanHint": "Vrai ou faux — ex. a un GPS, charge sans fil", + "attributes.type.booleanHint": "Vrai ou faux — ex. a un GPS, charge sans fil", "attributes.type.date": "Date", - "attributes.type.dateHint": "Une date calendaire (sortie, fin de garantie, …)", - "attributes.type.list": "Liste déroulante", - "attributes.type.listHint": "Choisissez exactement une option dans une liste définie", - "attributes.type.multiselect": "Sélection multiple", + "attributes.type.dateHint": "Une date calendaire (sortie, fin de garantie, …)", + "attributes.type.list": "Liste déroulante", + "attributes.type.listHint": "Choisissez exactement une option dans une liste définie", + "attributes.type.multiselect": "Sélection multiple", "attributes.type.multiselectHint": "Choisissez une ou plusieurs options dans une liste", "attributes.color": "Couleur", - "categories.title": "Catégories", - "categories.description": "Organisez la hiérarchie du catalogue. Modifiez une catégorie pour ouvrir les formules titre/description et prompts IA.", - "categories.loadFailed": "Échec du chargement des catégories", - "categories.add": "Ajouter une catégorie", - "categories.edit": "Modifier la catégorie", - "categories.delete": "Supprimer la catégorie", - "categories.deleteConfirm": "Voulez-vous vraiment supprimer cette catégorie ? Cette action est irréversible.", - "categories.name": "Nom de catégorie", - "categories.namePlaceholder": "Nom de catégorie", - "categories.descriptionPlaceholder": "Description facultative de la catégorie", + "categories.title": "Catégories", + "categories.description": "Organisez la hiérarchie du catalogue. Modifiez une catégorie pour ouvrir les formules titre/description et prompts IA.", + "categories.loadFailed": "Échec du chargement des catégories", + "categories.add": "Ajouter une catégorie", + "categories.edit": "Modifier la catégorie", + "categories.delete": "Supprimer la catégorie", + "categories.deleteConfirm": "Voulez-vous vraiment supprimer cette catégorie ? Cette action est irréversible.", + "categories.name": "Nom de catégorie", + "categories.namePlaceholder": "Nom de catégorie", + "categories.descriptionPlaceholder": "Description facultative de la catégorie", "categories.uniqueIdPlaceholder": "Identifiant unique facultatif", "categories.searchPlaceholder": "Rechercher par nom ou ID...", - "categories.created": "{name} a été créé.", - "categories.updated": "La catégorie a été mise à jour avec succès.", - "categories.deleted": "La catégorie a été supprimée avec succès.", - "categories.notFound": "Catégorie introuvable.", - "categories.loadCategoryFailed": "Échec du chargement de la catégorie", - "categories.noCategoriesYet": "Aucune catégorie pour l'instant", - "categories.noMatch": "Aucune catégorie ne correspond à « {query} ». Effacez la recherche ou essayez un autre terme.", - "categories.emptyHint": "Ajoutez une catégorie ou importez un CSV pour construire votre arbre.", - "categories.promptCountOne": "{count} catégorie a un prompt de génération IA. Ouvrez le menu ⋮ → Modifier le prompt IA, ou modifiez une catégorie et choisissez Modifier le prompt IA.", - "categories.promptCountMany": "{count} catégories ont un prompt de génération IA. Ouvrez le menu ⋮ → Modifier le prompt IA, ou modifiez une catégorie et choisissez Modifier le prompt IA.", - "categories.actions": "Actions de catégorie", + "categories.created": "{name} a été créé.", + "categories.updated": "La catégorie a été mise à jour avec succès.", + "categories.deleted": "La catégorie a été supprimée avec succès.", + "categories.notFound": "Catégorie introuvable.", + "categories.loadCategoryFailed": "Échec du chargement de la catégorie", + "categories.noCategoriesYet": "Aucune catégorie pour l'instant", + "categories.noMatch": "Aucune catégorie ne correspond à « {query} ». Effacez la recherche ou essayez un autre terme.", + "categories.emptyHint": "Ajoutez une catégorie ou importez un CSV pour construire votre arbre.", + "categories.promptCountOne": "{count} catégorie a un prompt de génération IA. Ouvrez le menu â‹® → Modifier le prompt IA, ou modifiez une catégorie et choisissez Modifier le prompt IA.", + "categories.promptCountMany": "{count} catégories ont un prompt de génération IA. Ouvrez le menu â‹® → Modifier le prompt IA, ou modifiez une catégorie et choisissez Modifier le prompt IA.", + "categories.actions": "Actions de catégorie", "categories.chooseCsv": "Choisir CSV", - "categories.createSingleOrImport": "Créez une seule catégorie ou importez-en plusieurs depuis un CSV.", - "categories.createSingle": "Créer une seule catégorie.", + "categories.createSingleOrImport": "Créez une seule catégorie ou importez-en plusieurs depuis un CSV.", + "categories.createSingle": "Créer une seule catégorie.", "categories.missingNameColumn": "Colonne obligatoire 'name' manquante", "categories.missingUniqueIdColumn": "Colonne obligatoire 'unique_id' manquante", - "categories.nameAndIdRequired": "Le nom et l’ID unique sont obligatoires.", - "categories.csvNeedRows": "Le fichier doit contenir une ligne d'en-tête et au moins une ligne de données", + "categories.nameAndIdRequired": "Le nom et l’ID unique sont obligatoires.", + "categories.csvNeedRows": "Le fichier doit contenir une ligne d'en-tête et au moins une ligne de données", "categories.titleFormula": "Formule de titre", "categories.descriptionFormula": "Formule de description", - "categories.setTitleFormula": "Définir la formule de titre", + "categories.setTitleFormula": "Définir la formule de titre", "categories.editTitleFormula": "Modifier la formule de titre", - "categories.setDescriptionFormula": "Définir la formule de description", + "categories.setDescriptionFormula": "Définir la formule de description", "categories.editDescriptionFormula": "Modifier la formule de description", - "categories.setAiPrompt": "Définir le prompt IA", + "categories.setAiPrompt": "Définir le prompt IA", "categories.editAiPrompt": "Modifier le prompt IA", "categories.editAiPromptShort": "Modifier le prompt IA", - "categories.aiPromptSet": "Un prompt de génération IA est défini", - "categories.aiPromptTitle": "Prompt IA de catégorie", - "categories.aiPromptDescription": "Modèle de génération par catégorie utilisé lors de l'enrichissement des produits de cette catégorie.", - "categories.aiPromptSaved": "Prompt IA enregistré.", - "categories.aiPromptCleared": "Prompt IA effacé (la valeur par défaut de l'entreprise s'appliquera).", - "categories.aiPromptSaveFailed": "Échec de l'enregistrement du prompt", - "categories.aiPromptAssignFailed": "Échec de l'assignation du prompt", + "categories.aiPromptSet": "Un prompt de génération IA est défini", + "categories.aiPromptTitle": "Prompt IA de catégorie", + "categories.aiPromptDescription": "Modèle de génération par catégorie utilisé lors de l'enrichissement des produits de cette catégorie.", + "categories.aiPromptSaved": "Prompt IA enregistré.", + "categories.aiPromptCleared": "Prompt IA effacé (la valeur par défaut de l'entreprise s'appliquera).", + "categories.aiPromptSaveFailed": "Échec de l'enregistrement du prompt", + "categories.aiPromptAssignFailed": "Échec de l'assignation du prompt", "categories.assignAiPrompt": "Assigner le prompt IA", - "categories.assignAiPromptHelp": "Copiez ce prompt de génération IA vers d'autres catégories.", - "categories.loadingPrompt": "Chargement du prompt…", + "categories.assignAiPromptHelp": "Copiez ce prompt de génération IA vers d'autres catégories.", + "categories.loadingPrompt": "Chargement du prompt…", "categories.brandVoice": "Ton de marque", "categories.productName": "Nom du produit", "categories.gtin": "GTIN", - "categories.backToCategories": "Retour aux catégories", - "categories.cancelReturn": "Annuler et revenir aux catégories", + "categories.backToCategories": "Retour aux catégories", + "categories.cancelReturn": "Annuler et revenir aux catégories", "categories.assignFormula": "Assigner la formule", - "categories.assignFormulaOther": "Assigner la formule à d'autres catégories", + "categories.assignFormulaOther": "Assigner la formule à d'autres catégories", "categories.assignTitleFormula": "Assigner la formule de titre", "categories.assignDescriptionFormula": "Assigner la formule de description", - "categories.assignSelectHelp": "Sélectionnez les catégories auxquelles appliquer ce modèle.", - "categories.assignTitleHelp": "Sélectionnez les catégories auxquelles appliquer ce modèle de formule de titre.", - "categories.assignDescriptionHelp": "Sélectionnez les catégories auxquelles appliquer ce modèle de formule de description.", - "categories.searchCategories": "Rechercher des catégories…", + "categories.assignSelectHelp": "Sélectionnez les catégories auxquelles appliquer ce modèle.", + "categories.assignTitleHelp": "Sélectionnez les catégories auxquelles appliquer ce modèle de formule de titre.", + "categories.assignDescriptionHelp": "Sélectionnez les catégories auxquelles appliquer ce modèle de formule de description.", + "categories.searchCategories": "Rechercher des catégories…", "categories.matching": " correspondantes", - "categories.titleFormulaHelp": "Créez des titres produit à partir de variables et de texte fixe pour cette catégorie.", - "categories.descriptionFormulaHelp": "Définissez le texte méta SEO et les sections de corps que l'IA doit générer pour cette catégorie.", - "categories.loadingFormula": "Chargement de la formule…", - "categories.titleFormulaSaved": "Formule de titre enregistrée avec succès", - "categories.titleFormulaRemoved": "Formule de titre supprimée avec succès", - "categories.titleFormulaSaveFailed": "Échec de l'enregistrement de la formule de titre", - "categories.titleFormulaAssignFailed": "Échec de l'assignation de la formule de titre", - "categories.descriptionFormulaRemoved": "Formule de description supprimée avec succès", - "categories.descriptionFormulaSaved": "Formule de description enregistrée avec succès", - "categories.descriptionFormulaSavedWithExports": "Formule de description enregistrée avec succès et {count} IDs d’export synchronisés", - "categories.descriptionFormulaSaveFailed": "Échec de l'enregistrement de la formule de description", - "categories.descriptionFormulaAssignFailed": "Échec de l'assignation de la formule de description", - "categories.seoTitlePlaceholder": "Indiquez à l'IA comment rédiger le titre SEO…", - "categories.seoDescriptionPlaceholder": "Indiquez à l'IA comment rédiger la description SEO…", - "categories.sectionPromptPlaceholder": "Que doit écrire l'IA dans cette section ?", + "categories.titleFormulaHelp": "Créez des titres produit à partir de variables et de texte fixe pour cette catégorie.", + "categories.descriptionFormulaHelp": "Définissez le texte méta SEO et les sections de corps que l'IA doit générer pour cette catégorie.", + "categories.loadingFormula": "Chargement de la formule…", + "categories.titleFormulaSaved": "Formule de titre enregistrée avec succès", + "categories.titleFormulaRemoved": "Formule de titre supprimée avec succès", + "categories.titleFormulaSaveFailed": "Échec de l'enregistrement de la formule de titre", + "categories.titleFormulaAssignFailed": "Échec de l'assignation de la formule de titre", + "categories.descriptionFormulaRemoved": "Formule de description supprimée avec succès", + "categories.descriptionFormulaSaved": "Formule de description enregistrée avec succès", + "categories.descriptionFormulaSavedWithExports": "Formule de description enregistrée avec succès et {count} IDs d’export synchronisés", + "categories.descriptionFormulaSaveFailed": "Échec de l'enregistrement de la formule de description", + "categories.descriptionFormulaAssignFailed": "Échec de l'assignation de la formule de description", + "categories.seoTitlePlaceholder": "Indiquez à l'IA comment rédiger le titre SEO…", + "categories.seoDescriptionPlaceholder": "Indiquez à l'IA comment rédiger la description SEO…", + "categories.sectionPromptPlaceholder": "Que doit écrire l'IA dans cette section ?", "categories.sectionKeyPlaceholder": "p. ex. short_description (lettres, chiffres, _)", - "categories.formulaElementTypes": "Types d'éléments de formule", - "categories.formulaElements": "Éléments de formule", - "categories.elementSeparator": "Séparateur d'éléments", + "categories.formulaElementTypes": "Types d'éléments de formule", + "categories.formulaElements": "Éléments de formule", + "categories.elementSeparator": "Séparateur d'éléments", "categories.elementSeparatorHint": "Espace, tiret, etc.", - "categories.dragToReorder": "Glisser pour réordonner", - "categories.addCustomVariable": "Ajouter une variable personnalisée", - "categories.editCustomVariable": "Modifier la variable personnalisée", - "categories.customVariableHelp": "Définissez une variable réutilisable pour les formules de titre.", - "categories.manageVariables": "Gérer les variables", + "categories.dragToReorder": "Glisser pour réordonner", + "categories.addCustomVariable": "Ajouter une variable personnalisée", + "categories.editCustomVariable": "Modifier la variable personnalisée", + "categories.customVariableHelp": "Définissez une variable réutilisable pour les formules de titre.", + "categories.manageVariables": "Gérer les variables", "categories.manageVariablesHelp": "Affichez, modifiez et ajoutez des variables pour vos formules de titre.", - "categories.searchVariables": "Rechercher des variables…", - "categories.variableAdded": "Variable ajoutée avec succès", - "categories.variableUpdated": "Variable mise à jour avec succès", - "categories.variableDeleted": "Variable supprimée avec succès", - "categories.variableDeleteFailed": "Échec de la suppression de la variable", + "categories.searchVariables": "Rechercher des variables…", + "categories.variableAdded": "Variable ajoutée avec succès", + "categories.variableUpdated": "Variable mise à jour avec succès", + "categories.variableDeleted": "Variable supprimée avec succès", + "categories.variableDeleteFailed": "Échec de la suppression de la variable", "categories.variableNameRequired": "Le nom de la variable est obligatoire", "categories.displayNameRequired": "Le nom d'affichage est obligatoire", "categories.variableNamePattern": "Le nom ne peut contenir que des lettres, chiffres et underscores", "categories.deleteVariableConfirm": "Voulez-vous vraiment supprimer cette variable ? Cela peut affecter les formules qui l'utilisent.", - "categories.removeElementConfirm": "Voulez-vous vraiment retirer cet élément de votre formule ?", - "categories.addTextElement": "Ajouter un élément texte", - "categories.addTextElementHelp": "Ajoutez un élément texte fixe à votre formule.", - "categories.editTextElement": "Modifier l'élément texte", - "categories.editTextElementHelp": "Modifiez l'élément texte de votre formule.", + "categories.removeElementConfirm": "Voulez-vous vraiment retirer cet élément de votre formule ?", + "categories.addTextElement": "Ajouter un élément texte", + "categories.addTextElementHelp": "Ajoutez un élément texte fixe à votre formule.", + "categories.editTextElement": "Modifier l'élément texte", + "categories.editTextElementHelp": "Modifiez l'élément texte de votre formule.", "categories.staticTextPlaceholder": "Saisir le texte fixe", - "categories.textCannotBeEmpty": "Le texte ne peut pas être vide", + "categories.textCannotBeEmpty": "Le texte ne peut pas être vide", "categories.exampleProductName": "Nom du produit", "categories.exampleWidget": "Acme Widget Pro (exemple)", "fields.title": "Champs standard", - "fields.description": "Définissez des champs produit standard et organisez-les en groupes", - "fields.loading": "Chargement des champs standard…", - "fields.loadFailed": "Échec du chargement des champs", - "fields.loadGroupsFailed": "Échec du chargement des groupes de champs", + "fields.description": "Définissez des champs produit standard et organisez-les en groupes", + "fields.loading": "Chargement des champs standard…", + "fields.loadFailed": "Échec du chargement des champs", + "fields.loadGroupsFailed": "Échec du chargement des groupes de champs", "fields.addField": "Ajouter un champ", "fields.addGroup": "Ajouter un groupe", - "fields.createField": "Créer un champ", - "fields.createGroup": "Créer un groupe", + "fields.createField": "Créer un champ", + "fields.createGroup": "Créer un groupe", "fields.editField": "Modifier le champ", "fields.editGroup": "Modifier le groupe", "fields.basicInfo": "Informations de base", - "fields.createFieldHelp": "Créez un nouveau champ standard pour vos données produit", - "fields.editFieldHelp": "Mettez à jour les détails de ce champ standard", - "fields.createGroupHelp": "Créez un nouveau groupe pour organiser vos champs standard", - "fields.editGroupHelp": "Mettez à jour les détails de ce groupe de champs", - "fields.dataTypeHint": "Type de données de ce champ", - "fields.defaultValueOptional": "Valeur par défaut (facultatif)", + "fields.createFieldHelp": "Créez un nouveau champ standard pour vos données produit", + "fields.editFieldHelp": "Mettez à jour les détails de ce champ standard", + "fields.createGroupHelp": "Créez un nouveau groupe pour organiser vos champs standard", + "fields.editGroupHelp": "Mettez à jour les détails de ce groupe de champs", + "fields.dataTypeHint": "Type de données de ce champ", + "fields.defaultValueOptional": "Valeur par défaut (facultatif)", "fields.fieldDescriptionPlaceholder": "Saisissez une description pour ce champ", "fields.groupDescriptionPlaceholder": "Saisissez une description pour ce groupe", "fields.keyHint": "Uniquement lettres minuscules, chiffres et underscores", "fields.exampleTitle": "Titre du produit", - "fields.noFields": "Aucun champ trouvé. Cliquez sur « Ajouter un champ » pour en créer un.", - "fields.noFieldsMatch": "Aucun champ ne correspond à votre recherche", - "fields.noGroups": "Aucun groupe trouvé. Créez votre premier groupe.", - "fields.noGroupsMatch": "Aucun groupe ne correspond à votre recherche", - "fields.fieldCreated": "Champ créé avec succès", - "fields.fieldUpdated": "Champ mis à jour avec succès", - "fields.fieldDeleted": "Champ supprimé avec succès", - "fields.groupCreated": "Groupe créé avec succès", - "fields.groupUpdated": "Groupe mis à jour avec succès", - "fields.groupDeleted": "Groupe supprimé avec succès", - "fields.saveFieldFailed": "Échec de l'enregistrement du champ", - "fields.saveGroupFailed": "Échec de l'enregistrement du groupe", - "fields.updateFieldFailed": "Échec de la mise à jour du champ", - "fields.updateUnitFailed": "Échec de la mise à jour de l'unité", - "fields.deleteFieldFailed": "Échec de la suppression du champ", - "fields.deleteGroupFailed": "Échec de la suppression du groupe", - "fields.bulkUpdateFailed": "Échec de la mise à jour en masse", - "fields.enableRecommendedFailed": "Échec de l'activation des champs recommandés", - "fields.enabledRecommended": "Champs e-commerce recommandés activés", - "fields.deleteFieldConfirm": "Cette action est irréversible. Elle supprimera définitivement le champ et le retirera de tout modèle qui l'utilise.", - "fields.deleteGroupConfirm": "Cette action est irréversible. Elle supprimera définitivement le groupe. Les champs de ce groupe devront être réaffectés.", + "fields.noFields": "Aucun champ trouvé. Cliquez sur « Ajouter un champ » pour en créer un.", + "fields.noFieldsMatch": "Aucun champ ne correspond à votre recherche", + "fields.noGroups": "Aucun groupe trouvé. Créez votre premier groupe.", + "fields.noGroupsMatch": "Aucun groupe ne correspond à votre recherche", + "fields.fieldCreated": "Champ créé avec succès", + "fields.fieldUpdated": "Champ mis à jour avec succès", + "fields.fieldDeleted": "Champ supprimé avec succès", + "fields.groupCreated": "Groupe créé avec succès", + "fields.groupUpdated": "Groupe mis à jour avec succès", + "fields.groupDeleted": "Groupe supprimé avec succès", + "fields.saveFieldFailed": "Échec de l'enregistrement du champ", + "fields.saveGroupFailed": "Échec de l'enregistrement du groupe", + "fields.updateFieldFailed": "Échec de la mise à jour du champ", + "fields.updateUnitFailed": "Échec de la mise à jour de l'unité", + "fields.deleteFieldFailed": "Échec de la suppression du champ", + "fields.deleteGroupFailed": "Échec de la suppression du groupe", + "fields.bulkUpdateFailed": "Échec de la mise à jour en masse", + "fields.enableRecommendedFailed": "Échec de l'activation des champs recommandés", + "fields.enabledRecommended": "Champs e-commerce recommandés activés", + "fields.deleteFieldConfirm": "Cette action est irréversible. Elle supprimera définitivement le champ et le retirera de tout modèle qui l'utilise.", + "fields.deleteGroupConfirm": "Cette action est irréversible. Elle supprimera définitivement le groupe. Les champs de ce groupe devront être réaffectés.", "fields.type.string": "Texte", "fields.type.stringHint": "Texte libre : noms, codes, notes courtes", "fields.type.number": "Nombre", - "fields.type.numberHint": "Valeur numérique ; ajoutez une unité si utile (EUR, pcs)", + "fields.type.numberHint": "Valeur numérique ; ajoutez une unité si utile (EUR, pcs)", "fields.type.boolean": "Oui / Non", "fields.type.booleanHint": "Vrai ou faux", "fields.type.date": "Date", "fields.type.dateHint": "Une date de calendrier", "fields.type.url": "URL", - "fields.type.urlHint": "Lien web (page produit, vidéo, fabricant)", + "fields.type.urlHint": "Lien web (page produit, vidéo, fabricant)", "fields.type.image": "Visuel", "fields.type.imageHint": "URL d'image ou image de galerie", "fields.type.dimension": "Dimension", "fields.type.dimensionHint": "Mesure de longueur (largeur, hauteur, profondeur)", "fields.type.weight": "Poids", - "fields.type.weightHint": "Masse / poids d'expédition", + "fields.type.weightHint": "Masse / poids d'expédition", "fields.type.color": "Couleur", "fields.type.colorHint": "Nom ou code de couleur", - "fields.type.custom": "Personnalisé", - "fields.type.customHint": "Champ spécial / libre", + "fields.type.custom": "Personnalisé", + "fields.type.customHint": "Champ spécial / libre", "empty.admin.knowledgeHeading": "Base de connaissances", "empty.admin.translationsHeading": "Traductions", - "flash.attrs.createdLinkFailed": "Attribut créé, mais l'assignation de catégorie a échoué.", - "flash.attrs.created": "Attribut créé.", - "flash.attrs.csvImported": "Import CSV terminé.", - "flash.attrs.updated": "Attribut mis à jour.", - "flash.attrs.deleted": "Attribut supprimé.", - "flash.attrs.valueDeleted": "Valeur supprimée.", - "flash.attrs.assignedLinks": "{count} lien(s) catégorie–attribut assigné(s).", - "flash.brand.saved": "Kit de marque enregistré.", - "flash.brand.logoType": "Le logo doit être PNG, JPEG ou WebP", - "flash.brand.logoSize": "Le logo dépasse la limite de 2 MiB", - "flash.brand.logoUploaded": "Logo téléversé.", - "flash.categories.updated": "La catégorie a été mise à jour avec succès.", - "flash.categories.deleted": "La catégorie a été supprimée avec succès.", - "flash.categories.csvImported": "Import CSV terminé.", + "flash.attrs.createdLinkFailed": "Attribut créé, mais l'assignation de catégorie a échoué.", + "flash.attrs.created": "Attribut créé.", + "flash.attrs.csvImported": "Import CSV terminé.", + "flash.attrs.updated": "Attribut mis à jour.", + "flash.attrs.deleted": "Attribut supprimé.", + "flash.attrs.valueDeleted": "Valeur supprimée.", + "flash.attrs.assignedLinks": "{count} lien(s) catégorie–attribut assigné(s).", + "flash.brand.saved": "Kit de marque enregistré.", + "flash.brand.logoType": "Le logo doit être PNG, JPEG ou WebP", + "flash.brand.logoSize": "Le logo dépasse la limite de 2 MiB", + "flash.brand.logoUploaded": "Logo téléversé.", + "flash.categories.updated": "La catégorie a été mise à jour avec succès.", + "flash.categories.deleted": "La catégorie a été supprimée avec succès.", + "flash.categories.csvImported": "Import CSV terminé.", "flash.products.csvImported": "Product CSV import finished.", - "flash.categories.descFormulaAssigned": "Formule de description assignée à {count} catégories", - "flash.categories.promptAssigned": "Prompt assigné à {count} {noun}.", - "flash.categories.promptNounOne": "catégorie", - "flash.categories.promptNounMany": "catégories", - "flash.categories.titleFormulaAssigned": "Formule de titre assignée à {count} {noun}", - "flash.categories.variableDeleted": "Variable supprimée avec succès", - "flash.export.updated": "Feed d'export mis à jour.", - "flash.export.created": "Feed d'export créé.", - "flash.export.urlCopied": "URL publique du feed {format} copiée. Collez-la dans tout système qui récupère des feeds produit.", - "flash.export.copyFailed": "Échec de la copie de l'URL dans le presse-papiers", - "flash.export.refreshed": "Feed actualisé.", - "flash.export.refreshedWithCount": "Feed actualisé ({count} produits).", - "flash.export.deleted": "Feed d'export supprimé avec succès.", + "flash.categories.descFormulaAssigned": "Formule de description assignée à {count} catégories", + "flash.categories.promptAssigned": "Prompt assigné à {count} {noun}.", + "flash.categories.promptNounOne": "catégorie", + "flash.categories.promptNounMany": "catégories", + "flash.categories.titleFormulaAssigned": "Formule de titre assignée à {count} {noun}", + "flash.categories.variableDeleted": "Variable supprimée avec succès", + "flash.export.updated": "Feed d'export mis à jour.", + "flash.export.created": "Feed d'export créé.", + "flash.export.urlCopied": "URL publique du feed {format} copiée. Collez-la dans tout système qui récupère des feeds produit.", + "flash.export.copyFailed": "Échec de la copie de l'URL dans le presse-papiers", + "flash.export.refreshed": "Feed actualisé.", + "flash.export.refreshedWithCount": "Feed actualisé ({count} produits).", + "flash.export.deleted": "Feed d'export supprimé avec succès.", "flash.export.tokenRotated": "Jeton d URL publique renouvele. Mettez a jour les systemes qui utilisent l ancienne URL.", "common.edit": "Modifier", - "common.previous": "Précédent", + "common.previous": "Précédent", "common.next": "Suivant", - "common.saving": "Enregistrement…", - "common.deleting": "Suppression…", - "common.adding": "Ajout…", - "common.processing": "Traitement…", - "common.upload": "Téléverser", - "common.expand": "Développer", - "common.collapse": "Réduire", + "common.saving": "Enregistrement…", + "common.deleting": "Suppression…", + "common.adding": "Ajout…", + "common.processing": "Traitement…", + "common.upload": "Téléverser", + "common.expand": "Développer", + "common.collapse": "Réduire", "common.optional": "Facultatif", - "common.enabled": "Activé", - "common.on": "Activé", - "common.off": "Désactivé", - "common.system": "Système", + "common.enabled": "Activé", + "common.on": "Activé", + "common.off": "Désactivé", + "common.system": "Système", "common.type": "Type", - "common.unit": "Unité", + "common.unit": "Unité", "common.group": "Groupe", "common.search": "Rechercher", "common.openMenu": "Ouvrir le menu", - "common.areYouSure": "Êtes-vous sûr ?", - "common.selectGroup": "Sélectionner un groupe", + "common.areYouSure": "Êtes-vous sûr ?", + "common.selectGroup": "Sélectionner un groupe", "attributes.addAttribute": "Ajouter un attribut", - "attributes.searchPlaceholder": "Rechercher des attributs…", - "attributes.searchAria": "Rechercher des attributs (appuyez sur Entrée pour rechercher)", - "attributes.filterCategoryAria": "Filtrer par catégorie", - "attributes.allCategories": "Toutes les catégories", + "attributes.searchPlaceholder": "Rechercher des attributs…", + "attributes.searchAria": "Rechercher des attributs (appuyez sur Entrée pour rechercher)", + "attributes.filterCategoryAria": "Filtrer par catégorie", + "attributes.allCategories": "Toutes les catégories", "attributes.col.name": "Nom", - "attributes.col.key": "Clé d'attribut", + "attributes.col.key": "Clé d'attribut", "attributes.col.type": "Type", - "attributes.col.unit": "Unité", - "attributes.col.categories": "Catégories", - "attributes.col.updated": "Dernière mise à jour", + "attributes.col.unit": "Unité", + "attributes.col.categories": "Catégories", + "attributes.col.updated": "Dernière mise à jour", "attributes.col.actions": "Actions", - "attributes.emptyTitle": "Aucun attribut trouvé", - "attributes.emptyFiltered": "Essayez d'effacer la recherche ou le filtre de catégorie.", + "attributes.emptyTitle": "Aucun attribut trouvé", + "attributes.emptyFiltered": "Essayez d'effacer la recherche ou le filtre de catégorie.", "attributes.emptyHint": "Ajoutez un attribut ou importez un CSV pour commencer.", "attributes.noValues": "Aucune valeur", "attributes.actionsAria": "Actions sur l'attribut", - "attributes.editDetails": "Modifier les détails", + "attributes.editDetails": "Modifier les détails", "attributes.loadingValues": "Chargement des valeurs...", - "attributes.noValuesYetHint": "Aucune valeur ajoutée. Utilisez « Manage Values » pour en ajouter.", + "attributes.noValuesYetHint": "Aucune valeur ajoutée. Utilisez « Manage Values » pour en ajouter.", "attributes.pageZero": "0 attributs", - "attributes.pageShowing": "Affichage de {from}–{to} sur {total} attributs", - "attributes.linkCategoryFailed": "Impossible d'assigner l'attribut à la catégorie sélectionnée.", - "attributes.createdLinkFailed": "Attribut créé, mais l'assignation de catégorie a échoué.", - "attributes.createFailed": "Échec de la création", - "attributes.importFinished": "Import CSV terminé.", - "attributes.importFailed": "Échec de l'import", - "attributes.updateFailed": "Échec de la mise à jour", - "attributes.deleteFailed": "Échec de la suppression", - "attributes.valueUpdated": "Valeur mise à jour.", - "attributes.valueAdded": "Valeur ajoutée.", + "attributes.pageShowing": "Affichage de {from}–{to} sur {total} attributs", + "attributes.linkCategoryFailed": "Impossible d'assigner l'attribut à la catégorie sélectionnée.", + "attributes.createdLinkFailed": "Attribut créé, mais l'assignation de catégorie a échoué.", + "attributes.createFailed": "Échec de la création", + "attributes.importFinished": "Import CSV terminé.", + "attributes.importFailed": "Échec de l'import", + "attributes.updateFailed": "Échec de la mise à jour", + "attributes.deleteFailed": "Échec de la suppression", + "attributes.valueUpdated": "Valeur mise à jour.", + "attributes.valueAdded": "Valeur ajoutée.", "attributes.valueSaveFailed": "Impossible d'enregistrer la valeur", - "attributes.valueDeleted": "Valeur supprimée.", + "attributes.valueDeleted": "Valeur supprimée.", "attributes.valueDeleteFailed": "Impossible de supprimer la valeur", - "attributes.csvNeedRows": "Le CSV doit inclure un en-tête et au moins une ligne", - "attributes.rowUnknown": "Ligne {row} : catégorie ou attribut inconnu", + "attributes.csvNeedRows": "Le CSV doit inclure un en-tête et au moins une ligne", + "attributes.rowUnknown": "Ligne {row} : catégorie ou attribut inconnu", "attributes.rowLinkFailed": "Ligne {row} : {detail}", - "attributes.linkFailedShort": "échec du lien", - "attributes.assignedLinks": "{count} lien(s) catégorie–attribut assigné(s).", - "attributes.rowsFailed": "{count} ligne(s) ont échoué.", + "attributes.linkFailedShort": "échec du lien", + "attributes.assignedLinks": "{count} lien(s) catégorie–attribut assigné(s).", + "attributes.rowsFailed": "{count} ligne(s) ont échoué.", "attributes.addTitle": "Ajouter un nouvel attribut", - "attributes.addDesc": "Créez une nouvelle définition d'attribut. Vous pouvez l'assigner à une catégorie pendant la création.", + "attributes.addDesc": "Créez une nouvelle définition d'attribut. Vous pouvez l'assigner à une catégorie pendant la création.", "attributes.tab.single": "Unique", "attributes.tab.bulk": "Import en masse", - "attributes.field.key": "Clé d'attribut", + "attributes.field.key": "Clé d'attribut", "attributes.field.keyPlaceholder": "attribut-key", - "attributes.field.displayName": "Nom affiché", - "attributes.field.displayNamePlaceholder": "Nom affiché de l'attribut", + "attributes.field.displayName": "Nom affiché", + "attributes.field.displayNamePlaceholder": "Nom affiché de l'attribut", "attributes.field.type": "Type", "attributes.field.typeDefaultHint": "Choisissez comment les valeurs sont saisies pour cet attribut.", - "attributes.field.category": "Catégorie", - "attributes.field.categoryPlaceholder": "Sélectionner une catégorie…", - "attributes.field.categoryHint": "Sélectionnez la catégorie à laquelle appartient cet attribut. Les attributs doivent être assignés à une catégorie.", - "attributes.field.unitOptional": "Unité (facultatif)", + "attributes.field.category": "Catégorie", + "attributes.field.categoryPlaceholder": "Sélectionner une catégorie…", + "attributes.field.categoryHint": "Sélectionnez la catégorie à laquelle appartient cet attribut. Les attributs doivent être assignés à une catégorie.", + "attributes.field.unitOptional": "Unité (facultatif)", "attributes.field.unitPlaceholder": "p. ex. cm, kg, etc.", "attributes.field.exampleOptional": "Exemple (facultatif)", "attributes.field.examplePlaceholder": "p. ex. 100x200", - "attributes.createAttribute": "Créer l'attribut", + "attributes.createAttribute": "Créer l'attribut", "attributes.bulk.fileLabel": "Fichier CSV ou TSV", - "attributes.bulk.downloadCsv": "Télécharger le modèle CSV", - "attributes.bulk.downloadTsv": "Télécharger le modèle TSV", - "attributes.bulk.uploadHint": "Téléversez un fichier CSV ou TSV avec les colonnes suivantes :", + "attributes.bulk.downloadCsv": "Télécharger le modèle CSV", + "attributes.bulk.downloadTsv": "Télécharger le modèle TSV", + "attributes.bulk.uploadHint": "Téléversez un fichier CSV ou TSV avec les colonnes suivantes :", "attributes.bulk.col.key": "Identifiant unique (obligatoire)", - "attributes.bulk.col.name": "Nom affiché (obligatoire)", - "attributes.bulk.col.valueType": "string (Texte), number, boolean (Oui/Non), date, list (Liste déroulante), multiselect", - "attributes.bulk.col.categoryId": "ID unique de catégorie", + "attributes.bulk.col.name": "Nom affiché (obligatoire)", + "attributes.bulk.col.valueType": "string (Texte), number, boolean (Oui/Non), date, list (Liste déroulante), multiselect", + "attributes.bulk.col.categoryId": "ID unique de catégorie", "attributes.bulk.col.unitExample": "facultatif", - "attributes.bulk.col.parentKey": "Clé parente pour les valeurs de liste", + "attributes.bulk.col.parentKey": "Clé parente pour les valeurs de liste", "attributes.editTitle": "Modifier l'attribut", - "attributes.editDesc": "Mettre à jour les détails de l'attribut « {name} »", + "attributes.editDesc": "Mettre à jour les détails de l'attribut « {name} »", "attributes.field.keyHint": "Identifiant unique de cet attribut", - "attributes.field.displayNameHint": "Le nom qui sera affiché aux utilisateurs", + "attributes.field.displayNameHint": "Le nom qui sera affiché aux utilisateurs", "attributes.deleteTitle": "Supprimer l'attribut", - "attributes.deleteDesc": "Voulez-vous vraiment supprimer « {name} » ? Cette action est irréversible.", - "attributes.deleteWarningValues": "Attention : cela supprimera aussi toutes les valeurs associées à cet attribut.", - "attributes.manageTitleNamed": "Gérer les valeurs de {name}", - "attributes.manageTitle": "Gérer les valeurs", + "attributes.deleteDesc": "Voulez-vous vraiment supprimer « {name} » ? Cette action est irréversible.", + "attributes.deleteWarningValues": "Attention : cela supprimera aussi toutes les valeurs associées à cet attribut.", + "attributes.manageTitleNamed": "Gérer les valeurs de {name}", + "attributes.manageTitle": "Gérer les valeurs", "attributes.manageDesc": "Ajouter, modifier ou supprimer des valeurs pour cet attribut de liste.", - "attributes.valueKey": "Clé de valeur", + "attributes.valueKey": "Clé de valeur", "attributes.valueKeyHint": "Identifiant unique de cette valeur", - "attributes.displayValue": "Valeur affichée", - "attributes.displayValuePlaceholder": "Valeur à afficher", - "attributes.displayValueHint": "Le nom affiché qui sera montré pour cette valeur", - "attributes.updateValue": "Mettre à jour la valeur", + "attributes.displayValue": "Valeur affichée", + "attributes.displayValuePlaceholder": "Valeur à afficher", + "attributes.displayValueHint": "Le nom affiché qui sera montré pour cette valeur", + "attributes.updateValue": "Mettre à jour la valeur", "attributes.noValuesYet": "Pas encore de valeurs.", - "attributes.assignTitle": "Assigner des attributs aux catégories", - "attributes.assignDesc": "Téléversez un CSV associant les ID uniques de catégorie aux clés d'attribut.", - "attributes.downloadTemplate": "Télécharger le modèle", + "attributes.assignTitle": "Assigner des attributs aux catégories", + "attributes.assignDesc": "Téléversez un CSV associant les ID uniques de catégorie aux clés d'attribut.", + "attributes.downloadTemplate": "Télécharger le modèle", "attributes.csvFile": "Fichier CSV", - "attributes.assignSuccess": "Assignations appliquées avec succès.", - "attributes.assigning": "Attribution…", - "attributes.uploadAndAssign": "Téléverser et assigner", + "attributes.assignSuccess": "Assignations appliquées avec succès.", + "attributes.assigning": "Attribution…", + "attributes.uploadAndAssign": "Téléverser et assigner", "attributes.type.string.label": "Texte", - "attributes.type.string.hint": "Texte libre — noms, modèles, notes courtes", + "attributes.type.string.hint": "Texte libre — noms, modèles, notes courtes", "attributes.type.number.label": "Nombre", - "attributes.type.number.hint": "Valeur numérique ; ajoutez une unité si utile (cm, kg, W)", + "attributes.type.number.hint": "Valeur numérique ; ajoutez une unité si utile (cm, kg, W)", "attributes.type.boolean.label": "Oui / Non", - "attributes.type.boolean.hint": "Vrai ou faux — ex. a un GPS, charge sans fil", + "attributes.type.boolean.hint": "Vrai ou faux — ex. a un GPS, charge sans fil", "attributes.type.date.label": "Date", - "attributes.type.date.hint": "Une date calendaire (sortie, fin de garantie, …)", - "attributes.type.list.label": "Liste déroulante", - "attributes.type.list.hint": "Choisissez exactement une option dans une liste définie", - "attributes.type.multiselect.label": "Sélection multiple", + "attributes.type.date.hint": "Une date calendaire (sortie, fin de garantie, …)", + "attributes.type.list.label": "Liste déroulante", + "attributes.type.list.hint": "Choisissez exactement une option dans une liste définie", + "attributes.type.multiselect.label": "Sélection multiple", "attributes.type.multiselect.hint": "Choisissez une ou plusieurs options dans une liste", "standardFields.title": "Champs standard", - "standardFields.description": "Définissez des champs produit standard et organisez-les en groupes", - "standardFields.apiUnavailable": "L'API des champs standard n'est pas disponible. Les modifications ne peuvent pas être enregistrées.", - "standardFields.apiUnreachable": "L'API des champs standard n'est pas joignable pour le moment. Créer/modifier reste désactivé jusqu'à ce que /api/standard-fields et /api/field-groups répondent.", - "standardFields.loading": "Chargement des champs standard…", + "standardFields.description": "Définissez des champs produit standard et organisez-les en groupes", + "standardFields.apiUnavailable": "L'API des champs standard n'est pas disponible. Les modifications ne peuvent pas être enregistrées.", + "standardFields.apiUnreachable": "L'API des champs standard n'est pas joignable pour le moment. Créer/modifier reste désactivé jusqu'à ce que /api/standard-fields et /api/field-groups répondent.", + "standardFields.loading": "Chargement des champs standard…", "standardFields.tab.fields": "Champs", "standardFields.tab.groups": "Groupes", "standardFields.heading": "Champs standard", - "standardFields.headingHint": "Activez les champs pour le mapping et le traitement — une bascule par ligne.", - "standardFields.enableRecommended": "Activer les recommandés", - "standardFields.enableSelected": "Activer la sélection ({count})", - "standardFields.disableSelected": "Désactiver la sélection", + "standardFields.headingHint": "Activez les champs pour le mapping et le traitement — une bascule par ligne.", + "standardFields.enableRecommended": "Activer les recommandés", + "standardFields.enableSelected": "Activer la sélection ({count})", + "standardFields.disableSelected": "Désactiver la sélection", "standardFields.addField": "Ajouter un champ", "standardFields.searchFields": "Rechercher des champs...", - "standardFields.col.enabled": "Activé", + "standardFields.col.enabled": "Activé", "standardFields.col.name": "Nom", - "standardFields.col.key": "Clé", + "standardFields.col.key": "Clé", "standardFields.col.type": "Type", - "standardFields.col.unit": "Unité", + "standardFields.col.unit": "Unité", "standardFields.col.group": "Groupe", "standardFields.col.status": "Statut", - "standardFields.emptySearch": "Aucun champ ne correspond à votre recherche", - "standardFields.emptyHint": "Aucun champ trouvé. Cliquez sur « Ajouter un champ » pour en créer un.", - "standardFields.selectFieldAria": "Sélectionner {name}", + "standardFields.emptySearch": "Aucun champ ne correspond à votre recherche", + "standardFields.emptyHint": "Aucun champ trouvé. Cliquez sur « Ajouter un champ » pour en créer un.", + "standardFields.selectFieldAria": "Sélectionner {name}", "standardFields.enableFieldAria": "Activer {name}", - "standardFields.systemFieldTitle": "Champ système — ne peut pas être supprimé", + "standardFields.systemFieldTitle": "Champ système — ne peut pas être supprimé", "standardFields.groupsHeading": "Groupes de champs", "standardFields.addGroup": "Ajouter un groupe", "standardFields.searchGroups": "Rechercher des groupes...", "standardFields.col.description": "Description", "standardFields.col.displayOrder": "Ordre d'affichage", - "standardFields.emptyGroupsSearch": "Aucun groupe ne correspond à votre recherche", - "standardFields.emptyGroupsHint": "Aucun groupe trouvé. Créez votre premier groupe.", + "standardFields.emptyGroupsSearch": "Aucun groupe ne correspond à votre recherche", + "standardFields.emptyGroupsHint": "Aucun groupe trouvé. Créez votre premier groupe.", "standardFields.unknownGroup": "Groupe inconnu", - "standardFields.loadGroupsFailed": "Échec du chargement des groupes de champs", - "standardFields.loadFieldsFailed": "Échec du chargement des champs", - "standardFields.fieldUpdated": "Champ mis à jour avec succès", - "standardFields.fieldCreated": "Champ créé avec succès", - "standardFields.saveFieldFailed": "Échec de l'enregistrement du champ", - "standardFields.enabledNamed": "Activé {name}", - "standardFields.disabledNamed": "{name} désactivé", - "standardFields.updateFieldFailed": "Échec de la mise à jour du champ", - "standardFields.updateUnitFailed": "Échec de la mise à jour de l'unité", - "standardFields.bulkEnabled": "{count} champ(s) activé(s)", - "standardFields.bulkDisabled": "{count} champ(s) désactivé(s)", - "standardFields.bulkFailed": "Échec de la mise à jour en masse", - "standardFields.recommendedEnabled": "Champs e-commerce recommandés activés", - "standardFields.recommendedFailed": "Échec de l'activation des champs recommandés", - "standardFields.fieldDeleted": "Champ supprimé avec succès", - "standardFields.deleteFieldFailed": "Échec de la suppression du champ", - "standardFields.groupUpdated": "Groupe mis à jour avec succès", - "standardFields.groupCreated": "Groupe créé avec succès", - "standardFields.saveGroupFailed": "Échec de l'enregistrement du groupe", - "standardFields.groupDeleted": "Groupe supprimé avec succès", - "standardFields.deleteGroupFailed": "Échec de la suppression du groupe", + "standardFields.loadGroupsFailed": "Échec du chargement des groupes de champs", + "standardFields.loadFieldsFailed": "Échec du chargement des champs", + "standardFields.fieldUpdated": "Champ mis à jour avec succès", + "standardFields.fieldCreated": "Champ créé avec succès", + "standardFields.saveFieldFailed": "Échec de l'enregistrement du champ", + "standardFields.enabledNamed": "Activé {name}", + "standardFields.disabledNamed": "{name} désactivé", + "standardFields.updateFieldFailed": "Échec de la mise à jour du champ", + "standardFields.updateUnitFailed": "Échec de la mise à jour de l'unité", + "standardFields.bulkEnabled": "{count} champ(s) activé(s)", + "standardFields.bulkDisabled": "{count} champ(s) désactivé(s)", + "standardFields.bulkFailed": "Échec de la mise à jour en masse", + "standardFields.recommendedEnabled": "Champs e-commerce recommandés activés", + "standardFields.recommendedFailed": "Échec de l'activation des champs recommandés", + "standardFields.fieldDeleted": "Champ supprimé avec succès", + "standardFields.deleteFieldFailed": "Échec de la suppression du champ", + "standardFields.groupUpdated": "Groupe mis à jour avec succès", + "standardFields.groupCreated": "Groupe créé avec succès", + "standardFields.saveGroupFailed": "Échec de l'enregistrement du groupe", + "standardFields.groupDeleted": "Groupe supprimé avec succès", + "standardFields.deleteGroupFailed": "Échec de la suppression du groupe", "standardFields.editField": "Modifier le champ", "standardFields.addNewField": "Ajouter un champ", - "standardFields.editFieldDesc": "Mettez à jour les détails de ce champ standard", - "standardFields.addFieldDesc": "Créez un nouveau champ standard pour vos données produit", + "standardFields.editFieldDesc": "Mettez à jour les détails de ce champ standard", + "standardFields.addFieldDesc": "Créez un nouveau champ standard pour vos données produit", "standardFields.field.name": "Nom", "standardFields.field.namePlaceholder": "Titre du produit", - "standardFields.field.nameHint": "Nom affiché de ce champ", - "standardFields.field.key": "Clé", + "standardFields.field.nameHint": "Nom affiché de ce champ", + "standardFields.field.key": "Clé", "standardFields.field.keyPlaceholder": "titre_produit", "standardFields.field.keyTitle": "Uniquement lettres minuscules, chiffres et underscores", "standardFields.field.keyHint": "Identifiant unique (minuscules, sans espaces)", "standardFields.field.type": "Type", - "standardFields.field.typeDefaultHint": "Type de données de ce champ", + "standardFields.field.typeDefaultHint": "Type de données de ce champ", "standardFields.field.group": "Groupe", "standardFields.field.groupHint": "Groupe auquel appartient ce champ", - "standardFields.field.enabled": "Activé", + "standardFields.field.enabled": "Activé", "standardFields.field.enabledHint": "Utiliser ce champ dans le mapping et le traitement", "standardFields.field.required": "Champ obligatoire", - "standardFields.field.requiredHint": "Les champs obligatoires doivent être mappés sur chaque feed avant de pouvoir synchroniser des produits.", - "standardFields.field.unit": "Unité", - "standardFields.field.unitPlaceholder": "kg, EUR, cm…", - "standardFields.field.unitHint": "Unité facultative affichée avec ce champ", + "standardFields.field.requiredHint": "Les champs obligatoires doivent être mappés sur chaque feed avant de pouvoir synchroniser des produits.", + "standardFields.field.unit": "Unité", + "standardFields.field.unitPlaceholder": "kg, EUR, cm…", + "standardFields.field.unitHint": "Unité facultative affichée avec ce champ", "standardFields.field.description": "Description", "standardFields.field.descriptionPlaceholder": "Saisissez une description pour ce champ", - "standardFields.field.default": "Valeur par défaut", - "standardFields.field.defaultPlaceholder": "Valeur par défaut (facultatif)", - "standardFields.field.defaultHint": "Valeur par défaut lorsqu'aucune valeur n'est fournie", + "standardFields.field.default": "Valeur par défaut", + "standardFields.field.defaultPlaceholder": "Valeur par défaut (facultatif)", + "standardFields.field.defaultHint": "Valeur par défaut lorsqu'aucune valeur n'est fournie", "standardFields.saveUnavailable": "Enregistrer (indisponible)", - "standardFields.updateField": "Mettre à jour le champ", - "standardFields.createField": "Créer un champ", + "standardFields.updateField": "Mettre à jour le champ", + "standardFields.createField": "Créer un champ", "standardFields.editGroup": "Modifier le groupe", "standardFields.addNewGroup": "Ajouter un groupe", - "standardFields.editGroupDesc": "Mettez à jour les détails de ce groupe de champs", - "standardFields.addGroupDesc": "Créez un nouveau groupe pour organiser vos champs standard", + "standardFields.editGroupDesc": "Mettez à jour les détails de ce groupe de champs", + "standardFields.addGroupDesc": "Créez un nouveau groupe pour organiser vos champs standard", "standardFields.group.name": "Nom", "standardFields.group.namePlaceholder": "Informations de base", - "standardFields.group.nameHint": "Nom affiché de ce groupe", + "standardFields.group.nameHint": "Nom affiché de ce groupe", "standardFields.group.description": "Description", "standardFields.group.descriptionPlaceholder": "Saisissez une description pour ce groupe", "standardFields.group.descriptionHint": "Description facultative expliquant le but de ce groupe", "standardFields.group.order": "Ordre d'affichage", - "standardFields.group.orderHint": "Les numéros plus bas apparaissent en premier", - "standardFields.updateGroup": "Mettre à jour le groupe", - "standardFields.createGroup": "Créer un groupe", - "standardFields.deleteFieldDesc": "Cette action est irréversible. Elle supprimera définitivement le champ et le retirera de tout modèle qui l'utilise.", - "standardFields.deleteGroupDesc": "Cette action est irréversible. Elle supprimera définitivement le groupe. Les champs de ce groupe devront être réaffectés.", + "standardFields.group.orderHint": "Les numéros plus bas apparaissent en premier", + "standardFields.updateGroup": "Mettre à jour le groupe", + "standardFields.createGroup": "Créer un groupe", + "standardFields.deleteFieldDesc": "Cette action est irréversible. Elle supprimera définitivement le champ et le retirera de tout modèle qui l'utilise.", + "standardFields.deleteGroupDesc": "Cette action est irréversible. Elle supprimera définitivement le groupe. Les champs de ce groupe devront être réaffectés.", "standardFields.type.string.label": "Texte", "standardFields.type.string.hint": "Texte libre : noms, codes, notes courtes", "standardFields.type.number.label": "Nombre", - "standardFields.type.number.hint": "Valeur numérique ; ajoutez une unité si utile (EUR, pcs)", + "standardFields.type.number.hint": "Valeur numérique ; ajoutez une unité si utile (EUR, pcs)", "standardFields.type.boolean.label": "Oui / Non", "standardFields.type.boolean.hint": "Vrai ou faux", "standardFields.type.date.label": "Date", "standardFields.type.date.hint": "Une date de calendrier", "standardFields.type.url.label": "URL", - "standardFields.type.url.hint": "Lien web (page produit, vidéo, fabricant)", + "standardFields.type.url.hint": "Lien web (page produit, vidéo, fabricant)", "standardFields.type.image.label": "Visuel", "standardFields.type.image.hint": "URL d'image ou image de galerie", "standardFields.type.dimension.label": "Dimension", "standardFields.type.dimension.hint": "Mesure de longueur (largeur, hauteur, profondeur)", "standardFields.type.weight.label": "Poids", - "standardFields.type.weight.hint": "Masse / poids d'expédition", + "standardFields.type.weight.hint": "Masse / poids d'expédition", "standardFields.type.color.label": "Couleur", "standardFields.type.color.hint": "Nom ou code de couleur", - "standardFields.type.custom.label": "Personnalisé", - "standardFields.type.custom.hint": "Champ spécial / libre", + "standardFields.type.custom.label": "Personnalisé", + "standardFields.type.custom.hint": "Champ spécial / libre", "standardFields.fallback.gtin": "GTIN/EAN", "standardFields.fallback.title": "Nom du produit", "standardFields.fallback.brand": "Marque", "standardFields.fallback.description": "Description", - "standardFields.fallback.product_model": "Modèle de produit", + "standardFields.fallback.product_model": "Modèle de produit", "standardFields.fallback.price": "Prix", - "standardFields.fallback.sale_price": "Prix soldé", + "standardFields.fallback.sale_price": "Prix soldé", "standardFields.fallback.purchase_price": "Prix d'achat", "standardFields.fallback.currency": "Devise", "standardFields.fallback.image_url": "URL de l'image", "standardFields.fallback.main_image": "Image principale", - "standardFields.fallback.additional_image_urls": "Images supplémentaires", + "standardFields.fallback.additional_image_urls": "Images supplémentaires", "standardFields.fallback.product_url": "URL du produit", "standardFields.fallback.official_link": "Lien officiel", "standardFields.fallback.sku": "SKU", "standardFields.fallback.mpn": "MPN", - "standardFields.fallback.category": "Catégorie", - "standardFields.fallback.availability": "Disponibilité", + "standardFields.fallback.category": "Catégorie", + "standardFields.fallback.availability": "Disponibilité", "standardFields.fallback.stock": "Stock disponible", "standardFields.fallback.color": "Couleur", "standardFields.fallback.size": "Taille", - "standardFields.fallback.material": "Matériau", + "standardFields.fallback.material": "Matériau", "standardFields.fallback.warranty": "Garantie", "standardFields.fallback.service": "Service", "standardFields.fallback.weight": "Poids", @@ -3304,78 +3305,78 @@ export const fr: MessageDict = { "standardFields.fallback.net_height": "Hauteur nette", "standardFields.fallback.net_width": "Largeur nette", "standardFields.fallback.net_mass": "Masse nette", - "standardFields.fallback.video_url": "URL de la vidéo", + "standardFields.fallback.video_url": "URL de la vidéo", "standardFields.fallback.eprel_id": "ID EPREL", - "standardFields.fallback.specs": "Spécifications", - "standardFields.fallback.specifications": "Spécifications (legacy)", + "standardFields.fallback.specs": "Spécifications", + "standardFields.fallback.specifications": "Spécifications (legacy)", "standardFields.tip.gtin": "Global Trade Item Number : code-barres/EAN/UPC identifiant le produit.", - "standardFields.tip.title": "Nom produit destiné au client, affiché dans les catalogues et canaux.", - "standardFields.tip.brand": "Nom du fabricant ou de la marque (pas du détaillant).", - "standardFields.tip.description": "Texte produit plus long ; utilisé pour l'enrichissement et les listings canaux.", - "standardFields.tip.product_model": "Nom/numéro de modèle du fabricant.", - "standardFields.tip.price": "Prix de vente régulier (numérique ; devise mappée séparément).", - "standardFields.tip.sale_price": "Prix réduit ou promotionnel en période de solde.", - "standardFields.tip.purchase_price": "Votre coût / prix d'achat (interne).", + "standardFields.tip.title": "Nom produit destiné au client, affiché dans les catalogues et canaux.", + "standardFields.tip.brand": "Nom du fabricant ou de la marque (pas du détaillant).", + "standardFields.tip.description": "Texte produit plus long ; utilisé pour l'enrichissement et les listings canaux.", + "standardFields.tip.product_model": "Nom/numéro de modèle du fabricant.", + "standardFields.tip.price": "Prix de vente régulier (numérique ; devise mappée séparément).", + "standardFields.tip.sale_price": "Prix réduit ou promotionnel en période de solde.", + "standardFields.tip.purchase_price": "Votre coût / prix d'achat (interne).", "standardFields.tip.currency": "Code devise ISO pour les champs de prix (p. ex. EUR, USD).", "standardFields.tip.image_url": "URL de l'image principale du produit.", "standardFields.tip.main_image": "URL de l'image principale de la galerie (alias de image).", - "standardFields.tip.additional_image_urls": "URL d'images supplémentaires (séparées par des virgules ou nœuds répétés).", + "standardFields.tip.additional_image_urls": "URL d'images supplémentaires (séparées par des virgules ou nÅ“uds répétés).", "standardFields.tip.product_url": "URL publique de la page produit sur votre boutique ou site.", "standardFields.tip.official_link": "URL de la page produit du fabricant ou de la marque.", "standardFields.tip.sku": "Stock Keeping Unit : votre code article interne.", - "standardFields.tip.mpn": "Manufacturer Part Number : code pièce du fournisseur.", - "standardFields.tip.category": "Catégorie produit ou chemin de taxonomie.", - "standardFields.tip.availability": "Statut de type en stock / rupture / précommande.", - "standardFields.tip.stock": "Quantité d'inventaire numérique.", + "standardFields.tip.mpn": "Manufacturer Part Number : code pièce du fournisseur.", + "standardFields.tip.category": "Catégorie produit ou chemin de taxonomie.", + "standardFields.tip.availability": "Statut de type en stock / rupture / précommande.", + "standardFields.tip.stock": "Quantité d'inventaire numérique.", "standardFields.tip.color": "Attribut de couleur pour les variantes.", "standardFields.tip.size": "Attribut de taille pour les variantes.", - "standardFields.tip.material": "Matériau principal ou composition.", - "standardFields.tip.warranty": "Durée ou texte de garantie.", + "standardFields.tip.material": "Matériau principal ou composition.", + "standardFields.tip.warranty": "Durée ou texte de garantie.", "standardFields.tip.service": "Notes de service ou d'assistance.", - "standardFields.tip.weight": "Poids d'expédition ou net.", - "standardFields.tip.eprel_id": "Identifiant produit de l'étiquette énergétique UE (EPREL).", - "standardFields.tip.specs": "Spécifications techniques structurées.", - "standardFields.tip.specifications": "Champ specs hérité ; préférez specs lorsque les deux existent.", - "export.dialog.title": "Exporter les produits sélectionnés", - "export.dialog.description": "Exporter {count} produit(s) sélectionné(s). Choisissez le feed d'export qui définit format et champs — comme choisir quoi synchroniser, mais pour un téléchargement ou un partenaire.", - "export.dialog.loadFailed": "Échec du chargement des options de feed d'export. Veuillez réessayer.", - "export.dialog.selectPlaceholder": "Sélectionnez un feed d'export…", - "export.dialog.help": "Votre sélection choisit les produits ; le feed choisit le format du canal et les champs mappés.", + "standardFields.tip.weight": "Poids d'expédition ou net.", + "standardFields.tip.eprel_id": "Identifiant produit de l'étiquette énergétique UE (EPREL).", + "standardFields.tip.specs": "Spécifications techniques structurées.", + "standardFields.tip.specifications": "Champ specs hérité ; préférez specs lorsque les deux existent.", + "export.dialog.title": "Exporter les produits sélectionnés", + "export.dialog.description": "Exporter {count} produit(s) sélectionné(s). Choisissez le feed d'export qui définit format et champs — comme choisir quoi synchroniser, mais pour un téléchargement ou un partenaire.", + "export.dialog.loadFailed": "Échec du chargement des options de feed d'export. Veuillez réessayer.", + "export.dialog.selectPlaceholder": "Sélectionnez un feed d'export…", + "export.dialog.help": "Votre sélection choisit les produits ; le feed choisit le format du canal et les champs mappés.", "export.dialog.emptyTitle": "Aucun feed d'export pour l'instant", - "export.dialog.emptyMessage": "Créez un feed d'export pour choisir format et champs, puis revenez exporter cette sélection.", - "export.dialog.createFeedCta": "Créer un feed d'export", + "export.dialog.emptyMessage": "Créez un feed d'export pour choisir format et champs, puis revenez exporter cette sélection.", + "export.dialog.createFeedCta": "Créer un feed d'export", "export.dialog.confirmAria": "Confirmer l'export", "export.dialog.export": "Exporter", "billing.title": "Utilisation et facturation", - "billing.loadFailed": "Échec du chargement de la facturation", - "billing.usageLoadFailed": "Échec du chargement de l'utilisation", - "billing.checkoutComplete": "Checkout terminé. Votre plan et vos crédits seront actualisés sous peu.", - "billing.checkoutCompletePlan": "Plan mis à jour. Vos crédits {plan} sont prêts.", - "billing.checkoutCanceled": "Checkout a été annulé. Aucune modification n'a été effectuée.", - "billing.portalReturned": "Retour du portail de facturation. Gérez votre plan ici ou dans Plans.", + "billing.loadFailed": "Échec du chargement de la facturation", + "billing.usageLoadFailed": "Échec du chargement de l'utilisation", + "billing.checkoutComplete": "Checkout terminé. Votre plan et vos crédits seront actualisés sous peu.", + "billing.checkoutCompletePlan": "Plan mis à jour. Vos crédits {plan} sont prêts.", + "billing.checkoutCanceled": "Checkout a été annulé. Aucune modification n'a été effectuée.", + "billing.portalReturned": "Retour du portail de facturation. Gérez votre plan ici ou dans Plans.", "billing.comparePlans": "Comparer les forfaits", - "billing.managePayment": "Gérer le paiement", - "billing.addCredits": "Ajouter des crédits", - "billing.addingCredits": "Ajout…", - "billing.addCreditsTitle": "Ajouter des crédits", - "billing.addCreditsDescription": "Administrateur plateforme uniquement. Les crédits sont immédiatement disponibles pour les titres IA, descriptions et autres étapes payantes.", - "billing.creditAmount": "Montant de crédit", - "billing.invalidCreditAmount": "Veuillez saisir un montant de crédits valide.", + "billing.managePayment": "Gérer le paiement", + "billing.addCredits": "Ajouter des crédits", + "billing.addingCredits": "Ajout…", + "billing.addCreditsTitle": "Ajouter des crédits", + "billing.addCreditsDescription": "Administrateur plateforme uniquement. Les crédits sont immédiatement disponibles pour les titres IA, descriptions et autres étapes payantes.", + "billing.creditAmount": "Montant de crédit", + "billing.invalidCreditAmount": "Veuillez saisir un montant de crédits valide.", "billing.companyNotFound": "Entreprise introuvable.", - "billing.creditsAdded": "{amount} crédits ont été ajoutés.", - "billing.addCreditsFailed": "Échec de l'ajout de crédits. Un accès administrateur plateforme peut être requis.", - "billing.planApplied": "Plan appliqué. Vos crédits sont prêts.", - "billing.checkoutFailed": "Échec du paiement", + "billing.creditsAdded": "{amount} crédits ont été ajoutés.", + "billing.addCreditsFailed": "Échec de l'ajout de crédits. Un accès administrateur plateforme peut être requis.", + "billing.planApplied": "Plan appliqué. Vos crédits sont prêts.", + "billing.checkoutFailed": "Échec du paiement", "billing.portalFailed": "Impossible d'ouvrir le portail de facturation", - "billing.noPlanAssigned": "Aucun forfait assigné", - "billing.unlimited": "Illimité", - "billing.payAsYouGo": "Paiement à l'usage", - "billing.noMonthlyAiCredits": "Pas de crédits IA mensuels", - "billing.header.noPlan": "Aucun plan assigné. Choisissez un plan ou demandez à un administrateur.", - "billing.header.free": "Mappez les feeds et nettoyez les données produit sans crédits IA.", - "billing.header.enterprise": "Produits et capacité IA illimités.", - "billing.header.payg": "Paiement à l'usage — les crédits proviennent du portefeuille de l'entreprise.", - "billing.header.remaining": "{remaining} crédits IA restants pour cette période.", + "billing.noPlanAssigned": "Aucun forfait assigné", + "billing.unlimited": "Illimité", + "billing.payAsYouGo": "Paiement à l'usage", + "billing.noMonthlyAiCredits": "Pas de crédits IA mensuels", + "billing.header.noPlan": "Aucun plan assigné. Choisissez un plan ou demandez à un administrateur.", + "billing.header.free": "Mappez les feeds et nettoyez les données produit sans crédits IA.", + "billing.header.enterprise": "Produits et capacité IA illimités.", + "billing.header.payg": "Paiement à l'usage — les crédits proviennent du portefeuille de l'entreprise.", + "billing.header.remaining": "{remaining} crédits IA restants pour cette période.", "billing.na": "N/A", "billing.range.7d": "7 derniers jours", "billing.range.30d": "30 derniers jours", @@ -3385,355 +3386,355 @@ export const fr: MessageDict = { "billing.rangeOpt.30d": "30 derniers jours", "billing.rangeOpt.cycle": "Cycle actuel", "billing.rangeOpt.all": "Tout le temps", - "billing.freeBannerTitle": "Vous êtes sur l'offre Free", - "billing.freeBannerMessage": "Passez à un plan supérieur pour les titres et descriptions IA, et des limites produits plus élevées.", - "billing.outOfCreditsTitle": "Vous n'avez plus de crédits IA", + "billing.freeBannerTitle": "Vous êtes sur l'offre Free", + "billing.freeBannerMessage": "Passez à un plan supérieur pour les titres et descriptions IA, et des limites produits plus élevées.", + "billing.outOfCreditsTitle": "Vous n'avez plus de crédits IA", "billing.productLimitTitle": "Limite de produits atteinte", - "billing.outOfCreditsMessage": "Les titres et descriptions IA sont en pause jusqu'à l'ajout de crédits ou une mise à niveau.", - "billing.productLimitMessage": "Passez à un plan supérieur pour plus de capacité produits.", - "billing.lowCreditsTitle": "Crédits bientôt épuisés", - "billing.lowCreditsMessage": "Il ne reste que {remaining} crédits sur {plan}. Passez à un plan supérieur avant votre prochain grand lot.", + "billing.outOfCreditsMessage": "Les titres et descriptions IA sont en pause jusqu'à l'ajout de crédits ou une mise à niveau.", + "billing.productLimitMessage": "Passez à un plan supérieur pour plus de capacité produits.", + "billing.lowCreditsTitle": "Crédits bientôt épuisés", + "billing.lowCreditsMessage": "Il ne reste que {remaining} crédits sur {plan}. Passez à un plan supérieur avant votre prochain grand lot.", "billing.currentPlan": "Forfait actuel", - "billing.periodEnds": "La période de facturation se termine le {date}", + "billing.periodEnds": "La période de facturation se termine le {date}", "billing.openEndedContract": "Contrat ouvert", - "billing.creditWallet": "Portefeuille de crédits", - "billing.creditsRemaining": "Crédits restants", - "billing.enterpriseCapacity": "Capacité gérée entreprise", - "billing.paygUsed": "{used} utilisés · pas d'allocation mensuelle", - "billing.trialLeftover": "Crédits d'essai / restants", - "billing.aiLockedFree": "IA verrouillée sur Free", - "billing.usedOf": "{used} utilisés sur {total}", - "billing.noBalanceTitle": "Pas encore de solde de crédits", - "billing.noBalanceBody": "Les crédits de votre plan s'afficheront ici une fois la facturation configurée pour cet espace de travail.", - "billing.needCapacity": "Besoin de plus de capacité ?", - "billing.selfServeUpgrade": "Mise à niveau en libre-service vers Starter, Growth ou Business", + "billing.creditWallet": "Portefeuille de crédits", + "billing.creditsRemaining": "Crédits restants", + "billing.enterpriseCapacity": "Capacité gérée entreprise", + "billing.paygUsed": "{used} utilisés · pas d'allocation mensuelle", + "billing.trialLeftover": "Crédits d'essai / restants", + "billing.aiLockedFree": "IA verrouillée sur Free", + "billing.usedOf": "{used} utilisés sur {total}", + "billing.noBalanceTitle": "Pas encore de solde de crédits", + "billing.noBalanceBody": "Les crédits de votre plan s'afficheront ici une fois la facturation configurée pour cet espace de travail.", + "billing.needCapacity": "Besoin de plus de capacité ?", + "billing.selfServeUpgrade": "Mise à niveau en libre-service vers Starter, Growth ou Business", "billing.viaStripe": "via Stripe", - "billing.checkoutUnavailable": "Les achats en libre-service sont indisponibles tant que Stripe n'est pas configuré. Contactez les ventes pour un forfait.", - "billing.upgradeToGrowth": "Passer à Growth", - "billing.askAdminPlan": "Demandez à un administrateur de changer le plan.", + "billing.checkoutUnavailable": "Les achats en libre-service sont indisponibles tant que Stripe n'est pas configuré. Contactez les ventes pour un forfait.", + "billing.upgradeToGrowth": "Passer à Growth", + "billing.askAdminPlan": "Demandez à un administrateur de changer le plan.", "billing.usage": "Utilisation", - "billing.productsProcessed": "{count} produits traités · {range}", - "billing.updating": "Mise à jour…", + "billing.productsProcessed": "{count} produits traités · {range}", + "billing.updating": "Mise à jour…", "billing.productsByDay": "Produits par jour", "billing.chartAmber": "Ambre = tokens. Plage : {range}.", "billing.chartRange": "Plage : {range}.", - "billing.nothingToChartTitle": "Rien à afficher pour l'instant", - "billing.nothingToChartBody": "Ajoutez des produits ou connectez un feed — l'utilisation apparaîtra ici.", + "billing.nothingToChartTitle": "Rien à afficher pour l'instant", + "billing.nothingToChartBody": "Ajoutez des produits ou connectez un feed — l'utilisation apparaîtra ici.", "billing.dailyChartsHint": "Les graphiques quotidiens sont disponibles pour les 7 derniers jours, 30 jours ou le cycle de facturation en cours.", "billing.noNewProducts": "Aucun nouveau produit sur {range}", "billing.catalogOverall": "Le catalogue compte {count} produits au total.", "billing.chartProducts": "Produits", "billing.chartTokens": "Jetons", - "billing.chartEmpty": "Aucun produit sur cette période.", - "billing.adminStats": "{tokens} tokens · {jobs} tâches · {input} entrées / {export} feeds d'export", - "billing.whatUsesCredits": "Ce qui consomme des crédits", - "billing.burnsCredits": "Consomme des crédits", - "billing.noCreditCost": "Sans coût de crédits", + "billing.chartEmpty": "Aucun produit sur cette période.", + "billing.adminStats": "{tokens} tokens · {jobs} tâches · {input} entrées / {export} feeds d'export", + "billing.whatUsesCredits": "Ce qui consomme des crédits", + "billing.burnsCredits": "Consomme des crédits", + "billing.noCreditCost": "Sans coût de crédits", "billing.publicPricing": "Tarifs publics", - "billing.managePlanOnPlans": "Gérer le plan dans Plans", + "billing.managePlanOnPlans": "Gérer le plan dans Plans", "billing.recovery.pastDueTitle": "Paiement en retard", - "billing.recovery.pastDueAdmin": "Le paiement de votre abonnement a échoué. Mettez à jour le paiement dans le Customer Portal — l'accès reste ouvert pendant cette période de grâce.", - "billing.recovery.pastDueMember": "La facturation nécessite une attention. Demandez à un administrateur de mettre à jour le paiement dans le Customer Portal. L'accès reste ouvert pendant cette période de grâce.", + "billing.recovery.pastDueAdmin": "Le paiement de votre abonnement a échoué. Mettez à jour le paiement dans le Customer Portal — l'accès reste ouvert pendant cette période de grâce.", + "billing.recovery.pastDueMember": "La facturation nécessite une attention. Demandez à un administrateur de mettre à jour le paiement dans le Customer Portal. L'accès reste ouvert pendant cette période de grâce.", "billing.recovery.openPortal": "Ouvrir le Customer Portal", "billing.recovery.contactAdmin": "Contacter un administrateur", - "billing.recovery.goToBilling": "Aller à la facturation", - "billing.recovery.missingPlanTitle": "Aucune offre assignée", - "billing.recovery.missingPlanMessage": "Cette entreprise n'a pas de plan actif (souvent après une migration ignorée). Assignez un plan via Checkout ou contactez le support — ne supposez pas une capacité Unlimited.", + "billing.recovery.goToBilling": "Aller à la facturation", + "billing.recovery.missingPlanTitle": "Aucune offre assignée", + "billing.recovery.missingPlanMessage": "Cette entreprise n'a pas de plan actif (souvent après une migration ignorée). Assignez un plan via Checkout ou contactez le support — ne supposez pas une capacité Unlimited.", "billing.recovery.choosePlan": "Choisir une offre", - "billing.upgrade": "Mettre à niveau", - "billing.askCompanyAdmin": "Demandez à un administrateur de l'entreprise", + "billing.upgrade": "Mettre à niveau", + "billing.askCompanyAdmin": "Demandez à un administrateur de l'entreprise", "billing.memberHint": "Seuls les administrateurs peuvent changer de plan ou ouvrir Checkout.", - "billing.unlimitedPlanWallet": "Plan illimité · portefeuille {wallet}", - "billing.creditsSuffix": "{label} crédits", + "billing.unlimitedPlanWallet": "Plan illimité · portefeuille {wallet}", + "billing.creditsSuffix": "{label} crédits", "billing.perMonth": "{amount} / mois", "billing.zeroPerMonth": "0 / mois", - "billing.upTo": "Jusqu'à {count}", - "billing.skusUnlimited": "{used} SKUs (illimité)", + "billing.upTo": "Jusqu'à {count}", + "billing.skusUnlimited": "{used} SKUs (illimité)", "billing.skusOnly": "{used} SKUs", "billing.skusOf": "{used} / {max} SKUs", "billing.planKind.none": "Aucune offre active", - "billing.planKind.enterprise": "Entreprise / personnalisé", + "billing.planKind.enterprise": "Entreprise / personnalisé", "billing.planKind.trial": "Essai", "billing.planKind.standard": "Offre standard", "billing.creditUsage.normalize.label": "Normaliser, specs et remplir", - "billing.creditUsage.normalize.detail": "Le nettoyage des données et le remplissage d'attributs s'exécutent sans crédits IA.", + "billing.creditUsage.normalize.detail": "Le nettoyage des données et le remplissage d'attributs s'exécutent sans crédits IA.", "billing.creditUsage.ai.label": "Titres et descriptions IA", - "billing.creditUsage.ai.detail": "Facturé par produit selon la fonctionnalité IA et la quantité de texte généré.", - "billing.creditUsage.eprel.label": "EPREL / étiquettes énergétiques", - "billing.creditUsage.eprel.detail": "Données EPREL UE publiques gratuites sur tous les plans (sans crédits).", + "billing.creditUsage.ai.detail": "Facturé par produit selon la fonctionnalité IA et la quantité de texte généré.", + "billing.creditUsage.eprel.label": "EPREL / étiquettes énergétiques", + "billing.creditUsage.eprel.detail": "Données EPREL UE publiques gratuites sur tous les plans (sans crédits).", "billing.creditUsage.campaign.label": "IA campagne et application de marque", - "billing.creditUsage.campaign.detail": "Les étapes IA payantes qui utilisent le modèle géré consomment des crédits entreprise.", + "billing.creditUsage.campaign.detail": "Les étapes IA payantes qui utilisent le modèle géré consomment des crédits entreprise.", "exports.title": "Flux d'export", - "exports.description": "Choisissez quoi publier par canal — quels produits et champs — puis partagez une URL de feed publique (sans connexion).", - "exports.descriptionFiltered": "Liens publics Google Shopping, Meta et feeds personnalisés. Affichage de {filtered} sur {total} feeds.", - "exports.loadFailed": "Échec du chargement des feeds d'export", - "exports.loadFeedFailed": "Échec du chargement du feed d'export", + "exports.description": "Choisissez quoi publier par canal — quels produits et champs — puis partagez une URL de feed publique (sans connexion).", + "exports.descriptionFiltered": "Liens publics Google Shopping, Meta et feeds personnalisés. Affichage de {filtered} sur {total} feeds.", + "exports.loadFailed": "Échec du chargement des feeds d'export", + "exports.loadFeedFailed": "Échec du chargement du feed d'export", "exports.refresh": "Actualiser", - "exports.refreshing": "Actualisation…", - "exports.create": "Créer un flux d'export", + "exports.refreshing": "Actualisation…", + "exports.create": "Créer un flux d'export", "exports.edit": "Modifier le feed d'export", - "exports.editDescription": "Mettez à jour le nom, le statut, les produits inclus et les champs mappés.", + "exports.editDescription": "Mettez à jour le nom, le statut, les produits inclus et les champs mappés.", "exports.howToTitle": "Comment choisir quoi exporter", "exports.howTo.choose": "Ce qui entre dans le feed", - "exports.howTo.chooseBody": "— définissez le feed source et les statuts produit à la création/édition pour que l'URL publique n'inclue que ces produits.", + "exports.howTo.chooseBody": "— définissez le feed source et les statuts produit à la création/édition pour que l'URL publique n'inclue que ces produits.", "exports.howTo.subset": "Sous-ensemble ponctuel", - "exports.howTo.subsetBody": "— sur", + "exports.howTo.subsetBody": "— sur", "exports.howTo.productsLink": "Produits", - "exports.howTo.subsetTail": ", sélectionnez des lignes et Exporter pour télécharger uniquement ces produits avec le format et les champs du feed.", + "exports.howTo.subsetTail": ", sélectionnez des lignes et Exporter pour télécharger uniquement ces produits avec le format et les champs du feed.", "exports.howTo.google": "Google Shopping", - "exports.howTo.googleBody": "— créez un préréglage CSV ou XML, Generate, copiez l'URL publique dans Merchant Center → Products → Feeds → scheduled fetch.", + "exports.howTo.googleBody": "— créez un préréglage CSV ou XML, Generate, copiez l'URL publique dans Merchant Center → Products → Feeds → scheduled fetch.", "exports.howTo.meta": "Catalogue Meta", - "exports.howTo.metaBody": "— préréglage CSV pour les sources de données Commerce Manager.", - "exports.howTo.custom": "CSV/XML personnalisé", - "exports.howTo.customBody": "— tout partenaire ; la même URL publique fonctionne pour les pollers cron / webhook.", + "exports.howTo.metaBody": "— préréglage CSV pour les sources de données Commerce Manager.", + "exports.howTo.custom": "CSV/XML personnalisé", + "exports.howTo.customBody": "— tout partenaire ; la même URL publique fonctionne pour les pollers cron / webhook.", "exports.howTo.rest": "REST", - "exports.howTo.restBody": "— clés API sous", - "exports.howTo.settingsApiKeys": "Paramètres → Clés API", - "exports.howTo.restTail": "(clés legacy non migrées) pull", + "exports.howTo.restBody": "— clés API sous", + "exports.howTo.settingsApiKeys": "Paramètres → Clés API", + "exports.howTo.restTail": "(clés legacy non migrées) pull", "exports.howTo.openapi": "OpenAPI", "exports.feedStatus": "Statut du feed", - "exports.generating": "Génération de l'export — cela peut prendre un moment pour les grands catalogues.", - "exports.generationFailed": "Échec de la génération. Consultez l'erreur ci-dessus, puis réessayez Refresh Feed.", - "exports.exportedProducts": "{count} produits exportés", - "exports.lastGenerated": "Dernière génération : {time}", - "exports.neverGenerated": "Jamais généré", + "exports.generating": "Génération de l'export — cela peut prendre un moment pour les grands catalogues.", + "exports.generationFailed": "Échec de la génération. Consultez l'erreur ci-dessus, puis réessayez Refresh Feed.", + "exports.exportedProducts": "{count} produits exportés", + "exports.lastGenerated": "Dernière génération : {time}", + "exports.neverGenerated": "Jamais généré", "exports.searchPlaceholder": "Rechercher des feeds...", "exports.searchAria": "Rechercher des feeds", "exports.clearSearch": "Effacer la recherche", - "exports.loading": "Chargement des feeds…", + "exports.loading": "Chargement des feeds…", "exports.loadErrorTitle": "Impossible de charger les feeds d'export", - "exports.loadErrorBody": "Une erreur s'est produite lors du chargement de vos exports. Réessayez ou consultez l'erreur ci-dessus pour plus de détails.", - "exports.tryAgain": "Réessayer", + "exports.loadErrorBody": "Une erreur s'est produite lors du chargement de vos exports. Réessayez ou consultez l'erreur ci-dessus pour plus de détails.", + "exports.tryAgain": "Réessayer", "exports.emptyTitle": "Pas encore de feeds d'export", - "exports.emptyBody": "Créez un feed Google Shopping, Meta ou CSV/XML personnalisé pour choisir quels produits et champs sortir. Générez une URL publique pour Merchant Center ou tout partenaire — ou exportez une sous-sélection depuis Produits.", - "exports.emptyCta": "Créer un flux Google Shopping", + "exports.emptyBody": "Créez un feed Google Shopping, Meta ou CSV/XML personnalisé pour choisir quels produits et champs sortir. Générez une URL publique pour Merchant Center ou tout partenaire — ou exportez une sous-sélection depuis Produits.", + "exports.emptyCta": "Créer un flux Google Shopping", "exports.noMatchTitle": "Aucun feed correspondant", "exports.noMatchBody": "Essayez un autre terme de recherche.", "exports.col.name": "Nom", "exports.col.format": "Format", "exports.col.feedUrl": "URL du feed", - "exports.col.lastGenerated": "Dernière génération", + "exports.col.lastGenerated": "Dernière génération", "exports.col.status": "Statut", "exports.col.actions": "Actions", "exports.working": "En cours.", - "exports.generatingShort": "Génération…", + "exports.generatingShort": "Génération…", "exports.copyUrl": "Copier l'URL", "exports.openMenu": "Ouvrir le menu", - "exports.preview": "Aperçu", - "exports.download": "Télécharger", + "exports.preview": "Aperçu", + "exports.download": "Télécharger", "exports.refreshFeed": "Actualiser le feed", "exports.editAction": "Modifier", "exports.delete": "Supprimer", "exports.rotateToken": "Renouveler le jeton d URL", "exports.rotateFailed": "Echec du renouvellement du jeton d URL", - "exports.deleting": "Suppression…", - "exports.channelPreset": "Préréglage de canal", + "exports.deleting": "Suppression…", + "exports.channelPreset": "Préréglage de canal", "exports.name": "Nom", "exports.format": "Format", "exports.sourceFeed": "Feed source (facultatif)", - "exports.sourceFeedHelp": "Limitez ce feed aux produits d'un feed d'entrée, ou laissez Tous les produits — c'est ainsi que vous choisissez ce que l'URL publique inclut.", + "exports.sourceFeedHelp": "Limitez ce feed aux produits d'un feed d'entrée, ou laissez Tous les produits — c'est ainsi que vous choisissez ce que l'URL publique inclut.", "exports.allProducts": "Tous les produits", - "exports.rootElement": "Élément racine", - "exports.itemElement": "Élément item", - "exports.productStatuses": "Statuts produits (séparés par des virgules)", + "exports.rootElement": "Élément racine", + "exports.itemElement": "Élément item", + "exports.productStatuses": "Statuts produits (séparés par des virgules)", "exports.productStatusesHelp": "N'inclure que les produits avec ces statuts (par ex. active). Laissez vide pour tous les statuts.", "exports.status": "Statut", "exports.active": "Actif", "exports.inactive": "Inactif", "exports.fieldMappings": "Correspondances de champs", "exports.addField": "Ajouter un champ", - "exports.outputKey": "Clé de sortie", + "exports.outputKey": "Clé de sortie", "exports.source": "Source", - "exports.customSource": "Personnalisé (attr.* / spec.*)", + "exports.customSource": "Personnalisé (attr.* / spec.*)", "exports.removeField": "Retirer le champ", - "exports.fieldHelp": "Les exports lisent les produits traités (avec mapped_data brut en secours). Utilisez eprel_* / energy_* pour les champs EPREL, spec.* pour une spécification, ou specifications.* pour développer toutes les specs en nœuds XML.", - "exports.saving": "Enregistrement…", + "exports.fieldHelp": "Les exports lisent les produits traités (avec mapped_data brut en secours). Utilisez eprel_* / energy_* pour les champs EPREL, spec.* pour une spécification, ou specifications.* pour développer toutes les specs en nÅ“uds XML.", + "exports.saving": "Enregistrement…", "exports.saveChanges": "Enregistrer", - "exports.createFeed": "Créer un feed", - "exports.updated": "Feed d'export mis à jour.", - "exports.created": "Feed d'export créé.", - "exports.saveFailed": "Échec de l'enregistrement", - "exports.urlCopied": "URL publique du feed {format} copiée. Collez-la dans tout système qui récupère des feeds produit.", - "exports.copyFailed": "Échec de la copie de l'URL dans le presse-papiers", - "exports.refreshed": "Feed actualisé", - "exports.refreshedWithCount": "Feed actualisé ({count} produits).", - "exports.refreshFailed": "Échec de l'actualisation du feed", + "exports.createFeed": "Créer un feed", + "exports.updated": "Feed d'export mis à jour.", + "exports.created": "Feed d'export créé.", + "exports.saveFailed": "Échec de l'enregistrement", + "exports.urlCopied": "URL publique du feed {format} copiée. Collez-la dans tout système qui récupère des feeds produit.", + "exports.copyFailed": "Échec de la copie de l'URL dans le presse-papiers", + "exports.refreshed": "Feed actualisé", + "exports.refreshedWithCount": "Feed actualisé ({count} produits).", + "exports.refreshFailed": "Échec de l'actualisation du feed", "exports.deleteConfirm": "Voulez-vous vraiment supprimer ce feed d'export ?", - "exports.deleted": "Feed d'export supprimé avec succès.", - "exports.deleteFailed": "Échec de la suppression du feed d'export", + "exports.deleted": "Feed d'export supprimé avec succès.", + "exports.deleteFailed": "Échec de la suppression du feed d'export", "exports.defaultName": "Nouveau feed d'export", "exports.fallbackName": "Feed d'export", - "exports.dialog.selectTitle": "Exporter les produits sélectionnés", - "exports.dialog.selectDescription": "Choisissez une configuration de feed d'export pour les {count} produits sélectionnés.", - "exports.dialog.noneFound": "Aucune configuration de feed d'export trouvée. Veuillez en créer une dans la section Export Feeds.", - "exports.dialog.loadFailed": "Échec du chargement des options de feed d'export. Veuillez réessayer.", - "exports.dialog.selectRequired": "Veuillez sélectionner un format de feed d'export.", - "exports.dialog.selectPlaceholder": "Sélectionnez un format de feed d'export...", + "exports.dialog.selectTitle": "Exporter les produits sélectionnés", + "exports.dialog.selectDescription": "Choisissez une configuration de feed d'export pour les {count} produits sélectionnés.", + "exports.dialog.noneFound": "Aucune configuration de feed d'export trouvée. Veuillez en créer une dans la section Export Feeds.", + "exports.dialog.loadFailed": "Échec du chargement des options de feed d'export. Veuillez réessayer.", + "exports.dialog.selectRequired": "Veuillez sélectionner un format de feed d'export.", + "exports.dialog.selectPlaceholder": "Sélectionnez un format de feed d'export...", "exports.dialog.confirmAria": "Confirmer l'export", "exports.dialog.export": "Exporter", "exports.preset.google_shopping_csv.label": "Google Shopping (CSV)", "exports.preset.google_shopping_csv.shortLabel": "Google Shopping CSV", - "exports.preset.google_shopping_csv.description": "Feed produit Merchant Center avec les colonnes Google standard (id, title, price, gtin, …).", - "exports.preset.google_shopping_csv.hint": "Après avoir actualisé le feed, copiez l'URL CSV publique dans Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.", + "exports.preset.google_shopping_csv.description": "Feed produit Merchant Center avec les colonnes Google standard (id, title, price, gtin, …).", + "exports.preset.google_shopping_csv.hint": "Après avoir actualisé le feed, copiez l'URL CSV publique dans Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.", "exports.preset.google_shopping_csv.defaultName": "Google Shopping CSV", "exports.preset.google_shopping_xml.label": "Google Shopping (XML)", "exports.preset.google_shopping_xml.shortLabel": "Google Shopping XML", - "exports.preset.google_shopping_xml.description": "Mêmes colonnes Google que les éléments XML (g:id, g:title, …) pour les feeds XML Merchant Center.", + "exports.preset.google_shopping_xml.description": "Mêmes colonnes Google que les éléments XML (g:id, g:title, …) pour les feeds XML Merchant Center.", "exports.preset.google_shopping_xml.hint": "Collez l'URL XML publique dans Merchant Center en tant que scheduled fetch. Mappez les champs boutique manquants (link, price) sous Field mappings si besoin.", "exports.preset.google_shopping_xml.defaultName": "Google Shopping XML", "exports.preset.meta_csv.label": "Catalogue Meta (CSV)", "exports.preset.meta_csv.shortLabel": "Meta CSV", - "exports.preset.meta_csv.description": "Colonnes du catalogue Facebook / Instagram Commerce (id, title, availability, price, image_link, …).", - "exports.preset.meta_csv.hint": "Dans Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed, collez l'URL CSV publique.", + "exports.preset.meta_csv.description": "Colonnes du catalogue Facebook / Instagram Commerce (id, title, availability, price, image_link, …).", + "exports.preset.meta_csv.hint": "Dans Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed, collez l'URL CSV publique.", "exports.preset.meta_csv.defaultName": "Catalogue Meta CSV", - "exports.preset.custom_csv.label": "CSV personnalisé", - "exports.preset.custom_csv.shortLabel": "CSV personnalisé", + "exports.preset.custom_csv.label": "CSV personnalisé", + "exports.preset.custom_csv.shortLabel": "CSV personnalisé", "exports.preset.custom_csv.description": "Choisissez vos propres colonnes et sources produit pour tout partenaire ou webhook.", - "exports.preset.custom_csv.hint": "Ajoutez ou renommez librement les clés de sortie. L'URL publique ne nécessite pas de connexion pour télécharger.", - "exports.preset.custom_csv.defaultName": "Export CSV personnalisé", - "exports.preset.custom_xml.label": "XML personnalisé", - "exports.preset.custom_xml.shortLabel": "XML personnalisé", - "exports.preset.custom_xml.description": "Créez une forme XML personnalisée avec vos propres noms root/item et mappings de champs.", - "exports.preset.custom_xml.hint": "Définissez les noms d'éléments root et item, puis mappez chaque clé de sortie à une source produit.", - "exports.preset.custom_xml.defaultName": "Export XML personnalisé", + "exports.preset.custom_csv.hint": "Ajoutez ou renommez librement les clés de sortie. L'URL publique ne nécessite pas de connexion pour télécharger.", + "exports.preset.custom_csv.defaultName": "Export CSV personnalisé", + "exports.preset.custom_xml.label": "XML personnalisé", + "exports.preset.custom_xml.shortLabel": "XML personnalisé", + "exports.preset.custom_xml.description": "Créez une forme XML personnalisée avec vos propres noms root/item et mappings de champs.", + "exports.preset.custom_xml.hint": "Définissez les noms d'éléments root et item, puis mappez chaque clé de sortie à une source produit.", + "exports.preset.custom_xml.defaultName": "Export XML personnalisé", "processing.title": "Traitement", - "processing.description": "Progression en direct du pipeline pour les tâches de traitement produit. Actualisation automatique tant que cet onglet est visible. Les tâches terminées renvoient vers Needs Review pour accepter / modifier / rejeter.", + "processing.description": "Progression en direct du pipeline pour les tâches de traitement produit. Actualisation automatique tant que cet onglet est visible. Les tâches terminées renvoient vers Needs Review pour accepter / modifier / rejeter.", "processing.refresh": "Actualiser", - "processing.loadFailed": "Échec du chargement des tâches de traitement", - "processing.tooManyRequests": "Trop de requêtes — attendez un moment et réessayez.", - "processing.serverError": "{fallback} (erreur serveur {status}). Réessayez sous peu.", + "processing.loadFailed": "Échec du chargement des tâches de traitement", + "processing.tooManyRequests": "Trop de requêtes — attendez un moment et réessayez.", + "processing.serverError": "{fallback} (erreur serveur {status}). Réessayez sous peu.", "processing.httpError": "{fallback} (HTTP {status})", - "processing.cancelFailed": "Impossible d'annuler cette tâche", - "processing.retryFailed": "Impossible de réessayer cette tâche", - "processing.cancelledMsg": "« {name} » a été annulé.", - "processing.queuedRetry": "« {name} » mis en file pour nouvel essai.", - "processing.jobFallback": "Tâche {id}", - "processing.tasks": "Tâches", - "processing.pipelineHint": "Pipeline : normalize → specs → fill → EPREL → AI. Les démarrages volumineux peuvent se diviser en tâches sœurs.", - "processing.emptyTitle": "Aucune tâche d’arrière-plan pour l’instant", - "processing.emptyBody": "Aucun travail en arrière-plan pour le moment. Démarrez un nouveau job depuis Products quand vous êtes prêt.", - "processing.startJob": "Démarrer une tâche", + "processing.cancelFailed": "Impossible d'annuler cette tâche", + "processing.retryFailed": "Impossible de réessayer cette tâche", + "processing.cancelledMsg": "« {name} » a été annulé.", + "processing.queuedRetry": "« {name} » mis en file pour nouvel essai.", + "processing.jobFallback": "Tâche {id}", + "processing.tasks": "Tâches", + "processing.pipelineHint": "Pipeline : normalize → specs → fill → EPREL → AI. Les démarrages volumineux peuvent se diviser en tâches sÅ“urs.", + "processing.emptyTitle": "Aucune tâche d’arrière-plan pour l’instant", + "processing.emptyBody": "Aucun travail en arrière-plan pour le moment. Démarrez un nouveau job depuis Products quand vous êtes prêt.", + "processing.startJob": "Démarrer une tâche", "processing.connectFeed": "Connecter un feed", - "processing.splitBatch": "Lot divisé · {jobs} tâches · {products} produits", - "processing.col.task": "Tâche", + "processing.splitBatch": "Lot divisé · {jobs} tâches · {products} produits", + "processing.col.task": "Tâche", "processing.col.status": "Statut", - "processing.col.steps": "Étapes", + "processing.col.steps": "Étapes", "processing.col.progress": "Progression", - "processing.col.started": "Démarré", - "processing.col.completed": "Terminé", + "processing.col.started": "Démarré", + "processing.col.completed": "Terminé", "processing.col.actions": "Actions", - "processing.partOfBatch": "· partie du lot", + "processing.partOfBatch": "· partie du lot", "processing.nowStep": "Maintenant : {step}", "processing.skip": "(ignorer)", - "processing.reviewResults": "Examiner les résultats", + "processing.reviewResults": "Examiner les résultats", "processing.reviewTitle": "Ouvrez Needs Review pour accepter, modifier ou rejeter l'enrichissement", "processing.cancel": "Annuler", - "processing.cancelling": "Annulation…", - "processing.cancelTitle": "Annuler cette tâche en attente ou en cours", - "processing.retry": "Réessayer", - "processing.retrying": "Nouvel essai…", + "processing.cancelling": "Annulation…", + "processing.cancelTitle": "Annuler cette tâche en attente ou en cours", + "processing.retry": "Réessayer", + "processing.retrying": "Nouvel essai…", "processing.actions.onPage": "{count} sur cette page", - "processing.actions.clearSelection": "Effacer la sélection", - "processing.actions.processSelected": "Traiter la sélection", - "processing.actions.processAria": "Traiter les produits sélectionnés", - "processing.actions.processAriaCount": "Traiter {count} produit{plural} sélectionné(s) sur cette page", + "processing.actions.clearSelection": "Effacer la sélection", + "processing.actions.processSelected": "Traiter la sélection", + "processing.actions.processAria": "Traiter les produits sélectionnés", + "processing.actions.processAriaCount": "Traiter {count} produit{plural} sélectionné(s) sur cette page", "processing.actions.whatToProcess": "Que traiter", - "processing.actions.freeNoAiTitle": "Offre Free — pas de crédits IA", - "processing.actions.freeNoAiBody": "Normalize, specs, fill et EPREL s'exécutent toujours. Les titres/descriptions IA nécessitent un plan payant ou des crédits.", + "processing.actions.freeNoAiTitle": "Offre Free — pas de crédits IA", + "processing.actions.freeNoAiBody": "Normalize, specs, fill et EPREL s'exécutent toujours. Les titres/descriptions IA nécessitent un plan payant ou des crédits.", "processing.actions.comparePlans": "Comparer les offres", - "processing.actions.selectAll": "Tout sélectionner", - "processing.actions.selectAllAria": "Sélectionner tous les modes de traitement", - "processing.actions.upgradeRequired": "{label} (amélioration requise)", - "processing.actions.upgradeSuffix": " · améliorer", - "processing.actions.credits": "{credits} crédits", + "processing.actions.selectAll": "Tout sélectionner", + "processing.actions.selectAllAria": "Sélectionner tous les modes de traitement", + "processing.actions.upgradeRequired": "{label} (amélioration requise)", + "processing.actions.upgradeSuffix": " · améliorer", + "processing.actions.credits": "{credits} crédits", "processing.actions.free": "gratuit", - "processing.actions.autoCategorizeTitle": "Ajout automatique de la catégorisation", - "processing.actions.autoCategorizeBody": "{count} produit(s) nécessitent une catégorisation pour le traitement {types}", - "processing.actions.aiLocked": "Les options IA sont verrouillées sur Free. Passez à un plan supérieur pour traiter titres/descriptions.", - "processing.actions.totalCredits": "Crédits totaux ({count} sur cette page) :", - "processing.actions.starting": "Démarrage…", + "processing.actions.autoCategorizeTitle": "Ajout automatique de la catégorisation", + "processing.actions.autoCategorizeBody": "{count} produit(s) nécessitent une catégorisation pour le traitement {types}", + "processing.actions.aiLocked": "Les options IA sont verrouillées sur Free. Passez à un plan supérieur pour traiter titres/descriptions.", + "processing.actions.totalCredits": "Crédits totaux ({count} sur cette page) :", + "processing.actions.starting": "Démarrage…", "processing.actions.processCount": "Traiter {count} sur cette page", "processing.actions.close": "Fermer", "processing.actions.accept": "Accepter", "processing.actions.acceptEnrichment": "Accepter l'enrichissement", "processing.actions.export": "Exporter", - "processing.actions.exportSelected": "Exporter la sélection", + "processing.actions.exportSelected": "Exporter la sélection", "processing.actions.reject": "Rejeter", - "processing.actions.rejectReset": "Rejeter (réinitialiser)", - "processing.actions.resetUnprocessed": "Réinitialiser à Non traité", + "processing.actions.rejectReset": "Rejeter (réinitialiser)", + "processing.actions.resetUnprocessed": "Réinitialiser à Non traité", "processing.actions.confirmTitle": "Confirmer le traitement", - "processing.actions.confirmBody": "Traiter {count} produit(s) sur cette page pour {credits} crédits. Les crédits sont consommés au démarrage de la tâche et ne peuvent pas être annulés depuis cette action.", - "processing.actions.confirmStart": "Démarrer le traitement", - "processing.option.category": "Catégories", + "processing.actions.confirmBody": "Traiter {count} produit(s) sur cette page pour {credits} crédits. Les crédits sont consommés au démarrage de la tâche et ne peuvent pas être annulés depuis cette action.", + "processing.actions.confirmStart": "Démarrer le traitement", + "processing.option.category": "Catégories", "processing.option.attributes": "Attributs / specs", "processing.option.title": "Titres (IA)", "processing.option.description": "Descriptions (IA)", "processing.receipt.view": "Voir dans Traitement", "processing.receipt.undo": "Annuler", - "processing.receipt.format": "{succeeded} réussis · {skipped} ignorés · {failed} échoués", - "processing.receipt.cancelledOne": "Traitement annulé", - "processing.receipt.cancelledMany": "Tâches de traitement annulées", - "processing.receipt.cancelledDesc": "La tâche qui vient de démarrer a été annulée.", - "processing.receipt.cancelFailed": "Impossible d'annuler la tâche de traitement", - "unsubscribe.title": "Se désabonner", - "unsubscribe.me": "Me désabonner", + "processing.receipt.format": "{succeeded} réussis · {skipped} ignorés · {failed} échoués", + "processing.receipt.cancelledOne": "Traitement annulé", + "processing.receipt.cancelledMany": "Tâches de traitement annulées", + "processing.receipt.cancelledDesc": "La tâche qui vient de démarrer a été annulée.", + "processing.receipt.cancelFailed": "Impossible d'annuler la tâche de traitement", + "unsubscribe.title": "Se désabonner", + "unsubscribe.me": "Me désabonner", "unsubscribe.invalidLink": "Lien invalide", - "unsubscribe.failedShort": "Échec du désabonnement", - "unsubscribe.already": "Vous êtes déjà désabonné.", - "unsubscribe.confirmPrompt": "Confirmez ci-dessous pour vous désabonner des e-mails marketing.", - "unsubscribe.done": "Vous êtes désabonné.", + "unsubscribe.failedShort": "Échec du désabonnement", + "unsubscribe.already": "Vous êtes déjà désabonné.", + "unsubscribe.confirmPrompt": "Confirmez ci-dessous pour vous désabonner des e-mails marketing.", + "unsubscribe.done": "Vous êtes désabonné.", "stores.title": "Boutiques et sources", - "stores.description": "Connectez n’importe quelle boutique ou fournisseur au même endroit — Woo, Shopify, URL de flux ou CSV. Boutiques live : produits Descrybe → boutique ; commandes/avis boutique → Descrybe. Exportez quand le catalogue est prêt.", - "stores.allInputFeeds": "Tous les feeds d'entrée", + "stores.description": "Connectez n’importe quelle boutique ou fournisseur au même endroit — Woo, Shopify, URL de flux ou CSV. Boutiques live : produits Descrybe → boutique ; commandes/avis boutique → Descrybe. Exportez quand le catalogue est prêt.", + "stores.allInputFeeds": "Tous les feeds d'entrée", "stores.exportFeeds": "Feeds d'export", - "stores.migrationNote": "Après une migration de plateforme Descrybe, les identifiants WooCommerce et Shopify peuvent devoir être ressaisis — c’est une reconnexion, pas une sync cassée.", + "stores.migrationNote": "Après une migration de plateforme Descrybe, les identifiants WooCommerce et Shopify peuvent devoir être ressaisis — c’est une reconnexion, pas une sync cassée.", "stores.docsPrefix": "Docs :", - "stores.docsApiOverview": "Aperçu de l'API", - "stores.docsSuffix": "pour l’accès produit public ; utilisez WooCommerce ou Shopify ci-dessous pour la sync boutique en direct.", + "stores.docsApiOverview": "Aperçu de l'API", + "stores.docsSuffix": "pour l’accès produit public ; utilisez WooCommerce ou Shopify ci-dessous pour la sync boutique en direct.", "stores.connectorsHeading": "Connecteurs boutique et catalogue", "stores.statusAria": "Statut : {label}", "stores.ctaAria": "{cta} : {title}", - "stores.startTitle": "Par où commencer ?", - "stores.startBody": "Boutique Woo → WooCommerce. Shopify ou une autre plateforme → URL de flux ou import CSV. Prêt pour Merchant Center ou partenaires → Flux d’export (préréglage Google Shopping ou champs personnalisés). Après une migration, reconnectez Woo/Shopify avant d’attendre que la sync fonctionne.", - "stores.startBodyMember": "Demandez à un admin de connecter WooCommerce ou Shopify. Vous pouvez toujours ouvrir les boutiques connectées (sync/navigation) et utiliser Feed URL, CSV ou les feeds d'export selon le forfait.", - "stores.wizard.title": "Configuration guidée de boutique", - "stores.wizard.description": "Connectez une boutique, testez la connexion, lancez la première sync produits, puis c'est terminé.", - "stores.wizard.guidedSetup": "Configuration guidée", - "stores.wizard.guidedSetupAria": "Démarrer la configuration guidée de boutique", - "stores.wizard.adminOnly": "Seuls les admins peuvent lancer la configuration guidée (enregistrer les identifiants et premier sync). Vous pouvez toujours ouvrir les boutiques connectées.", + "stores.startTitle": "Par où commencer ?", + "stores.startBody": "Boutique Woo → WooCommerce. Shopify ou une autre plateforme → URL de flux ou import CSV. Prêt pour Merchant Center ou partenaires → Flux d’export (préréglage Google Shopping ou champs personnalisés). Après une migration, reconnectez Woo/Shopify avant d’attendre que la sync fonctionne.", + "stores.startBodyMember": "Demandez à un admin de connecter WooCommerce ou Shopify. Vous pouvez toujours ouvrir les boutiques connectées (sync/navigation) et utiliser Feed URL, CSV ou les feeds d'export selon le forfait.", + "stores.wizard.title": "Configuration guidée de boutique", + "stores.wizard.description": "Connectez une boutique, testez la connexion, lancez la première sync produits, puis c'est terminé.", + "stores.wizard.guidedSetup": "Configuration guidée", + "stores.wizard.guidedSetupAria": "Démarrer la configuration guidée de boutique", + "stores.wizard.adminOnly": "Seuls les admins peuvent lancer la configuration guidée (enregistrer les identifiants et premier sync). Vous pouvez toujours ouvrir les boutiques connectées.", "stores.wizard.pickChannel": "Choisir un connecteur", - "stores.wizard.pickChannelBody": "Choisissez WooCommerce ou Shopify. Terminez connecter → tester → première sync sur la page du connecteur, puis revenez ici.", + "stores.wizard.pickChannelBody": "Choisissez WooCommerce ou Shopify. Terminez connecter → tester → première sync sur la page du connecteur, puis revenez ici.", "stores.wizard.channel.shopify": "Shopify", "stores.wizard.channel.woocommerce": "WooCommerce", "stores.wizard.channelLabel": "Configuration : {channel}", "stores.wizard.changeChannel": "Changer de connecteur", - "stores.wizard.noChannels": "Aucun connecteur boutique sur votre offre. Mettez à niveau ou demandez à un admin.", - "stores.wizard.progress": "{done} sur {total} terminé", - "stores.wizard.stepsLabel": "Étapes de configuration boutique", + "stores.wizard.noChannels": "Aucun connecteur boutique sur votre offre. Mettez à niveau ou demandez à un admin.", + "stores.wizard.progress": "{done} sur {total} terminé", + "stores.wizard.stepsLabel": "Étapes de configuration boutique", "stores.wizard.step.connect.title": "Connecter", "stores.wizard.step.connect.body": "Enregistrez les identifiants sur la page du connecteur.", "stores.wizard.step.test.title": "Tester la connexion", - "stores.wizard.step.test.body": "Lancez Tester la connexion jusqu'à succès.", - "stores.wizard.step.sync.title": "Première synchronisation", - "stores.wizard.step.sync.body": "Mettez en file la première sync produits (activez la sync si besoin).", - "stores.wizard.step.done.title": "Terminé", - "stores.wizard.step.done.body": "Votre boutique est connectée et une sync a démarré ou est terminée.", + "stores.wizard.step.test.body": "Lancez Tester la connexion jusqu'à succès.", + "stores.wizard.step.sync.title": "Première synchronisation", + "stores.wizard.step.sync.body": "Mettez en file la première sync produits (activez la sync si besoin).", + "stores.wizard.step.done.title": "Terminé", + "stores.wizard.step.done.body": "Votre boutique est connectée et une sync a démarré ou est terminée.", "stores.wizard.openConnector": "Ouvrir le connecteur", "stores.wizard.viewProducts": "Voir les produits", "stores.wizard.backToHub": "Retour aux boutiques", - "stores.wizard.banner.generic": "Configuration guidée : terminez cette étape, puis revenez à l'assistant.", - "stores.wizard.banner.test": "Configuration guidée — testez la connexion, puis revenez à l'assistant.", - "stores.wizard.banner.sync": "Configuration guidée — lancez la première sync produits, puis revenez à l'assistant.", - "stores.wizard.banner.return": "Retour à l'assistant", + "stores.wizard.banner.generic": "Configuration guidée : terminez cette étape, puis revenez à l'assistant.", + "stores.wizard.banner.test": "Configuration guidée — testez la connexion, puis revenez à l'assistant.", + "stores.wizard.banner.sync": "Configuration guidée — lancez la première sync produits, puis revenez à l'assistant.", + "stores.wizard.banner.return": "Retour à l'assistant", "stores.wizard.banner.dismiss": "Fermer", "stores.woo.title": "WooCommerce", - "stores.woo.description": "Poussez les produits Descrybe → WooCommerce. Importez commandes et avis WooCommerce → Descrybe.", + "stores.woo.description": "Poussez les produits Descrybe → WooCommerce. Importez commandes et avis WooCommerce → Descrybe.", "stores.woo.ctaReconnect": "Reconnecter Woo", "stores.woo.ctaOpen": "Ouvrir Woo", "stores.woo.ctaConnect": "Connecter Woo", "stores.woo.ctaView": "Voir Woo", "stores.shopify.title": "Shopify", - "stores.shopify.description": "Poussez les produits Descrybe → Shopify. Importez les commandes Shopify → Descrybe. Les avis ne sont pas disponibles via l’Admin API Shopify.", + "stores.shopify.description": "Poussez les produits Descrybe → Shopify. Importez les commandes Shopify → Descrybe. Les avis ne sont pas disponibles via l’Admin API Shopify.", "stores.shopify.ctaReconnect": "Reconnecter Shopify", "stores.shopify.ctaOpen": "Ouvrir Shopify", "stores.shopify.ctaConnect": "Connecter Shopify", @@ -3741,95 +3742,95 @@ export const fr: MessageDict = { "stores.feedUrl.title": "URL du feed", "stores.feedUrl.description": "Pull any supplier or boutique catalog from a public CSV or XML URL on a schedule. Map fields, then sync.", "stores.feedUrl.cta": "Ajouter l'URL du feed", - "stores.csv.title": "Téléversement CSV", - "stores.csv.description": "Téléversez un CSV produits comme flux d’entrée. Idéal pour des fichiers fournisseur ponctuels ou des exports admin Shopify.", - "stores.csv.cta": "Téléverser CSV", + "stores.csv.title": "Téléversement CSV", + "stores.csv.description": "Téléversez un CSV produits comme flux d’entrée. Idéal pour des fichiers fournisseur ponctuels ou des exports admin Shopify.", + "stores.csv.cta": "Téléverser CSV", "stores.export.title": "Export / REST", - "stores.export.description": "Publiez Google Shopping ou un CSV/XML personnalisé avec une URL publique. Ou récupérez les produits via une clé API (/api/v1).", + "stores.export.description": "Publiez Google Shopping ou un CSV/XML personnalisé avec une URL publique. Ou récupérez les produits via une clé API (/api/v1).", "stores.export.cta": "Ouvrir les exports", - "stores.apiKeys.title": "Clés API", - "stores.apiKeys.description": "Les anciennes clés API n’ont pas été migrées. Créez une nouvelle clé dans Paramètres pour restaurer l’accès /api/v1 — le secret n’est affiché qu’une fois.", - "stores.apiKeys.descriptionMember": "Clés API entreprise pour /api/v1. Les clés héritées n’ont pas été migrées — seuls les admins peuvent créer ou révoquer ; préfixes visibles dans Paramètres.", - "stores.apiKeys.cta": "Gérer les clés API", - "stores.apiKeys.ctaView": "Voir les clés API", - "stores.status.needsReconnect": "Nécessite reconnexion", - "stores.status.connected": "Connecté", - "stores.status.notConnected": "Non connecté", - "stores.status.ready": "Prêt", + "stores.apiKeys.title": "Clés API", + "stores.apiKeys.description": "Les anciennes clés API n’ont pas été migrées. Créez une nouvelle clé dans Paramètres pour restaurer l’accès /api/v1 — le secret n’est affiché qu’une fois.", + "stores.apiKeys.descriptionMember": "Clés API entreprise pour /api/v1. Les clés héritées n’ont pas été migrées — seuls les admins peuvent créer ou révoquer ; préfixes visibles dans Paramètres.", + "stores.apiKeys.cta": "Gérer les clés API", + "stores.apiKeys.ctaView": "Voir les clés API", + "stores.status.needsReconnect": "Nécessite reconnexion", + "stores.status.connected": "Connecté", + "stores.status.notConnected": "Non connecté", + "stores.status.ready": "Prêt", "stores.status.outbound": "Sortant", - "stores.status.reissue": "Réémettre", + "stores.status.reissue": "Réémettre", "store.tab.connection": "Connexion", "store.tab.orders": "Commandes", - "store.tab.settings": "Paramètres", - "store.tab.categories": "Catégories", + "store.tab.settings": "Paramètres", + "store.tab.categories": "Catégories", "store.tab.attributes": "Attributs", "store.tab.reviews": "Avis", - "store.badge.credentialsOnFile": "Identifiants enregistrés", - "store.badge.syncEnabled": "Envoi produits activé", - "store.badge.syncDisabled": "Envoi produits désactivé", + "store.badge.credentialsOnFile": "Identifiants enregistrés", + "store.badge.syncEnabled": "Envoi produits activé", + "store.badge.syncDisabled": "Envoi produits désactivé", "store.badge.syncQueued": "Envoi produits en file", "store.badge.dryRun": "Simulation", "store.badge.testStatus": "Test : {status}", "store.badge.syncStatus": "Envoi produits : {status}", "store.badge.ordersQueued": "Sync des commandes mise en file", "store.badge.ordersStatus": "Commandes : {status}", - "store.badge.syncedCount": "{count} synchronisés", - "store.badge.mappedCount": "{count} mappés", + "store.badge.syncedCount": "{count} synchronisés", + "store.badge.mappedCount": "{count} mappés", "store.badge.productsCount": "{count} produits", "store.badge.optionsCount": "{count} options", - "store.lastSync": "Dernière sync : {date}", - "store.noOrdersSyncYet": "Aucune sync de commandes n'est encore terminée.", + "store.lastSync": "Dernière sync : {date}", + "store.noOrdersSyncYet": "Aucune sync de commandes n'est encore terminée.", "store.save": "Enregistrer", "store.saving": "Enregistrement...", "store.testing": "Test en cours...", "store.testConnection": "Tester la connexion", "store.queueing": "Mise en file...", - "store.queueProductPush": "Mettre en file l’envoi produits (Descrybe → boutique)", - "store.queueFirstProductSync": "Mettre en file le premier envoi produits (Descrybe → boutique)", - "store.queueOrdersImport": "Mettre en file l’import commandes (boutique → Descrybe)", + "store.queueProductPush": "Mettre en file l’envoi produits (Descrybe → boutique)", + "store.queueFirstProductSync": "Mettre en file le premier envoi produits (Descrybe → boutique)", + "store.queueOrdersImport": "Mettre en file l’import commandes (boutique → Descrybe)", "store.refreshList": "Actualiser la liste", "store.saveBeforeTest": "Enregistrez les identifiants avant de tester", "store.saveTestBeforeQueue": "Enregistrez les identifiants et testez la connexion avant de synchroniser", "store.connectionOk": "Connexion OK", - "store.connectionSuccessful": "Connexion réussie", - "store.connectionSuccessfulDot": "Connexion réussie.", - "store.connectionFailed": "Échec de la connexion", - "store.connectionFailedDot": "Échec de la connexion.", - "store.connectionTestFailed": "Échec du test de connexion", - "store.testFailed": "Échec du test", - "store.setupSteps": "Étapes de configuration", + "store.connectionSuccessful": "Connexion réussie", + "store.connectionSuccessfulDot": "Connexion réussie.", + "store.connectionFailed": "Échec de la connexion", + "store.connectionFailedDot": "Échec de la connexion.", + "store.connectionTestFailed": "Échec du test de connexion", + "store.testFailed": "Échec du test", + "store.setupSteps": "Étapes de configuration", "store.col.order": "Commande", "store.col.customer": "Client", "store.col.status": "Statut", "store.col.total": "Total", "store.col.date": "Date", - "store.loadingOrders": "Chargement des commandes…", + "store.loadingOrders": "Chargement des commandes…", "store.loadingOrdersDot": "Chargement des commandes.", - "flash.store.saveFailed": "Impossible d’enregistrer les paramètres", + "flash.store.saveFailed": "Impossible d’enregistrer les paramètres", "flash.store.queueSyncFailed": "Impossible de mettre la synchronisation en file", "flash.store.queueOrdersFailed": "Impossible de mettre la synchro des commandes en file", - "flash.store.connectedTo": "Connecté à {name}.", - "flash.shopify.loadFailed": "Échec du chargement de la config Shopify", - "flash.shopify.productSyncQueued": "Synchro produits en file. Le worker l’exécutera bientôt.", - "flash.shopify.ordersSyncQueued": "Synchro commandes en file. Le worker l’exécutera bientôt.", - "flash.woo.loadFailed": "Échec du chargement de la config WooCommerce", - "flash.woo.productSyncQueued": "Synchro produits en file. Elle s’exécutera bientôt.", - "flash.woo.ordersSyncQueued": "Synchro commandes en file. Elle s’exécutera bientôt.", - "flash.woo.reviewsSyncQueued": "Synchro avis en file. Elle s’exécutera bientôt.", + "flash.store.connectedTo": "Connecté à {name}.", + "flash.shopify.loadFailed": "Échec du chargement de la config Shopify", + "flash.shopify.productSyncQueued": "Synchro produits en file. Le worker l’exécutera bientôt.", + "flash.shopify.ordersSyncQueued": "Synchro commandes en file. Le worker l’exécutera bientôt.", + "flash.woo.loadFailed": "Échec du chargement de la config WooCommerce", + "flash.woo.productSyncQueued": "Synchro produits en file. Elle s’exécutera bientôt.", + "flash.woo.ordersSyncQueued": "Synchro commandes en file. Elle s’exécutera bientôt.", + "flash.woo.reviewsSyncQueued": "Synchro avis en file. Elle s’exécutera bientôt.", "flash.woo.queueReviewsFailed": "Impossible de mettre la synchro des avis en file", - "flash.woo.remoteMapsFailed": "Échec du chargement des maps distantes", - "flash.woo.syncSettingsFailed": "Impossible d’enregistrer les paramètres de synchronisation", - "flash.woo.categoryAutoMapFailed": "Échec du mappage auto des catégories", - "flash.woo.attributeAutoMapFailed": "Échec du mappage auto des attributs", - "shopify.title": "Intégration Shopify", - "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", - "shopify.adminOnly": "Only entreprise admins can change Shopify connection paramètres. Synchroniser and browse stay disponible.", - "shopify.lockedTitle": "Connexion Shopify verrouillée", - "shopify.noCredentialsMember": "Aucun identifiant Shopify n’est encore enregistré. Demandez à un administrateur de connecter la boutique. Sync et consultation des commandes restent disponibles après enregistrement et test de connexion.", + "flash.woo.remoteMapsFailed": "Échec du chargement des maps distantes", + "flash.woo.syncSettingsFailed": "Impossible d’enregistrer les paramètres de synchronisation", + "flash.woo.categoryAutoMapFailed": "Échec du mappage auto des catégories", + "flash.woo.attributeAutoMapFailed": "Échec du mappage auto des attributs", + "shopify.title": "Intégration Shopify", + "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", + "shopify.adminOnly": "Only entreprise admins can change Shopify connection paramètres. Synchroniser and browse stay disponible.", + "shopify.lockedTitle": "Connexion Shopify verrouillée", + "shopify.noCredentialsMember": "Aucun identifiant Shopify n’est encore enregistré. Demandez à un administrateur de connecter la boutique. Sync et consultation des commandes restent disponibles après enregistrement et test de connexion.", "shopify.enterToken": "Saisir les identifiants", - "shopify.noCredentials": "Aucun identifiant Shopify enregistré. Saisissez votre domaine *.myshopify.com et le Client ID + secret du Dev Dashboard (ou un jeton Admin API hérité), puis Enregistrer et Tester la connexion. Après une migration de plateforme, les anciens secrets ne sont pas repris — reconnectez avec un jeton neuf.", + "shopify.noCredentials": "Aucun identifiant Shopify enregistré. Saisissez votre domaine *.myshopify.com et le Client ID + secret du Dev Dashboard (ou un jeton Admin API hérité), puis Enregistrer et Tester la connexion. Après une migration de plateforme, les anciens secrets ne sont pas repris — reconnectez avec un jeton neuf.", "shopify.allConnectors": "Tous les connecteurs de boutique", - "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", + "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", "shopify.setup.oauthNote": "Still manual: create/install the app in Shopify and paste Client ID + secret here. Descrybe does not host a one-click App Store install. Legacy permanent shpat_ tokens from older Admin custom apps still work.", "shopify.setup.scopesTitle": "Scopes Admin API requis", "shopify.setup.scopesIntro": "Add these scopes on the app version in the Dev Dashboard before you release and install:", @@ -3841,151 +3842,151 @@ export const fr: MessageDict = { "shopify.setup.step5.clientId": "Client ID", "shopify.setup.step5.and": "and", "shopify.setup.step5.clientSecret": "Client secret", - "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", + "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", "shopify.setup.step5.save": "Save", - "shopify.setup.step5.arrow": "→", + "shopify.setup.step5.arrow": "→", "shopify.setup.step5.test": "Test Connection", "shopify.setup.step5.after": ". Descrybe stores secrets encrypted and refreshes the short-lived access token automatically.", "shopify.setup.step6.products": "Products", - "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", + "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", "shopify.setup.step6.orders": "Orders", - "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", + "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", "shopify.setup.step7.before": "No live shop yet? Enable", "shopify.setup.step7.dryRun": "Dry run", "shopify.setup.step7.after": "(or use the special dry-run access token) to walk through the flow without calling Shopify.", "shopify.setup.openDevDashboard": "Open Dev Dashboard", "shopify.setup.openDevelopApps": "Open shop Develop apps", "shopify.setup.openDevelopAppsNeedDomain": "Enter your shop domain below to unlock a direct Admin link for this store.", - "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", + "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", "shopify.setup.copyScopes": "Copy required scopes", "shopify.setup.scopesCopied": "Scopes copied", "shopify.setup.docsCreate": "Create app docs", "shopify.setup.docsTokens": "Access token docs", - "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", + "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", "shopify.setup.hideLegacyToken": "Hide legacy token field", - "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", + "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", "shopify.field.clientId": "Client ID", "shopify.field.clientSecret": "Client secret", - "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", + "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", "shopify.field.accessTokenHelp": "Only for custom apps created in Shopify Admin before January 2026. New apps should use Client ID + secret instead.", "shopify.placeholder.clientId": "Client ID from Dev Dashboard", - "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", + "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", "shopify.placeholder.clientSecret": "Client secret", - "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", + "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", "shopify.setup.scope.write_products": "write_products", - "shopify.setup.scope.write_productsWhy": "Créer et mettre à jour des produits dans Shopify (push sortant)", + "shopify.setup.scope.write_productsWhy": "Créer et mettre à jour des produits dans Shopify (push sortant)", "shopify.setup.scope.read_products": "read_products", - "shopify.setup.scope.read_productsWhy": "Trouver les produits existants par SKU avant mise à jour", + "shopify.setup.scope.read_productsWhy": "Trouver les produits existants par SKU avant mise à jour", "shopify.setup.scope.read_orders": "read_orders", "shopify.setup.scope.read_ordersWhy": "Importer les commandes dans Descrybe (entrant)", - "shopify.setup.step1": "Si vous avez connecté Shopify avant une migration de plateforme : créez une nouvelle app Dev Dashboard (ou reconnectez avec un jeton hérité neuf) — les anciens secrets enregistrés ne sont pas repris.", + "shopify.setup.step1": "Si vous avez connecté Shopify avant une migration de plateforme : créez une nouvelle app Dev Dashboard (ou reconnectez avec un jeton hérité neuf) — les anciens secrets enregistrés ne sont pas repris.", "shopify.setup.step2.before": "Open the", "shopify.setup.step2.path": "Shopify Dev Dashboard", - "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", + "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", "shopify.setup.step3.before": "Create a version: set App URL (default home is fine for API-only), add scopes", "shopify.setup.step3.after": ".", "shopify.setup.step4.before": "From the app Home tab,", "shopify.setup.step4.after": "on your store (merchant must approve scopes).", - "shopify.testSectionTitle": "Vérifier la connexion", - "shopify.testHint": "Enregistrez d’abord le domaine boutique et le jeton, puis lancez Tester la connexion. Un test réussi confirme le jeton et les scopes avant de mettre la sync en file.", - "shopify.overwriteTitle": "Écraser les produits Shopify ?", - "shopify.overwriteBodyCount": "Cela met en file une poussée de produits sortante. {count} produit(s) Shopify déjà liés peuvent être mis à jour avec le contenu Descrybe.", - "shopify.overwriteBody": "Cela met en file une poussée de produits sortante. Les produits Shopify correspondants peuvent être mis à jour avec le contenu Descrybe.", + "shopify.testSectionTitle": "Vérifier la connexion", + "shopify.testHint": "Enregistrez d’abord le domaine boutique et le jeton, puis lancez Tester la connexion. Un test réussi confirme le jeton et les scopes avant de mettre la sync en file.", + "shopify.overwriteTitle": "Écraser les produits Shopify ?", + "shopify.overwriteBodyCount": "Cela met en file une poussée de produits sortante. {count} produit(s) Shopify déjà liés peuvent être mis à jour avec le contenu Descrybe.", + "shopify.overwriteBody": "Cela met en file une poussée de produits sortante. Les produits Shopify correspondants peuvent être mis à jour avec le contenu Descrybe.", "shopify.credentialsTitle": "Identifiants de la boutique", - "shopify.credentialsDesc.before": "Le domaine de la boutique doit être votre", + "shopify.credentialsDesc.before": "Le domaine de la boutique doit être votre", "shopify.credentialsDesc.code": "*.myshopify.com", "shopify.credentialsDesc.after": "domain. Prefer Dev Dashboard Client ID + secret; legacy Admin API tokens still work.", "shopify.field.shopDomain": "Domaine de la boutique", - "shopify.field.accessToken": "Jeton d'accès Admin API", + "shopify.field.accessToken": "Jeton d'accès Admin API", "shopify.field.apiVersion": "Version de l'API", "shopify.placeholder.tokenKeep": "******** (laisser vide pour conserver)", - "shopify.enableSync": "Activer l’envoi produits (Descrybe → Shopify)", - "shopify.dryRunLabel": "Essai à blanc (aucun appel Shopify live)", - "shopify.ordersTitle": "Import des commandes (Shopify → Descrybe)", - "shopify.ordersDesc": "Shopify → Descrybe — importe commandes et lignes dans Descrybe (n’écrit pas vers Shopify).", - "shopify.ordersNeedsReconnect": "L’import des commandes ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", + "shopify.enableSync": "Activer l’envoi produits (Descrybe → Shopify)", + "shopify.dryRunLabel": "Essai à blanc (aucun appel Shopify live)", + "shopify.ordersTitle": "Import des commandes (Shopify → Descrybe)", + "shopify.ordersDesc": "Shopify → Descrybe — importe commandes et lignes dans Descrybe (n’écrit pas vers Shopify).", + "shopify.ordersNeedsReconnect": "L’import des commandes ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", "shopify.notesTitle": "Notes", - "shopify.notesDesc": "Capacités du connecteur Shopify", - "shopify.notes.productsLabel": "Produits (Descrybe → Shopify)", - "shopify.notes.productsBody": "— les produits Descrybe traités sont créés ou mis à jour dans Shopify (correspondance SKU via GraphQL s’il n’y a pas d’id produit Shopify en cache). Une re-sync peut écraser les champs distants correspondants.", - "shopify.notes.ordersLabel": "Commandes (Shopify → Descrybe)", - "shopify.notes.ordersBody": "— récupérés pour le reporting et de futurs workflows d’audience.", + "shopify.notesDesc": "Capacités du connecteur Shopify", + "shopify.notes.productsLabel": "Produits (Descrybe → Shopify)", + "shopify.notes.productsBody": "— les produits Descrybe traités sont créés ou mis à jour dans Shopify (correspondance SKU via GraphQL s’il n’y a pas d’id produit Shopify en cache). Une re-sync peut écraser les champs distants correspondants.", + "shopify.notes.ordersLabel": "Commandes (Shopify → Descrybe)", + "shopify.notes.ordersBody": "— récupérés pour le reporting et de futurs workflows d’audience.", "shopify.notes.reviewsLabel": "Avis", "shopify.notes.reviewsBody": "-- not assistanceed. Shopify has no first-party produit reviews Admin API (third-party review apps are out of scope here).", "shopify.notes.encryption.before": "Jetons are encrypted at rest with", - "woo.title": "Intégration WooCommerce", - "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", + "woo.title": "Intégration WooCommerce", + "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", "woo.allStores": "Toutes les boutiques", - "woo.adminOnly": "Seuls les administrateurs de l’entreprise peuvent modifier la connexion et le mapping WooCommerce. La synchronisation et la navigation restent disponibles.", + "woo.adminOnly": "Seuls les administrateurs de l’entreprise peuvent modifier la connexion et le mapping WooCommerce. La synchronisation et la navigation restent disponibles.", "woo.enterCredentials": "Saisir les identifiants", - "woo.noCredentials": "Aucun identifiant WooCommerce enregistré. Saisissez l’URL de la boutique, créez une clé REST API Lecture/Écriture dans WordPress, collez Consumer Key et Secret, puis Enregistrer et Tester la connexion. Après une migration de plateforme, les anciens secrets ne sont pas repris — reconnectez avec une clé neuve.", - "woo.lockedTitle": "Connexion WooCommerce verrouillée", - "woo.noCredentialsMember": "Aucun identifiant WooCommerce n’est encore enregistré. Demandez à un administrateur de connecter la boutique. Sync, commandes et avis restent disponibles après enregistrement et test de connexion.", + "woo.noCredentials": "Aucun identifiant WooCommerce enregistré. Saisissez l’URL de la boutique, créez une clé REST API Lecture/Écriture dans WordPress, collez Consumer Key et Secret, puis Enregistrer et Tester la connexion. Après une migration de plateforme, les anciens secrets ne sont pas repris — reconnectez avec une clé neuve.", + "woo.lockedTitle": "Connexion WooCommerce verrouillée", + "woo.noCredentialsMember": "Aucun identifiant WooCommerce n’est encore enregistré. Demandez à un administrateur de connecter la boutique. Sync, commandes et avis restent disponibles après enregistrement et test de connexion.", "woo.setupDesc": "Follow these steps to create a WooCommerce REST API key in WordPress and connect it here. Descrybe never creates keys on your store for you.", - "woo.setup.step1": "Si vous avez connecté WooCommerce avant une migration de plateforme : créez une nouvelle clé REST API — les anciens identifiants enregistrés ne sont pas utilisables.", + "woo.setup.step1": "Si vous avez connecté WooCommerce avant une migration de plateforme : créez une nouvelle clé REST API — les anciens identifiants enregistrés ne sont pas utilisables.", "woo.setup.step2.before": "Enter your store", "woo.setup.step2.path": "HTTPS URL", "woo.setup.step2.after": "in the form below (example: https://yourstore.com).", "woo.setup.step3.before": "In WordPress admin, open", - "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", + "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", "woo.setup.step3.after": "(or use the deep link once your store URL is filled in).", "woo.setup.step4.before": "Click", "woo.setup.step4.addKey": "Add key", "woo.setup.step4.mid": ", set permissions to", "woo.setup.step4.permissions": "Read/Write", - "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", + "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", "woo.setup.step5.before": "Paste the key and secret below, enable sync if ready, then", "woo.setup.step5.save": "Save", - "woo.setup.step5.arrow": "→", + "woo.setup.step5.arrow": "→", "woo.setup.step5.test": "Test Connection", "woo.setup.step5.after": ".", "woo.setup.step6.products": "Products", - "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", + "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", "woo.setup.step6.orders": "Orders", "woo.setup.step6.and": "and", "woo.setup.step6.reviews": "reviews", - "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", - "woo.setup.openKeys": "Ouvrir les clés REST API", - "woo.setup.addKey": "Ajouter une clé", - "woo.setup.openKeysHint": "Ouvre l’admin WordPress → WooCommerce → Réglages → Avancé → REST API.", - "woo.setup.openKeysNeedUrl": "Enregistrez d’abord une URL de boutique valide pour ouvrir les liens admin.", + "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", + "woo.setup.openKeys": "Ouvrir les clés REST API", + "woo.setup.addKey": "Ajouter une clé", + "woo.setup.openKeysHint": "Ouvre l’admin WordPress → WooCommerce → Réglages → Avancé → REST API.", + "woo.setup.openKeysNeedUrl": "Enregistrez d’abord une URL de boutique valide pour ouvrir les liens admin.", "woo.setup.docsLink": "Documentation REST API WooCommerce", - "woo.overwriteTitle": "Écraser les produits WooCommerce ?", - "woo.overwriteBodyCount": "Cela met en file une poussée de produits sortante. {count} produit(s) WooCommerce déjà liés peuvent être mis à jour avec le contenu Descrybe.", - "woo.overwriteBody": "Cela met en file une poussée de produits sortante. Les produits WooCommerce correspondants peuvent être mis à jour avec le contenu Descrybe.", + "woo.overwriteTitle": "Écraser les produits WooCommerce ?", + "woo.overwriteBodyCount": "Cela met en file une poussée de produits sortante. {count} produit(s) WooCommerce déjà liés peuvent être mis à jour avec le contenu Descrybe.", + "woo.overwriteBody": "Cela met en file une poussée de produits sortante. Les produits WooCommerce correspondants peuvent être mis à jour avec le contenu Descrybe.", "woo.connectionTitle": "Store connection", "woo.connectionDesc": "Paste your store URL and a Read/Write REST API key pair. Save, then Test Connection before queuing syncs.", - "woo.enableSync": "Activer l’envoi produits (Descrybe → WooCommerce)", + "woo.enableSync": "Activer l’envoi produits (Descrybe → WooCommerce)", "woo.field.storeUrl": "URL de la boutique", - "woo.field.storeUrlHelp": "URL publique du site en https. Pour l’API REST WooCommerce et les liens vers l’admin WordPress.", + "woo.field.storeUrlHelp": "URL publique du site en https. Pour l’API REST WooCommerce et les liens vers l’admin WordPress.", "woo.field.consumerKey": "Consumer Key", "woo.field.consumerSecret": "Consumer Secret", - "woo.field.credentialsHelp": "Clé et secret consommateur en lecture/écriture. Laissez vide pour conserver les identifiants existants.", - "woo.placeholder.keep": "******** (inchangé)", - "woo.keepCredentialsHint": "Laissez clé/secret vides à l'enregistrement pour conserver les identifiants existants.", + "woo.field.credentialsHelp": "Clé et secret consommateur en lecture/écriture. Laissez vide pour conserver les identifiants existants.", + "woo.placeholder.keep": "******** (inchangé)", + "woo.keepCredentialsHint": "Laissez clé/secret vides à l'enregistrement pour conserver les identifiants existants.", "woo.saveConfiguration": "Enregistrer la configuration", - "woo.categoryMappingTitle": "Correspondance des catégories", - "woo.categoryMappingDesc": "Faites correspondre vos catégories internes aux catégories WooCommerce", - "woo.autoMapCategories": "Mapper les catégories automatiquement", + "woo.categoryMappingTitle": "Correspondance des catégories", + "woo.categoryMappingDesc": "Faites correspondre vos catégories internes aux catégories WooCommerce", + "woo.autoMapCategories": "Mapper les catégories automatiquement", "woo.autoMapping": "Mapping automatique...", - "woo.refreshCategories": "Actualiser les catégories", - "woo.availableCategories": "Catégories WooCommerce disponibles", - "woo.categoriesEmptyHint": "Testez la connexion, puis actualisez pour charger les catégories WooCommerce.", + "woo.refreshCategories": "Actualiser les catégories", + "woo.availableCategories": "Catégories WooCommerce disponibles", + "woo.categoriesEmptyHint": "Testez la connexion, puis actualisez pour charger les catégories WooCommerce.", "woo.attributeMappingTitle": "Correspondance des attributs", "woo.attributeMappingDesc": "Faites correspondre vos attributs internes aux attributs WooCommerce", "woo.autoMapAttributes": "Mapper les attributs automatiquement", "woo.refreshAttributes": "Actualiser les attributs", "woo.availableAttributes": "Attributs WooCommerce disponibles", "woo.attributesEmptyHint": "Testez la connexion, puis actualisez pour charger les attributs WooCommerce.", - "woo.ordersTitle": "Import des commandes (WooCommerce → Descrybe)", - "woo.ordersDesc": "WooCommerce → Descrybe — importe commandes et lignes dans Descrybe (n’écrit pas vers la boutique).", - "woo.ordersNeedsReconnect": "L’import des commandes ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", - "woo.syncSettingsTitle": "Paramètres de sync", - "woo.syncSettingsDesc": "Configurer comment les produits sont poussés Descrybe → WooCommerce", + "woo.ordersTitle": "Import des commandes (WooCommerce → Descrybe)", + "woo.ordersDesc": "WooCommerce → Descrybe — importe commandes et lignes dans Descrybe (n’écrit pas vers la boutique).", + "woo.ordersNeedsReconnect": "L’import des commandes ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", + "woo.syncSettingsTitle": "Paramètres de sync", + "woo.syncSettingsDesc": "Configurer comment les produits sont poussés Descrybe → WooCommerce", "woo.matchStrategy": "Produit Matching Strategy", - "woo.matchStrategyHelp": "L’envoi produits (Descrybe → WooCommerce) associe les produits distants par SKU ou EAN/GTIN. Mettez en file depuis l’onglet Connexion (manuel).", - "woo.lastSyncLabel": "Dernière sync", - "woo.saveSyncSettings": "Enregistrer les paramètres de sync", + "woo.matchStrategyHelp": "L’envoi produits (Descrybe → WooCommerce) associe les produits distants par SKU ou EAN/GTIN. Mettez en file depuis l’onglet Connexion (manuel).", + "woo.lastSyncLabel": "Dernière sync", + "woo.saveSyncSettings": "Enregistrer les paramètres de sync", "woo.match.sku": "SKU", "woo.match.ean": "EAN/GTIN", "plan.feature.section.shell": "Environnement", @@ -3995,218 +3996,218 @@ export const fr: MessageDict = { "plan.feature.section.stores": "Boutiques", "plan.feature.section.processing": "Traitement", "plan.feature.section.marketing": "Marketing", - "plan.feature.section.integrations": "Intégrations", + "plan.feature.section.integrations": "Intégrations", "plan.feature.section.billing": "Facturation", - "plan.feature.section.settings": "Paramètres", + "plan.feature.section.settings": "Paramètres", "plan.feature.section.support": "Assistance", - "plan.feature.section.capabilities": "Capacités", - "plan.feature.shell.navigation": "Navigation latérale", + "plan.feature.section.capabilities": "Capacités", + "plan.feature.shell.navigation": "Navigation latérale", "plan.feature.shell.command_palette": "Palette de commandes", - "plan.feature.shell.company_switcher": "Sélecteur d'entreprise", + "plan.feature.shell.company_switcher": "Sélecteur d'entreprise", "plan.feature.shell.support_notifications": "Cloche de notifications d'assistance", "plan.feature.shell.tutorial": "Tutoriel produit", "plan.feature.shell.account_menu": "Menu du compte", - "plan.feature.shell.billing_recovery_banner": "Bannière de récupération de facturation", - "plan.feature.dashboard.overview": "Aperçu du tableau de bord", + "plan.feature.shell.billing_recovery_banner": "Bannière de récupération de facturation", + "plan.feature.dashboard.overview": "Aperçu du tableau de bord", "plan.feature.dashboard.stats": "Cartes de statistiques", "plan.feature.dashboard.quick_links": "Liens rapides", - "plan.feature.dashboard.recent_jobs": "Tâches récentes", - "plan.feature.dashboard.news_feed": "Fil d'actualités", + "plan.feature.dashboard.recent_jobs": "Tâches récentes", + "plan.feature.dashboard.news_feed": "Fil d'actualités", "plan.feature.dashboard.activation_checklist": "Liste d'activation", - "plan.feature.dashboard.migrated_checklist": "Liste de cohorte migrée", - "plan.feature.dashboard.etl_gaps": "Panneau des écarts ETL", - "plan.feature.dashboard.store_reconnect": "Bannière de reconnexion boutique", - "plan.feature.dashboard.upgrade_banners": "Bannières de mise à niveau", + "plan.feature.dashboard.migrated_checklist": "Liste de cohorte migrée", + "plan.feature.dashboard.etl_gaps": "Panneau des écarts ETL", + "plan.feature.dashboard.store_reconnect": "Bannière de reconnexion boutique", + "plan.feature.dashboard.upgrade_banners": "Bannières de mise à niveau", "plan.feature.catalog.products": "Produits", - "plan.feature.catalog.products.tab_processed": "Produits - onglet Traités", - "plan.feature.catalog.products.tab_needs_review": "Produits - onglet À revoir", + "plan.feature.catalog.products.tab_processed": "Produits - onglet Traités", + "plan.feature.catalog.products.tab_needs_review": "Produits - onglet À revoir", "plan.feature.catalog.products.tab_error": "Produits - onglet Erreur", "plan.feature.catalog.products.tab_processing": "Produits - onglet En cours", - "plan.feature.catalog.products.tab_unprocessed": "Produits - onglet Non traités", - "plan.feature.catalog.products.process_categories": "Traiter les catégories", - "plan.feature.catalog.products.process_attributes": "Traiter attributs / spécifications", + "plan.feature.catalog.products.tab_unprocessed": "Produits - onglet Non traités", + "plan.feature.catalog.products.process_categories": "Traiter les catégories", + "plan.feature.catalog.products.process_attributes": "Traiter attributs / spécifications", "plan.feature.catalog.products.process_ai_titles": "Traiter les titres IA", "plan.feature.catalog.products.process_ai_descriptions": "Traiter les descriptions IA", "plan.feature.catalog.products.enrichment_review": "Panneau de revue d'enrichissement", - "plan.feature.catalog.products.export_selection": "Exporter les produits sélectionnés", - "plan.feature.catalog.products.upgrade_prompt": "Invites de mise à niveau produits", - "plan.feature.catalog.categories": "Catégories", - "plan.feature.catalog.categories.title_formula": "Formule de titre de catégorie", - "plan.feature.catalog.categories.description_formula": "Formule de description de catégorie", + "plan.feature.catalog.products.export_selection": "Exporter les produits sélectionnés", + "plan.feature.catalog.products.upgrade_prompt": "Invites de mise à niveau produits", + "plan.feature.catalog.categories": "Catégories", + "plan.feature.catalog.categories.title_formula": "Formule de titre de catégorie", + "plan.feature.catalog.categories.description_formula": "Formule de description de catégorie", "plan.feature.catalog.attributes": "Attributs", "plan.feature.catalog.attributes.bulk_import": "Import en masse des attributs", "plan.feature.catalog.standard_fields": "Champs standard", "plan.feature.catalog.standard_fields.groups": "Groupes de champs standard", - "plan.feature.catalog.structured_descriptions": "Champs de description structurée", - "plan.feature.catalog.vector_categories": "Catégories vectorielles", + "plan.feature.catalog.structured_descriptions": "Champs de description structurée", + "plan.feature.catalog.vector_categories": "Catégories vectorielles", "plan.feature.feeds.list": "Feeds d'import", "plan.feature.feeds.add_url": "Ajouter l'URL du feed", - "plan.feature.feeds.add_csv": "Ajouter un feed par téléversement CSV", + "plan.feature.feeds.add_csv": "Ajouter un feed par téléversement CSV", "plan.feature.feeds.sync": "Synchroniser le feed", "plan.feature.feeds.mapping": "Mapping du feed", - "plan.feature.feeds.mapping.select_item": "Mapping - sélectionner l'élément item", + "plan.feature.feeds.mapping.select_item": "Mapping - sélectionner l'élément item", "plan.feature.feeds.mapping.map_fields": "Mapping - mapper les champs", "plan.feature.feeds.export_feeds": "Feeds d'export", - "plan.feature.feeds.export_feeds.create": "Créer un feed d'export", - "plan.feature.feeds.export_feeds.generate": "Générer le feed d'export", - "plan.feature.feeds.uploads": "Téléversements de fichiers", + "plan.feature.feeds.export_feeds.create": "Créer un feed d'export", + "plan.feature.feeds.export_feeds.generate": "Générer le feed d'export", + "plan.feature.feeds.uploads": "Téléversements de fichiers", "plan.feature.stores.hub": "Hub des boutiques", - "plan.feature.stores.woocommerce": "Intégration WooCommerce", + "plan.feature.stores.woocommerce": "Intégration WooCommerce", "plan.feature.stores.woocommerce.connection": "Connexion WooCommerce", - "plan.feature.stores.woocommerce.categories": "Sync catégories WooCommerce", + "plan.feature.stores.woocommerce.categories": "Sync catégories WooCommerce", "plan.feature.stores.woocommerce.attributes": "Sync attributs WooCommerce", "plan.feature.stores.woocommerce.orders": "Commandes WooCommerce", "plan.feature.stores.woocommerce.reviews": "Avis WooCommerce", - "plan.feature.stores.woocommerce.settings": "Paramètres WooCommerce", - "plan.feature.stores.shopify": "Intégration Shopify", + "plan.feature.stores.woocommerce.settings": "Paramètres WooCommerce", + "plan.feature.stores.shopify": "Intégration Shopify", "plan.feature.stores.shopify.connection": "Connexion Shopify", "plan.feature.stores.shopify.orders": "Commandes Shopify", - "plan.feature.stores.shopify.settings": "Paramètres Shopify", + "plan.feature.stores.shopify.settings": "Paramètres Shopify", "plan.feature.processing.monitor": "Moniteur de traitement", "plan.feature.marketing.campaigns": "Campagnes", "plan.feature.marketing.campaigns.create": "Assistant nouvelle campagne", - "plan.feature.marketing.campaigns.generate_ai": "Génération IA de campagne", + "plan.feature.marketing.campaigns.generate_ai": "Génération IA de campagne", "plan.feature.marketing.campaigns.send": "Envoi / blast de campagne", "plan.feature.marketing.content_calendar": "Calendrier de contenu", "plan.feature.marketing.brand_kit": "Kit de marque", "plan.feature.marketing.brand_ai_apply": "Appliquer la marque IA dans les prompts", "plan.feature.marketing.seo": "Recommandations SEO", - "plan.feature.marketing.seo.template_fill": "Remplissage de modèle SEO", - "plan.feature.marketing.seo.ai_rewrite": "Réécriture SEO par IA", + "plan.feature.marketing.seo.template_fill": "Remplissage de modèle SEO", + "plan.feature.marketing.seo.ai_rewrite": "Réécriture SEO par IA", "plan.feature.marketing.reviews": "Avis", - "plan.feature.integrations.ai": "Intégrations IA", - "plan.feature.integrations.ai.byok": "Apportez votre propre clé IA", + "plan.feature.integrations.ai": "Intégrations IA", + "plan.feature.integrations.ai.byok": "Apportez votre propre clé IA", "plan.feature.integrations.email": "Envoi d'e-mails", "plan.feature.integrations.email.test": "Envoi d'e-mail de test", "plan.feature.integrations.email.blast": "Envoi massif d'e-mails", - "plan.feature.billing.overview": "Aperçu de la facturation", + "plan.feature.billing.overview": "Aperçu de la facturation", "plan.feature.billing.customer_portal": "Portail client Stripe", - "plan.feature.billing.quick_upgrade": "Paiement de mise à niveau rapide", + "plan.feature.billing.quick_upgrade": "Paiement de mise à niveau rapide", "plan.feature.billing.plans_compare": "Comparer les offres", "plan.feature.billing.checkout": "Paiement Stripe", - "plan.feature.settings.profile": "Paramètres du profil", - "plan.feature.settings.company": "Paramètres de l'entreprise", - "plan.feature.settings.alerts": "Préférences d'alertes", - "plan.feature.settings.api_keys": "Clés API", - "plan.feature.settings.team": "Gestion de l'équipe", - "plan.feature.settings.team_invite": "Inviter un coéquipier", + "plan.feature.settings.profile": "Paramètres du profil", + "plan.feature.settings.company": "Paramètres de l'entreprise", + "plan.feature.settings.alerts": "Préférences d'alertes", + "plan.feature.settings.api_keys": "Clés API", + "plan.feature.settings.team": "Gestion de l'équipe", + "plan.feature.settings.team_invite": "Inviter un coéquipier", "plan.feature.support.center": "Centre d'assistance", "plan.feature.support.ticket_create": "Nouveau ticket d'assistance", "plan.feature.support.ticket_thread": "Fil du ticket d'assistance", "plan.feature.capability.sku_cap": "Plafond de SKU produit", - "plan.feature.capability.ai_credits": "Portefeuille de crédits IA", - "plan.feature.capability.ai_processing": "Tâches de traitement IA", + "plan.feature.capability.ai_credits": "Portefeuille de crédits IA", + "plan.feature.capability.ai_processing": "Tâches de traitement IA", "plan.feature.capability.eprel": "Enrichissement EPREL", "plan.feature.capability.normalize_specs_fill": "Normaliser / specs / remplir", - "plan.feature.capability.campaign_ai": "Génération IA de campagne", + "plan.feature.capability.campaign_ai": "Génération IA de campagne", "plan.feature.capability.email_live_send": "Livraison d'e-mails en direct", "plan.feature.capability.brand_ai_apply": "Ton de marque dans les prompts IA", - "plan.feature.capability.seo_ai_rewrite": "Réécriture SEO par IA", + "plan.feature.capability.seo_ai_rewrite": "Réécriture SEO par IA", "plan.feature.capability.feed_source_limit": "Limite de sources de feed (marketing)", "plan.feature.capability.export_feed_limit": "Limite de feeds d'export (marketing)", "plan.feature.capability.storage_limit": "Limite de stockage (marketing)", - "plan.feature.capability.api_access": "Accès API REST (marketing)", - "plan.feature.capability.byok": "Apportez votre propre clé IA", + "plan.feature.capability.api_access": "Accès API REST (marketing)", + "plan.feature.capability.byok": "Apportez votre propre clé IA", "billing.plan.free": "Gratuit", - "products.actions.selectAll": "Tout sélectionner", - "products.actions.upgradeSuffix": " · améliorer", - "products.actions.upgradeRequired": "{label} (amélioration requise)", + "products.actions.selectAll": "Tout sélectionner", + "products.actions.upgradeSuffix": " · améliorer", + "products.actions.upgradeRequired": "{label} (amélioration requise)", "products.actions.free": "gratuit", - "products.actions.credits": "{credits} crédits", - "products.actions.autoCategorizeTitle": "Ajout automatique de la catégorisation", - "products.actions.autoCategorizeBody": "{count} produit(s) nécessitent une catégorisation pour le traitement {types}", - "products.actions.aiLocked": "Les options IA sont verrouillées sur Free. Passez à un plan supérieur pour traiter titres/descriptions.", - "products.actions.processSelected": "Traiter la sélection", - "products.actions.markProcessed": "Marquer comme traité", - "products.actions.resetUnprocessed": "Réinitialiser en non traité", + "products.actions.credits": "{credits} crédits", + "products.actions.autoCategorizeTitle": "Ajout automatique de la catégorisation", + "products.actions.autoCategorizeBody": "{count} produit(s) nécessitent une catégorisation pour le traitement {types}", + "products.actions.aiLocked": "Les options IA sont verrouillées sur Free. Passez à un plan supérieur pour traiter titres/descriptions.", + "products.actions.processSelected": "Traiter la sélection", + "products.actions.markProcessed": "Marquer comme traité", + "products.actions.resetUnprocessed": "Réinitialiser en non traité", "products.actions.export": "Exporter", - "products.upload.dropHint": "Déposez un CSV ici ou cliquez pour parcourir", - "products.upload.supportsHint": "Prend en charge les imports produits .csv (ean, name, category…)", - "products.export.chooseConfig": "Exporter {count} produit(s) sélectionné(s). Choisissez le feed d'export qui définit format et champs.", - "products.export.selectPlaceholder": "Sélectionnez un feed d'export…", + "products.upload.dropHint": "Déposez un CSV ici ou cliquez pour parcourir", + "products.upload.supportsHint": "Prend en charge les imports produits .csv (ean, name, category…)", + "products.export.chooseConfig": "Exporter {count} produit(s) sélectionné(s). Choisissez le feed d'export qui définit format et champs.", + "products.export.selectPlaceholder": "Sélectionnez un feed d'export…", "fields.typeLabel": "Type", "fields.groupLabel": "Groupe", - "fields.selectGroup": "Sélectionner un groupe", + "fields.selectGroup": "Sélectionner un groupe", "fields.groupBelongsHint": "Groupe auquel appartient ce champ", "fields.addFieldShort": "Ajouter un champ", - "fields.enableRecommended": "Activer les recommandés", - "feeds.activated": "Feed activé.", - "feeds.deactivated": "Feed désactivé.", - "feeds.syncTimeout": "Synchroniser timed out waiting for the server. The job may still finish — open Synchroniser History to check status.", - "feeds.createdMapHint": "Feed créé. Mappez les champs avant de synchroniser.", - "feeds.createdPlain": "Feed créé.", + "fields.enableRecommended": "Activer les recommandés", + "feeds.activated": "Feed activé.", + "feeds.deactivated": "Feed désactivé.", + "feeds.syncTimeout": "Synchroniser timed out waiting for the server. The job may still finish — open Synchroniser History to check status.", + "feeds.createdMapHint": "Feed créé. Mappez les champs avant de synchroniser.", + "feeds.createdPlain": "Feed créé.", "feeds.createdMapDesc": "Mappez les colonnes source aux champs produit, puis synchronisez.", - "feeds.lastLiveSync": "Dernière sync réussie du flux : {when}", - "feeds.noLiveSyncProducts": "Pas encore de sync réussie du flux. Catalogue dernièrement mis à jour {when}.", - "feeds.noDataYet": "Pas encore de sync ni de données catalogue.", + "feeds.lastLiveSync": "Dernière sync réussie du flux : {when}", + "feeds.noLiveSyncProducts": "Pas encore de sync réussie du flux. Catalogue dernièrement mis à jour {when}.", + "feeds.noDataYet": "Pas encore de sync ni de données catalogue.", "products.filters.incomplete": "Incomplet", "products.filters.complete44": "Complet (4/4)", "products.filters.missingName": "Nom manquant", "products.filters.missingDescription": "Description manquante", "products.filters.missingAttributes": "Attributs manquants", - "products.filters.missingCategory": "Catégorie manquante", + "products.filters.missingCategory": "Catégorie manquante", "products.filters.hasEprel": "Avec EPREL", "products.filters.noEprel": "Sans EPREL", - "products.filters.priceChanged": "Prix modifié", - "products.filters.stockChanged": "Stock modifié", - "products.filters.titleChanged": "Titre modifié", + "products.filters.priceChanged": "Prix modifié", + "products.filters.stockChanged": "Stock modifié", + "products.filters.titleChanged": "Titre modifié", "products.filters.newFromFeed": "Nouveau depuis le feed", "products.filters.otherFieldChange": "Autre changement de champ", - "products.filters.sortUpdatedNewest": "Mis à jour (plus récent)", - "products.filters.sortUpdatedOldest": "Mis à jour (plus ancien)", + "products.filters.sortUpdatedNewest": "Mis à jour (plus récent)", + "products.filters.sortUpdatedOldest": "Mis à jour (plus ancien)", "products.filters.sortNameAsc": "Nom (A-Z)", "products.filters.sortNameDesc": "Nom (Z-A)", "products.filters.searchPlaceholder": "Rechercher des produits...", - "products.filters.searchCategories": "Rechercher des catégories...", - "products.filters.selectFeed": "Sélectionner un feed", - "products.filters.loadingFeeds": "Chargement des feeds…", + "products.filters.searchCategories": "Rechercher des catégories...", + "products.filters.selectFeed": "Sélectionner un feed", + "products.filters.loadingFeeds": "Chargement des feeds…", "products.table.loading": "Chargement des produits", - "products.table.uncategorized": "Sans catégorie", - "products.table.assignCategory": "Attribuer une catégorie", - "products.table.changeCategory": "Changer la catégorie de {name}", - "products.table.selectCategory": "Sélectionner une catégorie…", - "products.table.saveCategory": "Enregistrer la catégorie", - "products.table.cancelCategory": "Annuler la modification de catégorie", - "products.table.categoryRequired": "Choisir une catégorie", - "products.table.noCategoriesAvailable": "Pas encore de catégories — créez-en une sous Catalogue", - "products.table.qualityUnavailable": "Qualité indisponible", + "products.table.uncategorized": "Sans catégorie", + "products.table.assignCategory": "Attribuer une catégorie", + "products.table.changeCategory": "Changer la catégorie de {name}", + "products.table.selectCategory": "Sélectionner une catégorie…", + "products.table.saveCategory": "Enregistrer la catégorie", + "products.table.cancelCategory": "Annuler la modification de catégorie", + "products.table.categoryRequired": "Choisir une catégorie", + "products.table.noCategoriesAvailable": "Pas encore de catégories — créez-en une sous Catalogue", + "products.table.qualityUnavailable": "Qualité indisponible", "products.table.full": "Complet", "products.table.empty": "Vide", "products.table.saveName": "Enregistrer le nom", "products.table.cancelRename": "Annuler le renommage", "products.table.noSyncYet": "Pas encore de sync", - "products.feedSync.feedAndWhen": "{feed} · {when}", - "products.feedSync.syncedWhen": "Synchronisé {when}", + "products.feedSync.feedAndWhen": "{feed} · {when}", + "products.feedSync.syncedWhen": "Synchronisé {when}", "products.table.productOptions": "Options produit", - "products.edit.details": "Détails du produit", + "products.edit.details": "Détails du produit", "products.edit.noEprel": "Aucun id EPREL sur ce produit.", - "products.edit.specsPresent": "Les spécifications techniques sont présentes sur ce produit.", + "products.edit.specsPresent": "Les spécifications techniques sont présentes sur ce produit.", "products.edit.noEnrichedName": "Aucun nom enrichi", - "products.edit.resetName": "Réinitialiser le nom enrichi à l'original", - "products.edit.cannotClearName": "L'original est vide — impossible d'effacer le nom enrichi via PATCH", - "products.edit.showPreview": "Afficher l'aperçu", + "products.edit.resetName": "Réinitialiser le nom enrichi à l'original", + "products.edit.cannotClearName": "L'original est vide — impossible d'effacer le nom enrichi via PATCH", + "products.edit.showPreview": "Afficher l'aperçu", "products.edit.editHtml": "Modifier le HTML", "products.edit.noEnrichedDescription": "Aucune description enrichie", - "products.edit.resetDescription": "Réinitialiser la description enrichie à l'original", - "products.edit.cannotClearDescription": "L’original est vide — impossible d’effacer la description enrichie via PATCH", + "products.edit.resetDescription": "Réinitialiser la description enrichie à l'original", + "products.edit.cannotClearDescription": "L’original est vide — impossible d’effacer la description enrichie via PATCH", "products.edit.unknownFeed": "Feed inconnu", - "products.edit.noProcessedName": "Aucun nom traité disponible", - "products.edit.feedNamed": "Flux · {name}", + "products.edit.noProcessedName": "Aucun nom traité disponible", + "products.edit.feedNamed": "Flux · {name}", "products.edit.noAiDescription": "Aucune description IA", - "products.edit.sourceLabel": "Libellé source", - "products.edit.coverageTitle": "Combien de Nom, Description, Attributs et Catégorie sont présents (flux ou traités).", - "products.edit.coverageReady": "{count}/4 prêts", - "products.edit.eprelPresentTitle": "L'id European Product Registry for Energy Labelling (EPREL) est présent sur ce produit.", + "products.edit.sourceLabel": "Libellé source", + "products.edit.coverageTitle": "Combien de Nom, Description, Attributs et Catégorie sont présents (flux ou traités).", + "products.edit.coverageReady": "{count}/4 prêts", + "products.edit.eprelPresentTitle": "L'id European Product Registry for Energy Labelling (EPREL) est présent sur ce produit.", "products.edit.noEprelBadge": "Sans EPREL", "products.edit.specsBadge": "Specs", - "products.edit.reviewBannerTitle": "Révisez les champs enrichis avant d’accepter", - "products.edit.reviewBannerHelp": "Utilisez l’onglet Révision pour comparer originaux et IA. Raccourcis : A accepter · R rejeter · Alt+1/2 champ · ⌘/Ctrl+Entrée tout accepter.", + "products.edit.reviewBannerTitle": "Révisez les champs enrichis avant d’accepter", + "products.edit.reviewBannerHelp": "Utilisez l’onglet Révision pour comparer originaux et IA. Raccourcis : A accepter · R rejeter · Alt+1/2 champ · ⌘/Ctrl+Entrée tout accepter.", "products.edit.tab.review": "Examiner", - "products.edit.tab.details": "Détails", + "products.edit.tab.details": "Détails", "products.edit.tab.content": "Contenu", "products.edit.tab.attributes": "Attributs", "products.edit.tab.feed": "Flux", - "products.edit.changed": "Modifié", + "products.edit.changed": "Modifié", "products.edit.matched": "Correspondant", "products.edit.original": "Original", "products.edit.enriched": "Enrichi", @@ -4214,437 +4215,437 @@ export const fr: MessageDict = { "products.edit.acceptName": "Accepter le nom", "products.edit.discardDescription": "Rejeter la description", "products.edit.acceptDescription": "Accepter la description", - "products.edit.noCategory": "No Catégorie", - "products.edit.whatsFilledIn": "Ce qui est renseigné", - "products.edit.coverageLegend": "Gray = missing · Orange = from flux · Green = processed", + "products.edit.noCategory": "No Catégorie", + "products.edit.whatsFilledIn": "Ce qui est renseigné", + "products.edit.coverageLegend": "Gray = missing · Orange = from flux · Green = processed", "products.edit.feedSource": "Flux source", - "products.edit.updatedRelative": "· mis à jour {when}", + "products.edit.updatedRelative": "· mis à jour {when}", "products.edit.viewAllFeedFields": "View all flux fields ({filled}/{total})", "products.edit.productIdentity": "Produit identity", - "products.edit.aiProcessedName": "Nom traité par AI", - "products.edit.originalName": "Nom d’origine", + "products.edit.aiProcessedName": "Nom traité par AI", + "products.edit.originalName": "Nom d’origine", "products.edit.productIdSku": "Produit ID / SKU", - "products.edit.rowUpdated": "Ligne produit mise à jour {when}", + "products.edit.rowUpdated": "Ligne produit mise à jour {when}", "products.edit.noRawUpdateTime": "No raw produit update time", - "products.edit.feedSyncLabel": "· flux sync {when}", - "products.edit.neverRecorded": "jamais enregistré", - "products.edit.feedFilledCount": "{filled} renseignés · {total} champs", + "products.edit.feedSyncLabel": "· flux sync {when}", + "products.edit.neverRecorded": "jamais enregistré", + "products.edit.feedFilledCount": "{filled} renseignés · {total} champs", "products.edit.noMappedFeedFields": "No mapped flux fields on this produit.", "products.edit.fieldCol": "Champ", "products.edit.valueFromFeed": "Valeur from flux", - "products.edit.core": "Cœur", - "products.edit.aiProcessedDescription": "Description traitée par AI", - "products.edit.originalDescription": "Description d’origine", + "products.edit.core": "CÅ“ur", + "products.edit.aiProcessedDescription": "Description traitée par AI", + "products.edit.originalDescription": "Description d’origine", "products.edit.noAttrsYet": "No attribut or specification data on this produit yet.", "products.edit.fromFeed": "Depuis le feed", - "products.edit.feedAttrsHelp": "Valeurs extraites du flux (spécifications HTML, garantie, dimensions, EPREL). Les clés sont liées à attribute_key lorsque possible.", + "products.edit.feedAttrsHelp": "Valeurs extraites du flux (spécifications HTML, garantie, dimensions, EPREL). Les clés sont liées à attribute_key lorsque possible.", "products.edit.fieldsCount": "{count} champs", - "products.edit.originalAttributes": "Attributs d’origine", + "products.edit.originalAttributes": "Attributs d’origine", "products.edit.aiAttributes": "Attributs IA / enrichis", "products.edit.editableAttributes": "Attributs modifiables", - "products.edit.editableAttributesHelp": "Les modifications sont enregistrées dans la carte d’attributs du produit. Les lignes feed et IA ci-dessous restent en référence lorsqu’elles diffèrent.", + "products.edit.editableAttributesHelp": "Les modifications sont enregistrées dans la carte d’attributs du produit. Les lignes feed et IA ci-dessous restent en référence lorsqu’elles diffèrent.", "products.edit.addAttribute": "Ajouter un attribut", - "products.edit.attrKeyPlaceholder": "Clé", + "products.edit.attrKeyPlaceholder": "Clé", "products.edit.attrValuePlaceholder": "Valeur", "products.edit.removeAttribute": "Supprimer {key}", - "products.edit.noEditableAttrs": "Pas encore d’attributs modifiables. Ajoutez une paire clé/valeur.", + "products.edit.noEditableAttrs": "Pas encore d’attributs modifiables. Ajoutez une paire clé/valeur.", "products.edit.reject": "Rejeter", "products.edit.accept": "Accepter", - "taskIndicator.title": "Tâches en arrière-plan", - "taskIndicator.activeOne": "1 tâche en cours", - "taskIndicator.activeMany": "{count} tâches en cours", + "taskIndicator.title": "Tâches en arrière-plan", + "taskIndicator.activeOne": "1 tâche en cours", + "taskIndicator.activeMany": "{count} tâches en cours", "taskIndicator.view": "Voir la progression", - "taskIndicator.expand": "Développer la liste des tâches", - "taskIndicator.collapse": "Réduire la liste des tâches", - "taskIndicator.progressAria": "Progression de la tâche {pct} pour cent", + "taskIndicator.expand": "Développer la liste des tâches", + "taskIndicator.collapse": "Réduire la liste des tâches", + "taskIndicator.progressAria": "Progression de la tâche {pct} pour cent", "taskIndicator.progressCounts": "{done} sur {total} produits", - "attributes.assignBulk": "Assigner aux catégories", + "attributes.assignBulk": "Assigner aux catégories", "products.filters.search": "Rechercher", "products.filters.sortAria": "Tri : {label}", "products.filters.sortLabel": "Tri : {label}", "products.table.colIdName": "ID/Nom", "products.table.colCoverage": "Couverture", - "products.table.coverageTitle": "Couverture : N=Nom, D=Description, A=Attributs, C=Catégorie. Gris=manquant, orange=depuis le flux, vert=traité. EPREL affiche l’id du registre d’étiquette énergétique.", + "products.table.coverageTitle": "Couverture : N=Nom, D=Description, A=Attributs, C=Catégorie. Gris=manquant, orange=depuis le flux, vert=traité. EPREL affiche l’id du registre d’étiquette énergétique.", "products.table.colFeed": "Feed", - "products.table.colCategory": "Catégorie", + "products.table.colCategory": "Catégorie", "products.table.colStatus": "Statut", - "products.table.colUpdated": "Dernière mise à jour", + "products.table.colUpdated": "Dernière mise à jour", "products.table.colActions": "Actions", - "products.table.loadingDots": "Chargement des produits…", - "products.table.noneFound": "Aucun produits trouvé.", - "products.table.selectProduct": "Sélectionner le produit {name}", + "products.table.loadingDots": "Chargement des produits…", + "products.table.noneFound": "Aucun produits trouvé.", + "products.table.selectProduct": "Sélectionner le produit {name}", "products.table.rename": "Renommer {name}", "products.table.productNameAria": "Nom du produit pour {name}", - "products.table.selectPage": "Sélectionner {count} on this page", - "products.table.deselectPage": "Désélectionner {count} sur cette page", + "products.table.selectPage": "Sélectionner {count} on this page", + "products.table.deselectPage": "Désélectionner {count} sur cette page", "categories.assign": "Assigner", - "categories.titleFormulaSubtitle": "Configurez comment les titres de produits doivent être générés pour {name}", + "categories.titleFormulaSubtitle": "Configurez comment les titres de produits doivent être générés pour {name}", "categories.addText": "Ajouter du texte", - "categories.aboutTitleFormulas": "À propos des formules de titre", - "categories.aboutTitleFormulasHelp": "Les titres sont assemblés de gauche à droite à partir des éléments ci-dessous.", - "categories.variablesReplacedHelp": "Les variables sont remplacées par les données produit lorsqu’elles sont disponibles. Les valeurs manquantes sont ignorées.", - "categories.variableTypeHelp": "Champ dynamique issu des données produit (exemple : marque).", - "categories.textTypeHelp": "Texte statique qui apparaît toujours tel qu’écrit.", - "categories.assignTitleCopyHelp": "Utilisez Assigner pour copier cette formule vers d’autres catégories qui doivent partager le même modèle de titre.", - "categories.titleFormulaInvalid": "Cette page de formule de titre nécessite une catégorie valide. Revenez aux catégories et rouvrez Modifier la formule de titre.", - "categories.preview.title": "Aperçu du titre", - "categories.preview.description": "Voici comment vos titres de produits seront structurés", - "categories.preview.exampleTab": "Aperçu d’exemple", + "categories.aboutTitleFormulas": "À propos des formules de titre", + "categories.aboutTitleFormulasHelp": "Les titres sont assemblés de gauche à droite à partir des éléments ci-dessous.", + "categories.variablesReplacedHelp": "Les variables sont remplacées par les données produit lorsqu’elles sont disponibles. Les valeurs manquantes sont ignorées.", + "categories.variableTypeHelp": "Champ dynamique issu des données produit (exemple : marque).", + "categories.textTypeHelp": "Texte statique qui apparaît toujours tel qu’écrit.", + "categories.assignTitleCopyHelp": "Utilisez Assigner pour copier cette formule vers d’autres catégories qui doivent partager le même modèle de titre.", + "categories.titleFormulaInvalid": "Cette page de formule de titre nécessite une catégorie valide. Revenez aux catégories et rouvrez Modifier la formule de titre.", + "categories.preview.title": "Aperçu du titre", + "categories.preview.description": "Voici comment vos titres de produits seront structurés", + "categories.preview.exampleTab": "Aperçu d’exemple", "categories.preview.structureTab": "Structure de la formule", - "categories.preview.noElements": "Aucun élément ajouté pour l’instant", - "categories.brandTips.title": "Conseils liés à la marque", - "categories.brandTips.freePlan": "Le kit de marque est modifiable en Free ; l’application IA se débloque sur les forfaits payants.", + "categories.preview.noElements": "Aucun élément ajouté pour l’instant", + "categories.brandTips.title": "Conseils liés à la marque", + "categories.brandTips.freePlan": "Le kit de marque est modifiable en Free ; l’application IA se débloque sur les forfaits payants.", "categories.brandTips.editBrandKit": "Modifier le kit de marque", - "categories.brandTips.emptyBefore": "Ajoutez une voix ou des termes préférés dans ", + "categories.brandTips.emptyBefore": "Ajoutez une voix ou des termes préférés dans ", "categories.brandTips.emptyAfter": " pour des conseils ici.", "categories.brandTips.brandKit": "Kit de marque", "categories.brandTips.descGuidanceBefore": "Conseils de votre ", "categories.brandTips.descGuidanceAfter": " pour les sections de description.", - "categories.formulaElementsTitle": "Éléments de formule", - "categories.formulaElementsHelp": "Glissez-déposez les éléments pour les réordonner", - "categories.noElementsAdded": "Aucun élément ajouté", + "categories.formulaElementsTitle": "Éléments de formule", + "categories.formulaElementsHelp": "Glissez-déposez les éléments pour les réordonner", + "categories.noElementsAdded": "Aucun élément ajouté", "categories.addElementsHint": "Ajoutez des variables ou du texte depuis le panneau de droite", - "categories.editTextElementAria": "Modifier l’élément texte {value}", - "categories.removeElementAria": "Supprimer l’élément {type} {value}", + "categories.editTextElementAria": "Modifier l’élément texte {value}", + "categories.removeElementAria": "Supprimer l’élément {type} {value}", "categories.tab.single": "Unique", "categories.tab.bulk": "Import en masse", "categories.uniqueIdLabel": "ID unique", "categories.parentLabel": "Parent", "categories.noneRoot": "Aucun (racine)", "categories.descriptionLabel": "Description", - "categories.csvUploadHelp": "Importez un CSV avec les colonnes name, unique_id, et éventuellement parent_unique_id et description.", - "categories.downloadTemplate": "Télécharger le modèle", - "categories.variableNameKey": "Nom (clé)", - "categories.displayName": "Nom affiché", - "categories.exampleValue": "Valeur d’exemple", - "categories.variableExists": "Une variable nommée \"{name}\" existe déjà.", + "categories.csvUploadHelp": "Importez un CSV avec les colonnes name, unique_id, et éventuellement parent_unique_id et description.", + "categories.downloadTemplate": "Télécharger le modèle", + "categories.variableNameKey": "Nom (clé)", + "categories.displayName": "Nom affiché", + "categories.exampleValue": "Valeur d’exemple", + "categories.variableExists": "Une variable nommée \"{name}\" existe déjà.", "categories.addVariable": "Ajouter une variable", - "categories.updateVariable": "Mettre à jour la variable", - "categories.col.displayName": "Nom affiché", - "categories.col.key": "Clé", + "categories.updateVariable": "Mettre à jour la variable", + "categories.col.displayName": "Nom affiché", + "categories.col.key": "Clé", "categories.col.description": "Description", "categories.col.example": "Exemple", - "categories.noVariablesFound": "Aucune variable trouvée", + "categories.noVariablesFound": "Aucune variable trouvée", "categories.availableVariables": "Variables disponibles", - "categories.manage": "Gérer", - "categories.noVariablesMatch": "Aucune variable ne correspond à “{query}”.", - "categories.noUnusedVariables": "Plus de variables inutilisées. Ajoutez une variable personnalisée, ou retirez un élément pour en libérer une.", + "categories.manage": "Gérer", + "categories.noVariablesMatch": "Aucune variable ne correspond à “{query}”.", + "categories.noUnusedVariables": "Plus de variables inutilisées. Ajoutez une variable personnalisée, ou retirez un élément pour en libérer une.", "categories.exampleColon": "Exemple : {value}", "categories.editVariableAria": "Modifier {label}", "categories.deleteVariableAria": "Supprimer {label}", "categories.addVariableAria": "Ajouter {label}", "categories.textLabel": "Texte", - "categories.textAppearsAsWritten": "Ce texte apparaîtra exactement tel qu’écrit dans vos titres", + "categories.textAppearsAsWritten": "Ce texte apparaîtra exactement tel qu’écrit dans vos titres", "categories.addTextButton": "Ajouter du texte", - "categories.updateTextButton": "Mettre à jour le texte", + "categories.updateTextButton": "Mettre à jour le texte", "categories.structureDescriptionsFor": "Structurez les descriptions produits pour {name}", "categories.metaInformation": "Informations meta", - "categories.metaInformationHelp": "Instructions utilisées par l’IA pour les balises de titre SEO et de meta description.", + "categories.metaInformationHelp": "Instructions utilisées par l’IA pour les balises de titre SEO et de meta description.", "categories.metaTitleFormula": "Formule de meta titre", - "categories.metaTitleHint": "Affiché dans les résultats de recherche et les onglets du navigateur (environ 50–60 caractères).", + "categories.metaTitleHint": "Affiché dans les résultats de recherche et les onglets du navigateur (environ 50–60 caractères).", "categories.metaDescriptionFormula": "Formule de meta description", - "categories.metaDescriptionHint": "Affiché sous le titre dans les résultats de recherche (environ 120–155 caractères).", - "categories.resetToDefault": "Réinitialiser par défaut", + "categories.metaDescriptionHint": "Affiché sous le titre dans les résultats de recherche (environ 120–155 caractères).", + "categories.resetToDefault": "Réinitialiser par défaut", "categories.descriptionSections": "Sections de description", - "categories.descriptionSectionsHelp": "Glissez les sections pour définir l’ordre de la description générée.", + "categories.descriptionSectionsHelp": "Glissez les sections pour définir l’ordre de la description générée.", "categories.noSectionsYet": "Pas encore de sections", "categories.addSectionsHint": "Ajoutez un titre, un paragraphe ou une liste pour commencer.", "categories.aiInstructions": "Instructions IA", - "categories.exportIdOptional": "ID d’export (facultatif)", - "categories.exportIdUnique": "L’ID d’export doit être unique", + "categories.exportIdOptional": "ID d’export (facultatif)", + "categories.exportIdUnique": "L’ID d’export doit être unique", "categories.addSection": "Ajouter une section", - "categories.aboutDescriptionFormulas": "À propos des formules de description", - "categories.aboutDescriptionFormulasHelp": "Ces instructions indiquent à l’IA comment rédiger les descriptions des produits de cette catégorie.", + "categories.aboutDescriptionFormulas": "À propos des formules de description", + "categories.aboutDescriptionFormulasHelp": "Ces instructions indiquent à l’IA comment rédiger les descriptions des produits de cette catégorie.", "categories.sectionTypesHeading": "Types de section", - "categories.sectionTypeHeadings": "Titres (H1–H4) :", + "categories.sectionTypeHeadings": "Titres (H1–H4) :", "categories.sectionTypeHeadingsHelp": "Titres et sous-titres", "categories.sectionTypeParagraphs": "Paragraphes :", "categories.sectionTypeParagraphsHelp": "Blocs de contenu principaux", - "categories.sectionTypeLists": "Listes à puces :", - "categories.sectionTypeListsHelp": "Fonctionnalités et specs", + "categories.sectionTypeLists": "Listes à puces :", + "categories.sectionTypeListsHelp": "Fonctionnalités et specs", "categories.aiInstructionsHeading": "Instructions IA", - "categories.aiInstructionsBody": "Écrivez un objectif clair par section (contenu, ton, longueur). Des consignes floues produisent un texte flou.", - "categories.exportIdsHeading": "IDs d’export", - "categories.exportIdsBody": "Les IDs facultatifs associent une section aux flux d’export (par exemple short_description).", - "categories.assignDescCopyHelp": "Utilisez Assigner pour copier ce modèle vers d’autres catégories qui doivent partager la même structure.", - "categories.descriptionFormulaInvalid": "Cette page de formule de description nécessite une catégorie valide. Revenez aux catégories et rouvrez Modifier la formule de description.", + "categories.aiInstructionsBody": "Écrivez un objectif clair par section (contenu, ton, longueur). Des consignes floues produisent un texte flou.", + "categories.exportIdsHeading": "IDs d’export", + "categories.exportIdsBody": "Les IDs facultatifs associent une section aux flux d’export (par exemple short_description).", + "categories.assignDescCopyHelp": "Utilisez Assigner pour copier ce modèle vers d’autres catégories qui doivent partager la même structure.", + "categories.descriptionFormulaInvalid": "Cette page de formule de description nécessite une catégorie valide. Revenez aux catégories et rouvrez Modifier la formule de description.", "categories.sectionType.h1": "Titre 1", "categories.sectionType.h2": "Titre 2", "categories.sectionType.h3": "Titre 3", "categories.sectionType.h4": "Titre 4", "categories.sectionType.p": "Paragraphe", - "categories.sectionType.ul": "Liste à puces", - "categories.aiGenerationPrompt": "Prompt de génération IA", - "categories.aiPromptOverrides": "Remplace le prompt utilisateur d’amélioration produit de l’entreprise pour {name}", - "categories.promptTemplate": "Modèle de prompt", - "categories.promptTemplateHelp": "Utilisez des espaces réservés comme {{name}} et {{description}}. Laissez vide pour utiliser la valeur par défaut de l’entreprise dans Intégrations → IA.", + "categories.sectionType.ul": "Liste à puces", + "categories.aiGenerationPrompt": "Prompt de génération IA", + "categories.aiPromptOverrides": "Remplace le prompt utilisateur d’amélioration produit de l’entreprise pour {name}", + "categories.promptTemplate": "Modèle de prompt", + "categories.promptTemplateHelp": "Utilisez des espaces réservés comme {{name}} et {{description}}. Laissez vide pour utiliser la valeur par défaut de l’entreprise dans Intégrations → IA.", "categories.clear": "Effacer", "categories.promptLabel": "Invite", - "categories.charactersCount": "{count} caractères", - "categories.activeOverride": "· remplacement actif pour cette catégorie", - "categories.usingCompanyDefault": "· utilisation de la valeur par défaut de l’entreprise / intégrée", - "categories.usingCompanyDefaultForLang": "· vide pour cette langue — la valeur par défaut entreprise / intégrée s’applique", - "categories.aiPromptSavedLang": "Prompt IA enregistré pour {lang}.", - "categories.aiPromptClearedLang": "Prompt IA effacé pour {lang} (la valeur par défaut de l’entreprise s’appliquera).", + "categories.charactersCount": "{count} caractères", + "categories.activeOverride": "· remplacement actif pour cette catégorie", + "categories.usingCompanyDefault": "· utilisation de la valeur par défaut de l’entreprise / intégrée", + "categories.usingCompanyDefaultForLang": "· vide pour cette langue — la valeur par défaut entreprise / intégrée s’applique", + "categories.aiPromptSavedLang": "Prompt IA enregistré pour {lang}.", + "categories.aiPromptClearedLang": "Prompt IA effacé pour {lang} (la valeur par défaut de l’entreprise s’appliquera).", "contentLang.switcherLabel": "Langue de contenu", "contentLang.primary": "principal", - "contentLang.hasOverride": "personnalisé", - "contentLang.addLanguage": "Ajouter une langue…", + "contentLang.hasOverride": "personnalisé", + "contentLang.addLanguage": "Ajouter une langue…", "contentLang.add": "Ajouter", "contentLang.removeLanguage": "Retirer {lang}", "contentLang.resultsHint": "Changez de langue pour examiner les titres et descriptions IA de chaque langue de contenu.", "contentLang.settingsTitle": "Langues de contenu", - "contentLang.settingsHelp": "La langue principale est utilisée par défaut. Les langues supplémentaires ont leurs propres prompts et résultats IA (chaque passage consomme des crédits).", - "ai.prompts.languageHelp": "Modifiez les prompts de l’entreprise par langue de contenu. Une langue vide utilise la valeur intégrée par défaut pour cette langue.", - "header.accountSettingsAria": "Paramètres du compte pour {email}", - "switcher.switchUserAria": "Changer d’utilisateur : {label}", - "switcher.unavailable": "Le changement d’utilisateur n’est pas disponible dans cet environnement.", + "contentLang.settingsHelp": "La langue principale est utilisée par défaut. Les langues supplémentaires ont leurs propres prompts et résultats IA (chaque passage consomme des crédits).", + "ai.prompts.languageHelp": "Modifiez les prompts de l’entreprise par langue de contenu. Une langue vide utilise la valeur intégrée par défaut pour cette langue.", + "header.accountSettingsAria": "Paramètres du compte pour {email}", + "switcher.switchUserAria": "Changer d’utilisateur : {label}", + "switcher.unavailable": "Le changement d’utilisateur n’est pas disponible dans cet environnement.", "switcher.loadFailed": "Impossible de charger les utilisateurs.", - "support.notifications.aria": "Notifications d’assistance", - "support.notifications.ariaUnread": "Notifications d’assistance, {count} non lues", + "support.notifications.aria": "Notifications d’assistance", + "support.notifications.ariaUnread": "Notifications d’assistance, {count} non lues", "time.never": "Jamais", "time.invalid": "Date invalide", "time.unknown": "Date inconnue", - "time.justNow": "à l’instant", - "time.neverUsed": "Jamais utilisé", + "time.justNow": "à l’instant", + "time.neverUsed": "Jamais utilisé", "billing.plan.enterprise": "Entreprise", - "news.heading": "Mises à jour de la plateforme", - "news.subtitle": "Dernières fonctionnalités et améliorations", - "news.keyFeatures": "Fonctionnalités clés :", + "news.heading": "Mises à jour de la plateforme", + "news.subtitle": "Dernières fonctionnalités et améliorations", + "news.keyFeatures": "Fonctionnalités clés :", "news.badge.new": "Nouveau", - "news.footer": "C’est tout pour le moment — revenez après la prochaine version.", - "news.category.enhancement": "Amélioration", - "news.category.feature": "Fonctionnalité", - "news.category.integration": "Intégration", - "news.category.newFeature": "Nouvelle fonctionnalité", + "news.footer": "C’est tout pour le moment — revenez après la prochaine version.", + "news.category.enhancement": "Amélioration", + "news.category.feature": "Fonctionnalité", + "news.category.integration": "Intégration", + "news.category.newFeature": "Nouvelle fonctionnalité", "news.category.billing": "Facturation", - "news.uxImprovements.description": "Utilisabilité renforcée avec contrôles du guide, améliorations API et meilleure navigation.", + "news.uxImprovements.description": "Utilisabilité renforcée avec contrôles du guide, améliorations API et meilleure navigation.", "news.uxImprovements.f1": "Ignorer/masquer le guide", - "news.uxImprovements.f2": "Améliorations de fiabilité de l’API", - "news.uxImprovements.f3": "Navigation d’interface améliorée", - "news.uxImprovements.f4": "Meilleure efficacité du flux de travail", - "news.multiselect.title": "Prise en charge des attributs multisélection", + "news.uxImprovements.f2": "Améliorations de fiabilité de l’API", + "news.uxImprovements.f3": "Navigation d’interface améliorée", + "news.uxImprovements.f4": "Meilleure efficacité du flux de travail", + "news.multiselect.title": "Prise en charge des attributs multisélection", "news.multiselect.description": "Les produits peuvent avoir plusieurs valeurs pour les attributs de type liste.", - "news.multiselect.f1": "Type d’attribut multisélection", - "news.multiselect.f2": "Sélection multiple à l’édition produit", + "news.multiselect.f1": "Type d’attribut multisélection", + "news.multiselect.f2": "Sélection multiple à l’édition produit", "news.multiselect.f3": "Plusieurs valeurs sur un seul attribut", - "news.multiselect.f4": "Extraction améliorée pour champs multisélection", - "news.multiselect.f5": "Meilleure compatibilité des flux d’export", - "news.csvEan.title": "Téléversement CSV d’EAN", - "news.csvEan.description": "Téléversez des CSV d’EAN pour traiter des centaines de produits d’un coup.", - "news.csvEan.f1": "Téléversement CSV glisser-déposer", + "news.multiselect.f4": "Extraction améliorée pour champs multisélection", + "news.multiselect.f5": "Meilleure compatibilité des flux d’export", + "news.csvEan.title": "Téléversement CSV d’EAN", + "news.csvEan.description": "Téléversez des CSV d’EAN pour traiter des centaines de produits d’un coup.", + "news.csvEan.f1": "Téléversement CSV glisser-déposer", "news.csvEan.f2": "Validation du format EAN (EAN-8, EAN-13, UPC-12, GTIN-14)", - "news.csvEan.f3": "Détection automatique des doublons", + "news.csvEan.f3": "Détection automatique des doublons", "news.csvEan.f4": "Traitement produit en masse", - "news.csvEan.f5": "Statistiques de traitement détaillées", + "news.csvEan.f5": "Statistiques de traitement détaillées", "news.brick.title": "Prise en charge des attributs code BRICK", - "news.brick.description": "Système d’attributs avec codes BRICK pour classification et export standardisés.", + "news.brick.description": "Système d’attributs avec codes BRICK pour classification et export standardisés.", "news.brick.f1": "Gestion des attributs code BRICK", - "news.brick.f2": "Formatage automatique des codes à l’export", - "news.brick.f3": "Intégration des codes BRICK dans les flux XML", - "news.brick.f4": "Améliorations de compatibilité des flux d’export", - "news.apiV1.title": "Publication de l’API v1", - "news.apiV1.description": "Nouveaux endpoints API v1 pour catégories, attributs, flux, produits et exports.", - "news.apiV1.f1": "Endpoints RESTful de l’API v1", - "news.apiV1.f2": "Gestion des catégories et attributs", - "news.apiV1.f3": "Création et gestion des flux", + "news.brick.f2": "Formatage automatique des codes à l’export", + "news.brick.f3": "Intégration des codes BRICK dans les flux XML", + "news.brick.f4": "Améliorations de compatibilité des flux d’export", + "news.apiV1.title": "Publication de l’API v1", + "news.apiV1.description": "Nouveaux endpoints API v1 pour catégories, attributs, flux, produits et exports.", + "news.apiV1.f1": "Endpoints RESTful de l’API v1", + "news.apiV1.f2": "Gestion des catégories et attributs", + "news.apiV1.f3": "Création et gestion des flux", "news.apiV1.f4": "Traitement des produits via API", - "news.apiV1.f5": "Accès programmatique aux flux d’export", + "news.apiV1.f5": "Accès programmatique aux flux d’export", "news.apiV1.f6": "Authentification et autorisation", "news.feedFiltering.title": "Filtrage des flux sur la page produits", - "news.feedFiltering.description": "Page produits avec filtrage de flux optimisé, états de chargement et meilleures perfs.", - "news.feedFiltering.f1": "Filtrage des flux amélioré", - "news.feedFiltering.f2": "États de chargement améliorés", - "news.feedFiltering.f3": "Performance des requêtes optimisée", + "news.feedFiltering.description": "Page produits avec filtrage de flux optimisé, états de chargement et meilleures perfs.", + "news.feedFiltering.f1": "Filtrage des flux amélioré", + "news.feedFiltering.f2": "États de chargement améliorés", + "news.feedFiltering.f3": "Performance des requêtes optimisée", "news.feedFiltering.f4": "Meilleure gestion de la pagination", - "news.feedFiltering.f5": "Améliorations de la fonctionnalité d’export", - "news.exportFeeds.title": "Système de flux d’export", - "news.exportFeeds.description": "Système complet de flux d’export XML/CSV avec configurations personnalisées.", - "news.exportFeeds.f1": "Formats d’export XML et CSV", - "news.exportFeeds.f2": "Mappage de champs personnalisé", - "news.exportFeeds.f3": "Aperçu de l’export", - "news.exportFeeds.f4": "Export produit basé sur des tâches", - "news.exportFeeds.f5": "Intégration des données EPREL", - "news.exportFeeds.f6": "URL publiques des flux d’export", - "news.woocommerce.title": "Intégration WooCommerce", - "news.woocommerce.description": "Synchronisez produits, catégories et attributs avec les boutiques WooCommerce.", + "news.feedFiltering.f5": "Améliorations de la fonctionnalité d’export", + "news.exportFeeds.title": "Système de flux d’export", + "news.exportFeeds.description": "Système complet de flux d’export XML/CSV avec configurations personnalisées.", + "news.exportFeeds.f1": "Formats d’export XML et CSV", + "news.exportFeeds.f2": "Mappage de champs personnalisé", + "news.exportFeeds.f3": "Aperçu de l’export", + "news.exportFeeds.f4": "Export produit basé sur des tâches", + "news.exportFeeds.f5": "Intégration des données EPREL", + "news.exportFeeds.f6": "URL publiques des flux d’export", + "news.woocommerce.title": "Intégration WooCommerce", + "news.woocommerce.description": "Synchronisez produits, catégories et attributs avec les boutiques WooCommerce.", "news.woocommerce.f1": "Configuration des identifiants boutique", - "news.woocommerce.f2": "Mappage catégories et attributs", + "news.woocommerce.f2": "Mappage catégories et attributs", "news.woocommerce.f3": "Sync produit bidirectionnelle", - "news.woocommerce.f4": "Options de stratégie de correspondance", - "news.eprel.title": "Intégration des étiquettes énergétiques EPREL", - "news.eprel.description": "Intégration au registre européen d’étiquetage énergétique pour les données d’efficacité.", + "news.woocommerce.f4": "Options de stratégie de correspondance", + "news.eprel.title": "Intégration des étiquettes énergétiques EPREL", + "news.eprel.description": "Intégration au registre européen d’étiquetage énergétique pour les données d’efficacité.", "news.eprel.f1": "Traitement automatique des ID EPREL", - "news.eprel.f2": "Récupération des images d’étiquette énergétique", - "news.eprel.f3": "Téléchargements des fiches énergétiques produit", - "news.eprel.f4": "Extraction de la classe énergétique", + "news.eprel.f2": "Récupération des images d’étiquette énergétique", + "news.eprel.f3": "Téléchargements des fiches énergétiques produit", + "news.eprel.f4": "Extraction de la classe énergétique", "news.eprel.f5": "Prise en charge multilingue", - "news.aiCategorization.title": "Catégorisation produit améliorée", - "news.aiCategorization.description": "Système de catégorisation IA plus précis avec support hiérarchique.", - "news.aiCategorization.f1": "Navigation hiérarchique des catégories", + "news.aiCategorization.title": "Catégorisation produit améliorée", + "news.aiCategorization.description": "Système de catégorisation IA plus précis avec support hiérarchique.", + "news.aiCategorization.f1": "Navigation hiérarchique des catégories", "news.aiCategorization.f2": "Score de confiance", "news.aiCategorization.f3": "Prise en charge multilingue", "news.aiCategorization.f4": "Gestion automatique des repli", "news.standardFields.title": "Gestion des champs standard", - "news.standardFields.description": "Gérez les champs produit standard avec groupes, validation et valeurs par défaut.", + "news.standardFields.description": "Gérez les champs produit standard avec groupes, validation et valeurs par défaut.", "news.standardFields.f1": "Organisation par groupes de champs", - "news.standardFields.f2": "Champs système et personnalisés", - "news.standardFields.f3": "Règles de validation des champs", - "news.standardFields.f4": "Prise en charge des valeurs par défaut", + "news.standardFields.f2": "Champs système et personnalisés", + "news.standardFields.f3": "Règles de validation des champs", + "news.standardFields.f4": "Prise en charge des valeurs par défaut", "news.standardFields.f5": "Configuration automatique des champs", - "news.billingSystem.title": "Facturation basée sur les crédits", - "news.billingSystem.description": "Nouveau système de facturation par crédits avec suivi d’usage et options de paiement flexibles.", - "news.billingSystem.f1": "Traitement basé sur les crédits", - "news.billingSystem.f2": "Analytique d’usage", + "news.billingSystem.title": "Facturation basée sur les crédits", + "news.billingSystem.description": "Nouveau système de facturation par crédits avec suivi d’usage et options de paiement flexibles.", + "news.billingSystem.f1": "Traitement basé sur les crédits", + "news.billingSystem.f2": "Analytique d’usage", "news.billingSystem.f3": "Cycles de facturation flexibles", "news.billingSystem.f4": "Gestion des moyens de paiement", - "news.billingSystem.f5": "Génération de factures", + "news.billingSystem.f5": "Génération de factures", "products.pageTitle": "Gestion des produits", - "products.pageDescriptionStoresBefore": "Gérez, traitez et optimisez votre catalogue. Connectez une boutique ou importez un CSV via", - "products.pageDescriptionBasic": "Gérez, traitez et optimisez votre catalogue. Importez via Feeds ou téléversez un CSV.", - "products.keyboard.esc": "— fermez le panneau d'édition ou les dialogues", - "products.keyboard.toggle": "— afficher/masquer cet conseil", + "products.pageDescriptionStoresBefore": "Gérez, traitez et optimisez votre catalogue. Connectez une boutique ou importez un CSV via", + "products.pageDescriptionBasic": "Gérez, traitez et optimisez votre catalogue. Importez via Feeds ou téléversez un CSV.", + "products.keyboard.esc": "— fermez le panneau d'édition ou les dialogues", + "products.keyboard.toggle": "— afficher/masquer cet conseil", "products.keyboard.reviewPrefix": "Dans le panneau Needs Review :", "products.keyboard.acceptAll": "tout accepter", "products.keyboard.rejectShort": "rejeter", "products.keyboard.acceptFields": "accepter nom / description", "products.connectStore": "Connecter la boutique", - "products.updating": "Mise à jour…", - "products.needLinkedRaw": "Les produits sélectionnés nécessitent un produit brut lié pour être traités.", - "products.selectToProcess": "Sélectionnez au moins un produit à traiter.", - "products.undoResetHint": "Annuler renvoie le produit à non traité via une réinitialisation.", - "products.field.accepted": "{label} accepté dans le produit.", + "products.updating": "Mise à jour…", + "products.needLinkedRaw": "Les produits sélectionnés nécessitent un produit brut lié pour être traités.", + "products.selectToProcess": "Sélectionnez au moins un produit à traiter.", + "products.undoResetHint": "Annuler renvoie le produit à non traité via une réinitialisation.", + "products.field.accepted": "{label} accepté dans le produit.", "products.field.acceptFailed": "Impossible d'accepter {field}", - "products.field.discarded": "Enrichissement {label} ignoré.", + "products.field.discarded": "Enrichissement {label} ignoré.", "products.field.discardFailed": "Impossible d'ignorer {field}", - "products.upgradeRequired": "Mise à niveau requise", - "products.upgradeBody": "Cette fonctionnalité nécessite une offre payante ou des crédits IA.", + "products.upgradeRequired": "Mise à niveau requise", + "products.upgradeBody": "Cette fonctionnalité nécessite une offre payante ou des crédits IA.", "products.enrichment.rejectTitle": "Rejeter l'enrichissement ?", - "products.enrichment.rejectSelectedTitle": "Rejeter les produits sélectionnés ?", - "products.enrichment.resetTitle": "Réinitialiser à non traité ?", - "products.selectedOnPage": "{count} sélectionnés sur cette page", - "products.selectionPageOnly": "Affichage de {shown} sur {total} — sélection limitée à cette page", - "products.edit.coverageHint": "Combien de Nom, Description, Attributs et Catégorie sont présents (flux ou traités).", + "products.enrichment.rejectSelectedTitle": "Rejeter les produits sélectionnés ?", + "products.enrichment.resetTitle": "Réinitialiser à non traité ?", + "products.selectedOnPage": "{count} sélectionnés sur cette page", + "products.selectionPageOnly": "Affichage de {shown} sur {total} — sélection limitée à cette page", + "products.edit.coverageHint": "Combien de Nom, Description, Attributs et Catégorie sont présents (flux ou traités).", "products.edit.noEprelShort": "Sans EPREL", "products.edit.specs": "Specs", - "products.edit.reviewBannerBody": "Utilisez l’onglet Révision pour comparer originaux et IA. Raccourcis : A accepter · R rejeter · Alt+1/2 champ · ⌘/Ctrl+Entrée tout accepter.", - "products.edit.whatsFilled": "Ce qui est renseigné", - "products.edit.legend": "Gray = missing · Orange = from flux · Green = processed", - "products.edit.updatedAgo": "· mis à jour {relative}", + "products.edit.reviewBannerBody": "Utilisez l’onglet Révision pour comparer originaux et IA. Raccourcis : A accepter · R rejeter · Alt+1/2 champ · ⌘/Ctrl+Entrée tout accepter.", + "products.edit.whatsFilled": "Ce qui est renseigné", + "products.edit.legend": "Gray = missing · Orange = from flux · Green = processed", + "products.edit.updatedAgo": "· mis à jour {relative}", "products.edit.status": "Statut", "products.edit.noRawUpdate": "No raw produit update time", - "products.edit.feedSyncPart": "· sync du flux", - "products.edit.filledFields": "{filled} renseignés · {total} champs", + "products.edit.feedSyncPart": "· sync du flux", + "products.edit.filledFields": "{filled} renseignés · {total} champs", "products.edit.noMappedFields": "No mapped flux fields on this produit.", "products.edit.emptyBadge": "Vide", - "products.edit.coreBadge": "Cœur", - "products.edit.feedAttrsHint": "Valeurs extraites du flux (spécifications HTML, garantie, dimensions, EPREL). Les clés sont liées à attribute_key lorsque possible.", - "products.edit.originalAttrs": "Attributs d’origine", + "products.edit.coreBadge": "CÅ“ur", + "products.edit.feedAttrsHint": "Valeurs extraites du flux (spécifications HTML, garantie, dimensions, EPREL). Les clés sont liées à attribute_key lorsque possible.", + "products.edit.originalAttrs": "Attributs d’origine", "products.edit.aiAttrs": "Attributs IA / enrichis", "mapping.confidence.exact": "Exact", "mapping.confidence.alias": "Alias", "mapping.confidence.fuzzy": "Flou", "field.group.basic": "Informations de base", "field.group.pricing": "Tarification", - "field.group.media": "Médias", + "field.group.media": "Médias", "field.group.taxonomy": "Taxonomie", "field.group.inventory": "Inventaire", "field.group.attributes": "Attributs", - "field.group.shipping": "Expédition", - "field.group.compliance": "Conformité", + "field.group.shipping": "Expédition", + "field.group.compliance": "Conformité", "field.group.other": "Autre", "common.yes": "Oui", "common.no": "Non", "status.running": "En cours", - "flash.admin.analyticsLoadFailed": "Échec du chargement des analyses", - "flash.admin.diagnosticsLoadFailed": "Échec du chargement des diagnostics", - "flash.admin.diagnosticsUnavailable": "Les diagnostics ne sont pas disponibles sur ce déploiement. Contactez l’administrateur de la plateforme.", - "flash.admin.diagnosticsUnreachable": "Impossible d’atteindre l’API de diagnostics. Vérifiez que l’API tourne et que PUBLIC_API_URL / le proxy Vite pointent vers elle.", - "admin.charts.statusEmpty": "Aucune ligne dans cette répartition pour l’instant.", - "admin.charts.seriesEmpty": "Aucune donnée pour cette période.", + "flash.admin.analyticsLoadFailed": "Échec du chargement des analyses", + "flash.admin.diagnosticsLoadFailed": "Échec du chargement des diagnostics", + "flash.admin.diagnosticsUnavailable": "Les diagnostics ne sont pas disponibles sur ce déploiement. Contactez l’administrateur de la plateforme.", + "flash.admin.diagnosticsUnreachable": "Impossible d’atteindre l’API de diagnostics. Vérifiez que l’API tourne et que PUBLIC_API_URL / le proxy Vite pointent vers elle.", + "admin.charts.statusEmpty": "Aucune ligne dans cette répartition pour l’instant.", + "admin.charts.seriesEmpty": "Aucune donnée pour cette période.", "admin.charts.primaryDefault": "Principal", - "admin.charts.statusAria": "Répartition par statut", + "admin.charts.statusAria": "Répartition par statut", "admin.charts.seriesAria": "Graphique {label}", "admin.analytics.lastNDaysAria": "{days} derniers jours", "admin.analytics.overview": "Vue d'ensemble", - "admin.analytics.overviewHint": "Totaux plateforme avec contexte de période pour les {days} derniers jours.", - "admin.analytics.tokensInPeriod": "{tokens} sur la période · issus des produits traités", - "admin.analytics.creditsRemainingOf": "{remaining} restants sur {allocated} alloués", - "admin.analytics.noJobsYet": "Aucun job pour l’instant", - "admin.analytics.feedsVolume": "{input} entrants · {export} feeds d’export", - "admin.analytics.usersCompaniesRaw": "{users} utilisateurs · {companies} entreprises · {raw} bruts", - "admin.analytics.operations": "Opérations", - "admin.analytics.operationsHint": "Signaux de fiabilité, clés et croissance pour la période sélectionnée.", - "admin.analytics.failedCompleted": "{failed} échoués · {completed} terminés", - "admin.analytics.runningOver2h": "En cours > 2 h ·", - "admin.analytics.apiKeysTotal": "{total} au total (révoquées incluses)", - "admin.analytics.signupsDetail": "utilisateurs · {companies} entreprises · {tickets} tickets ouverts/en attente", + "admin.analytics.overviewHint": "Totaux plateforme avec contexte de période pour les {days} derniers jours.", + "admin.analytics.tokensInPeriod": "{tokens} sur la période · issus des produits traités", + "admin.analytics.creditsRemainingOf": "{remaining} restants sur {allocated} alloués", + "admin.analytics.noJobsYet": "Aucun job pour l’instant", + "admin.analytics.feedsVolume": "{input} entrants · {export} feeds d’export", + "admin.analytics.usersCompaniesRaw": "{users} utilisateurs · {companies} entreprises · {raw} bruts", + "admin.analytics.operations": "Opérations", + "admin.analytics.operationsHint": "Signaux de fiabilité, clés et croissance pour la période sélectionnée.", + "admin.analytics.failedCompleted": "{failed} échoués · {completed} terminés", + "admin.analytics.runningOver2h": "En cours > 2 h ·", + "admin.analytics.apiKeysTotal": "{total} au total (révoquées incluses)", + "admin.analytics.signupsDetail": "utilisateurs · {companies} entreprises · {tickets} tickets ouverts/en attente", "admin.analytics.providerMix": "Mix de fournisseurs", "admin.analytics.providerMixHint": "Consommation de tokens selon la configuration des identifiants IA.", - "admin.analytics.productsJobs": "{products} produits · {jobs} jobs", + "admin.analytics.productsJobs": "{products} produits · {jobs} jobs", "admin.analytics.trends": "Tendances", - "admin.analytics.trendsHint": "Séries quotidiennes pour tokens, fournisseurs, jobs et inscriptions.", - "admin.analytics.tokensByDayHint": "Tokens du traitement produit terminé (secondaire = produits ce jour-là)", + "admin.analytics.trendsHint": "Séries quotidiennes pour tokens, fournisseurs, jobs et inscriptions.", + "admin.analytics.tokensByDayHint": "Tokens du traitement produit terminé (secondaire = produits ce jour-là)", "admin.analytics.seriesTokens": "Jetons", "admin.analytics.seriesProducts": "Produits", - "admin.analytics.emptyTokens": "Aucun produit traité avec tokens sur cette période.", - "admin.analytics.tokensByProviderHint": "Répartition quotidienne : interne / populaire / personnalisé (par type de fournisseur)", - "admin.analytics.emptyProviderTokens": "Aucun token étiqueté fournisseur sur cette période.", - "admin.analytics.providerDayTip": "{date} : Interne {internal} · Populaire {popular} · Personnalisé {custom}", - "admin.analytics.seriesCreated": "Créé", - "admin.analytics.seriesFailed": "Échoué", - "admin.analytics.emptyJobsSeries": "Aucun job de traitement créé sur cette période.", + "admin.analytics.emptyTokens": "Aucun produit traité avec tokens sur cette période.", + "admin.analytics.tokensByProviderHint": "Répartition quotidienne : interne / populaire / personnalisé (par type de fournisseur)", + "admin.analytics.emptyProviderTokens": "Aucun token étiqueté fournisseur sur cette période.", + "admin.analytics.providerDayTip": "{date} : Interne {internal} · Populaire {popular} · Personnalisé {custom}", + "admin.analytics.seriesCreated": "Créé", + "admin.analytics.seriesFailed": "Échoué", + "admin.analytics.emptyJobsSeries": "Aucun job de traitement créé sur cette période.", "admin.analytics.seriesUsers": "Utilisateurs", "admin.analytics.seriesCompanies": "Entreprises", - "admin.analytics.emptySignups": "Aucune inscription utilisateur ou entreprise sur cette période.", + "admin.analytics.emptySignups": "Aucune inscription utilisateur ou entreprise sur cette période.", "admin.analytics.statusMix": "Mix de statuts", "admin.analytics.statusMixHint": "Files historiques pour jobs, sync de feeds et support.", "admin.analytics.jobStatus": "Statut des jobs", "admin.analytics.feedSyncQueue": "File de sync des feeds", "admin.analytics.supportTickets": "Tickets support", - "admin.analytics.emptyJobStatus": "Aucun job de traitement pour l’instant.", - "admin.analytics.emptyFeedSync": "Aucun job de sync de feeds pour l’instant.", - "admin.analytics.emptyTickets": "Aucun ticket support pour l’instant.", - "admin.analytics.usageDetail": "Détail d’utilisation", + "admin.analytics.emptyJobStatus": "Aucun job de traitement pour l’instant.", + "admin.analytics.emptyFeedSync": "Aucun job de sync de feeds pour l’instant.", + "admin.analytics.emptyTickets": "Aucun ticket support pour l’instant.", + "admin.analytics.usageDetail": "Détail d’utilisation", "admin.analytics.usageDetailHint": "Modes fournisseur, principales entreprises et cumuls de cycles de facturation.", "admin.analytics.companyUsage": "Usage par entreprise", "admin.analytics.jobsCol": "Jobs", "admin.analytics.billingCycles": "Facturation cycles", - "admin.analytics.billingCyclesHint": "Cumuls historiques des cycles passés (peuvent retarder par rapport à l’abonnement actif)", - "admin.analytics.periodCol": "Période", - "admin.analytics.creditsCol": "Crédits", - "admin.analytics.dataNotes": "Notes sur les données", - "admin.diagnostics.endpointNotMounted": "Endpoint non monté", + "admin.analytics.billingCyclesHint": "Cumuls historiques des cycles passés (peuvent retarder par rapport à l’abonnement actif)", + "admin.analytics.periodCol": "Période", + "admin.analytics.creditsCol": "Crédits", + "admin.analytics.dataNotes": "Notes sur les données", + "admin.diagnostics.endpointNotMounted": "Endpoint non monté", "admin.diagnostics.noPayload": "Aucune charge utile de diagnostic", - "admin.diagnostics.unavailableShort": "Les diagnostics ne sont pas disponibles sur ce déploiement.", - "admin.diagnostics.fixThenRefresh": "Corrigez l’erreur ci-dessus, puis actualisez.", - "admin.diagnostics.refreshOrConfirm": "Actualisez ou confirmez que l’API est saine.", - "admin.diagnostics.systemStatus": "État du système", - "admin.diagnostics.snapshot": "Instantané {when}", + "admin.diagnostics.unavailableShort": "Les diagnostics ne sont pas disponibles sur ce déploiement.", + "admin.diagnostics.fixThenRefresh": "Corrigez l’erreur ci-dessus, puis actualisez.", + "admin.diagnostics.refreshOrConfirm": "Actualisez ou confirmez que l’API est saine.", + "admin.diagnostics.systemStatus": "État du système", + "admin.diagnostics.snapshot": "Instantané {when}", "admin.diagnostics.queueTotal": "{total} au total", - "admin.diagnostics.queueStuck": "processing_jobs · bloqués en cours (>2 h) :", + "admin.diagnostics.queueStuck": "processing_jobs · bloqués en cours (>2 h) :", "admin.diagnostics.driver": "Pilote : {driver}", - "admin.diagnostics.openStuck": "Ouvrir les produits bloqués", - "admin.diagnostics.configPresence": "Présence de configuration", - "admin.diagnostics.configHint": "Booléens uniquement · env {env} · RPM {rpm} · lot {batch} · tentatives {retries}", - "admin.diagnostics.cutoverTitle": "Préparation cutover", - "admin.diagnostics.cutoverHint": "Indicateurs de présence uniquement — indices goose, âge worker, plans manquants. Pas de Stripe/SMTP live.", + "admin.diagnostics.openStuck": "Ouvrir les produits bloqués", + "admin.diagnostics.configPresence": "Présence de configuration", + "admin.diagnostics.configHint": "Booléens uniquement · env {env} · RPM {rpm} · lot {batch} · tentatives {retries}", + "admin.diagnostics.cutoverTitle": "Préparation cutover", + "admin.diagnostics.cutoverHint": "Indicateurs de présence uniquement — indices goose, âge worker, plans manquants. Pas de Stripe/SMTP live.", "admin.diagnostics.cutoverGoose": "Goose", - "admin.diagnostics.cutoverGooseVersion": "version_max {max} · attendu ≥ {min}", + "admin.diagnostics.cutoverGooseVersion": "version_max {max} · attendu ≥ {min}", "admin.diagnostics.cutoverGooseRequired": "Migrations requises", "admin.diagnostics.cutoverWorker": "Worker", - "admin.diagnostics.cutoverWorkerAge": "vu il y a {age}s · périmé après {stale}s", - "admin.diagnostics.cutoverWorkerAgeUnknown": "âge indisponible · périmé après {stale}s", + "admin.diagnostics.cutoverWorkerAge": "vu il y a {age}s · périmé après {stale}s", + "admin.diagnostics.cutoverWorkerAgeUnknown": "âge indisponible · périmé après {stale}s", "admin.diagnostics.cutoverPlansMissing": "Entreprises sans plan", "admin.diagnostics.cutoverPlansUnavailable": "Compte des plans indisponible", "admin.diagnostics.cutoverApiKeysMissing": "Companies without API keys", "admin.diagnostics.cutoverApiKeysUnavailable": "API key inventory unavailable", - "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", + "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", "admin.diagnostics.cutoverApiKeysLink": "List companies needing reissue", - "admin.diagnostics.cutoverApplied": "appliquée", + "admin.diagnostics.cutoverApplied": "appliquée", "admin.diagnostics.cutoverPending": "en attente", "admin.diagnostics.etlInventoryTitle": "ETL gap inventory", - "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", + "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", "admin.diagnostics.etlInventoryFiles": "Files metadata-only", "admin.diagnostics.etlInventoryFilesDetail": "metadata-only / total file rows", "admin.diagnostics.etlInventoryJobs": "Jobs migrated tag", @@ -4652,50 +4653,50 @@ export const fr: MessageDict = { "admin.diagnostics.etlInventoryJobsRan": "optional jobs domain backfill detected", "admin.diagnostics.etlInventoryTasks": "Tasks rows", "admin.diagnostics.etlInventoryTasksDetail": "legacy task history present in Postgres", - "admin.diagnostics.recentJobs": "Tâches récentes", - "admin.diagnostics.recentAiFailures": "Échecs IA support récents", - "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", - "admin.diagnostics.relatedTools": "Outils ops associés", - "admin.diagnostics.toolStuckTitle": "Produits bloqués", + "admin.diagnostics.recentJobs": "Tâches récentes", + "admin.diagnostics.recentAiFailures": "Échecs IA support récents", + "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", + "admin.diagnostics.relatedTools": "Outils ops associés", + "admin.diagnostics.toolStuckTitle": "Produits bloqués", "admin.diagnostics.toolStuckDesc": "Nettoyer les jobs en cours depuis plus de 2 heures.", "admin.diagnostics.toolOrphanTitle": "Orphan processed", - "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", + "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", "admin.diagnostics.toolAnalyticsTitle": "Analytique", - "admin.diagnostics.toolAnalyticsDesc": "Tendances et graphiques d’usage plateforme.", + "admin.diagnostics.toolAnalyticsDesc": "Tendances et graphiques d’usage plateforme.", "admin.diagnostics.toolBootstrapTitle": "Bootstrap", - "admin.diagnostics.toolBootstrapDesc": "Confirmer l’accès admin plateforme pour ce compte.", - "admin.diagnostics.toolSettingsTitle": "Paramètres", - "admin.diagnostics.toolSettingsDesc": "Messagerie, IA et mode système de la plateforme.", + "admin.diagnostics.toolBootstrapDesc": "Confirmer l’accès admin plateforme pour ce compte.", + "admin.diagnostics.toolSettingsTitle": "Paramètres", + "admin.diagnostics.toolSettingsDesc": "Messagerie, IA et mode système de la plateforme.", "admin.diagnostics.config.maintenance_mode": "Mode maintenance", "admin.diagnostics.config.read_only_mode": "Mode lecture seule", - "admin.diagnostics.config.session_secure": "Cookie de session sécurisé", - "admin.diagnostics.config.smtp_enabled": "SMTP activé", + "admin.diagnostics.config.session_secure": "Cookie de session sécurisé", + "admin.diagnostics.config.smtp_enabled": "SMTP activé", "admin.diagnostics.config.email_dry_run": "Email dry-run", - "admin.diagnostics.config.smtp_host_set": "Hôte SMTP défini", + "admin.diagnostics.config.smtp_host_set": "Hôte SMTP défini", "admin.diagnostics.config.stripe_mock": "Stripe mock", - "admin.diagnostics.config.eprel_enabled": "EPREL activé", - "admin.diagnostics.config.upload_dir_configured": "Répertoire d’upload configuré", - "admin.diagnostics.config.trusted_proxies_configured": "Proxys de confiance définis", - "admin.diagnostics.config.web_origin_set": "Origine web définie", - "admin.diagnostics.config.public_api_url_set": "URL API publique définie", - "admin.diagnostics.config.token_signing_secret_set": "Secret de signature des tokens défini", - "admin.diagnostics.config.openai_key_set": "Clé OpenAI définie", - "admin.diagnostics.config.pinecone_key_set": "Clé Pinecone définie", - "admin.diagnostics.config.stripe_secret_set": "Secret Stripe défini", - "admin.diagnostics.config.stripe_webhook_secret_set": "Secret webhook Stripe défini", - "admin.diagnostics.config.stripe_mock_rejected_in_prod": "Mock Stripe rejeté en production", - "admin.diagnostics.config.credentials_encryption_key_set": "Clé de chiffrement des identifiants définie", - "categories.selectAll": "Tout sélectionner", - "categories.selectedCount": "{count} sélectionnés", - "categories.noMatchingCategories": "Aucune catégorie correspondante", - "categories.assigningProgress": "Attribution… {progress}%", - "categories.assignToCount": "Assigner à {count}", - "categories.aiPromptSavedForCategory": "Un prompt de génération IA est enregistré pour cette catégorie.", - "categories.titleAndDescriptionFormulasSaved": "Les formules de titre et de description sont enregistrées pour cette catégorie.", - "categories.titleFormulaSavedForCategory": "Une formule de titre est enregistrée pour cette catégorie.", - "categories.descriptionFormulaSavedForCategory": "Une formule de description est enregistrée pour cette catégorie.", + "admin.diagnostics.config.eprel_enabled": "EPREL activé", + "admin.diagnostics.config.upload_dir_configured": "Répertoire d’upload configuré", + "admin.diagnostics.config.trusted_proxies_configured": "Proxys de confiance définis", + "admin.diagnostics.config.web_origin_set": "Origine web définie", + "admin.diagnostics.config.public_api_url_set": "URL API publique définie", + "admin.diagnostics.config.token_signing_secret_set": "Secret de signature des tokens défini", + "admin.diagnostics.config.openai_key_set": "Clé OpenAI définie", + "admin.diagnostics.config.pinecone_key_set": "Clé Pinecone définie", + "admin.diagnostics.config.stripe_secret_set": "Secret Stripe défini", + "admin.diagnostics.config.stripe_webhook_secret_set": "Secret webhook Stripe défini", + "admin.diagnostics.config.stripe_mock_rejected_in_prod": "Mock Stripe rejeté en production", + "admin.diagnostics.config.credentials_encryption_key_set": "Clé de chiffrement des identifiants définie", + "categories.selectAll": "Tout sélectionner", + "categories.selectedCount": "{count} sélectionnés", + "categories.noMatchingCategories": "Aucune catégorie correspondante", + "categories.assigningProgress": "Attribution… {progress}%", + "categories.assignToCount": "Assigner à {count}", + "categories.aiPromptSavedForCategory": "Un prompt de génération IA est enregistré pour cette catégorie.", + "categories.titleAndDescriptionFormulasSaved": "Les formules de titre et de description sont enregistrées pour cette catégorie.", + "categories.titleFormulaSavedForCategory": "Une formule de titre est enregistrée pour cette catégorie.", + "categories.descriptionFormulaSavedForCategory": "Une formule de description est enregistrée pour cette catégorie.", "site.account": "Compte", - "site.goToApp": "Aller à l’app", + "site.goToApp": "Aller à l’app", "site.logIn": "Connexion", "site.getStarted": "Commencer", "site.nav.primary": "Principal", @@ -4703,560 +4704,560 @@ export const fr: MessageDict = { "site.nav.home": "Accueil", "site.nav.pricing": "Tarifs", "site.nav.apiDocs": "Docs API", - "seo.home.title": "Descrybe — Transformez les flux fournisseurs en fiches produit prêtes", - "seo.home.description": "Connectez des flux CSV ou XML de fournisseurs, mappez-les à vos catégories et attributs, générez des titres et descriptions conformes à vos règles, puis exportez ou synchronisez avec WooCommerce.", - "seo.pricing.title": "Tarifs — Free, Starter, Growth, Business | Descrybe", - "seo.pricing.description": "Commencez gratuitement avec 100 produits et le mapping de flux. Les offres payantes ajoutent titres et descriptions IA, plus de SKU, flux d'export et sync WooCommerce — à partir de 49 $/mois. Enterprise pour les catalogues illimités.", - "seo.privacy.title": "Politique de confidentialité | Descrybe", - "seo.privacy.description": "Comment Descrybe collecte, utilise et protège les données de compte, catalogues de produits et flux fournisseurs lorsque vous utilisez notre plateforme de données produit.", + "seo.home.title": "Descrybe — Transformez les flux fournisseurs en fiches produit prêtes", + "seo.home.description": "Connectez des flux CSV ou XML de fournisseurs, mappez-les à vos catégories et attributs, générez des titres et descriptions conformes à vos règles, puis exportez ou synchronisez avec WooCommerce.", + "seo.pricing.title": "Tarifs — Free, Starter, Growth, Business | Descrybe", + "seo.pricing.description": "Commencez gratuitement avec 100 produits et le mapping de flux. Les offres payantes ajoutent titres et descriptions IA, plus de SKU, flux d'export et sync WooCommerce — à partir de 49 $/mois. Enterprise pour les catalogues illimités.", + "seo.privacy.title": "Politique de confidentialité | Descrybe", + "seo.privacy.description": "Comment Descrybe collecte, utilise et protège les données de compte, catalogues de produits et flux fournisseurs lorsque vous utilisez notre plateforme de données produit.", "seo.terms.title": "Conditions d'utilisation | Descrybe", - "seo.terms.description": "Conditions d'utilisation de Descrybe : import de flux, enrichissement de catalogue, contenu assisté par IA, exports et synchronisation WooCommerce pour votre entreprise.", - "seo.features.title": "Fonctionnalités — Flux, enrichissement et export | Descrybe", - "seo.features.description": "Découvrez comment Descrybe importe les flux fournisseurs, mappe les champs à votre taxonomie, enrichit les données produit et diffuse les catalogues via flux d'export, WooCommerce ou API.", + "seo.terms.description": "Conditions d'utilisation de Descrybe : import de flux, enrichissement de catalogue, contenu assisté par IA, exports et synchronisation WooCommerce pour votre entreprise.", + "seo.features.title": "Fonctionnalités — Flux, enrichissement et export | Descrybe", + "seo.features.description": "Découvrez comment Descrybe importe les flux fournisseurs, mappe les champs à votre taxonomie, enrichit les données produit et diffuse les catalogues via flux d'export, WooCommerce ou API.", "pricing.page.eyebrow": "Tarifs", "pricing.page.title": "Des offres simples pour des catalogues en croissance", - "pricing.page.lead": "Commencez gratuitement avec le mapping de flux et un nettoyage de base. Passez à un plan supérieur quand vous avez besoin de titres et descriptions IA, de plus de produits, d’exports ou de la sync WooCommerce — de Starter à Enterprise.", - "pricing.page.subscribedBefore": "Déjà abonné ? Gérez l’usage sous", + "pricing.page.lead": "Commencez gratuitement avec le mapping de flux et un nettoyage de base. Passez à un plan supérieur quand vous avez besoin de titres et descriptions IA, de plus de produits, d’exports ou de la sync WooCommerce — de Starter à Enterprise.", + "pricing.page.subscribedBefore": "Déjà abonné ? Gérez l’usage sous", "pricing.page.subscribedMid": "ou comparez les offres dans", "pricing.page.plansLink": "Offres", "pricing.page.subscribedAfter": ".", - "legal.lastUpdated": "Dernière mise à jour : {date}", - "legal.backHome": "← Retour à l’accueil", + "legal.lastUpdated": "Dernière mise à jour : {date}", + "legal.backHome": "← Retour à l’accueil", "legal.emailLabel": "E-mail :", "legal.postalLabel": "Adresse postale :", - "legal.privacy.title": "Politique de confidentialité", + "legal.privacy.title": "Politique de confidentialité", "legal.privacy.intro.h": "Introduction", - "legal.privacy.intro.p1": "Chez Descrybe (\"nous\", \"notre\" ou \"nos\"), nous respectons votre vie privée et nous engageons à protéger vos informations personnelles. La présente Politique de confidentialité explique comment nous collectons, utilisons, divulguons et protégeons vos informations lorsque vous utilisez la plateforme de données produit de Descrybe et les services associés (collectivement, les \"Services\").", - "legal.privacy.intro.p2": "En accédant à nos Services ou en les utilisant, vous acceptez les pratiques décrites dans la présente Politique de confidentialité. Si vous n'êtes pas d'accord avec les politiques et pratiques décrites ici, veuillez ne pas utiliser nos Services.", + "legal.privacy.intro.p1": "Chez Descrybe (\"nous\", \"notre\" ou \"nos\"), nous respectons votre vie privée et nous engageons à protéger vos informations personnelles. La présente Politique de confidentialité explique comment nous collectons, utilisons, divulguons et protégeons vos informations lorsque vous utilisez la plateforme de données produit de Descrybe et les services associés (collectivement, les \"Services\").", + "legal.privacy.intro.p2": "En accédant à nos Services ou en les utilisant, vous acceptez les pratiques décrites dans la présente Politique de confidentialité. Si vous n'êtes pas d'accord avec les politiques et pratiques décrites ici, veuillez ne pas utiliser nos Services.", "legal.privacy.collect.h": "Informations que nous collectons", - "legal.privacy.collect.lead": "Nous collectons plusieurs types d'informations auprès des utilisateurs de nos Services et à leur sujet, notamment :", + "legal.privacy.collect.lead": "Nous collectons plusieurs types d'informations auprès des utilisateurs de nos Services et à leur sujet, notamment :", "legal.privacy.collect.personal.h": "Informations personnelles", - "legal.privacy.collect.personal.p": "Lorsque vous créez un compte, nous collectons des informations pouvant servir à vous identifier, telles que votre nom, adresse e-mail, numéro de téléphone, nom d'entreprise et informations de facturation. Nous collectons ces informations directement auprès de vous lorsque vous nous les fournissez.", - "legal.privacy.collect.userData.h": "Données utilisateur", - "legal.privacy.collect.userData.p": "Pour fournir nos Services, nous collectons et traitons des données produit, des flux fournisseurs, des descriptions de produits et tout autre contenu que vous téléversez, saisissez ou soumettez autrement sur notre plateforme. Cela peut inclure des attributs produit, des structures de taxonomie, des modèles et d'autres données nécessaires au fonctionnement de nos Services.", + "legal.privacy.collect.personal.p": "Lorsque vous créez un compte, nous collectons des informations pouvant servir à vous identifier, telles que votre nom, adresse e-mail, numéro de téléphone, nom d'entreprise et informations de facturation. Nous collectons ces informations directement auprès de vous lorsque vous nous les fournissez.", + "legal.privacy.collect.userData.h": "Données utilisateur", + "legal.privacy.collect.userData.p": "Pour fournir nos Services, nous collectons et traitons des données produit, des flux fournisseurs, des descriptions de produits et tout autre contenu que vous téléversez, saisissez ou soumettez autrement sur notre plateforme. Cela peut inclure des attributs produit, des structures de taxonomie, des modèles et d'autres données nécessaires au fonctionnement de nos Services.", "legal.privacy.collect.usage.h": "Informations d'utilisation", - "legal.privacy.collect.usage.p": "Nous collectons automatiquement certaines informations sur votre appareil et sur la façon dont vous interagissez avec nos Services, notamment l'adresse IP, le type d'appareil, le type de navigateur, le système d'exploitation, les heures d'accès, les pages consultées, les fonctionnalités utilisées et toute autre activité système. Nous utilisons ces informations pour améliorer nos Services et l'expérience utilisateur.", + "legal.privacy.collect.usage.p": "Nous collectons automatiquement certaines informations sur votre appareil et sur la façon dont vous interagissez avec nos Services, notamment l'adresse IP, le type d'appareil, le type de navigateur, le système d'exploitation, les heures d'accès, les pages consultées, les fonctionnalités utilisées et toute autre activité système. Nous utilisons ces informations pour améliorer nos Services et l'expérience utilisateur.", "legal.privacy.collect.cookies.h": "Cookies et technologies de suivi", - "legal.privacy.collect.cookies.p": "Nous utilisons des cookies, des balises web et des technologies de suivi similaires pour collecter des informations sur vos activités de navigation sur notre site. Vous pouvez contrôler les cookies via les paramètres de votre navigateur et d'autres outils. Toutefois, si vous bloquez certains cookies, vous pourriez ne pas pouvoir utiliser toutes les fonctionnalités de nos Services.", + "legal.privacy.collect.cookies.p": "Nous utilisons des cookies, des balises web et des technologies de suivi similaires pour collecter des informations sur vos activités de navigation sur notre site. Vous pouvez contrôler les cookies via les paramètres de votre navigateur et d'autres outils. Toutefois, si vous bloquez certains cookies, vous pourriez ne pas pouvoir utiliser toutes les fonctionnalités de nos Services.", "legal.privacy.use.h": "Comment nous utilisons vos informations", - "legal.privacy.use.lead": "Nous utilisons les informations collectées à diverses fins, notamment pour :", - "legal.privacy.use.li1": "Fournir, maintenir et améliorer nos Services", - "legal.privacy.use.li2": "Traiter les transactions et envoyer les informations associées, y compris confirmations, factures et notifications de service", - "legal.privacy.use.li3": "Développer de nouveaux produits, services, fonctionnalités et capacités", - "legal.privacy.use.li4": "Personnaliser votre expérience et proposer du contenu et des fonctionnalités pertinents pour vos intérêts", - "legal.privacy.use.li5": "Répondre à vos demandes, commentaires et questions", - "legal.privacy.use.li6": "Vous envoyer des avis techniques, des mises à jour, des alertes de sécurité ainsi que des messages d'assistance et d'administration", - "legal.privacy.use.li7": "Surveiller et analyser les tendances, l'utilisation et les activités liées à nos Services", - "legal.privacy.use.li8": "Détecter, enquêter et prévenir les transactions frauduleuses et autres activités illégales", - "legal.privacy.use.li9": "Protéger nos droits, notre propriété et notre sécurité, ainsi que les droits, la propriété et la sécurité de nos utilisateurs ou de tiers", - "legal.privacy.use.li10": "Respecter les obligations légales et faire appliquer nos conditions d'utilisation", + "legal.privacy.use.lead": "Nous utilisons les informations collectées à diverses fins, notamment pour :", + "legal.privacy.use.li1": "Fournir, maintenir et améliorer nos Services", + "legal.privacy.use.li2": "Traiter les transactions et envoyer les informations associées, y compris confirmations, factures et notifications de service", + "legal.privacy.use.li3": "Développer de nouveaux produits, services, fonctionnalités et capacités", + "legal.privacy.use.li4": "Personnaliser votre expérience et proposer du contenu et des fonctionnalités pertinents pour vos intérêts", + "legal.privacy.use.li5": "Répondre à vos demandes, commentaires et questions", + "legal.privacy.use.li6": "Vous envoyer des avis techniques, des mises à jour, des alertes de sécurité ainsi que des messages d'assistance et d'administration", + "legal.privacy.use.li7": "Surveiller et analyser les tendances, l'utilisation et les activités liées à nos Services", + "legal.privacy.use.li8": "Détecter, enquêter et prévenir les transactions frauduleuses et autres activités illégales", + "legal.privacy.use.li9": "Protéger nos droits, notre propriété et notre sécurité, ainsi que les droits, la propriété et la sécurité de nos utilisateurs ou de tiers", + "legal.privacy.use.li10": "Respecter les obligations légales et faire appliquer nos conditions d'utilisation", "legal.privacy.ai.h": "IA et apprentissage automatique", - "legal.privacy.ai.p1": "Nos Services utilisent des technologies d'intelligence artificielle et d'apprentissage automatique pour traiter les données produit, générer du contenu et fournir d'autres fonctionnalités automatisées. Les données que vous fournissez à nos Services peuvent être utilisées pour entraîner et améliorer nos modèles d'IA. Nous mettons toutefois en œuvre des garanties appropriées pour protéger vos données et préserver leur confidentialité.", - "legal.privacy.ai.p2": "Nous n'utilisons pas d'informations personnellement identifiables pour entraîner nos modèles d'IA généraux sans votre consentement explicite. Les données produit utilisées pour l'entraînement de l'IA sont anonymisées et agrégées dans la mesure du possible.", + "legal.privacy.ai.p1": "Nos Services utilisent des technologies d'intelligence artificielle et d'apprentissage automatique pour traiter les données produit, générer du contenu et fournir d'autres fonctionnalités automatisées. Les données que vous fournissez à nos Services peuvent être utilisées pour entraîner et améliorer nos modèles d'IA. Nous mettons toutefois en Å“uvre des garanties appropriées pour protéger vos données et préserver leur confidentialité.", + "legal.privacy.ai.p2": "Nous n'utilisons pas d'informations personnellement identifiables pour entraîner nos modèles d'IA généraux sans votre consentement explicite. Les données produit utilisées pour l'entraînement de l'IA sont anonymisées et agrégées dans la mesure du possible.", "legal.privacy.share.h": "Comment nous partageons vos informations", "legal.privacy.share.lead": "Nous pouvons partager vos informations dans les circonstances suivantes :", "legal.privacy.share.providers.h": "Prestataires de services", - "legal.privacy.share.providers.p": "Nous pouvons partager vos informations avec des fournisseurs tiers, prestataires de services, sous-traitants ou agents qui exécutent des services pour notre compte, tels que le traitement des paiements, l'analyse de données, l'envoi d'e-mails, l'hébergement, le support client et l'assistance marketing.", + "legal.privacy.share.providers.p": "Nous pouvons partager vos informations avec des fournisseurs tiers, prestataires de services, sous-traitants ou agents qui exécutent des services pour notre compte, tels que le traitement des paiements, l'analyse de données, l'envoi d'e-mails, l'hébergement, le support client et l'assistance marketing.", "legal.privacy.share.transfers.h": "Transferts d'entreprise", - "legal.privacy.share.transfers.p": "Si nous participons à une fusion, une acquisition, un financement, une réorganisation, une faillite ou une cession d'actifs de l'entreprise, vos informations peuvent être transférées dans le cadre de cette opération. Nous vous informerons de tout changement de ce type concernant la propriété ou le contrôle de vos informations personnelles.", - "legal.privacy.share.legal.h": "Exigences légales", - "legal.privacy.share.legal.p": "Nous pouvons divulguer vos informations si la loi l'exige ou en réponse à des demandes valides d'autorités publiques (p. ex. un tribunal ou un organisme gouvernemental). Nous pouvons également divulguer vos informations pour faire appliquer nos conditions d'utilisation, protéger nos droits, notre vie privée, notre sécurité ou notre propriété, et/ou ceux de nos affiliés, utilisateurs ou de tiers.", + "legal.privacy.share.transfers.p": "Si nous participons à une fusion, une acquisition, un financement, une réorganisation, une faillite ou une cession d'actifs de l'entreprise, vos informations peuvent être transférées dans le cadre de cette opération. Nous vous informerons de tout changement de ce type concernant la propriété ou le contrôle de vos informations personnelles.", + "legal.privacy.share.legal.h": "Exigences légales", + "legal.privacy.share.legal.p": "Nous pouvons divulguer vos informations si la loi l'exige ou en réponse à des demandes valides d'autorités publiques (p. ex. un tribunal ou un organisme gouvernemental). Nous pouvons également divulguer vos informations pour faire appliquer nos conditions d'utilisation, protéger nos droits, notre vie privée, notre sécurité ou notre propriété, et/ou ceux de nos affiliés, utilisateurs ou de tiers.", "legal.privacy.share.consent.h": "Avec votre consentement", - "legal.privacy.share.consent.p": "Nous pouvons partager vos informations avec des tiers lorsque vous nous avez donné votre consentement à cet effet.", - "legal.privacy.security.h": "Sécurité des données", - "legal.privacy.security.p1": "Nous avons mis en œuvre des mesures techniques et organisationnelles appropriées destinées à protéger vos informations personnelles contre la perte accidentelle et contre l'accès, l'utilisation, l'altération et la divulgation non autorisés. Toutes les informations que vous nous fournissez sont stockées sur des serveurs sécurisés derrière des pare-feu.", - "legal.privacy.security.p2": "La sécurité de vos informations dépend également de vous. Lorsque nous vous avons fourni (ou que vous avez choisi) un mot de passe pour accéder à certaines parties de nos Services, vous êtes responsable du maintien de la confidentialité de ce mot de passe. Nous vous demandons de ne partager votre mot de passe avec personne.", - "legal.privacy.security.p3": "Malheureusement, la transmission d'informations via Internet n'est pas totalement sécurisée. Bien que nous fassions de notre mieux pour protéger vos informations personnelles, nous ne pouvons garantir la sécurité des informations personnelles transmises à nos Services. Toute transmission d'informations personnelles s'effectue à vos propres risques.", + "legal.privacy.share.consent.p": "Nous pouvons partager vos informations avec des tiers lorsque vous nous avez donné votre consentement à cet effet.", + "legal.privacy.security.h": "Sécurité des données", + "legal.privacy.security.p1": "Nous avons mis en Å“uvre des mesures techniques et organisationnelles appropriées destinées à protéger vos informations personnelles contre la perte accidentelle et contre l'accès, l'utilisation, l'altération et la divulgation non autorisés. Toutes les informations que vous nous fournissez sont stockées sur des serveurs sécurisés derrière des pare-feu.", + "legal.privacy.security.p2": "La sécurité de vos informations dépend également de vous. Lorsque nous vous avons fourni (ou que vous avez choisi) un mot de passe pour accéder à certaines parties de nos Services, vous êtes responsable du maintien de la confidentialité de ce mot de passe. Nous vous demandons de ne partager votre mot de passe avec personne.", + "legal.privacy.security.p3": "Malheureusement, la transmission d'informations via Internet n'est pas totalement sécurisée. Bien que nous fassions de notre mieux pour protéger vos informations personnelles, nous ne pouvons garantir la sécurité des informations personnelles transmises à nos Services. Toute transmission d'informations personnelles s'effectue à vos propres risques.", "legal.privacy.rights.h": "Vos droits et choix", - "legal.privacy.rights.lead": "Nous nous efforçons de vous offrir des choix concernant les informations personnelles que vous nous fournissez. Selon votre localisation, vous pouvez disposer de certains droits relatifs à vos informations personnelles, notamment :", - "legal.privacy.rights.li1": "Accéder à vos informations personnelles et les mettre à jour", + "legal.privacy.rights.lead": "Nous nous efforçons de vous offrir des choix concernant les informations personnelles que vous nous fournissez. Selon votre localisation, vous pouvez disposer de certains droits relatifs à vos informations personnelles, notamment :", + "legal.privacy.rights.li1": "Accéder à vos informations personnelles et les mettre à jour", "legal.privacy.rights.li2": "Demander la suppression de vos informations personnelles", "legal.privacy.rights.li3": "Vous opposer au traitement de vos informations personnelles ou le restreindre", - "legal.privacy.rights.li4": "La portabilité des données", - "legal.privacy.rights.li5": "Retirer votre consentement (le cas échéant)", - "legal.privacy.rights.footer": "Pour exercer vos droits, veuillez nous contacter à l'aide des coordonnées figurant à la fin de la présente Politique de confidentialité. Notez que certains de ces droits peuvent être limités ou non applicables selon votre localisation et les circonstances particulières.", - "legal.privacy.retention.h": "Conservation des données", - "legal.privacy.retention.p1": "Nous conserverons vos informations personnelles aussi longtemps que nécessaire pour atteindre les finalités décrites dans la présente Politique de confidentialité, sauf si une durée de conservation plus longue est exigée ou autorisée par la loi. Pour déterminer la durée de conservation, nous prenons en compte la quantité, la nature et la sensibilité des informations, le risque potentiel de préjudice en cas d'utilisation ou de divulgation non autorisée, les finalités du traitement et les exigences légales applicables.", - "legal.privacy.retention.p2": "Nous pouvons conserver certaines informations après la fermeture de votre compte, notamment pour respecter nos obligations légales, résoudre des litiges et faire appliquer nos accords.", - "legal.privacy.intl.h": "Transferts internationaux de données", - "legal.privacy.intl.p1": "Vos informations personnelles peuvent être transférées et traitées dans des pays autres que celui dans lequel vous résidez. Ces pays peuvent disposer de lois sur la protection des données différentes de celles de votre pays.", - "legal.privacy.intl.p2": "Si nous transférons vos informations personnelles vers des pays situés hors de l'Espace économique européen ou d'autres régions disposant de lois complètes sur la protection des données, nous veillerons à ce que des garanties appropriées soient en place pour protéger vos informations personnelles et à ce que le transfert soit conforme à la réglementation applicable en matière de protection des données.", - "legal.privacy.children.h": "Confidentialité des mineurs", - "legal.privacy.children.p": "Nos Services ne sont pas destinés aux personnes de moins de 16 ans, et nous ne collectons pas sciemment d'informations personnelles auprès de mineurs de moins de 16 ans. Si nous apprenons que nous avons collecté ou reçu des informations personnelles d'un mineur de moins de 16 ans sans vérification du consentement parental, nous supprimerons ces informations. Si vous pensez que nous pourrions détenir des informations provenant d'un mineur de moins de 16 ans ou le concernant, veuillez nous contacter.", - "legal.privacy.changes.h": "Modifications de notre Politique de confidentialité", - "legal.privacy.changes.p1": "Nous pouvons mettre à jour notre Politique de confidentialité de temps à autre. Si nous apportons des modifications substantielles à la manière dont nous traitons les informations personnelles des utilisateurs, nous vous en informerons par e-mail à l'adresse indiquée dans votre compte et/ou via un avis sur notre site web.", - "legal.privacy.changes.p2": "La date de la dernière révision de la Politique de confidentialité figure en haut de la page. Il vous incombe de vous assurer que nous disposons d'une adresse e-mail à jour, active et joignable, et de consulter périodiquement notre site web et la présente Politique de confidentialité pour vérifier s'il y a des modifications.", + "legal.privacy.rights.li4": "La portabilité des données", + "legal.privacy.rights.li5": "Retirer votre consentement (le cas échéant)", + "legal.privacy.rights.footer": "Pour exercer vos droits, veuillez nous contacter à l'aide des coordonnées figurant à la fin de la présente Politique de confidentialité. Notez que certains de ces droits peuvent être limités ou non applicables selon votre localisation et les circonstances particulières.", + "legal.privacy.retention.h": "Conservation des données", + "legal.privacy.retention.p1": "Nous conserverons vos informations personnelles aussi longtemps que nécessaire pour atteindre les finalités décrites dans la présente Politique de confidentialité, sauf si une durée de conservation plus longue est exigée ou autorisée par la loi. Pour déterminer la durée de conservation, nous prenons en compte la quantité, la nature et la sensibilité des informations, le risque potentiel de préjudice en cas d'utilisation ou de divulgation non autorisée, les finalités du traitement et les exigences légales applicables.", + "legal.privacy.retention.p2": "Nous pouvons conserver certaines informations après la fermeture de votre compte, notamment pour respecter nos obligations légales, résoudre des litiges et faire appliquer nos accords.", + "legal.privacy.intl.h": "Transferts internationaux de données", + "legal.privacy.intl.p1": "Vos informations personnelles peuvent être transférées et traitées dans des pays autres que celui dans lequel vous résidez. Ces pays peuvent disposer de lois sur la protection des données différentes de celles de votre pays.", + "legal.privacy.intl.p2": "Si nous transférons vos informations personnelles vers des pays situés hors de l'Espace économique européen ou d'autres régions disposant de lois complètes sur la protection des données, nous veillerons à ce que des garanties appropriées soient en place pour protéger vos informations personnelles et à ce que le transfert soit conforme à la réglementation applicable en matière de protection des données.", + "legal.privacy.children.h": "Confidentialité des mineurs", + "legal.privacy.children.p": "Nos Services ne sont pas destinés aux personnes de moins de 16 ans, et nous ne collectons pas sciemment d'informations personnelles auprès de mineurs de moins de 16 ans. Si nous apprenons que nous avons collecté ou reçu des informations personnelles d'un mineur de moins de 16 ans sans vérification du consentement parental, nous supprimerons ces informations. Si vous pensez que nous pourrions détenir des informations provenant d'un mineur de moins de 16 ans ou le concernant, veuillez nous contacter.", + "legal.privacy.changes.h": "Modifications de notre Politique de confidentialité", + "legal.privacy.changes.p1": "Nous pouvons mettre à jour notre Politique de confidentialité de temps à autre. Si nous apportons des modifications substantielles à la manière dont nous traitons les informations personnelles des utilisateurs, nous vous en informerons par e-mail à l'adresse indiquée dans votre compte et/ou via un avis sur notre site web.", + "legal.privacy.changes.p2": "La date de la dernière révision de la Politique de confidentialité figure en haut de la page. Il vous incombe de vous assurer que nous disposons d'une adresse e-mail à jour, active et joignable, et de consulter périodiquement notre site web et la présente Politique de confidentialité pour vérifier s'il y a des modifications.", "legal.privacy.contact.h": "Contact", - "legal.privacy.contact.lead": "Si vous avez des questions ou des préoccupations concernant notre Politique de confidentialité ou nos pratiques en matière de données, veuillez nous contacter à :", + "legal.privacy.contact.lead": "Si vous avez des questions ou des préoccupations concernant notre Politique de confidentialité ou nos pratiques en matière de données, veuillez nous contacter à :", "legal.terms.title": "Conditions d'utilisation", "legal.terms.s1.h": "1. Acceptation des conditions", - "legal.terms.s1.p": "En accédant à la plateforme de données produit de Descrybe et aux services associés (collectivement, les \"Services\") ou en les utilisant, vous acceptez d'être lié par les présentes Conditions d'utilisation et par toutes les lois et réglementations applicables. Si vous n'êtes pas d'accord avec l'une quelconque de ces conditions, il vous est interdit d'utiliser ou d'accéder aux Services.", + "legal.terms.s1.p": "En accédant à la plateforme de données produit de Descrybe et aux services associés (collectivement, les \"Services\") ou en les utilisant, vous acceptez d'être lié par les présentes Conditions d'utilisation et par toutes les lois et réglementations applicables. Si vous n'êtes pas d'accord avec l'une quelconque de ces conditions, il vous est interdit d'utiliser ou d'accéder aux Services.", "legal.terms.s2.h": "2. Licence d'utilisation", - "legal.terms.s2.p1": "Sous réserve du respect des présentes Conditions d'utilisation, Descrybe vous accorde une licence limitée, non exclusive, non transférable et révocable pour accéder aux Services et les utiliser à des fins professionnelles.", + "legal.terms.s2.p1": "Sous réserve du respect des présentes Conditions d'utilisation, Descrybe vous accorde une licence limitée, non exclusive, non transférable et révocable pour accéder aux Services et les utiliser à des fins professionnelles.", "legal.terms.s2.lead": "Cette licence n'inclut pas :", "legal.terms.s2.li1": "La modification ou la copie des Services ou de tout contenu qu'ils contiennent", - "legal.terms.s2.li2": "L'utilisation des Services à toute fin commerciale autre que l'usage professionnel autorisé", - "legal.terms.s2.li3": "La tentative de décompilation ou d'ingénierie inverse de tout logiciel contenu dans les Services", - "legal.terms.s2.li4": "La suppression de tout avis de droits d'auteur ou de propriété des matériaux", - "legal.terms.s2.li5": "Le transfert des matériaux à une autre personne ou le \"miroir\" des matériaux sur tout autre serveur", - "legal.terms.s2.p2": "Cette licence prendra fin automatiquement si vous violez l'une quelconque de ces restrictions et pourra être résiliée par Descrybe à tout moment.", + "legal.terms.s2.li2": "L'utilisation des Services à toute fin commerciale autre que l'usage professionnel autorisé", + "legal.terms.s2.li3": "La tentative de décompilation ou d'ingénierie inverse de tout logiciel contenu dans les Services", + "legal.terms.s2.li4": "La suppression de tout avis de droits d'auteur ou de propriété des matériaux", + "legal.terms.s2.li5": "Le transfert des matériaux à une autre personne ou le \"miroir\" des matériaux sur tout autre serveur", + "legal.terms.s2.p2": "Cette licence prendra fin automatiquement si vous violez l'une quelconque de ces restrictions et pourra être résiliée par Descrybe à tout moment.", "legal.terms.s3.h": "3. Abonnement et paiement", - "legal.terms.s3.p1": "L'accès aux Services peut nécessiter un abonnement payant. Les conditions de paiement seront précisées lors du processus d'abonnement. Tous les paiements sont non remboursables, sauf indication écrite contraire de Descrybe.", - "legal.terms.s3.p2": "Descrybe se réserve le droit de modifier les tarifs d'abonnement moyennant un préavis raisonnable. L'utilisation continue des Services après une modification tarifaire constitue l'acceptation des nouveaux tarifs.", + "legal.terms.s3.p1": "L'accès aux Services peut nécessiter un abonnement payant. Les conditions de paiement seront précisées lors du processus d'abonnement. Tous les paiements sont non remboursables, sauf indication écrite contraire de Descrybe.", + "legal.terms.s3.p2": "Descrybe se réserve le droit de modifier les tarifs d'abonnement moyennant un préavis raisonnable. L'utilisation continue des Services après une modification tarifaire constitue l'acceptation des nouveaux tarifs.", "legal.terms.s4.h": "4. Contenu utilisateur", - "legal.terms.s4.p1": "Vous conservez tous les droits sur tout contenu que vous soumettez, publiez ou affichez sur ou via les Services (\"Contenu utilisateur\"). En fournissant du Contenu utilisateur à Descrybe, vous accordez à Descrybe une licence mondiale, non exclusive et libre de redevances pour utiliser, reproduire, modifier, adapter, publier, traduire et distribuer ce contenu dans le cadre de la fourniture des Services.", - "legal.terms.s4.lead": "Vous déclarez et garantissez que :", - "legal.terms.s4.li1": "Vous détenez ou contrôlez tous les droits sur le Contenu utilisateur que vous fournissez", - "legal.terms.s4.li2": "Le Contenu utilisateur ne viole pas les présentes Conditions d'utilisation", - "legal.terms.s4.li3": "Le Contenu utilisateur ne causera de préjudice à aucune personne ni entité", + "legal.terms.s4.p1": "Vous conservez tous les droits sur tout contenu que vous soumettez, publiez ou affichez sur ou via les Services (\"Contenu utilisateur\"). En fournissant du Contenu utilisateur à Descrybe, vous accordez à Descrybe une licence mondiale, non exclusive et libre de redevances pour utiliser, reproduire, modifier, adapter, publier, traduire et distribuer ce contenu dans le cadre de la fourniture des Services.", + "legal.terms.s4.lead": "Vous déclarez et garantissez que :", + "legal.terms.s4.li1": "Vous détenez ou contrôlez tous les droits sur le Contenu utilisateur que vous fournissez", + "legal.terms.s4.li2": "Le Contenu utilisateur ne viole pas les présentes Conditions d'utilisation", + "legal.terms.s4.li3": "Le Contenu utilisateur ne causera de préjudice à aucune personne ni entité", "legal.terms.s5.h": "5. Intelligence artificielle", - "legal.terms.s5.p1": "Les Services utilisent des technologies d'intelligence artificielle et d'apprentissage automatique. Vous reconnaissez que le contenu généré par IA peut ne pas être parfait et acceptez de relire tout contenu généré par IA avant de l'utiliser dans vos opérations commerciales.", - "legal.terms.s5.p2": "Descrybe peut utiliser du Contenu utilisateur anonymisé et agrégé pour entraîner et améliorer nos modèles d'IA, sous réserve de notre Politique de confidentialité. Vous pouvez refuser que vos données soient utilisées pour l'entraînement de l'IA en nous contactant.", - "legal.terms.s6.h": "6. Propriété intellectuelle", - "legal.terms.s6.p": "Les Services ainsi que leur contenu, leurs fonctionnalités et leurs capacités d'origine sont la propriété de Descrybe et sont protégés par les lois internationales sur le droit d'auteur, les marques, les brevets, les secrets commerciaux et autres droits de propriété intellectuelle ou de propriété.", + "legal.terms.s5.p1": "Les Services utilisent des technologies d'intelligence artificielle et d'apprentissage automatique. Vous reconnaissez que le contenu généré par IA peut ne pas être parfait et acceptez de relire tout contenu généré par IA avant de l'utiliser dans vos opérations commerciales.", + "legal.terms.s5.p2": "Descrybe peut utiliser du Contenu utilisateur anonymisé et agrégé pour entraîner et améliorer nos modèles d'IA, sous réserve de notre Politique de confidentialité. Vous pouvez refuser que vos données soient utilisées pour l'entraînement de l'IA en nous contactant.", + "legal.terms.s6.h": "6. Propriété intellectuelle", + "legal.terms.s6.p": "Les Services ainsi que leur contenu, leurs fonctionnalités et leurs capacités d'origine sont la propriété de Descrybe et sont protégés par les lois internationales sur le droit d'auteur, les marques, les brevets, les secrets commerciaux et autres droits de propriété intellectuelle ou de propriété.", "legal.terms.s7.h": "7. Exclusion de garanties", - "legal.terms.s7.p1": "Les Services sont fournis \"en l'état\" et \"selon disponibilité\". Descrybe n'émet aucune garantie, expresse ou implicite, et décline par les présentes toutes les garanties, y compris, sans limitation, les garanties implicites de qualité marchande, d'adéquation à un usage particulier, d'absence de contrefaçon ou de cours d'exécution.", - "legal.terms.s7.p2": "Descrybe ne garantit pas que les Services fonctionneront de manière ininterrompue, sécurisée ou disponible à un moment ou un lieu particulier, ni que les erreurs ou défauts seront corrigés.", - "legal.terms.s8.h": "8. Limitation de responsabilité", - "legal.terms.s8.lead": "En aucun cas Descrybe ne pourra être tenu responsable de dommages indirects, accessoires, spéciaux, consécutifs ou punitifs, y compris, sans limitation, la perte de bénéfices, de données, d'usage, de clientèle ou d'autres pertes intangibles, résultant de :", - "legal.terms.s8.li1": "Votre accès aux Services ou leur utilisation, ou l'impossibilité d'y accéder ou de les utiliser", + "legal.terms.s7.p1": "Les Services sont fournis \"en l'état\" et \"selon disponibilité\". Descrybe n'émet aucune garantie, expresse ou implicite, et décline par les présentes toutes les garanties, y compris, sans limitation, les garanties implicites de qualité marchande, d'adéquation à un usage particulier, d'absence de contrefaçon ou de cours d'exécution.", + "legal.terms.s7.p2": "Descrybe ne garantit pas que les Services fonctionneront de manière ininterrompue, sécurisée ou disponible à un moment ou un lieu particulier, ni que les erreurs ou défauts seront corrigés.", + "legal.terms.s8.h": "8. Limitation de responsabilité", + "legal.terms.s8.lead": "En aucun cas Descrybe ne pourra être tenu responsable de dommages indirects, accessoires, spéciaux, consécutifs ou punitifs, y compris, sans limitation, la perte de bénéfices, de données, d'usage, de clientèle ou d'autres pertes intangibles, résultant de :", + "legal.terms.s8.li1": "Votre accès aux Services ou leur utilisation, ou l'impossibilité d'y accéder ou de les utiliser", "legal.terms.s8.li2": "Toute conduite ou tout contenu de tiers sur les Services", - "legal.terms.s8.li3": "Tout contenu obtenu à partir des Services", - "legal.terms.s8.li4": "L'accès, l'utilisation ou l'altération non autorisés de vos transmissions ou de votre contenu", - "legal.terms.s9.h": "9. Résiliation", - "legal.terms.s9.p1": "Descrybe peut résilier ou suspendre votre accès aux Services immédiatement, sans préavis ni responsabilité, pour quelque motif que ce soit, y compris, sans limitation, si vous violez les présentes Conditions d'utilisation.", - "legal.terms.s9.p2": "En cas de résiliation, votre droit d'utiliser les Services cessera immédiatement. Si vous souhaitez résilier votre compte, vous pouvez simplement cesser d'utiliser les Services ou nous contacter pour demander la suppression du compte.", + "legal.terms.s8.li3": "Tout contenu obtenu à partir des Services", + "legal.terms.s8.li4": "L'accès, l'utilisation ou l'altération non autorisés de vos transmissions ou de votre contenu", + "legal.terms.s9.h": "9. Résiliation", + "legal.terms.s9.p1": "Descrybe peut résilier ou suspendre votre accès aux Services immédiatement, sans préavis ni responsabilité, pour quelque motif que ce soit, y compris, sans limitation, si vous violez les présentes Conditions d'utilisation.", + "legal.terms.s9.p2": "En cas de résiliation, votre droit d'utiliser les Services cessera immédiatement. Si vous souhaitez résilier votre compte, vous pouvez simplement cesser d'utiliser les Services ou nous contacter pour demander la suppression du compte.", "legal.terms.s10.h": "10. Droit applicable", - "legal.terms.s10.p": "Les présentes Conditions sont régies et interprétées conformément aux lois de la Slovénie, sans égard aux principes de conflit de lois.", + "legal.terms.s10.p": "Les présentes Conditions sont régies et interprétées conformément aux lois de la Slovénie, sans égard aux principes de conflit de lois.", "legal.terms.s11.h": "11. Modifications des conditions", - "legal.terms.s11.p": "Descrybe se réserve le droit de modifier ou de remplacer les présentes Conditions d'utilisation à tout moment. Il vous incombe de consulter périodiquement ces Conditions pour y déceler d'éventuelles modifications. L'utilisation continue des Services après la publication de toute modification constitue l'acceptation de ces modifications.", + "legal.terms.s11.p": "Descrybe se réserve le droit de modifier ou de remplacer les présentes Conditions d'utilisation à tout moment. Il vous incombe de consulter périodiquement ces Conditions pour y déceler d'éventuelles modifications. L'utilisation continue des Services après la publication de toute modification constitue l'acceptation de ces modifications.", "legal.terms.s12.h": "12. Contact", - "legal.terms.s12.lead": "Si vous avez des questions concernant les présentes Conditions d'utilisation, veuillez nous contacter à :", + "legal.terms.s12.lead": "Si vous avez des questions concernant les présentes Conditions d'utilisation, veuillez nous contacter à :", "plans.loadFailed": "Impossible de charger les plans", - "plans.loading": "Chargement des plans…", + "plans.loading": "Chargement des plans…", "plans.apiUnavailable": "L'API des plans n'est pas encore disponible sur ce backend. Affichage de la comparaison publique des tarifs.", "plans.title": "Choisissez votre plan", - "plans.sub.onPrefix": "Vous êtes sur", - "plans.sub.enterpriseSuffix": "— produits et IA illimités. Aucune mise à niveau en libre-service n'est nécessaire.", - "plans.sub.paygSuffix": "— paiement à l'usage. Comparez les plans publics ci-dessous, ou contactez les ventes pour Enterprise.", - "plans.sub.creditsMid": "avec {remaining} crédits IA restants.", - "plans.sub.creditsSuffix": "Passez de Starter → Growth → Business via Checkout, ou contactez les ventes pour Enterprise.", - "plans.sub.none": "Aucun plan n'est encore attribué (par exemple après une migration ignorée). Choisissez un plan ci-dessous — la capacité n'est pas Illimitée tant que Checkout ou un administrateur n'en a pas attribué un.", - "plans.stripeHint": "Les mises à niveau en libre-service utilisent Stripe Checkout.", - "plans.checkoutUnavailable": "Le paiement en libre-service est indisponible tant que Stripe n'est pas configuré. Contactez les ventes pour un forfait.", + "plans.sub.onPrefix": "Vous êtes sur", + "plans.sub.enterpriseSuffix": "— produits et IA illimités. Aucune mise à niveau en libre-service n'est nécessaire.", + "plans.sub.paygSuffix": "— paiement à l'usage. Comparez les plans publics ci-dessous, ou contactez les ventes pour Enterprise.", + "plans.sub.creditsMid": "avec {remaining} crédits IA restants.", + "plans.sub.creditsSuffix": "Passez de Starter → Growth → Business via Checkout, ou contactez les ventes pour Enterprise.", + "plans.sub.none": "Aucun plan n'est encore attribué (par exemple après une migration ignorée). Choisissez un plan ci-dessous — la capacité n'est pas Illimitée tant que Checkout ou un administrateur n'en a pas attribué un.", + "plans.stripeHint": "Les mises à niveau en libre-service utilisent Stripe Checkout.", + "plans.checkoutUnavailable": "Le paiement en libre-service est indisponible tant que Stripe n'est pas configuré. Contactez les ventes pour un forfait.", "plans.fallbackName": "Offre", - "plans.fallbackDescription": "Capacité pour votre catalogue", + "plans.fallbackDescription": "Capacité pour votre catalogue", "plans.badge.current": "Actuel", "plans.badge.popular": "Le plus populaire", "plans.price.custom": "Sur mesure", "plans.price.forever": "pour toujours", "plans.price.perMonth": "/mois", "plans.price.seePricing": "Voir les tarifs", - "plans.capacity.unlimitedSkus": "SKU illimités", - "plans.capacity.unlimitedAi": "Crédits IA illimités", - "plans.capacity.upToProducts": "Jusqu'à {count} produits", - "plans.capacity.creditsPerMonth": "{count} crédits IA / mois", - "plans.cta.requestUpgrade": "Demander une mise à niveau", + "plans.capacity.unlimitedSkus": "SKU illimités", + "plans.capacity.unlimitedAi": "Crédits IA illimités", + "plans.capacity.upToProducts": "Jusqu'à {count} produits", + "plans.capacity.creditsPerMonth": "{count} crédits IA / mois", + "plans.cta.requestUpgrade": "Demander une mise à niveau", "plans.cta.current": "Plan actuel", "plans.cta.contactSales": "Contacter les ventes", "plans.cta.switchInBilling": "Changer dans la facturation", - "plans.cta.upgradeTo": "Passer à {name}", - "plans.cta.startingCheckout": "Démarrage du checkout…", - "plans.planApplied": "Plan {plan} appliqué. Vos crédits sont prêts.", - "plans.faq.title": "Questions fréquentes", + "plans.cta.upgradeTo": "Passer à {name}", + "plans.cta.startingCheckout": "Démarrage du checkout…", + "plans.planApplied": "Plan {plan} appliqué. Vos crédits sont prêts.", + "plans.faq.title": "Questions fréquentes", "plans.faq.limit.q": "Que se passe-t-il si j'atteins une limite ?", - "plans.faq.limit.a": "Des bandeaux d'avertissement apparaissent d'abord. Lorsque vous n'avez plus de crédits IA ou que vous atteignez le plafond de SKU, les tâches nécessitant cette capacité sont bloquées jusqu'à ce que vous libériez de l'espace, attendiez le cycle suivant ou passiez à un plan supérieur.", - "plans.faq.selfServe.q": "Puis-je mettre à niveau moi-même ?", - "plans.faq.selfServe.a": "Les administrateurs de l'entreprise peuvent souscrire Starter, Growth et Business en libre-service via Checkout sur la carte du plan. Les membres doivent s'adresser à un administrateur — Checkout exige le rôle d'administrateur. Enterprise passe toujours par les ventes. Les administrateurs de plateforme peuvent toujours attribuer des plans dans Billing Admin.", + "plans.faq.limit.a": "Des bandeaux d'avertissement apparaissent d'abord. Lorsque vous n'avez plus de crédits IA ou que vous atteignez le plafond de SKU, les tâches nécessitant cette capacité sont bloquées jusqu'à ce que vous libériez de l'espace, attendiez le cycle suivant ou passiez à un plan supérieur.", + "plans.faq.selfServe.q": "Puis-je mettre à niveau moi-même ?", + "plans.faq.selfServe.a": "Les administrateurs de l'entreprise peuvent souscrire Starter, Growth et Business en libre-service via Checkout sur la carte du plan. Les membres doivent s'adresser à un administrateur — Checkout exige le rôle d'administrateur. Enterprise passe toujours par les ventes. Les administrateurs de plateforme peuvent toujours attribuer des plans dans Billing Admin.", "plans.faq.enterprise.q": "Enterprise et des millions de SKU", - "plans.faq.enterprise.a": "La capacité sur mesure, la clé IA apportée (BYOK), le SLA et la gestion de compte passent par les ventes. Réservez un créneau via Calendly — Enterprise n'est pas en libre-service à l'échelle de millions de SKU. L'application affiche Illimité pour la capacité SKU et IA.", - "plans.faq.pricing.q": "Où trouver les tarifs publics ?", + "plans.faq.enterprise.a": "La capacité sur mesure, la clé IA apportée (BYOK), le SLA et la gestion de compte passent par les ventes. Réservez un créneau via Calendly — Enterprise n'est pas en libre-service à l'échelle de millions de SKU. L'application affiche Illimité pour la capacité SKU et IA.", + "plans.faq.pricing.q": "Où trouver les tarifs publics ?", "plans.faq.pricing.aBefore": "Consultez la comparaison marketing sur la", "plans.faq.pricing.pricingPage": "page Tarifs", - "plans.faq.pricing.aMid": "— les CTA sont Commencer (inscription) ou Contacter les ventes. Gérez l'utilisation à tout moment dans", + "plans.faq.pricing.aMid": "— les CTA sont Commencer (inscription) ou Contacter les ventes. Gérez l'utilisation à tout moment dans", "plans.faq.pricing.aAfter": ".", "plans.custom.title": "Besoin d'un plan sur mesure ?", - "plans.custom.body": "La capacité Enterprise, la clé IA apportée et les SLA sont gérés avec notre équipe.", - "plans.custom.looking": "Vous cherchez les détails des plans publics ?", - "ai.title": "Intégrations IA", - "ai.description": "Choisissez les crédits de la plateforme ou votre propre clé, puis personnalisez les prompts avec des variables.", - "ai.crumb": "Intégrations IA", - "ai.adminOnly": "Seuls les administrateurs de l’entreprise peuvent modifier les paramètres IA. Vous pouvez consulter la configuration actuelle.", - "ai.badge.ownKey": "Votre propre clé", - "ai.badge.platform": "Crédits / clé de la plateforme", + "plans.custom.body": "La capacité Enterprise, la clé IA apportée et les SLA sont gérés avec notre équipe.", + "plans.custom.looking": "Vous cherchez les détails des plans publics ?", + "ai.title": "Intégrations IA", + "ai.description": "Choisissez les crédits de la plateforme ou votre propre clé, puis personnalisez les prompts avec des variables.", + "ai.crumb": "Intégrations IA", + "ai.adminOnly": "Seuls les administrateurs de l’entreprise peuvent modifier les paramètres IA. Vous pouvez consulter la configuration actuelle.", + "ai.badge.ownKey": "Votre propre clé", + "ai.badge.platform": "Crédits / clé de la plateforme", "ai.badge.active": "Actif : {label}", - "ai.badge.platformKeyAvailable": "Clé plateforme disponible", + "ai.badge.platformKeyAvailable": "Clé plateforme disponible", "ai.badge.lastTest": "Dernier test : {status}", "ai.providerMode.title": "Mode du fournisseur", - "ai.providerMode.desc": "La plateforme utilise les crédits Descrybe et notre clé. Populaire ou Personnalisé utilise votre clé compatible OpenAI (l’appel au fournisseur ne consomme pas de crédits plateforme ; les règles de crédits des fonctionnalités s’appliquent toujours).", - "ai.whoPays": "Qui paie le modèle ?", - "ai.mode.internal": "Plateforme (crédits / clé Descrybe)", - "ai.mode.popular": "Votre clé — fournisseur populaire", - "ai.mode.custom": "Votre clé — endpoint personnalisé", - "ai.useCompanyKey": "Utiliser cette clé d’entreprise pour le traitement, le SEO IA et les campagnes IA", + "ai.providerMode.desc": "La plateforme utilise les crédits Descrybe et notre clé. Populaire ou Personnalisé utilise votre clé compatible OpenAI (l’appel au fournisseur ne consomme pas de crédits plateforme ; les règles de crédits des fonctionnalités s’appliquent toujours).", + "ai.whoPays": "Qui paie le modèle ?", + "ai.mode.internal": "Plateforme (crédits / clé Descrybe)", + "ai.mode.popular": "Votre clé — fournisseur populaire", + "ai.mode.custom": "Votre clé — endpoint personnalisé", + "ai.useCompanyKey": "Utiliser cette clé d’entreprise pour le traitement, le SEO IA et les campagnes IA", "ai.popular.title": "Fournisseur populaire", "ai.popular.desc": "Endpoints compatibles OpenAI. Anthropic via OpenRouter.", "ai.field.provider": "Fournisseur", - "ai.field.model": "Modèle", - "ai.placeholder.modelId": "id du modèle", + "ai.field.model": "Modèle", + "ai.placeholder.modelId": "id du modèle", "ai.baseUrlLabel": "URL de base : {url}", - "ai.custom.title": "Endpoint personnalisé", - "ai.custom.desc": "Saisissez l’URL de base HTTPS de votre fournisseur d’IA.", + "ai.custom.title": "Endpoint personnalisé", + "ai.custom.desc": "Saisissez l’URL de base HTTPS de votre fournisseur d’IA.", "ai.field.baseUrl": "URL de base", - "ai.apiKey.title": "Clé API", - "ai.apiKey.desc": "Laissez vide pour conserver la clé existante. Les secrets bruts ne sont jamais renvoyés — uniquement un last4 masqué.", - "ai.storedKey": "Clé enregistrée : {masked}", - "ai.field.apiKey": "Clé API", - "ai.placeholder.keepKey": "•••• laissez vide pour conserver", - "ai.clearStoredKey": "Effacer la clé API enregistrée", + "ai.apiKey.title": "Clé API", + "ai.apiKey.desc": "Laissez vide pour conserver la clé existante. Les secrets bruts ne sont jamais renvoyés — uniquement un last4 masqué.", + "ai.storedKey": "Clé enregistrée : {masked}", + "ai.field.apiKey": "Clé API", + "ai.placeholder.keepKey": "•••• laissez vide pour conserver", + "ai.clearStoredKey": "Effacer la clé API enregistrée", "ai.saveProvider": "Enregistrer le fournisseur", "ai.testConnection": "Tester la connexion", - "ai.prompts.title": "Modèles de prompt", - "ai.prompts.descBefore": "Personnalisez les prompts système et utilisateur pour les textes produit, les méta SEO et les e-mails de campagne. Insérez des variables comme", - "ai.prompts.descMid": "— elles sont renseignées à l’exécution. La voix du kit de marque est disponible sous", + "ai.prompts.title": "Modèles de prompt", + "ai.prompts.descBefore": "Personnalisez les prompts système et utilisateur pour les textes produit, les méta SEO et les e-mails de campagne. Insérez des variables comme", + "ai.prompts.descMid": "— elles sont renseignées à l’exécution. La voix du kit de marque est disponible sous", "ai.prompts.descAfter": ".", - "ai.field.feature": "Fonctionnalité", - "ai.badge.custom": "Personnalisé", - "ai.badge.builtin": "Valeur par défaut intégrée", - "ai.badge.disabledDefault": "Désactivé → utilisation du défaut", - "ai.useCustomPrompt": "Utiliser ce prompt personnalisé (désactivé = défaut intégré)", - "ai.insertVariableInto": "Insérer la variable dans", - "ai.insert.system": "Système", + "ai.field.feature": "Fonctionnalité", + "ai.badge.custom": "Personnalisé", + "ai.badge.builtin": "Valeur par défaut intégrée", + "ai.badge.disabledDefault": "Désactivé → utilisation du défaut", + "ai.useCustomPrompt": "Utiliser ce prompt personnalisé (désactivé = défaut intégré)", + "ai.insertVariableInto": "Insérer la variable dans", + "ai.insert.system": "Système", "ai.insert.user": "Utilisateur", - "ai.field.systemPrompt": "Prompt système", + "ai.field.systemPrompt": "Prompt système", "ai.field.userPrompt": "Prompt utilisateur", "ai.savePrompts": "Enregistrer les prompts", - "ai.resetDefault": "Réinitialiser par défaut", + "ai.resetDefault": "Réinitialiser par défaut", "ai.editBrandVoice": "Modifier la voix de marque", - "ai.flash.loadFailed": "Échec du chargement des paramètres IA", - "ai.flash.usingPlatform": "Utilisation de l’IA de la plateforme (crédits / clé Descrybe lorsqu’ils sont configurés).", - "ai.flash.providerSaved": "Fournisseur IA enregistré. Les clés sont chiffrées et ne sont plus affichées.", + "ai.flash.loadFailed": "Échec du chargement des paramètres IA", + "ai.flash.usingPlatform": "Utilisation de l’IA de la plateforme (crédits / clé Descrybe lorsqu’ils sont configurés).", + "ai.flash.providerSaved": "Fournisseur IA enregistré. Les clés sont chiffrées et ne sont plus affichées.", "ai.flash.saveFailed": "Enregistrement impossible", - "ai.flash.savePromptsFailed": "Impossible d’enregistrer les prompts", - "ai.flash.resetFailed": "Impossible de réinitialiser le prompt", - "ai.flash.connectionFailed": "Échec de la connexion", - "ai.flash.testFailed": "Échec du test", - "ai.action.changeSettings": "modifier les paramètres du fournisseur IA", + "ai.flash.savePromptsFailed": "Impossible d’enregistrer les prompts", + "ai.flash.resetFailed": "Impossible de réinitialiser le prompt", + "ai.flash.connectionFailed": "Échec de la connexion", + "ai.flash.testFailed": "Échec du test", + "ai.action.changeSettings": "modifier les paramètres du fournisseur IA", "ai.action.changePrompts": "modifier les prompts IA", "ai.action.testProvider": "tester le fournisseur IA", - "email.title": "Envoi d’e-mails", - "email.description": "Resend ou SMTP pour les campagnes marketing. Secrets chiffrés au repos.", - "email.adminOnly": "Seuls les administrateurs de l’entreprise peuvent modifier les paramètres du fournisseur d’e-mail. Vous pouvez consulter la configuration actuelle.", - "email.crumb": "Intégration e-mail", - "email.dryRunForced": "Le mode dry-run est forcé ({reason}). Les plans Free et EMAIL_DRY_RUN n’envoient jamais de vrais envois massifs.", + "email.title": "Envoi d’e-mails", + "email.description": "Resend ou SMTP pour les campagnes marketing. Secrets chiffrés au repos.", + "email.adminOnly": "Seuls les administrateurs de l’entreprise peuvent modifier les paramètres du fournisseur d’e-mail. Vous pouvez consulter la configuration actuelle.", + "email.crumb": "Intégration e-mail", + "email.dryRunForced": "Le mode dry-run est forcé ({reason}). Les plans Free et EMAIL_DRY_RUN n’envoient jamais de vrais envois massifs.", "email.dryRunPolicy": "politique", - "email.badge.verified": "Vérifié", - "email.badge.notVerified": "Non vérifié", - "email.badge.canSendReal": "Envoi réel autorisé", - "email.badge.realBlocked": "Envoi réel bloqué", + "email.badge.verified": "Vérifié", + "email.badge.notVerified": "Non vérifié", + "email.badge.canSendReal": "Envoi réel autorisé", + "email.badge.realBlocked": "Envoi réel bloqué", "email.badge.lastTest": "Dernier test : {status}", "email.provider.title": "Fournisseur", - "email.provider.desc": "Configuration par entreprise. Le SMTP/Resend d’environnement de la plateforme sert de secours uniquement en cas de secrets manquants.", + "email.provider.desc": "Configuration par entreprise. Le SMTP/Resend d’environnement de la plateforme sert de secours uniquement en cas de secrets manquants.", "email.field.provider": "Fournisseur", "email.provider.resend": "Resend", "email.provider.smtp": "SMTP", - "email.field.fromEmail": "E-mail de l’expéditeur", + "email.field.fromEmail": "E-mail de l’expéditeur", "email.field.domain": "Domaine", "email.field.from": "De", - "email.field.fromName": "Nom de l’expéditeur", + "email.field.fromName": "Nom de l’expéditeur", "email.field.replyTo": "Reply-To", - "email.resendKeySaved": "Clé API Resend (enregistrée — laissez vide pour conserver)", - "email.resendKey": "Clé API Resend", - "email.field.smtpHost": "Hôte SMTP", + "email.resendKeySaved": "Clé API Resend (enregistrée — laissez vide pour conserver)", + "email.resendKey": "Clé API Resend", + "email.field.smtpHost": "Hôte SMTP", "email.field.port": "Port", - "email.field.username": "Nom d’utilisateur", - "email.field.passwordSaved": "Mot de passe (enregistré)", + "email.field.username": "Nom d’utilisateur", + "email.field.passwordSaved": "Mot de passe (enregistré)", "email.field.password": "Mot de passe", - "email.verifyDomain": "Vérifier le domaine", - "email.testGate.title": "Test et contrôle des envois", - "email.testGate.desc": "Les envois de test vérifient l’adresse de l’expéditeur. Les vrais envois massifs exigent de saisir “I understand”.", + "email.verifyDomain": "Vérifier le domaine", + "email.testGate.title": "Test et contrôle des envois", + "email.testGate.desc": "Les envois de test vérifient l’adresse de l’expéditeur. Les vrais envois massifs exigent de saisir “I understand”.", "email.field.recipient": "Destinataire", "email.sendTest": "Envoyer un test", - "email.confirmBlast": "Confirmer l’envoi massif…", - "email.flash.loadFailed": "Échec du chargement des paramètres e-mail", + "email.confirmBlast": "Confirmer l’envoi massif…", + "email.flash.loadFailed": "Échec du chargement des paramètres e-mail", "email.flash.saveFailed": "Enregistrement impossible", - "email.flash.verifyUpdated": "Vérification mise à jour.", - "email.flash.verifyFailed": "Échec de la vérification", - "email.flash.testFailed": "Échec de l’envoi de test", - "email.flash.blastDryRun": "Contrôle de livraison enregistré en mode dry-run — aucun e-mail n’a été envoyé.", - "email.flash.blastDone": "Contrôle de livraison terminé : {sent} envoyés, {failed} échoués.", - "email.flash.blastFailed": "Échec de l’envoi massif", - "email.blast.subject": "Contrôle de livraison e-mail Descrybe", - "email.blast.body": "Ceci est un contrôle de livraison à une seule adresse depuis Descrybe pour confirmer que votre intégration e-mail peut envoyer. Destinataire : {recipient}", - "email.action.changeSettings": "modifier les paramètres du fournisseur d’e-mail", - "email.action.verifyDomain": "vérifier le domaine e-mail", + "email.flash.verifyUpdated": "Vérification mise à jour.", + "email.flash.verifyFailed": "Échec de la vérification", + "email.flash.testFailed": "Échec de l’envoi de test", + "email.flash.blastDryRun": "Contrôle de livraison enregistré en mode dry-run — aucun e-mail n’a été envoyé.", + "email.flash.blastDone": "Contrôle de livraison terminé : {sent} envoyés, {failed} échoués.", + "email.flash.blastFailed": "Échec de l’envoi massif", + "email.blast.subject": "Contrôle de livraison e-mail Descrybe", + "email.blast.body": "Ceci est un contrôle de livraison à une seule adresse depuis Descrybe pour confirmer que votre intégration e-mail peut envoyer. Destinataire : {recipient}", + "email.action.changeSettings": "modifier les paramètres du fournisseur d’e-mail", + "email.action.verifyDomain": "vérifier le domaine e-mail", "email.action.sendTest": "envoyer un e-mail de test", "email.action.sendBlasts": "envoyer des campagnes e-mail", "seo.title": "Recommandations SEO", - "seo.description": "Scores de checklist pour les méta du catalogue, titres, images et mots-clés. Le remplissage par modèle est gratuit ; la réécriture IA est payante.", - "seo.upgradeTitle": "La réécriture IA est une fonctionnalité payante", - "seo.upgradeMessage": "Les plans Free peuvent encore corriger les méta manquantes avec des modèles basés sur des règles. Passez à un forfait supérieur ou ajoutez des crédits pour utiliser les réécritures IA.", + "seo.description": "Scores de checklist pour les méta du catalogue, titres, images et mots-clés. Le remplissage par modèle est gratuit ; la réécriture IA est payante.", + "seo.upgradeTitle": "La réécriture IA est une fonctionnalité payante", + "seo.upgradeMessage": "Les plans Free peuvent encore corriger les méta manquantes avec des modèles basés sur des règles. Passez à un forfait supérieur ou ajoutez des crédits pour utiliser les réécritures IA.", "seo.comparePlans": "Comparer les forfaits", "seo.openProducts": "Ouvrir les produits", "seo.overallScore": "Score SEO global", - "seo.overallScoreHint": "Moyenne des éléments de la checklist", - "seo.productsScanned": "Produits analysés", - "seo.productsScannedHint": "Produits traités dans l’entreprise", - "seo.categoriesScanned": "Catégories analysées", - "seo.categoriesScannedHint": "Y compris les contrôles de formules méta", - "seo.aiRewrite": "Réécriture IA", + "seo.overallScoreHint": "Moyenne des éléments de la checklist", + "seo.productsScanned": "Produits analysés", + "seo.productsScannedHint": "Produits traités dans l’entreprise", + "seo.categoriesScanned": "Catégories analysées", + "seo.categoriesScannedHint": "Y compris les contrôles de formules méta", + "seo.aiRewrite": "Réécriture IA", "seo.available": "Disponible", "seo.gated": "Restreint", - "seo.templateFree": "Le remplissage par modèle reste gratuit sur tous les forfaits", + "seo.templateFree": "Le remplissage par modèle reste gratuit sur tous les forfaits", "seo.checklist": "Checklist", - "seo.affectedFindings": "{affected} concernés · {count} constats", + "seo.affectedFindings": "{affected} concernés · {count} constats", "seo.fixable": "Corrigeable", "seo.clearFilter": "Effacer le filtre", "seo.findings": "Constats", - "seo.noFindings": "Aucun constat pour ce filtre — beau travail.", - "seo.col.issue": "Problème", - "seo.col.entity": "Entité", - "seo.col.severity": "Gravité", + "seo.noFindings": "Aucun constat pour ce filtre — beau travail.", + "seo.col.issue": "Problème", + "seo.col.entity": "Entité", + "seo.col.severity": "Gravité", "seo.col.actions": "Actions", - "seo.filling": "Remplissage…", - "seo.templateFill": "Remplissage par modèle", - "seo.aiTitleAllowed": "Réécrire avec l’IA (utilise des crédits)", - "seo.aiTitleGated": "Nécessite un forfait payant ou des crédits", - "seo.rewriting": "Réécriture…", - "seo.aiRewriteBtn": "Réécriture IA", + "seo.filling": "Remplissage…", + "seo.templateFill": "Remplissage par modèle", + "seo.aiTitleAllowed": "Réécrire avec l’IA (utilise des crédits)", + "seo.aiTitleGated": "Nécessite un forfait payant ou des crédits", + "seo.rewriting": "Réécriture…", + "seo.aiRewriteBtn": "Réécriture IA", "seo.viewProduct": "Voir le produit", - "seo.flash.loadFailed": "Échec du chargement des recommandations SEO", - "seo.flash.aiPaid": "La réécriture IA nécessite un forfait payant ou des crédits.", - "seo.flash.applyFailed": "Échec de l’application de la correction", + "seo.flash.loadFailed": "Échec du chargement des recommandations SEO", + "seo.flash.aiPaid": "La réécriture IA nécessite un forfait payant ou des crédits.", + "seo.flash.applyFailed": "Échec de l’application de la correction", "brand.title": "Kit de marque", - "brand.description": "Définissez la voix, les consignes et les couleurs pour que les titres et descriptions produit restent fidèles à la marque.", - "brand.loading": "Chargement du kit de marque…", - "brand.adminOnly": "Seuls les administrateurs de l’entreprise peuvent modifier le kit de marque. Vous pouvez consulter la voix, les couleurs et le logo actuels.", - "brand.aiApplyFreeAdmin": "Vous pouvez modifier votre kit de marque en Free. L’application IA (injection de la voix de marque dans les prompts d’amélioration) se débloque à partir de Starter.", - "brand.aiApplyGated": "L’application IA (injection de la voix de marque dans les prompts d’amélioration) se débloque à partir de Starter.", - "brand.aiEnhanceUses": "L’amélioration IA utilisera cette voix de marque lors du traitement des produits.", + "brand.description": "Définissez la voix, les consignes et les couleurs pour que les titres et descriptions produit restent fidèles à la marque.", + "brand.loading": "Chargement du kit de marque…", + "brand.adminOnly": "Seuls les administrateurs de l’entreprise peuvent modifier le kit de marque. Vous pouvez consulter la voix, les couleurs et le logo actuels.", + "brand.aiApplyFreeAdmin": "Vous pouvez modifier votre kit de marque en Free. L’application IA (injection de la voix de marque dans les prompts d’amélioration) se débloque à partir de Starter.", + "brand.aiApplyGated": "L’application IA (injection de la voix de marque dans les prompts d’amélioration) se débloque à partir de Starter.", + "brand.aiEnhanceUses": "L’amélioration IA utilisera cette voix de marque lors du traitement des produits.", "brand.comparePlans": "Comparer les forfaits", "brand.voice.title": "Voix et consignes", - "brand.voice.desc": "Ton, règles à faire / à éviter et formulations préférées", + "brand.voice.desc": "Ton, règles à faire / à éviter et formulations préférées", "brand.field.voiceTone": "Voix / ton", - "brand.placeholder.voiceTone": "ex. Assuré, concis, technique mais accessible", - "brand.field.dos": "À faire (une par ligne)", - "brand.placeholder.dos": "Commencez par le bénéfice principal\nGardez les titres sous 80 caractères", - "brand.field.donts": "À éviter (une par ligne)", - "brand.placeholder.donts": "Pas de MAJUSCULES\nÉvitez les superlatifs sans preuve", - "brand.field.preferredTerms": "Termes préférés (un par ligne ou séparés par des virgules)", - "brand.placeholder.preferredTerms": "sans fil, premium, classe énergétique", - "brand.visual.title": "Identité visuelle", - "brand.visual.desc": "Couleurs et logo utilisés dans les conseils et campagnes adaptés à la marque", + "brand.placeholder.voiceTone": "ex. Assuré, concis, technique mais accessible", + "brand.field.dos": "À faire (une par ligne)", + "brand.placeholder.dos": "Commencez par le bénéfice principal\nGardez les titres sous 80 caractères", + "brand.field.donts": "À éviter (une par ligne)", + "brand.placeholder.donts": "Pas de MAJUSCULES\nÉvitez les superlatifs sans preuve", + "brand.field.preferredTerms": "Termes préférés (un par ligne ou séparés par des virgules)", + "brand.placeholder.preferredTerms": "sans fil, premium, classe énergétique", + "brand.visual.title": "Identité visuelle", + "brand.visual.desc": "Couleurs et logo utilisés dans les conseils et campagnes adaptés à la marque", "brand.field.primaryColor": "Couleur primaire", "brand.field.secondaryColor": "Couleur secondaire", "brand.field.logoImage": "Image du logo", - "brand.logoHint": "PNG, JPEG ou WebP jusqu’à 2 MiB. Stocké dans les téléversements de votre entreprise.", - "brand.uploading": "Téléversement…", - "brand.uploadLogo": "Téléverser le logo", + "brand.logoHint": "PNG, JPEG ou WebP jusqu’à 2 MiB. Stocké dans les téléversements de votre entreprise.", + "brand.uploading": "Téléversement…", + "brand.uploadLogo": "Téléverser le logo", "brand.clear": "Effacer", "brand.field.logoUrl": "URL du logo", - "brand.placeholder.logoUrl": "https://… ou téléversé /api/brand/logo/files/…", - "brand.logoAlt": "Aperçu du logo de marque", - "brand.tipsTitle": "Conseils formule / aperçu", - "brand.saving": "Enregistrement…", + "brand.placeholder.logoUrl": "https://… ou téléversé /api/brand/logo/files/…", + "brand.logoAlt": "Aperçu du logo de marque", + "brand.tipsTitle": "Conseils formule / aperçu", + "brand.saving": "Enregistrement…", "brand.save": "Enregistrer le kit de marque", - "brand.flash.loadFailed": "Échec du chargement du kit de marque", - "structured.title": "Champs de description structurée", - "structured.loading": "Chargement des champs de description structurée…", + "brand.flash.loadFailed": "Échec du chargement du kit de marque", + "structured.title": "Champs de description structurée", + "structured.loading": "Chargement des champs de description structurée…", "structured.backDashboard": "Retour au tableau de bord", - "structured.categoryFormulas": "Formules de catégorie", - "structured.exportFeeds": "Flux d’export", - "structured.intro": "Ces champs sont créés automatiquement lorsque vous ajoutez des Export IDs aux sections de formule de description. Ils peuvent être utilisés dans vos flux d’export pour inclure des parties précises de vos descriptions produit.", + "structured.categoryFormulas": "Formules de catégorie", + "structured.exportFeeds": "Flux d’export", + "structured.intro": "Ces champs sont créés automatiquement lorsque vous ajoutez des Export IDs aux sections de formule de description. Ils peuvent être utilisés dans vos flux d’export pour inclure des parties précises de vos descriptions produit.", "structured.addField": "Ajouter un champ", - "structured.openCategories": "Ouvrir les catégories", - "structured.tableCaption": "Ces champs servent à structurer des parties des descriptions produit pour l’export.", - "structured.col.fieldKey": "Clé du champ", + "structured.openCategories": "Ouvrir les catégories", + "structured.tableCaption": "Ces champs servent à structurer des parties des descriptions produit pour l’export.", + "structured.col.fieldKey": "Clé du champ", "structured.col.type": "Type", - "structured.col.created": "Créé", + "structured.col.created": "Créé", "structured.col.actions": "Actions", - "structured.dialogTitle": "Ajouter un champ de description structurée", - "structured.fieldKeyLabel": "Clé du champ (obligatoire)", + "structured.dialogTitle": "Ajouter un champ de description structurée", + "structured.fieldKeyLabel": "Clé du champ (obligatoire)", "structured.fieldKeyPlaceholder": "ex. features, specifications", "structured.fieldTypeLabel": "Type de champ", "structured.type.text": "Texte", "structured.type.number": "Nombre", - "structured.type.boolean": "Booléen", + "structured.type.boolean": "Booléen", "structured.type.list": "Liste", "structured.adding": "Ajout...", - "structured.flash.loadFailed": "Échec du chargement des champs de description structurée", - "assistant.ariaLabel": "Assistant système", - "assistant.title": "Assistant système", - "assistant.subtitle": "Naviguez, guidez et exécutez les actions prises en charge", - "assistant.resetAria": "Réinitialiser la conversation", - "assistant.resetTitle": "Réinitialiser", - "assistant.closeAria": "Fermer l’assistant", + "structured.flash.loadFailed": "Échec du chargement des champs de description structurée", + "assistant.ariaLabel": "Assistant système", + "assistant.title": "Assistant système", + "assistant.subtitle": "Naviguez, guidez et exécutez les actions prises en charge", + "assistant.resetAria": "Réinitialiser la conversation", + "assistant.resetTitle": "Réinitialiser", + "assistant.closeAria": "Fermer l’assistant", "assistant.messageLabel": "Message", - "assistant.placeholder": "ex. ajouter une URL de flux, clés API, attributs, traitement…", + "assistant.placeholder": "ex. ajouter une URL de flux, clés API, attributs, traitement…", "assistant.sendAria": "Envoyer", - "site.bookDemo": "Réserver une démo", - "site.demoShort": "Démo", - "site.allRightsReserved": "Tous droits réservés.", + "site.bookDemo": "Réserver une démo", + "site.demoShort": "Démo", + "site.allRightsReserved": "Tous droits réservés.", "site.cookiePolicy": "Politique de cookies", - "site.cookieSettings": "Paramètres des cookies", + "site.cookieSettings": "Paramètres des cookies", "consent.title": "Cookies et analytique", - "consent.description": "Nous utilisons des cookies nécessaires pour faire fonctionner Descrybe. Les cookies optionnels d’analytique et de marketing nous aident à comprendre l’usage et mesurer les campagnes. Vous pouvez modifier votre choix à tout moment.", + "consent.description": "Nous utilisons des cookies nécessaires pour faire fonctionner Descrybe. Les cookies optionnels d’analytique et de marketing nous aident à comprendre l’usage et mesurer les campagnes. Vous pouvez modifier votre choix à tout moment.", "consent.acceptAll": "Tout accepter", "consent.rejectNonEssential": "Refuser les non essentiels", "consent.customize": "Personnaliser", - "consent.save": "Enregistrer les préférences", - "consent.necessary": "Nécessaires", - "consent.necessaryDesc": "Requis pour la connexion, la sécurité (CSRF), le thème, la langue et mémoriser ce choix.", + "consent.save": "Enregistrer les préférences", + "consent.necessary": "Nécessaires", + "consent.necessaryDesc": "Requis pour la connexion, la sécurité (CSRF), le thème, la langue et mémoriser ce choix.", "consent.alwaysOn": "Toujours actifs", "consent.analytics": "Analytique", - "consent.analyticsDesc": "Aide à comprendre l’usage du produit (Google Analytics via GTM).", + "consent.analyticsDesc": "Aide à comprendre l’usage du produit (Google Analytics via GTM).", "consent.marketing": "Marketing", - "consent.marketingDesc": "Pour la mesure publicitaire et la personnalisation lorsque des balises ads sont configurées dans GTM.", + "consent.marketingDesc": "Pour la mesure publicitaire et la personnalisation lorsque des balises ads sont configurées dans GTM.", "consent.policyLink": "Lire la Politique de cookies", "seo.cookies.title": "Politique de cookies | Descrybe", - "seo.cookies.description": "Comment Descrybe utilise les cookies nécessaires, analytiques et marketing, y compris GTM et GA4, et comment modifier votre consentement.", + "seo.cookies.description": "Comment Descrybe utilise les cookies nécessaires, analytiques et marketing, y compris GTM et GA4, et comment modifier votre consentement.", "legal.cookies.title": "Politique de cookies", - "legal.cookies.intro.h": "Aperçu", - "legal.cookies.intro.p1": "Cette Politique de cookies explique comment Descrybe utilise les cookies et technologies similaires sur le site et l’application. À lire avec notre Politique de confidentialité.", - "legal.cookies.intro.p2": "Lorsque requis, nous demandons votre consentement avant d’activer les cookies analytiques ou marketing. Les cookies nécessaires assurent le service de façon sécurisée et ne requièrent pas de consentement.", - "legal.cookies.types.h": "Catégories de cookies", - "legal.cookies.necessary.h": "Nécessaires", - "legal.cookies.necessary.p": "Ils maintiennent la session, protègent les formulaires (CSRF), stockent le thème et la langue, et mémorisent votre choix. Sans eux, le produit ne fonctionne pas correctement.", + "legal.cookies.intro.h": "Aperçu", + "legal.cookies.intro.p1": "Cette Politique de cookies explique comment Descrybe utilise les cookies et technologies similaires sur le site et l’application. À lire avec notre Politique de confidentialité.", + "legal.cookies.intro.p2": "Lorsque requis, nous demandons votre consentement avant d’activer les cookies analytiques ou marketing. Les cookies nécessaires assurent le service de façon sécurisée et ne requièrent pas de consentement.", + "legal.cookies.types.h": "Catégories de cookies", + "legal.cookies.necessary.h": "Nécessaires", + "legal.cookies.necessary.p": "Ils maintiennent la session, protègent les formulaires (CSRF), stockent le thème et la langue, et mémorisent votre choix. Sans eux, le produit ne fonctionne pas correctement.", "legal.cookies.analytics.h": "Analytique", - "legal.cookies.analytics.p": "Si vous autorisez l’analytique, nous chargeons des balises GTM pouvant déposer des cookies GA4 pour mesurer les pages et événements. Les événements sont bloqués tant que analytics_storage n’est pas accordé.", + "legal.cookies.analytics.p": "Si vous autorisez l’analytique, nous chargeons des balises GTM pouvant déposer des cookies GA4 pour mesurer les pages et événements. Les événements sont bloqués tant que analytics_storage n’est pas accordé.", "legal.cookies.marketing.h": "Marketing", - "legal.cookies.marketing.p": "Si vous autorisez le marketing, les balises publicitaires GTM peuvent utiliser le stockage publicitaire et signaux associés pour la mesure et la personnalisation.", + "legal.cookies.marketing.p": "Si vous autorisez le marketing, les balises publicitaires GTM peuvent utiliser le stockage publicitaire et signaux associés pour la mesure et la personnalisation.", "legal.cookies.gtm.h": "Google Tag Manager et GA4", - "legal.cookies.gtm.p": "Lorsqu’il est configuré, Descrybe charge un conteneur GTM. GA4 est configuré dans ce conteneur. Le Consent Mode v2 refuse par défaut le stockage analytique et publicitaire jusqu’à acceptation des catégories.", + "legal.cookies.gtm.p": "Lorsqu’il est configuré, Descrybe charge un conteneur GTM. GA4 est configuré dans ce conteneur. Le Consent Mode v2 refuse par défaut le stockage analytique et publicitaire jusqu’à acceptation des catégories.", "legal.cookies.third.h": "Tiers", - "legal.cookies.third.p": "Google (Tag Manager / Analytics) peut traiter des données techniques (URL, appareil/navigateur, noms d’événements) avec consentement. Nous n’envoyons pas volontairement mots de passe, clés API ou coordonnées dans les événements.", + "legal.cookies.third.p": "Google (Tag Manager / Analytics) peut traiter des données techniques (URL, appareil/navigateur, noms d’événements) avec consentement. Nous n’envoyons pas volontairement mots de passe, clés API ou coordonnées dans les événements.", "legal.cookies.manage.h": "Modifier votre consentement", - "legal.cookies.manage.p": "Utilisez Paramètres des cookies dans le pied de page (ou le bouton ci-dessous) pour rouvrir la bannière. Vous pouvez aussi effacer les données du site dans le navigateur.", - "site.privacyPolicy": "Politique de confidentialité", - "site.termsOfService": "Conditions d’utilisation", - "site.legalNav": "Mentions légales", + "legal.cookies.manage.p": "Utilisez Paramètres des cookies dans le pied de page (ou le bouton ci-dessous) pour rouvrir la bannière. Vous pouvez aussi effacer les données du site dans le navigateur.", + "site.privacyPolicy": "Politique de confidentialité", + "site.termsOfService": "Conditions d’utilisation", + "site.legalNav": "Mentions légales", "site.footer.aria": "Site", - "site.footer.description": "Descrybe transforme les flux fournisseurs en catalogues produits propres et prêts pour les canaux — mappez les champs, enrichissez attributs et textes, puis exportez ou synchronisez avec WooCommerce.", - "site.footer.rightsLine": "© {year} {name}. Tous droits réservés.", + "site.footer.description": "Descrybe transforme les flux fournisseurs en catalogues produits propres et prêts pour les canaux — mappez les champs, enrichissez attributs et textes, puis exportez ou synchronisez avec WooCommerce.", + "site.footer.rightsLine": "© {year} {name}. Tous droits réservés.", "site.footer.navTitle": "Navigation", "site.footer.platform": "Plateforme", "site.footer.solutions": "Solutions", "site.footer.contact": "Nous contacter", - "home.hero.tagline": "Données produit pour les équipes e-commerce", + "home.hero.tagline": "Données produit pour les équipes e-commerce", "home.hero.title": "Des flux fournisseurs aux fiches produit", - "home.hero.lead": "Connectez des flux fournisseurs, mappez-les à vos catégories, renseignez les attributs requis et rédigez titres et descriptions selon vos règles — puis exportez ou synchronisez avec votre boutique.", + "home.hero.lead": "Connectez des flux fournisseurs, mappez-les à vos catégories, renseignez les attributs requis et rédigez titres et descriptions selon vos règles — puis exportez ou synchronisez avec votre boutique.", "home.hero.learnMore": "En savoir plus", - "home.hero.apply": "Demander l’accès", + "home.hero.apply": "Demander l’accès", "home.hero.supportedBy": "Soutenu par", "home.hero.msAlt": "Microsoft for Startups", - "home.image.previewAlt": "Aperçu de la plateforme Descrybe : du flux à la fiche produit", + "home.image.previewAlt": "Aperçu de la plateforme Descrybe : du flux à la fiche produit", "home.how.title": "Voici comment Descrybe vous fait gagner du temps pour mettre les produits en vente", - "home.how.lead": "Importez une fois des données fournisseurs en désordre. Descrybe vous aide à les catégoriser, compléter les attributs, rédiger les fiches et envoyer des produits prêts vers vos canaux.", - "home.how.apply": "Demander l’accès", + "home.how.lead": "Importez une fois des données fournisseurs en désordre. Descrybe vous aide à les catégoriser, compléter les attributs, rédiger les fiches et envoyer des produits prêts vers vos canaux.", + "home.how.apply": "Demander l’accès", "home.how.step1.title": "Importez votre taxonomie", - "home.how.step1.desc": "Configurez les catégories et attributs déjà utilisés par votre boutique", - "home.how.step1.f1": "Définissez les attributs obligatoires par catégorie", - "home.how.step1.f2": "Définissez des formules de titre par catégorie", - "home.how.step1.f3": "Définissez des modèles de description et d’extrait de recherche", - "home.how.step2.title": "Importez les données fournisseurs", - "home.how.step2.desc": "Connectez une URL de flux ou téléversez un fichier produits", + "home.how.step1.desc": "Configurez les catégories et attributs déjà utilisés par votre boutique", + "home.how.step1.f1": "Définissez les attributs obligatoires par catégorie", + "home.how.step1.f2": "Définissez des formules de titre par catégorie", + "home.how.step1.f3": "Définissez des modèles de description et d’extrait de recherche", + "home.how.step2.title": "Importez les données fournisseurs", + "home.how.step2.desc": "Connectez une URL de flux ou téléversez un fichier produits", "home.how.step2.f1": "Importez depuis CSV, XML ou API", "home.how.step2.f2": "Planifiez des imports automatiques depuis vos fournisseurs", - "home.how.step2.f3": "Mappez les champs avec une interface simple en glisser-déposer", + "home.how.step2.f3": "Mappez les champs avec une interface simple en glisser-déposer", "home.how.step3.title": "Transformez et enrichissez", - "home.how.step3.desc": "Choisissez les produits à traiter et laissez Descrybe :", - "home.how.step3.f1": "Attribuer les bonnes catégories", - "home.how.step3.f2": "Compléter les attributs produit requis", - "home.how.step3.f3": "Créer des titres et descriptions clairs et adaptés à la recherche", + "home.how.step3.desc": "Choisissez les produits à traiter et laissez Descrybe :", + "home.how.step3.f1": "Attribuer les bonnes catégories", + "home.how.step3.f2": "Compléter les attributs produit requis", + "home.how.step3.f3": "Créer des titres et descriptions clairs et adaptés à la recherche", "home.how.step4.title": "Exportez vers les canaux", - "home.how.step4.desc": "Envoyez des données produit prêtes là où vous vendez", - "home.how.step4.f1": "Générez des flux produit spécifiques par canal", - "home.how.step4.f2": "Gardez le contrôle total des champs exportés", - "home.how.step4.f3": "Restez à jour quand les données fournisseurs changent", - "home.benefits.title": "Tout ce qu’il faut pour des données produit plus propres", - "home.benefits.lead": "De l’import de flux aux fiches prêtes pour le canal — sans reconstruire chaque fichier à la main.", - "home.benefits.shield.title": "Repérez tôt les fiches incomplètes", - "home.benefits.shield.desc": "Contrôlez les données selon les règles de catégorie pour corriger attributs manquants et textes faibles avant mise en ligne.", + "home.how.step4.desc": "Envoyez des données produit prêtes là où vous vendez", + "home.how.step4.f1": "Générez des flux produit spécifiques par canal", + "home.how.step4.f2": "Gardez le contrôle total des champs exportés", + "home.how.step4.f3": "Restez à jour quand les données fournisseurs changent", + "home.benefits.title": "Tout ce qu’il faut pour des données produit plus propres", + "home.benefits.lead": "De l’import de flux aux fiches prêtes pour le canal — sans reconstruire chaque fichier à la main.", + "home.benefits.shield.title": "Repérez tôt les fiches incomplètes", + "home.benefits.shield.desc": "Contrôlez les données selon les règles de catégorie pour corriger attributs manquants et textes faibles avant mise en ligne.", "home.benefits.chart.title": "Fiches plus claires, meilleure conversion", - "home.benefits.chart.desc": "Titres et descriptions qui mettent en avant ce qui compte pour l’acheteur — bénéfices, specs et termes de recherche de votre catalogue.", - "home.benefits.database.title": "Une structure produit cohérente", - "home.benefits.database.desc": "Gardez le même arbre de catégories et la même forme d’attributs sur les exports et canaux pour que les clients trouvent les produits de la même façon partout.", - "home.benefits.search.title": "Contenu produit adapté à la recherche", - "home.benefits.search.desc": "Rédigez titres, descriptions et meta snippets plus faciles à comprendre pour acheteurs et moteurs de recherche.", + "home.benefits.chart.desc": "Titres et descriptions qui mettent en avant ce qui compte pour l’acheteur — bénéfices, specs et termes de recherche de votre catalogue.", + "home.benefits.database.title": "Une structure produit cohérente", + "home.benefits.database.desc": "Gardez le même arbre de catégories et la même forme d’attributs sur les exports et canaux pour que les clients trouvent les produits de la même façon partout.", + "home.benefits.search.title": "Contenu produit adapté à la recherche", + "home.benefits.search.desc": "Rédigez titres, descriptions et meta snippets plus faciles à comprendre pour acheteurs et moteurs de recherche.", "home.benefits.cost.title": "Moins de saisie manuelle", - "home.benefits.cost.desc": "Automatisez mapping, remplissage d’attributs et textes pour que l’équipe se concentre sur le merchandising — pas le nettoyage de tableurs.", - "home.benefits.scale.title": "Prêt pour chaque canal de vente", - "home.benefits.scale.desc": "Adaptez flux d’export et sync WooCommerce aux formats attendus par chaque canal, sans reconstruire le catalogue à la main.", - "home.cta.titleLead": "Mettez les produits sur le marché ", + "home.benefits.cost.desc": "Automatisez mapping, remplissage d’attributs et textes pour que l’équipe se concentre sur le merchandising — pas le nettoyage de tableurs.", + "home.benefits.scale.title": "Prêt pour chaque canal de vente", + "home.benefits.scale.desc": "Adaptez flux d’export et sync WooCommerce aux formats attendus par chaque canal, sans reconstruire le catalogue à la main.", + "home.cta.titleLead": "Mettez les produits sur le marché ", "home.cta.titleHighlight": "plus vite", - "home.cta.description": "Arrêtez de reconstruire les données produit à chaque fichier fournisseur. Mappez une fois, enrichissez avec vos règles et publiez des fiches prêtes à vendre.", - "home.cta.f1": "Démo personnalisée", - "home.cta.f2": "Conseil d’experts", - "home.cta.f3": "Prochaines étapes claires", - "home.cta.apply": "Demander l’accès", + "home.cta.description": "Arrêtez de reconstruire les données produit à chaque fichier fournisseur. Mappez une fois, enrichissez avec vos règles et publiez des fiches prêtes à vendre.", + "home.cta.f1": "Démo personnalisée", + "home.cta.f2": "Conseil d’experts", + "home.cta.f3": "Prochaines étapes claires", + "home.cta.apply": "Demander l’accès", "home.cta.imageAlt": "Pages produit Descrybe", "home.product.eyebrow": "Ce que fait Descrybe", - "home.product.title": "Flux fournisseurs en entrée. Fiches prêtes en sortie — export, WooCommerce ou API.", - "home.product.description": "Descrybe aide les équipes e-commerce à transformer des flux CSV et XML fournisseurs en catalogues propres. Mappez vers vos catégories, enrichissez attributs et textes, puis livrez via exports, sync WooCommerce ou API publique.", + "home.product.title": "Flux fournisseurs en entrée. Fiches prêtes en sortie — export, WooCommerce ou API.", + "home.product.description": "Descrybe aide les équipes e-commerce à transformer des flux CSV et XML fournisseurs en catalogues propres. Mappez vers vos catégories, enrichissez attributs et textes, puis livrez via exports, sync WooCommerce ou API publique.", "home.product.pipelineAria": "Pipeline produit", "home.product.p1.label": "Flux entrants", "home.product.p1.detail": "CSV / XML depuis des URL fournisseurs", "home.product.p2.label": "Mapper", - "home.product.p2.detail": "Associez les colonnes à vos champs", + "home.product.p2.detail": "Associez les colonnes à vos champs", "home.product.p3.label": "Enrichir", - "home.product.p3.detail": "Catégories, attributs, titres", + "home.product.p3.detail": "Catégories, attributs, titres", "home.product.p4.label": "Livrer", - "home.product.p4.detail": "Export · Woo · API", - "pricing.section.badge": "Capacité SKU + crédits IA", + "home.product.p4.detail": "Export · Woo · API", + "pricing.section.badge": "Capacité SKU + crédits IA", "pricing.section.title": "Commencez gratuitement. Scalez quand le catalogue grandit.", - "pricing.section.lead": "Free inclut le mapping de flux, un nettoyage produit de base et les étiquettes énergétiques UE (EPREL) jusqu’à 100 SKU (sans crédits IA). Les offres payantes ajoutent titres et descriptions IA, plus de capacité et d’exports — Starter, Growth, Business, ou contactez les ventes pour Enterprise.", - "pricing.section.billingPeriod": "Période de facturation", + "pricing.section.lead": "Free inclut le mapping de flux, un nettoyage produit de base et les étiquettes énergétiques UE (EPREL) jusqu’à 100 SKU (sans crédits IA). Les offres payantes ajoutent titres et descriptions IA, plus de capacité et d’exports — Starter, Growth, Business, ou contactez les ventes pour Enterprise.", + "pricing.section.billingPeriod": "Période de facturation", "pricing.section.monthly": "Mensuel", "pricing.section.yearly": "Annuel", - "pricing.section.savePercent": "Économisez 20 %", - "pricing.section.publicBefore": "Offres publiques : Free, Starter, Growth, Business et Enterprise. Créez un compte Free, puis passez à un plan supérieur sous", + "pricing.section.savePercent": "Économisez 20 %", + "pricing.section.publicBefore": "Offres publiques : Free, Starter, Growth, Business et Enterprise. Créez un compte Free, puis passez à un plan supérieur sous", "pricing.section.publicOr": "ou", - "pricing.section.publicAfter": "via Stripe Checkout. Enterprise reste géré par les ventes.", + "pricing.section.publicAfter": "via Stripe Checkout. Enterprise reste géré par les ventes.", "pricing.section.plansLink": "Offres", "pricing.section.billingLink": "Facturation", - "pricing.section.capabilitiesTitle": "Ce pour quoi chaque offre est conçue", + "pricing.section.capabilitiesTitle": "Ce pour quoi chaque offre est conçue", "pricing.section.capabilitiesLead": "Importez des flux, enrichissez votre catalogue, puis exportez ou synchronisez avec WooCommerce", - "pricing.section.faqTitle": "Questions fréquentes", - "pricing.section.readyTitle": "Prêt à mapper votre premier flux ?", - "pricing.section.readyLead": "Créez un compte Free — sans carte. Déjà un compte ? Ouvrez l’app ou comparez les offres.", + "pricing.section.faqTitle": "Questions fréquentes", + "pricing.section.readyTitle": "Prêt à mapper votre premier flux ?", + "pricing.section.readyLead": "Créez un compte Free — sans carte. Déjà un compte ? Ouvrez l’app ou comparez les offres.", "pricing.section.contactSales": "Contacter les ventes", "pricing.cap.feeds": "Des flux au catalogue", "pricing.cap.feeds.f1": "Flux fournisseurs CSV / XML / URL", "pricing.cap.feeds.f2": "Mapping et validation des champs", "pricing.cap.feeds.f3": "Fusion multi-fournisseurs", - "pricing.cap.feeds.f4": "Sync planifiée", - "pricing.cap.feeds.f5": "Transformations selon la catégorie", + "pricing.cap.feeds.f4": "Sync planifiée", + "pricing.cap.feeds.f5": "Transformations selon la catégorie", "pricing.cap.processing": "Traitement et IA", - "pricing.cap.processing.f1": "Nettoyage des données et remplissage d’attributs (toutes offres)", + "pricing.cap.processing.f1": "Nettoyage des données et remplissage d’attributs (toutes offres)", "pricing.cap.processing.f2": "Titres et descriptions IA (payant)", - "pricing.cap.processing.f3": "Étiquettes énergétiques UE / EPREL (toutes offres)", + "pricing.cap.processing.f3": "Étiquettes énergétiques UE / EPREL (toutes offres)", "pricing.cap.processing.f4": "Formules, voix de marque, variables", - "pricing.cap.processing.f5": "Crédits gérés ou votre propre clé IA", + "pricing.cap.processing.f5": "Crédits gérés ou votre propre clé IA", "pricing.cap.export": "Export et canaux", - "pricing.cap.export.f1": "Flux d’export XML / CSV", + "pricing.cap.export.f1": "Flux d’export XML / CSV", "pricing.cap.export.f2": "Sync WooCommerce / Shopify", - "pricing.cap.export.f3": "API complète", - "pricing.cap.export.f4": "Formats spécifiques par canal", - "pricing.cap.export.f5": "Mises à jour en masse", - "pricing.cap.limits": "Limites et contrôle", + "pricing.cap.export.f3": "API complète", + "pricing.cap.export.f4": "Formats spécifiques par canal", + "pricing.cap.export.f5": "Mises à jour en masse", + "pricing.cap.limits": "Limites et contrôle", "pricing.cap.limits.f1": "Plafonds SKU (produits)", - "pricing.cap.limits.f2": "Packs mensuels de crédits IA", - "pricing.cap.limits.f3": "Rôles et invitations d’équipe", + "pricing.cap.limits.f2": "Packs mensuels de crédits IA", + "pricing.cap.limits.f3": "Rôles et invitations d’équipe", "pricing.cap.limits.f4": "Options SLA Enterprise", - "pricing.faq.credits.q": "Que sont les crédits IA ?", - "pricing.faq.credits.a": "Les crédits IA paient des étapes comme la génération de titres et descriptions. Free inclut 0 crédit IA — vous pouvez quand même mapper des flux et nettoyer les données. Packs mensuels payants : Starter 150, Plus 500, Growth 1 200, Business 4 000, Scale 8 000. Enterprise inclut un large pack géré (et votre propre clé). À partir de Growth, vous pouvez optionnellement utiliser votre propre clé.", + "pricing.faq.credits.q": "Que sont les crédits IA ?", + "pricing.faq.credits.a": "Les crédits IA paient des étapes comme la génération de titres et descriptions. Free inclut 0 crédit IA — vous pouvez quand même mapper des flux et nettoyer les données. Packs mensuels payants : Starter 150, Plus 500, Growth 1 200, Business 4 000, Scale 8 000. Enterprise inclut un large pack géré (et votre propre clé). À partir de Growth, vous pouvez optionnellement utiliser votre propre clé.", "pricing.faq.packs.q": "Can I buy extra AI credits?", "pricing.faq.packs.a": "Yes. One-time packs: Starter $19 / 500 credits, Growth $59 / 2,000, Catalog $199 / 10,000, Scale $599 / 40,000. Buy from Billing after you have a paid plan (or Free with leftover trial credits). Packs do not change your SKU or feed limits.", - "pricing.faq.limits.q": "Que se passe-t-il si j’atteins la limite produits ou crédits ?", - "pricing.faq.limits.a": "Nous vous prévenons à l’approche. Au plafond produits ou sans crédits IA, les jobs qui en ont besoin se mettent en pause jusqu’à libérer de la capacité, attendre le prochain cycle ou changer d’offre.", - "pricing.faq.change.q": "Puis-je monter ou descendre d’offre ?", - "pricing.faq.change.a": "Oui. Commencez sur Free, puis passez à Starter, Plus, Growth, Business ou Scale depuis Plans ou Facturation (Stripe Checkout). Enterprise est toujours géré par les ventes.", + "pricing.faq.limits.q": "Que se passe-t-il si j’atteins la limite produits ou crédits ?", + "pricing.faq.limits.a": "Nous vous prévenons à l’approche. Au plafond produits ou sans crédits IA, les jobs qui en ont besoin se mettent en pause jusqu’à libérer de la capacité, attendre le prochain cycle ou changer d’offre.", + "pricing.faq.change.q": "Puis-je monter ou descendre d’offre ?", + "pricing.faq.change.a": "Oui. Commencez sur Free, puis passez à Starter, Plus, Growth, Business ou Scale depuis Plans ou Facturation (Stripe Checkout). Enterprise est toujours géré par les ventes.", "pricing.faq.free.q": "Que comprend Free ?", - "pricing.faq.free.a": "Free pour toujours : 50 produits, un flux, nettoyage et remplissage d’attributs, étiquettes énergétiques UE (EPREL — données publiques, sans crédits), plus un export manuel — avec 0 crédit IA. Sans carte. Passez à une offre supérieure pour l’IA ou plus de capacité.", + "pricing.faq.free.a": "Free pour toujours : 50 produits, un flux, nettoyage et remplissage d’attributs, étiquettes énergétiques UE (EPREL — données publiques, sans crédits), plus un export manuel — avec 0 crédit IA. Sans carte. Passez à une offre supérieure pour l’IA ou plus de capacité.", "pricing.faq.why.q": "Pourquoi ne pas payer par produit comme les outils de contenu seuls ?", - "pricing.faq.why.a": "Descrybe couvre le parcours complet du flux fournisseur au catalogue jusqu’à WooCommerce ou l’export — pas seulement le copy IA. Vous payez la capacité plateforme (produits et flux) ; l’IA est une couche d’usage par-dessus.", + "pricing.faq.why.a": "Descrybe couvre le parcours complet du flux fournisseur au catalogue jusqu’à WooCommerce ou l’export — pas seulement le copy IA. Vous payez la capacité plateforme (produits et flux) ; l’IA est une couche d’usage par-dessus.", "pricing.faq.annual.q": "Comment fonctionne la facturation annuelle ?", - "pricing.faq.annual.a": "La facturation annuelle offre environ 20 % de moins que le prix mensuel. Commencez gratuitement, puis choisissez l’annuel au Checkout (ou contactez les ventes).", + "pricing.faq.annual.a": "La facturation annuelle offre environ 20 % de moins que le prix mensuel. Commencez gratuitement, puis choisissez l’annuel au Checkout (ou contactez les ventes).", "pricing.calc.badge": "Plan calculator", "pricing.calc.title": "Find the right plan", "pricing.calc.lead": "Enter feeds, catalog size, and how many products you want to enhance with AI (count each language pass).", @@ -5265,12 +5266,12 @@ export const fr: MessageDict = { "pricing.calc.skus": "Catalog products (SKUs)", "pricing.calc.skusHint": "Total products you will store and process", "pricing.calc.aiVolume": "AI process volume", - "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", + "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", "pricing.calc.recommendedLabel": "Recommended", "pricing.calc.budgetLabel": "Budget option", "pricing.calc.coversCredits": "Needs about {count} AI credits / month", "pricing.calc.aiIncluded": "Included monthly credits cover this AI volume", - "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", + "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", "pricing.calc.orYearly": "or ~{amount}/mo yearly", "pricing.calc.budgetNote": "Lower list price with yearly discount and/or credit packs when that still fits.", "pricing.calc.noBudget": "The recommended plan is already the leanest fit for these inputs.", @@ -5283,25 +5284,25 @@ export const fr: MessageDict = { "pricing.card.forever": "pour toujours", "pricing.card.perMonth": "mois", "pricing.card.perYear": "an", - "pricing.card.savePerMonth": "Économisez ${amount}/mois", + "pricing.card.savePerMonth": "Économisez ${amount}/mois", "pricing.card.discountBadge": "-20 %", - "pricing.card.unlimitedSkus": "SKU illimités", + "pricing.card.unlimitedSkus": "SKU illimités", "pricing.card.oneMSkus": "1 M+ SKU", - "pricing.card.upToSkus": "Jusqu’à {count} SKU", - "pricing.card.unlimitedAi": "Crédits IA illimités", - "pricing.card.zeroCredits": "0 crédit IA / mois", - "pricing.card.creditsPerMonth": "{count} crédits IA / mois", + "pricing.card.upToSkus": "Jusqu’à {count} SKU", + "pricing.card.unlimitedAi": "Crédits IA illimités", + "pricing.card.zeroCredits": "0 crédit IA / mois", + "pricing.card.creditsPerMonth": "{count} crédits IA / mois", "pricing.card.showLess": "Afficher moins", "pricing.card.showMoreFeature": "Afficher {count} fonction de plus", "pricing.card.showMoreFeatures": "Afficher {count} fonctions de plus", - "pricing.card.upgradeTo": "Passer à {name}", - "pricing.plan.free.description": "Mappez un flux d’exemple et nettoyez les données produit — sans carte", + "pricing.card.upgradeTo": "Passer à {name}", + "pricing.plan.free.description": "Mappez un flux d’exemple et nettoyez les données produit — sans carte", "pricing.plan.starter.description": "Petits catalogues qui ont besoin de titres et descriptions IA", - "pricing.plan.plus.description": "Plus de produits, de flux et d’IA pour les catalogues en croissance", + "pricing.plan.plus.description": "Plus de produits, de flux et d’IA pour les catalogues en croissance", "pricing.plan.growth.description": "Flux multi-fournisseurs vers boutiques et exports shopping", "pricing.plan.business.description": "Catalogues mid-market avec BYOK", - "pricing.plan.scale.description": "Catalogues à l’échelle distributeur avec support prioritaire", - "pricing.plan.enterprise.description": "Capacité illimitée, SLA et équipe compte dédiée", + "pricing.plan.scale.description": "Catalogues à l’échelle distributeur avec support prioritaire", + "pricing.plan.enterprise.description": "Capacité illimitée, SLA et équipe compte dédiée", "pricing.feature.credits100": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits100starter": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits400": "400 AI credits / month (~50% catalog cover)", @@ -5316,7 +5317,7 @@ export const fr: MessageDict = { "pricing.feature.upTo15kSkus": "Up to 15,000 SKUs", "pricing.feature.credits15000": "15,000 AI credits / month (~75% catalog cover)", "pricing.feature.credits60000": "60,000 AI credits / month (~75% catalog cover)", - "pricing.feature.upTo50Skus": "Jusqu’à 50 SKU", + "pricing.feature.upTo50Skus": "Jusqu’à 50 SKU", "pricing.feature.upTo100Skus": "Up to 100 SKUs", "pricing.feature.upTo400Skus": "Up to 400 SKUs", "pricing.feature.upTo1200Skus": "Up to 1,200 SKUs", @@ -5329,19 +5330,19 @@ export const fr: MessageDict = { "pricing.feature.sixFeedSources": "6 feed sources", "pricing.feature.twelveFeedSources": "12 feed sources", "pricing.feature.twentyFiveFeedSources": "25 feed sources", - "pricing.feature.cleanData": "Nettoyer les données, analyser les specs et remplir les champs", - "pricing.feature.eprel": "Étiquettes énergétiques UE (EPREL)", - "pricing.feature.zeroCredits": "0 crédit IA / mois", - "pricing.feature.oneManualExport": "1 flux d’export manuel", + "pricing.feature.cleanData": "Nettoyer les données, analyser les specs et remplir les champs", + "pricing.feature.eprel": "Étiquettes énergétiques UE (EPREL)", + "pricing.feature.zeroCredits": "0 crédit IA / mois", + "pricing.feature.oneManualExport": "1 flux d’export manuel", "pricing.feature.twoExports": "2 export feeds", "pricing.feature.fourExports": "4 export feeds", "pricing.feature.wooTestOnly": "Test de connexion WooCommerce uniquement", - "pricing.feature.upTo2Seats": "Jusqu’à 2 sièges", + "pricing.feature.upTo2Seats": "Jusqu’à 2 sièges", "pricing.feature.aiTitles": "Titres et descriptions IA", "pricing.feature.liveStoreSync": "Sync boutique en direct", - "pricing.feature.apiAccess": "Accès API", - "pricing.feature.byok": "Apportez votre propre clé IA", - "pricing.feature.upTo500Skus": "Jusqu’à 500 SKU", + "pricing.feature.apiAccess": "Accès API", + "pricing.feature.byok": "Apportez votre propre clé IA", + "pricing.feature.upTo500Skus": "Jusqu’à 500 SKU", "pricing.feature.upTo1000Skus": "Up to 1,000 SKUs", "pricing.feature.fiveFeedSources": "5 feed sources", "pricing.feature.fiveExports": "5 export feeds", @@ -5355,14 +5356,14 @@ export const fr: MessageDict = { "pricing.feature.credits12500": "12,500 AI credits / month (~25% catalog cover)", "pricing.feature.credits30000": "30,000 AI credits / month (~20% catalog cover)", "pricing.feature.upTo75kSkus": "Up to 75,000 SKUs", - "pricing.feature.threeExports": "3 flux d’export", + "pricing.feature.threeExports": "3 flux d’export", "pricing.feature.sixExports": "6 export feeds", "pricing.feature.tenExports": "10 export feeds", - "pricing.feature.fullWooSync": "Sync WooCommerce complète", - "pricing.feature.readApi": "Accès API en lecture", + "pricing.feature.fullWooSync": "Sync WooCommerce complète", + "pricing.feature.readApi": "Accès API en lecture", "pricing.feature.emailSupport": "Support e-mail", "pricing.feature.creditPacks": "Buy extra AI credit packs", - "pricing.feature.upTo2500Skus": "Jusqu’à 2 500 SKU", + "pricing.feature.upTo2500Skus": "Jusqu’à 2 500 SKU", "pricing.feature.upTo1500Skus": "Up to 1,500 SKUs", "pricing.feature.upTo3500Skus": "Up to 3,500 SKUs", "pricing.feature.upTo9500Skus": "Up to 9,500 SKUs", @@ -5370,54 +5371,54 @@ export const fr: MessageDict = { "pricing.feature.upTo55kSkus": "Up to 55,000 SKUs", "pricing.feature.upTo5000Skus": "Up to 5,000 SKUs", "pricing.feature.eightFeedSources": "8 sources de flux", - "pricing.feature.credits500": "500 crédits IA / mois", + "pricing.feature.credits500": "500 crédits IA / mois", "pricing.feature.credits1250": "1,250 AI credits / month (~25% catalog cover)", "pricing.feature.credits5000": "5,000 AI credits / month (~25% catalog cover)", - "pricing.feature.eightExports": "8 flux d’export", + "pricing.feature.eightExports": "8 flux d’export", "pricing.feature.fifteenExports": "15 export feeds", - "pricing.feature.wooShopifySync": "Sync WooCommerce + Shopify complète", - "pricing.feature.upTo10kSkus": "Jusqu’à 10 000 SKU", + "pricing.feature.wooShopifySync": "Sync WooCommerce + Shopify complète", + "pricing.feature.upTo10kSkus": "Jusqu’à 10 000 SKU", "pricing.feature.upTo25kSkus": "Up to 25,000 SKUs", "pricing.feature.fifteenFeedSources": "15 sources de flux", "pricing.feature.tenFeedSources": "10 feed sources", "pricing.feature.twentyFeedSources": "20 feed sources", "pricing.feature.thirtyFeedSources": "30 feed sources", - "pricing.feature.credits1200": "1 200 crédits IA / mois", + "pricing.feature.credits1200": "1 200 crédits IA / mois", "pricing.feature.credits10000": "10,000 AI credits / month (~50% catalog cover)", "pricing.feature.credits25000": "25,000 AI credits / month (~50% catalog cover)", - "pricing.feature.twentyExports": "20 flux d’export", + "pricing.feature.twentyExports": "20 flux d’export", "pricing.feature.fortyExports": "40 export feeds", - "pricing.feature.fullFormulas": "Formules et variables complètes", - "pricing.feature.fullApi": "Accès API complet", + "pricing.feature.fullFormulas": "Formules et variables complètes", + "pricing.feature.fullApi": "Accès API complet", "pricing.feature.byokAddon": "Option bring-your-own-key", "pricing.feature.emailSupport24h": "Support e-mail (24 h)", - "pricing.feature.upTo40kSkus": "Jusqu’à 40 000 SKU", + "pricing.feature.upTo40kSkus": "Jusqu’à 40 000 SKU", "pricing.feature.upTo50kSkus": "Up to 50,000 SKUs", "pricing.feature.fortyFeedSources": "40 sources de flux", "pricing.feature.fiftyFeedSources": "50 feed sources", - "pricing.feature.credits4000": "4 000 crédits IA / mois", + "pricing.feature.credits4000": "4 000 crédits IA / mois", "pricing.feature.credits40000": "40,000 AI credits / month (~50% catalog cover)", "pricing.feature.credits50000half": "50,000 AI credits / month (~50% catalog cover)", - "pricing.feature.unlimitedExports": "Flux d’export illimités", - "pricing.feature.fullApiWebhooks": "API complète", - "pricing.feature.byokIncluded": "Votre propre clé IA incluse", + "pricing.feature.unlimitedExports": "Flux d’export illimités", + "pricing.feature.fullApiWebhooks": "API complète", + "pricing.feature.byokIncluded": "Votre propre clé IA incluse", "pricing.feature.priorityEmail": "Support e-mail prioritaire", - "pricing.feature.upTo100kSkus": "Jusqu’à 100 000 SKU", + "pricing.feature.upTo100kSkus": "Jusqu’à 100 000 SKU", "pricing.feature.upTo150kSkus": "Up to 150,000 SKUs", "pricing.feature.hundredFeedSources": "100 sources de flux", "pricing.feature.hundredFiftyFeedSources": "150 feed sources", - "pricing.feature.credits8000": "8 000 crédits IA / mois", + "pricing.feature.credits8000": "8 000 crédits IA / mois", "pricing.feature.credits50000": "50,000 AI credits / month (~25% catalog cover)", "pricing.feature.credits120000": "120,000 AI credits / month (~40% catalog cover)", "pricing.feature.prioritySlack": "Support prioritaire + Slack", - "pricing.feature.unlimitedSkus": "SKU illimités", - "pricing.feature.unlimitedFeeds": "Sources de flux illimitées", - "pricing.feature.unlimitedAiOwnKey": "Crédits IA illimités / clé propre", - "pricing.feature.ssoWebhooksAm": "SSO, gestionnaire de compte dédié", - "pricing.feature.customIntegrations": "Intégrations sur mesure", + "pricing.feature.unlimitedSkus": "SKU illimités", + "pricing.feature.unlimitedFeeds": "Sources de flux illimitées", + "pricing.feature.unlimitedAiOwnKey": "Crédits IA illimités / clé propre", + "pricing.feature.ssoWebhooksAm": "SSO, gestionnaire de compte dédié", + "pricing.feature.customIntegrations": "Intégrations sur mesure", "pricing.feature.slaPriority": "SLA et support prioritaire", "pricing.pack.tiny.name": "Nano pack", - "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", + "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", "pricing.pack.small.name": "Starter pack", "pricing.pack.small.desc": "Extra AI for fixes and tests (~250 products)", "pricing.pack.medium.name": "Growth pack", @@ -5427,70 +5428,70 @@ export const fr: MessageDict = { "pricing.pack.xl.name": "Scale pack", "pricing.pack.xl.desc": "Heavy usage / agency bursts (~20,000 products)", "pricing.pack.xxl.name": "Business pack", - "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", + "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", "pricing.pack.mega.name": "Scale pack", - "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", - "pricing.section.faqDescription": "Réponses claires sur les forfaits, les crédits et ce qu’inclut Free.", + "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", + "pricing.section.faqDescription": "Réponses claires sur les forfaits, les crédits et ce qu’inclut Free.", "billing.buyCreditPacks": "Buy AI credit packs", - "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", - "billing.packCredits": "{credits} crédits", + "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", + "billing.packCredits": "{credits} crédits", "billing.packApproxProducts": "~{count} AI products", "billing.buyPack": "Buy", - "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", + "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", "billing.packCheckoutFailed": "Could not start credit pack checkout.", - "empty.default.noItems": "Aucun élément trouvé.", + "empty.default.noItems": "Aucun élément trouvé.", "settings.tabLockedHint": "Not on your plan", "stores.connectorLocked": "Not on your plan", "stores.connectorUpgrade": "Upgrade to unlock", - "plan.upgrade.title": "Cette fonctionnalité n’est pas dans votre forfait", - "plan.upgrade.message": "Passez à un forfait supérieur pour débloquer cette partie de Descrybe.", - "plan.upgrade.defaultMessage": "Votre forfait actuel n’inclut pas cette partie de Descrybe. Passez à un forfait supérieur pour la débloquer, ou demandez à un admin de l’entreprise si vous ne pouvez pas modifier la facturation.", - "plan.upgrade.sectionOff.title": "Cette fonctionnalité est temporairement indisponible", - "plan.upgrade.sectionOff.message": "Cette partie de Descrybe est désactivée sur la plateforme pour le moment. Ce n’est pas un problème d’upgrade — réessayez plus tard ou contactez le support.", + "plan.upgrade.title": "Cette fonctionnalité n’est pas dans votre forfait", + "plan.upgrade.message": "Passez à un forfait supérieur pour débloquer cette partie de Descrybe.", + "plan.upgrade.defaultMessage": "Votre forfait actuel n’inclut pas cette partie de Descrybe. Passez à un forfait supérieur pour la débloquer, ou demandez à un admin de l’entreprise si vous ne pouvez pas modifier la facturation.", + "plan.upgrade.sectionOff.title": "Cette fonctionnalité est temporairement indisponible", + "plan.upgrade.sectionOff.message": "Cette partie de Descrybe est désactivée sur la plateforme pour le moment. Ce n’est pas un problème d’upgrade — réessayez plus tard ou contactez le support.", "plan.upgrade.sectionOff.cta": "Retour au tableau de bord", - "plan.upgrade.stores.message": "Les connecteurs WooCommerce et Shopify nécessitent un forfait qui inclut Boutiques. Passez à un forfait supérieur pour les connecter — ou continuez avec les flux et l’API sur votre forfait actuel.", + "plan.upgrade.stores.message": "Les connecteurs WooCommerce et Shopify nécessitent un forfait qui inclut Boutiques. Passez à un forfait supérieur pour les connecter — ou continuez avec les flux et l’API sur votre forfait actuel.", "plan.upgrade.stillWorks.title": "Ce qui fonctionne encore avec votre forfait", - "plan.upgrade.stillWorks.feeds.label": "Flux d’entrée", + "plan.upgrade.stillWorks.feeds.label": "Flux d’entrée", "plan.upgrade.stillWorks.feeds.description": "Ajoutez des URL CSV ou XML et des imports de fichiers pour synchroniser les catalogues sans connecteurs de boutique.", - "plan.upgrade.stillWorks.export.label": "Flux d’export", - "plan.upgrade.stillWorks.export.description": "Générez des flux sortants pour les canaux shopping et les partenaires.", - "plan.upgrade.stillWorks.processing.label": "Tâches en arrière-plan", - "plan.upgrade.stillWorks.processing.description": "Surveillez les jobs IA et catalogue dans Traitement — disponible sur votre forfait même sans connecteurs de boutique.", - "plan.upgrade.stillWorks.api.label": "Clés API", - "plan.upgrade.stillWorks.api.description": "Créez une clé dans Paramètres pour utiliser /api/v1 — le secret n’est affiché qu’une fois.", + "plan.upgrade.stillWorks.export.label": "Flux d’export", + "plan.upgrade.stillWorks.export.description": "Générez des flux sortants pour les canaux shopping et les partenaires.", + "plan.upgrade.stillWorks.processing.label": "Tâches en arrière-plan", + "plan.upgrade.stillWorks.processing.description": "Surveillez les jobs IA et catalogue dans Traitement — disponible sur votre forfait même sans connecteurs de boutique.", + "plan.upgrade.stillWorks.api.label": "Clés API", + "plan.upgrade.stillWorks.api.description": "Créez une clé dans Paramètres pour utiliser /api/v1 — le secret n’est affiché qu’une fois.", "plan.upgrade.stillWorks.docs.label": "Docs API", - "plan.upgrade.stillWorks.docs.description": "Lisez l’aperçu de l’API et intégrez sans WooCommerce ni Shopify.", - "plan.upgrade.feature.settings.api_keys": "Les clés API nécessitent un forfait payant", - "plan.upgrade.feature.catalog.products.process_ai_titles": "Les titres IA sont une fonctionnalité payante", - "plan.upgrade.feature.catalog.products.process_ai_descriptions": "Les descriptions IA sont une fonctionnalité payante", - "plan.upgrade.feature.marketing.campaigns.generate_ai": "L’IA des campagnes nécessite un forfait payant", - "plan.upgrade.feature.marketing.campaigns.send": "L’envoi réel de campagnes nécessite un forfait payant", - "plan.upgrade.feature.marketing.brand_ai_apply": "La voix de marque dans l’IA nécessite un forfait payant", - "plan.upgrade.feature.marketing.seo.ai_rewrite": "La réécriture SEO IA nécessite un forfait payant", - "plan.upgrade.feature.integrations.ai.byok": "Apporter votre propre clé IA commence avec Growth", - "plan.upgrade.feature.capability.byok": "Apporter votre propre clé IA commence avec Growth", + "plan.upgrade.stillWorks.docs.description": "Lisez l’aperçu de l’API et intégrez sans WooCommerce ni Shopify.", + "plan.upgrade.feature.settings.api_keys": "Les clés API nécessitent un forfait payant", + "plan.upgrade.feature.catalog.products.process_ai_titles": "Les titres IA sont une fonctionnalité payante", + "plan.upgrade.feature.catalog.products.process_ai_descriptions": "Les descriptions IA sont une fonctionnalité payante", + "plan.upgrade.feature.marketing.campaigns.generate_ai": "L’IA des campagnes nécessite un forfait payant", + "plan.upgrade.feature.marketing.campaigns.send": "L’envoi réel de campagnes nécessite un forfait payant", + "plan.upgrade.feature.marketing.brand_ai_apply": "La voix de marque dans l’IA nécessite un forfait payant", + "plan.upgrade.feature.marketing.seo.ai_rewrite": "La réécriture SEO IA nécessite un forfait payant", + "plan.upgrade.feature.integrations.ai.byok": "Apporter votre propre clé IA commence avec Growth", + "plan.upgrade.feature.capability.byok": "Apporter votre propre clé IA commence avec Growth", "plan.upgrade.feature.marketing.campaigns": "Les campagnes ne sont pas dans votre forfait", - "plan.upgrade.feature.marketing.content_calendar": "Le calendrier de contenu n’est pas dans votre forfait", + "plan.upgrade.feature.marketing.content_calendar": "Le calendrier de contenu n’est pas dans votre forfait", "plan.upgrade.feature.marketing.seo": "Les outils SEO ne sont pas dans votre forfait", - "plan.upgrade.feature.marketing.brand_kit": "Le kit de marque n’est pas dans votre forfait", + "plan.upgrade.feature.marketing.brand_kit": "Le kit de marque n’est pas dans votre forfait", "plan.upgrade.feature.marketing.reviews": "Les avis ne sont pas dans votre forfait", - "plan.upgrade.feature.integrations.ai": "Les intégrations IA ne sont pas dans votre forfait", - "plan.upgrade.feature.integrations.email": "L’envoi d’e-mails n’est pas dans votre forfait", - "plan.upgrade.feature.processing.monitor": "Le traitement n’est pas dans votre forfait", + "plan.upgrade.feature.integrations.ai": "Les intégrations IA ne sont pas dans votre forfait", + "plan.upgrade.feature.integrations.email": "L’envoi d’e-mails n’est pas dans votre forfait", + "plan.upgrade.feature.processing.monitor": "Le traitement n’est pas dans votre forfait", "plan.upgrade.feature.stores.hub": "Les connecteurs de boutique ne sont pas dans votre forfait", - "plan.upgrade.feature.stores.woocommerce": "WooCommerce n’est pas dans votre forfait", - "plan.upgrade.feature.stores.shopify": "Shopify n’est pas dans votre forfait", - "plan.upgrade.feature.support.center": "Le centre d’assistance n’est pas dans votre forfait", - "plan.upgrade.feature.support.ticket_create": "La création de tickets d’assistance n’est pas dans votre forfait", - "plan.upgrade.feature.support.ticket_thread": "Les fils de tickets d’assistance ne sont pas dans votre forfait", - "plan.upgrade.feature.catalog.structured_descriptions": "Les descriptions structurées ne sont pas dans votre forfait", - "plan.upgrade.feature.catalog.vector_categories": "Les catégories vectorielles ne sont pas dans votre forfait", - "plan.checkingAccess": "Vérification de l’accès au forfait…", + "plan.upgrade.feature.stores.woocommerce": "WooCommerce n’est pas dans votre forfait", + "plan.upgrade.feature.stores.shopify": "Shopify n’est pas dans votre forfait", + "plan.upgrade.feature.support.center": "Le centre d’assistance n’est pas dans votre forfait", + "plan.upgrade.feature.support.ticket_create": "La création de tickets d’assistance n’est pas dans votre forfait", + "plan.upgrade.feature.support.ticket_thread": "Les fils de tickets d’assistance ne sont pas dans votre forfait", + "plan.upgrade.feature.catalog.structured_descriptions": "Les descriptions structurées ne sont pas dans votre forfait", + "plan.upgrade.feature.catalog.vector_categories": "Les catégories vectorielles ne sont pas dans votre forfait", + "plan.checkingAccess": "Vérification de l’accès au forfait…", "upgradeBanner.comparePlans": "Comparer les offres", "upgradeBanner.talkToSales": "Parler aux ventes", "commandPalette.closeAria": "Fermer la recherche", "commandPalette.ariaLabel": "Rechercher des pages", - "commandPalette.placeholder": "Rechercher des pages…", + "commandPalette.placeholder": "Rechercher des pages…", "commandPalette.searchAria": "Rechercher des pages", "commandPalette.destinationsAria": "Pages", "commandPalette.noMatches": "Aucune page correspondante", @@ -5499,41 +5500,41 @@ export const fr: MessageDict = { "commandPalette.announceNone": "Aucune page correspondante.", "commandPalette.announceMatchOne": "{count} page correspondante.", "commandPalette.announceMatchMany": "{count} pages correspondantes.", - "vector.title": "Test des catégories vectorielles", - "vector.description": "Recherchez dans l’index de catégories vectorielles lorsque Pinecone est configuré. Création d’index et initialisation ne sont pas encore disponibles en v2.", - "vector.probing": "Vérification de l’API des catégories vectorielles…", - "vector.unavailable": "Les catégories vectorielles ne sont pas encore sur ce backend. Rien à exécuter ici tant que /api/vector-categories/* n’est pas branché.", - "vector.browseCategories": "Parcourir les catégories", + "vector.title": "Test des catégories vectorielles", + "vector.description": "Recherchez dans l’index de catégories vectorielles lorsque Pinecone est configuré. Création d’index et initialisation ne sont pas encore disponibles en v2.", + "vector.probing": "Vérification de l’API des catégories vectorielles…", + "vector.unavailable": "Les catégories vectorielles ne sont pas encore sur ce backend. Rien à exécuter ici tant que /api/vector-categories/* n’est pas branché.", + "vector.browseCategories": "Parcourir les catégories", "vector.initHeading": "Initialiser la base vectorielle", - "vector.initComingSoon": "Créer l’index et Initialiser la BD vectorielle ne sont pas encore disponibles en v2 (bientôt). La recherche fonctionne toujours lorsque Pinecone est configuré.", - "vector.createIndex": "Créer l’index", + "vector.initComingSoon": "Créer l’index et Initialiser la BD vectorielle ne sont pas encore disponibles en v2 (bientôt). La recherche fonctionne toujours lorsque Pinecone est configuré.", + "vector.createIndex": "Créer l’index", "vector.initDb": "Initialiser la BD vectorielle", - "vector.searchHeading": "Rechercher des catégories", - "vector.searchPlaceholder": "Saisir une description de produit…", - "vector.results": "Résultats :", - "vector.categoryLabel": "Catégorie :", + "vector.searchHeading": "Rechercher des catégories", + "vector.searchPlaceholder": "Saisir une description de produit…", + "vector.results": "Résultats :", + "vector.categoryLabel": "Catégorie :", "vector.idLabel": "ID :", "vector.scoreLabel": "Score :", - "switcher.switching": "Changement…", - "switcher.returnTo": "Revenir à {email}", - "switcher.switchUser": "Changer d’utilisateur", - "switcher.loadingUsers": "Chargement des utilisateurs…", - "switcher.empty": "Aucun utilisateur interchangeable trouvé.", + "switcher.switching": "Changement…", + "switcher.returnTo": "Revenir à {email}", + "switcher.switchUser": "Changer d’utilisateur", + "switcher.loadingUsers": "Chargement des utilisateurs…", + "switcher.empty": "Aucun utilisateur interchangeable trouvé.", "switcher.noCompany": "Aucune entreprise", "switcher.unknownCompany": "Entreprise inconnue", - "companySwitcher.select": "Sélectionner une entreprise", - "companySwitcher.switchAria": "Changer d’entreprise : {label}", + "companySwitcher.select": "Sélectionner une entreprise", + "companySwitcher.switchAria": "Changer d’entreprise : {label}", "companySwitcher.companies": "Entreprises", - "companySwitcher.returnTo": "Revenir à {name}", - "companySwitcher.returnHome": "Revenir à l’entreprise d’origine", + "companySwitcher.returnTo": "Revenir à {name}", + "companySwitcher.returnHome": "Revenir à l’entreprise d’origine", "storeReconnect.primaryLabel": "Reconnecter la boutique", - "storeReconnect.titlePlural": "Reconnecter les boutiques après la migration", - "storeReconnect.titleChannel": "Reconnecter {channel} après la migration", - "storeReconnect.titleSingular": "Reconnecter la boutique après la migration", - "storeReconnect.messageWithItems": "Les identifiants API de boutique n’ont pas été repris (ou ne peuvent pas être utilisés) après la migration de la plateforme. Ce n’est pas une sync cassée — reconnectez chaque boutique, puis Testez la connexion avant de mettre une sync en file.", - "storeReconnect.messageSingle": "Les identifiants API de {channel} n’ont pas été repris (ou ne peuvent pas être utilisés) après la migration de la plateforme. Ce n’est pas une sync cassée — collez de nouveaux identifiants, Enregistrez, puis Testez la connexion avant de mettre une sync en file.", + "storeReconnect.titlePlural": "Reconnecter les boutiques après la migration", + "storeReconnect.titleChannel": "Reconnecter {channel} après la migration", + "storeReconnect.titleSingular": "Reconnecter la boutique après la migration", + "storeReconnect.messageWithItems": "Les identifiants API de boutique n’ont pas été repris (ou ne peuvent pas être utilisés) après la migration de la plateforme. Ce n’est pas une sync cassée — reconnectez chaque boutique, puis Testez la connexion avant de mettre une sync en file.", + "storeReconnect.messageSingle": "Les identifiants API de {channel} n’ont pas été repris (ou ne peuvent pas être utilisés) après la migration de la plateforme. Ce n’est pas une sync cassée — collez de nouveaux identifiants, Enregistrez, puis Testez la connexion avant de mettre une sync en file.", "storeReconnect.channelFallback": "Boutique", - "storeReconnect.askAdmin": "Demandez à un administrateur de l’entreprise de reconnecter — seuls les administrateurs peuvent enregistrer les identifiants de boutique.", + "storeReconnect.askAdmin": "Demandez à un administrateur de l’entreprise de reconnecter — seuls les administrateurs peuvent enregistrer les identifiants de boutique.", "storeReconnect.reconnectItem": "Reconnecter {label}", "admin.storeReconnect.channel.other": "Other", "admin.storeReconnect.channel.woocommerce": "WooCommerce", @@ -5556,7 +5557,7 @@ export const fr: MessageDict = { "admin.storeReconnect.listTitle": "Connected but invalid", "admin.storeReconnect.metric.showing": "Rows shown", "admin.storeReconnect.metric.total": "Gaps total", - "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", + "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", "admin.storeReconnect.loadFailed": "Could not load store reconnect inventory.", "admin.storeReconnect.refresh": "Refresh", "admin.storeReconnect.description": "Companies with a connected store identity but missing or unusable API credentials (cutover credential gaps).", @@ -5564,53 +5565,53 @@ export const fr: MessageDict = { "admin.nav.storeReconnect": "Store reconnect", "storeReconnect.wizardHint": "Prefer a step-by-step flow? Open Guided setup (/stores/wizard), or reconnect the channel below and Test Connection before syncing.", "storeReconnect.wizardLabel": "Guided setup", - "storeReconnect.reviewsHint": "L’import d’avis ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", - "storeReconnect.ordersHint": "L’import des commandes ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", - "productSync.directionTitle": "Produits : Descrybe → boutique", - "productSync.outbound": "Descrybe → {channel}", - "productSync.outboundBody": "— envoie les produits Descrybe traités vers la boutique (création ou mise à jour des produits distants correspondants). N’importe pas le catalogue boutique dans Descrybe.", - "productSync.firstSync": "Première sync", - "productSync.firstSyncBody": "— les produits sans correspondance sont créés dans {channel}. Les syncs suivantes mettent à jour les produits déjà liés par id ou stratégie de correspondance.", + "storeReconnect.reviewsHint": "L’import d’avis ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", + "storeReconnect.ordersHint": "L’import des commandes ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", + "productSync.directionTitle": "Produits : Descrybe → boutique", + "productSync.outbound": "Descrybe → {channel}", + "productSync.outboundBody": "— envoie les produits Descrybe traités vers la boutique (création ou mise à jour des produits distants correspondants). N’importe pas le catalogue boutique dans Descrybe.", + "productSync.firstSync": "Première sync", + "productSync.firstSyncBody": "— les produits sans correspondance sont créés dans {channel}. Les syncs suivantes mettent à jour les produits déjà liés par id ou stratégie de correspondance.", "productSync.reSync": "Re-sync", - "productSync.reSyncBody": "— les produits distants correspondants peuvent être écrasés avec le contenu Descrybe ({count} liés pour l’instant).", + "productSync.reSyncBody": "— les produits distants correspondants peuvent être écrasés avec le contenu Descrybe ({count} liés pour l’instant).", "productSync.queued": "Sync produits en file", - "productSync.live.queued": "En file — en attente du worker", + "productSync.live.queued": "En file — en attente du worker", "productSync.live.running": "Synchronisation en cours", - "productSync.live.watching": "Suivi du statut… les compteurs apparaissent à la fin.", - "productSync.live.success": "Sync terminée : {total} total · {created} créés · {updated} mis à jour · {failed} échoués · {skipped} ignorés", - "productSync.live.partial": "Sync terminée avec des échecs : {total} total · {created} créés · {updated} mis à jour · {failed} échoués · {skipped} ignorés", - "productSync.live.failed": "Échec de la sync{detail}.", - "productSync.live.timedOut": "Toujours en cours — actualisez plus tard pour le statut et les compteurs.", - "productSync.live.ordersSuccess": "Sync commandes terminée ({status}).", - "productSync.live.reviewsSuccess": "Sync avis terminée ({status}).", - "productSync.retry": "Réessayer la sync", - "productSync.lastStatus": "Dernière : {status}", + "productSync.live.watching": "Suivi du statut… les compteurs apparaissent à la fin.", + "productSync.live.success": "Sync terminée : {total} total · {created} créés · {updated} mis à jour · {failed} échoués · {skipped} ignorés", + "productSync.live.partial": "Sync terminée avec des échecs : {total} total · {created} créés · {updated} mis à jour · {failed} échoués · {skipped} ignorés", + "productSync.live.failed": "Échec de la sync{detail}.", + "productSync.live.timedOut": "Toujours en cours — actualisez plus tard pour le statut et les compteurs.", + "productSync.live.ordersSuccess": "Sync commandes terminée ({status}).", + "productSync.live.reviewsSuccess": "Sync avis terminée ({status}).", + "productSync.retry": "Réessayer la sync", + "productSync.lastStatus": "Dernière : {status}", "productSync.dryRun": "Simulation", - "productSync.lastSyncAt": "Dernière sync produits : {date}", - "productSync.noneYet": "Aucune sync produits n’est encore terminée.", - "productSync.lastRun": "Dernière exécution : {total} au total · {created} créés · {updated} mis à jour · {failed} échoués · {skipped} ignorés", - "productSync.needsReconnect": "La sync produits ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", + "productSync.lastSyncAt": "Dernière sync produits : {date}", + "productSync.noneYet": "Aucune sync produits n’est encore terminée.", + "productSync.lastRun": "Dernière exécution : {total} au total · {created} créés · {updated} mis à jour · {failed} échoués · {skipped} ignorés", + "productSync.needsReconnect": "La sync produits ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.", "productSync.scheduleTitle": "Planning de sync produits automatique", - "productSync.scheduleHelp": "Comme les intervalles des feeds : définissez la fréquence des pushes produits, ou mettez le planning en pause. La file manuelle reste disponible. Les webhooks boutique ne sont pas utilisés — interrogation/file uniquement.", + "productSync.scheduleHelp": "Comme les intervalles des feeds : définissez la fréquence des pushes produits, ou mettez le planning en pause. La file manuelle reste disponible. Les webhooks boutique ne sont pas utilisés — interrogation/file uniquement.", "productSync.scheduleInterval": "Intervalle de sync (heures)", - "productSync.scheduleIntervalHint": "1–168 heures. Par défaut 6 heures si non défini côté serveur.", + "productSync.scheduleIntervalHint": "1–168 heures. Par défaut 6 heures si non défini côté serveur.", "productSync.schedulePause": "Mettre en pause la sync automatique", - "productSync.schedulePauseHint": "Arrête uniquement les pushes planifiés. Vous pouvez toujours lancer une sync manuellement.", + "productSync.schedulePauseHint": "Arrête uniquement les pushes planifiés. Vous pouvez toujours lancer une sync manuellement.", "productSync.scheduleSave": "Enregistrer le planning", - "productSync.scheduleSaved": "Planning de sync produits enregistré.", + "productSync.scheduleSaved": "Planning de sync produits enregistré.", "productSync.schedulePausedSaved": "Sync produits automatique en pause.", - "productSync.scheduleSaveFailed": "Impossible d’enregistrer le planning de sync", + "productSync.scheduleSaveFailed": "Impossible d’enregistrer le planning de sync", "productSync.schedulePausedBadge": "Planning en pause", "productSync.scheduleActiveBadge": "Planning actif", - "productSync.scheduleNeedsConfig": "Enregistrez d’abord la connexion boutique", - "productSync.scheduleAdminOnly": "Administrateur d’entreprise requis", - "productSync.delivery.title": "Mises à jour par interrogation, pas par webhooks boutique", - "productSync.delivery.body": "Descrybe ne reçoit pas les webhooks Shopify ou WooCommerce. Les envois de produits s’exécutent quand vous les mettez en file ou selon le planning automatique. Cette page suit la progression en interrogeant l’état de la connexion — pas via des événements push boutique en direct.", - "productSync.delivery.inboundNote": "Commandes et avis utilisent aussi des tirages en file (planifiés ou manuels), pas des webhooks en direct.", - "productSync.delivery.hubNote": "Les connecteurs boutique synchronisent selon un planning ou quand vous lancez une tâche — pas via des webhooks boutique en direct.", + "productSync.scheduleNeedsConfig": "Enregistrez d’abord la connexion boutique", + "productSync.scheduleAdminOnly": "Administrateur d’entreprise requis", + "productSync.delivery.title": "Mises à jour par interrogation, pas par webhooks boutique", + "productSync.delivery.body": "Descrybe ne reçoit pas les webhooks Shopify ou WooCommerce. Les envois de produits s’exécutent quand vous les mettez en file ou selon le planning automatique. Cette page suit la progression en interrogeant l’état de la connexion — pas via des événements push boutique en direct.", + "productSync.delivery.inboundNote": "Commandes et avis utilisent aussi des tirages en file (planifiés ou manuels), pas des webhooks en direct.", + "productSync.delivery.hubNote": "Les connecteurs boutique synchronisent selon un planning ou quand vous lancez une tâche — pas via des webhooks boutique en direct.", "productSync.delivery.badge.manual": "File manuelle", - "productSync.delivery.badge.scheduled": "Planifié toutes les {hours} h", - "productSync.delivery.badge.scheduledDefault": "Planifié (défaut serveur)", + "productSync.delivery.badge.scheduled": "Planifié toutes les {hours} h", + "productSync.delivery.badge.scheduledDefault": "Planifié (défaut serveur)", "productSync.delivery.badge.paused": "Planning en pause", "productSync.delivery.badge.webhooksOff": "Webhooks boutique : non disponibles", "productSync.scope.title": "What to sync", @@ -5627,21 +5628,21 @@ export const fr: MessageDict = { "productSync.scope.products": "Specific products", "productSync.scope.productsHint": "Optional. Search and select processed products to push only those.", "productSync.scope.productsOverrideHint": "Selected products override status, category, and max-products filters for this sync.", - "productSync.scope.productsSearch": "Search products…", - "productSync.scope.productsLoading": "Loading products…", + "productSync.scope.productsSearch": "Search products…", + "productSync.scope.productsLoading": "Loading products…", "productSync.scope.productsEmpty": "No processed products found.", "productSync.scope.productsSelected": "{count} selected", "productSync.scope.productsSelectedList": "Selected products", "productSync.scope.productsClear": "Clear selection", "productSync.scope.productsMax": "Maximum {max} products", - "store.syncingLive": "Synchronisation…", - "files.recentUploads": "Téléversements récents", + "store.syncingLive": "Synchronisation…", + "files.recentUploads": "Téléversements récents", "files.colFileName": "Nom du fichier", "files.colKind": "Type", - "files.colUploaded": "Téléversé", + "files.colUploaded": "Téléversé", "files.colRows": "Lignes", - "files.loading": "Chargement des téléversements…", - "files.empty": "Aucun téléversement pour l’instant.", + "files.loading": "Chargement des téléversements…", + "files.empty": "Aucun téléversement pour l’instant.", "products.filters.sortProducts": "Trier les produits", "products.table.options": "Options", }; diff --git a/apps/web/src/lib/i18n/messages/it.ts b/apps/web/src/lib/i18n/messages/it.ts index f821895..3a9412b 100644 --- a/apps/web/src/lib/i18n/messages/it.ts +++ b/apps/web/src/lib/i18n/messages/it.ts @@ -1,6 +1,6 @@ -import type { MessageDict } from "./types"; +import type { MessageDict } from "./types"; -/** Italian (it) UI pack — keys must stay in sync with en.ts. */ +/** Italian (it) UI pack — keys must stay in sync with en.ts. */ export const it: MessageDict = { "app.name": "Descrybe", "app.home": "Home Descrybe", @@ -21,15 +21,15 @@ export const it: MessageDict = { "common.name": "Il tuo nome", "common.viewPricing": "Vedi i prezzi", "common.backToSignIn": "Torna all'accesso", - "common.signingOut": "Disconnessione…", + "common.signingOut": "Disconnessione…", "common.signOutAndContinue": "Esci e continua", "common.staySignedIn": "Resta connesso", "a11y.skipToContent": "Vai al contenuto", "theme.switchToDark": "Passa al tema scuro", "theme.switchToLight": "Passa al tema chiaro", "header.signOut": "Esci", - "header.signingOut": "Disconnessione…", - "status.emDash": "—", + "header.signingOut": "Disconnessione…", + "status.emDash": "—", "status.pending": "In sospeso", "status.processing": "Elaborazione", "status.completed": "Completato", @@ -74,14 +74,14 @@ export const it: MessageDict = { "auth.login.title": "Accedi", "auth.login.description": "Usa la tua email e password Descrybe.", "auth.login.submit": "Accedi", - "auth.login.submitting": "Accesso in corso…", + "auth.login.submitting": "Accesso in corso…", "auth.login.failed": "Accesso non riuscito", "auth.login.passwordNotSet": "Questo account richiede ancora una password. Apri il link di invito o chiedi a un amministratore di generarne uno nuovo.", "auth.login.setPasswordFirstTitle": "Imposta prima la password:", - "auth.login.setPasswordFirstBody": "usa il link di invito dalla tua email. Se il link è andato a un indirizzo vecchio (deriva email), chiedi a un amministratore dell'azienda di riemettere un invito per impostare la password a {email}.", + "auth.login.setPasswordFirstBody": "usa il link di invito dalla tua email. Se il link è andato a un indirizzo vecchio (deriva email), chiedi a un amministratore dell'azienda di riemettere un invito per impostare la password a {email}.", "auth.login.yourEmail": "la tua email", "auth.login.platformAdminsReissue": "Gli amministratori della piattaforma possono riemettere da", - "auth.login.adminUsersLink": "Admin → Utenti", + "auth.login.adminUsersLink": "Admin → Utenti", "auth.login.haveToken": "Hai un token? Apri accetta invito", "auth.login.noAccount": "Nessun account?", "auth.login.createCompany": "Crea azienda", @@ -90,80 +90,80 @@ export const it: MessageDict = { "auth.login.forgotPassword": "Password dimenticata?", "auth.login.forgotPasswordHelp": "Inserisci la tua email nella pagina di reset. Se non hai mai impostato una password, usa il link di invito / impostazione password.", "auth.forgot.title": "Password dimenticata", - "auth.forgot.description": "Inserisci l’email dell’account. Se corrisponde a un account attivo, invieremo un link di reset.", + "auth.forgot.description": "Inserisci l’email dell’account. Se corrisponde a un account attivo, invieremo un link di reset.", "auth.forgot.submit": "Invia link di reset", - "auth.forgot.submitting": "Invio…", + "auth.forgot.submitting": "Invio…", "auth.forgot.failed": "Impossibile richiedere il reset", "auth.forgot.sentTitle": "Controlla la tua email", - "auth.forgot.sentBody": "Se esiste un account per quell’indirizzo, il link di reset è in arrivo. Il link scade tra un’ora.", - "auth.forgot.backToSignIn": "Torna all’accesso", + "auth.forgot.sentBody": "Se esiste un account per quell’indirizzo, il link di reset è in arrivo. Il link scade tra un’ora.", + "auth.forgot.backToSignIn": "Torna all’accesso", "auth.reset.title": "Reimposta password", "auth.reset.description": "Scegli una nuova password per il tuo account Descrybe (almeno 8 caratteri).", "auth.reset.submit": "Salva nuova password", - "auth.reset.submitting": "Salvataggio…", + "auth.reset.submitting": "Salvataggio…", "auth.reset.failed": "Impossibile reimpostare la password", "auth.reset.doneTitle": "Password aggiornata", "auth.reset.doneDescription": "Accedi con la tua email e la nuova password.", - "auth.reset.goToSignIn": "Vai all’accesso", + "auth.reset.goToSignIn": "Vai all’accesso", "auth.reset.passwordConfirm": "Conferma password", "auth.reset.passwordMismatch": "Le password non coincidono", "auth.reset.missingTitle": "Link di reset mancante", - "auth.reset.missingDescription": "Apri il link dall’email per scegliere una nuova password.", + "auth.reset.missingDescription": "Apri il link dall’email per scegliere una nuova password.", "auth.reset.requestNewLink": "Richiedi un nuovo link di reset", - "auth.reset.tokenMissing": "Nessun link di reset fornito. Usa il link dall’email oppure richiedine uno nuovo.", - "auth.reset.tokenInvalid": "Questo link di reset non è valido o è scaduto. Richiedine uno nuovo dalla pagina password dimenticata.", - "auth.reset.linkRecognized": "Link di reimpostazione riconosciuto. Inserisci una nuova password qui sotto — il segreto non è mostrato in questa pagina.", + "auth.reset.tokenMissing": "Nessun link di reset fornito. Usa il link dall’email oppure richiedine uno nuovo.", + "auth.reset.tokenInvalid": "Questo link di reset non è valido o è scaduto. Richiedine uno nuovo dalla pagina password dimenticata.", + "auth.reset.linkRecognized": "Link di reimpostazione riconosciuto. Inserisci una nuova password qui sotto — il segreto non è mostrato in questa pagina.", "auth.reset.tokenLabel": "Token di reset", - "auth.reset.passwordHint": "Almeno 8 caratteri. Nessuna altra regola di complessità.", + "auth.reset.passwordHint": "Almeno 8 caratteri. Nessuna altra regola di complessità.", "auth.register.title": "Crea azienda", "auth.register.description": "Registra un'azienda e il relativo utente amministratore.", "auth.register.companyName": "Nome azienda", "auth.register.submit": "Crea account", - "auth.register.submitting": "Creazione…", + "auth.register.submitting": "Creazione…", "auth.register.failed": "Registrazione non riuscita", - "auth.register.haveAccount": "Hai già un account?", + "auth.register.haveAccount": "Hai già un account?", "auth.register.signIn": "Accedi", "auth.invite.title": "Accetta invito", "auth.invite.setPasswordTitle": "Imposta password", "auth.invite.description": "Imposta la password per unirti all'azienda. Il tuo amministratore ha assegnato Membro (lavoro quotidiano) o Admin (team e fatturazione).", "auth.invite.setPasswordDescription": "Scegli una password per il tuo account Descrybe migrato (almeno 8 caratteri).", - "auth.invite.checking": "Verifica invito…", + "auth.invite.checking": "Verifica invito…", "auth.invite.forEmail": "Invito per {email}.", - "auth.invite.linkRecognized": "Link di invito riconosciuto. Inserisci una password qui sotto per continuare — il segreto non è mostrato in questa pagina.", - "auth.invite.resetLinkRecognized": "Link di reimpostazione riconosciuto. Inserisci una password qui sotto per continuare — il segreto non è mostrato in questa pagina.", + "auth.invite.linkRecognized": "Link di invito riconosciuto. Inserisci una password qui sotto per continuare — il segreto non è mostrato in questa pagina.", + "auth.invite.resetLinkRecognized": "Link di reimpostazione riconosciuto. Inserisci una password qui sotto per continuare — il segreto non è mostrato in questa pagina.", "auth.invite.tokenLabel": "Token di invito", "auth.invite.resetTokenLabel": "Token di reimpostazione", - "auth.invite.tokenHelp": "Incolla il token dall'email di invito. È mascherato in questo campo.", - "auth.invite.passwordHint": "Almeno 8 caratteri. Nessun'altra regola di complessità.", + "auth.invite.tokenHelp": "Incolla il token dall'email di invito. È mascherato in questo campo.", + "auth.invite.passwordHint": "Almeno 8 caratteri. Nessun'altra regola di complessità.", "auth.invite.submit": "Accetta invito", "auth.invite.setPasswordSubmit": "Imposta password", - "auth.invite.accepting": "Accettazione…", - "auth.invite.saving": "Salvataggio…", + "auth.invite.accepting": "Accettazione…", + "auth.invite.saving": "Salvataggio…", "auth.invite.verifyFailed": "Impossibile verificare l'invito", "auth.invite.verifySetPasswordFailed": "Impossibile verificare il link per impostare la password", "auth.invite.acceptFailed": "Impossibile accettare l'invito", "auth.invite.setPasswordFailed": "Impossibile impostare la password", - "auth.invite.expired": "Questo invito non è valido o è scaduto. Chiedi all'amministratore dell'azienda di inviare un nuovo invito, poi apri il nuovo link (o incolla il nuovo token qui sotto).", - "auth.invite.setPasswordExpired": "Questo link per impostare la password non è valido o è scaduto. Chiedi a un amministratore dell'azienda o della piattaforma di riemetterlo, poi apri il nuovo link (o incolla il nuovo token qui sotto).", + "auth.invite.expired": "Questo invito non è valido o è scaduto. Chiedi all'amministratore dell'azienda di inviare un nuovo invito, poi apri il nuovo link (o incolla il nuovo token qui sotto).", + "auth.invite.setPasswordExpired": "Questo link per impostare la password non è valido o è scaduto. Chiedi a un amministratore dell'azienda o della piattaforma di riemetterlo, poi apri il nuovo link (o incolla il nuovo token qui sotto).", "auth.invite.emailMismatchDefault": "Hai effettuato l'accesso con un'email diversa da questo invito.", - "auth.invite.expiredFooter": "Link scaduto? Chiedi a un amministratore di riemetterlo — non c'è un'API di reinvio self-service. Amministratori della piattaforma:", - "auth.invite.adminUsersLink": "Admin → Utenti", + "auth.invite.expiredFooter": "Link scaduto? Chiedi a un amministratore di riemetterlo — non c'è un'API di reinvio self-service. Amministratori della piattaforma:", + "auth.invite.adminUsersLink": "Admin → Utenti", "auth.invite.doneTitle": "Fai parte del team", "auth.invite.doneSetPasswordTitle": "Password salvata", - "auth.invite.doneDescription": "Il tuo account è pronto. Apri la dashboard per lavorare con feed e prodotti, oppure rivedi le impostazioni dell'azienda.", + "auth.invite.doneDescription": "Il tuo account è pronto. Apri la dashboard per lavorare con feed e prodotti, oppure rivedi le impostazioni dell'azienda.", "auth.invite.doneSetPasswordDescription": "Accedi con la tua email e la nuova password per aprire il tuo spazio di lavoro.", "auth.invite.openDashboard": "Apri dashboard", "auth.invite.companySettings": "Impostazioni azienda", "auth.invite.goToSignIn": "Vai all'accesso", - "auth.invite.afterSignInNote": "Dopo l'accesso arrivi nel tuo spazio di lavoro — il tour di configurazione iniziale viene saltato.", + "auth.invite.afterSignInNote": "Dopo l'accesso arrivi nel tuo spazio di lavoro — il tour di configurazione iniziale viene saltato.", "auth.invite.mismatchTitle": "Account errato per questo invito", - "auth.invite.mismatchDescription": "Questo link è per un'email diversa da quella con cui hai effettuato l'accesso. Esci per continuare come utente invitato, oppure resta connesso e chiedi a un amministratore di riemettere l'invito.", - "auth.invite.mismatchDetail": "Accesso come {session}, ma questo invito è per {invite}.", + "auth.invite.mismatchDescription": "Questo link è per un'email diversa da quella con cui hai effettuato l'accesso. Esci per continuare come utente invitato, oppure resta connesso e chiedi a un amministratore di riemettere l'invito.", + "auth.invite.mismatchDetail": "Accesso come {session}, ma questo invito è per {invite}.", "auth.invite.mismatchFallback": "L'email della sessione non corrisponde a questo invito.", "auth.invite.switchAccountTitle": "Cambia account:", "auth.invite.switchAccountBody": "esci, poi completa questo modulo con l'email invitata{emailSuffix}.", "auth.invite.reissueTitle": "Percorso di riemissione:", - "auth.invite.reissueBody": "se la tua email di accesso reale è cambiata (deriva email), chiedi a un amministratore dell'azienda di revocare questo invito e inviarne uno nuovo all'email con cui accedi. Gli amministratori della piattaforma possono anche riemettere link per impostare la password da Admin → Utenti.", + "auth.invite.reissueBody": "se la tua email di accesso reale è cambiata (deriva email), chiedi a un amministratore dell'azienda di revocare questo invito e inviarne uno nuovo all'email con cui accedi. Gli amministratori della piattaforma possono anche riemettere link per impostare la password da Admin → Utenti.", "locale.switcher": "Lingua dell'interfaccia", "locale.menu": "Scegli la lingua dell'interfaccia", "locale.label": "Lingua della dashboard", @@ -195,7 +195,7 @@ export const it: MessageDict = { "settings.inviteUser": "Invita utente", "settings.teamAdminOnly": "Solo gli amministratori dell'azienda possono invitare, promuovere, degradare o rimuovere compagni di team.", "settings.shareAcceptLink": "Condividi link di accettazione", - "settings.shareAcceptLinkHelp": "L'email in uscita non è configurata. Copia questo link monouso e invialo all'invitato. Imposterà una password (almeno 8 caratteri) e si unirà con il ruolo che hai scelto.", + "settings.shareAcceptLinkHelp": "L'email in uscita non è configurata. Copia questo link monouso e invialo all'invitato. Imposterà una password (almeno 8 caratteri) e si unirà con il ruolo che hai scelto.", "settings.acceptLinkLabel": "Link monouso di accettazione invito", "settings.copyLink": "Copia link", "settings.linkCopied": "Link di accettazione copiato.", @@ -216,7 +216,7 @@ export const it: MessageDict = { "settings.needOneAdmin": "Le aziende necessitano di almeno un amministratore", "settings.expires": "Scade il {date}", "settings.invalidEmail": "Inserisci un indirizzo email valido.", - "settings.inviteCreatedNoMail": "Invito creato per {email} come {role}. Copia il link di accettazione qui sotto e condividilo — l'email in uscita non è configurata.", + "settings.inviteCreatedNoMail": "Invito creato per {email} come {role}. Copia il link di accettazione qui sotto e condividilo — l'email in uscita non è configurata.", "settings.inviteSent": "Invito inviato a {email} come {role}. Deve aprire l'email e accettare prima della scadenza.", "settings.inviteFailed": "Impossibile inviare l'invito", "settings.revokeConfirm": "Revocare questo invito?", @@ -226,7 +226,7 @@ export const it: MessageDict = { "settings.memberRemoved": "{email} rimosso.", "settings.removeFailed": "Impossibile rimuovere l'utente", "settings.roleChangeConfirm": "{action} {email} a {role}?", - "settings.roleChanged": "{email} ora è {role}.", + "settings.roleChanged": "{email} ora è {role}.", "settings.roleChangeFailed": "Impossibile aggiornare il ruolo", "settings.promote": "Promuovi", "settings.demote": "Degrada", @@ -259,20 +259,20 @@ export const it: MessageDict = { "settings.createApiKeyTitle": "Crea chiave API", "settings.apiKeyLabel": "Chiave API", "settings.keyName": "Nome chiave", - "settings.storeKeySafe": "Conservala in un posto sicuro — non potrai più vedere il segreto completo.", - "settings.apiKeysIntro": "Crea una chiave API aziendale per chiamare gli endpoint pubblici /api/v1. Il segreto completo viene mostrato una sola volta alla creazione — copialo subito.", + "settings.storeKeySafe": "Conservala in un posto sicuro — non potrai più vedere il segreto completo.", + "settings.apiKeysIntro": "Crea una chiave API aziendale per chiamare gli endpoint pubblici /api/v1. Il segreto completo viene mostrato una sola volta alla creazione — copialo subito.", "settings.apiKeysUseWhere": "Inviala come Authorization: Bearer (consigliato) o X-API-Key.", "settings.apiKeysDocsLink": "Documentazione autenticazione API", - "settings.apiKeyOnceWarning": "Questa è l’unica volta in cui il segreto completo è mostrato. Copialo ora prima di chiudere questa finestra.", + "settings.apiKeyOnceWarning": "Questa è l’unica volta in cui il segreto completo è mostrato. Copialo ora prima di chiudere questa finestra.", "settings.table.name": "Nome", "settings.table.key": "Chiave", "settings.table.lastUsed": "Ultimo utilizzo", "dashboard.demoSandbox": "Sandbox demo", - "dashboard.demoEmptyTitle": "La sandbox demo è vuota", - "dashboard.demoEmptyHint": "La sandbox demo è vuota — passa ad A1 o collega un feed per vedere statistiche reali del catalogo.", + "dashboard.demoEmptyTitle": "La sandbox demo è vuota", + "dashboard.demoEmptyHint": "La sandbox demo è vuota — passa ad A1 o collega un feed per vedere statistiche reali del catalogo.", "dashboard.overviewTitle": "Panoramica", "dashboard.quickLinks": "Collegamenti rapidi", - "dashboard.whatsNew": "Novità", + "dashboard.whatsNew": "Novità", "dashboard.startTutorial": "Avvia tutorial", "dashboard.resumeTutorial": "Riprendi tutorial", "dashboard.restartTutorial": "Riavvia tutorial", @@ -285,13 +285,13 @@ export const it: MessageDict = { "dashboard.trialBadge": "Prova", "dashboard.actions": "Azioni dashboard", "dashboard.emptyPaygHint": "Descrybe importa un catalogo, lo arricchisce e lo elabora, poi esporta o lo invia agli store. Usa Per iniziare qui sotto.", - "dashboard.emptyCreditsHint": "Descrybe importa un catalogo, lo arricchisce e lo elabora, poi esporta o lo invia agli store. Hai {credits} — inizia con Per iniziare qui sotto.", + "dashboard.emptyCreditsHint": "Descrybe importa un catalogo, lo arricchisce e lo elabora, poi esporta o lo invia agli store. Hai {credits} — inizia con Per iniziare qui sotto.", "dashboard.workflowTitle": "Flusso catalogo", - "dashboard.recentActivity": "Attività recente", + "dashboard.recentActivity": "Attività recente", "dashboard.loadFailed": "Impossibile caricare la dashboard", "dashboard.workspaceFallback": "Questo spazio di lavoro", "dashboard.jobFallback": "Job {id}", - "dashboard.workflow.feeds.connect": "Collega un’origine", + "dashboard.workflow.feeds.connect": "Collega un’origine", "dashboard.workflow.feeds.sources": "{count} sorgente", "dashboard.workflow.feeds.sourcesPlural": "{count} sorgenti", "dashboard.workflow.products.build": "Crea catalogo", @@ -310,79 +310,79 @@ export const it: MessageDict = { "dashboard.workflow.export": "Esporta", "dashboard.workflow.exportReady": "Modelli e download", "dashboard.workflow.exportMap": "Mappa poi esporta", - "dashboard.workflowHint": "Catalogo in ingresso → arricchisci / elabora → esporta o invia agli store. Vai al passo successivo per {name}.", + "dashboard.workflowHint": "Catalogo in ingresso → arricchisci / elabora → esporta o invia agli store. Vai al passo successivo per {name}.", "dashboard.overviewHint": "Totali in tempo reale per {name}", "dashboard.demoEmptyMessage": "Passa ad A1 (o un'altra azienda con dati) nell'intestazione, oppure collega un feed qui per popolare questa sandbox.", "dashboard.emptyTitle": "Importa un catalogo", - "dashboard.emptyMessage": "Catalogo in ingresso → arricchisci / elabora → esporta o invia agli store. Inizia con Per iniziare qui sotto (o collega un feed / carica un CSV).", + "dashboard.emptyMessage": "Catalogo in ingresso → arricchisci / elabora → esporta o invia agli store. Inizia con Per iniziare qui sotto (o collega un feed / carica un CSV).", "dashboard.connectFeedAnyway": "Collega comunque un feed", "dashboard.connectFeedShort": "Collega feed", "dashboard.uploadCsv": "Carica CSV", "dashboard.goToBilling": "Vai alla fatturazione", "dashboard.freePlanTitle": "Sei sul piano Free", - "dashboard.freePlanMessageWithLimit": "{used} di {max} prodotti usati. Mappatura feed, pulizia di base ed etichette energetiche UE (EPREL) sono inclusi; passa a un piano superiore per titoli e descrizioni IA e più capacità.", - "dashboard.freePlanMessage": "Mappatura feed, pulizia di base ed etichette energetiche UE (EPREL) sono inclusi; passa a un piano superiore per titoli e descrizioni IA e più capacità.", + "dashboard.freePlanMessageWithLimit": "{used} di {max} prodotti usati. Mappatura feed, pulizia di base ed etichette energetiche UE (EPREL) sono inclusi; passa a un piano superiore per titoli e descrizioni IA e più capacità.", + "dashboard.freePlanMessage": "Mappatura feed, pulizia di base ed etichette energetiche UE (EPREL) sono inclusi; passa a un piano superiore per titoli e descrizioni IA e più capacità.", "dashboard.outOfCreditsTitle": "Hai esaurito i crediti IA", "dashboard.outOfCreditsMessage": "Acquista altri crediti o passa a un piano superiore per continuare l'elaborazione.", "dashboard.productLimitTitle": "Limite prodotti raggiunto", - "dashboard.productLimitMessage": "Il piano {plan} consente {max} prodotti ({count} nel catalogo). Passa a un piano superiore per elaborarne di più.", - "dashboard.productLimitMessageFull": "È stato raggiunto il limite prodotti del piano {plan}. Passa a un piano superiore per elaborarne di più.", + "dashboard.productLimitMessage": "Il piano {plan} consente {max} prodotti ({count} nel catalogo). Passa a un piano superiore per elaborarne di più.", + "dashboard.productLimitMessageFull": "È stato raggiunto il limite prodotti del piano {plan}. Passa a un piano superiore per elaborarne di più.", "dashboard.comparePlans": "Confronta i piani", "dashboard.viewPlans": "Vedi i piani", - "dashboard.trialTitle": "Prova · {plan}", + "dashboard.trialTitle": "Prova · {plan}", "dashboard.trialMessageDated": "La prova termina il {date}. {credits} crediti rimanenti.", "dashboard.trialMessage": "{credits} crediti rimanenti nella prova.", "dashboard.lowCreditsTitle": "Crediti in esaurimento", "dashboard.lowCreditsMessage": "Restano {remaining} di {total} crediti. Ricarica o passa a un piano superiore prima che i processi si fermino.", "dashboard.latestJobs": "Ultimi processi di elaborazione", - "dashboard.noJobsEmpty": "Ancora nessun processo — importa prima i prodotti.", + "dashboard.noJobsEmpty": "Ancora nessun processo — importa prima i prodotti.", "dashboard.noJobsReady": "Nessun processo recente. Avviane uno da Prodotti quando sei pronto.", "dashboard.startJob": "Avvia un job da Prodotti", "dashboard.quickLinksHint": "Feed, prodotti, processi ed esportazione.", "dashboard.feedsImportMap": "Importa e mappa", "dashboard.productsBrowse": "Sfoglia ed elabora", - "dashboard.jobsMonitor": "Monitora le attività", + "dashboard.jobsMonitor": "Monitora le attività", "dashboard.exportsTemplates": "Modelli e download", "activation.title": "Per iniziare", - "activation.description": "Descrybe importa un catalogo, lo arricchisce e lo elabora, poi esporta o lo invia agli store. Completa il passo corrente e continua — il tour demo spiega le schermate senza modificare l’avanzamento della checklist.", - "activation.descriptionShort": "Inizia dal passo evidenziato qui sotto — un’azione alla volta. Collegare un negozio è facoltativo.", + "activation.description": "Descrybe importa un catalogo, lo arricchisce e lo elabora, poi esporta o lo invia agli store. Completa il passo corrente e continua — il tour demo spiega le schermate senza modificare l’avanzamento della checklist.", + "activation.descriptionShort": "Inizia dal passo evidenziato qui sotto — un’azione alla volta. Collegare un negozio è facoltativo.", "activation.nextCta": "Esegui questo passo", "activation.valueProp": "Descrybe importa un catalogo, lo arricchisce e lo elabora, poi esporta o lo invia ai tuoi store.", - "activation.alreadyDone": "Già fatto", + "activation.alreadyDone": "Già fatto", "activation.skipForNow": "Salta per ora", "activation.showAllSteps": "Mostra tutti i {total} passi", "activation.showFewerSteps": "Mostra meno passi", "activation.corePathLabel": "In breve", - "activation.corePath": "Catalogo in ingresso → Arricchisci / elabora → Esporta o invia agli store", - "activation.storeWizardHint": "Non obbligatorio per feed o export — salta a meno che tu non voglia inviare prodotti a un negozio live.", + "activation.corePath": "Catalogo in ingresso → Arricchisci / elabora → Esporta o invia agli store", + "activation.storeWizardHint": "Non obbligatorio per feed o export — salta a meno che tu non voglia inviare prodotti a un negozio live.", "activation.storeWizardCta": "Avvia configurazione guidata", - "activation.focus.map": "Avanti: apri Map su un feed, abbina le colonne e salva. Aggiungi prima un feed se l’elenco è vuoto.", - "activation.focus.sync": "Avanti: sincronizza un campione dopo aver salvato la mappatura. Usa Sync su un feed mappato — evita fonti non mappate.", + "activation.focus.map": "Avanti: apri Map su un feed, abbina le colonne e salva. Aggiungi prima un feed se l’elenco è vuoto.", + "activation.focus.sync": "Avanti: sincronizza un campione dopo aver salvato la mappatura. Usa Sync su un feed mappato — evita fonti non mappate.", "activation.focus.dismiss": "Chiudi suggerimento", "activation.dismiss": "Nascondi checklist", "hypercare.report.title": "Hypercare di cutover", - "hypercare.report.message": "Dati mancanti o errati dopo la migrazione? Segnalalo così possiamo correggere il tuo workspace.", + "hypercare.report.message": "Dati mancanti o errati dopo la migrazione? Segnalalo così possiamo correggere il tuo workspace.", "hypercare.report.cta": "Segnala dati mancanti o errati", "hypercare.report.dismiss": "Ignora", "hypercare.report.adminTriage": "Apri coda hypercare", "etl.gaps.title": "What did not migrate", - "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", + "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", "etl.gaps.dismiss": "Dismiss", "etl.gaps.apiKeys.title": "API keys", - "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", + "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", "etl.gaps.apiKeys.cta": "Open API keys", "etl.gaps.blobs.title": "File contents (blobs)", - "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", + "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", "etl.gaps.blobs.countHint": "{count} file records are metadata-only (bytes were not migrated).", "etl.gaps.blobs.cta": "Open Files", "etl.gaps.jobs.title": "Processing history", "etl.gaps.jobs.body": "Legacy job and task history was not backfilled for cutover. New jobs you start here will appear normally.", - "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", + "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", "etl.gaps.jobs.migratedHint": "{count} jobs were tagged migrated from an optional backfill.", "etl.gaps.jobs.cta": "Open Processing", "etl.gaps.woo.title": "Store credentials", - "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", + "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", "etl.gaps.woo.cta": "Open Stores", "etl.gaps.settings.title": "Company settings", "etl.gaps.settings.body": "Only language and merge-products settings were imported. Re-check other company preferences in Settings.", @@ -390,18 +390,18 @@ export const it: MessageDict = { "activation.progress": "{done} di {total} completati", "activation.stepsLabel": "Passaggi di attivazione", "activation.pausedTitle": "Per iniziare in pausa", - "activation.pausedBody": "Riprendi in qualsiasi momento — dai campi prodotto all’export. Collegare un negozio resta facoltativo.", + "activation.pausedBody": "Riprendi in qualsiasi momento — dai campi prodotto all’export. Collegare un negozio resta facoltativo.", "activation.resume": "Riprendi checklist", "activation.step.enable-fields.title": "Abilita campi prodotto", "activation.step.enable-fields.body": "Scegli quali colonne prodotto standard Descrybe deve mappare e pulire.", "activation.step.connect-source.title": "Aggiungi un feed prodotti", - "activation.step.connect-source.body": "Aggiungi un feed catalogo CSV o XML così i prodotti entrano in Descrybe. Collegare un negozio live è un passaggio facoltativo successivo.", + "activation.step.connect-source.body": "Aggiungi un feed catalogo CSV o XML così i prodotti entrano in Descrybe. Collegare un negozio live è un passaggio facoltativo successivo.", "activation.step.map.title": "Mappa colonne del feed", "activation.step.map.body": "In Feeds, apri Map sul tuo feed, abbina le colonne del fornitore e salva.", "activation.step.sync-sample.title": "Sincronizza un campione", - "activation.step.sync-sample.body": "In Feeds, sincronizza un piccolo campione da un feed mappato per verificare la mappatura prima dell’esecuzione completa.", + "activation.step.sync-sample.body": "In Feeds, sincronizza un piccolo campione da un feed mappato per verificare la mappatura prima dell’esecuzione completa.", "activation.step.process.title": "Elabora prodotti", - "activation.step.process.body": "Apri i prodotti non elaborati ed esegui l’elaborazione per generare contenuti di catalogo puliti.", + "activation.step.process.body": "Apri i prodotti non elaborati ed esegui l’elaborazione per generare contenuti di catalogo puliti.", "activation.step.store-connect.title": "Collega un negozio", "activation.step.store-connect.body": "Facoltativo. Collega WooCommerce o Shopify per inviare prodotti al tuo negozio. Salta se usi solo feed ed export.", "activation.step.export.title": "Crea un export", @@ -412,14 +412,14 @@ export const it: MessageDict = { "stats.feeds": "Feed", "stats.credits": "Crediti", "stats.openCatalog": "Apri catalogo", - "stats.productsHint": "Catalogo {processed} · coda {unprocessed} (conteggi separati)", + "stats.productsHint": "Catalogo {processed} · coda {unprocessed} (conteggi separati)", "stats.catalogTree": "Albero catalogo", "stats.attributeLibrary": "Libreria attributi", "stats.importSources": "Origini di importazione", "stats.payAsYouGo": "Pay as you go", - "stats.walletBilling": "Wallet · Fatturazione", - "stats.enterpriseBilling": "Enterprise · Fatturazione", - "stats.usedBilling": "{used} usati · Fatturazione", + "stats.walletBilling": "Wallet · Fatturazione", + "stats.enterpriseBilling": "Enterprise · Fatturazione", + "stats.usedBilling": "{used} usati · Fatturazione", "processing.jobStatus.processing": "Elaborazione", "processing.jobStatus.completed": "Completato", "processing.jobStatus.failed": "Non riuscito", @@ -445,19 +445,19 @@ export const it: MessageDict = { "processing.type.seo": "SEO", "processing.type.normalize": "Normalizza", "errors.requestFailed": "Richiesta non riuscita", - "errors.maintenance": "Il sistema è in manutenzione. Riprova più tardi.", - "errors.readOnly": "Il sistema è in modalità sola lettura. Le modifiche sono temporaneamente disabilitate.", + "errors.maintenance": "Il sistema è in manutenzione. Riprova più tardi.", + "errors.readOnly": "Il sistema è in modalità sola lettura. Le modifiche sono temporaneamente disabilitate.", "errors.companyAdminDenied": "Solo gli amministratori dell'azienda possono {action}. Chiedi aiuto a un amministratore.", "errors.companyAdminDenied.actionDefault": "fare questo", - "docs.tryIt.memberCannotCreate": "Solo gli admin azienda possono creare chiavi API. Le chiavi legacy non sono state migrate — incolla una chiave sotto o chiedi a un admin di crearne una nuova.", - "docs.tryIt.noKeysLegacyAdmin": "Le chiavi API legacy non sono state migrate. Creane una con Use my API key o Impostazioni → Chiavi API — il secret è mostrato una sola volta.", - "docs.tryIt.noKeysLegacyMember": "Nessuna chiave API elencata. Le chiavi legacy non sono state migrate — chiedi a un admin di crearne una, o incolla una chiave dk_.", + "docs.tryIt.memberCannotCreate": "Solo gli admin azienda possono creare chiavi API. Le chiavi legacy non sono state migrate — incolla una chiave sotto o chiedi a un admin di crearne una nuova.", + "docs.tryIt.noKeysLegacyAdmin": "Le chiavi API legacy non sono state migrate. Creane una con Use my API key o Impostazioni → Chiavi API — il secret è mostrato una sola volta.", + "docs.tryIt.noKeysLegacyMember": "Nessuna chiave API elencata. Le chiavi legacy non sono state migrate — chiedi a un admin di crearne una, o incolla una chiave dk_.", "errors.couldNotUpdateLanguage": "Impossibile aggiornare la lingua", "toast.support.replyTitle": "Risposta del supporto", "toast.support.replyBody": "Lo staff ha risposto al tuo ticket di supporto.", "toast.support.replyRe": "Re: {subject}", "toast.support.statusTitle": "Stato ticket aggiornato", - "toast.support.statusBody": "Lo stato del tuo ticket di supporto è cambiato.", + "toast.support.statusBody": "Lo stato del tuo ticket di supporto è cambiato.", "toast.support.updateTitle": "Aggiornamento supporto", "assistant.label": "Assistente", "assistant.open": "Apri l'assistente di sistema", @@ -474,13 +474,13 @@ export const it: MessageDict = { "tutorial.resumeLastStep": "Riprendi ultimo passaggio", "tutorial.startFromBeginning": "Inizia dall'inizio", "tutorial.stepOf": "Passaggio {current} di {total}", - "tutorial.jumpTo": "Vai a…", + "tutorial.jumpTo": "Vai a…", "tutorial.jumpToSectionAria": "Vai alla sezione", "tutorial.back": "Indietro", "tutorial.pause": "Pausa", "tutorial.continue": "Continua", "tutorial.finishTour": "Termina tour", - "tutorial.missingTargetHint": "Quel controllo non è ancora in questa schermata. Puoi comunque Continua: il tour non richiede mai salvataggio o sincronizzazione.", + "tutorial.missingTargetHint": "Quel controllo non è ancora in questa schermata. Puoi comunque Continua: il tour non richiede mai salvataggio o sincronizzazione.", "tutorial.section.welcome": "Welcome", "tutorial.section.catalog": "Catalog setup", "tutorial.section.sources": "Feeds", @@ -490,77 +490,77 @@ export const it: MessageDict = { "tutorial.section.grow": "Grow", "tutorial.section.done": "Done", "tutorial.step.welcome.title": "Benvenuto in Descrybe", - "tutorial.step.welcome.body": "Il ciclo centrale di Descrybe è Feeds → Process → Export / Stores. Questa demo guidata evidenzia quelle schermate sul tuo dashboard reale — senza richiedere salvataggi, sync, abilitazione campi o creazione feed. Metti in pausa quando vuoi; riprendi dall’header. Salta a una sezione se ti serve aiuto su un solo argomento.", - "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", + "tutorial.step.welcome.body": "Il ciclo centrale di Descrybe è Feeds → Process → Export / Stores. Questa demo guidata evidenzia quelle schermate sul tuo dashboard reale — senza richiedere salvataggi, sync, abilitazione campi o creazione feed. Metti in pausa quando vuoi; riprendi dall’header. Salta a una sezione se ti serve aiuto su un solo argomento.", + "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", "tutorial.step.welcome.nextLabel": "Start tour", - "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", + "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", "tutorial.step.dashboard-overview.title": "Il tuo centro di comando", - "tutorial.step.dashboard-overview.body": "La striscia del workflow catalogo mostra il percorso quotidiano: Feeds → Map → Sync → Process. Getting started traccia il progresso reale del workspace (separato da questa demo). Quando sei pronto, usa Manage feeds o Start processing — poi esporta o collega uno store.", - "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", + "tutorial.step.dashboard-overview.body": "La striscia del workflow catalogo mostra il percorso quotidiano: Feeds → Map → Sync → Process. Getting started traccia il progresso reale del workspace (separato da questa demo). Quando sei pronto, usa Manage feeds o Start processing — poi esporta o collega uno store.", + "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", "tutorial.step.dashboard-overview.missingHint": "The workflow strip and checklist appear after the dashboard loads.", "tutorial.step.enable-fields.title": "Campi standard", - "tutorial.step.enable-fields.body": "I Standard Fields sono le colonne prodotto che Descrybe mappa, elabora ed esporta — titolo, descrizione, GTIN, immagini e altro. Enable recommended attiva un set predefinito sensato per la maggior parte dei cataloghi. Puoi raffinare l'elenco dopo senza rompere i mapping esistenti.", - "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", + "tutorial.step.enable-fields.body": "I Standard Fields sono le colonne prodotto che Descrybe mappa, elabora ed esporta — titolo, descrizione, GTIN, immagini e altro. Enable recommended attiva un set predefinito sensato per la maggior parte dei cataloghi. Puoi raffinare l'elenco dopo senza rompere i mapping esistenti.", + "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", "tutorial.step.enable-fields.warning": "Enabling or disabling fields affects mapping and processing for this company. Prefer Enable recommended once, then tweak carefully.", "tutorial.step.enable-fields.missingHint": "Wait for the Fields page to load, or open Fields from the Catalog section in the sidebar.", "tutorial.step.catalog-depth.title": "Categorie e attributi", "tutorial.step.catalog-depth.body": "Nella sezione Catalog della sidebar trovi anche Categories e Attributes. Categories organizzano il catalogo; gli attributi alimentano filtri e descrizioni strutturate. Non serve configurarli per finire questo tour.", - "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", + "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", "tutorial.step.catalog-depth.missingHint": "Expand Catalog in the sidebar to open Categories or Attributes after the tour.", "tutorial.step.connect-source.title": "Aggiungi un'origine prodotti", - "tutorial.step.connect-source.body": "I feed sono come i cataloghi dei fornitori entrano in Descrybe — file CSV, XML o URL. Add Feed crea una nuova origine; ogni riga mostra lo stato (pronto per il mapping, mappato, attivo). Map apre la schermata di abbinamento campi per quel feed.", - "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", + "tutorial.step.connect-source.body": "I feed sono come i cataloghi dei fornitori entrano in Descrybe — file CSV, XML o URL. Add Feed crea una nuova origine; ogni riga mostra lo stato (pronto per il mapping, mappato, attivo). Map apre la schermata di abbinamento campi per quel feed.", + "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", "tutorial.step.connect-source.warning": "Avoid deleting live feeds unless you intend to remove that source and its sync history.", - "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", + "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", "tutorial.step.map.title": "Mappa i campi origine", - "tutorial.step.map.body": "Nella schermata Map di un feed abbini le colonne del fornitore ai standard fields Descrybe. Auto-map suggerisce corrispondenze dai nomi colonna; conferma quelle approssimative, poi correggi il resto. Save Mappings salva la mappa così sync ed elaborazione sanno leggere ogni riga.", - "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", - "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", + "tutorial.step.map.body": "Nella schermata Map di un feed abbini le colonne del fornitore ai standard fields Descrybe. Auto-map suggerisce corrispondenze dai nomi colonna; conferma quelle approssimative, poi correggi il resto. Save Mappings salva la mappa così sync ed elaborazione sanno leggere ogni riga.", + "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", + "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", "tutorial.step.map.missingHint": "Add a feed and click Map to see the mapping UI; or Continue to keep learning.", "tutorial.step.sync-sample.title": "Sincronizza un campione (quando pronto)", - "tutorial.step.sync-sample.body": "Dopo aver salvato i mapping, Sync + Process sample recupera un piccolo lotto ed esegue l'elaborazione per verificare titoli, immagini e attributi prima di un run completo. Full Sync now nell'elenco feed serve a import più ampi quando il campione è a posto.", - "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", + "tutorial.step.sync-sample.body": "Dopo aver salvato i mapping, Sync + Process sample recupera un piccolo lotto ed esegue l'elaborazione per verificare titoli, immagini e attributi prima di un run completo. Full Sync now nell'elenco feed serve a import più ampi quando il campione è a posto.", + "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", "tutorial.step.sync-sample.warning": "Syncing writes products into this company. Prefer a sample first; avoid Sync now on unmapped feeds.", "tutorial.step.sync-sample.missingHint": "Sync controls appear on feed rows and on the mapping screen footer.", "tutorial.step.process.title": "Rivedi i prodotti", "tutorial.step.process.body": "Products elenca articoli sincronizzati e processati. Filtra per stato, apri una riga per i dettagli e usa i badge EPREL quando ci sono dati di etichetta energetica. Qui individui errori di mapping prima di export o sync store.", - "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", + "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", "tutorial.step.process.missingHint": "Wait for the products table, or Continue if the catalog is still empty.", "tutorial.step.processing-hub.title": "Elaborazione in background", "tutorial.step.processing-hub.body": "I job in Processing mostrano avanzamento AI e pipeline: esecuzioni completate e errori. Avvia job da dashboard o prodotti quando vuoi spendere crediti su un batch.", - "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", + "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", "tutorial.step.processing-hub.missingHint": "Open Jobs from the Processing section in the sidebar if the page is empty.", "tutorial.step.stores-hub.title": "Store e piattaforme", - "tutorial.step.stores-hub.body": "Dopo il processing, Stores collega WooCommerce o Shopify per inviare il catalogo pulito al tuo negozio. Usalo quando marketplace/CMS è la destinazione — o passa a Export feeds se i partner bastano file/URL.", - "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", + "tutorial.step.stores-hub.body": "Dopo il processing, Stores collega WooCommerce o Shopify per inviare il catalogo pulito al tuo negozio. Usalo quando marketplace/CMS è la destinazione — o passa a Export feeds se i partner bastano file/URL.", + "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", "tutorial.step.stores-hub.missingHint": "Open Stores from the sidebar to see connection cards.", "tutorial.step.export.title": "Esporta prodotti puliti", - "tutorial.step.export.body": "Gli export feeds pubblicano prodotti puliti come XML o CSV per canali, partner o il tuo negozio. Crea un export, scegli formato e filtri, poi condividi l'URL del feed o scarica. Gli export leggono dati di catalogo elaborati — mappa ed elabora prima per risultati migliori.", - "tutorial.step.export.tip": "You don’t need to create an export during the demo.", - "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", + "tutorial.step.export.body": "Gli export feeds pubblicano prodotti puliti come XML o CSV per canali, partner o il tuo negozio. Crea un export, scegli formato e filtri, poi condividi l'URL del feed o scarica. Gli export leggono dati di catalogo elaborati — mappa ed elabora prima per risultati migliori.", + "tutorial.step.export.tip": "You don’t need to create an export during the demo.", + "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", "tutorial.step.export.missingHint": "Wait for Export feeds to load, or open Exports from the Feeds section in the sidebar.", "tutorial.step.billing-hub.title": "Crediti e fatturazione", "tutorial.step.billing-hub.body": "Billing mostra piano, wallet e crediti rimanenti. Elaborazione e alcune funzioni AI attingono a questo saldo. Controlla l'uso prima di grandi run di catalogo.", - "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", + "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", "tutorial.step.billing-hub.missingHint": "Open Billing from the Account section in the sidebar.", "tutorial.step.grow-hub.title": "Campagne, SEO e recensioni", - "tutorial.step.grow-hub.body": "In Marketing: Campaigns genera contenuti, Content calendar pianifica post, SEO verifica gli listing e Reviews si collega a WooCommerce. Si basano su un catalogo ben mappato — completa Feeds → Process → Export / Stores prima di affidarti a loro.", - "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", + "tutorial.step.grow-hub.body": "In Marketing: Campaigns genera contenuti, Content calendar pianifica post, SEO verifica gli listing e Reviews si collega a WooCommerce. Si basano su un catalogo ben mappato — completa Feeds → Process → Export / Stores prima di affidarti a loro.", + "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", "tutorial.step.grow-hub.missingHint": "Open Campaigns from Marketing in the sidebar, or Continue.", "tutorial.step.tour-done.title": "Pronto a esplorare", - "tutorial.step.tour-done.body": "Questa è la mappa prodotto: Feeds → Map → Sync → Process → Export / Stores. Usa Getting started sul dashboard per la configurazione reale. Riprendi o riavvia il tour dall’header in qualsiasi momento, o Jump to… una sezione. Skip tour termina la demo senza cambiare la checklist.", - "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", + "tutorial.step.tour-done.body": "Questa è la mappa prodotto: Feeds → Map → Sync → Process → Export / Stores. Usa Getting started sul dashboard per la configurazione reale. Riprendi o riavvia il tour dall’header in qualsiasi momento, o Jump to… una sezione. Skip tour termina la demo senza cambiare la checklist.", + "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", "tutorial.step.tour-done.nextLabel": "Finish tour", "tutorial.step.tour-done.missingHint": "Return to the dashboard to finish.", "news.uxImprovements.title": "Miglioramenti dell'esperienza utente", "flash.contentLanguageUpdated": "Lingua dei contenuti aggiornata.", - "theme.darkMode": "Modalità scura", - "theme.lightMode": "Modalità chiara", + "theme.darkMode": "Modalità scura", + "theme.lightMode": "Modalità chiara", "forbidden.title.accessRestricted": "Accesso limitato", "forbidden.title.permissionDenied": "Permesso negato", - "forbidden.message.support": "Quest’area è disponibile solo allo staff di supporto e agli amministratori della piattaforma.", - "forbidden.message.platform": "Quest’area è disponibile solo agli amministratori della piattaforma.", - "forbidden.message.company": "Non hai l’autorizzazione. Chiedi aiuto a un amministratore dell’azienda.", + "forbidden.message.support": "Quest’area è disponibile solo allo staff di supporto e agli amministratori della piattaforma.", + "forbidden.message.platform": "Quest’area è disponibile solo agli amministratori della piattaforma.", + "forbidden.message.company": "Non hai l’autorizzazione. Chiedi aiuto a un amministratore dell’azienda.", "forbidden.backToDashboard": "Torna alla dashboard", "admin.chrome.platformOps": "Ops piattaforma", "admin.chrome.sidebar": "Barra laterale ops piattaforma", @@ -595,7 +595,7 @@ export const it: MessageDict = { "admin.sales.description": "Inbound Contact sales messages and custom payment quotes.", "admin.sales.listTitle": "Leads", "admin.sales.listDesc": "{total} matching leads", - "admin.sales.searchPlaceholder": "Search name, email, company…", + "admin.sales.searchPlaceholder": "Search name, email, company…", "admin.sales.statusAll": "All statuses", "admin.sales.status.new": "New", "admin.sales.status.contacted": "Contacted", @@ -643,7 +643,7 @@ export const it: MessageDict = { "admin.sales.col.status": "Status", "admin.sales.col.created": "Created", "sales.contact.title": "Contact sales", - "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", + "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", "sales.contact.formTitle": "Send a message", "sales.contact.formLead": "Enterprise and custom deals are prepared by our team, then paid via Stripe Checkout.", "sales.contact.name": "Name", @@ -653,25 +653,25 @@ export const it: MessageDict = { "sales.contact.estimatedSkus": "Estimated SKUs (optional)", "sales.contact.message": "How can we help?", "sales.contact.submit": "Send message", - "sales.contact.submitting": "Sending…", + "sales.contact.submitting": "Sending…", "sales.contact.error": "Could not send your message. Please try again.", - "sales.contact.toast.success": "Message sent — we will follow up soon.", - "sales.contact.thanksTitle": "Thanks — we got your message", + "sales.contact.toast.success": "Message sent — we will follow up soon.", + "sales.contact.thanksTitle": "Thanks — we got your message", "sales.contact.thanksBody": "A platform admin will review your request and can send a Checkout link for a custom plan.", "sales.contact.bookDemo": "Book a live demo", "sales.contact.orBookDemo": "Or book a Calendly demo", "sales.contact.backPricing": "Back to pricing", "admin.overview.eyebrow": "Centro di comando", "admin.overview.title": "Panoramica piattaforma", - "admin.overview.description": "Battito live della piattaforma dal riepilogo analytics — vai a ops, insight e supporto.", + "admin.overview.description": "Battito live della piattaforma dal riepilogo analytics — vai a ops, insight e supporto.", "admin.overview.tokens": "Gettoni", - "admin.overview.tokensHint": "Di sempre · periodo", + "admin.overview.tokensHint": "Di sempre · periodo", "admin.overview.credits": "Crediti", "admin.overview.creditsHint": "Su tutte le aziende", "admin.overview.jobs": "Job", "admin.overview.jobsHint": "Istantanea coda", "admin.overview.platform": "Piattaforma", - "admin.overview.platformHint": "Tenant · volume", + "admin.overview.platformHint": "Tenant · volume", "admin.overview.signals": "Segnali recenti", "admin.overview.shortcuts": "Scorciatoie ops", "admin.overview.providers": "Mix provider IA", @@ -692,14 +692,14 @@ export const it: MessageDict = { "admin.overview.shortcut.users.title": "Utenti e org", "admin.overview.shortcut.users.desc": "Account, aziende, inviti", "admin.overview.shortcut.stuck.title": "Prodotti bloccati", - "admin.overview.shortcut.stuck.desc": "In esecuzione da più di 2 ore", + "admin.overview.shortcut.stuck.desc": "In esecuzione da più di 2 ore", "admin.overview.signal.stuckTitle": "{count} job bloccato", "admin.overview.signal.stuckTitlePlural": "{count} job bloccati", - "admin.overview.signal.stuckDetail": "In esecuzione da più di 2 ore — controlla e reimposta se necessario.", + "admin.overview.signal.stuckDetail": "In esecuzione da più di 2 ore — controlla e reimposta se necessario.", "admin.overview.signal.stuckCta": "Apri job bloccati", "admin.overview.signal.failedTitle": "{count} non riusciti negli ultimi {days} g", "admin.overview.signal.failedDetail": "{completed} completati nella stessa finestra.", - "admin.overview.signal.failedDetailRate": "{rate}% tasso di errore · {completed} completati.", + "admin.overview.signal.failedDetailRate": "{rate}% tasso di errore · {completed} completati.", "admin.overview.signal.failedCta": "Apri diagnostica", "admin.overview.signal.runningTitle": "{count} job in esecuzione", "admin.overview.signal.runningTitlePlural": "{count} job in esecuzione", @@ -718,21 +718,21 @@ export const it: MessageDict = { "admin.overview.badge.clear": "Cancella", "admin.overview.summaryLoadFailed": "Impossibile caricare il riepilogo live. Le scorciatoie sotto funzionano ancora.", "admin.overview.keyMetrics": "Metriche chiave", - "admin.overview.summaryWindow": "Ultimi {days} g · endpoint riepilogo", + "admin.overview.summaryWindow": "Ultimi {days} g · endpoint riepilogo", "admin.overview.tokensPeriod": "{count} negli ultimi {days} g", "admin.overview.creditsFoot": "{remaining} rimanenti su {allocated} assegnati", - "admin.overview.jobsFoot": "{failed} falliti · {running} in corso · {stuck} bloccati", - "admin.overview.platformFoot": "{users} utenti · {processed} elaborati · {feeds} feed in ingresso", + "admin.overview.jobsFoot": "{failed} falliti · {running} in corso · {stuck} bloccati", + "admin.overview.platformFoot": "{users} utenti · {processed} elaborati · {feeds} feed in ingresso", "admin.overview.fullDiagnostics": "Diagnostica completa", "admin.overview.also": "Anche:", "admin.overview.linkSupport": "Desk di supporto", "admin.overview.charts": "Grafici", - "admin.overview.providerFoot": "{jobs} job · {products} prodotti", + "admin.overview.providerFoot": "{jobs} job · {products} prodotti", "admin.analytics.eyebrow": "Insight", "admin.analytics.title": "Analisi e report", "admin.analytics.description": "KPI e tendenze live della piattaforma da token, job, iscrizioni, feed, ticket e fatturazione.", "admin.analytics.period": "Periodo", - "admin.analytics.refreshing": "Aggiornamento…", + "admin.analytics.refreshing": "Aggiornamento…", "admin.analytics.llmTokens": "Token LLM", "admin.analytics.credits": "Crediti", "admin.analytics.jobs": "Job", @@ -744,7 +744,7 @@ export const it: MessageDict = { "admin.analytics.internalAi": "IA interna", "admin.analytics.internalAiHint": "OpenAI piattaforma (impostazioni admin)", "admin.analytics.popularKeys": "Chiavi popolari", - "admin.analytics.popularKeysHint": "OpenAI / Groq / … del tenant", + "admin.analytics.popularKeysHint": "OpenAI / Groq / … del tenant", "admin.analytics.customUrl": "URL/modello personalizzato", "admin.analytics.customUrlHint": "URL di base tenant + modello + chiave", "admin.analytics.tokensByDay": "Token per giorno", @@ -761,7 +761,7 @@ export const it: MessageDict = { "admin.analytics.feedSyncStatus": "feed_sync_jobs per stato", "admin.analytics.ticketsStatus": "support_tickets per stato", "admin.analytics.providerDetail": "Dettaglio provider", - "admin.analytics.providerDetailHint": "Principali modalità provider (limitate per dimensione payload).", + "admin.analytics.providerDetailHint": "Principali modalità provider (limitate per dimensione payload).", "admin.analytics.noProviderRows": "Nessuna riga provider", "admin.analytics.provider": "Provider", "admin.analytics.class": "Classe", @@ -769,7 +769,7 @@ export const it: MessageDict = { "admin.analytics.productsCol": "Prodotti", "admin.analytics.companiesHint": "Principali aziende per token con suddivisione provider", "admin.analytics.noCompanies": "Nessuna azienda", - "admin.analytics.noCompaniesMsg": "L'elenco aziende è vuoto.", + "admin.analytics.noCompaniesMsg": "L'elenco aziende è vuoto.", "admin.analytics.company": "Azienda", "admin.analytics.internal": "Interno", "admin.analytics.popular": "Popolare", @@ -842,7 +842,7 @@ export const it: MessageDict = { "admin.settings.mailCardDesc": "Inviti set-password e e-mail in uscita della piattaforma", "admin.settings.integrationsCardDesc": "OAuth, EPREL, Pinecone, Stripe, feed", "admin.settings.tenantVsPlatform": "Tenant vs piattaforma", - "admin.settings.hostSecrets": "Segreti di database, sessione e firma del server — configurare solo sull'host", + "admin.settings.hostSecrets": "Segreti di database, sessione e firma del server — configurare solo sull'host", "admin.settings.linkAi": "IA", "admin.settings.linkEmail": "Posta", "admin.settings.linkBilling": "Fatturazione", @@ -879,7 +879,7 @@ export const it: MessageDict = { "admin.settings.priceScaleMo": "Scale monthly price ID", "admin.settings.priceScaleYr": "Scale yearly price ID", "admin.settings.creditPackPrices": "AI credit pack price IDs (one-time)", - "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", + "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", "admin.settings.syncCreditPacks": "Sync Stripe packs", "admin.settings.syncCreditPacksOk": "Synced {count} credit pack price(s) ({mode} mode).", "admin.settings.syncCreditPacksModeHint": "Stripe mode for this sync: {mode}. Switch the secret key (sk_test_ vs sk_live_) to sync the other environment.", @@ -913,11 +913,11 @@ export const it: MessageDict = { "admin.readiness.linkApiKeys": "Keys needing reissue", "admin.diagnostics.eyebrow": "Piattaforma", "admin.diagnostics.title": "Diagnostica", - "admin.diagnostics.description": "Console ops per salute app, profondità coda, job recenti e flag di config. Secret e DSN non sono mai mostrati; gli errori dei job sono sanitizzati.", + "admin.diagnostics.description": "Console ops per salute app, profondità coda, job recenti e flag di config. Secret e DSN non sono mai mostrati; gli errori dei job sono sanitizzati.", "admin.diagnostics.filterAria": "Filtro stato job", "admin.diagnostics.queue": "Coda", "admin.diagnostics.noJobsInQueue": "Nessun job in coda.", - "admin.diagnostics.sanitizedErrors": "Errori sanitizzati · max 25", + "admin.diagnostics.sanitizedErrors": "Errori sanitizzati · max 25", "admin.diagnostics.colId": "ID", "admin.diagnostics.colCompany": "Azienda", "admin.diagnostics.colStatus": "Stato", @@ -928,15 +928,15 @@ export const it: MessageDict = { "admin.diagnostics.colWhen": "Quando", "admin.diagnostics.noJobsFilter": "Nessun job per questo filtro.", "admin.stuck.title": "Prodotti bloccati", - "admin.stuck.description": "Esamina i job di elaborazione recenti e reimposta quelli bloccati da più di 2 ore", + "admin.stuck.description": "Esamina i job di elaborazione recenti e reimposta quelli bloccati da più di 2 ore", "admin.stuck.noJobs": "Nessun job trovato.", "admin.stuck.filterAria": "Filtra i job per stato", "admin.orphan.title": "Orphan processed", - "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", + "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", "admin.orphan.cutoverHint": "Safe by default: refresh and dry-run never delete. Confirm delete sends confirm=true only after you approve the dialog.", "admin.orphan.refreshReport": "Refresh report", "admin.orphan.dryRunBtn": "Dry-run cleanup", - "admin.orphan.deleteBtn": "Confirm delete…", + "admin.orphan.deleteBtn": "Confirm delete…", "admin.orphan.loadFailed": "Could not load orphan report", "admin.orphan.dryRunFailed": "Dry-run cleanup failed", "admin.orphan.deleteFailed": "Confirmed orphan cleanup failed", @@ -947,7 +947,7 @@ export const it: MessageDict = { "admin.orphan.samplesDesc": "Up to 25 most recently updated orphan catalog rows", "admin.orphan.cleanBadge": "Clean", "admin.orphan.needsCleanupBadge": "Needs cleanup", - "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", + "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", "admin.orphan.noSamples": "No sample rows in this report.", "admin.orphan.colProcessed": "Processed ID", "admin.orphan.colCompany": "Company", @@ -963,21 +963,21 @@ export const it: MessageDict = { "admin.orphan.confirmDesc": "This permanently deletes {total} processed_products row(s) whose raw is missing or unprocessed. Job product links use ON DELETE SET NULL.", "admin.orphan.confirmDelete": "Delete orphans", "admin.billing.title": "Admin fatturazione", - "admin.billing.description": "Gestisci piani, crediti, autorizzazioni funzionalità per pacchetto e switch di funzionalità a livello piattaforma.", + "admin.billing.description": "Gestisci piani, crediti, autorizzazioni funzionalità per pacchetto e switch di funzionalità a livello piattaforma.", "admin.billing.noCompanies": "Nessuna azienda trovata.", "admin.billing.noCompaniesFilter": "Nessuna azienda corrisponde a questo filtro.", "admin.billing.assignPlanTitle": "Assegna piano", "admin.billing.assignPlanDesc": "Collega un piano di fatturazione a un'azienda. I crediti prova facoltativi azzerano il saldo aziendale per il periodo di prova.", "admin.billing.creditsTitle": "Aggiungi / regola crediti", "admin.billing.creditsDesc": "Accredita o addebita il saldo di un'azienda.", - "admin.billing.searchCompany": "Cerca azienda…", + "admin.billing.searchCompany": "Cerca azienda…", "admin.knowledge.draft": "Bozza", "admin.knowledge.badge.draft": "Bozza", "admin.knowledge.newArticle": "Nuovo articolo", "admin.knowledge.editArticle": "Modifica articolo", "admin.knowledge.noMatchingArticles": "Nessun articolo corrispondente", "admin.knowledge.noArticles": "Nessun articolo di knowledge", - "admin.knowledge.emptyCategoryMsg": "La categoria «{category}» è pronta — aggiungi uno scheletro di articolo da far compilare a un agente contenuti.", + "admin.knowledge.emptyCategoryMsg": "La categoria «{category}» è pronta — aggiungi uno scheletro di articolo da far compilare a un agente contenuti.", "admin.knowledge.emptyArticlesMsg": "Aggiungi scheletri in stile FAQ con categorie e parole chiave. Lascia segnaposto nel corpo per gli agenti contenuti.", "admin.knowledge.col.title": "Titolo", "admin.knowledge.col.name": "Nome", @@ -988,9 +988,9 @@ export const it: MessageDict = { "admin.settings.enablePlatformSmtp": "Abilita SMTP piattaforma", "admin.plans.title": "Piani di abbonamento", "admin.plans.description": "Pubblico ladder, A1 / Legacy, Piattaforma Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Nascosto.", - "admin.plans.searchPlaceholder": "Cerca nome o descrizione…", + "admin.plans.searchPlaceholder": "Cerca nome o descrizione…", "admin.plans.searchAria": "Cerca piani", - "admin.plans.filterAria": "Filtra piani per visibilità", + "admin.plans.filterAria": "Filtra piani per visibilità", "admin.plans.filter.catalog": "Catalogo", "admin.plans.filter.public": "Pubblico", "admin.plans.filter.legacy": "Legacy", @@ -998,7 +998,7 @@ export const it: MessageDict = { "admin.plans.filter.hidden": "Nascosto", "admin.plans.filter.all": "Tutto", "admin.plans.col.plan": "Piano", - "admin.plans.col.visibility": "Visibilità", + "admin.plans.col.visibility": "Visibilità", "admin.plans.col.monthlyCredits": "Crediti mensili", "admin.plans.col.maxProducts": "Prodotti max.", "admin.plans.col.term": "Durata", @@ -1015,9 +1015,9 @@ export const it: MessageDict = { "admin.plans.permissionsAria": "Modifica permessi del piano for {name}", "admin.plans.showing": "Visualizzazione di {filtered} su {total} piani", "admin.plans.unlimited": "Illimitato", - "admin.plans.optionLabel": "{name} ({credits} crediti) · {kind}", + "admin.plans.optionLabel": "{name} ({credits} crediti) · {kind}", "admin.permissions.noteStrong": "Piano entitlements only.", - "admin.permissions.noteBody": "Questi interruttori definiscono cosa può includere questo pacchetto. I master on/off a livello di piattaforma sono nella scheda {global} — un piano può abilitare una funzione che resta comunque disattivata se lo switch di piattaforma è off.", + "admin.permissions.noteBody": "Questi interruttori definiscono cosa può includere questo pacchetto. I master on/off a livello di piattaforma sono nella scheda {global} — un piano può abilitare una funzione che resta comunque disattivata se lo switch di piattaforma è off.", "admin.permissions.globalTab": "Switch globali", "admin.permissions.title": "Autorizzazioni del piano", "admin.permissions.descCount": "{enabled}/{total} abilitati", @@ -1026,7 +1026,7 @@ export const it: MessageDict = { "admin.permissions.planDefaults": "predefinite del piano", "admin.permissions.badge.legacy": "Pacchetto legacy migrato", "admin.permissions.badge.publicLadder": "Pubblico ladder", - "admin.permissions.badge.ladderCustom": "Pubblico ladder · personalizzato flag", + "admin.permissions.badge.ladderCustom": "Pubblico ladder · personalizzato flag", "admin.permissions.badge.customDeal": "Personalizzato deal", "admin.permissions.badge.clientDeal": "Accordo cliente", "admin.permissions.badge.customOverrides": "Personalizzato overrides", @@ -1034,9 +1034,9 @@ export const it: MessageDict = { "admin.permissions.badge.customFlag": "Personalizzato flag", "admin.permissions.package": "Pacchetto", "admin.permissions.noPlans": "Nessun piano", - "admin.permissions.suffix.legacy": "· legacy", - "admin.permissions.suffix.default": " · predefinito", - "admin.permissions.suffix.custom": " · personalizzato", + "admin.permissions.suffix.legacy": "· legacy", + "admin.permissions.suffix.default": " · predefinito", + "admin.permissions.suffix.custom": " · personalizzato", "admin.permissions.section": "Sezione", "admin.permissions.allSections": "Tutte le sezioni", "admin.permissions.state": "Stato", @@ -1058,7 +1058,7 @@ export const it: MessageDict = { "admin.permissions.globallyOff": "Globally disattivo", "admin.permissions.enableSection": "Abilita sezione", "admin.permissions.disableSection": "Disabilita sezione", - "admin.permissions.noMatch": "Nessuna funzionalità corrisponde ai filtri attuali.", + "admin.permissions.noMatch": "Nessuna funzionalità corrisponde ai filtri attuali.", "admin.permissions.differs": "Differisce", "admin.permissions.platformOffHint": "Disattivo a livello di piattaforma anche se questo piano lo abilita.", "admin.permissions.sectionToggled": "{label} {state} per questo piano.", @@ -1074,39 +1074,39 @@ export const it: MessageDict = { "admin.profile.legacy.label": "Legacy", "admin.profile.legacy.description": "Migrated legacy navigation: catalog, feed, fatturazione, and impostazioni; no Indietroground Tasks, negozi, or marketing.", "admin.profile.free.label": "Gratuito", - "admin.profile.free.description": "Pubblico Free ladder — AI, chiave APIs, live email, and own-key AI disattivo.", + "admin.profile.free.description": "Pubblico Free ladder — AI, chiave APIs, live email, and own-key AI disattivo.", "admin.profile.starter.label": "Starter", - "admin.profile.starter.description": "Pubblico Starter — AI on; own-key AI disattivo.", + "admin.profile.starter.description": "Pubblico Starter — AI on; own-key AI disattivo.", "admin.profile.growth.label": "Growth", - "admin.profile.growth.description": "Tutte le funzionalità del catalogo attive.", + "admin.profile.growth.description": "Tutte le funzionalità del catalogo attive.", "admin.profile.business.label": "Business", - "admin.profile.business.description": "Tutte le funzionalità del catalogo attive.", + "admin.profile.business.description": "Tutte le funzionalità del catalogo attive.", "admin.profile.enterprise.label": "Enterprise / tutto attivo", - "admin.profile.enterprise.description": "Full matrice funzionalità (custom and Enterprise default).", + "admin.profile.enterprise.description": "Full matrice funzionalità (custom and Enterprise default).", "admin.gates.noteStrong": "Piattaforma-wide masters.", - "admin.gates.noteBody": "Questi interruttori valgono per ogni pacchetto. L’accesso effettivo è {combo}. I diritti per pacchetto restano nella scheda {permissions}.", - "admin.gates.combo": "permesso del piano E sezione globale E funzionalità globale", + "admin.gates.noteBody": "Questi interruttori valgono per ogni pacchetto. L’accesso effettivo è {combo}. I diritti per pacchetto restano nella scheda {permissions}.", + "admin.gates.combo": "permesso del piano E sezione globale E funzionalità globale", "admin.gates.permissionsTab": "Autorizzazioni del piano", "admin.gates.sectionsOff": "{count} section disattivo", "admin.gates.sectionsOffPlural": "{count} sections disattivo", "admin.gates.featuresOff": "{count} feature master disattivo", "admin.gates.featuresOffPlural": "{count} feature masters disattivo", - "admin.gates.title": "Master funzionalità globali", + "admin.gates.title": "Master funzionalità globali", "admin.gates.description": "Disable a feature here to turn it disattivo for every package, even when a plan enables it.", "admin.gates.section": "Sezione", "admin.gates.allSections": "Tutte le sezioni", "admin.gates.search": "Cerca", "admin.gates.searchPlaceholder": "Filtra per chiave o etichetta", "admin.gates.sectionOff": "Sezione disattivo", - "admin.gates.noMatch": "Nessuna funzionalità corrisponde ai filtri attuali.", + "admin.gates.noMatch": "Nessuna funzionalità corrisponde ai filtri attuali.", "admin.gates.featureAria": "{label} globale", "admin.gates.sectionsTitle": "Interruttori sezione globale", - "admin.gates.sectionsDesc": "Turn an entire prodotto area on or disattivo for all packages. “Sezione + features” also updates every feature master in that section.", + "admin.gates.sectionsDesc": "Turn an entire prodotto area on or disattivo for all packages. “Sezione + features” also updates every feature master in that section.", "admin.gates.sectionAria": "Sezione globale {label}", - "admin.gates.enableSectionFeatures": "Abilita sezione + funzionalità", - "admin.gates.disableSectionFeatures": "Disabilita sezione + funzionalità", + "admin.gates.enableSectionFeatures": "Abilita sezione + funzionalità", + "admin.gates.disableSectionFeatures": "Disabilita sezione + funzionalità", "admin.gates.sectionSuccess": "{label} {state} per tutti i pacchetti.", - "admin.gates.sectionSuccessWithFeatures": "{label} {state} per tutti i pacchetti (master di sezione e funzionalità).", + "admin.gates.sectionSuccessWithFeatures": "{label} {state} per tutti i pacchetti (master di sezione e funzionalità).", "admin.gates.featureSuccess": "{key} {state} a livello globale.", "admin.gates.state.enabled": "abilitato", "admin.gates.state.disabled": "disabilitato", @@ -1116,7 +1116,7 @@ export const it: MessageDict = { "admin.billing.createPlan": "Crea piano", "admin.billing.assignPlanBtn": "Assegna piano", "admin.billing.stat.plans": "Piani", - "admin.billing.stat.catalogHidden": "{catalog} catalogo · {hidden} nascosti", + "admin.billing.stat.catalogHidden": "{catalog} catalogo · {hidden} nascosti", "admin.billing.stat.creditsAllocated": "Crediti allocated", "admin.billing.stat.acrossCompanies": "Su tutte le aziende in questa pagina (prime 50)", "admin.billing.stat.creditsUsed": "Crediti used", @@ -1131,7 +1131,7 @@ export const it: MessageDict = { "admin.billing.cyclesDesc": "Elabora i rinnovi in scadenza per le aziende con cicli di fatturazione programmati.", "admin.billing.runCycles": "Run due cicli di fatturazione", "admin.billing.companiesTitle": "Aziende", - "admin.billing.companiesDesc": "Saldi crediti e stato del piano — assegna piani o regola i crediti.", + "admin.billing.companiesDesc": "Saldi crediti e stato del piano — assegna piani o regola i crediti.", "admin.billing.searchCompaniesAria": "Cerca aziende", "admin.billing.planStatusAria": "Stato del piano", "admin.billing.filter.all": "Tutto aziende", @@ -1151,7 +1151,7 @@ export const it: MessageDict = { "admin.billing.showingCompanies": "Visualizzazione di {filtered} su {total} aziende", "admin.billing.editPlanTitle": "Modifica plan", "admin.billing.createPlanTitle": "Crea piano", - "admin.billing.editPlanDesc": "Aggiorna crediti, limiti prodotto e se questo piano è contrassegnato come personalizzato.", + "admin.billing.editPlanDesc": "Aggiorna crediti, limiti prodotto e se questo piano è contrassegnato come personalizzato.", "admin.billing.createPlanDesc": "Crea un pacchetto. I piani personalizzati restano nascosti dal pricing pubblico.", "admin.billing.field.name": "Nome", "admin.billing.field.description": "Descrizione", @@ -1164,11 +1164,11 @@ export const it: MessageDict = { "admin.billing.term.monthly": "Mensile", "admin.billing.term.yearly": "Annuale", "admin.billing.customPackage": "Personalizzato package", - "admin.billing.customPackageHint": "Nascosto dal pricing pubblico. Usa per accordi con clienti; lascia disattivo per Free–Business.", + "admin.billing.customPackageHint": "Nascosto dal pricing pubblico. Usa per accordi con clienti; lascia disattivo per Free–Business.", "admin.billing.previewBadge": "Badge anteprima: {preview}.", "admin.billing.company": "Azienda", "admin.billing.selectCompany": "Seleziona azienda", - "admin.billing.noPlanSuffix": "· no plan", + "admin.billing.noPlanSuffix": "· no plan", "admin.billing.plan": "Piano", "admin.billing.selectPlan": "Seleziona piano", "admin.billing.trialAssignment": "Assegnazione di prova", @@ -1203,10 +1203,10 @@ export const it: MessageDict = { "admin.knowledge.badge.inactive": "Inattivo", "admin.knowledge.autoFirstResponses": "Abilita prime risposte automatiche", "admin.knowledge.faqMatching": "Corrispondenza FAQ / modello", - "admin.knowledge.retryOnReply": "Riprova alla prima risposta del cliente (se non c’è già un auto precedente)", + "admin.knowledge.retryOnReply": "Riprova alla prima risposta del cliente (se non c’è già un auto precedente)", "admin.knowledge.matchThreshold": "Soglia di confidenza match", "admin.knowledge.enableAiFallback": "Abilita fallback IA", - "admin.knowledge.deliveryMode": "Modalità di consegna", + "admin.knowledge.deliveryMode": "Modalità di consegna", "admin.knowledge.delivery.draft": "Solo bozza (nota interna)", "admin.knowledge.delivery.autoSend": "Invio automatico al cliente", "admin.knowledge.aiThreshold": "Soglia di confidenza IA", @@ -1219,7 +1219,7 @@ export const it: MessageDict = { "admin.knowledge.notReadyBadge": "Non pronto", "admin.knowledge.enabled": "Abilitato", "admin.knowledge.disabled": "Disabilitato", - "admin.knowledge.openAiRoles": "Apri Piattaforma impostazioni → AI roles", + "admin.knowledge.openAiRoles": "Apri Piattaforma impostazioni → AI roles", "admin.knowledge.field.title": "Titolo", "admin.knowledge.field.slug": "Slug", "admin.knowledge.field.body": "Corpo (markdown)", @@ -1228,16 +1228,16 @@ export const it: MessageDict = { "admin.knowledge.field.intents": "Chiavi intent", "admin.knowledge.intentsPlaceholder": "separati da virgola", "admin.knowledge.field.categories": "Categoria slugs", - "admin.knowledge.categoriesPlaceholder": "fatturazione, account…", - "admin.knowledge.field.weight": "Peso priorità", + "admin.knowledge.categoriesPlaceholder": "fatturazione, account…", + "admin.knowledge.field.weight": "Peso priorità", "admin.knowledge.publishedEligible": "Pubblicato (idoneo al matching)", "admin.knowledge.field.name": "Nome", "admin.knowledge.field.templateBody": "Corpo", "admin.knowledge.active": "Attivo", "admin.settings.card.aiRolesTitle": "Piattaforma AI roles", - "admin.settings.card.aiRolesDesc": "Elaborazione, vectorization, docs/API, and supporto — separate keys/models", + "admin.settings.card.aiRolesDesc": "Elaborazione, vectorization, docs/API, and supporto — separate keys/models", "admin.settings.roleOff": " (disattivo)", - "admin.settings.roleNotSet": "· not set", + "admin.settings.roleNotSet": "· not set", "admin.settings.someRolesUnavailable": "Some AI roles are not disponibile on this deployment yet. Elaborazione still uses the platform ApriAI impostazioni until all roles are supportoed.", "admin.settings.configure": "Configura", "admin.settings.card.smtpTitle": "Piattaforma SMTP", @@ -1246,7 +1246,7 @@ export const it: MessageDict = { "admin.settings.source": "origine: {source}", "admin.settings.smtpEnabled": "SMTP abilitato", "admin.settings.smtpDisabled": "SMTP disabilitato", - "admin.settings.passwordSet": "· password set", + "admin.settings.passwordSet": "· password set", "admin.settings.card.otherTitle": "Altre integrazioni", "admin.settings.oauthSet": "Google OAuth impostato", "admin.settings.oauthOff": "Google OAuth disattivo", @@ -1257,9 +1257,9 @@ export const it: MessageDict = { "admin.settings.stripeSet": "Stripe impostato", "admin.settings.stripeOff": "Stripe disattivo", "admin.settings.password": "Password", - "admin.settings.passwordSavedHint": "(salvato — leave blank to keep)", + "admin.settings.passwordSavedHint": "(salvato — leave blank to keep)", "admin.settings.secretKey": "Chiave segreta", - "admin.settings.secretConfiguredHint": "(configurato — lascia vuoto per mantenere)", + "admin.settings.secretConfiguredHint": "(configurato — lascia vuoto per mantenere)", "admin.settings.passwordConfigured": "Password configurata", "admin.settings.noSmtpPassword": "Nessuna password SMTP", "admin.settings.enabled": "Abilitato", @@ -1273,7 +1273,7 @@ export const it: MessageDict = { "admin.settings.testAccepted": "Messaggio di test accettato da SMTP", "admin.stuck.cleanupBtn": "Pulizia job bloccati (>2 ore in esecuzione)", "admin.stuck.jobsTitle": "Job di elaborazione", - "admin.stuck.jobsDesc": "Ultimi 100 job · {running} in esecuzione", + "admin.stuck.jobsDesc": "Ultimi 100 job · {running} in esecuzione", "admin.stuck.filterAll": "Tutto", "admin.stuck.filterRunning": "In esecuzione", "admin.stuck.filterFailed": "Non riuscito", @@ -1289,8 +1289,8 @@ export const it: MessageDict = { "admin.stuck.cleanupFailed": "Pulizia non riuscita", "admin.support.knowledgeLink": "Knowledge e auto-risposta", "admin.support.queueTitle": "Coda ticket", - "admin.support.queueMeta": "{total} · ambito {scope}", - "admin.support.queueMetaStatus": "· stato {status}", + "admin.support.queueMeta": "{total} · ambito {scope}", + "admin.support.queueMetaStatus": "· stato {status}", "admin.support.ticketCountOne": "{count} ticket", "admin.support.ticketCountMany": "{count} ticket", "admin.support.statusAll": "Tutto statuses", @@ -1304,7 +1304,7 @@ export const it: MessageDict = { "admin.support.colSubject": "Oggetto", "admin.support.colStatus": "Stato", "admin.support.colAuto": "Auto", - "admin.support.colPriority": "Priorità", + "admin.support.colPriority": "Priorità", "admin.support.colAssignee": "Assegnatario", "admin.support.colCompany": "Azienda", "admin.support.colUpdated": "Aggiornato", @@ -1318,7 +1318,7 @@ export const it: MessageDict = { "admin.support.loadQueueFailed": "Impossibile caricare la coda di supporto", "admin.support.claimFailed": "Impossibile prendere in carico il ticket", "admin.support.ticketFallbackTitle": "Supporto ticket", - "admin.support.ticketMeta": "{company} · {requester}", + "admin.support.ticketMeta": "{company} · {requester}", "admin.support.ticketMetaFallback": "Thread di revisione staff", "admin.support.companyFallback": "Azienda", "admin.support.requesterFallback": "richiedente", @@ -1338,25 +1338,25 @@ export const it: MessageDict = { "admin.support.reenableAuto": "Riattiva auto", "admin.support.disableAuto": "Disabilita auto per questo ticket", "admin.support.aiDraftTitle": "Bozza IA (approva o modifica)", - "admin.support.aiDraftDesc": "La modalità solo bozza ha lasciato una nota interna. Modifica se serve, poi invia al cliente — oppure scarta e continua manualmente.", + "admin.support.aiDraftDesc": "La modalità solo bozza ha lasciato una nota interna. Modifica se serve, poi invia al cliente — oppure scarta e continua manualmente.", "admin.support.confidence": "Confidenza {value}", - "admin.support.statusAfterSend": "Stato dopo l’invio", + "admin.support.statusAfterSend": "Stato dopo l’invio", "admin.support.approveSend": "Approva e invia", "admin.support.discardDraft": "Scarta bozza", "admin.support.threadTitle": "Thread", - "admin.support.threadMeta": "{count} · ultima attività {when}", + "admin.support.threadMeta": "{count} · ultima attività {when}", "admin.support.messageCountOne": "{count} messaggio", "admin.support.messageCountMany": "{count} messaggi", "admin.support.replyTitle": "Rispondi", - "admin.support.replyDesc": "Le risposte pubbliche notificano il cliente. Le note interne restano solo staff. Lo stato predefinito dopo una risposta pubblica è in sospeso.", + "admin.support.replyDesc": "Le risposte pubbliche notificano il cliente. Le note interne restano solo staff. Lo stato predefinito dopo una risposta pubblica è in sospeso.", "admin.support.internalNote": "Nota interna (non visibile al cliente)", "admin.support.setStatus": "Imposta stato", "admin.support.statusDefault": "Predefinito", "admin.support.saveNote": "Salva nota", "admin.support.sendReply": "Invia risposta", "admin.support.replyAndResolve": "Rispondi e risolvi", - "admin.support.closedBanner": "Questo ticket è chiuso. Riapirlo per continuare la conversazione.", - "admin.support.priorityMeta": "priorità {priority}", + "admin.support.closedBanner": "Questo ticket è chiuso. Riapirlo per continuare la conversazione.", + "admin.support.priorityMeta": "priorità {priority}", "admin.support.authorAiDraft": "Bozza IA (solo staff)", "admin.support.authorInternal": "Nota interna", "admin.support.authorStaff": "Staff", @@ -1372,27 +1372,27 @@ export const it: MessageDict = { "admin.support.loadTicketFailed": "Caricamento ticket non riuscito", "admin.support.replyFailed": "Impossibile inviare la risposta", "admin.support.statusFailed": "Impossibile aggiornare lo stato", - "admin.support.unassignFailed": "Impossibile rimuovere l’assegnazione", + "admin.support.unassignFailed": "Impossibile rimuovere l’assegnazione", "admin.support.assignFailed": "Impossibile assegnare il ticket", - "admin.support.autoFailed": "Impossibile aggiornare l’auto-risposta", + "admin.support.autoFailed": "Impossibile aggiornare l’auto-risposta", "admin.support.approveFailed": "Impossibile approvare la bozza IA", "admin.support.discardFailed": "Impossibile scartare la bozza IA", "admin.settings.sourceResolved": "Risolto da {sources}", - "admin.settings.sourceUpdated": " · aggiornato {when}", + "admin.settings.sourceUpdated": " · aggiornato {when}", "admin.settings.updatedAt": "Aggiornato {when}", - "admin.settings.tenantDesc": "Le chiavi IA e l’email marketing aziendali restano in Integrazioni. I segreti di sessione e cifratura restano nell’ambiente server e non si modificano qui.", - "admin.settings.perCompanyAiEmail": "IA/e-mail per azienda —", - "admin.settings.plansCredits": "Piani e crediti —", + "admin.settings.tenantDesc": "Le chiavi IA e l’email marketing aziendali restano in Integrazioni. I segreti di sessione e cifratura restano nell’ambiente server e non si modificano qui.", + "admin.settings.perCompanyAiEmail": "IA/e-mail per azienda —", + "admin.settings.plansCredits": "Piani e crediti —", "admin.settings.fromDatabase": "Dal database", - "admin.settings.fromEnvironment": "Dall’ambiente", + "admin.settings.fromEnvironment": "Dall’ambiente", "admin.settings.sourceBadge": "Origine: {source}", "admin.settings.storedKey": "Chiave salvata: {masked}", "admin.settings.enableRole": "Abilita questo ruolo", "admin.settings.clearApiKey": "Cancella chiave API salvata", - "admin.settings.apiKeyKeepPlaceholder": "•••• lascia vuoto per mantenere", - "admin.settings.apiKeyNewPlaceholder": "sk-… o locale", + "admin.settings.apiKeyKeepPlaceholder": "•••• lascia vuoto per mantenere", + "admin.settings.apiKeyNewPlaceholder": "sk-… o locale", "admin.settings.smtpCardTitle": "Piattaforma SMTP", - "admin.settings.smtpCardDesc": "Usato per inviti set-password e e-mail in uscita di piattaforma. Resend/SMTP marketing resta per azienda in Integrazioni → Email.", + "admin.settings.smtpCardDesc": "Usato per inviti set-password e e-mail in uscita di piattaforma. Resend/SMTP marketing resta per azienda in Integrazioni → Email.", "admin.settings.smtpBadgeOn": "SMTP abilitato", "admin.settings.smtpBadgeOff": "SMTP disabilitato", "admin.settings.enableSmtp": "Abilita SMTP piattaforma", @@ -1404,20 +1404,20 @@ export const it: MessageDict = { "admin.settings.leaveBlankKeep": "(lascia vuoto per mantenere)", "admin.settings.storedSecret": "Segreto salvato: {masked}", "admin.settings.clearClientSecret": "Cancella client secret salvato", - "admin.settings.eprelDesc": "Dati pubblici gratuiti delle etichette energetiche UE durante l’elaborazione. Attivo di default per tutti i piani — nessuna attivazione o upgrade a pagamento. Usa i controlli solo per disabilitare o regolare il client.", + "admin.settings.eprelDesc": "Dati pubblici gratuiti delle etichette energetiche UE durante l’elaborazione. Attivo di default per tutti i piani — nessuna attivazione o upgrade a pagamento. Usa i controlli solo per disabilitare o regolare il client.", "admin.settings.optionalKeySaved": "Chiave API opzionale salvata", "admin.settings.noApiKeyNeeded": "Nessuna chiave API necessaria", "admin.settings.optionalApiKey": "Chiave API opzionale", - "admin.settings.optionalApiKeySavedHint": "(salvato — leave blank to keep)", - "admin.settings.optionalApiKeyPublicHint": "(l’API pubblica funziona senza)", + "admin.settings.optionalApiKeySavedHint": "(salvato — leave blank to keep)", + "admin.settings.optionalApiKeyPublicHint": "(l’API pubblica funziona senza)", "admin.settings.clearEprelKey": "Cancella chiave API EPREL salvata", - "admin.settings.pineconeDesc": "Suggerimenti opzionali di categoria vettoriale durante l’elaborazione. I valori dell’ambiente host si usano se questi campi restano vuoti.", + "admin.settings.pineconeDesc": "Suggerimenti opzionali di categoria vettoriale durante l’elaborazione. I valori dell’ambiente host si usano se questi campi restano vuoti.", "admin.settings.apiKeyConfigured": "Chiave API configurata", "admin.settings.noApiKey": "Nessuna chiave API", "admin.settings.apiKeyLabel": "Chiave API", "admin.settings.clearPineconeKey": "Cancella chiave API Pinecone salvata", - "admin.settings.stripeDesc": "Override opzionali della configurazione Stripe del server. Preferisci i campi password; i valori non vengono più mostrati dopo il salvataggio.", - "admin.settings.stripeMock": "Forza modalità mock Stripe (solo non produzione — disabilita addebiti reali)", + "admin.settings.stripeDesc": "Override opzionali della configurazione Stripe del server. Preferisci i campi password; i valori non vengono più mostrati dopo il salvataggio.", + "admin.settings.stripeMock": "Forza modalità mock Stripe (solo non produzione — disabilita addebiti reali)", "admin.settings.webhookSecret": "Segreto webhook", "admin.settings.clearStripeSecret": "Cancella chiave segreta Stripe", "admin.settings.clearStripeWebhook": "Cancella segreto webhook Stripe", @@ -1426,40 +1426,40 @@ export const it: MessageDict = { "admin.settings.onboardingTitle": "Aiuti onboarding admin", "admin.settings.onboardingDesc": "Usa e-mail di invito set-password per onboarding degli utenti idonei che ancora necessitano una password.", "admin.settings.sendInvites": "Invia e-mail set-password", - "admin.settings.adminStatusBefore": "Gli admin di piattaforma non si possono creare da questa schermata. Conferma l’accesso sulla", + "admin.settings.adminStatusBefore": "Gli admin di piattaforma non si possono creare da questa schermata. Conferma l’accesso sulla", "admin.settings.adminStatusAfter": ", oppure chiedi a un admin/ops esistente di promuovere il tuo account.", "admin.settings.loadUsersFailed": "Impossibile caricare gli utenti admin", "admin.settings.sendFailed": "Invio non riuscito", "admin.settings.saveMailFailed": "Impossibile salvare le impostazioni posta", - "admin.settings.smtpNotConfigured": "SMTP non è configurato — abilita e salva prima le impostazioni posta.", + "admin.settings.smtpNotConfigured": "SMTP non è configurato — abilita e salva prima le impostazioni posta.", "admin.settings.smtpTestFailed": "Test SMTP non riuscito", - "admin.settings.testEmailFailed": "Impossibile inviare l’e-mail di test", + "admin.settings.testEmailFailed": "Impossibile inviare l’e-mail di test", "admin.settings.saveIntegrationFailed": "Impossibile salvare le impostazioni di integrazione", - "admin.settings.aiSaved": "Impostazioni IA {label} salvate. Le chiavi API non vengono più mostrate.", + "admin.settings.aiSaved": "Impostazioni IA {label} salvate. Le chiavi API non vengono più mostrate.", "admin.settings.aiSaveFailed": "Impossibile salvare le impostazioni IA {label}", "admin.settings.aiTestOk": "{label}: connessione OK", - "admin.settings.aiTestSkipped": "{label}: saltato — salva le credenziali (e abilita il ruolo) per testare.", + "admin.settings.aiTestSkipped": "{label}: saltato — salva le credenziali (e abilita il ruolo) per testare.", "admin.settings.aiTestFailed": "{label}: connessione non riuscita", "admin.settings.aiTestError": "Impossibile testare la connessione {label}", "admin.settings.aiRole.processing.label": "Elaborazione", "admin.settings.aiRole.processing.desc": "Chat/completions della pipeline prodotti (titoli, descrizioni, enhance).", "admin.settings.aiRole.vectorization.label": "Vettorizzazione", - "admin.settings.aiRole.vectorization.desc": "Embedding per ricerca / indicizzazione Pinecone (allinea le dimensioni dell’indice).", + "admin.settings.aiRole.vectorization.desc": "Embedding per ricerca / indicizzazione Pinecone (allinea le dimensioni dell’indice).", "admin.settings.aiRole.docs_api.label": "Docs / API", - "admin.settings.aiRole.docs_api.desc": "Slot futuro assistente docs/API — /docs Ask resta rule-based e non deve mai chiamare questo ruolo.", + "admin.settings.aiRole.docs_api.desc": "Slot futuro assistente docs/API — /docs Ask resta rule-based e non deve mai chiamare questo ruolo.", "admin.settings.aiRole.support.label": "Supporto", - "admin.settings.aiRole.support.desc": "IA di fallback per auto-risposta ticket — configura provider/chiave/modello qui; abilita l’invio in Knowledge support → Auto-risposta.", + "admin.settings.aiRole.support.desc": "IA di fallback per auto-risposta ticket — configura provider/chiave/modello qui; abilita l’invio in Knowledge support → Auto-risposta.", "admin.settings.providerOption.openai": "OpenAI", "admin.settings.providerOption.openrouter": "OpenRouter", "admin.settings.providerOption.azure": "Azure OpenAI", "admin.settings.providerOption.ollama": "Ollama", "admin.settings.providerOption.custom": "Personalizzato / altro", "admin.support.title": "Centro di supporto", - "admin.support.description": "Inbox dello staff — prendi dalla coda, filtra per ambito, apri thread e risolvi", - "admin.support.unavailable": "La coda di supporto non è disponibile. Contatta l'amministratore della piattaforma se persiste.", + "admin.support.description": "Inbox dello staff — prendi dalla coda, filtra per ambito, apri thread e risolvi", + "admin.support.unavailable": "La coda di supporto non è disponibile. Contatta l'amministratore della piattaforma se persiste.", "admin.support.noTickets": "Nessun ticket in questa coda.", "admin.support.ticketNotFound": "Ticket non trovato.", - "admin.support.notAvailable": "Il supporto non è disponibile su questo deployment.", + "admin.support.notAvailable": "Il supporto non è disponibile su questo deployment.", "admin.support.loadFailed": "Impossibile caricare questo ticket.", "admin.support.noMessages": "Nessun messaggio ancora.", "admin.support.queueScopeAria": "Ambito coda", @@ -1469,16 +1469,16 @@ export const it: MessageDict = { "admin.support.searchAria": "Cerca ticket", "admin.support.assignStaffAria": "Assegna allo staff", "admin.support.aiDraftAria": "Bozza IA", - "admin.support.replyPlaceholder": "Scrivi una risposta…", + "admin.support.replyPlaceholder": "Scrivi una risposta…", "admin.support.replyAria": "Corpo della risposta", "admin.knowledge.eyebrow": "Admin piattaforma", "admin.knowledge.title": "Knowledge support", - "admin.knowledge.description": "Struttura gli articoli di aiuto per l'abbinamento automatico FAQ. Gli agent di contenuto compilano i corpi — mantieni i fatti accurati.", - "admin.knowledge.notReady": "La knowledge di supporto non è pronta", + "admin.knowledge.description": "Struttura gli articoli di aiuto per l'abbinamento automatico FAQ. Gli agent di contenuto compilano i corpi — mantieni i fatti accurati.", + "admin.knowledge.notReady": "La knowledge di supporto non è pronta", "admin.knowledge.noTemplates": "Nessun modello di risposta", - "admin.knowledge.articleDesc": "Il corpo Markdown supporta immagini tramite caricamento sicuro. Non inventare fatti di prodotto — lascia segnaposto per gli agent di contenuto.", + "admin.knowledge.articleDesc": "Il corpo Markdown supporta immagini tramite caricamento sicuro. Non inventare fatti di prodotto — lascia segnaposto per gli agent di contenuto.", "admin.knowledge.templateDesc": "Segnaposto consentiti: subject, category.", - "admin.knowledge.searchPlaceholder": "Cerca titolo, slug, parole chiave…", + "admin.knowledge.searchPlaceholder": "Cerca titolo, slug, parole chiave…", "admin.knowledge.searchAria": "Cerca articoli", "admin.knowledge.publishFilterAria": "Filtro stato pubblicazione", "admin.knowledge.deleteArticleAria": "Elimina articolo", @@ -1500,33 +1500,33 @@ export const it: MessageDict = { "admin.knowledge.showingArticlesOf": "Mostra {shown} di {total} articoli (il corpo si carica in modifica).", "admin.knowledge.templatesHint": "Risposte predefinite con segnaposto opzionali {{subject}} / {{category}}.", "admin.knowledge.faqAutoMatchTitle": "Auto-match FAQ", - "admin.knowledge.faqAutoMatchDesc": "Corrispondenza parole chiave alla creazione del ticket. Soglia predefinita 0,78 (intervallo 0,50–0,95).", + "admin.knowledge.faqAutoMatchDesc": "Corrispondenza parole chiave alla creazione del ticket. Soglia predefinita 0,78 (intervallo 0,50–0,95).", "admin.knowledge.aiFallbackTitle": "Fallback IA", - "admin.knowledge.aiFallbackDesc": "Usato quando il match FAQ è sotto soglia. Le risposte usano il ruolo IA di piattaforma {role}.", + "admin.knowledge.aiFallbackDesc": "Usato quando il match FAQ è sotto soglia. Le risposte usano il ruolo IA di piattaforma {role}.", "admin.knowledge.noModel": "nessun modello", - "admin.knowledge.keyLast4": "chiave …{last4}", + "admin.knowledge.keyLast4": "chiave …{last4}", "admin.knowledge.sourceLabel": "origine {source}", "admin.knowledge.apiKeyNote": "La chiave API proviene sempre da questo ruolo; gli override sopra cambiano solo provider / modello / URL di base.", "admin.knowledge.saveAutoSettings": "Salva impostazioni auto-risposta", "admin.knowledge.insertImage": "Inserisci immagine", - "admin.knowledge.uploading": "Caricamento…", + "admin.knowledge.uploading": "Caricamento…", "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, max 2 MiB. Salvato in UPLOAD_DIR/support-kb (URL pubblica HMAC).", - "admin.knowledge.unavailableMsg": "La knowledge di supporto non è disponibile su questo deployment. Contatta l’amministratore della piattaforma.", + "admin.knowledge.unavailableMsg": "La knowledge di supporto non è disponibile su questo deployment. Contatta l’amministratore della piattaforma.", "admin.knowledge.loadFailed": "Impossibile caricare la knowledge di supporto", - "admin.knowledge.loadArticleFailed": "Impossibile caricare l’articolo", + "admin.knowledge.loadArticleFailed": "Impossibile caricare l’articolo", "admin.knowledge.loadTemplateFailed": "Impossibile caricare il modello", - "admin.knowledge.saveArticleFailed": "Impossibile salvare l’articolo", + "admin.knowledge.saveArticleFailed": "Impossibile salvare l’articolo", "admin.knowledge.saveTemplateFailed": "Impossibile salvare il modello", - "admin.knowledge.deleteArticleFailed": "Impossibile eliminare l’articolo", + "admin.knowledge.deleteArticleFailed": "Impossibile eliminare l’articolo", "admin.knowledge.deleteTemplateFailed": "Impossibile eliminare il modello", "admin.knowledge.saveAutoFailed": "Impossibile salvare le impostazioni auto-risposta", - "admin.knowledge.uploadImageFailed": "Impossibile caricare l’immagine", + "admin.knowledge.uploadImageFailed": "Impossibile caricare l’immagine", "admin.translations.eyebrow": "Piattaforma", "admin.translations.title": "Traduzioni", "admin.translations.description": "Esamina la copertura UI della dashboard e modifica i pack di locale basati su file.", "admin.translations.unavailable": "Traduzioni non disponibili", - "admin.translations.sourceOfTruth": "Fonte di verità", - "admin.translations.sourceOfTruthLabel": "Fonte di verità:", + "admin.translations.sourceOfTruth": "Fonte di verità", + "admin.translations.sourceOfTruthLabel": "Fonte di verità:", "admin.translations.colLocale": "Locale", "admin.translations.colTranslated": "Tradotto", "admin.translations.colMissing": "Mancanti", @@ -1541,35 +1541,35 @@ export const it: MessageDict = { "admin.translations.filterTranslated": "Solo tradotti", "admin.translations.filterAll": "Tutte le chiavi", "admin.translations.search": "Cerca", - "admin.translations.searchPlaceholder": "Chiave o testo…", + "admin.translations.searchPlaceholder": "Chiave o testo…", "admin.translations.noKeysMatch": "Nessuna chiave corrisponde", "admin.translations.badgeMissing": "Mancanti", "admin.translations.badgeUnsaved": "Non salvato", "admin.translations.english": "Inglese", "admin.bootstrap.title": "Accesso admin bootstrap", - "admin.bootstrap.description": "Conferma se il tuo account ha già accesso admin piattaforma. I nuovi admin devono essere concessi da un amministratore esistente.", + "admin.bootstrap.description": "Conferma se il tuo account ha già accesso admin piattaforma. I nuovi admin devono essere concessi da un amministratore esistente.", "admin.bootstrap.statusTitle": "Stato admin piattaforma", - "admin.bootstrap.statusDesc": "L'accesso admin piattaforma è concesso da un amministratore esistente. Non c'è bootstrap self-serve per questo ruolo.", - "admin.bootstrap.alreadyAdmin": "Hai già accesso admin piattaforma.", + "admin.bootstrap.statusDesc": "L'accesso admin piattaforma è concesso da un amministratore esistente. Non c'è bootstrap self-serve per questo ruolo.", + "admin.bootstrap.alreadyAdmin": "Hai già accesso admin piattaforma.", "admin.bootstrap.signedInAs": "Accesso come {email}. Apri il pannello admin per continuare.", "admin.bootstrap.signedInAsShort": "Accesso come {email}", "admin.bootstrap.notAdminTitle": "Non sei admin piattaforma", - "admin.bootstrap.notAdminMsg": "Il tuo account è autenticato ma non è contrassegnato come admin piattaforma. Chiedi a un admin esistente di concedere l'accesso, poi esci e accedi di nuovo.", + "admin.bootstrap.notAdminMsg": "Il tuo account è autenticato ma non è contrassegnato come admin piattaforma. Chiedi a un admin esistente di concedere l'accesso, poi esci e accedi di nuovo.", "admin.bootstrap.goToPanel": "Vai al pannello admin", "admin.bootstrap.loadFailed": "Impossibile caricare il profilo", "admin.migrate.title": "Migrazione organizzazione", - "admin.migrate.description": "Questo strumento di migrazione è ritirato e non modifica alcun dato.", + "admin.migrate.description": "Questo strumento di migrazione è ritirato e non modifica alcun dato.", "admin.migrate.notAvailable": "Non disponibile", - "admin.migrate.body": "La migrazione organizzazione dal precedente identity provider non è più necessaria. Aziende e auth locale sono gestite in Utenti e organizzazioni.", + "admin.migrate.body": "La migrazione organizzazione dal precedente identity provider non è più necessaria. Aziende e auth locale sono gestite in Utenti e organizzazioni.", "admin.migrate.hint": "Se hai aperto questa pagina da un vecchio segnalibro, continua con Utenti e organizzazioni, Fatturazione piattaforma o Prodotti bloccati.", "admin.migrate.adminHome": "Home admin", "admin.migrate.users": "Utenti", - "admin.redirect.diagnostics": "Reindirizzamento a Diagnostica…", - "admin.redirect.stuck": "Reindirizzamento a Prodotti bloccati…", + "admin.redirect.diagnostics": "Reindirizzamento a Diagnostica…", + "admin.redirect.stuck": "Reindirizzamento a Prodotti bloccati…", "common.refresh": "Aggiorna", "common.delete": "Elimina", "common.clearSearch": "Cancella ricerca", - "common.loading": "Caricamento…", + "common.loading": "Caricamento…", "common.never": "Mai", "common.back": "Indietro", "common.startOver": "Ricomincia", @@ -1579,10 +1579,10 @@ export const it: MessageDict = { "common.status": "Stato", "common.nameCol": "Nome", "common.products": "Prodotti", - "common.more": "+{count} in più", + "common.more": "+{count} in più", "feeds.title": "I tuoi feed", - "feeds.loadingDesc": "Caricamento dei feed fornitore…", - "feeds.desc": "{page} in questa pagina · {total} feed totali — URL CSV/XML fornitore e caricamenti. Collega da Negozi per opzioni guidate.", + "feeds.loadingDesc": "Caricamento dei feed fornitore…", + "feeds.desc": "{page} in questa pagina · {total} feed totali — URL CSV/XML fornitore e caricamenti. Collega da Negozi per opzioni guidate.", "feeds.storesHub": "Hub negozi", "feeds.addFeed": "Aggiungi feed", "feeds.searchPlaceholder": "Cerca feed...", @@ -1602,12 +1602,12 @@ export const it: MessageDict = { "feeds.mappingsSaved": "Mappature campi salvate", "feeds.mapped": "Mappato", "feeds.notMapped": "Non mappato", - "feeds.notMappedTitle": "Nessuna mappatura campi ancora — apri Mappa per configurare", + "feeds.notMappedTitle": "Nessuna mappatura campi ancora — apri Mappa per configurare", "feeds.productsFromFeed": "{count} prodotti da questo feed", "feeds.noProductsYet": "Nessun prodotto importato da questo feed ancora", - "feeds.syncing": "Sincronizzazione…", + "feeds.syncing": "Sincronizzazione…", "feeds.syncingShort": "Sincronizzazione", - "feeds.syncingHint": "Può richiedere alcuni minuti per feed grandi", + "feeds.syncingHint": "Può richiedere alcuni minuti per feed grandi", "feeds.liveSync": "Sync del feed", "feeds.productData": "Dati catalogo", "feeds.mapFields": "Mappa campi", @@ -1623,12 +1623,12 @@ export const it: MessageDict = { "feeds.tab.url": "URL del feed", "feeds.tab.file": "File CSV", "feeds.field.url": "URL del feed", - "feeds.field.urlPlaceholder": "https://…", + "feeds.field.urlPlaceholder": "https://…", "feeds.field.type": "Tipo", "feeds.field.file": "File CSV", - "feeds.fileHint": "Max 5 MiB. Dopo la creazione, mappa le colonne e poi sincronizza — stesso flusso dei feed URL.", + "feeds.fileHint": "Max 5 MiB. Dopo la creazione, mappa le colonne e poi sincronizza — stesso flusso dei feed URL.", "feeds.field.interval": "Intervallo sync automatica (minuti)", - "feeds.field.intervalHint": "Ogni quanto Descrybe deve scaricare questo feed automaticamente mentre è attivo. Sync nell'elenco avvia un download una tantum — non modifica questa pianificazione.", + "feeds.field.intervalHint": "Ogni quanto Descrybe deve scaricare questo feed automaticamente mentre è attivo. Sync nell'elenco avvia un download una tantum — non modifica questa pianificazione.", "feeds.createFeed": "Crea feed", "feeds.editTitle": "Modifica feed", "feeds.editDesc": "Aggiorna nome, tipo, pianificazione sync automatica o URL di origine. Sync nell'elenco feed esegue un download una tantum.", @@ -1638,10 +1638,10 @@ export const it: MessageDict = { "feeds.csvTypeLocked": "I feed CSV caricati restano di tipo CSV.", "feeds.saveChanges": "Salva modifiche", "feeds.historyTitle": "Cronologia sync", - "feeds.historyDesc": "Job di sync recenti per “{name}”.", + "feeds.historyDesc": "Job di sync recenti per “{name}”.", "feeds.historyLastSynced": "Ultima sync riuscita {relative} ({absolute}).", "feeds.historyNeverSynced": "Nessuna sync riuscita ancora.", - "feeds.historyLoading": "Caricamento cronologia sync…", + "feeds.historyLoading": "Caricamento cronologia sync…", "feeds.historyEmpty": "Nessun job di sync ancora.", "feeds.history.started": "Avviato", "feeds.history.completed": "Completato", @@ -1656,14 +1656,14 @@ export const it: MessageDict = { "feeds.processing": "Elaborazione", "feeds.syncFailed": "Sincronizzazione non riuscita", "feeds.statusUpdateFailed": "Impossibile aggiornare lo stato", - "feeds.deleteConfirm": "Eliminare il feed “{name}”? Operazione irreversibile.", + "feeds.deleteConfirm": "Eliminare il feed “{name}”? Operazione irreversibile.", "feeds.deleted": "Feed eliminato.", "feeds.deleteFailed": "Impossibile eliminare il feed", "feeds.historyLoadFailed": "Impossibile caricare la cronologia sync", - "feeds.ftpUnsupported": "La sync FTP/FTPS non è supportata. Chiedi al fornitore un URL HTTPS pubblico, carica un feed CSV qui o importa un file da Uploads.", + "feeds.ftpUnsupported": "La sync FTP/FTPS non è supportata. Chiedi al fornitore un URL HTTPS pubblico, carica un feed CSV qui o importa un file da Uploads.", "feeds.ftpUnsupportedShort": "Sync FTP non supportata", "feeds.ftpBadge": "FTP", - "feeds.ftpMigrateBanner": "Alcuni feed usano ancora FTP/FTPS. Descrybe non può scaricarli. Passa a un URL HTTPS pubblico, aggiungi un feed CSV o carica da Uploads.", + "feeds.ftpMigrateBanner": "Alcuni feed usano ancora FTP/FTPS. Descrybe non può scaricarli. Passa a un URL HTTPS pubblico, aggiungi un feed CSV o carica da Uploads.", "feeds.ftpUploadCta": "Vai a Uploads", "feeds.ftpHttpsCta": "Aggiungi feed HTTPS", "feeds.ftpCsvCta": "Carica feed CSV", @@ -1679,30 +1679,30 @@ export const it: MessageDict = { "feeds.actions.editFeed": "Modifica feed", "feeds.actions.editMapping": "Modifica mappatura", "feeds.actions.syncNow": "Sincronizza ora", - "feeds.actions.syncInProgress": "Sync in corso…", + "feeds.actions.syncInProgress": "Sync in corso…", "feeds.actions.activateToSync": "Attiva il feed per sincronizzare", "feeds.actions.viewHistory": "Vedi cronologia sync", "feeds.actions.deactivate": "Disattiva feed", "feeds.actions.activate": "Attiva feed", "feeds.actions.delete": "Elimina feed", "feeds.stats.totalFeeds": "Feed totali", - "feeds.stats.activeMapped": "{active} attivi · {mapped} mappati", + "feeds.stats.activeMapped": "{active} attivi · {mapped} mappati", "feeds.stats.activeOnly": "{active} attivi", "feeds.stats.totalProducts": "Prodotti importati", "feeds.stats.acrossFeeds": "Righe grezze (non catalogo + coda)", "feeds.stats.processed": "In catalogo", - "feeds.stats.readyCatalog": "Righe catalogo — non una quota degli importati", + "feeds.stats.readyCatalog": "Righe catalogo — non una quota degli importati", "feeds.stats.unprocessed": "In attesa di elaborazione", - "feeds.stats.waiting": "Coda grezza — non una quota degli importati", + "feeds.stats.waiting": "Coda grezza — non una quota degli importati", "feeds.format.howTo": "Come strutturare il feed", "feeds.format.required": "Obbligatorio:", "feeds.preview.title": "Anteprima origine feed", "feeds.preview.truncated": "Troncato", "feeds.preview.refresh": "Aggiorna anteprima", "feeds.preview.copy": "Copia anteprima", - "feeds.preview.loading": "Caricamento anteprima…", + "feeds.preview.loading": "Caricamento anteprima…", "feeds.preview.empty": "Estrai lo schema per anteprima dell'origine del feed.", - "feeds.schema.search": "Cerca campi…", + "feeds.schema.search": "Cerca campi…", "feeds.schema.fieldName": "Nome campo", "feeds.schema.sourcePath": "Percorso origine", "feeds.schema.confirm": "Conferma", @@ -1715,7 +1715,7 @@ export const it: MessageDict = { "feeds.preflight.fix": "Correggi le mappature campi prima di sincronizzare.", "mapping.title": "Mappatura feed", "mapping.titleNamed": "Mappa: {name}", - "mapping.description": "Seleziona l’elemento prodotto ripetuto, estrai i campi di origine e mappali sui campi prodotto Descrybe.", + "mapping.description": "Seleziona l’elemento prodotto ripetuto, estrai i campi di origine e mappali sui campi prodotto Descrybe.", "mapping.autoMap": "Auto-mappa", "mapping.fuzzy": "{count} approssimati", "mapping.extractSchema": "Estrai schema", @@ -1724,32 +1724,32 @@ export const it: MessageDict = { "mapping.ftpUploadCta": "Vai a Uploads", "mapping.ftpHttpsCta": "Aggiungi feed HTTPS", "mapping.ftpCsvCta": "Carica feed CSV", - "mapping.loading": "Caricamento dettagli feed…", + "mapping.loading": "Caricamento dettagli feed…", "mapping.step1": "Seleziona elemento prodotto", "mapping.step2": "Mappa campi", "mapping.step1Heading": "Passo 1: Seleziona elemento prodotto", "mapping.csvHint": "I feed CSV usano le intestazioni di colonna come campi di origine. Estrai lo schema per caricare le colonne, poi continua la mappatura.", - "mapping.howToSelect": "Come selezionare l’elemento prodotto:", + "mapping.howToSelect": "Come selezionare l’elemento prodotto:", "mapping.howToHint": "Guida opzionale", - "mapping.howTo.1": "Estrai lo schema o fai clic su un tag ripetuto nell’anteprima", + "mapping.howTo.1": "Estrai lo schema o fai clic su un tag ripetuto nell’anteprima", "mapping.howTo.2": "Ogni elemento deve contenere i dettagli di un singolo prodotto", "mapping.howTo.3": "Conferma il percorso (ad esempio", "mapping.howTo.4": "Continua a mappare i campi di origine sui campi prodotto", "mapping.productElementPath": "Percorso elemento prodotto", "mapping.pathPlaceholder": "es. rss/channel/item o products/product", - "mapping.continue": "Continua →", - "mapping.continueFields": "Continua alla mappatura campi →", + "mapping.continue": "Continua →", + "mapping.continueFields": "Continua alla mappatura campi →", "mapping.discovered": "Trovati {fields} campi di origine da {rows} riga/e di esempio.", - "mapping.suggestionsCount": "· {count} suggerimento/i di auto-mappatura", + "mapping.suggestionsCount": "· {count} suggerimento/i di auto-mappatura", "mapping.step2Heading": "Passo 2: Mappa campi", "mapping.requiredFieldsBadge": "{count} campi obbligatori", "mapping.unmappedRequired": "{count} obbligatori non mappati", "mapping.sourceFieldsBadge": "{count} campi di origine", "mapping.suggestedBadge": "{count} suggeriti", - "mapping.step2Help": "Mappa colonne o nodi XPath sui campi prodotto. Gli obbligatori hanno *. Passa sull’icona di aiuto per un breve tip.", + "mapping.step2Help": "Mappa colonne o nodi XPath sui campi prodotto. Gli obbligatori hanno *. Passa sull’icona di aiuto per un breve tip.", "mapping.requiredFields": "Campi obbligatori", - "mapping.requiredMapped": "· {mapped}/{total} mappati", - "mapping.requiredProgressDone": "Tutti i campi obbligatori sono mappati — pronto per il passaggio successivo.", + "mapping.requiredMapped": "· {mapped}/{total} mappati", + "mapping.requiredProgressDone": "Tutti i campi obbligatori sono mappati — pronto per il passaggio successivo.", "mapping.requiredProgressHint": "I campi contrassegnati con * devono essere mappati prima che questo feed possa sincronizzare i prodotti.", "mapping.requiredProgressAria": "Avanzamento campi obbligatori: {mapped} di {total} mappati", "mapping.nextAfterSaveReady": "Mappings saved. Next, sync a small sample to check products look right.", @@ -1758,14 +1758,14 @@ export const it: MessageDict = { "mapping.nextCtaFinishRequired": "Show missing required fields", "mapping.highConfidence": "{count} mappatura ad alta confidenza pronta", "mapping.highConfidencePlural": "{count} mappature ad alta confidenza pronte", - "mapping.highConfidenceHelp": "Corrispondenze esatte e alias (es. EAN → GTIN). Applica tutte o accetta i chip per riga.", + "mapping.highConfidenceHelp": "Corrispondenze esatte e alias (es. EAN → GTIN). Applica tutte o accetta i chip per riga.", "mapping.reviewMappings": "Rivedi mappature", "mapping.needItemPath": "Inserisci un percorso elemento prodotto prima di mappare i campi.", "mapping.removeMapping": "Rimuovi mappatura", "mapping.sourcePlaceholder": "nome colonna o xpath", "mapping.processAfterSync": "Prodotti da elaborare dopo la sync", "mapping.noFuzzyLeft": "Nessuna corrispondenza approssimata da confermare.", - "mapping.syncedQueued": "Feed sincronizzato e {queued} prodotto/i in coda per l’elaborazione{jobId}.", + "mapping.syncedQueued": "Feed sincronizzato e {queued} prodotto/i in coda per l’elaborazione{jobId}.", "mapping.saveMappings": "Salva mappature", "mapping.syncProcessSample": "Sincronizza + elabora campione", "mapping.badgeCsv": "CSV", @@ -1776,7 +1776,7 @@ export const it: MessageDict = { "mapping.fuzzyNeedConfirmPlural": "{count} corrispondenze approssimative da confermare", "mapping.fuzzyHelp": "Le corrispondenze a bassa confidenza non si applicano automaticamente. Conferma qui o per riga.", "mapping.missingRequiredTitle": "I campi obbligatori richiedono ancora una mappatura di origine:", - "mapping.applyTip": "Suggerimento: applica i suggerimenti sopra — molti obbligatori coincidono con nomi comuni.", + "mapping.applyTip": "Suggerimento: applica i suggerimenti sopra — molti obbligatori coincidono con nomi comuni.", "mapping.formatLabel": "Formato:", "mapping.itemPathLabel": "Percorso item:", "mapping.reExtract": "Ri-estrai", @@ -1786,16 +1786,16 @@ export const it: MessageDict = { "mapping.noSchemaYet": "Nessuno schema estratto ancora.", "mapping.orManualRows": "oppure usa le righe manuali sotto.", "mapping.sourceField": "Campo di origine", - "mapping.selectSource": "Seleziona origine…", + "mapping.selectSource": "Seleziona origine…", "mapping.mapsTo": "Corrisponde a", "mapping.none": "Nessuno", - "mapping.backToItem": "← Torna alla selezione elemento", + "mapping.backToItem": "← Torna alla selezione elemento", "mapping.unsaved": "Modifiche non salvate", "mapping.requiredFieldsColon": "Campi obbligatori:", "mapping.sampleOptions": "Opzioni campione", "mapping.sampleSize": "Dimensione campione", "mapping.noExactAlias": "Nessun suggerimento esatto/alias da applicare. Controlla gli approssimati sotto.", - "mapping.noSuggestionsExtract": "Nessun suggerimento — estrai prima lo schema.", + "mapping.noSuggestionsExtract": "Nessun suggerimento — estrai prima lo schema.", "mapping.schemaExtracted": "Schema estratto: {fields} campi da {rows} riga/e di esempio.", "mapping.saved": "Mappature campi salvate{version}.", "mapping.savedVersion": " (v{version})", @@ -1805,14 +1805,14 @@ export const it: MessageDict = { "mapping.appliedNew": "Applicate {count} nuove mappature {kind} ({total} totali).", "mapping.kindHighConfidence": "ad alta confidenza", "mapping.kindFuzzy": "approssimata/e", - "mapping.fuzzyConfirmFlash": "{count} corrispondenza approssimata da confermare — usa Conferma approssimati o i chip per riga.", - "mapping.fuzzyConfirmFlashPlural": "{count} corrispondenze approssimative da confermare — usa Conferma approssimati o i chip per riga.", + "mapping.fuzzyConfirmFlash": "{count} corrispondenza approssimata da confermare — usa Conferma approssimati o i chip per riga.", + "mapping.fuzzyConfirmFlashPlural": "{count} corrispondenze approssimative da confermare — usa Conferma approssimati o i chip per riga.", "mapping.formatHelp.title": "Come strutturare il feed", "mapping.formatHelp.required": "Obbligatorio:", "mapping.formatHelp.requiredBody": "{gtin} (EAN/UPC), {title} (o {name}), {brand}", - "mapping.formatHelp.https": "Usa URL HTTPS pubblici per feed remoti (non FTP o localhost). L’upload CSV va bene per file locali.", + "mapping.formatHelp.https": "Usa URL HTTPS pubblici per feed remoti (non FTP o localhost). L’upload CSV va bene per file locali.", "mapping.formatHelp.specs": "Specifiche come coppie Etichetta: valore (es. {ram}). Dimensioni: {height}, {width}, {depth}, {mass}", - "mapping.formatHelp.also": "Supportati anche: prezzi, stock, immagini, categoria, garanzia, ID EPREL, descrizioni HTML, immagini extra, URL video e altro — scarica il campione completo.", + "mapping.formatHelp.also": "Supportati anche: prezzi, stock, immagini, categoria, garanzia, ID EPREL, descrizioni HTML, immagini extra, URL video e altro — scarica il campione completo.", "mapping.formatHelp.downloadXml": "Scarica XML di esempio", "mapping.formatHelp.downloadCsv": "Scarica CSV di esempio", "mapping.formatHelp.xmlExample": "Esempio XML", @@ -1821,15 +1821,15 @@ export const it: MessageDict = { "mapping.sourcePreview.truncated": "Troncato", "mapping.sourcePreview.refresh": "Aggiorna anteprima", "mapping.sourcePreview.copy": "Copia anteprima", - "mapping.sourcePreview.loading": "Caricamento campione feed…", - "mapping.sourcePreview.errorHint": "Puoi comunque inserire manualmente il percorso dell’elemento prodotto. Estrai lo schema quando l’URL è raggiungibile.", + "mapping.sourcePreview.loading": "Caricamento campione feed…", + "mapping.sourcePreview.errorHint": "Puoi comunque inserire manualmente il percorso dell’elemento prodotto. Estrai lo schema quando l’URL è raggiungibile.", "mapping.sourcePreview.retry": "Riprova", "mapping.sourcePreview.empty": "Nessuna anteprima ancora", - "mapping.sourcePreview.emptyHintXml": "Fai clic su «Estrai schema» per scaricare un campione e scoprire i campi, oppure inserisci un percorso item manualmente.", - "mapping.sourcePreview.emptyHintCsv": "Fai clic su «Estrai schema» per scaricare un campione e scoprire i campi.", + "mapping.sourcePreview.emptyHintXml": "Fai clic su «Estrai schema» per scaricare un campione e scoprire i campi, oppure inserisci un percorso item manualmente.", + "mapping.sourcePreview.emptyHintCsv": "Fai clic su «Estrai schema» per scaricare un campione e scoprire i campi.", "mapping.sourcePreview.selectPath": "Seleziona percorso: {path}", - "mapping.sourcePreview.clickTag": "Fai clic su una riga di tag per impostare il percorso dell’elemento prodotto.", - "mapping.table.search": "Cerca campi…", + "mapping.sourcePreview.clickTag": "Fai clic su una riga di tag per impostare il percorso dell’elemento prodotto.", + "mapping.table.search": "Cerca campi…", "mapping.table.all": "Tutti i campi", "mapping.table.mapped": "Mappato", "mapping.table.unmapped": "Non mappati", @@ -1848,15 +1848,15 @@ export const it: MessageDict = { "mapping.table.confirmFuzzyMatch": "Conferma corrispondenza approssimata ({percent}%)", "mapping.preview.title": "Anteprima mappatura", "mapping.preview.subtitle": "Forma prodotto di esempio dalle mappature attuali", - "mapping.preview.usingSamples": "· con campioni estratti", + "mapping.preview.usingSamples": "· con campioni estratti", "mapping.preview.formatCsv": "formato: csv", "mapping.preview.item": "elemento: {path}", - "mapping.preview.sourceFields": "· {count} campi di origine", + "mapping.preview.sourceFields": "· {count} campi di origine", "mapping.preview.empty": "Nessun campo mappato ancora", - "mapping.preview.emptyHint": "Mappa colonne o nodi XPath sui campi prodotto. Qui apparirà un’anteprima di esempio.", + "mapping.preview.emptyHint": "Mappa colonne o nodi XPath sui campi prodotto. Qui apparirà un’anteprima di esempio.", "mapping.preview.rawSample": "Frammento campione grezzo", "imports.title": "Caricamenti", - "imports.description": "Import CSV salvati per quest'area di lavoro — prodotti, categorie e attributi.", + "imports.description": "Import CSV salvati per quest'area di lavoro — prodotti, categorie e attributi.", "imports.importProducts": "Importa prodotti", "imports.emptyTitle": "Nessun upload ancora", "imports.emptyMessage": "Gli import CSV di prodotti, categorie e attributi compariranno qui dopo il caricamento.", @@ -1871,53 +1871,53 @@ export const it: MessageDict = { "imports.col.size": "Dimensione", "imports.actions": "Azioni caricamento", "imports.loadFailed": "Impossibile caricare i caricamenti", - "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", + "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", "imports.metadataOnlyBadge": "Metadata only (blob not migrated)", - "imports.deleteConfirm": "Eliminare “{name}”? Rimuove il record di upload (e il blob locale se presente).", + "imports.deleteConfirm": "Eliminare “{name}”? Rimuove il record di upload (e il blob locale se presente).", "imports.deleted": "Upload eliminato.", "imports.deleteFailed": "Impossibile eliminare il caricamento", "imports.status.uploaded": "Caricato", - "reviews.redirectLoading": "Apertura recensioni WooCommerce…", + "reviews.redirectLoading": "Apertura recensioni WooCommerce…", "reviews.tab": "Recensioni", - "reviews.syncTitle": "Import recensioni (negozio → Descrybe)", - "reviews.syncDesc": "Import in ingresso — importa le recensioni prodotti WooCommerce in Descrybe per campagne e reputazione", + "reviews.syncTitle": "Import recensioni (negozio → Descrybe)", + "reviews.syncDesc": "Import in ingresso — importa le recensioni prodotti WooCommerce in Descrybe per campagne e reputazione", "reviews.syncQueued": "Sync recensioni in coda", "reviews.statusBadge": "Recensioni: {status}", "reviews.syncedCount": "{count} sincronizzati", "reviews.lastSync": "Ultima sync: {date}", "reviews.noSyncYet": "Nessuna sync recensioni completata ancora.", - "reviews.needsReconnect": "L’import recensioni non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", - "reviews.queueImport": "Metti in coda import recensioni (negozio → Descrybe)", + "reviews.needsReconnect": "L’import recensioni non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", + "reviews.queueImport": "Metti in coda import recensioni (negozio → Descrybe)", "reviews.queueing": "In coda...", "reviews.saveTestFirst": "Salva le credenziali e testa la connessione prima di sincronizzare", "reviews.refreshList": "Aggiorna elenco", - "reviews.loading": "Caricamento recensioni…", + "reviews.loading": "Caricamento recensioni…", "reviews.emptyTitle": "Nessuna recensione ancora", "reviews.emptyMessage": "Accoda una sincronizzazione recensioni dopo aver collegato lo store. Questa scheda resta utilizzabile con elenco vuoto.", "reviews.col.product": "Prodotto", "reviews.col.reviewer": "Recensore", "reviews.col.rating": "Valutazione", "reviews.col.review": "Rivedi", - "reviews.queuedSuccess": "Sincronizzazione recensioni in coda. Partirà a breve.", + "reviews.queuedSuccess": "Sincronizzazione recensioni in coda. Partirà a breve.", "reviews.queueFailed": "Impossibile accodare la sincronizzazione recensioni", "campaigns.title": "Campagne", "campaigns.description": "Crea campagne email stagionali dal catalogo: scegli la stagione, seleziona i prodotti, imposta il pubblico e genera.", "campaigns.new": "Nuova campagna", - "campaigns.loading": "Caricamento campagne…", + "campaigns.loading": "Caricamento campagne…", "campaigns.loadFailed": "Caricamento non riuscito campagne", - "campaigns.deleteConfirm": "Eliminare la campagna “{name}”? L’azione non può essere annullata.", + "campaigns.deleteConfirm": "Eliminare la campagna “{name}”? L’azione non può essere annullata.", "campaigns.deleted": "Campagna eliminata", "campaigns.deleteFailed": "Eliminazione campagna non riuscita", - "campaigns.partialUnavailable": "Le campagne non sono pienamente raggiungibili al momento. Genera e invia potrebbero non riuscire finché il servizio non torna.", - "campaigns.searchPlaceholder": "Cerca campagne…", + "campaigns.partialUnavailable": "Le campagne non sono pienamente raggiungibili al momento. Genera e invia potrebbero non riuscire finché il servizio non torna.", + "campaigns.searchPlaceholder": "Cerca campagne…", "campaigns.unavailableTitle": "Campagne non disponibili", - "campaigns.unavailableMessage": "Il servizio campagne non è raggiungibile. Puoi aprire la procedura guidata, ma genera e invia aspetteranno il ritorno del servizio.", + "campaigns.unavailableMessage": "Il servizio campagne non è raggiungibile. Puoi aprire la procedura guidata, ma genera e invia aspetteranno il ritorno del servizio.", "campaigns.openWizard": "Apri procedura guidata di creazione", "campaigns.backDashboard": "Torna alla dashboard", "campaigns.browseProducts": "Sfoglia prodotti", "campaigns.emptyTitle": "Nessun campagne ancora", "campaigns.noMatches": "Nessuna corrispondenza", - "campaigns.emptyMessage": "Crea una campagna Black Friday, Natale o personalizzata in pochi passaggi — i modelli stagionali sono pronti per iniziare.", + "campaigns.emptyMessage": "Crea una campagna Black Friday, Natale o personalizzata in pochi passaggi — i modelli stagionali sono pronti per iniziare.", "campaigns.noMatchesMessage": "Prova un nome, stagione o stato diverso.", "campaigns.create": "Crea campagna", "campaigns.col.season": "Stagione", @@ -1926,9 +1926,9 @@ export const it: MessageDict = { "campaigns.newTitle": "Nuova campagna", "campaigns.newDesc": "Scegli una stagione, seleziona prodotti e pubblico, scrivi il prompt, poi genera, testa e programma.", "campaigns.editTitle": "Modifica campagna", - "campaigns.editDesc": "Aggiorna stagione, prodotti e pubblico — poi rigenera, invia un test o programma.", - "campaignWizard.loading": "Caricamento procedura guidata campagna…", - "campaignWizard.apiMissing": "L'API campagne è temporaneamente non disponibile. Puoi esplorare la procedura; salva / genera / invia richiedono /api/campaigns raggiungibile.", + "campaigns.editDesc": "Aggiorna stagione, prodotti e pubblico — poi rigenera, invia un test o programma.", + "campaignWizard.loading": "Caricamento procedura guidata campagna…", + "campaignWizard.apiMissing": "L'API campagne è temporaneamente non disponibile. Puoi esplorare la procedura; salva / genera / invia richiedono /api/campaigns raggiungibile.", "campaignWizard.upgradeTitle": "Le campagne IA sono una funzione a pagamento", "campaignWizard.upgradeMessage": "I piani Free possono preparare stagioni e audience, ma Genera IA richiede Starter o superiore. Aggiorna per sbloccare bozze e-mail IA.", "campaignWizard.comparePlans": "Confronta i piani", @@ -1939,29 +1939,29 @@ export const it: MessageDict = { "campaignWizard.step.preview": "Anteprima", "campaignWizard.step.send": "Invia", "campaignWizard.pickSeason": "Scegli una stagione", - "campaignWizard.pickSeasonHelp": "Parti da un modello — puoi modificare tutto dopo.", + "campaignWizard.pickSeasonHelp": "Parti da un modello — puoi modificare tutto dopo.", "campaignWizard.name": "Nome campagna", "campaignWizard.namePlaceholder": "Black Friday 2026", "campaignWizard.catalogTitle": "Categorie e prodotti", "campaignWizard.catalogHelp": "Seleziona cosa deve evidenziare questa e-mail. Bastano le categorie per iniziare in fretta.", "campaignWizard.categories": "Categorie", - "campaignWizard.noCategories": "Nessuna categoria ancora — aggiungine in Catalogo.", + "campaignWizard.noCategories": "Nessuna categoria ancora — aggiungine in Catalogo.", "campaignWizard.categoriesSelected": "{count} categoria selezionata", "campaignWizard.categoriesSelectedPlural": "{count} categorie selezionate", "campaignWizard.productsOptional": "Prodotti (facoltativo)", "campaignWizard.selectedCount": "{count} selezionati", - "campaignWizard.searchProducts": "Cerca prodotti…", + "campaignWizard.searchProducts": "Cerca prodotti…", "campaignWizard.noProducts": "Nessun prodotti trovato.", "campaignWizard.audienceTitle": "Chi dovrebbe riceverlo?", "campaignWizard.audienceHelp": "Predefinito a tutti. Restringi con categorie o acquirenti passati quando gli ordini sono sync.", "campaignWizard.audience.all": "Tutti i contatti", - "campaignWizard.audience.allHint": "Invia a tutta la lista (quando il provider e-mail è configurato).", + "campaignWizard.audience.allHint": "Invia a tutta la lista (quando il provider e-mail è configurato).", "campaignWizard.audience.byCategory": "Per interesse di categoria", "campaignWizard.audience.byCategoryHint": "Persone associate alle categorie selezionate.", "campaignWizard.audience.purchased": "Acquistato in categoria", "campaignWizard.audience.purchasedHint": "Clienti che hanno acquistato prodotti nelle categorie audience (da ordini sync).", "campaignWizard.audience.notPurchased": "Non ancora acquistato", - "campaignWizard.audience.notPurchasedHint": "Contatti che non hanno acquistato quelle categorie — ottimo per win-back.", + "campaignWizard.audience.notPurchasedHint": "Contatti che non hanno acquistato quelle categorie — ottimo per win-back.", "campaignWizard.ordersHint": "Il targeting acquistato / non acquistato compare dopo la sync degli ordini WooCommerce.", "campaignWizard.audienceCategories": "Categorie audience", "campaignWizard.promptTitle": "Prompt e-mail", @@ -1974,7 +1974,7 @@ export const it: MessageDict = { "campaignWizard.planFree": "Gratuito", "campaignWizard.planPaid": "A pagamento", "campaignWizard.planLine": "Piano:", - "campaignWizard.aiLocked": "— Genera IA è bloccato.", + "campaignWizard.aiLocked": "— Genera IA è bloccato.", "campaignWizard.generateAi": "Genera IA", "campaignWizard.templatePreview": "Anteprima modello", "campaignWizard.saveDraft": "Salva bozza", @@ -2005,9 +2005,9 @@ export const it: MessageDict = { "campaignWizard.completeStep": "Completa questo passaggio per continuare", "campaignWizard.aiDraftReady": "Bozza IA generata", "campaignWizard.templateReady": "Anteprima modello pronta", - "campaignWizard.unavailableSave": "Le campagne non sono disponibili. Le bozze non possono essere salvate finché la funzione non è attiva.", + "campaignWizard.unavailableSave": "Le campagne non sono disponibili. Le bozze non possono essere salvate finché la funzione non è attiva.", "campaignWizard.generateFailed": "Generazione non riuscita", - "campaignWizard.generateFirst": "Genera prima un’anteprima", + "campaignWizard.generateFirst": "Genera prima un’anteprima", "campaignWizard.enterTestEmail": "Inserisci un indirizzo email di test", "campaignWizard.testFailed": "Invio di test non riuscito", "campaignWizard.pickSchedule": "Scegli data e ora", @@ -2020,38 +2020,38 @@ export const it: MessageDict = { "marketing.calendarDesc": "Collega campagne stagionali alle date, poi prepara un feed di export con default shopping.", "marketing.loadFailed": "Impossibile caricare il calendario", "marketing.prepared": "Campagna preparata", - "marketing.alreadyReady": "La campagna è già pronta", - "marketing.exportFeedsHint": "{name} → Feed di esportazione", + "marketing.alreadyReady": "La campagna è già pronta", + "marketing.exportFeedsHint": "{name} → Feed di esportazione", "marketing.prepareFailed": "Impossibile preparare la campagna", "marketing.requestFailed": "Richiesta non riuscita", "marketing.emptyTitle": "Nessun preset stagionale", - "marketing.emptyMessage": "I preset del calendario appariranno qui quando l’API marketing sarà disponibile.", + "marketing.emptyMessage": "I preset del calendario appariranno qui quando l’API marketing sarà disponibile.", "marketing.openCampaigns": "Apri campagne e-mail", "marketing.window": "Finestra:", "marketing.linkedExport": "Export collegato:", "marketing.openPrepared": "Apri feed preparato", - "marketing.preparing": "Preparazione…", + "marketing.preparing": "Preparazione…", "marketing.prepareNamed": "Prepara campagna {name}", - "marketing.footer": "Le campagne e-mail restano su {link} — questa pagina prepara solo i feed di export del catalogo.", + "marketing.footer": "Le campagne e-mail restano su {link} — questa pagina prepara solo i feed di export del catalogo.", "common.done": "Fatto", "common.copied": "Copiato negli appunti.", "common.copyFailed": "Impossibile copiare. Seleziona il testo e copialo manualmente.", - "common.submitting": "Invio…", - "common.sending": "Invio…", + "common.submitting": "Invio…", + "common.sending": "Invio…", "settings.companyAdminOnlyView": "Solo gli admin azienda possono modificare le impostazioni. Puoi vedere i dettagli dell'area di lavoro attuale.", "settings.activeCompanyHelp": "Area di lavoro per catalogo, feed, fatturazione e chiavi API. Cambia in qualsiasi momento da qui o dall'intestazione.", "settings.noCompanySelected": "Nessuna azienda selezionata", - "settings.creditsOverviewHelp": "Saldo crediti IA dell'azienda attiva. L'utilizzo dettagliato è in Fatturazione.", + "settings.creditsOverviewHelp": "Saldo crediti IA dell'azienda attiva. L'utilizzo dettagliato è in Fatturazione.", "settings.billingLabel": "Fatturazione", "settings.remainingLabel": "Rimanenti", - "settings.creditsUnavailable": "Il saldo crediti non è ancora disponibile per quest'area di lavoro.", + "settings.creditsUnavailable": "Il saldo crediti non è ancora disponibile per quest'area di lavoro.", "settings.openBilling": "Apri utilizzo e fatturazione", "settings.companyNameHelp": "Questo nome compare negli inviti e nelle impostazioni dell'organizzazione", "settings.contentSettingsHelp": "Configura lingua e corrispondenza prodotti per i contenuti generati", "settings.mergeProductsHelp": "Se abilitato, gli import CSV uniscono le righe con lo stesso GTIN in un prodotto. Disattiva per mantenere ogni riga indipendente.", "settings.emailIntegrationHelp": "Configura Resend o SMTP per inviti, campagne e mail transazionali.", "settings.configureEmail": "Configura e-mail", - "settings.aiIntegrationsHelp": "Crediti piattaforma o la tua chiave, più prompt modificabili per titoli, descrizioni, SEO e campagne. Chiavi cifrate a riposo.", + "settings.aiIntegrationsHelp": "Crediti piattaforma o la tua chiave, più prompt modificabili per titoli, descrizioni, SEO e campagne. Chiavi cifrate a riposo.", "settings.openAiIntegrations": "Apri integrazioni IA", "settings.companyNameRequired": "Inserisci un nome azienda.", "settings.companySaved": "Impostazioni azienda salvate.", @@ -2061,82 +2061,82 @@ export const it: MessageDict = { "settings.mergeUpdateFailed": "Impossibile aggiornare l'impostazione di unione", "settings.inAppToastsHelp": "Solo in questo browser. Gli errori sono attivi di default; i completamenti sono silenziati per ridurre il rumore. Feedback dei form e Annulla non vengono mai silenziati.", "settings.emailAlertsHelp": "Le preferenze di avviso e-mail arrivano presto. Gli avvisi di errore saranno on di default (come in-app); le email di completamento restano off salvo opt-in.", - "settings.emailAlertsBody": "Per ora configura la mail transazionale in Azienda → Integrazione e-mail. Gli avvisi in-app sopra restano validi.", - "settings.apiKeysLegacyNotice": "Le chiavi API legacy non sono state migrate. Creane una nuova per ripristinare l’accesso — il segreto è mostrato una sola volta.", + "settings.emailAlertsBody": "Per ora configura la mail transazionale in Azienda → Integrazione e-mail. Gli avvisi in-app sopra restano validi.", + "settings.apiKeysLegacyNotice": "Le chiavi API legacy non sono state migrate. Creane una nuova per ripristinare l’accesso — il segreto è mostrato una sola volta.", "settings.apiKeysAdminOnly": "Solo gli amministratori possono creare o revocare chiavi API. Puoi vedere i prefissi esistenti.", - "settings.apiKeysCopyUnavailableNotice": "Copia non disponibile per chiavi esistenti — è salvato solo il prefisso. Crea una nuova chiave per copiare il segreto una volta, poi revoca la vecchia se serve.", - "settings.apiKeysForbidden": "Non hai l’autorizzazione a vedere le chiavi API. Chiedi aiuto a un amministratore.", + "settings.apiKeysCopyUnavailableNotice": "Copia non disponibile per chiavi esistenti — è salvato solo il prefisso. Crea una nuova chiave per copiare il segreto una volta, poi revoca la vecchia se serve.", + "settings.apiKeysForbidden": "Non hai l’autorizzazione a vedere le chiavi API. Chiedi aiuto a un amministratore.", "settings.noApiKeys": "Nessuna chiave API ancora", - "settings.noApiKeysHelpAdmin": "Le chiavi API legacy non sono state migrate. Creane una per autenticare le richieste Descrybe (X-API-Key). Il segreto completo è mostrato una sola volta.", - "settings.noApiKeysHelpMember": "Nessuna chiave API per questa azienda. Le chiavi legacy non sono state migrate — chiedi a un amministratore di crearne una.", + "settings.noApiKeysHelpAdmin": "Le chiavi API legacy non sono state migrate. Creane una per autenticare le richieste Descrybe (X-API-Key). Il segreto completo è mostrato una sola volta.", + "settings.noApiKeysHelpMember": "Nessuna chiave API per questa azienda. Le chiavi legacy non sono state migrate — chiedi a un amministratore di crearne una.", "settings.unnamedKey": "Chiave senza nome", "settings.neverUsed": "Mai usato", "settings.apiKeyActions": "Azioni chiave API", "settings.copyUnavailable": "Copia non disponibile", - "settings.copyUnavailableTitle": "Il segreto completo è mostrato una sola volta alla creazione della chiave", + "settings.copyUnavailableTitle": "Il segreto completo è mostrato una sola volta alla creazione della chiave", "settings.revoke": "Revoca", "settings.apiKeyNameRequired": "Inserisci un nome per questa chiave API.", - "settings.apiKeyCreatedOnce": "Chiave API creata. Copiala ora — non verrà più mostrata.", + "settings.apiKeyCreatedOnce": "Chiave API creata. Copiala ora — non verrà più mostrata.", "settings.apiKeyCreated": "Chiave API creata.", "settings.apiKeyCreateFailed": "Impossibile creare la chiave API", "settings.apiKeyRevokeConfirm": "Revocare questa chiave API? Le richieste che la usano smetteranno di funzionare.", "settings.apiKeyRevoked": "Chiave API revocata.", "settings.apiKeyRevokeFailed": "Impossibile revocare la chiave API", "settings.apiKeyCopied": "Chiave API copiata.", - "settings.createApiKeyOnceHelp": "Copia questa chiave ora — non verrà più mostrata. Usala come Authorization: Bearer o X-API-Key su /api/v1.", + "settings.createApiKeyOnceHelp": "Copia questa chiave ora — non verrà più mostrata. Usala come Authorization: Bearer o X-API-Key su /api/v1.", "settings.createApiKeyNameHelp": "Dai un nome alla chiave per distinguerla dopo. Dopo la creazione, inviala come Authorization: Bearer (consigliato) o X-API-Key.", "settings.keyNamePlaceholder": "es. Production", "settings.newApiKeyAria": "Nuova chiave API mostrata una volta", "settings.copyApiKeyAria": "Copia chiave API", "settings.alert.sync_fail.title": "Errori di sync", - "settings.alert.sync_fail.description": "Quando una sincronizzazione feed scade o l’API restituisce un errore.", + "settings.alert.sync_fail.description": "Quando una sincronizzazione feed scade o l’API restituisce un errore.", "settings.alert.sync_done.title": "Sync completata", "settings.alert.sync_done.description": "Quando una sincronizzazione feed termina con successo.", "settings.alert.ai_fail.title": "Errori IA / elaborazione", - "settings.alert.ai_fail.description": "Quando l’avvio o l’esecuzione di un job di elaborazione fallisce.", + "settings.alert.ai_fail.description": "Quando l’avvio o l’esecuzione di un job di elaborazione fallisce.", "settings.alert.ai_done.title": "IA / elaborazione completata", - "settings.alert.ai_done.description": "Quando un job in background termina con successo. I toast di avvio restano sempre on così Annulla resta disponibile.", + "settings.alert.ai_done.description": "Quando un job in background termina con successo. I toast di avvio restano sempre on così Annulla resta disponibile.", "settings.alert.export_fail.title": "Errori di esportazione", - "settings.alert.export_fail.description": "Quando un’esportazione di prodotto o feed di esportazione fallisce.", + "settings.alert.export_fail.description": "Quando un’esportazione di prodotto o feed di esportazione fallisce.", "settings.alert.export_done.title": "Esportazione completata", - "settings.alert.export_done.description": "Quando un’esportazione termina con successo.", + "settings.alert.export_done.description": "Quando un’esportazione termina con successo.", "settings.alert.support_reply.title": "Risposte dello staff di supporto", "settings.alert.support_reply.description": "Quando un agente della piattaforma risponde al tuo ticket di supporto.", "settings.alert.support_status.title": "Modifiche di stato del supporto", "settings.alert.support_status.description": "Quando un ticket di supporto passa a in sospeso o risolto.", "empty.forbidden.title.company": "Permesso negato", "empty.forbidden.title.platform": "Accesso limitato", - "empty.forbidden.message.company": "Non hai l’autorizzazione. Chiedi aiuto a un amministratore dell’azienda.", - "empty.forbidden.message.platform": "Quest’area è disponibile solo agli amministratori della piattaforma.", - "empty.forbidden.message.support": "Quest’area è disponibile solo allo staff di supporto e agli amministratori della piattaforma.", + "empty.forbidden.message.company": "Non hai l’autorizzazione. Chiedi aiuto a un amministratore dell’azienda.", + "empty.forbidden.message.platform": "Quest’area è disponibile solo agli amministratori della piattaforma.", + "empty.forbidden.message.support": "Quest’area è disponibile solo allo staff di supporto e agli amministratori della piattaforma.", "empty.forbidden.backDashboard": "Torna alla dashboard", - "empty.forbidden.apiKeys": "Non hai l’autorizzazione a vedere le chiavi API. Chiedi aiuto a un amministratore.", - "empty.forbidden.ai": "Non hai l’autorizzazione a vedere le impostazioni del provider IA. Chiedi aiuto a un amministratore.", - "empty.forbidden.email": "Non hai l’autorizzazione a vedere le impostazioni del provider e-mail. Chiedi aiuto a un amministratore.", + "empty.forbidden.apiKeys": "Non hai l’autorizzazione a vedere le chiavi API. Chiedi aiuto a un amministratore.", + "empty.forbidden.ai": "Non hai l’autorizzazione a vedere le impostazioni del provider IA. Chiedi aiuto a un amministratore.", + "empty.forbidden.email": "Non hai l’autorizzazione a vedere le impostazioni del provider e-mail. Chiedi aiuto a un amministratore.", "confirm.defaultTitle": "Conferma eliminazione", "confirm.defaultDescription": "Sei sicuro?", "confirm.defaultConfirm": "Conferma", - "confirm.deleteFeed": "Eliminare il feed “{name}”? Operazione irreversibile.", - "confirm.deleteCampaign": "Eliminare la campagna “{name}”? L’azione non può essere annullata.", + "confirm.deleteFeed": "Eliminare il feed “{name}”? Operazione irreversibile.", + "confirm.deleteCampaign": "Eliminare la campagna “{name}”? L’azione non può essere annullata.", "confirm.deleteExportFeed": "Sei sicuro di voler eliminare questo feed di esportazione?", "confirm.rotateExportToken": "Ruotare il token URL del feed? Il vecchio URL pubblico smettera di funzionare subito.", - "confirm.deleteUpload": "Eliminare “{name}”? Rimuove il record di upload (e il blob locale se presente).", + "confirm.deleteUpload": "Eliminare “{name}”? Rimuove il record di upload (e il blob locale se presente).", "confirm.revokeApiKey": "Revocare questa chiave API? Le richieste che la usano smetteranno di funzionare.", "confirm.deleteKnowledgeArticle": "Eliminare questo articolo della knowledge base?", "confirm.deleteReplyTemplate": "Eliminare questo modello di risposta?", - "confirm.deleteStructuredField": "Sei sicuro di voler eliminare questo campo? L’azione non può essere annullata.", + "confirm.deleteStructuredField": "Sei sicuro di voler eliminare questo campo? L’azione non può essere annullata.", "toast.campaign.pickAudience": "Scegli almeno una categoria o un prodotto", "toast.campaign.pickCategories": "Scegli le categorie di pubblico per questo filtro", "toast.campaign.completeStep": "Completa questo passaggio per continuare", "toast.campaign.aiDraft": "Bozza IA generata", "toast.campaign.templatePreview": "Anteprima modello pronta", - "toast.campaign.generateFirst": "Genera prima un’anteprima", + "toast.campaign.generateFirst": "Genera prima un’anteprima", "toast.campaign.testSent": "Email di test inviata a {email}", "toast.campaign.scheduled": "Campagna programmata", "toast.campaign.draftSaved": "Bozza salvata", "toast.campaign.deleted": "Campagna eliminata", "toast.campaign.prepared": "Campagna preparata", - "toast.campaign.alreadyReady": "La campagna è già pronta", + "toast.campaign.alreadyReady": "La campagna è già pronta", "toast.campaign.prepareFailed": "Impossibile preparare la campagna", "toast.campaign.deleteFailed": "Eliminazione campagna non riuscita", "toast.feed.copyFailed": "Impossibile copiare l'URL", @@ -2180,12 +2180,12 @@ export const it: MessageDict = { "toast.support.loadTicketFailed": "Caricamento ticket non riuscito", "toast.support.replyFailed": "Impossibile inviare la risposta", "toast.support.ratingUnavailable": "Valutazione non disponibile", - "toast.support.alreadyRated": "Già valutato", + "toast.support.alreadyRated": "Già valutato", "toast.support.ratingFailed": "Impossibile inviare la valutazione", "toast.structured.fieldAdded": "Campo aggiunto", - "toast.structured.fieldAddedBody": "Il campo di descrizione strutturata è stato aggiunto.", + "toast.structured.fieldAddedBody": "Il campo di descrizione strutturata è stato aggiunto.", "toast.structured.fieldDeleted": "Campo eliminato", - "toast.structured.fieldDeletedBody": "Il campo di descrizione strutturata è stato eliminato.", + "toast.structured.fieldDeletedBody": "Il campo di descrizione strutturata è stato eliminato.", "toast.structured.addFailed": "Aggiunta campo non riuscita", "toast.structured.deleteFailed": "Impossibile eliminare il campo", "toast.brand.saved": "Brand kit salvato", @@ -2208,10 +2208,10 @@ export const it: MessageDict = { "toast.attrs.deleteFailed": "Eliminazione non riuscita", "toast.switcher.loadUsersFailed": "Impossibile caricare gli utenti commutabili", "toast.switcher.switchFailed": "Impossibile cambiare utente", - "toast.switcher.returnFailed": "Impossibile tornare all’utente originale", + "toast.switcher.returnFailed": "Impossibile tornare all’utente originale", "toast.switcher.companyFailed": "Impossibile cambiare azienda", "toast.requestFailed": "Richiesta non riuscita", - "flash.campaign.unavailableDraft": "Le campagne non sono disponibili. Le bozze non possono essere salvate finché la funzione non è attiva.", + "flash.campaign.unavailableDraft": "Le campagne non sono disponibili. Le bozze non possono essere salvate finché la funzione non è attiva.", "flash.campaign.testEmailRequired": "Inserisci un indirizzo email di test", "flash.campaign.scheduleRequired": "Scegli data e ora", "flash.campaign.unavailable": "Le campagne non sono disponibili al momento.", @@ -2222,7 +2222,7 @@ export const it: MessageDict = { "flash.feed.copyFailed": "Impossibile copiare l'URL", "flash.feed.csvRequired": "Scegli un file .csv.", "flash.feed.csvFileRequired": "Scegli un file CSV.", - "flash.feed.urlRequired": "L’URL del feed è obbligatoria.", + "flash.feed.urlRequired": "L’URL del feed è obbligatoria.", "flash.feed.updated": "Feed aggiornato.", "flash.feed.syncFinishedNamed": "Sincronizzazione terminata per \"{name}\" ({status}: {products}).", "flash.feed.deleted": "Feed eliminato.", @@ -2237,21 +2237,21 @@ export const it: MessageDict = { "flash.settings.apiKeyRevoked": "Chiave API revocata.", "flash.settings.apiKeyRevokeFailed": "Impossibile revocare la chiave API", "flash.settings.copyFailed": "Impossibile copiare. Seleziona il testo e copialo manualmente.", - "flash.products.accepted": "Accettati {count} prodotto/i — spostati in Elaborati.", + "flash.products.accepted": "Accettati {count} prodotto/i — spostati in Elaborati.", "flash.products.updated": "Prodotto aggiornato.", - "flash.products.enrichmentAccepted": "Arricchimento accettato — spostato in Elaborati.", - "flash.products.originalEmpty": "Il valore originale è vuoto; l'arricchimento non può essere cancellato via PATCH.", + "flash.products.enrichmentAccepted": "Arricchimento accettato — spostato in Elaborati.", + "flash.products.originalEmpty": "Il valore originale è vuoto; l'arricchimento non può essere cancellato via PATCH.", "flash.products.selectExport": "Seleziona almeno un prodotto da esportare.", "flash.products.exported": "Esportati {count} prodotto/i tramite feed di esportazione.", "flash.support.missingId": "ID ticket mancante", "flash.support.notFound": "Ticket non trovato", - "flash.support.unavailable": "Il supporto è temporaneamente non disponibile.", - "flash.support.ratingUnavailable": "La valutazione non è temporaneamente disponibile. Riprova più tardi.", - "flash.support.alreadyRated": "Hai già valutato questo ticket.", - "flash.support.queueUnavailable": "La coda di supporto non è disponibile in questo deployment.", - "flash.support.deploymentUnavailable": "Il supporto non è disponibile su questo deployment.", - "flash.support.replyRequired": "Il corpo della risposta è obbligatorio.", - "flash.support.draftRequired": "Il corpo della bozza è obbligatorio prima dell’approvazione.", + "flash.support.unavailable": "Il supporto è temporaneamente non disponibile.", + "flash.support.ratingUnavailable": "La valutazione non è temporaneamente disponibile. Riprova più tardi.", + "flash.support.alreadyRated": "Hai già valutato questo ticket.", + "flash.support.queueUnavailable": "La coda di supporto non è disponibile in questo deployment.", + "flash.support.deploymentUnavailable": "Il supporto non è disponibile su questo deployment.", + "flash.support.replyRequired": "Il corpo della risposta è obbligatorio.", + "flash.support.draftRequired": "Il corpo della bozza è obbligatorio prima dell’approvazione.", "flash.support.claimed": "Ticket preso in carico.", "flash.support.unassigned": "Ticket non assegnato.", "flash.support.assigneeCleared": "Assegnatario rimosso.", @@ -2260,17 +2260,17 @@ export const it: MessageDict = { "flash.support.draftSent": "Bozza inviata come risposta dello staff.", "flash.support.draftDiscarded": "Bozza IA scartata. Ticket passato alla coda umana.", "flash.support.autoReplyDisabled": "Risposta automatica disattivata (bozza lasciata come nota interna).", - "flash.structured.keyRequired": "La chiave del campo è obbligatoria", + "flash.structured.keyRequired": "La chiave del campo è obbligatoria", "flash.category.nameRequired": "Nome e ID univoco sono obbligatori.", - "flash.category.textEmpty": "Il testo non può essere vuoto", + "flash.category.textEmpty": "Il testo non può essere vuoto", "flash.export.noConfigs": "Nessun feed di esportazione ancora. Creane uno in Feed di esportazione, poi torna a esportare la selezione.", "flash.export.selectFormat": "Seleziona un feed di esportazione.", "flash.files.deleted": "Upload eliminato.", - "flash.mapping.noSuggestions": "Nessun suggerimento — controlla i nomi dei campi sorgente.", - "flash.mapping.allMapped": "Tutti i suggerimenti sono già mappati. Controlla i chip di confidenza nella tabella.", - "flash.mapping.extractFirst": "Nessun suggerimento — estrai prima lo schema.", + "flash.mapping.noSuggestions": "Nessun suggerimento — controlla i nomi dei campi sorgente.", + "flash.mapping.allMapped": "Tutti i suggerimenti sono già mappati. Controlla i chip di confidenza nella tabella.", + "flash.mapping.extractFirst": "Nessun suggerimento — estrai prima lo schema.", "flash.mapping.pathRequired": "Inserisci un percorso elemento prodotto prima di mappare i campi.", - "flash.billing.checkoutCanceled": "Checkout annullato. Nessuna modifica è stata apportata.", + "flash.billing.checkoutCanceled": "Checkout annullato. Nessuna modifica è stata apportata.", "flash.billing.portalReturn": "Tornato dal portale di fatturazione. Gestisci il piano qui o in Plans.", "flash.billing.invalidAmount": "Inserisci un importo crediti valido.", "flash.billing.companyNotFound": "Azienda non trovata.", @@ -2278,7 +2278,7 @@ export const it: MessageDict = { "flash.unsubscribe.missingToken": "Token di disiscrizione mancante.", "flash.unsubscribe.loadFailed": "Impossibile caricare lo stato di disiscrizione.", "flash.unsubscribe.failed": "Disiscrizione non riuscita.", - "flash.seo.filledMeta": "Meta compilata per “{label}” ({mode}).", + "flash.seo.filledMeta": "Meta compilata per “{label}” ({mode}).", "flash.shopify.saved": "Impostazioni Shopify salvate.", "flash.woo.saved": "Impostazioni WooCommerce salvate.", "flash.woo.syncSaved": "Impostazioni di sincronizzazione salvate.", @@ -2289,9 +2289,9 @@ export const it: MessageDict = { "flash.ai.connectionOk": "Connessione OK ({detail}).", "flash.ai.connectionByok": ", la tua chiave", "flash.email.saved": "Provider e-mail salvato. Verifica il dominio, poi invia un test.", - "flash.email.testDryRun": "Test registrato in dry-run — nessuna email inviata.", - "flash.email.testSent": "Email di test inviata. L’indirizzo mittente è segnato come verificato se la consegna riesce.", - "flash.fields.apiUnavailable": "L'API dei campi standard non è disponibile. Le modifiche non possono essere salvate.", + "flash.email.testDryRun": "Test registrato in dry-run — nessuna email inviata.", + "flash.email.testSent": "Email di test inviata. L’indirizzo mittente è segnato come verificato se la consegna riesce.", + "flash.fields.apiUnavailable": "L'API dei campi standard non è disponibile. Le modifiche non possono essere salvate.", "flash.fields.updated": "Campo aggiornato correttamente", "flash.fields.created": "Campo creato correttamente", "flash.fields.enabledRecommended": "Campi ecommerce consigliati abilitati", @@ -2299,13 +2299,14 @@ export const it: MessageDict = { "flash.fields.groupUpdated": "Gruppo aggiornato correttamente", "flash.fields.groupCreated": "Gruppo creato correttamente", "flash.fields.groupDeleted": "Gruppo eliminato correttamente", - "flash.processing.cancelled": "\"{name}\" è stato annullato.", + "flash.processing.cancelled": "\"{name}\" è stato annullato.", "flash.processing.retried": "\"{name}\" messo in coda per riprovare.", "flash.admin.staffRoleUpdated": "Ruolo staff aggiornato per {email}.", "flash.admin.staffRoleUnavailable": "Gli aggiornamenti del ruolo staff non sono ancora disponibili su questo server.", - "flash.admin.catalogCloned": "Copiato {source} in {dest}: {products} prodotti, {categories} categorie.", - "flash.admin.fixA1Success": "Riparazione catalogo per {name} completata: {prompts} prompt aggiornati, {hashes} hash cancellati, {categories} categorie integrate.", + "flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.", + "flash.admin.fixA1Success": "Catalog repair finished for {name}: {prompts} prompts, {hashes} hashes, {categories} processed←mapped, {mapped_backfilled} mapped←processed. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).", "flash.admin.fixA1Error": "Riparazione catalogo per {name} non riuscita.", + "flash.admin.cloneDestMissing": "No sandbox destination. Switch to Platform Demo (staff home), then clone again.", "flash.admin.planAssigned": "Piano assegnato a {name}.", "flash.admin.planAssignedShort": "Piano assegnato.", "flash.admin.creditsUpdated": "Crediti aggiornati.", @@ -2315,14 +2316,14 @@ export const it: MessageDict = { "flash.admin.smtpOff": "disattivo", "flash.admin.localPasswordSet": "Password locale impostata per {email}.", "flash.admin.localPasswordUnavailable": "Gli strumenti password locale non sono disponibili in questo ambiente.", - "flash.admin.switchedUser": "Utente cambiato. Ricaricamento…", - "flash.admin.switchUnavailable": "Il cambio utente non è disponibile in questo ambiente.", + "flash.admin.switchedUser": "Utente cambiato. Ricaricamento…", + "flash.admin.switchUnavailable": "Il cambio utente non è disponibile in questo ambiente.", "flash.admin.diagnosticsRateLimit": "Limite diagnostica raggiunta (20/min). Attendi un minuto e aggiorna.", "flash.admin.smtpSaved": "Impostazioni SMTP della piattaforma salvate. Le password restano nascoste.", "flash.admin.integrationSaved": "Impostazioni di integrazione salvate. I campi segreti non vengono mai rimessi in chiaro.", - "flash.admin.aiSaved": "Impostazioni IA {label} salvate. Le chiavi API non vengono più mostrate.", + "flash.admin.aiSaved": "Impostazioni IA {label} salvate. Le chiavi API non vengono più mostrate.", "flash.admin.cleanup": "Pulizia: {jobs} job non riusciti, {products} prodotti reimpostati.", - "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", + "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", "flash.admin.orphanDeleted": "Deleted {deleted} orphan row(s). Remaining: {remaining}.", "flash.admin.articleUpdated": "Articolo aggiornato.", "flash.admin.articleCreated": "Articolo creato.", @@ -2337,20 +2338,20 @@ export const it: MessageDict = { "flash.admin.featuresAllOn": "Tutte le funzioni abilitate per questo piano.", "flash.admin.featuresAllOff": "Tutte le funzioni disabilitate per questo piano.", "flash.admin.profileApplied": "Profilo {label} applicato a {name}.", - "flash.admin.overridesCleared": "Override cancellati — uso dei valori predefiniti del nome piano.", + "flash.admin.overridesCleared": "Override cancellati — uso dei valori predefiniti del nome piano.", "empty.plans.none": "Nessun piano trovato.", "empty.plans.noMatch": "Nessun piano corrisponde a questo filtro.", "empty.plans.selectPackage": "Seleziona un pacchetto per modificare le funzioni.", "empty.products.processingTitle": "Nessun prodotto in elaborazione", - "empty.products.processingMessageCan": "L’avanzamento live è in Elaborazione. Apri un job in corso per vedere lo stato dei passaggi; questa scheda elencherà i prodotti in corso quando il filtro per elementi sarà disponibile.", - "empty.products.processingMessageCannot": "I prodotti attualmente in un job compaiono qui una volta avviata l’elaborazione dal catalogo.", + "empty.products.processingMessageCan": "L’avanzamento live è in Elaborazione. Apri un job in corso per vedere lo stato dei passaggi; questa scheda elencherà i prodotti in corso quando il filtro per elementi sarà disponibile.", + "empty.products.processingMessageCannot": "I prodotti attualmente in un job compaiono qui una volta avviata l’elaborazione dal catalogo.", "empty.products.reviewTitle": "Nessun prodotto da revisionare", "empty.products.reviewMessage": "Dopo un job, i prodotti arricchiti arrivano qui. Apri una riga per confrontare originale vs arricchito, poi Accetta, modifica o Rifiuta.", "empty.products.errorTitle": "Nessun prodotto con errori", - "empty.products.errorMessage": "Quando un job fallisce per un prodotto, compare qui così puoi riprovare.", + "empty.products.errorMessage": "Quando un job fallisce per un prodotto, compare qui così puoi riprovare.", "empty.products.filterTitleUnprocessed": "Nessuna corrispondenza non elaborata", "empty.products.filterTitle": "Nessun prodotto corrisponde", - "empty.products.filterMessage": "Prova un’altra ricerca, categoria o feed — oppure cancella i filtri per vedere tutto.", + "empty.products.filterMessage": "Prova un’altra ricerca, categoria o feed — oppure cancella i filtri per vedere tutto.", "empty.products.unprocessedTitle": "Nessun prodotto non elaborato ancora", "empty.products.unprocessedMessage": "Collega un feed fornitore o carica un CSV per importare prodotti nel catalogo.", "empty.products.noneTitle": "Nessun prodotto ancora", @@ -2365,21 +2366,21 @@ export const it: MessageDict = { "empty.products.addProduct": "Aggiungi prodotto", "empty.products.uploadCsv": "Carica CSV", "empty.feeds.noneTitle": "Nessun feed prodotti ancora", - "empty.feeds.noneMessage": "Collega un URL CSV/XML fornitore o carica un file. Avanti: Map → Sync → Process.", + "empty.feeds.noneMessage": "Collega un URL CSV/XML fornitore o carica un file. Avanti: Map → Sync → Process.", "empty.feeds.noMatchTitle": "Nessun feed corrispondente", "empty.feeds.noMatchMessage": "Prova un altro termine di ricerca, oppure cancella la ricerca per vedere tutti i feed.", "empty.export.loadFailedTitle": "Impossibile caricare i feed di esportazione", - "empty.export.loadFailedMessage": "Qualcosa è andato storto nel caricamento delle esportazioni. Riprova o controlla l'errore sopra per i dettagli.", + "empty.export.loadFailedMessage": "Qualcosa è andato storto nel caricamento delle esportazioni. Riprova o controlla l'errore sopra per i dettagli.", "empty.export.noneTitle": "Nessun feed di esportazione ancora", - "empty.export.noneMessage": "Crea un feed Google Shopping, Meta o CSV/XML personalizzato per scegliere quali prodotti e campi esportare. Genera un URL pubblico per Merchant Center o qualsiasi partner — oppure esporta un sottoinsieme da Prodotti.", + "empty.export.noneMessage": "Crea un feed Google Shopping, Meta o CSV/XML personalizzato per scegliere quali prodotti e campi esportare. Genera un URL pubblico per Merchant Center o qualsiasi partner — oppure esporta un sottoinsieme da Prodotti.", "empty.export.noMatchTitle": "Nessun feed corrispondente", "empty.export.noMatchMessage": "Prova un altro termine di ricerca.", "empty.files.noneTitle": "Nessun upload ancora", - "empty.files.noneMessage": "Gli import CSV di prodotti, categorie e attributi compaiono qui dopo l’upload. Dopo una migrazione di piattaforma, i contenuti dei file (blob) non sono stati copiati — ricaricali se ti servono.", + "empty.files.noneMessage": "Gli import CSV di prodotti, categorie e attributi compaiono qui dopo l’upload. Dopo una migrazione di piattaforma, i contenuti dei file (blob) non sono stati copiati — ricaricali se ti servono.", "empty.files.uploadCta": "Carica CSV", "empty.export.fromProductsCta": "Esporta da Prodotti", "empty.dashboard.noJobsTitle": "Nessun job recente", - "empty.dashboard.noJobsMessage": "I job compaiono qui dopo l’avvio dell’elaborazione da Prodotti. Arricchisci titoli e descrizioni prima di esportare.", + "empty.dashboard.noJobsMessage": "I job compaiono qui dopo l’avvio dell’elaborazione da Prodotti. Arricchisci titoli e descrizioni prima di esportare.", "empty.stores.noneTitle": "Nessun negozio collegato", "empty.stores.noneMessage": "Collega WooCommerce o Shopify per sincronizzare catalogo e ordini. Preferisci un file fornitore? Usa URL feed o caricamento CSV.", "empty.stores.noneTitleMember": "Nessun negozio collegato", @@ -2389,23 +2390,23 @@ export const it: MessageDict = { "empty.processing.noneTitle": "Nessun job ancora", "empty.processing.noneMessage": "Avvia un job da Prodotti quando sei pronto. Progresso e cronologia compariranno qui.", "empty.campaigns.unavailableTitle": "Campagne non disponibili", - "empty.campaigns.unavailableMessage": "Il servizio campagne non è raggiungibile. Puoi aprire la procedura guidata, ma genera e invia aspetteranno il ritorno del servizio.", + "empty.campaigns.unavailableMessage": "Il servizio campagne non è raggiungibile. Puoi aprire la procedura guidata, ma genera e invia aspetteranno il ritorno del servizio.", "empty.calendar.noneTitle": "Nessun preset stagionale", - "empty.calendar.noneMessage": "I preset del calendario appariranno qui quando l’API marketing sarà disponibile.", + "empty.calendar.noneMessage": "I preset del calendario appariranno qui quando l’API marketing sarà disponibile.", "empty.seo.noneTitle": "Nessun catalogo da valutare", "empty.seo.noneMessage": "Elabora prodotti o aggiungi prima le categorie. I punteggi SEO compaiono quando ci sono dati di catalogo.", "empty.vector.unavailableTitle": "Categorie vettoriali non disponibili", "empty.vector.noMatchTitle": "Nessuna corrispondenza ancora", "empty.vector.noMatchMessage": "Inserisci una descrizione prodotto e cerca per vedere le corrispondenze vettoriali.", "empty.structured.unavailableTitle": "Descrizioni strutturate non disponibili", - "empty.structured.unavailableMessage": "Questa API non è ancora su questo backend. Non puoi gestire i campi Export ID finché /api/structured-descriptions non è collegata.", + "empty.structured.unavailableMessage": "Questa API non è ancora su questo backend. Non puoi gestire i campi Export ID finché /api/structured-descriptions non è collegata.", "empty.structured.noneTitle": "Nessun campo di descrizione strutturata ancora", - "empty.structured.noneMessage": "Aggiungi un campo qui, oppure crea Export ID in una formula descrizione categoria — compariranno per i feed di esportazione.", + "empty.structured.noneMessage": "Aggiungi un campo qui, oppure crea Export ID in una formula descrizione categoria — compariranno per i feed di esportazione.", "empty.support.unavailableTitle": "Support non disponibile", "empty.support.noneTitle": "Nessun ticket ancora", - "empty.support.unavailableMessage": "L’API di supporto non è raggiungibile. Riprova a breve o apri un nuovo ticket quando il servizio è su.", + "empty.support.unavailableMessage": "L’API di supporto non è raggiungibile. Riprova a breve o apri un nuovo ticket quando il servizio è su.", "empty.support.filterMessage": "Nessun ticket corrisponde a questo stato. Prova un altro filtro o crea un nuovo ticket.", - "empty.support.noneMessage": "Descrivi il problema e il team risponderà in questo thread. Riceverai anche una notifica in-app quando risponde lo staff.", + "empty.support.noneMessage": "Descrivi il problema e il team risponderà in questo thread. Riceverai anche una notifica in-app quando risponde lo staff.", "empty.support.createTicket": "Crea ticket", "empty.support.clearFilter": "Cancella filtro", "empty.support.ticketNotFoundTitle": "Ticket non trovato", @@ -2422,65 +2423,65 @@ export const it: MessageDict = { "empty.admin.noProviderTitle": "Nessuna riga provider", "empty.admin.noProviderMessage": "I token compaiono qui dopo che i prodotti registrano un tipo di provider.", "empty.admin.noCompaniesTitle": "Nessuna azienda", - "empty.admin.noCompaniesMessage": "L'elenco aziende è vuoto.", + "empty.admin.noCompaniesMessage": "L'elenco aziende è vuoto.", "empty.admin.noCyclesTitle": "Nessun ciclo di fatturazione ancora", "empty.admin.noCyclesMessage": "I cicli compaiono dopo che le esecuzioni di fatturazione creano righe storiche.", "empty.admin.noCompaniesFound": "Nessuna azienda trovata.", "empty.admin.noCompaniesMatch": "Nessuna azienda corrisponde a questo filtro.", "empty.admin.notPlatformTitle": "Non sei admin piattaforma", - "empty.admin.notPlatformMessage": "Il tuo account è autenticato ma non è contrassegnato come admin piattaforma. Chiedi a un admin esistente di concedere l'accesso, poi esci e accedi di nuovo.", + "empty.admin.notPlatformMessage": "Il tuo account è autenticato ma non è contrassegnato come admin piattaforma. Chiedi a un admin esistente di concedere l'accesso, poi esci e accedi di nuovo.", "empty.admin.noJobsFilter": "Nessun job per questo filtro.", "empty.admin.noAdminUsers": "Nessun utente admin trovato", "empty.admin.noJobs": "Nessun job trovato.", - "empty.admin.queueUnavailable": "La coda di supporto non è disponibile. Contatta l'amministratore della piattaforma se persiste.", + "empty.admin.queueUnavailable": "La coda di supporto non è disponibile. Contatta l'amministratore della piattaforma se persiste.", "empty.admin.noTicketsQueue": "Nessun ticket in questa coda.", "empty.admin.knowledgeTitle": "Knowledge support", - "empty.admin.knowledgeNotReadyTitle": "La knowledge di supporto non è pronta", + "empty.admin.knowledgeNotReadyTitle": "La knowledge di supporto non è pronta", "empty.admin.knowledgeNotReadyMessage": "Articoli e risposta automatica non sono ancora configurati in questo deployment.", "empty.admin.noTemplatesTitle": "Nessun modello di risposta", "empty.admin.noTemplatesMessage": "I modelli sono abbinati come gli articoli e pubblicati come risposte automatiche etichettate.", "empty.admin.ticketNotFound": "Ticket non trovato.", - "empty.admin.supportUnavailable": "Il supporto non è disponibile su questo deployment.", + "empty.admin.supportUnavailable": "Il supporto non è disponibile su questo deployment.", "empty.admin.ticketLoadFailed": "Impossibile caricare questo ticket.", "empty.admin.noMessages": "Nessun messaggio ancora.", "empty.admin.translationsUnavailableTitle": "Traduzioni non disponibili", - "empty.admin.translationsUnavailableMessage": "L’endpoint del catalogo traduzioni non è disponibile in questa build.", + "empty.admin.translationsUnavailableMessage": "L’endpoint del catalogo traduzioni non è disponibile in questa build.", "empty.admin.noKeysMatchTitle": "Nessuna chiave corrisponde", - "empty.admin.noKeysMatchMessage": "Prova un altro filtro o ricerca, oppure aggiorna dopo l’aggiunta di nuove chiavi in inglese.", + "empty.admin.noKeysMatchMessage": "Prova un altro filtro o ricerca, oppure aggiorna dopo l’aggiunta di nuove chiavi in inglese.", "empty.admin.noUsersMatch": "Nessun utente corrisponde a questo filtro.", "empty.admin.noCompaniesMatchFilter": "Nessuna azienda corrisponde a questo filtro.", "blast.title": "Conferma blast e-mail", - "blast.dryRunDescription": "La modalità dry-run è attiva — nessuna email reale lascerà Descrybe. Conferma per registrare l’invio di prova.", - "blast.liveDescription": "Questo invierà e-mail reali al tuo pubblico. Digita I understand per continuare.", + "blast.dryRunDescription": "La modalità dry-run è attiva — nessuna email reale lascerà Descrybe. Conferma per registrare l’invio di prova.", + "blast.liveDescription": "Questo invierà e-mail reali al tuo pubblico. Digita I understand per continuare.", "blast.recipients": "Destinatari in questa richiesta: {count}", - "blast.typePhrase": "Digita “I understand”", + "blast.typePhrase": "Digita “I understand”", "blast.placeholder": "I understand", "blast.runDryRun": "Esegui dry-run", "blast.send": "Invia blast", "marketing.footerBefore": "Le campagne e-mail restano su", - "marketing.footerAfter": "— questa pagina prepara solo i feed di export del catalogo.", + "marketing.footerAfter": "— questa pagina prepara solo i feed di export del catalogo.", "support.title": "Centro di supporto", "support.description": "Apri a ticket for fatturazione, bugs, or account help. Staff replies show here and as in-app notifications.", "support.newTicket": "Nuovo ticket", "support.createTicket": "Crea ticket", - "support.loadingTickets": "Caricamento ticket…", + "support.loadingTickets": "Caricamento ticket…", "support.loadFailed": "Caricamento ticket di supporto non riuscito", "support.unavailableBanner": "Supporto is not fully disponibile yet. You can still prepare a ticket; submitting may wait until the service is ready.", "support.yourTickets": "I tuoi ticket", "support.ticketCount": "{count} ticket", "support.ticketCountOne": "{count} ticket", - "support.statusFilterSuffix": "· stato {status}", + "support.statusFilterSuffix": "· stato {status}", "support.filterByStatus": "Filtra by status", "support.unavailableTitle": "Support non disponibile", "support.emptyTitle": "Nessun ticket ancora", - "support.unavailableEmpty": "L’API di supporto non è raggiungibile. Riprova a breve o apri un nuovo ticket quando il servizio è su.", + "support.unavailableEmpty": "L’API di supporto non è raggiungibile. Riprova a breve o apri un nuovo ticket quando il servizio è su.", "support.emptyFiltered": "Nessun ticket corrisponde a questo stato. Prova un altro filtro o crea un nuovo ticket.", - "support.emptyHelp": "Descrivi il problema e il team risponderà in questo thread. Riceverai anche una notifica in-app quando risponde lo staff.", + "support.emptyHelp": "Descrivi il problema e il team risponderà in questo thread. Riceverai anche una notifica in-app quando risponde lo staff.", "support.clearFilter": "Cancella filtro", "support.table.subject": "Oggetto", "support.table.category": "Categoria", "support.table.status": "Stato", - "support.table.priority": "Priorità", + "support.table.priority": "Priorità", "support.table.updated": "Aggiornato", "support.openTicketAria": "Apri ticket {subject}", "support.status.all": "Tutto", @@ -2496,9 +2497,9 @@ export const it: MessageDict = { "support.new.subject": "Oggetto", "support.new.subjectPlaceholder": "Breve riepilogo", "support.new.category": "Categoria", - "support.new.priority": "Priorità", + "support.new.priority": "Priorità", "support.new.optional": "Facoltativo details", - "support.new.optionalHint": "(SKU, tag — aiuta il routing)", + "support.new.optionalHint": "(SKU, tag — aiuta il routing)", "support.new.relatedSku": "SKU correlato", "support.new.relatedSkuPlaceholder": "es. ABC-123", "support.new.relatedSkuHelp": "Prodotto or feed SKU if this is about a specific item.", @@ -2507,35 +2508,35 @@ export const it: MessageDict = { "support.new.tagsHelp": "Fino a 10 etichette brevi. Normalizziamo spazi e punteggiatura.", "support.new.tagsWillSend": "Invio: {tags}", "support.new.message": "Messaggio", - "support.new.messagePlaceholder": "Descrivi il problema, cosa ti aspettavi e ciò che aiuta a riprodurlo.", + "support.new.messagePlaceholder": "Descrivi il problema, cosa ti aspettavi e ciò che aiuta a riprodurlo.", "support.new.createdTitle": "Ticket creato", "support.new.createdBody": "Risponderemo in questo thread. Controlla le notifiche in-app.", "support.new.viewTicket": "Vedi ticket", - "support.new.unavailable": "Supporto is temporarily non disponibile. Your message was not submitted — try again shortly.", + "support.new.unavailable": "Supporto is temporarily non disponibile. Your message was not submitted — try again shortly.", "support.new.unavailableTitle": "Support non disponibile", "support.new.createFailed": "Impossibile creare il ticket", "support.ticket.fallbackTitle": "Supporto ticket", "support.ticket.description": "Conversation thread with Descrybe supporto.", - "support.ticket.meta": "{category} · {priority} · Aggiornato {when}", + "support.ticket.meta": "{category} · {priority} · Aggiornato {when}", "support.ticket.allTickets": "Tutto ticket", - "support.ticket.loading": "Caricamento ticket…", + "support.ticket.loading": "Caricamento ticket…", "support.ticket.missingId": "ID ticket mancante", "support.ticket.notFound": "Ticket non trovato", "support.ticket.notFoundMessage": "Questo ticket potrebbe essere stato rimosso oppure non hai accesso.", "support.ticket.backCenter": "Indietro to Supporto Center", - "support.ticket.unavailable": "Il supporto è temporaneamente non disponibile.", + "support.ticket.unavailable": "Il supporto è temporaneamente non disponibile.", "support.ticket.loadFailed": "Caricamento ticket non riuscito", - "support.ticket.openedMeta": "Apried {when} · {category} · {priority} priority", + "support.ticket.openedMeta": "Apried {when} · {category} · {priority} priority", "support.ticket.sku": "SKU {sku}", "support.ticket.messagesAria": "Messaggi del ticket", "support.ticket.noMessages": "Nessun messaggio", "support.ticket.noMessagesHelp": "Questo thread non ha ancora messaggi.", "support.ticket.yourReply": "La tua risposta", - "support.ticket.replyPlaceholder": "Add details or reply to supporto…", + "support.ticket.replyPlaceholder": "Add details or reply to supporto…", "support.ticket.sendReply": "Invia risposta", "support.ticket.replySent": "Risposta inviata", "support.ticket.reopened": "Ticket riaperto per revisione dello staff.", - "support.ticket.replyAdded": "Il tuo messaggio è stato aggiunto al thread.", + "support.ticket.replyAdded": "Il tuo messaggio è stato aggiunto al thread.", "support.ticket.replyFailed": "Impossibile inviare la risposta", "support.ticket.reopenHint": "Rispondere riapre questo ticket per lo staff.", "support.ticket.humanHint": "Replying asks a human teammate to continue from qui.", @@ -2552,12 +2553,12 @@ export const it: MessageDict = { "support.progress.resolved.title": "Segnato come risolto", "support.progress.resolved.message": "Crediamo sia risolto. Rispondi per riaprire, oppure lascia una valutazione rapida sotto.", "support.progress.quickAnswer.title": "Risposta rapida inviata", - "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply qui — a human will take over.", + "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply qui — a human will take over.", "support.progress.onIt.title": "Ci stiamo lavorando", "support.progress.onIt.handedMessage": "A supporto teammate has your ticket and will reply in this thread.", "support.progress.onIt.pendingMessage": "Supporto is reviewing your message. You will see updates in this thread.", "support.progress.received.title": "Ticket ricevuto", - "support.progress.received.message": "Grazie — abbiamo la tua richiesta. Potrebbe comparire aiuto automatico a breve, oppure risponderà un collega.", + "support.progress.received.message": "Grazie — abbiamo la tua richiesta. Potrebbe comparire aiuto automatico a breve, oppure risponderà un collega.", "support.category.billing": "Fatturazione", "support.category.billing.help": "Fatture, payment methods, plan changes, and Stripe receipts.", "support.category.billing_credits": "Fatturazione / credits", @@ -2573,27 +2574,27 @@ export const it: MessageDict = { "support.category.export": "Esporta / channels", "support.category.export.help": "Esporta feed, channels, and sync destinations.", "support.category.migration": "Migrazione / dati", - "support.category.migration.help": "Dati mancanti o errati dopo il cutover — prodotti, feed, store, fatturazione o team.", + "support.category.migration.help": "Dati mancanti o errati dopo il cutover — prodotti, feed, store, fatturazione o team.", "support.category.other": "Altro", - "support.category.other.help": "Qualsiasi altra cosa — la instradiamo al collega giusto.", + "support.category.other.help": "Qualsiasi altra cosa — la instradiamo al collega giusto.", "support.priority.low": "Basso", - "support.priority.low.help": "Opzionale o non bloccante — ci arriveremo a turno.", + "support.priority.low.help": "Opzionale o non bloccante — ci arriveremo a turno.", "support.priority.normal": "Normale", "support.priority.normal.help": "Standard request. Most ticket use this.", "support.priority.high": "Alto", - "support.priority.high.help": "Blocca il lavoro o impatta i ricavi — usare con parsimonia.", + "support.priority.high.help": "Blocca il lavoro o impatta i ricavi — usare con parsimonia.", "support.csat.thanks": "Grazie per il feedback", - "support.csat.unavailable": "La valutazione non è temporaneamente disponibile. Riprova più tardi.", + "support.csat.unavailable": "La valutazione non è temporaneamente disponibile. Riprova più tardi.", "support.csat.unavailableTitle": "Valutazione non disponibile", - "support.csat.alreadyRated": "Hai già valutato questo ticket.", - "support.csat.alreadyRatedTitle": "Già valutato", + "support.csat.alreadyRated": "Hai già valutato questo ticket.", + "support.csat.alreadyRatedTitle": "Già valutato", "support.csat.submitFailed": "Impossibile inviare la valutazione", "support.csat.yourRating": "La tua valutazione", "support.csat.ratedOutOf": "Hai valutato questo ticket {score} su 5", "support.csat.howDidWeDo": "Come ci siamo comportati?", - "support.csat.formHelp": "This ticket is {status}. Rate your experience (1–5). Facoltativo comment helps us improve.", + "support.csat.formHelp": "This ticket is {status}. Rate your experience (1–5). Facoltativo comment helps us improve.", "support.csat.rating": "Valutazione", - "support.csat.scoreAria": "{value} — {label}", + "support.csat.scoreAria": "{value} — {label}", "support.csat.whatWentWrong": "What went wrong? (facoltativo)", "support.csat.whatWentWrongPlaceholder": "Una breve nota ci aiuta nel follow-up.", "support.csat.anythingElse": "Anything else? (facoltativo)", @@ -2605,11 +2606,11 @@ export const it: MessageDict = { "support.csat.score.4": "Soddisfatto", "support.csat.score.5": "Molto soddisfatto", "catalog.delete": "Elimina", - "catalog.deleting": "Eliminazione…", - "catalog.saving": "Salvataggio…", - "catalog.adding": "Aggiunta…", - "catalog.assigning": "Assegnazione…", - "catalog.uploading": "Caricamento…", + "catalog.deleting": "Eliminazione…", + "catalog.saving": "Salvataggio…", + "catalog.adding": "Aggiunta…", + "catalog.assigning": "Assegnazione…", + "catalog.uploading": "Caricamento…", "catalog.create": "Crea", "catalog.createFailed": "Creazione non riuscita", "catalog.updateFailed": "Aggiornamento non riuscito", @@ -2636,11 +2637,11 @@ export const it: MessageDict = { "catalog.closePanel": "Chiudi pannello", "catalog.closeMenus": "Chiudi menu", "catalog.openMenu": "Apri menu", - "catalog.loading": "Caricamento…", + "catalog.loading": "Caricamento…", "catalog.empty": "Vuoto", "catalog.required": "Obbligatorio", "catalog.optional": "Facoltativo", - "catalog.features": "Funzionalità", + "catalog.features": "Funzionalità", "catalog.csvImportFinished": "Importazione CSV completata.", "catalog.comparePlans": "Confronta i piani", "catalog.saveChanges": "Salva modifiche", @@ -2673,22 +2674,22 @@ export const it: MessageDict = { "products.status.unprocessed": "Non elaborati", "products.status.pending": "In sospeso", "products.status.unknown": "Sconosciuto", - "products.pagination.showing": "Mostra {start}–{end} di {total}", + "products.pagination.showing": "Mostra {start}–{end} di {total}", "products.empty.processing.title": "Nessun job ancora", - "products.empty.processing.messageJobs": "Non c'è nulla in esecuzione. Avvia un job da Non elaborati, oppure apri Elaborazione per seguire i progressi.", - "products.empty.processing.messageBasic": "I prodotti compaiono qui mentre un job è in corso.", + "products.empty.processing.messageJobs": "Non c'è nulla in esecuzione. Avvia un job da Non elaborati, oppure apri Elaborazione per seguire i progressi.", + "products.empty.processing.messageBasic": "I prodotti compaiono qui mentre un job è in corso.", "products.empty.needsReview.title": "Nessun prodotto da revisionare", "products.empty.needsReview.message": "Dopo un job, i prodotti arricchiti arrivano qui. Apri una riga per confrontare originale vs arricchito, poi Accetta, modifica o Rifiuta.", "products.empty.error.title": "Nessun prodotto con errori", - "products.empty.error.message": "Quando un job fallisce per un prodotto, compare qui così puoi riprovare.", + "products.empty.error.message": "Quando un job fallisce per un prodotto, compare qui così puoi riprovare.", "products.empty.noUnprocessedMatches": "Nessuna corrispondenza non elaborata", "products.empty.noMatch": "Nessun prodotto corrisponde", - "products.empty.filtersHint": "Prova un’altra ricerca, categoria o feed — oppure cancella i filtri per vedere tutto.", + "products.empty.filtersHint": "Prova un’altra ricerca, categoria o feed — oppure cancella i filtri per vedere tutto.", "products.empty.noUnprocessed.title": "Nessun prodotto non elaborato ancora", "products.empty.noUnprocessed.message": "Collega un feed fornitore o carica un CSV per importare prodotti nel catalogo.", "products.empty.none.title": "Nessun prodotto ancora", - "products.empty.none.messageStores": "Completa prima Feeds → Map → Sync, poi Process. Importa da un feed o da un negozio.", - "products.empty.none.messageBasic": "Completa prima Feeds → Map → Sync, poi Process. Collega un feed o carica un CSV.", + "products.empty.none.messageStores": "Completa prima Feeds → Map → Sync, poi Process. Importa da un feed o da un negozio.", + "products.empty.none.messageBasic": "Completa prima Feeds → Map → Sync, poi Process. Collega un feed o carica un CSV.", "products.actions.viewJobs": "Vedi lavori", "products.actions.startJob": "Avvia un lavoro", "products.actions.viewProcessed": "Vedi elaborati", @@ -2704,7 +2705,7 @@ export const it: MessageDict = { "products.export.selectFormat": "Seleziona un feed di esportazione.", "products.export.failed": "Impossibile esportare i prodotti selezionati", "products.upload.title": "Carica CSV", - "products.upload.description": "Importa prodotti da un CSV (GTIN/EAN, nome, categoria, …). Scarica il campione per l'insieme completo delle colonne.", + "products.upload.description": "Importa prodotti da un CSV (GTIN/EAN, nome, categoria, …). Scarica il campione per l'insieme completo delle colonne.", "products.upload.submit": "Carica e importa", "products.upload.chooseFirst": "Scegli prima un file CSV.", "products.upload.csvOnly": "Carica un file CSV.", @@ -2715,10 +2716,10 @@ export const it: MessageDict = { "products.processing.cancelled": "Elaborazione annullata", "products.processing.jobsCancelled": "Job di elaborazione annullati", "products.processing.cancelFailed": "Impossibile annullare il processo", - "products.processing.justCancelled": "Il processo appena avviato è stato annullato.", + "products.processing.justCancelled": "Il processo appena avviato è stato annullato.", "products.processing.viewInProcessing": "Vedi in Elaborazione", "products.processing.confirm": "Conferma elaborazione", - "products.processing.freePlanTitle": "Piano Free — elaborazione senza IA", + "products.processing.freePlanTitle": "Piano Free — elaborazione senza IA", "products.processing.freePlanBody": "Normaleize, specs, fill, and EPREL run at no credit cost. AI titles/descriptions require a paid plan or credits.", "products.enrichment.acceptTitle": "Accettare l'arricchimento?", "products.enrichment.acceptConfirm": "Conferma accettazione arricchimento", @@ -2728,8 +2729,8 @@ export const it: MessageDict = { "products.enrichment.rejectSelectedConfirm": "Conferma rifiuto selezionati", "products.enrichment.resetConfirm": "Conferma ripristino a non elaborato", "products.enrichment.resetSelected": "Reimpostare {count} prodotto/i selezionato/i a non elaborato? Riappariranno come elementi non elaborati.", - "products.enrichment.accepted": "Arricchimento accettato — spostato in Elaborati.", - "products.enrichment.rejected": "Arricchimento rifiutato — prodotto riportato a non elaborato.", + "products.enrichment.accepted": "Arricchimento accettato — spostato in Elaborati.", + "products.enrichment.rejected": "Arricchimento rifiutato — prodotto riportato a non elaborato.", "products.enrichment.acceptFailed": "Impossibile accettare l'arricchimento", "products.enrichment.rejectFailed": "Impossibile rifiutare l'arricchimento", "products.enrichment.acceptUndone": "Accettazione annullata", @@ -2737,8 +2738,8 @@ export const it: MessageDict = { "products.enrichment.resetDone": "Prodotto riportato a non elaborato.", "products.enrichment.resetFailed": "Impossibile reimpostare i prodotti", "products.enrichment.valueReset": "Valore arricchito ripristinato all'originale.", - "products.enrichment.originalEmpty": "Il valore originale è vuoto; l'arricchimento non può essere cancellato via PATCH.", - "products.enrichment.staysNeedsReview": "Il prodotto resta in Needs Review finché non Accetti tutto.", + "products.enrichment.originalEmpty": "Il valore originale è vuoto; l'arricchimento non può essere cancellato via PATCH.", + "products.enrichment.staysNeedsReview": "Il prodotto resta in Needs Review finché non Accetti tutto.", "products.field.nameAcceptUndone": "Accettazione nome annullata", "products.field.descriptionAcceptUndone": "Accettazione descrizione annullata", "products.field.nameDiscardUndone": "Scarto nome annullato", @@ -2764,8 +2765,8 @@ export const it: MessageDict = { "products.enrichment.help.attributes": "Specifiche e attributi. Verde = attributi AI/arricchiti; arancione = solo dal feed; grigio = nessuno.", "products.enrichment.help.category": "Categoria assegnata. Verde = categoria impostata; grigio = mancante.", "products.enrichment.chipTitle": "{label}: {state}. {help}", - "products.enrichment.complete": "Completo — {parts}", - "products.enrichment.missingSummary": "Manca {missing} — {parts}", + "products.enrichment.complete": "Completo — {parts}", + "products.enrichment.missingSummary": "Manca {missing} — {parts}", "products.issue.title": "titolo", "products.issue.gtin": "GTIN", "products.issue.category": "categoria", @@ -2781,16 +2782,16 @@ export const it: MessageDict = { "products.filters.byEprel": "Filtra per EPREL", "products.filters.byFeedSync": "Filtra per modifiche sync del feed", "products.filters.coverageHint": "Filtra per completezza Nome / Descrizione / Attributi / Categoria", - "products.filters.feedSyncHint": "Filtra per modifiche di prezzo/scorte/titolo dall’ultima sync del feed", + "products.filters.feedSyncHint": "Filtra per modifiche di prezzo/scorte/titolo dall’ultima sync del feed", "products.filters.eprelHint": "Filtra prodotti con o senza un id registro etichette energetiche EPREL", - "products.filters.availabilityChanged": "Disponibilità modificata", + "products.filters.availabilityChanged": "Disponibilità modificata", "products.eprel.badgeTitle": "Id EPREL presente su questo prodotto (European Product Registry for Energy Labelling).", - "products.eprel.help": "L'id European Product Registry for Energy Labelling (EPREL) è presente su questo prodotto.", + "products.eprel.help": "L'id European Product Registry for Energy Labelling (EPREL) è presente su questo prodotto.", "products.feedData": "Dati del feed", "attributes.title": "Attributi", "attributes.description": "Definisci campi prodotto, valori di elenco e assegnazioni di categoria.", "attributes.loadFailed": "Caricamento attributi non riuscito", - "attributes.loading": "Caricamento attributi…", + "attributes.loading": "Caricamento attributi…", "attributes.zero": "0 attributi", "attributes.addNew": "Aggiungi nuovo attributo", "attributes.create": "Crea attributo", @@ -2799,7 +2800,7 @@ export const it: MessageDict = { "attributes.displayName": "Nome visualizzato attributo", "attributes.actions": "Azioni attributo", "attributes.created": "Attributo creato.", - "attributes.createdAssignFailed": "Attributo creato, ma l'assegnazione della categoria non è riuscita.", + "attributes.createdAssignFailed": "Attributo creato, ma l'assegnazione della categoria non è riuscita.", "attributes.updated": "Attributo aggiornato.", "attributes.deleted": "Attributo eliminato.", "attributes.addValue": "Aggiungi valore", @@ -2815,17 +2816,17 @@ export const it: MessageDict = { "attributes.csvNeedHeader": "Il CSV deve includere un'intestazione e almeno una riga", "attributes.csvNeedColumns": "Il CSV deve includere le colonne \"category_id\" e \"attribute_key\"", "attributes.type.string": "Testo", - "attributes.type.stringHint": "Testo libero — nomi, modelli, note brevi", + "attributes.type.stringHint": "Testo libero — nomi, modelli, note brevi", "attributes.type.number": "Numero", - "attributes.type.numberHint": "Valore numerico; aggiungi un'unità se utile (cm, kg, W)", - "attributes.type.boolean": "Sì / No", - "attributes.type.booleanHint": "Vero o falso — es. ha GPS, ricarica wireless", + "attributes.type.numberHint": "Valore numerico; aggiungi un'unità se utile (cm, kg, W)", + "attributes.type.boolean": "Sì / No", + "attributes.type.booleanHint": "Vero o falso — es. ha GPS, ricarica wireless", "attributes.type.date": "Data", - "attributes.type.dateHint": "Una data di calendario (rilascio, fine garanzia, …)", + "attributes.type.dateHint": "Una data di calendario (rilascio, fine garanzia, …)", "attributes.type.list": "Menu a discesa", "attributes.type.listHint": "Scegli esattamente un'opzione da un elenco definito", "attributes.type.multiselect": "Selezione multipla", - "attributes.type.multiselectHint": "Scegli una o più opzioni da un elenco", + "attributes.type.multiselectHint": "Scegli una o più opzioni da un elenco", "attributes.color": "Colore", "categories.title": "Categorie", "categories.description": "Organizza la gerarchia del catalogo. Modifica una categoria per aprire formule titolo/descrizione e prompt IA.", @@ -2833,22 +2834,22 @@ export const it: MessageDict = { "categories.add": "Aggiungi categoria", "categories.edit": "Modifica categoria", "categories.delete": "Elimina categoria", - "categories.deleteConfirm": "Vuoi davvero eliminare questa categoria? L'azione non può essere annullata.", + "categories.deleteConfirm": "Vuoi davvero eliminare questa categoria? L'azione non può essere annullata.", "categories.name": "Nome categoria", "categories.namePlaceholder": "Nome categoria", "categories.descriptionPlaceholder": "Descrizione categoria facoltativa", "categories.uniqueIdPlaceholder": "Identificatore univoco facoltativo", "categories.searchPlaceholder": "Cerca per nome o ID...", - "categories.created": "{name} è stato creato.", - "categories.updated": "La categoria è stata aggiornata correttamente.", - "categories.deleted": "La categoria è stata eliminata correttamente.", + "categories.created": "{name} è stato creato.", + "categories.updated": "La categoria è stata aggiornata correttamente.", + "categories.deleted": "La categoria è stata eliminata correttamente.", "categories.notFound": "Categoria non trovata.", "categories.loadCategoryFailed": "Impossibile caricare la categoria", "categories.noCategoriesYet": "Nessuna categoria ancora", - "categories.noMatch": "Nessuna categoria corrisponde a “{query}”. Cancella la ricerca o prova un altro termine.", + "categories.noMatch": "Nessuna categoria corrisponde a “{query}”. Cancella la ricerca o prova un altro termine.", "categories.emptyHint": "Aggiungi una categoria o importa un CSV per costruire l'albero.", - "categories.promptCountOne": "{count} categoria ha un prompt di generazione IA. Apri il menu ⋮ → Modifica prompt IA, oppure modifica una categoria e scegli Modifica prompt IA.", - "categories.promptCountMany": "{count} categorie hanno un prompt di generazione IA. Apri il menu ⋮ → Modifica prompt IA, oppure modifica una categoria e scegli Modifica prompt IA.", + "categories.promptCountOne": "{count} categoria ha un prompt di generazione IA. Apri il menu â‹® → Modifica prompt IA, oppure modifica una categoria e scegli Modifica prompt IA.", + "categories.promptCountMany": "{count} categorie hanno un prompt di generazione IA. Apri il menu â‹® → Modifica prompt IA, oppure modifica una categoria e scegli Modifica prompt IA.", "categories.actions": "Azioni categoria", "categories.chooseCsv": "Scegli CSV", "categories.createSingleOrImport": "Crea una singola categoria o importane molte da CSV.", @@ -2866,7 +2867,7 @@ export const it: MessageDict = { "categories.setAiPrompt": "Imposta prompt IA", "categories.editAiPrompt": "Modifica prompt IA", "categories.editAiPromptShort": "Modifica prompt IA", - "categories.aiPromptSet": "Un prompt di generazione IA è impostato", + "categories.aiPromptSet": "Un prompt di generazione IA è impostato", "categories.aiPromptTitle": "Prompt IA categoria", "categories.aiPromptDescription": "Modello di generazione per categoria usato quando si arricchiscono i prodotti in questa categoria.", "categories.aiPromptSaved": "Prompt IA salvato.", @@ -2875,7 +2876,7 @@ export const it: MessageDict = { "categories.aiPromptAssignFailed": "Impossibile assegnare il prompt", "categories.assignAiPrompt": "Assegna prompt IA", "categories.assignAiPromptHelp": "Copia questo prompt di generazione IA in altre categorie.", - "categories.loadingPrompt": "Caricamento prompt…", + "categories.loadingPrompt": "Caricamento prompt…", "categories.brandVoice": "Voce del brand", "categories.productName": "Nome prodotto", "categories.gtin": "GTIN", @@ -2888,11 +2889,11 @@ export const it: MessageDict = { "categories.assignSelectHelp": "Seleziona le categorie a cui applicare questo modello.", "categories.assignTitleHelp": "Seleziona le categorie a cui applicare questo modello di formula titolo.", "categories.assignDescriptionHelp": "Seleziona le categorie a cui applicare questo modello di formula descrizione.", - "categories.searchCategories": "Cerca categorie…", + "categories.searchCategories": "Cerca categorie…", "categories.matching": " corrispondenti", "categories.titleFormulaHelp": "Crea titoli prodotto da variabili e testo statico per questa categoria.", "categories.descriptionFormulaHelp": "Definisci il testo meta SEO e le sezioni del corpo che l'IA deve generare per questa categoria.", - "categories.loadingFormula": "Caricamento formula…", + "categories.loadingFormula": "Caricamento formula…", "categories.titleFormulaSaved": "Formula titolo salvata correttamente", "categories.titleFormulaRemoved": "Formula titolo rimossa correttamente", "categories.titleFormulaSaveFailed": "Impossibile salvare la formula titolo", @@ -2902,8 +2903,8 @@ export const it: MessageDict = { "categories.descriptionFormulaSavedWithExports": "Formula descrizione salvata correttamente e sincronizzati {count} ID di esportazione", "categories.descriptionFormulaSaveFailed": "Impossibile salvare la formula descrizione", "categories.descriptionFormulaAssignFailed": "Impossibile assegnare la formula descrizione", - "categories.seoTitlePlaceholder": "Indica all'IA come scrivere il titolo SEO…", - "categories.seoDescriptionPlaceholder": "Indica all'IA come scrivere la descrizione SEO…", + "categories.seoTitlePlaceholder": "Indica all'IA come scrivere il titolo SEO…", + "categories.seoDescriptionPlaceholder": "Indica all'IA come scrivere la descrizione SEO…", "categories.sectionPromptPlaceholder": "Cosa deve scrivere l'IA in questa sezione?", "categories.sectionKeyPlaceholder": "es. short_description (lettere, numeri, _)", "categories.formulaElementTypes": "Tipi di elemento formula", @@ -2916,14 +2917,14 @@ export const it: MessageDict = { "categories.customVariableHelp": "Definisci una variabile riutilizzabile per le formule titolo.", "categories.manageVariables": "Gestisci variabili", "categories.manageVariablesHelp": "Visualizza, modifica e aggiungi variabili per le formule titolo.", - "categories.searchVariables": "Cerca variabili…", + "categories.searchVariables": "Cerca variabili…", "categories.variableAdded": "Variabile aggiunta correttamente", "categories.variableUpdated": "Variabile aggiornata correttamente", "categories.variableDeleted": "Variabile eliminata correttamente", "categories.variableDeleteFailed": "Impossibile eliminare la variabile", - "categories.variableNameRequired": "Il nome della variabile è obbligatorio", - "categories.displayNameRequired": "Il nome visualizzato è obbligatorio", - "categories.variableNamePattern": "Il nome può contenere solo lettere, numeri e underscore", + "categories.variableNameRequired": "Il nome della variabile è obbligatorio", + "categories.displayNameRequired": "Il nome visualizzato è obbligatorio", + "categories.variableNamePattern": "Il nome può contenere solo lettere, numeri e underscore", "categories.deleteVariableConfirm": "Vuoi davvero eliminare questa variabile? Potrebbe influire sulle formule che la usano.", "categories.removeElementConfirm": "Vuoi davvero rimuovere questo elemento dalla formula?", "categories.addTextElement": "Aggiungi elemento testo", @@ -2931,12 +2932,12 @@ export const it: MessageDict = { "categories.editTextElement": "Modifica elemento testo", "categories.editTextElementHelp": "Modifica l'elemento testo nella formula.", "categories.staticTextPlaceholder": "Inserisci testo statico", - "categories.textCannotBeEmpty": "Il testo non può essere vuoto", + "categories.textCannotBeEmpty": "Il testo non può essere vuoto", "categories.exampleProductName": "Nome prodotto", "categories.exampleWidget": "Acme Widget Pro (esempio)", "fields.title": "Campi standard", "fields.description": "Definisci campi prodotto standard e organizzali in gruppi", - "fields.loading": "Caricamento campi standard…", + "fields.loading": "Caricamento campi standard…", "fields.loadFailed": "Caricamento campi non riuscito", "fields.loadGroupsFailed": "Caricamento gruppi di campi non riuscito", "fields.addField": "Aggiungi nuovo campo", @@ -2969,19 +2970,19 @@ export const it: MessageDict = { "fields.saveFieldFailed": "Salvataggio campo non riuscito", "fields.saveGroupFailed": "Salvataggio gruppo non riuscito", "fields.updateFieldFailed": "Aggiornamento campo non riuscito", - "fields.updateUnitFailed": "Aggiornamento unità non riuscito", + "fields.updateUnitFailed": "Aggiornamento unità non riuscito", "fields.deleteFieldFailed": "Impossibile eliminare il campo", "fields.deleteGroupFailed": "Eliminazione gruppo non riuscita", "fields.bulkUpdateFailed": "Aggiornamento massivo non riuscito", "fields.enableRecommendedFailed": "Abilitazione campi consigliati non riuscita", "fields.enabledRecommended": "Campi ecommerce consigliati abilitati", - "fields.deleteFieldConfirm": "Questa azione non può essere annullata. Eliminerà definitivamente il campo e lo rimuoverà da qualsiasi modello che lo usa.", - "fields.deleteGroupConfirm": "Questa azione non può essere annullata. Eliminerà definitivamente il gruppo. I campi di questo gruppo dovranno essere riassegnati.", + "fields.deleteFieldConfirm": "Questa azione non può essere annullata. Eliminerà definitivamente il campo e lo rimuoverà da qualsiasi modello che lo usa.", + "fields.deleteGroupConfirm": "Questa azione non può essere annullata. Eliminerà definitivamente il gruppo. I campi di questo gruppo dovranno essere riassegnati.", "fields.type.string": "Testo", "fields.type.stringHint": "Testo libero: nomi, codici, note brevi", "fields.type.number": "Numero", - "fields.type.numberHint": "Valore numerico; aggiungi un'unità se utile (EUR, pcs)", - "fields.type.boolean": "Sì / No", + "fields.type.numberHint": "Valore numerico; aggiungi un'unità se utile (EUR, pcs)", + "fields.type.boolean": "Sì / No", "fields.type.booleanHint": "Vero o falso", "fields.type.date": "Data", "fields.type.dateHint": "Una data di calendario", @@ -2990,7 +2991,7 @@ export const it: MessageDict = { "fields.type.image": "Immagine", "fields.type.imageHint": "URL immagine o immagine galleria", "fields.type.dimension": "Dimensione", - "fields.type.dimensionHint": "Misura di lunghezza (larghezza, altezza, profondità)", + "fields.type.dimensionHint": "Misura di lunghezza (larghezza, altezza, profondità)", "fields.type.weight": "Peso", "fields.type.weightHint": "Massa / peso di spedizione", "fields.type.color": "Colore", @@ -2999,19 +3000,19 @@ export const it: MessageDict = { "fields.type.customHint": "Campo speciale / libero", "empty.admin.knowledgeHeading": "Knowledge support", "empty.admin.translationsHeading": "Traduzioni", - "flash.attrs.createdLinkFailed": "Attributo creato, ma l'assegnazione della categoria non è riuscita.", + "flash.attrs.createdLinkFailed": "Attributo creato, ma l'assegnazione della categoria non è riuscita.", "flash.attrs.created": "Attributo creato.", "flash.attrs.csvImported": "Importazione CSV completata.", "flash.attrs.updated": "Attributo aggiornato.", "flash.attrs.deleted": "Attributo eliminato.", "flash.attrs.valueDeleted": "Valore eliminato.", - "flash.attrs.assignedLinks": "Assegnati {count} collegamento/i categoria–attributo.", + "flash.attrs.assignedLinks": "Assegnati {count} collegamento/i categoria–attributo.", "flash.brand.saved": "Brand kit salvato.", "flash.brand.logoType": "Il logo deve essere PNG, JPEG o WebP", "flash.brand.logoSize": "Il logo supera il limite di 2 MiB", "flash.brand.logoUploaded": "Logo caricato.", - "flash.categories.updated": "La categoria è stata aggiornata correttamente.", - "flash.categories.deleted": "La categoria è stata eliminata correttamente.", + "flash.categories.updated": "La categoria è stata aggiornata correttamente.", + "flash.categories.deleted": "La categoria è stata eliminata correttamente.", "flash.categories.csvImported": "Importazione CSV completata.", "flash.products.csvImported": "Product CSV import finished.", "flash.categories.descFormulaAssigned": "Formula descrizione assegnata a {count} categorie", @@ -3031,10 +3032,10 @@ export const it: MessageDict = { "common.edit": "Modifica", "common.previous": "Precedente", "common.next": "Avanti", - "common.saving": "Salvataggio…", - "common.deleting": "Eliminazione…", - "common.adding": "Aggiunta…", - "common.processing": "Elaborazione…", + "common.saving": "Salvataggio…", + "common.deleting": "Eliminazione…", + "common.adding": "Aggiunta…", + "common.processing": "Elaborazione…", "common.upload": "Carica", "common.expand": "Espandi", "common.collapse": "Comprimi", @@ -3044,21 +3045,21 @@ export const it: MessageDict = { "common.off": "Disattivo", "common.system": "Sistema", "common.type": "Tipo", - "common.unit": "Unità", + "common.unit": "Unità", "common.group": "Gruppo", "common.search": "Cerca", "common.openMenu": "Apri menu", "common.areYouSure": "Sei sicuro?", "common.selectGroup": "Seleziona un gruppo", "attributes.addAttribute": "Aggiungi attributo", - "attributes.searchPlaceholder": "Cerca attributi…", + "attributes.searchPlaceholder": "Cerca attributi…", "attributes.searchAria": "Cerca attributi (premi Invio per cercare)", "attributes.filterCategoryAria": "Filtra per categoria", "attributes.allCategories": "Tutte le categorie", "attributes.col.name": "Nome", "attributes.col.key": "Chiave attributo", "attributes.col.type": "Tipo", - "attributes.col.unit": "Unità", + "attributes.col.unit": "Unità", "attributes.col.categories": "Categorie", "attributes.col.updated": "Ultimo aggiornamento", "attributes.col.actions": "Azioni", @@ -3071,9 +3072,9 @@ export const it: MessageDict = { "attributes.loadingValues": "Caricamento valori...", "attributes.noValuesYetHint": "Nessun valore aggiunto. Usa \"Manage Values\" per aggiungerne.", "attributes.pageZero": "0 attributi", - "attributes.pageShowing": "Visualizzazione {from}–{to} di {total} attributi", + "attributes.pageShowing": "Visualizzazione {from}–{to} di {total} attributi", "attributes.linkCategoryFailed": "Impossibile assegnare l'attributo alla categoria selezionata.", - "attributes.createdLinkFailed": "Attributo creato, ma l'assegnazione della categoria non è riuscita.", + "attributes.createdLinkFailed": "Attributo creato, ma l'assegnazione della categoria non è riuscita.", "attributes.createFailed": "Creazione non riuscita", "attributes.importFinished": "Importazione CSV completata.", "attributes.importFailed": "Importazione non riuscita", @@ -3088,7 +3089,7 @@ export const it: MessageDict = { "attributes.rowUnknown": "Riga {row}: categoria o attributo sconosciuto", "attributes.rowLinkFailed": "Riga {row}: {detail}", "attributes.linkFailedShort": "collegamento non riuscito", - "attributes.assignedLinks": "Assegnati {count} collegamento/i categoria–attributo.", + "attributes.assignedLinks": "Assegnati {count} collegamento/i categoria–attributo.", "attributes.rowsFailed": "{count} riga/righe non riuscita/e.", "attributes.addTitle": "Aggiungi nuovo attributo", "attributes.addDesc": "Crea una nuova definizione di attributo. Puoi assegnarla a una categoria durante la creazione.", @@ -3101,9 +3102,9 @@ export const it: MessageDict = { "attributes.field.type": "Tipo", "attributes.field.typeDefaultHint": "Scegli come vengono inseriti i valori per questo attributo.", "attributes.field.category": "Categoria", - "attributes.field.categoryPlaceholder": "Seleziona una categoria…", + "attributes.field.categoryPlaceholder": "Seleziona una categoria…", "attributes.field.categoryHint": "Seleziona la categoria a cui appartiene questo attributo. Gli attributi devono essere assegnati a una categoria.", - "attributes.field.unitOptional": "Unità (facoltativa)", + "attributes.field.unitOptional": "Unità (facoltativa)", "attributes.field.unitPlaceholder": "es. cm, kg, ecc.", "attributes.field.exampleOptional": "Esempio (facoltativo)", "attributes.field.examplePlaceholder": "es. 100x200", @@ -3114,16 +3115,16 @@ export const it: MessageDict = { "attributes.bulk.uploadHint": "Carica un file CSV o TSV con le seguenti colonne:", "attributes.bulk.col.key": "Identificatore univoco (obbligatorio)", "attributes.bulk.col.name": "Nome visualizzato (obbligatorio)", - "attributes.bulk.col.valueType": "string (Testo), number, boolean (Sì/No), date, list (Menu a discesa), multiselect", + "attributes.bulk.col.valueType": "string (Testo), number, boolean (Sì/No), date, list (Menu a discesa), multiselect", "attributes.bulk.col.categoryId": "ID univoco categoria", "attributes.bulk.col.unitExample": "facoltativo", "attributes.bulk.col.parentKey": "Chiave padre per valori di lista", "attributes.editTitle": "Modifica attributo", "attributes.editDesc": "Aggiorna i dettagli dell'attributo \"{name}\"", "attributes.field.keyHint": "Identificatore univoco di questo attributo", - "attributes.field.displayNameHint": "Il nome che verrà visualizzato agli utenti", + "attributes.field.displayNameHint": "Il nome che verrà visualizzato agli utenti", "attributes.deleteTitle": "Elimina attributo", - "attributes.deleteDesc": "Sei sicuro di voler eliminare \"{name}\"? Questa azione non può essere annullata.", + "attributes.deleteDesc": "Sei sicuro di voler eliminare \"{name}\"? Questa azione non può essere annullata.", "attributes.deleteWarningValues": "Avviso: verranno eliminati anche tutti i valori associati a questo attributo.", "attributes.manageTitleNamed": "Gestisci valori per {name}", "attributes.manageTitle": "Gestisci valori", @@ -3132,7 +3133,7 @@ export const it: MessageDict = { "attributes.valueKeyHint": "Identificatore univoco di questo valore", "attributes.displayValue": "Valore visualizzato", "attributes.displayValuePlaceholder": "Valore da visualizzare", - "attributes.displayValueHint": "Il nome visualizzato che verrà mostrato per questo valore", + "attributes.displayValueHint": "Il nome visualizzato che verrà mostrato per questo valore", "attributes.updateValue": "Aggiorna valore", "attributes.noValuesYet": "Nessun valore ancora.", "attributes.assignTitle": "Assegna attributi alle categorie", @@ -3140,29 +3141,29 @@ export const it: MessageDict = { "attributes.downloadTemplate": "Scarica modello", "attributes.csvFile": "File CSV", "attributes.assignSuccess": "Assegnazioni applicate correttamente.", - "attributes.assigning": "Assegnazione…", + "attributes.assigning": "Assegnazione…", "attributes.uploadAndAssign": "Carica e assegna", "attributes.type.string.label": "Testo", - "attributes.type.string.hint": "Testo libero — nomi, modelli, note brevi", + "attributes.type.string.hint": "Testo libero — nomi, modelli, note brevi", "attributes.type.number.label": "Numero", - "attributes.type.number.hint": "Valore numerico; aggiungi un'unità se utile (cm, kg, W)", - "attributes.type.boolean.label": "Sì / No", - "attributes.type.boolean.hint": "Vero o falso — es. ha GPS, ricarica wireless", + "attributes.type.number.hint": "Valore numerico; aggiungi un'unità se utile (cm, kg, W)", + "attributes.type.boolean.label": "Sì / No", + "attributes.type.boolean.hint": "Vero o falso — es. ha GPS, ricarica wireless", "attributes.type.date.label": "Data", - "attributes.type.date.hint": "Una data di calendario (rilascio, fine garanzia, …)", + "attributes.type.date.hint": "Una data di calendario (rilascio, fine garanzia, …)", "attributes.type.list.label": "Menu a discesa", "attributes.type.list.hint": "Scegli esattamente un'opzione da un elenco definito", "attributes.type.multiselect.label": "Selezione multipla", - "attributes.type.multiselect.hint": "Scegli una o più opzioni da un elenco", + "attributes.type.multiselect.hint": "Scegli una o più opzioni da un elenco", "standardFields.title": "Campi standard", "standardFields.description": "Definisci campi prodotto standard e organizzali in gruppi", - "standardFields.apiUnavailable": "L'API dei campi standard non è disponibile. Le modifiche non possono essere salvate.", - "standardFields.apiUnreachable": "L'API dei campi standard non è raggiungibile ora. Crea/modifica resta disabilitato finché /api/standard-fields e /api/field-groups non rispondono.", - "standardFields.loading": "Caricamento campi standard…", + "standardFields.apiUnavailable": "L'API dei campi standard non è disponibile. Le modifiche non possono essere salvate.", + "standardFields.apiUnreachable": "L'API dei campi standard non è raggiungibile ora. Crea/modifica resta disabilitato finché /api/standard-fields e /api/field-groups non rispondono.", + "standardFields.loading": "Caricamento campi standard…", "standardFields.tab.fields": "Campi", "standardFields.tab.groups": "Gruppi", "standardFields.heading": "Campi standard", - "standardFields.headingHint": "Abilita i campi per mappatura ed elaborazione — un interruttore per riga.", + "standardFields.headingHint": "Abilita i campi per mappatura ed elaborazione — un interruttore per riga.", "standardFields.enableRecommended": "Abilita consigliati", "standardFields.enableSelected": "Abilita selezione ({count})", "standardFields.disableSelected": "Disabilita selezione", @@ -3172,14 +3173,14 @@ export const it: MessageDict = { "standardFields.col.name": "Nome", "standardFields.col.key": "Chiave", "standardFields.col.type": "Tipo", - "standardFields.col.unit": "Unità", + "standardFields.col.unit": "Unità", "standardFields.col.group": "Gruppo", "standardFields.col.status": "Stato", "standardFields.emptySearch": "Nessun campo corrisponde alla ricerca", "standardFields.emptyHint": "Nessun campo trovato. Fai clic su \"Aggiungi campo\" per crearne uno.", "standardFields.selectFieldAria": "Seleziona {name}", "standardFields.enableFieldAria": "Abilita {name}", - "standardFields.systemFieldTitle": "Campo di sistema — non eliminabile", + "standardFields.systemFieldTitle": "Campo di sistema — non eliminabile", "standardFields.groupsHeading": "Gruppi di campi", "standardFields.addGroup": "Aggiungi gruppo", "standardFields.searchGroups": "Cerca gruppi...", @@ -3196,7 +3197,7 @@ export const it: MessageDict = { "standardFields.enabledNamed": "Abilitato {name}", "standardFields.disabledNamed": "{name} disabilitato", "standardFields.updateFieldFailed": "Aggiornamento campo non riuscito", - "standardFields.updateUnitFailed": "Aggiornamento unità non riuscito", + "standardFields.updateUnitFailed": "Aggiornamento unità non riuscito", "standardFields.bulkEnabled": "Abilitati {count} campo/i", "standardFields.bulkDisabled": "Disabilitati {count} campo/i", "standardFields.bulkFailed": "Aggiornamento massivo non riuscito", @@ -3228,9 +3229,9 @@ export const it: MessageDict = { "standardFields.field.enabledHint": "Usa questo campo in mappatura ed elaborazione", "standardFields.field.required": "Campo obbligatorio", "standardFields.field.requiredHint": "I campi obbligatori devono essere mappati su ogni feed prima di poter sincronizzare i prodotti.", - "standardFields.field.unit": "Unità", - "standardFields.field.unitPlaceholder": "kg, EUR, cm…", - "standardFields.field.unitHint": "Unità facoltativa mostrata con questo campo", + "standardFields.field.unit": "Unità", + "standardFields.field.unitPlaceholder": "kg, EUR, cm…", + "standardFields.field.unitHint": "Unità facoltativa mostrata con questo campo", "standardFields.field.description": "Descrizione", "standardFields.field.descriptionPlaceholder": "Inserisci una descrizione per questo campo", "standardFields.field.default": "Valore predefinito", @@ -3250,16 +3251,16 @@ export const it: MessageDict = { "standardFields.group.descriptionPlaceholder": "Inserisci una descrizione per questo gruppo", "standardFields.group.descriptionHint": "Descrizione facoltativa che spiega lo scopo di questo gruppo", "standardFields.group.order": "Ordine di visualizzazione", - "standardFields.group.orderHint": "I numeri più bassi appaiono per primi", + "standardFields.group.orderHint": "I numeri più bassi appaiono per primi", "standardFields.updateGroup": "Aggiorna gruppo", "standardFields.createGroup": "Crea gruppo", - "standardFields.deleteFieldDesc": "Questa azione non può essere annullata. Eliminerà definitivamente il campo e lo rimuoverà da qualsiasi modello che lo usa.", - "standardFields.deleteGroupDesc": "Questa azione non può essere annullata. Eliminerà definitivamente il gruppo. I campi di questo gruppo dovranno essere riassegnati.", + "standardFields.deleteFieldDesc": "Questa azione non può essere annullata. Eliminerà definitivamente il campo e lo rimuoverà da qualsiasi modello che lo usa.", + "standardFields.deleteGroupDesc": "Questa azione non può essere annullata. Eliminerà definitivamente il gruppo. I campi di questo gruppo dovranno essere riassegnati.", "standardFields.type.string.label": "Testo", "standardFields.type.string.hint": "Testo libero: nomi, codici, note brevi", "standardFields.type.number.label": "Numero", - "standardFields.type.number.hint": "Valore numerico; aggiungi un'unità se utile (EUR, pcs)", - "standardFields.type.boolean.label": "Sì / No", + "standardFields.type.number.hint": "Valore numerico; aggiungi un'unità se utile (EUR, pcs)", + "standardFields.type.boolean.label": "Sì / No", "standardFields.type.boolean.hint": "Vero o falso", "standardFields.type.date.label": "Data", "standardFields.type.date.hint": "Una data di calendario", @@ -3268,7 +3269,7 @@ export const it: MessageDict = { "standardFields.type.image.label": "Immagine", "standardFields.type.image.hint": "URL immagine o immagine galleria", "standardFields.type.dimension.label": "Dimensione", - "standardFields.type.dimension.hint": "Misura di lunghezza (larghezza, altezza, profondità)", + "standardFields.type.dimension.hint": "Misura di lunghezza (larghezza, altezza, profondità)", "standardFields.type.weight.label": "Peso", "standardFields.type.weight.hint": "Massa / peso di spedizione", "standardFields.type.color.label": "Colore", @@ -3292,7 +3293,7 @@ export const it: MessageDict = { "standardFields.fallback.sku": "SKU", "standardFields.fallback.mpn": "MPN", "standardFields.fallback.category": "Categoria", - "standardFields.fallback.availability": "Disponibilità", + "standardFields.fallback.availability": "Disponibilità", "standardFields.fallback.stock": "Scorte", "standardFields.fallback.color": "Colore", "standardFields.fallback.size": "Dimensione", @@ -3300,7 +3301,7 @@ export const it: MessageDict = { "standardFields.fallback.warranty": "Garanzia", "standardFields.fallback.service": "Servizio", "standardFields.fallback.weight": "Peso", - "standardFields.fallback.net_depth": "Profondità netta", + "standardFields.fallback.net_depth": "Profondità netta", "standardFields.fallback.net_height": "Altezza netta", "standardFields.fallback.net_width": "Larghezza netta", "standardFields.fallback.net_mass": "Massa netta", @@ -3308,10 +3309,10 @@ export const it: MessageDict = { "standardFields.fallback.eprel_id": "ID EPREL", "standardFields.fallback.specs": "Specifiche", "standardFields.fallback.specifications": "Specifiche (legacy)", - "standardFields.tip.gtin": "Global Trade Item Number — barcode/EAN/UPC che identifica il prodotto.", + "standardFields.tip.gtin": "Global Trade Item Number — barcode/EAN/UPC che identifica il prodotto.", "standardFields.tip.title": "Nome prodotto rivolto al cliente, mostrato in cataloghi e canali.", "standardFields.tip.brand": "Nome del produttore o del brand (non del rivenditore).", - "standardFields.tip.description": "Testo prodotto più lungo; usato per arricchimento e listing canale.", + "standardFields.tip.description": "Testo prodotto più lungo; usato per arricchimento e listing canale.", "standardFields.tip.product_model": "Nome/numero di modello del produttore.", "standardFields.tip.price": "Prezzo di vendita regolare (numerico; valuta mappata separatamente).", "standardFields.tip.sale_price": "Prezzo scontato o promozionale in offerta.", @@ -3322,11 +3323,11 @@ export const it: MessageDict = { "standardFields.tip.additional_image_urls": "URL di immagini aggiuntive (separate da virgole o nodi ripetuti).", "standardFields.tip.product_url": "URL pubblica della pagina prodotto sul tuo negozio o sito.", "standardFields.tip.official_link": "URL della pagina prodotto del produttore o del brand.", - "standardFields.tip.sku": "Stock Keeping Unit — il tuo codice articolo interno.", - "standardFields.tip.mpn": "Manufacturer Part Number — codice pezzo del fornitore.", + "standardFields.tip.sku": "Stock Keeping Unit — il tuo codice articolo interno.", + "standardFields.tip.mpn": "Manufacturer Part Number — codice pezzo del fornitore.", "standardFields.tip.category": "Categoria prodotto o percorso di tassonomia.", "standardFields.tip.availability": "Stato tipo disponibile / esaurito / preordine.", - "standardFields.tip.stock": "Quantità di inventario numerica.", + "standardFields.tip.stock": "Quantità di inventario numerica.", "standardFields.tip.color": "Attributo colore per le varianti.", "standardFields.tip.size": "Attributo taglia per le varianti.", "standardFields.tip.material": "Materiale principale o composizione.", @@ -3337,9 +3338,9 @@ export const it: MessageDict = { "standardFields.tip.specs": "Specifiche tecniche strutturate.", "standardFields.tip.specifications": "Campo specs legacy; preferisci specs quando esistono entrambi.", "export.dialog.title": "Esporta prodotti selezionati", - "export.dialog.description": "Esporta {count} prodotto/i selezionato/i. Scegli il feed di esportazione che definisce formato e campi — come scegliere cosa sincronizzare, ma per un download o un partner.", + "export.dialog.description": "Esporta {count} prodotto/i selezionato/i. Scegli il feed di esportazione che definisce formato e campi — come scegliere cosa sincronizzare, ma per un download o un partner.", "export.dialog.loadFailed": "Caricamento opzioni feed di esportazione non riuscito. Riprova.", - "export.dialog.selectPlaceholder": "Seleziona un feed di esportazione…", + "export.dialog.selectPlaceholder": "Seleziona un feed di esportazione…", "export.dialog.help": "La selezione sceglie i prodotti; il feed sceglie formato del canale e campi mappati.", "export.dialog.emptyTitle": "Nessun feed di esportazione ancora", "export.dialog.emptyMessage": "Crea un feed di esportazione per scegliere formato e campi, poi torna a esportare questa selezione.", @@ -3351,12 +3352,12 @@ export const it: MessageDict = { "billing.usageLoadFailed": "Caricamento utilizzo non riuscito", "billing.checkoutComplete": "Checkout completato. Piano e crediti si aggiorneranno a breve.", "billing.checkoutCompletePlan": "Piano aggiornato. I tuoi crediti {plan} sono pronti.", - "billing.checkoutCanceled": "Checkout annullato. Nessuna modifica è stata apportata.", + "billing.checkoutCanceled": "Checkout annullato. Nessuna modifica è stata apportata.", "billing.portalReturned": "Tornato dal portale di fatturazione. Gestisci il piano qui o in Plans.", "billing.comparePlans": "Confronta piani", "billing.managePayment": "Gestisci pagamento", "billing.addCredits": "Aggiungi crediti", - "billing.addingCredits": "Aggiunta…", + "billing.addingCredits": "Aggiunta…", "billing.addCreditsTitle": "Aggiungi crediti", "billing.addCreditsDescription": "Solo admin della piattaforma. I crediti sono subito disponibili per titoli IA, descrizioni e altri passaggi a pagamento.", "billing.creditAmount": "Importo credito", @@ -3373,8 +3374,8 @@ export const it: MessageDict = { "billing.noMonthlyAiCredits": "Nessun credito IA mensile", "billing.header.noPlan": "Nessun piano assegnato. Scegli un piano o chiedi a un amministratore.", "billing.header.free": "Mappa i feed e pulisci i dati prodotto senza crediti IA.", - "billing.header.enterprise": "Prodotti e capacità IA illimitati.", - "billing.header.payg": "Pay as you go — i crediti provengono dal wallet aziendale.", + "billing.header.enterprise": "Prodotti e capacità IA illimitati.", + "billing.header.payg": "Pay as you go — i crediti provengono dal wallet aziendale.", "billing.header.remaining": "{remaining} crediti IA rimanenti in questo periodo.", "billing.na": "N/D", "billing.range.7d": "ultimi 7 giorni", @@ -3386,11 +3387,11 @@ export const it: MessageDict = { "billing.rangeOpt.cycle": "Ciclo attuale", "billing.rangeOpt.all": "Di sempre", "billing.freeBannerTitle": "Sei sul piano Free", - "billing.freeBannerMessage": "Esegui l'upgrade per titoli e descrizioni IA e limiti prodotto più alti.", + "billing.freeBannerMessage": "Esegui l'upgrade per titoli e descrizioni IA e limiti prodotto più alti.", "billing.outOfCreditsTitle": "Hai esaurito i crediti IA", "billing.productLimitTitle": "Limite prodotti raggiunto", - "billing.outOfCreditsMessage": "Titoli e descrizioni IA sono in pausa finché non aggiungi crediti o esegui l'upgrade.", - "billing.productLimitMessage": "Passa a un piano superiore per più capacità prodotti.", + "billing.outOfCreditsMessage": "Titoli e descrizioni IA sono in pausa finché non aggiungi crediti o esegui l'upgrade.", + "billing.productLimitMessage": "Passa a un piano superiore per più capacità prodotti.", "billing.lowCreditsTitle": "Crediti in esaurimento", "billing.lowCreditsMessage": "Solo {remaining} crediti rimasti su {plan}. Esegui l'upgrade prima del prossimo grande lotto.", "billing.currentPlan": "Piano attuale", @@ -3398,52 +3399,52 @@ export const it: MessageDict = { "billing.openEndedContract": "Contratto aperto", "billing.creditWallet": "Wallet crediti", "billing.creditsRemaining": "Crediti rimanenti", - "billing.enterpriseCapacity": "Capacità gestita Enterprise", - "billing.paygUsed": "{used} usati · nessuna assegnazione mensile", + "billing.enterpriseCapacity": "Capacità gestita Enterprise", + "billing.paygUsed": "{used} usati · nessuna assegnazione mensile", "billing.trialLeftover": "Crediti di prova / residui", "billing.aiLockedFree": "IA bloccata sul piano Free", "billing.usedOf": "{used} usati di {total}", "billing.noBalanceTitle": "Nessun saldo crediti ancora", "billing.noBalanceBody": "I crediti del piano appariranno qui una volta configurata la fatturazione per questo workspace.", - "billing.needCapacity": "Serve più capacità?", + "billing.needCapacity": "Serve più capacità?", "billing.selfServeUpgrade": "Upgrade self-service a Starter, Growth o Business", "billing.viaStripe": "tramite Stripe", "billing.checkoutUnavailable": "Gli acquisti self-service non sono disponibili finche Stripe non e configurato. Contatta le vendite per un piano.", "billing.upgradeToGrowth": "Passa a Growth", "billing.askAdminPlan": "Chiedi a un amministratore di cambiare il piano.", "billing.usage": "Utilizzo", - "billing.productsProcessed": "{count} prodotti elaborati · {range}", - "billing.updating": "Aggiornamento…", + "billing.productsProcessed": "{count} prodotti elaborati · {range}", + "billing.updating": "Aggiornamento…", "billing.productsByDay": "Prodotti per giorno", "billing.chartAmber": "Ambra = token. Intervallo: {range}.", "billing.chartRange": "Intervallo: {range}.", "billing.nothingToChartTitle": "Niente da mostrare ancora", - "billing.nothingToChartBody": "Aggiungi prodotti o collega un feed — l'utilizzo apparirà qui.", + "billing.nothingToChartBody": "Aggiungi prodotti o collega un feed — l'utilizzo apparirà qui.", "billing.dailyChartsHint": "I grafici giornalieri sono disponibili per gli ultimi 7 giorni, 30 giorni o il ciclo di fatturazione corrente.", "billing.noNewProducts": "Nessun nuovo prodotto in {range}", "billing.catalogOverall": "Il catalogo ha {count} prodotti in totale.", "billing.chartProducts": "Prodotti", "billing.chartTokens": "Gettoni", "billing.chartEmpty": "Nessun prodotto in questo periodo.", - "billing.adminStats": "{tokens} token · {jobs} processi · {input} feed di input / {export} di esportazione", + "billing.adminStats": "{tokens} token · {jobs} processi · {input} feed di input / {export} di esportazione", "billing.whatUsesCredits": "Cosa consuma crediti", "billing.burnsCredits": "Consuma crediti", "billing.noCreditCost": "Nessun costo crediti", "billing.publicPricing": "Prezzi pubblici", "billing.managePlanOnPlans": "Gestisci piano in Piani", "billing.recovery.pastDueTitle": "Pagamento scaduto", - "billing.recovery.pastDueAdmin": "Il pagamento dell'abbonamento non è riuscito. Aggiorna il pagamento nel Customer Portal — l'accesso resta aperto durante questo periodo di grazia.", + "billing.recovery.pastDueAdmin": "Il pagamento dell'abbonamento non è riuscito. Aggiorna il pagamento nel Customer Portal — l'accesso resta aperto durante questo periodo di grazia.", "billing.recovery.pastDueMember": "La fatturazione richiede attenzione. Chiedi a un amministratore di aggiornare il pagamento nel Customer Portal. L'accesso resta aperto durante questo periodo di grazia.", "billing.recovery.openPortal": "Apri Customer Portal", "billing.recovery.contactAdmin": "Contatta un amministratore", "billing.recovery.goToBilling": "Vai alla fatturazione", "billing.recovery.missingPlanTitle": "Nessun piano assegnato", - "billing.recovery.missingPlanMessage": "Questa azienda non ha un piano attivo (spesso dopo una migrazione saltata). Assegna un piano via Checkout o chiedi al supporto — non dare per scontata la capacità Unlimited.", + "billing.recovery.missingPlanMessage": "Questa azienda non ha un piano attivo (spesso dopo una migrazione saltata). Assegna un piano via Checkout o chiedi al supporto — non dare per scontata la capacità Unlimited.", "billing.recovery.choosePlan": "Scegli un piano", "billing.upgrade": "Aggiorna", "billing.askCompanyAdmin": "Chiedi a un amministratore dell'azienda", "billing.memberHint": "Solo gli amministratori possono cambiare piano o aprire Checkout.", - "billing.unlimitedPlanWallet": "Piano illimitato · portafoglio {wallet}", + "billing.unlimitedPlanWallet": "Piano illimitato · portafoglio {wallet}", "billing.creditsSuffix": "{label} crediti", "billing.perMonth": "{amount} / mese", "billing.zeroPerMonth": "0 / mese", @@ -3458,41 +3459,41 @@ export const it: MessageDict = { "billing.creditUsage.normalize.label": "Normalizza, specs e riempi", "billing.creditUsage.normalize.detail": "Pulizia dati e riempimento attributi vengono eseguiti senza consumare crediti IA.", "billing.creditUsage.ai.label": "Titoli e descrizioni IA", - "billing.creditUsage.ai.detail": "Addebitato per prodotto in base alla funzione IA e alla quantità di testo generato.", + "billing.creditUsage.ai.detail": "Addebitato per prodotto in base alla funzione IA e alla quantità di testo generato.", "billing.creditUsage.eprel.label": "EPREL / etichette energetiche", "billing.creditUsage.eprel.detail": "Dati EPREL UE pubblici gratuiti su tutti i piani (senza crediti).", "billing.creditUsage.campaign.label": "IA campagna e applicazione brand", "billing.creditUsage.campaign.detail": "I passaggi IA a pagamento che usano il modello gestito consumano crediti aziendali.", "exports.title": "Feed di esportazione", - "exports.description": "Scegli cosa pubblicare per canale — quali prodotti e campi — poi condividi un URL feed pubblico (senza login).", + "exports.description": "Scegli cosa pubblicare per canale — quali prodotti e campi — poi condividi un URL feed pubblico (senza login).", "exports.descriptionFiltered": "Link pubblici Google Shopping, Meta e feed personalizzati. Visualizzazione di {filtered} su {total} feed.", "exports.loadFailed": "Caricamento feed di esportazione non riuscito", "exports.loadFeedFailed": "Caricamento feed di esportazione non riuscito", "exports.refresh": "Aggiorna", - "exports.refreshing": "Aggiornamento…", + "exports.refreshing": "Aggiornamento…", "exports.create": "Crea feed di esportazione", "exports.edit": "Modifica feed di esportazione", "exports.editDescription": "Aggiorna nome, stato, prodotti inclusi e campi mappati.", "exports.howToTitle": "Come scegliere cosa esportare", "exports.howTo.choose": "Cosa entra nel feed", - "exports.howTo.chooseBody": "— imposta feed di origine e stati prodotto in creazione/modifica così l'URL pubblico include solo quei prodotti.", + "exports.howTo.chooseBody": "— imposta feed di origine e stati prodotto in creazione/modifica così l'URL pubblico include solo quei prodotti.", "exports.howTo.subset": "Sottoinsieme una tantum", - "exports.howTo.subsetBody": "— su", + "exports.howTo.subsetBody": "— su", "exports.howTo.productsLink": "Prodotti", "exports.howTo.subsetTail": ", seleziona le righe ed Esporta per scaricare solo quei prodotti con formato e campi del feed.", "exports.howTo.google": "Google Shopping", - "exports.howTo.googleBody": "— crea un preset CSV o XML, Generate, copia l'URL pubblico in Merchant Center → Products → Feeds → scheduled fetch.", + "exports.howTo.googleBody": "— crea un preset CSV o XML, Generate, copia l'URL pubblico in Merchant Center → Products → Feeds → scheduled fetch.", "exports.howTo.meta": "Catalogo Meta", - "exports.howTo.metaBody": "— preset CSV per le origini dati di Commerce Manager.", + "exports.howTo.metaBody": "— preset CSV per le origini dati di Commerce Manager.", "exports.howTo.custom": "CSV/XML personalizzato", - "exports.howTo.customBody": "— qualsiasi partner; la stessa URL pubblica funziona per poller cron / webhook.", + "exports.howTo.customBody": "— qualsiasi partner; la stessa URL pubblica funziona per poller cron / webhook.", "exports.howTo.rest": "REST", - "exports.howTo.restBody": "— chiavi API in", - "exports.howTo.settingsApiKeys": "Impostazioni → Chiavi API", + "exports.howTo.restBody": "— chiavi API in", + "exports.howTo.settingsApiKeys": "Impostazioni → Chiavi API", "exports.howTo.restTail": "(chiavi legacy non migrate) pull", "exports.howTo.openapi": "OpenAPI", "exports.feedStatus": "Stato del feed", - "exports.generating": "Generazione esportazione — può richiedere un momento per cataloghi grandi.", + "exports.generating": "Generazione esportazione — può richiedere un momento per cataloghi grandi.", "exports.generationFailed": "Generazione non riuscita. Vedi l'errore sopra, poi riprova Refresh Feed.", "exports.exportedProducts": "Esportati {count} prodotti", "exports.lastGenerated": "Ultima generazione: {time}", @@ -3500,12 +3501,12 @@ export const it: MessageDict = { "exports.searchPlaceholder": "Cerca feed...", "exports.searchAria": "Cerca feed", "exports.clearSearch": "Cancella ricerca", - "exports.loading": "Caricamento feed…", + "exports.loading": "Caricamento feed…", "exports.loadErrorTitle": "Impossibile caricare i feed di esportazione", - "exports.loadErrorBody": "Qualcosa è andato storto nel caricamento delle esportazioni. Riprova o controlla l'errore sopra per i dettagli.", + "exports.loadErrorBody": "Qualcosa è andato storto nel caricamento delle esportazioni. Riprova o controlla l'errore sopra per i dettagli.", "exports.tryAgain": "Riprova", "exports.emptyTitle": "Nessun feed di esportazione ancora", - "exports.emptyBody": "Crea un feed Google Shopping, Meta o CSV/XML personalizzato per scegliere quali prodotti e campi esportare. Genera un URL pubblico per Merchant Center o qualsiasi partner — oppure esporta un sottoinsieme da Prodotti.", + "exports.emptyBody": "Crea un feed Google Shopping, Meta o CSV/XML personalizzato per scegliere quali prodotti e campi esportare. Genera un URL pubblico per Merchant Center o qualsiasi partner — oppure esporta un sottoinsieme da Prodotti.", "exports.emptyCta": "Crea feed Google Shopping", "exports.noMatchTitle": "Nessun feed corrispondente", "exports.noMatchBody": "Prova un altro termine di ricerca.", @@ -3516,7 +3517,7 @@ export const it: MessageDict = { "exports.col.status": "Stato", "exports.col.actions": "Azioni", "exports.working": "In corso.", - "exports.generatingShort": "Generazione…", + "exports.generatingShort": "Generazione…", "exports.copyUrl": "Copia URL", "exports.openMenu": "Apri menu", "exports.preview": "Anteprima", @@ -3526,12 +3527,12 @@ export const it: MessageDict = { "exports.delete": "Elimina", "exports.rotateToken": "Ruota token URL", "exports.rotateFailed": "Rotazione del token URL non riuscita", - "exports.deleting": "Eliminazione…", + "exports.deleting": "Eliminazione…", "exports.channelPreset": "Preset canale", "exports.name": "Nome", "exports.format": "Formato", "exports.sourceFeed": "Feed di origine (facoltativo)", - "exports.sourceFeedHelp": "Limita questo feed ai prodotti di un feed di input, oppure lascia Tutti i prodotti — così scegli cosa include l'URL pubblico.", + "exports.sourceFeedHelp": "Limita questo feed ai prodotti di un feed di input, oppure lascia Tutti i prodotti — così scegli cosa include l'URL pubblico.", "exports.allProducts": "Tutti i prodotti", "exports.rootElement": "Elemento radice", "exports.itemElement": "Elemento item", @@ -3547,7 +3548,7 @@ export const it: MessageDict = { "exports.customSource": "Personalizzato (attr.* / spec.*)", "exports.removeField": "Rimuovi campo", "exports.fieldHelp": "Le esportazioni leggono i prodotti elaborati (con mapped_data grezzo come fallback). Usa eprel_* / energy_* per i campi EPREL, spec.* per una specifica, o specifications.* per espandere tutte le specs come nodi XML.", - "exports.saving": "Salvataggio…", + "exports.saving": "Salvataggio…", "exports.saveChanges": "Salva modifiche", "exports.createFeed": "Crea feed", "exports.updated": "Feed di esportazione aggiornato.", @@ -3573,18 +3574,18 @@ export const it: MessageDict = { "exports.dialog.export": "Esporta", "exports.preset.google_shopping_csv.label": "Google Shopping (CSV)", "exports.preset.google_shopping_csv.shortLabel": "Google Shopping CSV", - "exports.preset.google_shopping_csv.description": "Feed prodotti Merchant Center con le colonne Google standard (id, title, price, gtin, …).", - "exports.preset.google_shopping_csv.hint": "Dopo aver aggiornato il feed, copia l'URL CSV pubblico in Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.", + "exports.preset.google_shopping_csv.description": "Feed prodotti Merchant Center con le colonne Google standard (id, title, price, gtin, …).", + "exports.preset.google_shopping_csv.hint": "Dopo aver aggiornato il feed, copia l'URL CSV pubblico in Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.", "exports.preset.google_shopping_csv.defaultName": "Google Shopping CSV", "exports.preset.google_shopping_xml.label": "Google Shopping (XML)", "exports.preset.google_shopping_xml.shortLabel": "Google Shopping XML", - "exports.preset.google_shopping_xml.description": "Stesse colonne Google degli elementi XML (g:id, g:title, …) per i feed XML di Merchant Center.", + "exports.preset.google_shopping_xml.description": "Stesse colonne Google degli elementi XML (g:id, g:title, …) per i feed XML di Merchant Center.", "exports.preset.google_shopping_xml.hint": "Incolla l'URL XML pubblico in Merchant Center come scheduled fetch. Se necessario, mappa i campi negozio mancanti (link, price) in Field mappings.", "exports.preset.google_shopping_xml.defaultName": "Google Shopping XML", "exports.preset.meta_csv.label": "Catalogo Meta (CSV)", "exports.preset.meta_csv.shortLabel": "Meta CSV", - "exports.preset.meta_csv.description": "Colonne del catalogo Facebook / Instagram Commerce (id, title, availability, price, image_link, …).", - "exports.preset.meta_csv.hint": "In Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed, incolla l'URL CSV pubblico.", + "exports.preset.meta_csv.description": "Colonne del catalogo Facebook / Instagram Commerce (id, title, availability, price, image_link, …).", + "exports.preset.meta_csv.hint": "In Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed, incolla l'URL CSV pubblico.", "exports.preset.meta_csv.defaultName": "Catalogo Meta CSV", "exports.preset.custom_csv.label": "CSV personalizzato", "exports.preset.custom_csv.shortLabel": "CSV personalizzato", @@ -3597,61 +3598,61 @@ export const it: MessageDict = { "exports.preset.custom_xml.hint": "Imposta i nomi degli elementi root e item, poi mappa ogni chiave di output a una fonte prodotto.", "exports.preset.custom_xml.defaultName": "Esportazione XML personalizzata", "processing.title": "Elaborazione", - "processing.description": "Progresso live della pipeline per i processi di elaborazione prodotti. Aggiornamento automatico mentre questa scheda è visibile. I processi completati rimandano a Needs Review per accettare / modificare / rifiutare.", + "processing.description": "Progresso live della pipeline per i processi di elaborazione prodotti. Aggiornamento automatico mentre questa scheda è visibile. I processi completati rimandano a Needs Review per accettare / modificare / rifiutare.", "processing.refresh": "Aggiorna", "processing.loadFailed": "Caricamento processi non riuscito", - "processing.tooManyRequests": "Troppe richieste — attendi un momento e riprova.", + "processing.tooManyRequests": "Troppe richieste — attendi un momento e riprova.", "processing.serverError": "{fallback} (errore del server {status}). Riprova a breve.", "processing.httpError": "{fallback} (HTTP {status})", - "processing.cancelFailed": "Impossibile annullare questa attività", - "processing.retryFailed": "Impossibile riprovare questa attività", - "processing.cancelledMsg": "\"{name}\" è stato annullato.", + "processing.cancelFailed": "Impossibile annullare questa attività", + "processing.retryFailed": "Impossibile riprovare questa attività", + "processing.cancelledMsg": "\"{name}\" è stato annullato.", "processing.queuedRetry": "\"{name}\" messo in coda per riprovare.", "processing.jobFallback": "Job {id}", - "processing.tasks": "Attività", - "processing.pipelineHint": "Pipeline: normalize → specs → fill → EPREL → AI. Gli avvii grandi possono suddividersi in processi correlati.", - "processing.emptyTitle": "Nessuna attività in background ancora", + "processing.tasks": "Attività", + "processing.pipelineHint": "Pipeline: normalize → specs → fill → EPREL → AI. Gli avvii grandi possono suddividersi in processi correlati.", + "processing.emptyTitle": "Nessuna attività in background ancora", "processing.emptyBody": "Nessun lavoro in background ancora. Avvia un nuovo job da Products quando sei pronto.", "processing.startJob": "Avvia un lavoro", "processing.connectFeed": "Collega feed", - "processing.splitBatch": "Lotto suddiviso · {jobs} processi · {products} prodotti", - "processing.col.task": "Attività", + "processing.splitBatch": "Lotto suddiviso · {jobs} processi · {products} prodotti", + "processing.col.task": "Attività", "processing.col.status": "Stato", "processing.col.steps": "Passi", "processing.col.progress": "Avanzamento", "processing.col.started": "Avviato", "processing.col.completed": "Completato", "processing.col.actions": "Azioni", - "processing.partOfBatch": "· parte del batch", + "processing.partOfBatch": "· parte del batch", "processing.nowStep": "Ora: {step}", "processing.skip": "(salta)", "processing.reviewResults": "Esamina risultati", "processing.reviewTitle": "Apri Needs Review per accettare, modificare o rifiutare l'arricchimento", "processing.cancel": "Annulla", - "processing.cancelling": "Annullamento…", + "processing.cancelling": "Annullamento…", "processing.cancelTitle": "Annulla questo processo in sospeso o in esecuzione", "processing.retry": "Riprova", - "processing.retrying": "Nuovo tentativo…", + "processing.retrying": "Nuovo tentativo…", "processing.actions.onPage": "{count} in questa pagina", "processing.actions.clearSelection": "Cancella selezione", "processing.actions.processSelected": "Elabora selezione", "processing.actions.processAria": "Elabora prodotti selezionati", "processing.actions.processAriaCount": "Elabora {count} prodotto{plural} selezionato/i in questa pagina", "processing.actions.whatToProcess": "Cosa elaborare", - "processing.actions.freeNoAiTitle": "Piano Free — nessun credito IA", + "processing.actions.freeNoAiTitle": "Piano Free — nessun credito IA", "processing.actions.freeNoAiBody": "Normalize, specs, fill ed EPREL vengono comunque eseguiti. Titoli/descrizioni IA richiedono un piano a pagamento o crediti.", "processing.actions.comparePlans": "Confronta i piani", "processing.actions.selectAll": "Seleziona tutto", - "processing.actions.selectAllAria": "Seleziona tutte le modalità di elaborazione", + "processing.actions.selectAllAria": "Seleziona tutte le modalità di elaborazione", "processing.actions.upgradeRequired": "{label} (upgrade richiesto)", - "processing.actions.upgradeSuffix": " · upgrade", + "processing.actions.upgradeSuffix": " · upgrade", "processing.actions.credits": "{credits} crediti", "processing.actions.free": "gratis", "processing.actions.autoCategorizeTitle": "Aggiunta automatica della categorizzazione", "processing.actions.autoCategorizeBody": "{count} prodotto/i richiedono categorizzazione per l'elaborazione {types}", "processing.actions.aiLocked": "Le opzioni IA sono bloccate su Free. Esegui l'upgrade per elaborare titoli/descrizioni.", "processing.actions.totalCredits": "Crediti totali ({count} in questa pagina):", - "processing.actions.starting": "Avvio…", + "processing.actions.starting": "Avvio…", "processing.actions.processCount": "Elabora {count} in questa pagina", "processing.actions.close": "Chiudi", "processing.actions.accept": "Accetta", @@ -3670,31 +3671,31 @@ export const it: MessageDict = { "processing.option.description": "Descrizioni (IA)", "processing.receipt.view": "Vedi in Elaborazione", "processing.receipt.undo": "Annulla", - "processing.receipt.format": "{succeeded} riusciti · {skipped} saltati · {failed} non riusciti", + "processing.receipt.format": "{succeeded} riusciti · {skipped} saltati · {failed} non riusciti", "processing.receipt.cancelledOne": "Elaborazione annullata", "processing.receipt.cancelledMany": "Job di elaborazione annullati", - "processing.receipt.cancelledDesc": "Il processo appena avviato è stato annullato.", + "processing.receipt.cancelledDesc": "Il processo appena avviato è stato annullato.", "processing.receipt.cancelFailed": "Impossibile annullare il processo", "unsubscribe.title": "Annulla iscrizione", "unsubscribe.me": "Annulla la mia iscrizione", "unsubscribe.invalidLink": "Link non valido", "unsubscribe.failedShort": "Annullamento iscrizione non riuscito", - "unsubscribe.already": "Sei già disiscritto.", + "unsubscribe.already": "Sei già disiscritto.", "unsubscribe.confirmPrompt": "Conferma sotto per annullare l'iscrizione alle email di marketing.", "unsubscribe.done": "Iscrizione annullata.", "stores.title": "Negozi e origini", - "stores.description": "Collega qualsiasi negozio o fornitore in un unico posto — Woo, Shopify, URL feed o CSV. Negozi live: prodotti Descrybe → negozio; ordini/recensioni negozio → Descrybe. Esporta quando il catalogo è pronto.", + "stores.description": "Collega qualsiasi negozio o fornitore in un unico posto — Woo, Shopify, URL feed o CSV. Negozi live: prodotti Descrybe → negozio; ordini/recensioni negozio → Descrybe. Esporta quando il catalogo è pronto.", "stores.allInputFeeds": "Tutti i feed di input", "stores.exportFeeds": "Feed di esportazione", - "stores.migrationNote": "Dopo una migrazione della piattaforma Descrybe, le credenziali WooCommerce e Shopify potrebbero dover essere reinserite: è una riconnessione, non una sync rotta.", + "stores.migrationNote": "Dopo una migrazione della piattaforma Descrybe, le credenziali WooCommerce e Shopify potrebbero dover essere reinserite: è una riconnessione, non una sync rotta.", "stores.docsPrefix": "Docs:", "stores.docsApiOverview": "Panoramica API", - "stores.docsSuffix": "per l’accesso pubblico ai prodotti; usa WooCommerce o Shopify qui sotto per la sync live del negozio.", + "stores.docsSuffix": "per l’accesso pubblico ai prodotti; usa WooCommerce o Shopify qui sotto per la sync live del negozio.", "stores.connectorsHeading": "Connettori negozio e catalogo", "stores.statusAria": "Status: {label}", "stores.ctaAria": "{cta}: {title}", "stores.startTitle": "Da dove inizio?", - "stores.startBody": "Negozio Woo → WooCommerce. Shopify o un’altra piattaforma → URL feed o caricamento CSV. Pronto per Merchant Center o partner → Feed di export (preset Google Shopping o campi personalizzati). Dopo una migrazione, ricollega Woo/Shopify prima di aspettarti che la sync funzioni.", + "stores.startBody": "Negozio Woo → WooCommerce. Shopify o un’altra piattaforma → URL feed o caricamento CSV. Pronto per Merchant Center o partner → Feed di export (preset Google Shopping o campi personalizzati). Dopo una migrazione, ricollega Woo/Shopify prima di aspettarti che la sync funzioni.", "stores.startBodyMember": "Chiedi a un admin di collegare WooCommerce o Shopify. Puoi comunque aprire i negozi collegati per sync e navigazione, e usare Feed URL, CSV o export feed in base al piano.", "stores.wizard.title": "Configurazione guidata negozio", "stores.wizard.description": "Collega un negozio, testa la connessione, metti in coda la prima sync prodotti e hai finito.", @@ -3702,7 +3703,7 @@ export const it: MessageDict = { "stores.wizard.guidedSetupAria": "Avvia configurazione guidata negozio", "stores.wizard.adminOnly": "Solo gli admin azienda possono eseguire la configurazione guidata (salva credenziali e primo sync). Puoi comunque aprire i negozi collegati.", "stores.wizard.pickChannel": "Scegli un connettore", - "stores.wizard.pickChannelBody": "Scegli WooCommerce o Shopify. Completa collega → testa → prima sync sulla pagina del connettore, poi torna qui.", + "stores.wizard.pickChannelBody": "Scegli WooCommerce o Shopify. Completa collega → testa → prima sync sulla pagina del connettore, poi torna qui.", "stores.wizard.channel.shopify": "Shopify", "stores.wizard.channel.woocommerce": "WooCommerce", "stores.wizard.channelLabel": "Configurazione: {channel}", @@ -3717,23 +3718,23 @@ export const it: MessageDict = { "stores.wizard.step.sync.title": "Prima sincronizzazione", "stores.wizard.step.sync.body": "Metti in coda la prima sync prodotti (abilita sync se serve).", "stores.wizard.step.done.title": "Fatto", - "stores.wizard.step.done.body": "Il negozio è collegato e una sync è avviata o completata.", + "stores.wizard.step.done.body": "Il negozio è collegato e una sync è avviata o completata.", "stores.wizard.openConnector": "Apri connettore", "stores.wizard.viewProducts": "Vedi prodotti", "stores.wizard.backToHub": "Torna ai negozi", "stores.wizard.banner.generic": "Configurazione guidata: completa questo passo, poi torna alla procedura.", - "stores.wizard.banner.test": "Configurazione guidata — testa la connessione, poi torna alla procedura.", - "stores.wizard.banner.sync": "Configurazione guidata — metti in coda la prima sync prodotti, poi torna alla procedura.", + "stores.wizard.banner.test": "Configurazione guidata — testa la connessione, poi torna alla procedura.", + "stores.wizard.banner.sync": "Configurazione guidata — metti in coda la prima sync prodotti, poi torna alla procedura.", "stores.wizard.banner.return": "Torna alla procedura", "stores.wizard.banner.dismiss": "Chiudi", "stores.woo.title": "WooCommerce", - "stores.woo.description": "Invia prodotti Descrybe → WooCommerce. Importa ordini e recensioni WooCommerce → Descrybe.", + "stores.woo.description": "Invia prodotti Descrybe → WooCommerce. Importa ordini e recensioni WooCommerce → Descrybe.", "stores.woo.ctaReconnect": "Ricollega Woo", "stores.woo.ctaOpen": "Apri Woo", "stores.woo.ctaConnect": "Collega Woo", "stores.woo.ctaView": "Vedi Woo", "stores.shopify.title": "Shopify", - "stores.shopify.description": "Invia prodotti Descrybe → Shopify. Importa ordini Shopify → Descrybe. Le recensioni non sono disponibili tramite Admin API di Shopify.", + "stores.shopify.description": "Invia prodotti Descrybe → Shopify. Importa ordini Shopify → Descrybe. Le recensioni non sono disponibili tramite Admin API di Shopify.", "stores.shopify.ctaReconnect": "Ricollega Shopify", "stores.shopify.ctaOpen": "Apri Shopify", "stores.shopify.ctaConnect": "Collega Shopify", @@ -3742,14 +3743,14 @@ export const it: MessageDict = { "stores.feedUrl.description": "Pull any supplier or negozio catalog from a public CSV or XML URL on a schedule. Map fields, then sync.", "stores.feedUrl.cta": "Aggiungi URL feed", "stores.csv.title": "Caricamento CSV", - "stores.csv.description": "Carica un CSV prodotti come feed di input. Ideale per file fornitore una tantum o export dall’admin Shopify.", + "stores.csv.description": "Carica un CSV prodotti come feed di input. Ideale per file fornitore una tantum o export dall’admin Shopify.", "stores.csv.cta": "Carica CSV", "stores.export.title": "Export / REST", "stores.export.description": "Pubblica Google Shopping o CSV/XML personalizzati con URL pubblica. Oppure recupera prodotti con chiave API (/api/v1).", "stores.export.cta": "Apri esportazioni", "stores.apiKeys.title": "Chiavi API", - "stores.apiKeys.description": "Le chiavi API legacy non sono state migrate. Crea una nuova chiave in Impostazioni per ripristinare l’accesso a /api/v1 — il secret viene mostrato una sola volta.", - "stores.apiKeys.descriptionMember": "Chiavi API aziendali per /api/v1. Le chiavi legacy non sono state migrate — solo gli admin possono creare o revocare; i prefissi sono in Impostazioni.", + "stores.apiKeys.description": "Le chiavi API legacy non sono state migrate. Crea una nuova chiave in Impostazioni per ripristinare l’accesso a /api/v1 — il secret viene mostrato una sola volta.", + "stores.apiKeys.descriptionMember": "Chiavi API aziendali per /api/v1. Le chiavi legacy non sono state migrate — solo gli admin possono creare o revocare; i prefissi sono in Impostazioni.", "stores.apiKeys.cta": "Gestisci chiavi API", "stores.apiKeys.ctaView": "Vedi chiavi API", "stores.status.needsReconnect": "Richiede riconnessione", @@ -3784,9 +3785,9 @@ export const it: MessageDict = { "store.testing": "Test in corso...", "store.testConnection": "Testa connessione", "store.queueing": "In coda...", - "store.queueProductPush": "Metti in coda invio prodotti (Descrybe → negozio)", - "store.queueFirstProductSync": "Metti in coda il primo invio prodotti (Descrybe → negozio)", - "store.queueOrdersImport": "Metti in coda import ordini (negozio → Descrybe)", + "store.queueProductPush": "Metti in coda invio prodotti (Descrybe → negozio)", + "store.queueFirstProductSync": "Metti in coda il primo invio prodotti (Descrybe → negozio)", + "store.queueOrdersImport": "Metti in coda import ordini (negozio → Descrybe)", "store.refreshList": "Aggiorna elenco", "store.saveBeforeTest": "Salva le credenziali prima di testare", "store.saveTestBeforeQueue": "Salva le credenziali e testa la connessione prima di sincronizzare", @@ -3803,33 +3804,33 @@ export const it: MessageDict = { "store.col.status": "Stato", "store.col.total": "Total", "store.col.date": "Data", - "store.loadingOrders": "Caricamento ordini…", + "store.loadingOrders": "Caricamento ordini…", "store.loadingOrdersDot": "Caricamento ordini.", "flash.store.saveFailed": "Impossibile salvare le impostazioni", "flash.store.queueSyncFailed": "Impossibile accodare la sincronizzazione", "flash.store.queueOrdersFailed": "Impossibile accodare la sincronizzazione ordini", "flash.store.connectedTo": "Connesso a {name}.", "flash.shopify.loadFailed": "Caricamento config Shopify non riuscito", - "flash.shopify.productSyncQueued": "Sincronizzazione prodotti in coda. Il worker la eseguirà a breve.", - "flash.shopify.ordersSyncQueued": "Sincronizzazione ordini in coda. Il worker la eseguirà a breve.", + "flash.shopify.productSyncQueued": "Sincronizzazione prodotti in coda. Il worker la eseguirà a breve.", + "flash.shopify.ordersSyncQueued": "Sincronizzazione ordini in coda. Il worker la eseguirà a breve.", "flash.woo.loadFailed": "Caricamento config WooCommerce non riuscito", - "flash.woo.productSyncQueued": "Sincronizzazione prodotti in coda. Partirà a breve.", - "flash.woo.ordersSyncQueued": "Sincronizzazione ordini in coda. Partirà a breve.", - "flash.woo.reviewsSyncQueued": "Sincronizzazione recensioni in coda. Partirà a breve.", + "flash.woo.productSyncQueued": "Sincronizzazione prodotti in coda. Partirà a breve.", + "flash.woo.ordersSyncQueued": "Sincronizzazione ordini in coda. Partirà a breve.", + "flash.woo.reviewsSyncQueued": "Sincronizzazione recensioni in coda. Partirà a breve.", "flash.woo.queueReviewsFailed": "Impossibile accodare la sincronizzazione recensioni", "flash.woo.remoteMapsFailed": "Caricamento map remote non riuscito", "flash.woo.syncSettingsFailed": "Impossibile salvare le impostazioni di sincronizzazione", "flash.woo.categoryAutoMapFailed": "Auto-mappatura categorie non riuscita", "flash.woo.attributeAutoMapFailed": "Auto-mappatura attributi non riuscita", "shopify.title": "Integrazione Shopify", - "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", + "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", "shopify.adminOnly": "Only azienda admins can change Shopify connection impostazioni. Sincronizza and browse stay disponibile.", "shopify.lockedTitle": "Connessione Shopify bloccata", "shopify.noCredentialsMember": "Nessuna credenziale Shopify ancora presente. Chiedi a un amministratore aziendale di collegare il negozio. Sync e consultazione ordini restano disponibili dopo salvataggio e test di connessione.", "shopify.enterToken": "Inserisci le credenziali", "shopify.noCredentials": "Nessuna credenziale Shopify. Inserisci il dominio *.myshopify.com e Client ID + secret del Dev Dashboard (o un token Admin API legacy), poi Salva e Testa connessione. Dopo una migrazione di piattaforma i vecchi secret non vengono trasferiti: riconnetti con un token nuovo.", "shopify.allConnectors": "Tutti i connettori negozio", - "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", + "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", "shopify.setup.oauthNote": "Still manual: create/install the app in Shopify and paste Client ID + secret here. Descrybe does not host a one-click App Store install. Legacy permanent shpat_ tokens from older Admin custom apps still work.", "shopify.setup.scopesTitle": "Scope Admin API richiesti", "shopify.setup.scopesIntro": "Add these scopes on the app version in the Dev Dashboard before you release and install:", @@ -3841,47 +3842,47 @@ export const it: MessageDict = { "shopify.setup.step5.clientId": "Client ID", "shopify.setup.step5.and": "and", "shopify.setup.step5.clientSecret": "Client secret", - "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", + "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", "shopify.setup.step5.save": "Save", - "shopify.setup.step5.arrow": "→", + "shopify.setup.step5.arrow": "→", "shopify.setup.step5.test": "Test Connection", "shopify.setup.step5.after": ". Descrybe stores secrets encrypted and refreshes the short-lived access token automatically.", "shopify.setup.step6.products": "Products", - "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", + "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", "shopify.setup.step6.orders": "Orders", - "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", + "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", "shopify.setup.step7.before": "No live shop yet? Enable", "shopify.setup.step7.dryRun": "Dry run", "shopify.setup.step7.after": "(or use the special dry-run access token) to walk through the flow without calling Shopify.", "shopify.setup.openDevDashboard": "Open Dev Dashboard", "shopify.setup.openDevelopApps": "Open shop Develop apps", "shopify.setup.openDevelopAppsNeedDomain": "Enter your shop domain below to unlock a direct Admin link for this store.", - "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", + "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", "shopify.setup.copyScopes": "Copy required scopes", "shopify.setup.scopesCopied": "Scopes copied", "shopify.setup.docsCreate": "Create app docs", "shopify.setup.docsTokens": "Access token docs", - "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", + "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", "shopify.setup.hideLegacyToken": "Hide legacy token field", - "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", + "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", "shopify.field.clientId": "Client ID", "shopify.field.clientSecret": "Client secret", - "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", + "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", "shopify.field.accessTokenHelp": "Only for custom apps created in Shopify Admin before January 2026. New apps should use Client ID + secret instead.", "shopify.placeholder.clientId": "Client ID from Dev Dashboard", - "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", + "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", "shopify.placeholder.clientSecret": "Client secret", - "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", + "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", "shopify.setup.scope.write_products": "write_products", "shopify.setup.scope.write_productsWhy": "Creare e aggiornare prodotti in Shopify (push in uscita)", "shopify.setup.scope.read_products": "read_products", - "shopify.setup.scope.read_productsWhy": "Trovare prodotti esistenti tramite SKU prima dell’aggiornamento", + "shopify.setup.scope.read_productsWhy": "Trovare prodotti esistenti tramite SKU prima dell’aggiornamento", "shopify.setup.scope.read_orders": "read_orders", "shopify.setup.scope.read_ordersWhy": "Importare ordini in Descrybe (in ingresso)", - "shopify.setup.step1": "Se hai collegato Shopify prima di una migrazione di piattaforma: crea una nuova app Dev Dashboard (o riconnetti con un token legacy nuovo) — i secret salvati non vengono trasferiti.", + "shopify.setup.step1": "Se hai collegato Shopify prima di una migrazione di piattaforma: crea una nuova app Dev Dashboard (o riconnetti con un token legacy nuovo) — i secret salvati non vengono trasferiti.", "shopify.setup.step2.before": "Open the", "shopify.setup.step2.path": "Shopify Dev Dashboard", - "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", + "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", "shopify.setup.step3.before": "Create a version: set App URL (default home is fine for API-only), add scopes", "shopify.setup.step3.after": ".", "shopify.setup.step4.before": "From the app Home tab,", @@ -3889,7 +3890,7 @@ export const it: MessageDict = { "shopify.testSectionTitle": "Verifica connessione", "shopify.testHint": "Salva prima il dominio negozio e il token, poi esegui Verifica connessione. Un test riuscito conferma token e scope prima di mettere in coda la sync.", "shopify.overwriteTitle": "Sovrascrivere i prodotti Shopify?", - "shopify.overwriteBodyCount": "Questo mette in coda un push prodotti in uscita. {count} prodotto/i Shopify già collegati possono essere aggiornati con il contenuto Descrybe.", + "shopify.overwriteBodyCount": "Questo mette in coda un push prodotti in uscita. {count} prodotto/i Shopify già collegati possono essere aggiornati con il contenuto Descrybe.", "shopify.overwriteBody": "Questo mette in coda un push prodotti in uscita. I prodotti Shopify corrispondenti possono essere aggiornati con il contenuto Descrybe.", "shopify.credentialsTitle": "Credenziali del negozio", "shopify.credentialsDesc.before": "Il dominio negozio deve essere il tuo", @@ -3899,65 +3900,65 @@ export const it: MessageDict = { "shopify.field.accessToken": "Token di accesso Admin API", "shopify.field.apiVersion": "Versione API", "shopify.placeholder.tokenKeep": "******** (lascia vuoto per mantenere)", - "shopify.enableSync": "Abilita invio prodotti (Descrybe → Shopify)", + "shopify.enableSync": "Abilita invio prodotti (Descrybe → Shopify)", "shopify.dryRunLabel": "Dry run (nessuna chiamata Shopify live)", - "shopify.ordersTitle": "Import ordini (Shopify → Descrybe)", - "shopify.ordersDesc": "Shopify → Descrybe — importa ordini e righe in Descrybe (non scrive su Shopify).", - "shopify.ordersNeedsReconnect": "L’import ordini non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", + "shopify.ordersTitle": "Import ordini (Shopify → Descrybe)", + "shopify.ordersDesc": "Shopify → Descrybe — importa ordini e righe in Descrybe (non scrive su Shopify).", + "shopify.ordersNeedsReconnect": "L’import ordini non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", "shopify.notesTitle": "Note", "shopify.notesDesc": "Shopify connector capabilities", - "shopify.notes.productsLabel": "Prodotti (Descrybe → Shopify)", - "shopify.notes.productsBody": "— i prodotti Descrybe elaborati vengono creati o aggiornati in Shopify (match SKU via GraphQL se non c’è id prodotto Shopify in cache). Una re-sync può sovrascrivere i campi remoti corrispondenti.", - "shopify.notes.ordersLabel": "Ordini (Shopify → Descrybe)", - "shopify.notes.ordersBody": "— pulled for reporting and future audience workflows.", + "shopify.notes.productsLabel": "Prodotti (Descrybe → Shopify)", + "shopify.notes.productsBody": "— i prodotti Descrybe elaborati vengono creati o aggiornati in Shopify (match SKU via GraphQL se non c’è id prodotto Shopify in cache). Una re-sync può sovrascrivere i campi remoti corrispondenti.", + "shopify.notes.ordersLabel": "Ordini (Shopify → Descrybe)", + "shopify.notes.ordersBody": "— pulled for reporting and future audience workflows.", "shopify.notes.reviewsLabel": "Recensioni", "shopify.notes.reviewsBody": "-- not supportoed. Shopify has no first-party prodotto reviews Admin API (third-party review apps are out of scope here).", "shopify.notes.encryption.before": "Token are encrypted at rest with", "woo.title": "Integrazione WooCommerce", - "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", + "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", "woo.allStores": "Tutti i negozi", - "woo.adminOnly": "Solo gli admin dell’azienda possono modificare connessione e mappatura WooCommerce. Sync e navigazione restano disponibili.", + "woo.adminOnly": "Solo gli admin dell’azienda possono modificare connessione e mappatura WooCommerce. Sync e navigazione restano disponibili.", "woo.enterCredentials": "Inserisci le credenziali", - "woo.noCredentials": "Nessuna credenziale WooCommerce. Inserisci l’URL del negozio, crea una chiave REST API Read/Write in WordPress, incolla Consumer Key e Secret, poi Salva e Testa connessione. Dopo una migrazione di piattaforma i vecchi secret non vengono trasferiti: riconnetti con una chiave nuova.", + "woo.noCredentials": "Nessuna credenziale WooCommerce. Inserisci l’URL del negozio, crea una chiave REST API Read/Write in WordPress, incolla Consumer Key e Secret, poi Salva e Testa connessione. Dopo una migrazione di piattaforma i vecchi secret non vengono trasferiti: riconnetti con una chiave nuova.", "woo.lockedTitle": "Connessione WooCommerce bloccata", "woo.noCredentialsMember": "Nessuna credenziale WooCommerce ancora presente. Chiedi a un amministratore aziendale di collegare il negozio. Sync, ordini e recensioni restano disponibili dopo salvataggio e test di connessione.", "woo.setupDesc": "Follow these steps to create a WooCommerce REST API key in WordPress and connect it here. Descrybe never creates keys on your store for you.", - "woo.setup.step1": "Se hai collegato WooCommerce prima di una migrazione di piattaforma: crea una nuova chiave REST API — le credenziali salvate non sono utilizzabili.", + "woo.setup.step1": "Se hai collegato WooCommerce prima di una migrazione di piattaforma: crea una nuova chiave REST API — le credenziali salvate non sono utilizzabili.", "woo.setup.step2.before": "Enter your store", "woo.setup.step2.path": "HTTPS URL", "woo.setup.step2.after": "in the form below (example: https://yourstore.com).", "woo.setup.step3.before": "In WordPress admin, open", - "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", + "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", "woo.setup.step3.after": "(or use the deep link once your store URL is filled in).", "woo.setup.step4.before": "Click", "woo.setup.step4.addKey": "Add key", "woo.setup.step4.mid": ", set permissions to", "woo.setup.step4.permissions": "Read/Write", - "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", + "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", "woo.setup.step5.before": "Paste the key and secret below, enable sync if ready, then", "woo.setup.step5.save": "Save", - "woo.setup.step5.arrow": "→", + "woo.setup.step5.arrow": "→", "woo.setup.step5.test": "Test Connection", "woo.setup.step5.after": ".", "woo.setup.step6.products": "Products", - "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", + "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", "woo.setup.step6.orders": "Orders", "woo.setup.step6.and": "and", "woo.setup.step6.reviews": "reviews", - "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", + "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", "woo.setup.openKeys": "Apri chiavi REST API", "woo.setup.addKey": "Aggiungi chiave", - "woo.setup.openKeysHint": "Apre WordPress admin → WooCommerce → Impostazioni → Avanzate → REST API.", + "woo.setup.openKeysHint": "Apre WordPress admin → WooCommerce → Impostazioni → Avanzate → REST API.", "woo.setup.openKeysNeedUrl": "Salva prima un URL negozio valido per aprire i link admin.", "woo.setup.docsLink": "Documentazione REST API WooCommerce", "woo.overwriteTitle": "Sovrascrivere i prodotti WooCommerce?", - "woo.overwriteBodyCount": "Questo mette in coda un push prodotti in uscita. {count} prodotto/i WooCommerce già collegati possono essere aggiornati con il contenuto Descrybe.", + "woo.overwriteBodyCount": "Questo mette in coda un push prodotti in uscita. {count} prodotto/i WooCommerce già collegati possono essere aggiornati con il contenuto Descrybe.", "woo.overwriteBody": "Questo mette in coda un push prodotti in uscita. I prodotti WooCommerce corrispondenti possono essere aggiornati con il contenuto Descrybe.", "woo.connectionTitle": "Store connection", "woo.connectionDesc": "Paste your store URL and a Read/Write REST API key pair. Save, then Test Connection before queuing syncs.", - "woo.enableSync": "Abilita invio prodotti (Descrybe → WooCommerce)", + "woo.enableSync": "Abilita invio prodotti (Descrybe → WooCommerce)", "woo.field.storeUrl": "URL del negozio", - "woo.field.storeUrlHelp": "URL pubblico del sito con https. Per la REST API WooCommerce e i deep link all’admin WordPress.", + "woo.field.storeUrlHelp": "URL pubblico del sito con https. Per la REST API WooCommerce e i deep link all’admin WordPress.", "woo.field.consumerKey": "Consumer Key", "woo.field.consumerSecret": "Consumer Secret", "woo.field.credentialsHelp": "Consumer Key e Secret con lettura/scrittura. Lascia vuoto per mantenere le credenziali esistenti.", @@ -3977,13 +3978,13 @@ export const it: MessageDict = { "woo.refreshAttributes": "Aggiorna attributi", "woo.availableAttributes": "Attributi WooCommerce disponibili", "woo.attributesEmptyHint": "Testa la connessione, poi aggiorna per caricare gli attributi WooCommerce.", - "woo.ordersTitle": "Import ordini (WooCommerce → Descrybe)", - "woo.ordersDesc": "WooCommerce → Descrybe — importa ordini e righe in Descrybe (non scrive sul negozio).", - "woo.ordersNeedsReconnect": "L’import ordini non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", + "woo.ordersTitle": "Import ordini (WooCommerce → Descrybe)", + "woo.ordersDesc": "WooCommerce → Descrybe — importa ordini e righe in Descrybe (non scrive sul negozio).", + "woo.ordersNeedsReconnect": "L’import ordini non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", "woo.syncSettingsTitle": "Impostazioni sync", - "woo.syncSettingsDesc": "Configura come i prodotti vengono inviati Descrybe → WooCommerce", + "woo.syncSettingsDesc": "Configura come i prodotti vengono inviati Descrybe → WooCommerce", "woo.matchStrategy": "Prodotto Matching Strategy", - "woo.matchStrategyHelp": "L’invio prodotti (Descrybe → WooCommerce) abbina prodotti remoti per SKU o EAN/GTIN. Metti in coda dalla scheda Connessione (manuale).", + "woo.matchStrategyHelp": "L’invio prodotti (Descrybe → WooCommerce) abbina prodotti remoti per SKU o EAN/GTIN. Metti in coda dalla scheda Connessione (manuale).", "woo.lastSyncLabel": "Ultima sync", "woo.saveSyncSettings": "Salva impostazioni sync", "woo.match.sku": "SKU", @@ -3999,7 +4000,7 @@ export const it: MessageDict = { "plan.feature.section.billing": "Fatturazione", "plan.feature.section.settings": "Impostazioni", "plan.feature.section.support": "Supporto", - "plan.feature.section.capabilities": "Funzionalità", + "plan.feature.section.capabilities": "Funzionalità", "plan.feature.shell.navigation": "Navigazione laterale", "plan.feature.shell.command_palette": "Tavolozza comandi", "plan.feature.shell.company_switcher": "Selettore azienda", @@ -4109,7 +4110,7 @@ export const it: MessageDict = { "plan.feature.capability.byok": "Porta la tua chiave IA", "billing.plan.free": "Gratuito", "products.actions.selectAll": "Seleziona tutto", - "products.actions.upgradeSuffix": " · upgrade", + "products.actions.upgradeSuffix": " · upgrade", "products.actions.upgradeRequired": "{label} (upgrade richiesto)", "products.actions.free": "gratis", "products.actions.credits": "{credits} crediti", @@ -4121,9 +4122,9 @@ export const it: MessageDict = { "products.actions.resetUnprocessed": "Reimposta a non elaborato", "products.actions.export": "Esporta", "products.upload.dropHint": "Trascina un CSV qui o fai clic per sfogliare", - "products.upload.supportsHint": "Supporta import prodotti .csv (ean, name, category…)", + "products.upload.supportsHint": "Supporta import prodotti .csv (ean, name, category…)", "products.export.chooseConfig": "Esporta {count} prodotto/i selezionato/i. Scegli il feed di esportazione che definisce formato e campi.", - "products.export.selectPlaceholder": "Seleziona un feed di esportazione…", + "products.export.selectPlaceholder": "Seleziona un feed di esportazione…", "fields.typeLabel": "Tipo", "fields.groupLabel": "Gruppo", "fields.selectGroup": "Seleziona un gruppo", @@ -4132,7 +4133,7 @@ export const it: MessageDict = { "fields.enableRecommended": "Abilita consigliati", "feeds.activated": "Feed attivato.", "feeds.deactivated": "Feed disattivato.", - "feeds.syncTimeout": "Sincronizza timed out waiting for the server. The job may still finish — open Sincronizza History to check status.", + "feeds.syncTimeout": "Sincronizza timed out waiting for the server. The job may still finish — open Sincronizza History to check status.", "feeds.createdMapHint": "Feed creato. Mappa i campi prima di sincronizzare.", "feeds.createdPlain": "Feed creato.", "feeds.createdMapDesc": "Mappa le colonne di origine ai campi prodotto, poi sincronizza.", @@ -4152,30 +4153,30 @@ export const it: MessageDict = { "products.filters.titleChanged": "Titolo modificato", "products.filters.newFromFeed": "Nuovo dal feed", "products.filters.otherFieldChange": "Altra modifica di campo", - "products.filters.sortUpdatedNewest": "Aggiornato (più recente)", - "products.filters.sortUpdatedOldest": "Aggiornato (più vecchio)", + "products.filters.sortUpdatedNewest": "Aggiornato (più recente)", + "products.filters.sortUpdatedOldest": "Aggiornato (più vecchio)", "products.filters.sortNameAsc": "Nome (A-Z)", "products.filters.sortNameDesc": "Nome (Z-A)", "products.filters.searchPlaceholder": "Cerca prodotti...", "products.filters.searchCategories": "Cerca categorie...", "products.filters.selectFeed": "Seleziona feed", - "products.filters.loadingFeeds": "Caricamento feed…", + "products.filters.loadingFeeds": "Caricamento feed…", "products.table.loading": "Caricamento prodotti", "products.table.uncategorized": "Senza categoria", "products.table.assignCategory": "Assegna categoria", "products.table.changeCategory": "Cambia categoria per {name}", - "products.table.selectCategory": "Seleziona categoria…", + "products.table.selectCategory": "Seleziona categoria…", "products.table.saveCategory": "Salva categoria", "products.table.cancelCategory": "Annulla modifica categoria", "products.table.categoryRequired": "Scegli una categoria", - "products.table.noCategoriesAvailable": "Nessuna categoria ancora — creane una in Catalogo", - "products.table.qualityUnavailable": "Qualità non disponibile", + "products.table.noCategoriesAvailable": "Nessuna categoria ancora — creane una in Catalogo", + "products.table.qualityUnavailable": "Qualità non disponibile", "products.table.full": "Pieno", "products.table.empty": "Vuoto", "products.table.saveName": "Salva nome", "products.table.cancelRename": "Annulla rinomina", "products.table.noSyncYet": "Nessuna sync ancora", - "products.feedSync.feedAndWhen": "{feed} · {when}", + "products.feedSync.feedAndWhen": "{feed} · {when}", "products.feedSync.syncedWhen": "Sincronizzato {when}", "products.table.productOptions": "Opzioni prodotto", "products.edit.details": "Dettagli prodotto", @@ -4183,24 +4184,24 @@ export const it: MessageDict = { "products.edit.specsPresent": "Le specifiche tecniche sono presenti su questo prodotto.", "products.edit.noEnrichedName": "Nessun nome arricchito", "products.edit.resetName": "Ripristina il nome arricchito all'originale", - "products.edit.cannotClearName": "L'originale è vuoto — impossibile cancellare il nome arricchito via PATCH", + "products.edit.cannotClearName": "L'originale è vuoto — impossibile cancellare il nome arricchito via PATCH", "products.edit.showPreview": "Mostra anteprima", "products.edit.editHtml": "Modifica HTML", "products.edit.noEnrichedDescription": "Nessuna descrizione arricchita", "products.edit.resetDescription": "Ripristina la descrizione arricchita all'originale", - "products.edit.cannotClearDescription": "L’originale è vuoto — impossibile cancellare la descrizione arricchita via PATCH", + "products.edit.cannotClearDescription": "L’originale è vuoto — impossibile cancellare la descrizione arricchita via PATCH", "products.edit.unknownFeed": "Feed sconosciuto", "products.edit.noProcessedName": "Nessun nome elaborato disponibile", - "products.edit.feedNamed": "Feed · {name}", + "products.edit.feedNamed": "Feed · {name}", "products.edit.noAiDescription": "Nessuna descrizione IA", "products.edit.sourceLabel": "Etichetta origine", "products.edit.coverageTitle": "Quanti tra Nome, Descrizione, Attributi e Categoria sono presenti (feed o elaborati).", "products.edit.coverageReady": "{count}/4 pronti", - "products.edit.eprelPresentTitle": "L'id European Product Registry for Energy Labelling (EPREL) è presente su questo prodotto.", + "products.edit.eprelPresentTitle": "L'id European Product Registry for Energy Labelling (EPREL) è presente su questo prodotto.", "products.edit.noEprelBadge": "Nessun EPREL", "products.edit.specsBadge": "Specifiche", "products.edit.reviewBannerTitle": "Rivedi i campi arricchiti prima di accettare", - "products.edit.reviewBannerHelp": "Usa la scheda Revisione per confrontare originali e IA. Scorciatoie: A accetta · R rifiuta · Alt+1/2 campo · ⌘/Ctrl+Invio accetta tutto.", + "products.edit.reviewBannerHelp": "Usa la scheda Revisione per confrontare originali e IA. Scorciatoie: A accetta · R rifiuta · Alt+1/2 campo · ⌘/Ctrl+Invio accetta tutto.", "products.edit.tab.review": "Rivedi", "products.edit.tab.details": "Dettagli", "products.edit.tab.content": "Contenuto", @@ -4215,20 +4216,20 @@ export const it: MessageDict = { "products.edit.discardDescription": "Scarta descrizione", "products.edit.acceptDescription": "Accetta descrizione", "products.edit.noCategory": "No Categoria", - "products.edit.whatsFilledIn": "Cosa è compilato", - "products.edit.coverageLegend": "Grigio = mancante · Arancio = dal feed · Verde = elaborato", + "products.edit.whatsFilledIn": "Cosa è compilato", + "products.edit.coverageLegend": "Grigio = mancante · Arancio = dal feed · Verde = elaborato", "products.edit.feedSource": "Origine feed", - "products.edit.updatedRelative": "· aggiornato {when}", + "products.edit.updatedRelative": "· aggiornato {when}", "products.edit.viewAllFeedFields": "Vedi all feed fields ({filled}/{total})", "products.edit.productIdentity": "Prodotto identity", - "products.edit.aiProcessedName": "Nome elaborato dall’IA", + "products.edit.aiProcessedName": "Nome elaborato dall’IA", "products.edit.originalName": "Nome originale", "products.edit.productIdSku": "Prodotto ID / SKU", "products.edit.rowUpdated": "Riga prodotto aggiornata {when}", "products.edit.noRawUpdateTime": "No raw prodotto update time", - "products.edit.feedSyncLabel": "· sync feed {when}", + "products.edit.feedSyncLabel": "· sync feed {when}", "products.edit.neverRecorded": "mai registrato", - "products.edit.feedFilledCount": "{filled} compilati · {total} campi", + "products.edit.feedFilledCount": "{filled} compilati · {total} campi", "products.edit.noMappedFeedFields": "No mapped feed fields on this prodotto.", "products.edit.fieldCol": "Campo", "products.edit.valueFromFeed": "Valore from feed", @@ -4250,12 +4251,12 @@ export const it: MessageDict = { "products.edit.noEditableAttrs": "Nessun attributo modificabile. Aggiungi una coppia chiave/valore.", "products.edit.reject": "Rifiuta", "products.edit.accept": "Accetta", - "taskIndicator.title": "Attività in background", + "taskIndicator.title": "Attività in background", "taskIndicator.activeOne": "1 lavoro in corso", "taskIndicator.activeMany": "{count} lavori in corso", "taskIndicator.view": "Vedi avanzamento", - "taskIndicator.expand": "Espandi elenco attività", - "taskIndicator.collapse": "Comprimi elenco attività", + "taskIndicator.expand": "Espandi elenco attività", + "taskIndicator.collapse": "Comprimi elenco attività", "taskIndicator.progressAria": "Avanzamento lavoro {pct} percento", "taskIndicator.progressCounts": "{done} di {total} prodotti", "attributes.assignBulk": "Assegna alle categorie", @@ -4264,13 +4265,13 @@ export const it: MessageDict = { "products.filters.sortLabel": "Ordina: {label}", "products.table.colIdName": "ID/Nome", "products.table.colCoverage": "Copertura", - "products.table.coverageTitle": "Copertura: N=Nome, D=Descrizione, A=Attributi, C=Categoria. Grigio=mancante, arancione=dal feed, verde=elaborato. EPREL mostra l’id del registro dell’etichetta energetica.", + "products.table.coverageTitle": "Copertura: N=Nome, D=Descrizione, A=Attributi, C=Categoria. Grigio=mancante, arancione=dal feed, verde=elaborato. EPREL mostra l’id del registro dell’etichetta energetica.", "products.table.colFeed": "Feed", "products.table.colCategory": "Categoria", "products.table.colStatus": "Stato", "products.table.colUpdated": "Ultimo aggiornamento", "products.table.colActions": "Azioni", - "products.table.loadingDots": "Caricamento prodotti…", + "products.table.loadingDots": "Caricamento prodotti…", "products.table.noneFound": "Nessun prodotti trovato.", "products.table.selectProduct": "Seleziona prodotto {name}", "products.table.rename": "Rinomina {name}", @@ -4293,7 +4294,7 @@ export const it: MessageDict = { "categories.preview.structureTab": "Struttura formula", "categories.preview.noElements": "Nessun elemento aggiunto ancora", "categories.brandTips.title": "Suggerimenti legati al brand", - "categories.brandTips.freePlan": "Il brand kit è modificabile sul piano Free; l’applicazione IA si sblocca nei piani a pagamento.", + "categories.brandTips.freePlan": "Il brand kit è modificabile sul piano Free; l’applicazione IA si sblocca nei piani a pagamento.", "categories.brandTips.editBrandKit": "Modifica brand kit", "categories.brandTips.emptyBefore": "Aggiungi voce o termini preferiti in ", "categories.brandTips.emptyAfter": " per vedere suggerimenti qui.", @@ -4317,7 +4318,7 @@ export const it: MessageDict = { "categories.variableNameKey": "Nome (chiave)", "categories.displayName": "Nome visualizzato", "categories.exampleValue": "Valore di esempio", - "categories.variableExists": "Esiste già una variabile con il nome \"{name}\".", + "categories.variableExists": "Esiste già una variabile con il nome \"{name}\".", "categories.addVariable": "Aggiungi variabile", "categories.updateVariable": "Aggiorna variabile", "categories.col.displayName": "Nome visualizzato", @@ -4327,41 +4328,41 @@ export const it: MessageDict = { "categories.noVariablesFound": "Nessuna variabile trovata", "categories.availableVariables": "Variabili disponibili", "categories.manage": "Gestisci", - "categories.noVariablesMatch": "Nessuna variabile corrisponde a “{query}”.", + "categories.noVariablesMatch": "Nessuna variabile corrisponde a “{query}”.", "categories.noUnusedVariables": "Non restano variabili inutilizzate. Aggiungi una variabile personalizzata o rimuovi un elemento per liberarne una.", "categories.exampleColon": "Esempio: {value}", "categories.editVariableAria": "Modifica {label}", "categories.deleteVariableAria": "Elimina {label}", "categories.addVariableAria": "Aggiungi {label}", "categories.textLabel": "Testo", - "categories.textAppearsAsWritten": "Questo testo apparirà esattamente come scritto nei titoli", + "categories.textAppearsAsWritten": "Questo testo apparirà esattamente come scritto nei titoli", "categories.addTextButton": "Aggiungi testo", "categories.updateTextButton": "Aggiorna testo", "categories.structureDescriptionsFor": "Struttura le descrizioni prodotto per {name}", "categories.metaInformation": "Informazioni meta", - "categories.metaInformationHelp": "Istruzioni usate dall’IA per i tag di titolo SEO e meta description.", + "categories.metaInformationHelp": "Istruzioni usate dall’IA per i tag di titolo SEO e meta description.", "categories.metaTitleFormula": "Formula meta title", - "categories.metaTitleHint": "Mostrato nei risultati di ricerca e nelle schede del browser (circa 50–60 caratteri).", + "categories.metaTitleHint": "Mostrato nei risultati di ricerca e nelle schede del browser (circa 50–60 caratteri).", "categories.metaDescriptionFormula": "Formula meta description", - "categories.metaDescriptionHint": "Mostrato sotto il titolo nei risultati di ricerca (circa 120–155 caratteri).", + "categories.metaDescriptionHint": "Mostrato sotto il titolo nei risultati di ricerca (circa 120–155 caratteri).", "categories.resetToDefault": "Ripristina predefinito", "categories.descriptionSections": "Sezioni descrizione", - "categories.descriptionSectionsHelp": "Trascina le sezioni per impostare l’ordine della descrizione generata.", + "categories.descriptionSectionsHelp": "Trascina le sezioni per impostare l’ordine della descrizione generata.", "categories.noSectionsYet": "Ancora nessuna sezione", "categories.addSectionsHint": "Aggiungi un titolo, un paragrafo o un elenco per iniziare.", "categories.aiInstructions": "Istruzioni IA", "categories.exportIdOptional": "ID esportazione (facoltativo)", - "categories.exportIdUnique": "L’ID di esportazione deve essere univoco", + "categories.exportIdUnique": "L’ID di esportazione deve essere univoco", "categories.addSection": "Aggiungi sezione", "categories.aboutDescriptionFormulas": "Informazioni sulle formule descrizione", - "categories.aboutDescriptionFormulasHelp": "Queste istruzioni dicono all’IA come scrivere le descrizioni dei prodotti in questa categoria.", + "categories.aboutDescriptionFormulasHelp": "Queste istruzioni dicono all’IA come scrivere le descrizioni dei prodotti in questa categoria.", "categories.sectionTypesHeading": "Tipi di sezione", - "categories.sectionTypeHeadings": "Titoli (H1–H4):", + "categories.sectionTypeHeadings": "Titoli (H1–H4):", "categories.sectionTypeHeadingsHelp": "Titoli e sottotitoli", "categories.sectionTypeParagraphs": "Paragrafi:", "categories.sectionTypeParagraphsHelp": "Blocchi di contenuto principali", "categories.sectionTypeLists": "Elenchi puntati:", - "categories.sectionTypeListsHelp": "Funzionalità e specifiche", + "categories.sectionTypeListsHelp": "Funzionalità e specifiche", "categories.aiInstructionsHeading": "Istruzioni IA", "categories.aiInstructionsBody": "Scrivi un obiettivo chiaro per sezione (cosa coprire, tono, lunghezza). Prompt vaghi producono testi vaghi.", "categories.exportIdsHeading": "ID di esportazione", @@ -4377,28 +4378,28 @@ export const it: MessageDict = { "categories.aiGenerationPrompt": "Prompt di generazione IA", "categories.aiPromptOverrides": "Sostituisce il prompt utente di miglioramento prodotto aziendale per {name}", "categories.promptTemplate": "Modello di prompt", - "categories.promptTemplateHelp": "Usa segnaposto come {{name}} e {{description}}. Lascia vuoto per usare il valore predefinito aziendale in Integrazioni → IA.", + "categories.promptTemplateHelp": "Usa segnaposto come {{name}} e {{description}}. Lascia vuoto per usare il valore predefinito aziendale in Integrazioni → IA.", "categories.clear": "Cancella", "categories.promptLabel": "Prompt", "categories.charactersCount": "{count} caratteri", - "categories.activeOverride": "· override attivo per questa categoria", - "categories.usingCompanyDefault": "· uso del valore predefinito aziendale / integrato", - "categories.usingCompanyDefaultForLang": "· vuoto per questa lingua — si applica il default aziendale / integrato", + "categories.activeOverride": "· override attivo per questa categoria", + "categories.usingCompanyDefault": "· uso del valore predefinito aziendale / integrato", + "categories.usingCompanyDefaultForLang": "· vuoto per questa lingua — si applica il default aziendale / integrato", "categories.aiPromptSavedLang": "Prompt IA salvato per {lang}.", "categories.aiPromptClearedLang": "Prompt IA cancellato per {lang} (si applica il default aziendale).", "contentLang.switcherLabel": "Lingua di contenuto", "contentLang.primary": "principale", "contentLang.hasOverride": "personalizzato", - "contentLang.addLanguage": "Aggiungi lingua…", + "contentLang.addLanguage": "Aggiungi lingua…", "contentLang.add": "Aggiungi", "contentLang.removeLanguage": "Rimuovi {lang}", "contentLang.resultsHint": "Cambia lingua per rivedere titoli e descrizioni IA di ciascuna lingua di contenuto.", "contentLang.settingsTitle": "Lingue di contenuto", - "contentLang.settingsHelp": "La lingua principale è usata per impostazione predefinita. Le lingue aggiuntive hanno prompt e risultati IA propri (ogni passaggio consuma crediti).", + "contentLang.settingsHelp": "La lingua principale è usata per impostazione predefinita. Le lingue aggiuntive hanno prompt e risultati IA propri (ogni passaggio consuma crediti).", "ai.prompts.languageHelp": "Modifica i prompt aziendali per lingua di contenuto. Una lingua vuota usa il valore predefinito integrato per quella lingua.", "header.accountSettingsAria": "Impostazioni account per {email}", "switcher.switchUserAria": "Cambia utente: {label}", - "switcher.unavailable": "Il cambio utente non è disponibile in questo ambiente.", + "switcher.unavailable": "Il cambio utente non è disponibile in questo ambiente.", "switcher.loadFailed": "Impossibile caricare gli utenti.", "support.notifications.aria": "Notifiche di supporto", "support.notifications.ariaUnread": "Notifiche di supporto, {count} non lette", @@ -4409,27 +4410,27 @@ export const it: MessageDict = { "time.neverUsed": "Mai usato", "billing.plan.enterprise": "Enterprise", "news.heading": "Aggiornamenti della piattaforma", - "news.subtitle": "Ultime funzionalità e miglioramenti", - "news.keyFeatures": "Funzionalità chiave:", + "news.subtitle": "Ultime funzionalità e miglioramenti", + "news.keyFeatures": "Funzionalità chiave:", "news.badge.new": "Nuovo", - "news.footer": "Per ora è tutto — torna dopo la prossima release.", + "news.footer": "Per ora è tutto — torna dopo la prossima release.", "news.category.enhancement": "Miglioramento", - "news.category.feature": "Funzionalità", + "news.category.feature": "Funzionalità", "news.category.integration": "Integrazione", - "news.category.newFeature": "Nuova funzionalità", + "news.category.newFeature": "Nuova funzionalità", "news.category.billing": "Fatturazione", - "news.uxImprovements.description": "Usabilità migliorata con controlli del tour, miglioramenti API e navigazione migliore.", + "news.uxImprovements.description": "Usabilità migliorata con controlli del tour, miglioramenti API e navigazione migliore.", "news.uxImprovements.f1": "Salta/nascondi il tour", - "news.uxImprovements.f2": "Miglioramenti affidabilità API", + "news.uxImprovements.f2": "Miglioramenti affidabilità API", "news.uxImprovements.f3": "Navigazione interfaccia migliorata", "news.uxImprovements.f4": "Maggiore efficienza del flusso di lavoro", "news.multiselect.title": "Supporto attributi multiselezione", - "news.multiselect.description": "I prodotti possono avere più valori per gli attributi di tipo elenco.", + "news.multiselect.description": "I prodotti possono avere più valori per gli attributi di tipo elenco.", "news.multiselect.f1": "Tipo attributo multiselezione", "news.multiselect.f2": "Selezione multipla in modifica prodotto", - "news.multiselect.f3": "Più valori su un singolo attributo", + "news.multiselect.f3": "Più valori su un singolo attributo", "news.multiselect.f4": "Estrazione migliorata per campi multiselezione", - "news.multiselect.f5": "Migliore compatibilità dei feed di esportazione", + "news.multiselect.f5": "Migliore compatibilità dei feed di esportazione", "news.csvEan.title": "Caricamento CSV di EAN", "news.csvEan.description": "Carica CSV con codici EAN per elaborare centinaia di prodotti in una volta.", "news.csvEan.f1": "Caricamento CSV drag & drop", @@ -4442,7 +4443,7 @@ export const it: MessageDict = { "news.brick.f1": "Gestione attributi codice BRICK", "news.brick.f2": "Formattazione automatica dei codici in esportazione", "news.brick.f3": "Integrazione codici BRICK nei feed XML", - "news.brick.f4": "Miglioramenti di compatibilità dei feed di esportazione", + "news.brick.f4": "Miglioramenti di compatibilità dei feed di esportazione", "news.apiV1.title": "Rilascio API v1", "news.apiV1.description": "Nuovi endpoint API v1 per categorie, attributi, feed, prodotti ed esportazioni.", "news.apiV1.f1": "Endpoint RESTful API v1", @@ -4457,7 +4458,7 @@ export const it: MessageDict = { "news.feedFiltering.f2": "Stati di caricamento migliorati", "news.feedFiltering.f3": "Prestazioni delle query ottimizzate", "news.feedFiltering.f4": "Gestione paginazione migliorata", - "news.feedFiltering.f5": "Miglioramenti della funzionalità di esportazione", + "news.feedFiltering.f5": "Miglioramenti della funzionalità di esportazione", "news.exportFeeds.title": "Sistema di feed di esportazione", "news.exportFeeds.description": "Sistema completo di feed di esportazione XML/CSV con configurazioni personalizzate.", "news.exportFeeds.f1": "Formati di esportazione XML e CSV", @@ -4480,7 +4481,7 @@ export const it: MessageDict = { "news.eprel.f4": "Estrazione della classe energetica", "news.eprel.f5": "Supporto multilingue", "news.aiCategorization.title": "Categorizzazione prodotti migliorata", - "news.aiCategorization.description": "Sistema di categorizzazione IA più accurato con supporto gerarchico.", + "news.aiCategorization.description": "Sistema di categorizzazione IA più accurato con supporto gerarchico.", "news.aiCategorization.f1": "Navigazione gerarchica delle categorie", "news.aiCategorization.f2": "Punteggio di confidenza", "news.aiCategorization.f3": "Supporto multilingue", @@ -4493,23 +4494,23 @@ export const it: MessageDict = { "news.standardFields.f4": "Supporto valori predefiniti", "news.standardFields.f5": "Configurazione automatica dei campi", "news.billingSystem.title": "Fatturazione basata su crediti", - "news.billingSystem.description": "Nuovo sistema di fatturazione a crediti con monitoraggio dell’uso e opzioni di pagamento flessibili.", + "news.billingSystem.description": "Nuovo sistema di fatturazione a crediti con monitoraggio dell’uso e opzioni di pagamento flessibili.", "news.billingSystem.f1": "Elaborazione basata su crediti", - "news.billingSystem.f2": "Analisi dell’utilizzo", + "news.billingSystem.f2": "Analisi dell’utilizzo", "news.billingSystem.f3": "Cicli di fatturazione flessibili", "news.billingSystem.f4": "Gestione metodi di pagamento", "news.billingSystem.f5": "Generazione fatture", "products.pageTitle": "Gestione prodotti", "products.pageDescriptionStoresBefore": "Gestisci, elabora e ottimizza il catalogo. Collega un negozio o importa CSV tramite", "products.pageDescriptionBasic": "Gestisci, elabora e ottimizza il catalogo. Importa tramite Feed o carica un CSV.", - "products.keyboard.esc": "— chiudi il pannello di modifica o i dialoghi", - "products.keyboard.toggle": "— attiva/disattiva questo suggerimento", + "products.keyboard.esc": "— chiudi il pannello di modifica o i dialoghi", + "products.keyboard.toggle": "— attiva/disattiva questo suggerimento", "products.keyboard.reviewPrefix": "Nel pannello Needs Review:", "products.keyboard.acceptAll": "accetta tutto", "products.keyboard.rejectShort": "rifiuta", "products.keyboard.acceptFields": "accetta nome / descrizione", "products.connectStore": "Collega negozio", - "products.updating": "Aggiornamento…", + "products.updating": "Aggiornamento…", "products.needLinkedRaw": "I prodotti selezionati richiedono un prodotto grezzo collegato per l'elaborazione.", "products.selectToProcess": "Seleziona almeno un prodotto da elaborare.", "products.undoResetHint": "Annulla riporta il prodotto a non elaborato tramite reset.", @@ -4523,18 +4524,18 @@ export const it: MessageDict = { "products.enrichment.rejectSelectedTitle": "Rifiutare i prodotti selezionati?", "products.enrichment.resetTitle": "Reimpostare a non elaborato?", "products.selectedOnPage": "{count} selezionati in questa pagina", - "products.selectionPageOnly": "Mostro {shown} di {total} — selezione solo questa pagina", + "products.selectionPageOnly": "Mostro {shown} di {total} — selezione solo questa pagina", "products.edit.coverageHint": "Quanti tra Nome, Descrizione, Attributi e Categoria sono presenti (feed o elaborati).", "products.edit.noEprelShort": "Nessun EPREL", "products.edit.specs": "Specifiche", - "products.edit.reviewBannerBody": "Usa la scheda Revisione per confrontare originali e IA. Scorciatoie: A accetta · R rifiuta · Alt+1/2 campo · ⌘/Ctrl+Invio accetta tutto.", - "products.edit.whatsFilled": "Cosa è compilato", - "products.edit.legend": "Grigio = mancante · Arancio = dal feed · Verde = elaborato", - "products.edit.updatedAgo": "· aggiornato {relative}", + "products.edit.reviewBannerBody": "Usa la scheda Revisione per confrontare originali e IA. Scorciatoie: A accetta · R rifiuta · Alt+1/2 campo · ⌘/Ctrl+Invio accetta tutto.", + "products.edit.whatsFilled": "Cosa è compilato", + "products.edit.legend": "Grigio = mancante · Arancio = dal feed · Verde = elaborato", + "products.edit.updatedAgo": "· aggiornato {relative}", "products.edit.status": "Stato", "products.edit.noRawUpdate": "No raw prodotto update time", - "products.edit.feedSyncPart": "· sync feed", - "products.edit.filledFields": "{filled} compilati · {total} campi", + "products.edit.feedSyncPart": "· sync feed", + "products.edit.filledFields": "{filled} compilati · {total} campi", "products.edit.noMappedFields": "No mapped feed fields on this prodotto.", "products.edit.emptyBadge": "Vuoto", "products.edit.coreBadge": "Core", @@ -4551,15 +4552,15 @@ export const it: MessageDict = { "field.group.inventory": "Inventario", "field.group.attributes": "Attributi", "field.group.shipping": "Spedizione", - "field.group.compliance": "Conformità", + "field.group.compliance": "Conformità", "field.group.other": "Altro", - "common.yes": "Sì", + "common.yes": "Sì", "common.no": "No", "status.running": "In esecuzione", "flash.admin.analyticsLoadFailed": "Impossibile caricare le analitiche", "flash.admin.diagnosticsLoadFailed": "Impossibile caricare i diagnostici", - "flash.admin.diagnosticsUnavailable": "I diagnostici non sono disponibili in questo deployment. Contatta l’amministratore della piattaforma.", - "flash.admin.diagnosticsUnreachable": "Impossibile raggiungere l’API di diagnostica. Verifica che l’API sia in esecuzione e che PUBLIC_API_URL / il proxy Vite la puntino.", + "flash.admin.diagnosticsUnavailable": "I diagnostici non sono disponibili in questo deployment. Contatta l’amministratore della piattaforma.", + "flash.admin.diagnosticsUnreachable": "Impossibile raggiungere l’API di diagnostica. Verifica che l’API sia in esecuzione e che PUBLIC_API_URL / il proxy Vite la puntino.", "admin.charts.statusEmpty": "Nessuna riga in questa suddivisione.", "admin.charts.seriesEmpty": "Nessun dato in questo periodo.", "admin.charts.primaryDefault": "Principale", @@ -4568,29 +4569,29 @@ export const it: MessageDict = { "admin.analytics.lastNDaysAria": "Ultimi {days} giorni", "admin.analytics.overview": "Panoramica", "admin.analytics.overviewHint": "Totali della piattaforma con contesto del periodo degli ultimi {days} giorni.", - "admin.analytics.tokensInPeriod": "{tokens} nel periodo · da prodotti elaborati", + "admin.analytics.tokensInPeriod": "{tokens} nel periodo · da prodotti elaborati", "admin.analytics.creditsRemainingOf": "{remaining} rimanenti su {allocated} assegnati", "admin.analytics.noJobsYet": "Nessun job ancora", - "admin.analytics.feedsVolume": "{input} in ingresso · {export} feed di export", - "admin.analytics.usersCompaniesRaw": "{users} utenti · {companies} aziende · {raw} grezzi", + "admin.analytics.feedsVolume": "{input} in ingresso · {export} feed di export", + "admin.analytics.usersCompaniesRaw": "{users} utenti · {companies} aziende · {raw} grezzi", "admin.analytics.operations": "Operazioni", - "admin.analytics.operationsHint": "Segnali di affidabilità, chiavi e crescita per il periodo selezionato.", - "admin.analytics.failedCompleted": "{failed} non riusciti · {completed} completati", - "admin.analytics.runningOver2h": "In esecuzione > 2 h ·", + "admin.analytics.operationsHint": "Segnali di affidabilità, chiavi e crescita per il periodo selezionato.", + "admin.analytics.failedCompleted": "{failed} non riusciti · {completed} completati", + "admin.analytics.runningOver2h": "In esecuzione > 2 h ·", "admin.analytics.apiKeysTotal": "{total} totali (revocate incluse)", - "admin.analytics.signupsDetail": "utenti · {companies} aziende · {tickets} ticket aperti/in sospeso", + "admin.analytics.signupsDetail": "utenti · {companies} aziende · {tickets} ticket aperti/in sospeso", "admin.analytics.providerMix": "Mix provider", "admin.analytics.providerMixHint": "Consumo di token in base a come sono configurate le credenziali IA.", - "admin.analytics.productsJobs": "{products} prodotti · {jobs} job", + "admin.analytics.productsJobs": "{products} prodotti · {jobs} job", "admin.analytics.trends": "Tendenze", "admin.analytics.trendsHint": "Serie giornaliere per token, provider, job e iscrizioni.", - "admin.analytics.tokensByDayHint": "Token dall’elaborazione prodotti completata (secondaria = prodotti quel giorno)", + "admin.analytics.tokensByDayHint": "Token dall’elaborazione prodotti completata (secondaria = prodotti quel giorno)", "admin.analytics.seriesTokens": "Gettoni", "admin.analytics.seriesProducts": "Prodotti", "admin.analytics.emptyTokens": "Nessun prodotto elaborato con token in questo periodo.", "admin.analytics.tokensByProviderHint": "Suddivisione giornaliera: interno / popolare / personalizzato (per tipo provider)", "admin.analytics.emptyProviderTokens": "Ancora nessun token etichettato per provider in questo periodo.", - "admin.analytics.providerDayTip": "{date}: Interno {internal} · Popolare {popular} · Personalizzato {custom}", + "admin.analytics.providerDayTip": "{date}: Interno {internal} · Popolare {popular} · Personalizzato {custom}", "admin.analytics.seriesCreated": "Creato", "admin.analytics.seriesFailed": "Non riuscito", "admin.analytics.emptyJobsSeries": "Nessun job di elaborazione creato in questo periodo.", @@ -4606,45 +4607,45 @@ export const it: MessageDict = { "admin.analytics.emptyFeedSync": "Nessun job di sync feed ancora.", "admin.analytics.emptyTickets": "Nessun ticket di supporto ancora.", "admin.analytics.usageDetail": "Dettaglio utilizzo", - "admin.analytics.usageDetailHint": "Modalità provider, aziende principali e riepiloghi dei cicli di fatturazione.", + "admin.analytics.usageDetailHint": "Modalità provider, aziende principali e riepiloghi dei cicli di fatturazione.", "admin.analytics.companyUsage": "Utilizzo per azienda", "admin.analytics.jobsCol": "Job", "admin.analytics.billingCycles": "Fatturazione cycles", - "admin.analytics.billingCyclesHint": "Riepiloghi storici dei cicli passati (possono restare indietro rispetto all’abbonamento attivo)", + "admin.analytics.billingCyclesHint": "Riepiloghi storici dei cicli passati (possono restare indietro rispetto all’abbonamento attivo)", "admin.analytics.periodCol": "Periodo", "admin.analytics.creditsCol": "Crediti", "admin.analytics.dataNotes": "Note sui dati", "admin.diagnostics.endpointNotMounted": "Endpoint non montato", "admin.diagnostics.noPayload": "Nessun payload di diagnostica", "admin.diagnostics.unavailableShort": "I diagnostici non sono disponibili in questo deployment.", - "admin.diagnostics.fixThenRefresh": "Correggi l’errore sopra, poi aggiorna.", - "admin.diagnostics.refreshOrConfirm": "Aggiorna o conferma che l’API è in salute.", + "admin.diagnostics.fixThenRefresh": "Correggi l’errore sopra, poi aggiorna.", + "admin.diagnostics.refreshOrConfirm": "Aggiorna o conferma che l’API è in salute.", "admin.diagnostics.systemStatus": "Stato del sistema", "admin.diagnostics.snapshot": "Istantanea {when}", "admin.diagnostics.queueTotal": "{total} totali", - "admin.diagnostics.queueStuck": "processing_jobs · bloccati in esecuzione (>2 h):", + "admin.diagnostics.queueStuck": "processing_jobs · bloccati in esecuzione (>2 h):", "admin.diagnostics.driver": "Driver: {driver}", "admin.diagnostics.openStuck": "Apri prodotti bloccati", "admin.diagnostics.configPresence": "Presenza configurazione", - "admin.diagnostics.configHint": "Solo booleani · env {env} · RPM {rpm} · batch {batch} · retry {retries}", + "admin.diagnostics.configHint": "Solo booleani · env {env} · RPM {rpm} · batch {batch} · retry {retries}", "admin.diagnostics.cutoverTitle": "Prontezza cutover", - "admin.diagnostics.cutoverHint": "Solo flag di presenza — indizi versione goose, età worker, piani mancanti. Niente Stripe/SMTP live.", + "admin.diagnostics.cutoverHint": "Solo flag di presenza — indizi versione goose, età worker, piani mancanti. Niente Stripe/SMTP live.", "admin.diagnostics.cutoverGoose": "Goose", - "admin.diagnostics.cutoverGooseVersion": "version_max {max} · atteso ≥ {min}", + "admin.diagnostics.cutoverGooseVersion": "version_max {max} · atteso ≥ {min}", "admin.diagnostics.cutoverGooseRequired": "Migrazioni richieste", "admin.diagnostics.cutoverWorker": "Worker", - "admin.diagnostics.cutoverWorkerAge": "visto {age}s fa · obsoleto dopo {stale}s", - "admin.diagnostics.cutoverWorkerAgeUnknown": "età non disponibile · obsoleto dopo {stale}s", + "admin.diagnostics.cutoverWorkerAge": "visto {age}s fa · obsoleto dopo {stale}s", + "admin.diagnostics.cutoverWorkerAgeUnknown": "età non disponibile · obsoleto dopo {stale}s", "admin.diagnostics.cutoverPlansMissing": "Aziende senza piano", "admin.diagnostics.cutoverPlansUnavailable": "Conteggio piani non disponibile", "admin.diagnostics.cutoverApiKeysMissing": "Companies without API keys", "admin.diagnostics.cutoverApiKeysUnavailable": "API key inventory unavailable", - "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", + "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", "admin.diagnostics.cutoverApiKeysLink": "List companies needing reissue", "admin.diagnostics.cutoverApplied": "applicata", "admin.diagnostics.cutoverPending": "in sospeso", "admin.diagnostics.etlInventoryTitle": "ETL gap inventory", - "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", + "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", "admin.diagnostics.etlInventoryFiles": "Files metadata-only", "admin.diagnostics.etlInventoryFilesDetail": "metadata-only / total file rows", "admin.diagnostics.etlInventoryJobs": "Jobs migrated tag", @@ -4654,20 +4655,20 @@ export const it: MessageDict = { "admin.diagnostics.etlInventoryTasksDetail": "legacy task history present in Postgres", "admin.diagnostics.recentJobs": "Processi recenti", "admin.diagnostics.recentAiFailures": "Errori IA di supporto recenti", - "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", + "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", "admin.diagnostics.relatedTools": "Strumenti ops correlati", "admin.diagnostics.toolStuckTitle": "Prodotti bloccati", "admin.diagnostics.toolStuckDesc": "Pulire job in esecuzione da oltre 2 ore.", "admin.diagnostics.toolOrphanTitle": "Orphan processed", - "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", + "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", "admin.diagnostics.toolAnalyticsTitle": "Analytics", "admin.diagnostics.toolAnalyticsDesc": "Tendenze e grafici di utilizzo della piattaforma.", "admin.diagnostics.toolBootstrapTitle": "Bootstrap", - "admin.diagnostics.toolBootstrapDesc": "Confermare l’accesso admin di piattaforma per questo account.", + "admin.diagnostics.toolBootstrapDesc": "Confermare l’accesso admin di piattaforma per questo account.", "admin.diagnostics.toolSettingsTitle": "Impostazioni", - "admin.diagnostics.toolSettingsDesc": "Mail, IA e modalità di sistema della piattaforma.", - "admin.diagnostics.config.maintenance_mode": "Modalità manutenzione", - "admin.diagnostics.config.read_only_mode": "Modalità sola lettura", + "admin.diagnostics.toolSettingsDesc": "Mail, IA e modalità di sistema della piattaforma.", + "admin.diagnostics.config.maintenance_mode": "Modalità manutenzione", + "admin.diagnostics.config.read_only_mode": "Modalità sola lettura", "admin.diagnostics.config.session_secure": "Cookie di sessione sicuro", "admin.diagnostics.config.smtp_enabled": "SMTP abilitato", "admin.diagnostics.config.email_dry_run": "Dry-run email", @@ -4688,14 +4689,14 @@ export const it: MessageDict = { "categories.selectAll": "Seleziona tutto", "categories.selectedCount": "{count} selezionati", "categories.noMatchingCategories": "Nessuna categoria corrispondente", - "categories.assigningProgress": "Assegnazione… {progress}%", + "categories.assigningProgress": "Assegnazione… {progress}%", "categories.assignToCount": "Assegna a {count}", - "categories.aiPromptSavedForCategory": "Un prompt di generazione IA è salvato per questa categoria.", + "categories.aiPromptSavedForCategory": "Un prompt di generazione IA è salvato per questa categoria.", "categories.titleAndDescriptionFormulasSaved": "Le formule di titolo e descrizione sono salvate per questa categoria.", - "categories.titleFormulaSavedForCategory": "Una formula di titolo è salvata per questa categoria.", - "categories.descriptionFormulaSavedForCategory": "Una formula di descrizione è salvata per questa categoria.", + "categories.titleFormulaSavedForCategory": "Una formula di titolo è salvata per questa categoria.", + "categories.descriptionFormulaSavedForCategory": "Una formula di descrizione è salvata per questa categoria.", "site.account": "Account", - "site.goToApp": "Vai all’app", + "site.goToApp": "Vai all’app", "site.logIn": "Accedi", "site.getStarted": "Inizia", "site.nav.primary": "Principale", @@ -4703,25 +4704,25 @@ export const it: MessageDict = { "site.nav.home": "Home", "site.nav.pricing": "Prezzi", "site.nav.apiDocs": "Documentazione API", - "seo.home.title": "Descrybe — Trasforma i feed dei fornitori in schede prodotto pronte", + "seo.home.title": "Descrybe — Trasforma i feed dei fornitori in schede prodotto pronte", "seo.home.description": "Collega feed CSV o XML dei fornitori, mappali alle tue categorie e attributi, genera titoli e descrizioni conformi alle tue regole, poi esporta o sincronizza con WooCommerce.", - "seo.pricing.title": "Prezzi — Free, Starter, Growth, Business | Descrybe", - "seo.pricing.description": "Inizia gratis con 100 prodotti e mappatura dei feed. I piani a pagamento aggiungono titoli e descrizioni con IA, più SKU, feed di esportazione e sync WooCommerce — da 49 $/mese. Enterprise per cataloghi illimitati.", + "seo.pricing.title": "Prezzi — Free, Starter, Growth, Business | Descrybe", + "seo.pricing.description": "Inizia gratis con 100 prodotti e mappatura dei feed. I piani a pagamento aggiungono titoli e descrizioni con IA, più SKU, feed di esportazione e sync WooCommerce — da 49 $/mese. Enterprise per cataloghi illimitati.", "seo.privacy.title": "Informativa sulla privacy | Descrybe", "seo.privacy.description": "Come Descrybe raccoglie, utilizza e protegge i dati dell'account, i cataloghi di prodotti e i feed dei fornitori quando usi la nostra piattaforma di dati di prodotto.", "seo.terms.title": "Termini di servizio | Descrybe", "seo.terms.description": "Termini di utilizzo di Descrybe: importazione di feed, arricchimento del catalogo, contenuti assistiti da IA, esportazioni e sincronizzazione WooCommerce per la tua azienda.", - "seo.features.title": "Funzionalità — Feed, arricchimento ed esportazione | Descrybe", + "seo.features.title": "Funzionalità — Feed, arricchimento ed esportazione | Descrybe", "seo.features.description": "Scopri come Descrybe importa i feed dei fornitori, mappa i campi alla tua tassonomia, arricchisce i dati di prodotto e distribuisce i cataloghi tramite feed di esportazione, WooCommerce o API.", "pricing.page.eyebrow": "Prezzi", "pricing.page.title": "Piani semplici per cataloghi in crescita", - "pricing.page.lead": "Inizia gratis con mappatura feed e pulizia di base. Passa a un piano superiore quando ti servono titoli e descrizioni IA, più prodotti, feed di esportazione o sync WooCommerce — da Starter a Enterprise.", - "pricing.page.subscribedBefore": "Già abbonato? Gestisci l’utilizzo in", + "pricing.page.lead": "Inizia gratis con mappatura feed e pulizia di base. Passa a un piano superiore quando ti servono titoli e descrizioni IA, più prodotti, feed di esportazione o sync WooCommerce — da Starter a Enterprise.", + "pricing.page.subscribedBefore": "Già abbonato? Gestisci l’utilizzo in", "pricing.page.subscribedMid": "o confronta i piani in", "pricing.page.plansLink": "Piani", "pricing.page.subscribedAfter": ".", "legal.lastUpdated": "Ultimo aggiornamento: {date}", - "legal.backHome": "← Torna alla home", + "legal.backHome": "← Torna alla home", "legal.emailLabel": "Email:", "legal.postalLabel": "Indirizzo postale:", "legal.privacy.title": "Informativa sulla privacy", @@ -4733,50 +4734,50 @@ export const it: MessageDict = { "legal.privacy.collect.personal.h": "Informazioni personali", "legal.privacy.collect.personal.p": "Quando ti registri per un account, raccogliamo informazioni che potrebbero essere utilizzate per identificarti, come nome, indirizzo e-mail, numero di telefono, nome dell'azienda e informazioni di fatturazione. Raccogliamo queste informazioni direttamente da te quando ce le fornisci.", "legal.privacy.collect.userData.h": "Dati dell'utente", - "legal.privacy.collect.userData.p": "Per erogare i nostri Servizi, raccogliamo e trattiamo dati di prodotto, feed dei fornitori, descrizioni di prodotto e altri contenuti che carichi, inserisci o invii in altro modo sulla nostra piattaforma. Ciò può includere attributi di prodotto, strutture di tassonomia, modelli e altri dati necessari al funzionamento dei nostri Servizi.", + "legal.privacy.collect.userData.p": "Per erogare i nostri Servizi, raccogliamo e trattiamo dati di prodotto, feed dei fornitori, descrizioni di prodotto e altri contenuti che carichi, inserisci o invii in altro modo sulla nostra piattaforma. Ciò può includere attributi di prodotto, strutture di tassonomia, modelli e altri dati necessari al funzionamento dei nostri Servizi.", "legal.privacy.collect.usage.h": "Informazioni di utilizzo", - "legal.privacy.collect.usage.p": "Raccogliamo automaticamente determinate informazioni sul tuo dispositivo e su come interagisci con i nostri Servizi, tra cui indirizzo IP, tipo di dispositivo, tipo di browser, sistema operativo, orari di accesso, pagine visualizzate, funzionalità utilizzate e altre attività di sistema. Utilizziamo queste informazioni per migliorare i nostri Servizi e l'esperienza utente.", + "legal.privacy.collect.usage.p": "Raccogliamo automaticamente determinate informazioni sul tuo dispositivo e su come interagisci con i nostri Servizi, tra cui indirizzo IP, tipo di dispositivo, tipo di browser, sistema operativo, orari di accesso, pagine visualizzate, funzionalità utilizzate e altre attività di sistema. Utilizziamo queste informazioni per migliorare i nostri Servizi e l'esperienza utente.", "legal.privacy.collect.cookies.h": "Cookie e tecnologie di tracciamento", - "legal.privacy.collect.cookies.p": "Utilizziamo cookie, web beacon e tecnologie di tracciamento simili per raccogliere informazioni sulle tue attività di navigazione sul nostro sito web. Puoi controllare i cookie tramite le impostazioni del browser e altri strumenti. Tuttavia, se blocchi determinati cookie, potresti non essere in grado di utilizzare tutte le funzionalità dei nostri Servizi.", + "legal.privacy.collect.cookies.p": "Utilizziamo cookie, web beacon e tecnologie di tracciamento simili per raccogliere informazioni sulle tue attività di navigazione sul nostro sito web. Puoi controllare i cookie tramite le impostazioni del browser e altri strumenti. Tuttavia, se blocchi determinati cookie, potresti non essere in grado di utilizzare tutte le funzionalità dei nostri Servizi.", "legal.privacy.use.h": "Come utilizziamo le tue informazioni", "legal.privacy.use.lead": "Utilizziamo le informazioni raccolte per vari scopi, tra cui:", "legal.privacy.use.li1": "Fornire, mantenere e migliorare i nostri Servizi", "legal.privacy.use.li2": "Elaborare le transazioni e inviare informazioni correlate, comprese conferme, fatture e notifiche di servizio", - "legal.privacy.use.li3": "Sviluppare nuovi prodotti, servizi, funzionalità e capacità", - "legal.privacy.use.li4": "Personalizzare la tua esperienza e offrire contenuti e funzionalità pertinenti ai tuoi interessi", + "legal.privacy.use.li3": "Sviluppare nuovi prodotti, servizi, funzionalità e capacità", + "legal.privacy.use.li4": "Personalizzare la tua esperienza e offrire contenuti e funzionalità pertinenti ai tuoi interessi", "legal.privacy.use.li5": "Rispondere alle tue richieste, commenti e domande", "legal.privacy.use.li6": "Inviarti avvisi tecnici, aggiornamenti, avvisi di sicurezza e messaggi di supporto e amministrazione", - "legal.privacy.use.li7": "Monitorare e analizzare tendenze, utilizzo e attività in relazione ai nostri Servizi", - "legal.privacy.use.li8": "Rilevare, indagare e prevenire transazioni fraudolente e altre attività illegali", - "legal.privacy.use.li9": "Proteggere i nostri diritti, la nostra proprietà e la nostra sicurezza, nonché i diritti, la proprietà e la sicurezza dei nostri utenti o di terzi", + "legal.privacy.use.li7": "Monitorare e analizzare tendenze, utilizzo e attività in relazione ai nostri Servizi", + "legal.privacy.use.li8": "Rilevare, indagare e prevenire transazioni fraudolente e altre attività illegali", + "legal.privacy.use.li9": "Proteggere i nostri diritti, la nostra proprietà e la nostra sicurezza, nonché i diritti, la proprietà e la sicurezza dei nostri utenti o di terzi", "legal.privacy.use.li10": "Adempiere agli obblighi di legge e far rispettare i nostri termini di servizio", "legal.privacy.ai.h": "IA e apprendimento automatico", - "legal.privacy.ai.p1": "I nostri Servizi utilizzano tecnologie di intelligenza artificiale e apprendimento automatico per elaborare dati di prodotto, generare contenuti e fornire altre funzionalità automatizzate. I dati che fornisci ai nostri Servizi possono essere utilizzati per addestrare e migliorare i nostri modelli di IA. Tuttavia, implementiamo adeguate salvaguardie per proteggere i tuoi dati e mantenerne la riservatezza.", + "legal.privacy.ai.p1": "I nostri Servizi utilizzano tecnologie di intelligenza artificiale e apprendimento automatico per elaborare dati di prodotto, generare contenuti e fornire altre funzionalità automatizzate. I dati che fornisci ai nostri Servizi possono essere utilizzati per addestrare e migliorare i nostri modelli di IA. Tuttavia, implementiamo adeguate salvaguardie per proteggere i tuoi dati e mantenerne la riservatezza.", "legal.privacy.ai.p2": "Non utilizziamo informazioni di identificazione personale per addestrare i nostri modelli generali di IA senza il tuo consenso esplicito. I dati di prodotto utilizzati per l'addestramento dell'IA vengono anonimizzati e aggregati ove possibile.", "legal.privacy.share.h": "Come condividiamo le tue informazioni", "legal.privacy.share.lead": "Possiamo condividere le tue informazioni nelle seguenti circostanze:", "legal.privacy.share.providers.h": "Fornitori di servizi", "legal.privacy.share.providers.p": "Possiamo condividere le tue informazioni con fornitori terzi, prestatori di servizi, appaltatori o agenti che eseguono servizi per nostro conto, come l'elaborazione dei pagamenti, l'analisi dei dati, l'invio di e-mail, l'hosting, l'assistenza clienti e il supporto marketing.", "legal.privacy.share.transfers.h": "Trasferimenti aziendali", - "legal.privacy.share.transfers.p": "Se siamo coinvolti in una fusione, acquisizione, finanziamento, riorganizzazione, fallimento o vendita di asset aziendali, le tue informazioni possono essere trasferite nell'ambito di tale operazione. Ti informeremo di qualsiasi cambiamento di questo tipo nella titolarità o nel controllo delle tue informazioni personali.", + "legal.privacy.share.transfers.p": "Se siamo coinvolti in una fusione, acquisizione, finanziamento, riorganizzazione, fallimento o vendita di asset aziendali, le tue informazioni possono essere trasferite nell'ambito di tale operazione. Ti informeremo di qualsiasi cambiamento di questo tipo nella titolarità o nel controllo delle tue informazioni personali.", "legal.privacy.share.legal.h": "Requisiti legali", - "legal.privacy.share.legal.p": "Possiamo divulgare le tue informazioni se richiesto dalla legge o in risposta a richieste valide da parte di autorità pubbliche (ad es. un tribunale o un ente governativo). Possiamo inoltre divulgare le tue informazioni per far rispettare i nostri termini di servizio, proteggere i nostri diritti, la privacy, la sicurezza o la proprietà e/o quelli delle nostre affiliate, utenti o terzi.", + "legal.privacy.share.legal.p": "Possiamo divulgare le tue informazioni se richiesto dalla legge o in risposta a richieste valide da parte di autorità pubbliche (ad es. un tribunale o un ente governativo). Possiamo inoltre divulgare le tue informazioni per far rispettare i nostri termini di servizio, proteggere i nostri diritti, la privacy, la sicurezza o la proprietà e/o quelli delle nostre affiliate, utenti o terzi.", "legal.privacy.share.consent.h": "Con il tuo consenso", "legal.privacy.share.consent.p": "Possiamo condividere le tue informazioni con terzi quando ci hai dato il consenso a farlo.", "legal.privacy.security.h": "Sicurezza dei dati", "legal.privacy.security.p1": "Abbiamo implementato misure tecniche e organizzative adeguate progettate per proteggere le tue informazioni personali da perdita accidentale e da accesso, uso, alterazione e divulgazione non autorizzati. Tutte le informazioni che ci fornisci sono archiviate su server sicuri dietro firewall.", "legal.privacy.security.p2": "La sicurezza delle tue informazioni dipende anche da te. Quando ti abbiamo fornito (o hai scelto) una password per accedere a determinate parti dei nostri Servizi, sei responsabile del mantenimento della riservatezza di tale password. Ti chiediamo di non condividere la password con nessuno.", - "legal.privacy.security.p3": "Purtroppo, la trasmissione di informazioni via Internet non è completamente sicura. Sebbene facciamo del nostro meglio per proteggere le tue informazioni personali, non possiamo garantire la sicurezza delle informazioni personali trasmesse ai nostri Servizi. Qualsiasi trasmissione di informazioni personali avviene a tuo rischio.", + "legal.privacy.security.p3": "Purtroppo, la trasmissione di informazioni via Internet non è completamente sicura. Sebbene facciamo del nostro meglio per proteggere le tue informazioni personali, non possiamo garantire la sicurezza delle informazioni personali trasmesse ai nostri Servizi. Qualsiasi trasmissione di informazioni personali avviene a tuo rischio.", "legal.privacy.rights.h": "I tuoi diritti e le tue scelte", "legal.privacy.rights.lead": "Ci impegniamo a offrirti scelte riguardo alle informazioni personali che ci fornisci. A seconda della tua ubicazione, potresti avere determinati diritti sulle tue informazioni personali, tra cui:", "legal.privacy.rights.li1": "Accedere e aggiornare le tue informazioni personali", "legal.privacy.rights.li2": "Richiedere la cancellazione delle tue informazioni personali", "legal.privacy.rights.li3": "Opporsi o limitare il trattamento delle tue informazioni personali", - "legal.privacy.rights.li4": "Portabilità dei dati", + "legal.privacy.rights.li4": "Portabilità dei dati", "legal.privacy.rights.li5": "Revocare il consenso (ove applicabile)", "legal.privacy.rights.footer": "Per esercitare i tuoi diritti, contattaci utilizzando le informazioni di contatto riportate alla fine della presente Informativa sulla privacy. Tieni presente che alcuni di questi diritti possono essere limitati o non applicabili a seconda della tua ubicazione e delle circostanze specifiche.", "legal.privacy.retention.h": "Conservazione dei dati", - "legal.privacy.retention.p1": "Conserveremo le tue informazioni personali per il tempo necessario a soddisfare le finalità descritte nella presente Informativa sulla privacy, salvo che la legge richieda o consenta un periodo di conservazione più lungo. Nel determinare per quanto tempo conservare le tue informazioni, consideriamo la quantità, la natura e la sensibilità delle informazioni, il rischio potenziale di danno derivante da uso o divulgazione non autorizzati, le finalità del trattamento e i requisiti legali applicabili.", + "legal.privacy.retention.p1": "Conserveremo le tue informazioni personali per il tempo necessario a soddisfare le finalità descritte nella presente Informativa sulla privacy, salvo che la legge richieda o consenta un periodo di conservazione più lungo. Nel determinare per quanto tempo conservare le tue informazioni, consideriamo la quantità, la natura e la sensibilità delle informazioni, il rischio potenziale di danno derivante da uso o divulgazione non autorizzati, le finalità del trattamento e i requisiti legali applicabili.", "legal.privacy.retention.p2": "Possiamo conservare determinate informazioni dopo la chiusura del tuo account, tra l'altro per adempiere ai nostri obblighi di legge, risolvere controversie e far rispettare i nostri accordi.", "legal.privacy.intl.h": "Trasferimenti internazionali di dati", "legal.privacy.intl.p1": "Le tue informazioni personali possono essere trasferite e trattate in paesi diversi da quello in cui risiedi. Tali paesi possono avere leggi sulla protezione dei dati diverse da quelle del tuo paese.", @@ -4785,69 +4786,69 @@ export const it: MessageDict = { "legal.privacy.children.p": "I nostri Servizi non sono destinati a minori di 16 anni e non raccogliamo consapevolmente informazioni personali da minori di 16 anni. Se veniamo a conoscenza di aver raccolto o ricevuto informazioni personali da un minore di 16 anni senza verifica del consenso genitoriale, elimineremo tali informazioni. Se ritieni che potremmo avere informazioni da o su un minore di 16 anni, contattaci.", "legal.privacy.changes.h": "Modifiche alla nostra Informativa sulla privacy", "legal.privacy.changes.p1": "Possiamo aggiornare la nostra Informativa sulla privacy di volta in volta. Se apportiamo modifiche sostanziali al modo in cui trattiamo le informazioni personali degli utenti, te lo comunicheremo via e-mail all'indirizzo indicato nel tuo account e/o tramite un avviso sul nostro sito web.", - "legal.privacy.changes.p2": "La data dell'ultima revisione dell'Informativa sulla privacy è indicata in cima alla pagina. Sei responsabile di assicurarci un indirizzo e-mail aggiornato, attivo e recapabile, e di visitare periodicamente il nostro sito web e la presente Informativa sulla privacy per verificare eventuali modifiche.", + "legal.privacy.changes.p2": "La data dell'ultima revisione dell'Informativa sulla privacy è indicata in cima alla pagina. Sei responsabile di assicurarci un indirizzo e-mail aggiornato, attivo e recapabile, e di visitare periodicamente il nostro sito web e la presente Informativa sulla privacy per verificare eventuali modifiche.", "legal.privacy.contact.h": "Contatti", "legal.privacy.contact.lead": "Se hai domande o dubbi sulla nostra Informativa sulla privacy o sulle nostre pratiche relative ai dati, contattaci all'indirizzo:", "legal.terms.title": "Termini di servizio", "legal.terms.s1.h": "1. Accettazione dei termini", - "legal.terms.s1.p": "Accedendo o utilizzando la piattaforma di dati di prodotto di Descrybe e i servizi correlati (collettivamente, i \"Servizi\"), accetti di essere vincolato dai presenti Termini di servizio e da tutte le leggi e normative applicabili. Se non sei d'accordo con uno qualsiasi di questi termini, ti è vietato utilizzare o accedere ai Servizi.", + "legal.terms.s1.p": "Accedendo o utilizzando la piattaforma di dati di prodotto di Descrybe e i servizi correlati (collettivamente, i \"Servizi\"), accetti di essere vincolato dai presenti Termini di servizio e da tutte le leggi e normative applicabili. Se non sei d'accordo con uno qualsiasi di questi termini, ti è vietato utilizzare o accedere ai Servizi.", "legal.terms.s2.h": "2. Licenza d'uso", - "legal.terms.s2.p1": "Fatto salvo il rispetto dei presenti Termini di servizio, Descrybe ti concede una licenza limitata, non esclusiva, non trasferibile e revocabile per accedere e utilizzare i Servizi per finalità aziendali.", + "legal.terms.s2.p1": "Fatto salvo il rispetto dei presenti Termini di servizio, Descrybe ti concede una licenza limitata, non esclusiva, non trasferibile e revocabile per accedere e utilizzare i Servizi per finalità aziendali.", "legal.terms.s2.lead": "Questa licenza non include:", "legal.terms.s2.li1": "La modifica o la copia dei Servizi o di qualsiasi contenuto ivi contenuto", "legal.terms.s2.li2": "L'uso dei Servizi per qualsiasi fine commerciale diverso dall'uso aziendale autorizzato", "legal.terms.s2.li3": "Il tentativo di decompilare o effettuare reverse engineering di qualsiasi software contenuto nei Servizi", - "legal.terms.s2.li4": "La rimozione di qualsiasi avviso di copyright o di proprietà dai materiali", + "legal.terms.s2.li4": "La rimozione di qualsiasi avviso di copyright o di proprietà dai materiali", "legal.terms.s2.li5": "Il trasferimento dei materiali a un'altra persona o il \"mirroring\" dei materiali su qualsiasi altro server", - "legal.terms.s2.p2": "Questa licenza si risolverà automaticamente se violi una qualsiasi di queste restrizioni e potrà essere terminata da Descrybe in qualsiasi momento.", + "legal.terms.s2.p2": "Questa licenza si risolverà automaticamente se violi una qualsiasi di queste restrizioni e potrà essere terminata da Descrybe in qualsiasi momento.", "legal.terms.s3.h": "3. Abbonamento e pagamento", - "legal.terms.s3.p1": "L'accesso ai Servizi può richiedere un abbonamento a pagamento. I termini di pagamento saranno specificati durante il processo di abbonamento. Tutti i pagamenti non sono rimborsabili, salvo diversa indicazione scritta da parte di Descrybe.", + "legal.terms.s3.p1": "L'accesso ai Servizi può richiedere un abbonamento a pagamento. I termini di pagamento saranno specificati durante il processo di abbonamento. Tutti i pagamenti non sono rimborsabili, salvo diversa indicazione scritta da parte di Descrybe.", "legal.terms.s3.p2": "Descrybe si riserva il diritto di modificare le tariffe di abbonamento con un preavviso ragionevole. L'uso continuato dei Servizi dopo una modifica tariffaria costituisce accettazione delle nuove tariffe.", "legal.terms.s4.h": "4. Contenuti dell'utente", "legal.terms.s4.p1": "Conservi tutti i diritti su qualsiasi contenuto che invii, pubblichi o visualizzi su o tramite i Servizi (\"Contenuti dell'utente\"). Fornendo Contenuti dell'utente a Descrybe, concedi a Descrybe una licenza mondiale, non esclusiva e royalty-free per utilizzare, riprodurre, modificare, adattare, pubblicare, tradurre e distribuire tali contenuti in relazione alla fornitura dei Servizi.", "legal.terms.s4.lead": "Dichiari e garantisci che:", "legal.terms.s4.li1": "Possiedi o controlli tutti i diritti sui Contenuti dell'utente che fornisci", "legal.terms.s4.li2": "I Contenuti dell'utente non violano i presenti Termini di servizio", - "legal.terms.s4.li3": "I Contenuti dell'utente non causeranno danno a alcuna persona o entità", + "legal.terms.s4.li3": "I Contenuti dell'utente non causeranno danno a alcuna persona o entità", "legal.terms.s5.h": "5. Intelligenza artificiale", "legal.terms.s5.p1": "I Servizi utilizzano tecnologie di intelligenza artificiale e apprendimento automatico. Riconosci che i contenuti generati dall'IA potrebbero non essere perfetti e accetti di rivedere tutti i contenuti generati dall'IA prima di utilizzarli nelle tue operazioni aziendali.", - "legal.terms.s5.p2": "Descrybe può utilizzare Contenuti dell'utente anonimizzati e aggregati per addestrare e migliorare i nostri modelli di IA, fatto salvo quanto previsto dalla nostra Informativa sulla privacy. Puoi scegliere di non consentire che i tuoi dati siano utilizzati per l'addestramento dell'IA contattandoci.", - "legal.terms.s6.h": "6. Proprietà intellettuale", - "legal.terms.s6.p": "I Servizi e i relativi contenuti, funzionalità e capacità originali sono di proprietà di Descrybe e sono protetti dalle leggi internazionali sul copyright, sui marchi, sui brevetti, sui segreti commerciali e da altre leggi sulla proprietà intellettuale o sui diritti di proprietà.", + "legal.terms.s5.p2": "Descrybe può utilizzare Contenuti dell'utente anonimizzati e aggregati per addestrare e migliorare i nostri modelli di IA, fatto salvo quanto previsto dalla nostra Informativa sulla privacy. Puoi scegliere di non consentire che i tuoi dati siano utilizzati per l'addestramento dell'IA contattandoci.", + "legal.terms.s6.h": "6. Proprietà intellettuale", + "legal.terms.s6.p": "I Servizi e i relativi contenuti, funzionalità e capacità originali sono di proprietà di Descrybe e sono protetti dalle leggi internazionali sul copyright, sui marchi, sui brevetti, sui segreti commerciali e da altre leggi sulla proprietà intellettuale o sui diritti di proprietà.", "legal.terms.s7.h": "7. Esclusione di garanzie", - "legal.terms.s7.p1": "I Servizi sono forniti \"così come sono\" e \"secondo disponibilità\". Descrybe non formula garanzie, espresse o implicite, e con la presente declina tutte le garanzie, comprese, senza limitazione, le garanzie implicite di commerciabilità, idoneità a uno scopo particolare, non violazione o corso di esecuzione.", - "legal.terms.s7.p2": "Descrybe non garantisce che i Servizi funzionino in modo ininterrotto, sicuro o disponibili in un determinato momento o luogo, né che eventuali errori o difetti verranno corretti.", - "legal.terms.s8.h": "8. Limitazione di responsabilità", - "legal.terms.s8.lead": "In nessun caso Descrybe sarà responsabile per danni indiretti, incidentali, speciali, consequenziali o punitivi, compresi, senza limitazione, la perdita di profitti, dati, uso, avviamento o altre perdite intangibili, derivanti da:", - "legal.terms.s8.li1": "Il tuo accesso o uso, o l'impossibilità di accedere o usare, i Servizi", + "legal.terms.s7.p1": "I Servizi sono forniti \"così come sono\" e \"secondo disponibilità\". Descrybe non formula garanzie, espresse o implicite, e con la presente declina tutte le garanzie, comprese, senza limitazione, le garanzie implicite di commerciabilità, idoneità a uno scopo particolare, non violazione o corso di esecuzione.", + "legal.terms.s7.p2": "Descrybe non garantisce che i Servizi funzionino in modo ininterrotto, sicuro o disponibili in un determinato momento o luogo, né che eventuali errori o difetti verranno corretti.", + "legal.terms.s8.h": "8. Limitazione di responsabilità", + "legal.terms.s8.lead": "In nessun caso Descrybe sarà responsabile per danni indiretti, incidentali, speciali, consequenziali o punitivi, compresi, senza limitazione, la perdita di profitti, dati, uso, avviamento o altre perdite intangibili, derivanti da:", + "legal.terms.s8.li1": "Il tuo accesso o uso, o l'impossibilità di accedere o usare, i Servizi", "legal.terms.s8.li2": "Qualsiasi condotta o contenuto di terzi sui Servizi", "legal.terms.s8.li3": "Qualsiasi contenuto ottenuto dai Servizi", "legal.terms.s8.li4": "L'accesso, l'uso o l'alterazione non autorizzati delle tue trasmissioni o del tuo contenuto", "legal.terms.s9.h": "9. Risoluzione", - "legal.terms.s9.p1": "Descrybe può risolvere o sospendere il tuo accesso ai Servizi immediatamente, senza preavviso né responsabilità, per qualsiasi motivo, compreso, senza limitazione, se violi i presenti Termini di servizio.", - "legal.terms.s9.p2": "Alla risoluzione, il tuo diritto di utilizzare i Servizi cesserà immediatamente. Se desideri chiudere il tuo account, puoi semplicemente interrompere l'uso dei Servizi o contattarci per richiedere l'eliminazione dell'account.", + "legal.terms.s9.p1": "Descrybe può risolvere o sospendere il tuo accesso ai Servizi immediatamente, senza preavviso né responsabilità, per qualsiasi motivo, compreso, senza limitazione, se violi i presenti Termini di servizio.", + "legal.terms.s9.p2": "Alla risoluzione, il tuo diritto di utilizzare i Servizi cesserà immediatamente. Se desideri chiudere il tuo account, puoi semplicemente interrompere l'uso dei Servizi o contattarci per richiedere l'eliminazione dell'account.", "legal.terms.s10.h": "10. Legge applicabile", - "legal.terms.s10.p": "I presenti Termini saranno regolati e interpretati in conformità alle leggi della Slovenia, senza riguardo ai principi sul conflitto di leggi.", + "legal.terms.s10.p": "I presenti Termini saranno regolati e interpretati in conformità alle leggi della Slovenia, senza riguardo ai principi sul conflitto di leggi.", "legal.terms.s11.h": "11. Modifiche ai termini", - "legal.terms.s11.p": "Descrybe si riserva il diritto di modificare o sostituire i presenti Termini di servizio in qualsiasi momento. È tua responsabilità rivedere periodicamente questi Termini per eventuali modifiche. L'uso continuato dei Servizi dopo la pubblicazione di qualsiasi modifica costituisce accettazione di tali modifiche.", + "legal.terms.s11.p": "Descrybe si riserva il diritto di modificare o sostituire i presenti Termini di servizio in qualsiasi momento. È tua responsabilità rivedere periodicamente questi Termini per eventuali modifiche. L'uso continuato dei Servizi dopo la pubblicazione di qualsiasi modifica costituisce accettazione di tali modifiche.", "legal.terms.s12.h": "12. Contatti", "legal.terms.s12.lead": "Se hai domande sui presenti Termini di servizio, contattaci all'indirizzo:", "plans.loadFailed": "Impossibile caricare i piani", - "plans.loading": "Caricamento dei piani…", - "plans.apiUnavailable": "L'API dei piani non è ancora disponibile su questo backend. Mostra il confronto pubblico dei prezzi.", + "plans.loading": "Caricamento dei piani…", + "plans.apiUnavailable": "L'API dei piani non è ancora disponibile su questo backend. Mostra il confronto pubblico dei prezzi.", "plans.title": "Scegli il tuo piano", "plans.sub.onPrefix": "Sei su", - "plans.sub.enterpriseSuffix": "— prodotti e IA illimitati. Non serve un upgrade self-service.", - "plans.sub.paygSuffix": "— pagamento a consumo. Confronta i piani pubblici qui sotto o parla con le vendite per Enterprise.", + "plans.sub.enterpriseSuffix": "— prodotti e IA illimitati. Non serve un upgrade self-service.", + "plans.sub.paygSuffix": "— pagamento a consumo. Confronta i piani pubblici qui sotto o parla con le vendite per Enterprise.", "plans.sub.creditsMid": "con {remaining} crediti IA rimanenti.", - "plans.sub.creditsSuffix": "Passa da Starter → Growth → Business con Checkout, oppure parla con le vendite per Enterprise.", - "plans.sub.none": "Nessun piano è ancora assegnato (ad esempio dopo una migrazione saltata). Scegli un piano qui sotto — la capacità non è Illimitata finché Checkout o un amministratore non ne assegna uno.", + "plans.sub.creditsSuffix": "Passa da Starter → Growth → Business con Checkout, oppure parla con le vendite per Enterprise.", + "plans.sub.none": "Nessun piano è ancora assegnato (ad esempio dopo una migrazione saltata). Scegli un piano qui sotto — la capacità non è Illimitata finché Checkout o un amministratore non ne assegna uno.", "plans.stripeHint": "Gli upgrade self-service usano Stripe Checkout.", "plans.checkoutUnavailable": "Il checkout self-service non e disponibile finche Stripe non e configurato. Contatta le vendite per un piano.", "plans.fallbackName": "Piano", - "plans.fallbackDescription": "Capacità per il tuo catalogo", + "plans.fallbackDescription": "Capacità per il tuo catalogo", "plans.badge.current": "Attuale", - "plans.badge.popular": "Più popolare", + "plans.badge.popular": "Più popolare", "plans.price.custom": "Personalizzato", "plans.price.forever": "per sempre", "plans.price.perMonth": "/mese", @@ -4861,38 +4862,38 @@ export const it: MessageDict = { "plans.cta.contactSales": "Contatta le vendite", "plans.cta.switchInBilling": "Cambia in fatturazione", "plans.cta.upgradeTo": "Passa a {name}", - "plans.cta.startingCheckout": "Avvio del checkout…", + "plans.cta.startingCheckout": "Avvio del checkout…", "plans.planApplied": "Piano {plan} applicato. I tuoi crediti sono pronti.", "plans.faq.title": "Domande frequenti", "plans.faq.limit.q": "Cosa succede se raggiungo un limite?", - "plans.faq.limit.a": "Prima vedrai avvisi soft. Quando esaurisci i crediti IA o raggiungi il tetto di SKU, i job che richiedono quella capacità vengono bloccati finché non liberi spazio, aspetti il ciclo successivo o effettui un upgrade.", + "plans.faq.limit.a": "Prima vedrai avvisi soft. Quando esaurisci i crediti IA o raggiungi il tetto di SKU, i job che richiedono quella capacità vengono bloccati finché non liberi spazio, aspetti il ciclo successivo o effettui un upgrade.", "plans.faq.selfServe.q": "Posso fare l'upgrade da solo?", - "plans.faq.selfServe.a": "Gli amministratori dell'azienda possono sottoscrivere Starter, Growth e Business in self-service tramite Checkout sulla scheda del piano. I membri devono rivolgersi a un amministratore — Checkout richiede il ruolo di amministratore. Enterprise passa sempre dalle vendite. Gli amministratori di piattaforma possono ancora assegnare piani in Billing Admin.", + "plans.faq.selfServe.a": "Gli amministratori dell'azienda possono sottoscrivere Starter, Growth e Business in self-service tramite Checkout sulla scheda del piano. I membri devono rivolgersi a un amministratore — Checkout richiede il ruolo di amministratore. Enterprise passa sempre dalle vendite. Gli amministratori di piattaforma possono ancora assegnare piani in Billing Admin.", "plans.faq.enterprise.q": "Enterprise e milioni di SKU", - "plans.faq.enterprise.a": "Capacità personalizzata, chiave IA propria (BYOK), SLA e gestione account passano dalle vendite. Prenota un appuntamento via Calendly — Enterprise non è self-service su scala di milioni di SKU. L'app mostra Illimitato per la capacità SKU e IA.", + "plans.faq.enterprise.a": "Capacità personalizzata, chiave IA propria (BYOK), SLA e gestione account passano dalle vendite. Prenota un appuntamento via Calendly — Enterprise non è self-service su scala di milioni di SKU. L'app mostra Illimitato per la capacità SKU e IA.", "plans.faq.pricing.q": "Dove trovo i prezzi pubblici?", "plans.faq.pricing.aBefore": "Consulta il confronto marketing sulla", "plans.faq.pricing.pricingPage": "pagina Prezzi", - "plans.faq.pricing.aMid": "— i CTA sono Inizia (registrazione) o Contatta le vendite. Gestisci l'utilizzo in qualsiasi momento in", + "plans.faq.pricing.aMid": "— i CTA sono Inizia (registrazione) o Contatta le vendite. Gestisci l'utilizzo in qualsiasi momento in", "plans.faq.pricing.aAfter": ".", "plans.custom.title": "Ti serve un piano personalizzato?", - "plans.custom.body": "La capacità Enterprise, la chiave IA propria e gli SLA vengono gestiti con il nostro team.", + "plans.custom.body": "La capacità Enterprise, la chiave IA propria e gli SLA vengono gestiti con il nostro team.", "plans.custom.looking": "Cerchi i dettagli dei piani pubblici?", "ai.title": "Integrazioni IA", "ai.description": "Scegli i crediti della piattaforma o la tua chiave, poi personalizza i prompt con le variabili.", "ai.crumb": "Integrazioni IA", - "ai.adminOnly": "Solo gli amministratori dell’azienda possono modificare le impostazioni IA. Puoi visualizzare la configurazione attuale.", + "ai.adminOnly": "Solo gli amministratori dell’azienda possono modificare le impostazioni IA. Puoi visualizzare la configurazione attuale.", "ai.badge.ownKey": "La tua chiave", "ai.badge.platform": "Crediti / chiave della piattaforma", "ai.badge.active": "Attivo: {label}", "ai.badge.platformKeyAvailable": "Chiave piattaforma disponibile", "ai.badge.lastTest": "Ultimo test: {status}", - "ai.providerMode.title": "Modalità provider", - "ai.providerMode.desc": "La piattaforma usa i crediti Descrybe e la nostra chiave. Popolare o Personalizzato usa la tua chiave compatibile OpenAI (la chiamata al provider non consuma crediti della piattaforma; le regole sui crediti delle funzionalità restano valide).", + "ai.providerMode.title": "Modalità provider", + "ai.providerMode.desc": "La piattaforma usa i crediti Descrybe e la nostra chiave. Popolare o Personalizzato usa la tua chiave compatibile OpenAI (la chiamata al provider non consuma crediti della piattaforma; le regole sui crediti delle funzionalità restano valide).", "ai.whoPays": "Chi paga il modello?", "ai.mode.internal": "Piattaforma (crediti / chiave Descrybe)", - "ai.mode.popular": "La tua chiave — provider popolare", - "ai.mode.custom": "La tua chiave — endpoint personalizzato", + "ai.mode.popular": "La tua chiave — provider popolare", + "ai.mode.custom": "La tua chiave — endpoint personalizzato", "ai.useCompanyKey": "Usa questa chiave aziendale per elaborazione, SEO IA e campagne IA", "ai.popular.title": "Provider popolare", "ai.popular.desc": "Endpoint compatibili OpenAI. Anthropic tramite OpenRouter.", @@ -4901,24 +4902,24 @@ export const it: MessageDict = { "ai.placeholder.modelId": "id del modello", "ai.baseUrlLabel": "URL di base: {url}", "ai.custom.title": "Endpoint personalizzato", - "ai.custom.desc": "Inserisci l’URL di base HTTPS del tuo provider IA.", + "ai.custom.desc": "Inserisci l’URL di base HTTPS del tuo provider IA.", "ai.field.baseUrl": "URL di base", "ai.apiKey.title": "Chiave API", - "ai.apiKey.desc": "Lascia vuoto per mantenere la chiave esistente. I segreti grezzi non vengono mai restituiti — solo un last4 mascherato.", + "ai.apiKey.desc": "Lascia vuoto per mantenere la chiave esistente. I segreti grezzi non vengono mai restituiti — solo un last4 mascherato.", "ai.storedKey": "Chiave salvata: {masked}", "ai.field.apiKey": "Chiave API", - "ai.placeholder.keepKey": "•••• lascia vuoto per mantenere", + "ai.placeholder.keepKey": "•••• lascia vuoto per mantenere", "ai.clearStoredKey": "Cancella chiave API salvata", "ai.saveProvider": "Salva provider", "ai.testConnection": "Testa connessione", "ai.prompts.title": "Modelli di prompt", "ai.prompts.descBefore": "Personalizza i prompt di sistema e utente per testi prodotto, meta SEO e email di campagna. Inserisci variabili come", - "ai.prompts.descMid": "— vengono compilate a runtime. La voce del brand kit è disponibile come", + "ai.prompts.descMid": "— vengono compilate a runtime. La voce del brand kit è disponibile come", "ai.prompts.descAfter": ".", - "ai.field.feature": "Funzionalità", + "ai.field.feature": "Funzionalità", "ai.badge.custom": "Personalizzato", "ai.badge.builtin": "Predefinito integrato", - "ai.badge.disabledDefault": "Disattivato → si usa il predefinito", + "ai.badge.disabledDefault": "Disattivato → si usa il predefinito", "ai.useCustomPrompt": "Usa questo prompt personalizzato (off = predefinito integrato)", "ai.insertVariableInto": "Inserisci variabile in", "ai.insert.system": "Sistema", @@ -4929,8 +4930,8 @@ export const it: MessageDict = { "ai.resetDefault": "Ripristina predefinito", "ai.editBrandVoice": "Modifica voce del brand", "ai.flash.loadFailed": "Impossibile caricare le impostazioni IA", - "ai.flash.usingPlatform": "Uso dell’IA della piattaforma (crediti / chiave Descrybe se configurati).", - "ai.flash.providerSaved": "Provider IA salvato. Le chiavi sono crittografate e non vengono più mostrate.", + "ai.flash.usingPlatform": "Uso dell’IA della piattaforma (crediti / chiave Descrybe se configurati).", + "ai.flash.providerSaved": "Provider IA salvato. Le chiavi sono crittografate e non vengono più mostrate.", "ai.flash.saveFailed": "Impossibile salvare", "ai.flash.savePromptsFailed": "Impossibile salvare i prompt", "ai.flash.resetFailed": "Impossibile ripristinare il prompt", @@ -4941,17 +4942,17 @@ export const it: MessageDict = { "ai.action.testProvider": "testare il provider IA", "email.title": "Invio email", "email.description": "Resend o SMTP per campagne di marketing. Segreti crittografati a riposo.", - "email.adminOnly": "Solo gli amministratori dell’azienda possono modificare le impostazioni del provider email. Puoi visualizzare la configurazione attuale.", + "email.adminOnly": "Solo gli amministratori dell’azienda possono modificare le impostazioni del provider email. Puoi visualizzare la configurazione attuale.", "email.crumb": "Integrazione email", - "email.dryRunForced": "La modalità dry-run è forzata ({reason}). I piani Free e EMAIL_DRY_RUN non inviano mai blast reali.", + "email.dryRunForced": "La modalità dry-run è forzata ({reason}). I piani Free e EMAIL_DRY_RUN non inviano mai blast reali.", "email.dryRunPolicy": "policy", "email.badge.verified": "Verificato", "email.badge.notVerified": "Non verificato", - "email.badge.canSendReal": "Può inviare reale", + "email.badge.canSendReal": "Può inviare reale", "email.badge.realBlocked": "Invio reale bloccato", "email.badge.lastTest": "Ultimo test: {status}", "email.provider.title": "Provider", - "email.provider.desc": "Configurazione per azienda. SMTP/Resend dell’ambiente piattaforma è solo fallback se mancano i segreti.", + "email.provider.desc": "Configurazione per azienda. SMTP/Resend dell’ambiente piattaforma è solo fallback se mancano i segreti.", "email.field.provider": "Provider", "email.provider.resend": "Resend", "email.provider.smtp": "SMTP", @@ -4960,7 +4961,7 @@ export const it: MessageDict = { "email.field.from": "Da", "email.field.fromName": "Nome mittente", "email.field.replyTo": "Reply-To", - "email.resendKeySaved": "Chiave API Resend (salvata — lascia vuoto per mantenere)", + "email.resendKeySaved": "Chiave API Resend (salvata — lascia vuoto per mantenere)", "email.resendKey": "Chiave API Resend", "email.field.smtpHost": "Host SMTP", "email.field.port": "Porta", @@ -4969,34 +4970,34 @@ export const it: MessageDict = { "email.field.password": "Password", "email.verifyDomain": "Verifica dominio", "email.testGate.title": "Test e blocco invii", - "email.testGate.desc": "Gli invii di test verificano l’indirizzo mittente. I blast reali richiedono di digitare “I understand”.", + "email.testGate.desc": "Gli invii di test verificano l’indirizzo mittente. I blast reali richiedono di digitare “I understand”.", "email.field.recipient": "Destinatario", "email.sendTest": "Invia test", - "email.confirmBlast": "Conferma blast…", + "email.confirmBlast": "Conferma blast…", "email.flash.loadFailed": "Impossibile caricare le impostazioni email", "email.flash.saveFailed": "Impossibile salvare", "email.flash.verifyUpdated": "Verifica aggiornata.", "email.flash.verifyFailed": "Verifica non riuscita", "email.flash.testFailed": "Invio di test non riuscito", - "email.flash.blastDryRun": "Controllo di consegna registrato in modalità dry-run — nessuna email inviata.", + "email.flash.blastDryRun": "Controllo di consegna registrato in modalità dry-run — nessuna email inviata.", "email.flash.blastDone": "Controllo di consegna completato: {sent} inviate, {failed} non riuscite.", "email.flash.blastFailed": "Blast non riuscito", "email.blast.subject": "Controllo di consegna email Descrybe", - "email.blast.body": "Questo è un controllo di consegna a un solo indirizzo da Descrybe per confermare che la tua integrazione email può inviare. Destinatario: {recipient}", + "email.blast.body": "Questo è un controllo di consegna a un solo indirizzo da Descrybe per confermare che la tua integrazione email può inviare. Destinatario: {recipient}", "email.action.changeSettings": "modificare le impostazioni del provider email", "email.action.verifyDomain": "verificare il dominio email", "email.action.sendTest": "inviare email di test", "email.action.sendBlasts": "inviare blast email", "seo.title": "Raccomandazioni SEO", - "seo.description": "Punteggi della checklist per meta del catalogo, titoli, immagini e parole chiave. Il riempimento con template è gratuito; la riscrittura IA è a pagamento.", - "seo.upgradeTitle": "La riscrittura IA è una funzione a pagamento", + "seo.description": "Punteggi della checklist per meta del catalogo, titoli, immagini e parole chiave. Il riempimento con template è gratuito; la riscrittura IA è a pagamento.", + "seo.upgradeTitle": "La riscrittura IA è una funzione a pagamento", "seo.upgradeMessage": "I piani Free possono comunque correggere meta mancanti con template basati su regole. Passa a un piano superiore o aggiungi crediti per usare le riscritture IA.", "seo.comparePlans": "Confronta i piani", "seo.openProducts": "Apri prodotti", "seo.overallScore": "Punteggio SEO complessivo", "seo.overallScoreHint": "Media degli elementi della checklist", "seo.productsScanned": "Prodotti analizzati", - "seo.productsScannedHint": "Prodotti elaborati nell’azienda", + "seo.productsScannedHint": "Prodotti elaborati nell’azienda", "seo.categoriesScanned": "Categorie analizzate", "seo.categoriesScannedHint": "Incluse le verifiche delle formule meta", "seo.aiRewrite": "Riscrittura IA", @@ -5004,68 +5005,68 @@ export const it: MessageDict = { "seo.gated": "Bloccato", "seo.templateFree": "Il riempimento con template resta gratuito su tutti i piani", "seo.checklist": "Checklist", - "seo.affectedFindings": "{affected} interessati · {count} risultati", + "seo.affectedFindings": "{affected} interessati · {count} risultati", "seo.fixable": "Correggibile", "seo.clearFilter": "Cancella filtro", "seo.findings": "Risultati", - "seo.noFindings": "Nessun risultato per questo filtro — ottimo lavoro.", + "seo.noFindings": "Nessun risultato per questo filtro — ottimo lavoro.", "seo.col.issue": "Problema", - "seo.col.entity": "Entità", - "seo.col.severity": "Gravità", + "seo.col.entity": "Entità", + "seo.col.severity": "Gravità", "seo.col.actions": "Azioni", - "seo.filling": "Riempimento…", + "seo.filling": "Riempimento…", "seo.templateFill": "Riempimento template", "seo.aiTitleAllowed": "Riscrivi con IA (usa crediti)", "seo.aiTitleGated": "Richiede piano a pagamento o crediti", - "seo.rewriting": "Riscrittura…", + "seo.rewriting": "Riscrittura…", "seo.aiRewriteBtn": "Riscrittura IA", "seo.viewProduct": "Vedi prodotto", "seo.flash.loadFailed": "Impossibile caricare le raccomandazioni SEO", "seo.flash.aiPaid": "La riscrittura IA richiede un piano a pagamento o crediti.", "seo.flash.applyFailed": "Impossibile applicare la correzione", "brand.title": "Kit del brand", - "brand.description": "Definisci voce, linee guida e colori così titoli e descrizioni prodotto restano coerenti con il brand.", - "brand.loading": "Caricamento brand kit…", - "brand.adminOnly": "Solo gli amministratori dell’azienda possono modificare il brand kit. Puoi visualizzare voce, colori e logo attuali.", - "brand.aiApplyFreeAdmin": "Puoi modificare il brand kit su Free. L’applicazione IA (iniezione della voce brand nei prompt di enhance) si sblocca da Starter in su.", - "brand.aiApplyGated": "L’applicazione IA (iniezione della voce brand nei prompt di enhance) si sblocca da Starter in su.", - "brand.aiEnhanceUses": "L’enhance IA userà questa voce brand durante l’elaborazione dei prodotti.", + "brand.description": "Definisci voce, linee guida e colori così titoli e descrizioni prodotto restano coerenti con il brand.", + "brand.loading": "Caricamento brand kit…", + "brand.adminOnly": "Solo gli amministratori dell’azienda possono modificare il brand kit. Puoi visualizzare voce, colori e logo attuali.", + "brand.aiApplyFreeAdmin": "Puoi modificare il brand kit su Free. L’applicazione IA (iniezione della voce brand nei prompt di enhance) si sblocca da Starter in su.", + "brand.aiApplyGated": "L’applicazione IA (iniezione della voce brand nei prompt di enhance) si sblocca da Starter in su.", + "brand.aiEnhanceUses": "L’enhance IA userà questa voce brand durante l’elaborazione dei prodotti.", "brand.comparePlans": "Confronta i piani", "brand.voice.title": "Voce e linee guida", - "brand.voice.desc": "Tono, regole do/don’t e formulazioni preferite", + "brand.voice.desc": "Tono, regole do/don’t e formulazioni preferite", "brand.field.voiceTone": "Voce / tono", "brand.placeholder.voiceTone": "es. Sicuro, conciso, tecnico ma accessibile", "brand.field.dos": "Do (uno per riga)", "brand.placeholder.dos": "Parti dal beneficio principale\nMantieni i titoli sotto gli 80 caratteri", - "brand.field.donts": "Don’t (uno per riga)", + "brand.field.donts": "Don’t (uno per riga)", "brand.placeholder.donts": "Niente TUTTO MAIUSCOLO\nEvita superlativi senza prove", "brand.field.preferredTerms": "Termini preferiti (uno per riga o separati da virgola)", "brand.placeholder.preferredTerms": "wireless, premium, classe energetica", - "brand.visual.title": "Identità visiva", + "brand.visual.title": "Identità visiva", "brand.visual.desc": "Colori e logo usati nei suggerimenti e nelle campagne consapevoli del brand", "brand.field.primaryColor": "Colore primario", "brand.field.secondaryColor": "Colore secondario", "brand.field.logoImage": "Immagine logo", "brand.logoHint": "PNG, JPEG o WebP fino a 2 MiB. Salvato negli upload della tua azienda.", - "brand.uploading": "Caricamento…", + "brand.uploading": "Caricamento…", "brand.uploadLogo": "Carica logo", "brand.clear": "Cancella", "brand.field.logoUrl": "URL del logo", - "brand.placeholder.logoUrl": "https://… oppure caricato /api/brand/logo/files/…", + "brand.placeholder.logoUrl": "https://… oppure caricato /api/brand/logo/files/…", "brand.logoAlt": "Anteprima logo del brand", "brand.tipsTitle": "Suggerimenti formula / anteprima", - "brand.saving": "Salvataggio…", + "brand.saving": "Salvataggio…", "brand.save": "Salva brand kit", "brand.flash.loadFailed": "Impossibile caricare il brand kit", "structured.title": "Campi descrizione strutturata", - "structured.loading": "Caricamento campi descrizione strutturata…", + "structured.loading": "Caricamento campi descrizione strutturata…", "structured.backDashboard": "Torna alla dashboard", "structured.categoryFormulas": "Formule di categoria", "structured.exportFeeds": "Feed di export", "structured.intro": "Questi campi vengono creati automaticamente quando aggiungi Export IDs alle sezioni della formula di descrizione. Possono essere usati nei feed di export per includere parti specifiche delle descrizioni prodotto.", "structured.addField": "Aggiungi campo", "structured.openCategories": "Apri categorie", - "structured.tableCaption": "Questi campi strutturano parti delle descrizioni prodotto per l’export.", + "structured.tableCaption": "Questi campi strutturano parti delle descrizioni prodotto per l’export.", "structured.col.fieldKey": "Chiave campo", "structured.col.type": "Tipo", "structured.col.created": "Creato", @@ -5087,7 +5088,7 @@ export const it: MessageDict = { "assistant.resetTitle": "Reimposta", "assistant.closeAria": "Chiudi assistente", "assistant.messageLabel": "Messaggio", - "assistant.placeholder": "es. aggiungi URL feed, chiavi API, attributi, elaborazione…", + "assistant.placeholder": "es. aggiungi URL feed, chiavi API, attributi, elaborazione…", "assistant.sendAria": "Invia", "site.bookDemo": "Prenota una demo", "site.demoShort": "Demo", @@ -5095,7 +5096,7 @@ export const it: MessageDict = { "site.cookiePolicy": "Informativa sui cookie", "site.cookieSettings": "Impostazioni cookie", "consent.title": "Cookie e analitica", - "consent.description": "Usiamo cookie necessari per far funzionare Descrybe. Cookie opzionali di analitica e marketing ci aiutano a capire l’uso e misurare le campagne. Puoi cambiare scelta in qualsiasi momento.", + "consent.description": "Usiamo cookie necessari per far funzionare Descrybe. Cookie opzionali di analitica e marketing ci aiutano a capire l’uso e misurare le campagne. Puoi cambiare scelta in qualsiasi momento.", "consent.acceptAll": "Accetta tutti", "consent.rejectNonEssential": "Rifiuta non essenziali", "consent.customize": "Personalizza", @@ -5107,24 +5108,24 @@ export const it: MessageDict = { "consent.analyticsDesc": "Ci aiuta a capire come viene usato il prodotto (Google Analytics tramite GTM).", "consent.marketing": "Marketing", "consent.marketingDesc": "Per misurazione pubblicitaria e personalizzazione quando in GTM sono configurati tag ads.", - "consent.policyLink": "Leggi l’Informativa sui cookie", + "consent.policyLink": "Leggi l’Informativa sui cookie", "seo.cookies.title": "Informativa sui cookie | Descrybe", "seo.cookies.description": "Come Descrybe usa cookie necessari, di analitica e marketing, inclusi GTM e GA4, e come modificare il consenso.", "legal.cookies.title": "Informativa sui cookie", "legal.cookies.intro.h": "Panoramica", - "legal.cookies.intro.p1": "Questa Informativa spiega come Descrybe usa cookie e tecnologie simili sul sito e sull’app. Da leggere insieme all’Informativa sulla privacy.", + "legal.cookies.intro.p1": "Questa Informativa spiega come Descrybe usa cookie e tecnologie simili sul sito e sull’app. Da leggere insieme all’Informativa sulla privacy.", "legal.cookies.intro.p2": "Ove richiesto, chiediamo il consenso prima di abilitare cookie di analitica o marketing. I cookie necessari forniscono il servizio in sicurezza e non richiedono consenso.", "legal.cookies.types.h": "Categorie di cookie", "legal.cookies.necessary.h": "Necessari", - "legal.cookies.necessary.p": "Mantengono l’accesso, proteggono i moduli con CSRF, memorizzano tema e lingua e ricordano la scelta sui cookie. Senza di essi il prodotto non funziona correttamente.", + "legal.cookies.necessary.p": "Mantengono l’accesso, proteggono i moduli con CSRF, memorizzano tema e lingua e ricordano la scelta sui cookie. Senza di essi il prodotto non funziona correttamente.", "legal.cookies.analytics.h": "Analitica", - "legal.cookies.analytics.p": "Se consenti l’analitica, carichiamo tag GTM che possono impostare cookie GA4 per misurare pagine ed eventi. Gli eventi restano bloccati finché non è concesso analytics_storage.", + "legal.cookies.analytics.p": "Se consenti l’analitica, carichiamo tag GTM che possono impostare cookie GA4 per misurare pagine ed eventi. Gli eventi restano bloccati finché non è concesso analytics_storage.", "legal.cookies.marketing.h": "Marketing", "legal.cookies.marketing.p": "Se consenti il marketing, i tag pubblicitari in GTM possono usare ad storage e segnali correlati per misurazione e personalizzazione.", "legal.cookies.gtm.h": "Google Tag Manager e GA4", - "legal.cookies.gtm.p": "Se configurato, Descrybe carica un contenitore GTM. GA4 è configurato al suo interno. Consent Mode v2 nega per impostazione predefinita storage analytics e ads fino all’accettazione delle categorie.", + "legal.cookies.gtm.p": "Se configurato, Descrybe carica un contenitore GTM. GA4 è configurato al suo interno. Consent Mode v2 nega per impostazione predefinita storage analytics e ads fino all’accettazione delle categorie.", "legal.cookies.third.h": "Terze parti", - "legal.cookies.third.p": "Google (Tag Manager / Analytics) può elaborare dati tecnici (URL, dispositivo/browser, nomi eventi) con consenso. Non inviamo intenzionalmente password, chiavi API o contatti negli eventi.", + "legal.cookies.third.p": "Google (Tag Manager / Analytics) può elaborare dati tecnici (URL, dispositivo/browser, nomi eventi) con consenso. Non inviamo intenzionalmente password, chiavi API o contatti negli eventi.", "legal.cookies.manage.h": "Come modificare il consenso", "legal.cookies.manage.p": "Usa Impostazioni cookie nel footer (o il pulsante sotto) per riaprire il banner. Puoi anche cancellare i dati del sito nel browser.", "site.privacyPolicy": "Informativa sulla privacy", @@ -5132,15 +5133,15 @@ export const it: MessageDict = { "site.legalNav": "Legale", "site.footer.aria": "Sito", "site.footer.description": "Descrybe trasforma i feed dei fornitori in cataloghi di prodotto puliti e pronti per i canali: mappa i campi, arricchisci attributi e testi, poi esporta o sincronizza con WooCommerce.", - "site.footer.rightsLine": "© {year} {name}. Tutti i diritti riservati.", + "site.footer.rightsLine": "© {year} {name}. Tutti i diritti riservati.", "site.footer.navTitle": "Navigazione", "site.footer.platform": "Piattaforma", "site.footer.solutions": "Soluzioni", "site.footer.contact": "Contattaci", "home.hero.tagline": "Dati di prodotto per i team ecommerce", "home.hero.title": "Dai feed dei fornitori alle pagine prodotto", - "home.hero.lead": "Collega i feed dei fornitori, mappali alle tue categorie, completa gli attributi obbligatori e scrivi titoli e descrizioni secondo le tue regole — poi esporta o sincronizza con il tuo store.", - "home.hero.learnMore": "Scopri di più", + "home.hero.lead": "Collega i feed dei fornitori, mappali alle tue categorie, completa gli attributi obbligatori e scrivi titoli e descrizioni secondo le tue regole — poi esporta o sincronizza con il tuo store.", + "home.hero.learnMore": "Scopri di più", "home.hero.apply": "Richiedi l'accesso", "home.hero.supportedBy": "Con il supporto di", "home.hero.msAlt": "Microsoft for Startups", @@ -5149,7 +5150,7 @@ export const it: MessageDict = { "home.how.lead": "Importa una sola volta i dati disordinati dei fornitori. Descrybe ti aiuta a categorizzarli, completare gli attributi, redigere le schede e inviare prodotti pronti ai tuoi canali.", "home.how.apply": "Richiedi l'accesso", "home.how.step1.title": "Importa la tua tassonomia", - "home.how.step1.desc": "Configura le categorie e gli attributi che il tuo store già usa", + "home.how.step1.desc": "Configura le categorie e gli attributi che il tuo store già usa", "home.how.step1.f1": "Definisci gli attributi obbligatori per ogni categoria", "home.how.step1.f2": "Imposta formule di titolo per categoria", "home.how.step1.f3": "Imposta modelli di descrizione e snippet di ricerca", @@ -5168,22 +5169,22 @@ export const it: MessageDict = { "home.how.step4.f1": "Genera feed di prodotto specifici per canale", "home.how.step4.f2": "Mantieni il pieno controllo sui campi che esporti", "home.how.step4.f3": "Resta aggiornato quando i dati del fornitore cambiano", - "home.benefits.title": "Tutto ciò che serve per dati di prodotto più puliti", - "home.benefits.lead": "Dall'import del feed alle schede pronte per il canale — senza ricostruire ogni file a mano.", + "home.benefits.title": "Tutto ciò che serve per dati di prodotto più puliti", + "home.benefits.lead": "Dall'import del feed alle schede pronte per il canale — senza ricostruire ogni file a mano.", "home.benefits.shield.title": "Individua schede incomplete in anticipo", - "home.benefits.shield.desc": "Controlla i dati rispetto alle regole di categoria così attributi mancanti e testi deboli vengono corretti prima della pubblicazione.", - "home.benefits.chart.title": "Schede più chiare, conversione più forte", - "home.benefits.chart.desc": "Titoli e descrizioni che evidenziano ciò che conta per gli acquirenti — benefici, specifiche e termini di ricerca del tuo catalogo.", + "home.benefits.shield.desc": "Controlla i dati rispetto alle regole di categoria così attributi mancanti e testi deboli vengono corretti prima della pubblicazione.", + "home.benefits.chart.title": "Schede più chiare, conversione più forte", + "home.benefits.chart.desc": "Titoli e descrizioni che evidenziano ciò che conta per gli acquirenti — benefici, specifiche e termini di ricerca del tuo catalogo.", "home.benefits.database.title": "Una struttura di prodotto coerente", - "home.benefits.database.desc": "Mantieni lo stesso albero di categorie e la stessa forma degli attributi su export e canali, così i clienti trovano i prodotti allo stesso modo ovunque.", + "home.benefits.database.desc": "Mantieni lo stesso albero di categorie e la stessa forma degli attributi su export e canali, così i clienti trovano i prodotti allo stesso modo ovunque.", "home.benefits.search.title": "Contenuti di prodotto pensati per la ricerca", - "home.benefits.search.desc": "Scrivi titoli, descrizioni e meta snippet più facili da capire per acquirenti e motori di ricerca.", + "home.benefits.search.desc": "Scrivi titoli, descrizioni e meta snippet più facili da capire per acquirenti e motori di ricerca.", "home.benefits.cost.title": "Meno inserimento manuale dei dati", - "home.benefits.cost.desc": "Automatizza mappatura, compilazione attributi e testi delle schede così il team si dedica al merchandising — non a ripulire fogli di calcolo.", + "home.benefits.cost.desc": "Automatizza mappatura, compilazione attributi e testi delle schede così il team si dedica al merchandising — non a ripulire fogli di calcolo.", "home.benefits.scale.title": "Pronto per ogni canale di vendita", "home.benefits.scale.desc": "Adatta feed di export e sync WooCommerce ai formati attesi da ogni canale, senza ricostruire il catalogo a mano.", "home.cta.titleLead": "Porta i prodotti sul mercato ", - "home.cta.titleHighlight": "più velocemente", + "home.cta.titleHighlight": "più velocemente", "home.cta.description": "Smetti di ricostruire i dati di prodotto da ogni file del fornitore. Mappa una volta, arricchisci con le tue regole e pubblica schede pronte a vendere.", "home.cta.f1": "Demo personalizzata", "home.cta.f2": "Consulenza di esperti", @@ -5191,7 +5192,7 @@ export const it: MessageDict = { "home.cta.apply": "Richiedi l'accesso", "home.cta.imageAlt": "Pagine prodotto Descrybe", "home.product.eyebrow": "Cosa fa Descrybe", - "home.product.title": "Feed fornitori in ingresso. Schede pronte in uscita — export, WooCommerce o API.", + "home.product.title": "Feed fornitori in ingresso. Schede pronte in uscita — export, WooCommerce o API.", "home.product.description": "Descrybe aiuta i team ecommerce a trasformare feed CSV e XML dei fornitori in cataloghi puliti. Mappa i campi alle tue categorie, arricchisci attributi e testi, poi invia i dati tramite feed di export, sync WooCommerce o l'API pubblica.", "home.product.pipelineAria": "Pipeline prodotto", "home.product.p1.label": "Feed in ingresso", @@ -5201,10 +5202,10 @@ export const it: MessageDict = { "home.product.p3.label": "Arricchisci", "home.product.p3.detail": "Categorie, attributi, titoli", "home.product.p4.label": "Pubblica", - "home.product.p4.detail": "Export · Woo · API", - "pricing.section.badge": "Capacità SKU + crediti AI", + "home.product.p4.detail": "Export · Woo · API", + "pricing.section.badge": "Capacità SKU + crediti AI", "pricing.section.title": "Inizia gratis. Scala quando il catalogo cresce.", - "pricing.section.lead": "Free include mappatura feed, pulizia base dei prodotti e etichette energetiche UE (EPREL) fino a 100 SKU (senza crediti AI). I piani a pagamento aggiungono titoli e descrizioni AI, più capacità e opzioni di export — Starter, Growth, Business, oppure parla con le vendite per Enterprise.", + "pricing.section.lead": "Free include mappatura feed, pulizia base dei prodotti e etichette energetiche UE (EPREL) fino a 100 SKU (senza crediti AI). I piani a pagamento aggiungono titoli e descrizioni AI, più capacità e opzioni di export — Starter, Growth, Business, oppure parla con le vendite per Enterprise.", "pricing.section.billingPeriod": "Periodo di fatturazione", "pricing.section.monthly": "Mensile", "pricing.section.yearly": "Annuale", @@ -5214,11 +5215,11 @@ export const it: MessageDict = { "pricing.section.publicAfter": "tramite Stripe Checkout. Enterprise resta gestito dalle vendite.", "pricing.section.plansLink": "Piani", "pricing.section.billingLink": "Fatturazione", - "pricing.section.capabilitiesTitle": "A cosa è pensato ogni piano", + "pricing.section.capabilitiesTitle": "A cosa è pensato ogni piano", "pricing.section.capabilitiesLead": "Importa feed, arricchisci il catalogo, poi esporta o sincronizza con WooCommerce", "pricing.section.faqTitle": "Domande frequenti", "pricing.section.readyTitle": "Pronto a mappare il tuo primo feed?", - "pricing.section.readyLead": "Crea un account Free — nessuna carta richiesta. Ne hai già uno? Apri l'app o confronta i piani.", + "pricing.section.readyLead": "Crea un account Free — nessuna carta richiesta. Ne hai già uno? Apri l'app o confronta i piani.", "pricing.section.contactSales": "Contatta le vendite", "pricing.cap.feeds": "Dai feed al catalogo", "pricing.cap.feeds.f1": "Feed fornitore CSV / XML / URL", @@ -5244,19 +5245,19 @@ export const it: MessageDict = { "pricing.cap.limits.f3": "Ruoli e inviti del team", "pricing.cap.limits.f4": "Opzioni SLA Enterprise", "pricing.faq.credits.q": "Cosa sono i crediti AI?", - "pricing.faq.credits.a": "I crediti AI pagano passaggi come la generazione di titoli e descrizioni. Free include 0 crediti AI — puoi comunque mappare i feed e pulire i dati. Pacchetti mensili a pagamento: Starter 150, Plus 500, Growth 1.200, Business 4.000, Scale 8.000. Enterprise include un grande pacchetto gestito (e la tua chiave AI). Da Growth in su puoi opzionalmente usare la tua chiave al posto dei crediti gestiti.", + "pricing.faq.credits.a": "I crediti AI pagano passaggi come la generazione di titoli e descrizioni. Free include 0 crediti AI — puoi comunque mappare i feed e pulire i dati. Pacchetti mensili a pagamento: Starter 150, Plus 500, Growth 1.200, Business 4.000, Scale 8.000. Enterprise include un grande pacchetto gestito (e la tua chiave AI). Da Growth in su puoi opzionalmente usare la tua chiave al posto dei crediti gestiti.", "pricing.faq.packs.q": "Can I buy extra AI credits?", "pricing.faq.packs.a": "Yes. One-time packs: Starter $19 / 500 credits, Growth $59 / 2,000, Catalog $199 / 10,000, Scale $599 / 40,000. Buy from Billing after you have a paid plan (or Free with leftover trial credits). Packs do not change your SKU or feed limits.", "pricing.faq.limits.q": "Cosa succede se raggiungo il limite di prodotti o crediti?", - "pricing.faq.limits.a": "Ti avvisiamo quando ti avvicini. Quando raggiungi il tetto prodotti o finisci i crediti AI, i job che richiedono quella capacità si mettono in pausa finché non liberi spazio, aspetti il ciclo successivo o fai upgrade.", + "pricing.faq.limits.a": "Ti avvisiamo quando ti avvicini. Quando raggiungi il tetto prodotti o finisci i crediti AI, i job che richiedono quella capacità si mettono in pausa finché non liberi spazio, aspetti il ciclo successivo o fai upgrade.", "pricing.faq.change.q": "Posso fare upgrade o downgrade?", - "pricing.faq.change.a": "Sì. Parti da Free, poi passa a Starter, Plus, Growth, Business o Scale da Piani o Fatturazione (Stripe Checkout). Enterprise è sempre gestito dalle vendite.", + "pricing.faq.change.a": "Sì. Parti da Free, poi passa a Starter, Plus, Growth, Business o Scale da Piani o Fatturazione (Stripe Checkout). Enterprise è sempre gestito dalle vendite.", "pricing.faq.free.q": "Cosa include Free?", - "pricing.faq.free.a": "Free per sempre: 50 prodotti, un feed, pulizia dati e compilazione attributi, etichette energetiche UE (EPREL — dati pubblici, senza crediti), più un export manuale — con 0 crediti AI. Nessuna carta di credito. Fai upgrade quando ti servono titoli e descrizioni AI o più capacità.", - "pricing.faq.why.q": "Perché non pagare per prodotto come gli strumenti solo di contenuti?", - "pricing.faq.why.a": "Descrybe copre l'intero percorso dal feed fornitore al catalogo fino a WooCommerce o all'export — non solo i testi AI. Paghi per la capacità della piattaforma (prodotti e feed); l'AI è un livello di utilizzo sopra.", + "pricing.faq.free.a": "Free per sempre: 50 prodotti, un feed, pulizia dati e compilazione attributi, etichette energetiche UE (EPREL — dati pubblici, senza crediti), più un export manuale — con 0 crediti AI. Nessuna carta di credito. Fai upgrade quando ti servono titoli e descrizioni AI o più capacità.", + "pricing.faq.why.q": "Perché non pagare per prodotto come gli strumenti solo di contenuti?", + "pricing.faq.why.a": "Descrybe copre l'intero percorso dal feed fornitore al catalogo fino a WooCommerce o all'export — non solo i testi AI. Paghi per la capacità della piattaforma (prodotti e feed); l'AI è un livello di utilizzo sopra.", "pricing.faq.annual.q": "Come funziona la fatturazione annuale?", - "pricing.faq.annual.a": "La fatturazione annuale è circa il 20% in meno del prezzo mensile. Inizia gratis, poi scegli annuale in Checkout al momento dell'upgrade (o contatta le vendite).", + "pricing.faq.annual.a": "La fatturazione annuale è circa il 20% in meno del prezzo mensile. Inizia gratis, poi scegli annuale in Checkout al momento dell'upgrade (o contatta le vendite).", "pricing.calc.badge": "Plan calculator", "pricing.calc.title": "Find the right plan", "pricing.calc.lead": "Enter feeds, catalog size, and how many products you want to enhance with AI (count each language pass).", @@ -5265,12 +5266,12 @@ export const it: MessageDict = { "pricing.calc.skus": "Catalog products (SKUs)", "pricing.calc.skusHint": "Total products you will store and process", "pricing.calc.aiVolume": "AI process volume", - "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", + "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", "pricing.calc.recommendedLabel": "Recommended", "pricing.calc.budgetLabel": "Budget option", "pricing.calc.coversCredits": "Needs about {count} AI credits / month", "pricing.calc.aiIncluded": "Included monthly credits cover this AI volume", - "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", + "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", "pricing.calc.orYearly": "or ~{amount}/mo yearly", "pricing.calc.budgetNote": "Lower list price with yearly discount and/or credit packs when that still fits.", "pricing.calc.noBudget": "The recommended plan is already the leanest fit for these inputs.", @@ -5278,7 +5279,7 @@ export const it: MessageDict = { "pricing.calc.enterpriseBody": "Your feeds or catalog size exceed self-serve caps. Talk to sales for unlimited capacity and a managed AI grant or BYOK.", "pricing.calc.ctaPlan": "Choose {name}", "pricing.calc.disclaimer": "Estimates use list prices and ~2 credits per AI product enhance. Checkout prices come from Stripe. A1 and other client deals stay admin-only.", - "pricing.card.mostPopular": "Più popolare", + "pricing.card.mostPopular": "Più popolare", "pricing.card.custom": "Personalizzato", "pricing.card.forever": "per sempre", "pricing.card.perMonth": "mese", @@ -5295,13 +5296,13 @@ export const it: MessageDict = { "pricing.card.showMoreFeature": "Mostra {count} altra funzione", "pricing.card.showMoreFeatures": "Mostra altre {count} funzioni", "pricing.card.upgradeTo": "Passa a {name}", - "pricing.plan.free.description": "Mappa un feed di esempio e pulisci i dati di prodotto — nessuna carta richiesta", + "pricing.plan.free.description": "Mappa un feed di esempio e pulisci i dati di prodotto — nessuna carta richiesta", "pricing.plan.starter.description": "Cataloghi piccoli che necessitano titoli e descrizioni AI", - "pricing.plan.plus.description": "Più prodotti, feed e AI per cataloghi in crescita", + "pricing.plan.plus.description": "Più prodotti, feed e AI per cataloghi in crescita", "pricing.plan.growth.description": "Feed multi-fornitore verso store ed export shopping", "pricing.plan.business.description": "Cataloghi mid-market con BYOK", "pricing.plan.scale.description": "Cataloghi a scala di distributore con supporto prioritario", - "pricing.plan.enterprise.description": "Capacità illimitata, SLA e un team account dedicato", + "pricing.plan.enterprise.description": "Capacità illimitata, SLA e un team account dedicato", "pricing.feature.credits100": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits100starter": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits400": "400 AI credits / month (~50% catalog cover)", @@ -5417,7 +5418,7 @@ export const it: MessageDict = { "pricing.feature.customIntegrations": "Integrazioni personalizzate", "pricing.feature.slaPriority": "SLA e supporto prioritario", "pricing.pack.tiny.name": "Nano pack", - "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", + "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", "pricing.pack.small.name": "Starter pack", "pricing.pack.small.desc": "Extra AI for fixes and tests (~250 products)", "pricing.pack.medium.name": "Growth pack", @@ -5427,70 +5428,70 @@ export const it: MessageDict = { "pricing.pack.xl.name": "Scale pack", "pricing.pack.xl.desc": "Heavy usage / agency bursts (~20,000 products)", "pricing.pack.xxl.name": "Business pack", - "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", + "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", "pricing.pack.mega.name": "Scale pack", - "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", + "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", "pricing.section.faqDescription": "Risposte chiare su piani, crediti e cosa include Free.", "billing.buyCreditPacks": "Buy AI credit packs", - "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", + "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", "billing.packCredits": "{credits} crediti", "billing.packApproxProducts": "~{count} AI products", "billing.buyPack": "Buy", - "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", + "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", "billing.packCheckoutFailed": "Could not start credit pack checkout.", "empty.default.noItems": "Nessun elemento trovato.", "settings.tabLockedHint": "Not on your plan", "stores.connectorLocked": "Not on your plan", "stores.connectorUpgrade": "Upgrade to unlock", - "plan.upgrade.title": "Questa funzione non è nel tuo piano", - "plan.upgrade.message": "Esegui l’upgrade per sbloccare questa parte di Descrybe.", + "plan.upgrade.title": "Questa funzione non è nel tuo piano", + "plan.upgrade.message": "Esegui l’upgrade per sbloccare questa parte di Descrybe.", "plan.upgrade.defaultMessage": "Il tuo piano attuale non include questa parte di Descrybe. Fai upgrade per sbloccarla, oppure chiedi a un admin aziendale se non puoi modificare la fatturazione.", - "plan.upgrade.sectionOff.title": "Questa funzione non è temporaneamente disponibile", - "plan.upgrade.sectionOff.message": "Questa parte di Descrybe è disattivata sulla piattaforma in questo momento. Non è un problema di upgrade — riprova più tardi o contatta l’assistenza.", + "plan.upgrade.sectionOff.title": "Questa funzione non è temporaneamente disponibile", + "plan.upgrade.sectionOff.message": "Questa parte di Descrybe è disattivata sulla piattaforma in questo momento. Non è un problema di upgrade — riprova più tardi o contatta l’assistenza.", "plan.upgrade.sectionOff.cta": "Torna alla dashboard", - "plan.upgrade.stores.message": "I connettori WooCommerce e Shopify richiedono un piano che include Negozi. Fai upgrade per collegarli — oppure continua con feed e API sul piano attuale.", + "plan.upgrade.stores.message": "I connettori WooCommerce e Shopify richiedono un piano che include Negozi. Fai upgrade per collegarli — oppure continua con feed e API sul piano attuale.", "plan.upgrade.stillWorks.title": "Cosa funziona ancora nel tuo piano", "plan.upgrade.stillWorks.feeds.label": "Feed di input", "plan.upgrade.stillWorks.feeds.description": "Aggiungi URL CSV o XML e caricamenti file per sincronizzare i cataloghi senza connettori negozio.", "plan.upgrade.stillWorks.export.label": "Feed di export", "plan.upgrade.stillWorks.export.description": "Genera feed in uscita per canali shopping e partner.", - "plan.upgrade.stillWorks.processing.label": "Attività in background", - "plan.upgrade.stillWorks.processing.description": "Monitora i job di IA e catalogo in Elaborazione — disponibili nel tuo piano anche senza connettori negozio.", + "plan.upgrade.stillWorks.processing.label": "Attività in background", + "plan.upgrade.stillWorks.processing.description": "Monitora i job di IA e catalogo in Elaborazione — disponibili nel tuo piano anche senza connettori negozio.", "plan.upgrade.stillWorks.api.label": "Chiavi API", - "plan.upgrade.stillWorks.api.description": "Crea una chiave in Impostazioni per usare /api/v1 — il secret viene mostrato una sola volta.", + "plan.upgrade.stillWorks.api.description": "Crea una chiave in Impostazioni per usare /api/v1 — il secret viene mostrato una sola volta.", "plan.upgrade.stillWorks.docs.label": "Documentazione API", "plan.upgrade.stillWorks.docs.description": "Leggi la panoramica API e integra senza WooCommerce o Shopify.", "plan.upgrade.feature.settings.api_keys": "Le chiavi API richiedono un piano a pagamento", "plan.upgrade.feature.catalog.products.process_ai_titles": "I titoli IA sono una funzione a pagamento", "plan.upgrade.feature.catalog.products.process_ai_descriptions": "Le descrizioni IA sono una funzione a pagamento", - "plan.upgrade.feature.marketing.campaigns.generate_ai": "L’IA delle campagne richiede un piano a pagamento", - "plan.upgrade.feature.marketing.campaigns.send": "L’invio live delle campagne richiede un piano a pagamento", - "plan.upgrade.feature.marketing.brand_ai_apply": "La voce del brand nell’IA richiede un piano a pagamento", + "plan.upgrade.feature.marketing.campaigns.generate_ai": "L’IA delle campagne richiede un piano a pagamento", + "plan.upgrade.feature.marketing.campaigns.send": "L’invio live delle campagne richiede un piano a pagamento", + "plan.upgrade.feature.marketing.brand_ai_apply": "La voce del brand nell’IA richiede un piano a pagamento", "plan.upgrade.feature.marketing.seo.ai_rewrite": "La riscrittura SEO con IA richiede un piano a pagamento", "plan.upgrade.feature.integrations.ai.byok": "Porta la tua chiave IA a partire da Growth", "plan.upgrade.feature.capability.byok": "Porta la tua chiave IA a partire da Growth", "plan.upgrade.feature.marketing.campaigns": "Le campagne non sono nel tuo piano", - "plan.upgrade.feature.marketing.content_calendar": "Il calendario dei contenuti non è nel tuo piano", + "plan.upgrade.feature.marketing.content_calendar": "Il calendario dei contenuti non è nel tuo piano", "plan.upgrade.feature.marketing.seo": "Gli strumenti SEO non sono nel tuo piano", - "plan.upgrade.feature.marketing.brand_kit": "Il brand kit non è nel tuo piano", + "plan.upgrade.feature.marketing.brand_kit": "Il brand kit non è nel tuo piano", "plan.upgrade.feature.marketing.reviews": "Le recensioni non sono nel tuo piano", "plan.upgrade.feature.integrations.ai": "Le integrazioni IA non sono nel tuo piano", - "plan.upgrade.feature.integrations.email": "L’invio email non è nel tuo piano", - "plan.upgrade.feature.processing.monitor": "Elaborazione non è nel tuo piano", + "plan.upgrade.feature.integrations.email": "L’invio email non è nel tuo piano", + "plan.upgrade.feature.processing.monitor": "Elaborazione non è nel tuo piano", "plan.upgrade.feature.stores.hub": "I connettori negozio non sono nel tuo piano", - "plan.upgrade.feature.stores.woocommerce": "WooCommerce non è nel tuo piano", - "plan.upgrade.feature.stores.shopify": "Shopify non è nel tuo piano", - "plan.upgrade.feature.support.center": "Il Centro assistenza non è nel tuo piano", - "plan.upgrade.feature.support.ticket_create": "Creare ticket di assistenza non è nel tuo piano", + "plan.upgrade.feature.stores.woocommerce": "WooCommerce non è nel tuo piano", + "plan.upgrade.feature.stores.shopify": "Shopify non è nel tuo piano", + "plan.upgrade.feature.support.center": "Il Centro assistenza non è nel tuo piano", + "plan.upgrade.feature.support.ticket_create": "Creare ticket di assistenza non è nel tuo piano", "plan.upgrade.feature.support.ticket_thread": "I thread dei ticket di assistenza non sono nel tuo piano", "plan.upgrade.feature.catalog.structured_descriptions": "Le descrizioni strutturate non sono nel tuo piano", "plan.upgrade.feature.catalog.vector_categories": "Le categorie vettoriali non sono nel tuo piano", - "plan.checkingAccess": "Verifica dell’accesso al piano…", + "plan.checkingAccess": "Verifica dell’accesso al piano…", "upgradeBanner.comparePlans": "Confronta i piani", "upgradeBanner.talkToSales": "Parla con le vendite", "commandPalette.closeAria": "Chiudi ricerca", "commandPalette.ariaLabel": "Cerca pagine", - "commandPalette.placeholder": "Cerca pagine…", + "commandPalette.placeholder": "Cerca pagine…", "commandPalette.searchAria": "Cerca pagine", "commandPalette.destinationsAria": "Pagine", "commandPalette.noMatches": "Nessuna pagina corrispondente", @@ -5500,24 +5501,24 @@ export const it: MessageDict = { "commandPalette.announceMatchOne": "{count} pagina corrispondente.", "commandPalette.announceMatchMany": "{count} pagine corrispondenti.", "vector.title": "Test categorie vettoriali", - "vector.description": "Cerca nell’indice delle categorie vettoriali quando Pinecone è configurato. Creazione indice e inizializzazione non sono ancora disponibili in v2.", - "vector.probing": "Controllo API categorie vettoriali…", - "vector.unavailable": "Le categorie vettoriali non sono ancora su questo backend. Non c’è nulla da eseguire finché /api/vector-categories/* non è collegato.", + "vector.description": "Cerca nell’indice delle categorie vettoriali quando Pinecone è configurato. Creazione indice e inizializzazione non sono ancora disponibili in v2.", + "vector.probing": "Controllo API categorie vettoriali…", + "vector.unavailable": "Le categorie vettoriali non sono ancora su questo backend. Non c’è nulla da eseguire finché /api/vector-categories/* non è collegato.", "vector.browseCategories": "Sfoglia categorie", "vector.initHeading": "Inizializza database vettoriale", - "vector.initComingSoon": "Crea indice e Inizializza DB vettoriale non sono ancora disponibili in v2 (in arrivo). La ricerca funziona ancora quando Pinecone è configurato.", + "vector.initComingSoon": "Crea indice e Inizializza DB vettoriale non sono ancora disponibili in v2 (in arrivo). La ricerca funziona ancora quando Pinecone è configurato.", "vector.createIndex": "Crea indice", "vector.initDb": "Inizializza DB vettoriale", "vector.searchHeading": "Cerca categorie", - "vector.searchPlaceholder": "Inserisci descrizione prodotto…", + "vector.searchPlaceholder": "Inserisci descrizione prodotto…", "vector.results": "Risultati:", "vector.categoryLabel": "Categoria:", "vector.idLabel": "ID:", "vector.scoreLabel": "Punteggio:", - "switcher.switching": "Cambio in corso…", + "switcher.switching": "Cambio in corso…", "switcher.returnTo": "Torna a {email}", "switcher.switchUser": "Cambia utente", - "switcher.loadingUsers": "Caricamento utenti…", + "switcher.loadingUsers": "Caricamento utenti…", "switcher.empty": "Nessun utente commutabile trovato.", "switcher.noCompany": "Nessuna azienda", "switcher.unknownCompany": "Azienda sconosciuta", @@ -5525,15 +5526,15 @@ export const it: MessageDict = { "companySwitcher.switchAria": "Cambia azienda: {label}", "companySwitcher.companies": "Aziende", "companySwitcher.returnTo": "Torna a {name}", - "companySwitcher.returnHome": "Torna all’azienda di origine", + "companySwitcher.returnHome": "Torna all’azienda di origine", "storeReconnect.primaryLabel": "Riconnetti negozio", "storeReconnect.titlePlural": "Riconnetti i negozi dopo la migrazione", "storeReconnect.titleChannel": "Riconnetti {channel} dopo la migrazione", "storeReconnect.titleSingular": "Riconnetti negozio dopo la migrazione", - "storeReconnect.messageWithItems": "Le credenziali API del negozio non sono state trasferite (o non sono utilizzabili) dopo la migrazione della piattaforma. Non è una sync rotta — riconnetti ogni negozio, poi Prova connessione prima di mettere in coda una sync.", - "storeReconnect.messageSingle": "Le credenziali API di {channel} non sono state trasferite (o non sono utilizzabili) dopo la migrazione della piattaforma. Non è una sync rotta — incolla credenziali nuove, Salva, poi Prova connessione prima di mettere in coda una sync.", + "storeReconnect.messageWithItems": "Le credenziali API del negozio non sono state trasferite (o non sono utilizzabili) dopo la migrazione della piattaforma. Non è una sync rotta — riconnetti ogni negozio, poi Prova connessione prima di mettere in coda una sync.", + "storeReconnect.messageSingle": "Le credenziali API di {channel} non sono state trasferite (o non sono utilizzabili) dopo la migrazione della piattaforma. Non è una sync rotta — incolla credenziali nuove, Salva, poi Prova connessione prima di mettere in coda una sync.", "storeReconnect.channelFallback": "Negozio", - "storeReconnect.askAdmin": "Chiedi a un amministratore dell’azienda di riconnettere — solo gli amministratori possono salvare le credenziali del negozio.", + "storeReconnect.askAdmin": "Chiedi a un amministratore dell’azienda di riconnettere — solo gli amministratori possono salvare le credenziali del negozio.", "storeReconnect.reconnectItem": "Riconnetti {label}", "admin.storeReconnect.channel.other": "Other", "admin.storeReconnect.channel.woocommerce": "WooCommerce", @@ -5556,7 +5557,7 @@ export const it: MessageDict = { "admin.storeReconnect.listTitle": "Connected but invalid", "admin.storeReconnect.metric.showing": "Rows shown", "admin.storeReconnect.metric.total": "Gaps total", - "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", + "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", "admin.storeReconnect.loadFailed": "Could not load store reconnect inventory.", "admin.storeReconnect.refresh": "Refresh", "admin.storeReconnect.description": "Companies with a connected store identity but missing or unusable API credentials (cutover credential gaps).", @@ -5564,23 +5565,23 @@ export const it: MessageDict = { "admin.nav.storeReconnect": "Store reconnect", "storeReconnect.wizardHint": "Prefer a step-by-step flow? Open Guided setup (/stores/wizard), or reconnect the channel below and Test Connection before syncing.", "storeReconnect.wizardLabel": "Guided setup", - "storeReconnect.reviewsHint": "L’import recensioni non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", - "storeReconnect.ordersHint": "L’import ordini non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", - "productSync.directionTitle": "Prodotti: Descrybe → negozio", - "productSync.outbound": "Descrybe → {channel}", - "productSync.outboundBody": "— invia i prodotti Descrybe elaborati al negozio (crea o aggiorna i prodotti remoti corrispondenti). Non importa il catalogo del negozio in Descrybe.", + "storeReconnect.reviewsHint": "L’import recensioni non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", + "storeReconnect.ordersHint": "L’import ordini non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", + "productSync.directionTitle": "Prodotti: Descrybe → negozio", + "productSync.outbound": "Descrybe → {channel}", + "productSync.outboundBody": "— invia i prodotti Descrybe elaborati al negozio (crea o aggiorna i prodotti remoti corrispondenti). Non importa il catalogo del negozio in Descrybe.", "productSync.firstSync": "Prima sync", - "productSync.firstSyncBody": "— i prodotti senza corrispondenza vengono creati in {channel}. Le sync successive aggiornano i prodotti già collegati per id o strategia di match.", + "productSync.firstSyncBody": "— i prodotti senza corrispondenza vengono creati in {channel}. Le sync successive aggiornano i prodotti già collegati per id o strategia di match.", "productSync.reSync": "Ri-sincronizza", - "productSync.reSyncBody": "— i prodotti remoti corrispondenti possono essere sovrascritti con il contenuto Descrybe ({count} collegati finora).", + "productSync.reSyncBody": "— i prodotti remoti corrispondenti possono essere sovrascritti con il contenuto Descrybe ({count} collegati finora).", "productSync.queued": "Sync prodotti in coda", - "productSync.live.queued": "In coda — in attesa del worker", + "productSync.live.queued": "In coda — in attesa del worker", "productSync.live.running": "Sincronizzazione in corso", - "productSync.live.watching": "Monitoraggio stato… i conteggi appaiono a fine esecuzione.", - "productSync.live.success": "Sync completata: {total} totali · {created} creati · {updated} aggiornati · {failed} falliti · {skipped} saltati", - "productSync.live.partial": "Sync con alcuni errori: {total} totali · {created} creati · {updated} aggiornati · {failed} falliti · {skipped} saltati", + "productSync.live.watching": "Monitoraggio stato… i conteggi appaiono a fine esecuzione.", + "productSync.live.success": "Sync completata: {total} totali · {created} creati · {updated} aggiornati · {failed} falliti · {skipped} saltati", + "productSync.live.partial": "Sync con alcuni errori: {total} totali · {created} creati · {updated} aggiornati · {failed} falliti · {skipped} saltati", "productSync.live.failed": "Sync non riuscita{detail}.", - "productSync.live.timedOut": "Ancora in corso — aggiorna più tardi per stato e conteggi finali.", + "productSync.live.timedOut": "Ancora in corso — aggiorna più tardi per stato e conteggi finali.", "productSync.live.ordersSuccess": "Sync ordini completata ({status}).", "productSync.live.reviewsSuccess": "Sync recensioni completata ({status}).", "productSync.retry": "Riprova sync", @@ -5588,12 +5589,12 @@ export const it: MessageDict = { "productSync.dryRun": "Simulazione", "productSync.lastSyncAt": "Ultima sync prodotti: {date}", "productSync.noneYet": "Nessuna sync prodotti ancora completata.", - "productSync.lastRun": "Ultima esecuzione: {total} totali · {created} creati · {updated} aggiornati · {failed} non riusciti · {skipped} saltati", - "productSync.needsReconnect": "La sync prodotti non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", + "productSync.lastRun": "Ultima esecuzione: {total} totali · {created} creati · {updated} aggiornati · {failed} non riusciti · {skipped} saltati", + "productSync.needsReconnect": "La sync prodotti non può avviarsi finché le credenziali non sono riconnesse dopo la migrazione. Nella scheda Connessione: Salva, poi Testa connessione.", "productSync.scheduleTitle": "Automatic product sync schedule", "productSync.scheduleHelp": "Come gli intervalli dei feed: imposta quanto spesso Descrybe invia i prodotti al negozio, o metti in pausa la pianificazione. La coda manuale resta disponibile. I webhook del negozio non sono usati: solo polling/coda.", "productSync.scheduleInterval": "Intervallo sync (ore)", - "productSync.scheduleIntervalHint": "1–168 ore. Il predefinito è 6 ore se non impostato sul server.", + "productSync.scheduleIntervalHint": "1–168 ore. Il predefinito è 6 ore se non impostato sul server.", "productSync.schedulePause": "Metti in pausa la sync automatica", "productSync.schedulePauseHint": "Ferma solo gli invii pianificati. Puoi ancora mettere in coda una sync prodotti manualmente.", "productSync.scheduleSave": "Save schedule", @@ -5605,9 +5606,9 @@ export const it: MessageDict = { "productSync.scheduleNeedsConfig": "Save store connection first", "productSync.scheduleAdminOnly": "Company admin required", "productSync.delivery.title": "Aggiornamenti via polling, non webhook del negozio", - "productSync.delivery.body": "Descrybe non riceve webhook Shopify o WooCommerce. I push prodotti partono quando li metti in coda o secondo la pianificazione automatica. Questa pagina segue l’avanzamento interrogando lo stato della connessione — non tramite eventi push live dal negozio.", + "productSync.delivery.body": "Descrybe non riceve webhook Shopify o WooCommerce. I push prodotti partono quando li metti in coda o secondo la pianificazione automatica. Questa pagina segue l’avanzamento interrogando lo stato della connessione — non tramite eventi push live dal negozio.", "productSync.delivery.inboundNote": "Ordini e recensioni usano anche pull in coda (pianificati o manuali), non webhook live.", - "productSync.delivery.hubNote": "I connettori negozio sincronizzano su pianificazione o quando metti in coda un job — non tramite webhook live del negozio.", + "productSync.delivery.hubNote": "I connettori negozio sincronizzano su pianificazione o quando metti in coda un job — non tramite webhook live del negozio.", "productSync.delivery.badge.manual": "Coda manuale", "productSync.delivery.badge.scheduled": "Pianificato ogni {hours} h", "productSync.delivery.badge.scheduledDefault": "Pianificato (default server)", @@ -5627,20 +5628,20 @@ export const it: MessageDict = { "productSync.scope.products": "Specific products", "productSync.scope.productsHint": "Optional. Search and select processed products to push only those.", "productSync.scope.productsOverrideHint": "Selected products override status, category, and max-products filters for this sync.", - "productSync.scope.productsSearch": "Search products…", - "productSync.scope.productsLoading": "Loading products…", + "productSync.scope.productsSearch": "Search products…", + "productSync.scope.productsLoading": "Loading products…", "productSync.scope.productsEmpty": "No processed products found.", "productSync.scope.productsSelected": "{count} selected", "productSync.scope.productsSelectedList": "Selected products", "productSync.scope.productsClear": "Clear selection", "productSync.scope.productsMax": "Maximum {max} products", - "store.syncingLive": "Sincronizzazione…", + "store.syncingLive": "Sincronizzazione…", "files.recentUploads": "Caricamenti recenti", "files.colFileName": "Nome file", "files.colKind": "Tipo", "files.colUploaded": "Caricato", "files.colRows": "Righe", - "files.loading": "Caricamento upload…", + "files.loading": "Caricamento upload…", "files.empty": "Nessun caricamento ancora.", "products.filters.sortProducts": "Ordina prodotti", "products.table.options": "Opzioni", diff --git a/apps/web/src/lib/i18n/messages/ja.ts b/apps/web/src/lib/i18n/messages/ja.ts index 635be83..389e517 100644 --- a/apps/web/src/lib/i18n/messages/ja.ts +++ b/apps/web/src/lib/i18n/messages/ja.ts @@ -1,486 +1,486 @@ -import type { MessageDict } from "./types"; +import type { MessageDict } from "./types"; -/** Japanese (ja) UI pack — keys must stay in sync with en.ts. */ +/** Japanese (ja) UI pack — keys must stay in sync with en.ts. */ export const ja: MessageDict = { "app.name": "Descrybe", - "app.home": "Descrybeホーム", - "common.cancel": "キャンセル", - "common.save": "変更を保存", - "common.saveShort": "保存", - "common.continue": "続ける", - "common.open": "開く", - "common.markDone": "完了にする", - "common.viewAll": "すべて表示", - "common.close": "閉じる", - "common.askAdmin": "会社の管理者に問い合わせる", - "common.you": "あなた", - "common.active": "有効", - "common.pending": "保留中", - "common.email": "メール", - "common.password": "パスワード", - "common.name": "お名前", - "common.viewPricing": "料金を見る", - "common.backToSignIn": "ログインに戻る", - "common.signingOut": "ログアウト中…", - "common.signOutAndContinue": "ログアウトして続行", - "common.staySignedIn": "ログインしたままにする", - "a11y.skipToContent": "コンテンツへスキップ", - "theme.switchToDark": "ダークテーマに切り替え", - "theme.switchToLight": "ライトテーマに切り替え", - "header.signOut": "ログアウト", - "header.signingOut": "ログアウト中…", - "status.emDash": "—", - "status.pending": "保留中", - "status.processing": "処理中", - "status.completed": "完了", - "status.failed": "失敗", - "status.cancelled": "キャンセル済み", - "nav.section.overview": "概要", - "nav.section.catalog": "カタログ", + "app.home": "Descrybeホーム", + "common.cancel": "キャンセル", + "common.save": "変更を保存", + "common.saveShort": "保存", + "common.continue": "続ける", + "common.open": "開く", + "common.markDone": "完了にする", + "common.viewAll": "すべて表示", + "common.close": "閉じる", + "common.askAdmin": "会社の管理者に問い合わせる", + "common.you": "あなた", + "common.active": "有効", + "common.pending": "保留中", + "common.email": "メール", + "common.password": "パスワード", + "common.name": "お名前", + "common.viewPricing": "料金を見る", + "common.backToSignIn": "ログインに戻る", + "common.signingOut": "ログアウト中…", + "common.signOutAndContinue": "ログアウトして続行", + "common.staySignedIn": "ログインしたままにする", + "a11y.skipToContent": "コンテンツへスキップ", + "theme.switchToDark": "ダークテーマに切り替え", + "theme.switchToLight": "ライトテーマに切り替え", + "header.signOut": "ログアウト", + "header.signingOut": "ログアウト中…", + "status.emDash": "—", + "status.pending": "保留中", + "status.processing": "処理中", + "status.completed": "完了", + "status.failed": "失敗", + "status.cancelled": "キャンセル済み", + "nav.section.overview": "概要", + "nav.section.catalog": "カタログ", "nav.section.feeds": "Feeds", - "nav.section.stores": "ストア", - "nav.section.processing": "処理中", - "nav.section.marketing": "マーケティング", - "nav.section.integrations": "連携", - "nav.section.account": "アカウント", - "nav.section.platform": "プラットフォーム", - "nav.dashboard": "ダッシュボード", - "nav.products": "商品", - "nav.categories": "カテゴリ", - "nav.attributes": "属性", - "nav.fields": "フィールド", + "nav.section.stores": "ストア", + "nav.section.processing": "処理中", + "nav.section.marketing": "マーケティング", + "nav.section.integrations": "連携", + "nav.section.account": "アカウント", + "nav.section.platform": "プラットフォーム", + "nav.dashboard": "ダッシュボード", + "nav.products": "商品", + "nav.categories": "カテゴリ", + "nav.attributes": "属性", + "nav.fields": "フィールド", "nav.feeds": "Feeds", - "nav.exports": "エクスポート", - "nav.stores": "ストア", - "nav.jobs": "ジョブ", - "nav.campaigns": "キャンペーン", - "nav.calendar": "カレンダー", + "nav.exports": "エクスポート", + "nav.stores": "ストア", + "nav.jobs": "ジョブ", + "nav.campaigns": "キャンペーン", + "nav.calendar": "カレンダー", "nav.seo": "SEO", - "nav.brand": "ブランド", - "nav.reviews": "レビュー", + "nav.brand": "ブランド", + "nav.reviews": "レビュー", "nav.ai": "AI", - "nav.email": "メール", - "nav.billing": "請求", - "nav.settings": "設定", - "nav.support": "サポート", - "nav.admin": "管理", - "nav.main": "メインナビゲーション", - "nav.sidebar": "アプリのサイドバー", - "nav.close": "ナビゲーションを閉じる", - "nav.closeMenu": "メニューを閉じる", - "nav.open": "ナビゲーションを開く", - "nav.commandPalette": "ページを検索", - "nav.commandPaletteLabel": "検索", - "auth.login.title": "ログイン", - "auth.login.description": "Descrybeのメールアドレスとパスワードを使用してください。", - "auth.login.submit": "ログイン", - "auth.login.submitting": "ログイン中…", - "auth.login.failed": "ログインに失敗しました", - "auth.login.passwordNotSet": "このアカウントにはまだパスワードが必要です。招待リンクを開くか、管理者に再発行を依頼してください。", - "auth.login.setPasswordFirstTitle": "先にパスワードを設定:", - "auth.login.setPasswordFirstBody": "メールの招待リンクを使用してください。リンクが古いアドレスに送られた場合(メール変更)、会社の管理者に {email} 向けのパスワード設定招待の再発行を依頼してください。", - "auth.login.yourEmail": "あなたのメール", - "auth.login.platformAdminsReissue": "プラットフォーム管理者は次から再発行できます:", - "auth.login.adminUsersLink": "管理 → ユーザー", - "auth.login.haveToken": "トークンがありますか?招待の承認を開く", - "auth.login.noAccount": "アカウントがありませんか?", - "auth.login.createCompany": "会社を作成", - "auth.login.haveInvite": "招待またはパスワード設定リンクがありますか?", - "auth.login.acceptInvite": "招待を承認", - "auth.login.forgotPassword": "パスワードをお忘れですか?", - "auth.login.forgotPasswordHelp": "リセットページでメールアドレスを入力してください。パスワード未設定の場合は招待/設定リンクを使用してください。", - "auth.forgot.title": "パスワードを忘れた場合", - "auth.forgot.description": "アカウントのメールアドレスを入力してください。有効なアカウントと一致する場合、リセットリンクを送信します。", - "auth.forgot.submit": "リセットリンクを送信", - "auth.forgot.submitting": "送信中…", - "auth.forgot.failed": "リセットをリクエストできませんでした", - "auth.forgot.sentTitle": "メールを確認してください", - "auth.forgot.sentBody": "そのアドレスのアカウントがある場合、リセットリンクを送信しています。リンクは1時間で期限切れになります。", - "auth.forgot.backToSignIn": "サインインに戻る", - "auth.reset.title": "パスワードをリセット", - "auth.reset.description": "Descrybeアカウントの新しいパスワードを選んでください(8文字以上)。", - "auth.reset.submit": "新しいパスワードを保存", - "auth.reset.submitting": "保存中…", - "auth.reset.failed": "パスワードをリセットできませんでした", - "auth.reset.doneTitle": "パスワードを更新しました", - "auth.reset.doneDescription": "メールと新しいパスワードでサインインしてください。", - "auth.reset.goToSignIn": "サインインへ", - "auth.reset.passwordConfirm": "パスワードの確認", - "auth.reset.passwordMismatch": "パスワードが一致しません", - "auth.reset.missingTitle": "リセットリンクがありません", - "auth.reset.missingDescription": "メールのリンクを開いて新しいパスワードを設定してください。", - "auth.reset.requestNewLink": "新しいリセットリンクをリクエスト", - "auth.reset.tokenMissing": "リセットリンクが指定されていません。メールのリンクを使うか、新しいリンクをリクエストしてください。", - "auth.reset.tokenInvalid": "このリセットリンクは無効か期限切れです。パスワードを忘れたページから新しいリンクをリクエストしてください。", - "auth.reset.linkRecognized": "リセットリンクを認識しました。下に新しいパスワードを入力してください — このページにシークレットは表示されません。", - "auth.reset.tokenLabel": "リセットトークン", - "auth.reset.passwordHint": "8文字以上。その他の複雑さルールはありません。", - "auth.register.title": "会社を作成", - "auth.register.description": "会社とその管理者ユーザーを登録します。", - "auth.register.companyName": "会社名", - "auth.register.submit": "アカウントを作成", - "auth.register.submitting": "作成中…", - "auth.register.failed": "登録に失敗しました", - "auth.register.haveAccount": "すでにアカウントをお持ちですか?", - "auth.register.signIn": "ログイン", - "auth.invite.title": "招待を承認", - "auth.invite.setPasswordTitle": "パスワードを設定", - "auth.invite.description": "会社に参加するにはパスワードを設定してください。管理者はメンバー(日常業務)または管理者(チームと請求)のいずれかを割り当てています。", - "auth.invite.setPasswordDescription": "移行されたDescrybeアカウント用のパスワードを選んでください(8文字以上)。", - "auth.invite.checking": "招待を確認中…", - "auth.invite.forEmail": "{email} 宛の招待です。", - "auth.invite.linkRecognized": "招待リンクを認識しました。続行するには下にパスワードを入力してください — このページにシークレットは表示されません。", - "auth.invite.resetLinkRecognized": "リセットリンクを認識しました。続行するには下にパスワードを入力してください — このページにシークレットは表示されません。", - "auth.invite.tokenLabel": "招待トークン", - "auth.invite.resetTokenLabel": "リセットトークン", - "auth.invite.tokenHelp": "招待メールのトークンを貼り付けてください。このフィールドではマスク表示されます。", - "auth.invite.passwordHint": "8文字以上。その他の複雑さの規則はありません。", - "auth.invite.submit": "招待を承認", - "auth.invite.setPasswordSubmit": "パスワードを設定", - "auth.invite.accepting": "承認中…", - "auth.invite.saving": "保存中…", - "auth.invite.verifyFailed": "招待を確認できませんでした", - "auth.invite.verifySetPasswordFailed": "パスワード設定リンクを確認できませんでした", - "auth.invite.acceptFailed": "招待を承認できませんでした", - "auth.invite.setPasswordFailed": "パスワードを設定できませんでした", - "auth.invite.expired": "この招待は無効または期限切れです。会社の管理者に新しい招待の送信を依頼し、新しいリンクを開くか(下に新しいトークンを貼り付けてください)。", - "auth.invite.setPasswordExpired": "このパスワード設定リンクは無効または期限切れです。会社またはプラットフォームの管理者に再発行を依頼し、新しいリンクを開くか(下に新しいトークンを貼り付けてください)。", - "auth.invite.emailMismatchDefault": "この招待とは別のメールアドレスでログインしています。", - "auth.invite.expiredFooter": "期限切れのリンクですか?管理者に再発行を依頼してください — セルフサービスの再送信APIはありません。プラットフォーム管理者:", - "auth.invite.adminUsersLink": "管理 → ユーザー", - "auth.invite.doneTitle": "チームに参加しました", - "auth.invite.doneSetPasswordTitle": "パスワードを保存しました", - "auth.invite.doneDescription": "アカウントの準備ができました。次にダッシュボードを開いてフィードや商品を扱うか、会社の設定を確認してください。", - "auth.invite.doneSetPasswordDescription": "メールと新しいパスワードでログインしてワークスペースを開いてください。", - "auth.invite.openDashboard": "ダッシュボードを開く", - "auth.invite.companySettings": "会社の設定", - "auth.invite.goToSignIn": "ログインへ", - "auth.invite.afterSignInNote": "ログイン後はワークスペースに入ります — 初期セットアップツアーはスキップされます。", - "auth.invite.mismatchTitle": "この招待には別のアカウントが必要です", - "auth.invite.mismatchDescription": "このリンクは、現在ログイン中のメールとは別のアドレス宛です。招待されたユーザーとして続行するにはログアウトするか、ログインしたまま管理者に招待の再発行を依頼してください。", - "auth.invite.mismatchDetail": "{session} でログイン中ですが、この招待は {invite} 宛です。", - "auth.invite.mismatchFallback": "ログイン中のメールがこの招待と一致しません。", - "auth.invite.switchAccountTitle": "アカウント切替:", - "auth.invite.switchAccountBody": "ログアウトしてから、招待されたメール{emailSuffix}でこのフォームを完了してください。", - "auth.invite.reissueTitle": "再発行の手順:", - "auth.invite.reissueBody": "実際のログイン用メールが変わった場合(メール変更)、会社の管理者にこの招待の取り消しと、ログインに使うメールへの新しい招待送信を依頼してください。プラットフォーム管理者は「管理 → ユーザー」からパスワード設定リンクも再発行できます。", - "locale.switcher": "インターフェース言語", - "locale.menu": "インターフェース言語を選択", - "locale.label": "ダッシュボードの言語", - "locale.help": "ナビゲーションと設定のラベルを変更します。生成コンテンツの言語は会社設定で別途指定します。", - "settings.contentLanguage": "コンテンツ言語", - "settings.contentLanguageHelp": "商品タイトル・説明・その他の生成コンテンツに使う言語", - "settings.tab.profile": "プロフィール", - "settings.tab.company": "会社", - "settings.tab.alerts": "アラート", - "settings.tab.apiKeys": "APIキー", - "settings.tab.team": "チーム", - "settings.title": "設定", - "settings.description": "アカウント、会社、APIキー、チーム。", - "settings.accessDenied": "会社の設定を開く権限がありません。会社の管理者に問い合わせてください。", - "settings.loadFailed": "設定の読み込みに失敗しました", - "settings.profileHeading": "プロフィール", - "settings.personalInfo": "個人情報", - "settings.personalInfoHelp": "個人情報を更新", - "settings.firstName": "名", - "settings.firstNamePlaceholder": "名", - "settings.lastName": "姓", - "settings.lastNamePlaceholder": "姓", - "settings.email": "メール", - "settings.profileUpdated": "プロフィールを更新しました。", - "settings.profileUpdateFailed": "プロフィールを更新できませんでした", - "settings.role.member": "メンバー", - "settings.role.admin": "管理", - "settings.teamHeading": "チームメンバー", - "settings.inviteUser": "ユーザーを招待", - "settings.teamAdminOnly": "同僚の招待、昇格、降格、削除ができるのは会社の管理者のみです。", - "settings.shareAcceptLink": "承認リンクを共有", - "settings.shareAcceptLinkHelp": "送信メールが設定されていません。この一回限りのリンクをコピーして招待者に送ってください。パスワード(8文字以上)を設定し、選択したロールで参加します。", - "settings.acceptLinkLabel": "一回限りの招待承認リンク", - "settings.copyLink": "リンクをコピー", - "settings.linkCopied": "承認リンクをコピーしました。", - "settings.table.email": "メール", - "settings.table.role": "ロール", - "settings.table.status": "ステータス", - "settings.table.joined": "参加 / 期限", - "settings.table.actions": "操作", - "settings.teamForbidden": "チーム一覧を表示する権限がありません。会社の管理者に問い合わせてください。", - "settings.noTeammates": "まだチームメンバーがいません", - "settings.noTeammatesHelp": "同僚をメンバー(商品とフィード)または管理者(チームと会社設定)として招待します。未承認の招待はここに表示されます。", - "settings.noTeammatesMemberHelp": "まだチームメンバーが一覧にありません。会社の管理者に招待の送信を依頼してください。", - "settings.memberActions": "メンバーの操作", - "settings.makeAdmin": "管理者にする", - "settings.makeMember": "メンバーにする", - "settings.removeMember": "削除", - "settings.revokeInvite": "招待を取り消す", - "settings.needOneAdmin": "会社には少なくとも1人の管理者が必要です", - "settings.expires": "{date} に期限切れ", - "settings.invalidEmail": "有効なメールアドレスを入力してください。", - "settings.inviteCreatedNoMail": "{email} を {role} として招待を作成しました。下の承認リンクをコピーして共有してください — 送信メールは設定されていません。", - "settings.inviteSent": "{email} に {role} として招待を送信しました。期限前にメールを開いて承認してください。", - "settings.inviteFailed": "招待を送信できませんでした", - "settings.revokeConfirm": "この招待を取り消しますか?", - "settings.revoked": "招待を取り消しました。", - "settings.revokeFailed": "招待を取り消せませんでした", - "settings.removeConfirm": "{email} をこの会社から削除しますか?", - "settings.memberRemoved": "{email} を削除しました。", - "settings.removeFailed": "ユーザーを削除できませんでした", - "settings.roleChangeConfirm": "{email} を {role} に{action}しますか?", - "settings.roleChanged": "{email} は現在 {role} です。", - "settings.roleChangeFailed": "ロールを更新できませんでした", - "settings.promote": "昇格", - "settings.demote": "降格", - "settings.inviteTitle": "チームメイトを招待", - "settings.inviteDescription": "パスワード(8文字以上)を設定してこの会社に参加するためのリンクが届きます。", - "settings.inviteEmail": "メール", + "nav.email": "メール", + "nav.billing": "請求", + "nav.settings": "設定", + "nav.support": "サポート", + "nav.admin": "管理", + "nav.main": "メインナビゲーション", + "nav.sidebar": "アプリのサイドバー", + "nav.close": "ナビゲーションを閉じる", + "nav.closeMenu": "メニューを閉じる", + "nav.open": "ナビゲーションを開く", + "nav.commandPalette": "ページを検索", + "nav.commandPaletteLabel": "検索", + "auth.login.title": "ログイン", + "auth.login.description": "Descrybeのメールアドレスとパスワードを使用してください。", + "auth.login.submit": "ログイン", + "auth.login.submitting": "ログイン中…", + "auth.login.failed": "ログインに失敗しました", + "auth.login.passwordNotSet": "このアカウントにはまだパスワードが必要です。招待リンクを開くか、管理者に再発行を依頼してください。", + "auth.login.setPasswordFirstTitle": "先にパスワードを設定:", + "auth.login.setPasswordFirstBody": "メールの招待リンクを使用してください。リンクが古いアドレスに送られた場合(メール変更)、会社の管理者に {email} 向けのパスワード設定招待の再発行を依頼してください。", + "auth.login.yourEmail": "あなたのメール", + "auth.login.platformAdminsReissue": "プラットフォーム管理者は次から再発行できます:", + "auth.login.adminUsersLink": "管理 → ユーザー", + "auth.login.haveToken": "トークンがありますか?招待の承認を開く", + "auth.login.noAccount": "アカウントがありませんか?", + "auth.login.createCompany": "会社を作成", + "auth.login.haveInvite": "招待またはパスワード設定リンクがありますか?", + "auth.login.acceptInvite": "招待を承認", + "auth.login.forgotPassword": "パスワードをお忘れですか?", + "auth.login.forgotPasswordHelp": "リセットページでメールアドレスを入力してください。パスワード未設定の場合は招待/設定リンクを使用してください。", + "auth.forgot.title": "パスワードを忘れた場合", + "auth.forgot.description": "アカウントのメールアドレスを入力してください。有効なアカウントと一致する場合、リセットリンクを送信します。", + "auth.forgot.submit": "リセットリンクを送信", + "auth.forgot.submitting": "送信中…", + "auth.forgot.failed": "リセットをリクエストできませんでした", + "auth.forgot.sentTitle": "メールを確認してください", + "auth.forgot.sentBody": "そのアドレスのアカウントがある場合、リセットリンクを送信しています。リンクは1時間で期限切れになります。", + "auth.forgot.backToSignIn": "サインインに戻る", + "auth.reset.title": "パスワードをリセット", + "auth.reset.description": "Descrybeアカウントの新しいパスワードを選んでください(8文字以上)。", + "auth.reset.submit": "新しいパスワードを保存", + "auth.reset.submitting": "保存中…", + "auth.reset.failed": "パスワードをリセットできませんでした", + "auth.reset.doneTitle": "パスワードを更新しました", + "auth.reset.doneDescription": "メールと新しいパスワードでサインインしてください。", + "auth.reset.goToSignIn": "サインインへ", + "auth.reset.passwordConfirm": "パスワードの確認", + "auth.reset.passwordMismatch": "パスワードが一致しません", + "auth.reset.missingTitle": "リセットリンクがありません", + "auth.reset.missingDescription": "メールのリンクを開いて新しいパスワードを設定してください。", + "auth.reset.requestNewLink": "新しいリセットリンクをリクエスト", + "auth.reset.tokenMissing": "リセットリンクが指定されていません。メールのリンクを使うか、新しいリンクをリクエストしてください。", + "auth.reset.tokenInvalid": "このリセットリンクは無効か期限切れです。パスワードを忘れたページから新しいリンクをリクエストしてください。", + "auth.reset.linkRecognized": "リセットリンクを認識しました。下に新しいパスワードを入力してください — このページにシークレットは表示されません。", + "auth.reset.tokenLabel": "リセットトークン", + "auth.reset.passwordHint": "8文字以上。その他の複雑さルールはありません。", + "auth.register.title": "会社を作成", + "auth.register.description": "会社とその管理者ユーザーを登録します。", + "auth.register.companyName": "会社名", + "auth.register.submit": "アカウントを作成", + "auth.register.submitting": "作成中…", + "auth.register.failed": "登録に失敗しました", + "auth.register.haveAccount": "すでにアカウントをお持ちですか?", + "auth.register.signIn": "ログイン", + "auth.invite.title": "招待を承認", + "auth.invite.setPasswordTitle": "パスワードを設定", + "auth.invite.description": "会社に参加するにはパスワードを設定してください。管理者はメンバー(日常業務)または管理者(チームと請求)のいずれかを割り当てています。", + "auth.invite.setPasswordDescription": "移行されたDescrybeアカウント用のパスワードを選んでください(8文字以上)。", + "auth.invite.checking": "招待を確認中…", + "auth.invite.forEmail": "{email} 宛の招待です。", + "auth.invite.linkRecognized": "招待リンクを認識しました。続行するには下にパスワードを入力してください — このページにシークレットは表示されません。", + "auth.invite.resetLinkRecognized": "リセットリンクを認識しました。続行するには下にパスワードを入力してください — このページにシークレットは表示されません。", + "auth.invite.tokenLabel": "招待トークン", + "auth.invite.resetTokenLabel": "リセットトークン", + "auth.invite.tokenHelp": "招待メールのトークンを貼り付けてください。このフィールドではマスク表示されます。", + "auth.invite.passwordHint": "8文字以上。その他の複雑さの規則はありません。", + "auth.invite.submit": "招待を承認", + "auth.invite.setPasswordSubmit": "パスワードを設定", + "auth.invite.accepting": "承認中…", + "auth.invite.saving": "保存中…", + "auth.invite.verifyFailed": "招待を確認できませんでした", + "auth.invite.verifySetPasswordFailed": "パスワード設定リンクを確認できませんでした", + "auth.invite.acceptFailed": "招待を承認できませんでした", + "auth.invite.setPasswordFailed": "パスワードを設定できませんでした", + "auth.invite.expired": "この招待は無効または期限切れです。会社の管理者に新しい招待の送信を依頼し、新しいリンクを開くか(下に新しいトークンを貼り付けてください)。", + "auth.invite.setPasswordExpired": "このパスワード設定リンクは無効または期限切れです。会社またはプラットフォームの管理者に再発行を依頼し、新しいリンクを開くか(下に新しいトークンを貼り付けてください)。", + "auth.invite.emailMismatchDefault": "この招待とは別のメールアドレスでログインしています。", + "auth.invite.expiredFooter": "期限切れのリンクですか?管理者に再発行を依頼してください — セルフサービスの再送信APIはありません。プラットフォーム管理者:", + "auth.invite.adminUsersLink": "管理 → ユーザー", + "auth.invite.doneTitle": "チームに参加しました", + "auth.invite.doneSetPasswordTitle": "パスワードを保存しました", + "auth.invite.doneDescription": "アカウントの準備ができました。次にダッシュボードを開いてフィードや商品を扱うか、会社の設定を確認してください。", + "auth.invite.doneSetPasswordDescription": "メールと新しいパスワードでログインしてワークスペースを開いてください。", + "auth.invite.openDashboard": "ダッシュボードを開く", + "auth.invite.companySettings": "会社の設定", + "auth.invite.goToSignIn": "ログインへ", + "auth.invite.afterSignInNote": "ログイン後はワークスペースに入ります — 初期セットアップツアーはスキップされます。", + "auth.invite.mismatchTitle": "この招待には別のアカウントが必要です", + "auth.invite.mismatchDescription": "このリンクは、現在ログイン中のメールとは別のアドレス宛です。招待されたユーザーとして続行するにはログアウトするか、ログインしたまま管理者に招待の再発行を依頼してください。", + "auth.invite.mismatchDetail": "{session} でログイン中ですが、この招待は {invite} 宛です。", + "auth.invite.mismatchFallback": "ログイン中のメールがこの招待と一致しません。", + "auth.invite.switchAccountTitle": "アカウント切替:", + "auth.invite.switchAccountBody": "ログアウトしてから、招待されたメール{emailSuffix}でこのフォームを完了してください。", + "auth.invite.reissueTitle": "再発行の手順:", + "auth.invite.reissueBody": "実際のログイン用メールが変わった場合(メール変更)、会社の管理者にこの招待の取り消しと、ログインに使うメールへの新しい招待送信を依頼してください。プラットフォーム管理者は「管理 → ユーザー」からパスワード設定リンクも再発行できます。", + "locale.switcher": "インターフェース言語", + "locale.menu": "インターフェース言語を選択", + "locale.label": "ダッシュボードの言語", + "locale.help": "ナビゲーションと設定のラベルを変更します。生成コンテンツの言語は会社設定で別途指定します。", + "settings.contentLanguage": "コンテンツ言語", + "settings.contentLanguageHelp": "商品タイトル・説明・その他の生成コンテンツに使う言語", + "settings.tab.profile": "プロフィール", + "settings.tab.company": "会社", + "settings.tab.alerts": "アラート", + "settings.tab.apiKeys": "APIキー", + "settings.tab.team": "チーム", + "settings.title": "設定", + "settings.description": "アカウント、会社、APIキー、チーム。", + "settings.accessDenied": "会社の設定を開く権限がありません。会社の管理者に問い合わせてください。", + "settings.loadFailed": "設定の読み込みに失敗しました", + "settings.profileHeading": "プロフィール", + "settings.personalInfo": "個人情報", + "settings.personalInfoHelp": "個人情報を更新", + "settings.firstName": "名", + "settings.firstNamePlaceholder": "名", + "settings.lastName": "å§“", + "settings.lastNamePlaceholder": "å§“", + "settings.email": "メール", + "settings.profileUpdated": "プロフィールを更新しました。", + "settings.profileUpdateFailed": "プロフィールを更新できませんでした", + "settings.role.member": "メンバー", + "settings.role.admin": "管理", + "settings.teamHeading": "チームメンバー", + "settings.inviteUser": "ユーザーを招待", + "settings.teamAdminOnly": "同僚の招待、昇格、降格、削除ができるのは会社の管理者のみです。", + "settings.shareAcceptLink": "承認リンクを共有", + "settings.shareAcceptLinkHelp": "送信メールが設定されていません。この一回限りのリンクをコピーして招待者に送ってください。パスワード(8文字以上)を設定し、選択したロールで参加します。", + "settings.acceptLinkLabel": "一回限りの招待承認リンク", + "settings.copyLink": "リンクをコピー", + "settings.linkCopied": "承認リンクをコピーしました。", + "settings.table.email": "メール", + "settings.table.role": "ロール", + "settings.table.status": "ステータス", + "settings.table.joined": "参加 / 期限", + "settings.table.actions": "操作", + "settings.teamForbidden": "チーム一覧を表示する権限がありません。会社の管理者に問い合わせてください。", + "settings.noTeammates": "まだチームメンバーがいません", + "settings.noTeammatesHelp": "同僚をメンバー(商品とフィード)または管理者(チームと会社設定)として招待します。未承認の招待はここに表示されます。", + "settings.noTeammatesMemberHelp": "まだチームメンバーが一覧にありません。会社の管理者に招待の送信を依頼してください。", + "settings.memberActions": "メンバーの操作", + "settings.makeAdmin": "管理者にする", + "settings.makeMember": "メンバーにする", + "settings.removeMember": "削除", + "settings.revokeInvite": "招待を取り消す", + "settings.needOneAdmin": "会社には少なくとも1人の管理者が必要です", + "settings.expires": "{date} に期限切れ", + "settings.invalidEmail": "有効なメールアドレスを入力してください。", + "settings.inviteCreatedNoMail": "{email} ã‚’ {role} として招待を作成しました。下の承認リンクをコピーして共有してください — 送信メールは設定されていません。", + "settings.inviteSent": "{email} に {role} として招待を送信しました。期限前にメールを開いて承認してください。", + "settings.inviteFailed": "招待を送信できませんでした", + "settings.revokeConfirm": "この招待を取り消しますか?", + "settings.revoked": "招待を取り消しました。", + "settings.revokeFailed": "招待を取り消せませんでした", + "settings.removeConfirm": "{email} をこの会社から削除しますか?", + "settings.memberRemoved": "{email} を削除しました。", + "settings.removeFailed": "ユーザーを削除できませんでした", + "settings.roleChangeConfirm": "{email} ã‚’ {role} に{action}しますか?", + "settings.roleChanged": "{email} は現在 {role} です。", + "settings.roleChangeFailed": "ロールを更新できませんでした", + "settings.promote": "昇格", + "settings.demote": "降格", + "settings.inviteTitle": "チームメイトを招待", + "settings.inviteDescription": "パスワード(8文字以上)を設定してこの会社に参加するためのリンクが届きます。", + "settings.inviteEmail": "メール", "settings.inviteEmailPlaceholder": "taro@example.com", - "settings.inviteRole": "ロール", - "settings.inviteRoleHint": "メンバーは商品とフィードを管理します。管理者は同僚の招待と会社設定の変更もできます。", - "settings.sendInvite": "招待を送信", - "settings.companyHeading": "会社の設定", - "settings.activeCompany": "アクティブな会社", - "settings.creditsOverview": "クレジット概要", - "settings.plan": "プラン", - "settings.used": "使用済み", - "settings.companyInfo": "会社情報", - "settings.companyInfoHelp": "会社の詳細を更新", - "settings.companyName": "会社名", - "settings.companyNamePlaceholder": "会社名", - "settings.contentSettings": "コンテンツ設定", - "settings.mergeProducts": "同じGTINの商品をマージ", - "settings.emailIntegration": "メール連携", - "settings.aiIntegrations": "AI連携", - "settings.alertsHeading": "オペレーターアラート", - "settings.inAppToasts": "アプリ内トースト", - "settings.emailAlerts": "メールアラート", - "settings.apiKeysHeading": "APIキー", - "settings.createApiKey": "APIキーを作成", - "settings.createApiKeyShort": "APIキーを作成", - "settings.createApiKeyTitle": "APIキーを作成", - "settings.apiKeyLabel": "APIキー", - "settings.keyName": "キー名", - "settings.storeKeySafe": "安全な場所に保管してください — 完全なシークレットは再表示されません。", - "settings.apiKeysIntro": "公開 /api/v1 を呼び出すには会社の API キーを作成してください。完全なシークレットは作成時に一度だけ表示されます — すぐにコピーしてください。", - "settings.apiKeysUseWhere": "Authorization: Bearer (推奨)または X-API-Key として送信します。", - "settings.apiKeysDocsLink": "API 認証ドキュメント", - "settings.apiKeyOnceWarning": "完全なシークレットが表示されるのはこの一度だけです。このダイアログを閉じる前に今すぐコピーしてください。", - "settings.table.name": "名前", - "settings.table.key": "キー", - "settings.table.lastUsed": "最終使用", - "dashboard.demoSandbox": "デモサンドボックス", - "dashboard.demoEmptyTitle": "デモサンドボックスは空です", - "dashboard.demoEmptyHint": "デモサンドボックスは空です — A1に切り替えるかフィードを接続して実際のカタログ統計を表示します。", - "dashboard.overviewTitle": "概要", - "dashboard.quickLinks": "クイックリンク", - "dashboard.whatsNew": "新着情報", - "dashboard.startTutorial": "チュートリアルを開始", - "dashboard.resumeTutorial": "チュートリアルを再開", - "dashboard.restartTutorial": "チュートリアルを再開する", - "dashboard.tourTopics": "ツアーのトピック", - "dashboard.browseTutorialSections": "チュートリアルのセクションを見る", - "dashboard.connectFeed": "フィードを接続", - "dashboard.processProducts": "商品を処理", - "dashboard.openProducts": "商品を開く", - "dashboard.welcomeTo": "{name} へようこそ", - "dashboard.trialBadge": "トライアル", - "dashboard.actions": "ダッシュボードの操作", - "dashboard.emptyPaygHint": "Descrybeはカタログを取り込み、充実・処理し、エクスポートまたはストアへプッシュします。下の「はじめに」を使ってください。", - "dashboard.emptyCreditsHint": "Descrybeはカタログを取り込み、充実・処理し、エクスポートまたはストアへプッシュします。残り {credits} — 下の「はじめに」から開始してください。", - "dashboard.workflowTitle": "カタログワークフロー", - "dashboard.recentActivity": "最近のアクティビティ", - "dashboard.loadFailed": "ダッシュボードの読み込みに失敗しました", - "dashboard.workspaceFallback": "このワークスペース", - "dashboard.jobFallback": "ジョブ {id}", - "dashboard.workflow.feeds.connect": "ソースを接続", - "dashboard.workflow.feeds.sources": "{count}件のソース", - "dashboard.workflow.feeds.sourcesPlural": "{count}件のソース", - "dashboard.workflow.products.build": "カタログを構築", - "dashboard.workflow.products.count": "カタログ内 {count} 件", + "settings.inviteRole": "ロール", + "settings.inviteRoleHint": "メンバーは商品とフィードを管理します。管理者は同僚の招待と会社設定の変更もできます。", + "settings.sendInvite": "招待を送信", + "settings.companyHeading": "会社の設定", + "settings.activeCompany": "アクティブな会社", + "settings.creditsOverview": "クレジット概要", + "settings.plan": "プラン", + "settings.used": "使用済み", + "settings.companyInfo": "会社情報", + "settings.companyInfoHelp": "会社の詳細を更新", + "settings.companyName": "会社名", + "settings.companyNamePlaceholder": "会社名", + "settings.contentSettings": "コンテンツ設定", + "settings.mergeProducts": "同じGTINの商品をマージ", + "settings.emailIntegration": "メール連携", + "settings.aiIntegrations": "AI連携", + "settings.alertsHeading": "オペレーターアラート", + "settings.inAppToasts": "アプリ内トースト", + "settings.emailAlerts": "メールアラート", + "settings.apiKeysHeading": "APIキー", + "settings.createApiKey": "APIキーを作成", + "settings.createApiKeyShort": "APIキーを作成", + "settings.createApiKeyTitle": "APIキーを作成", + "settings.apiKeyLabel": "APIキー", + "settings.keyName": "キー名", + "settings.storeKeySafe": "安全な場所に保管してください — 完全なシークレットは再表示されません。", + "settings.apiKeysIntro": "公開 /api/v1 を呼び出すには会社の API キーを作成してください。完全なシークレットは作成時に一度だけ表示されます — すぐにコピーしてください。", + "settings.apiKeysUseWhere": "Authorization: Bearer (推奨)または X-API-Key として送信します。", + "settings.apiKeysDocsLink": "API 認証ドキュメント", + "settings.apiKeyOnceWarning": "完全なシークレットが表示されるのはこの一度だけです。このダイアログを閉じる前に今すぐコピーしてください。", + "settings.table.name": "名前", + "settings.table.key": "キー", + "settings.table.lastUsed": "最終使用", + "dashboard.demoSandbox": "デモサンドボックス", + "dashboard.demoEmptyTitle": "デモサンドボックスは空です", + "dashboard.demoEmptyHint": "デモサンドボックスは空です — A1に切り替えるかフィードを接続して実際のカタログ統計を表示します。", + "dashboard.overviewTitle": "概要", + "dashboard.quickLinks": "クイックリンク", + "dashboard.whatsNew": "新着情報", + "dashboard.startTutorial": "チュートリアルを開始", + "dashboard.resumeTutorial": "チュートリアルを再開", + "dashboard.restartTutorial": "チュートリアルを再開する", + "dashboard.tourTopics": "ツアーのトピック", + "dashboard.browseTutorialSections": "チュートリアルのセクションを見る", + "dashboard.connectFeed": "フィードを接続", + "dashboard.processProducts": "商品を処理", + "dashboard.openProducts": "商品を開く", + "dashboard.welcomeTo": "{name} へようこそ", + "dashboard.trialBadge": "トライアル", + "dashboard.actions": "ダッシュボードの操作", + "dashboard.emptyPaygHint": "Descrybeはカタログを取り込み、充実・処理し、エクスポートまたはストアへプッシュします。下の「はじめに」を使ってください。", + "dashboard.emptyCreditsHint": "Descrybeはカタログを取り込み、充実・処理し、エクスポートまたはストアへプッシュします。残り {credits} — 下の「はじめに」から開始してください。", + "dashboard.workflowTitle": "カタログワークフロー", + "dashboard.recentActivity": "最近のアクティビティ", + "dashboard.loadFailed": "ダッシュボードの読み込みに失敗しました", + "dashboard.workspaceFallback": "このワークスペース", + "dashboard.jobFallback": "ジョブ {id}", + "dashboard.workflow.feeds.connect": "ソースを接続", + "dashboard.workflow.feeds.sources": "{count}件のソース", + "dashboard.workflow.feeds.sourcesPlural": "{count}件のソース", + "dashboard.workflow.products.build": "カタログを構築", + "dashboard.workflow.products.count": "カタログ内 {count} ä»¶", "dashboard.workflow.map": "Map", - "dashboard.workflow.map.detail": "フィード追加後に列を対応付け", - "dashboard.workflow.map.ready": "フィードで Map を開く", + "dashboard.workflow.map.detail": "フィード追加後に列を対応付け", + "dashboard.workflow.map.ready": "フィードで Map を開く", "dashboard.workflow.sync": "Sync", - "dashboard.workflow.sync.detail": "マッピング後にサンプルを取得", - "dashboard.workflow.sync.ready": "サンプルを商品に同期", - "dashboard.workflow.process": "処理", - "dashboard.workflow.processActive": "アクティブ {count}", - "dashboard.workflow.processWaiting": "待機 {count}", - "dashboard.workflow.processDone": "完了 {count}", - "dashboard.workflow.processRun": "AIジョブを実行", - "dashboard.workflow.export": "エクスポート", - "dashboard.workflow.exportReady": "テンプレートとダウンロード", - "dashboard.workflow.exportMap": "マップしてエクスポート", - "dashboard.workflowHint": "カタログ取込 → 充実 / 処理 → エクスポートまたはストアへプッシュ。{name} の次のステップへ。", - "dashboard.overviewHint": "{name} のリアルタイム合計", - "dashboard.demoEmptyMessage": "ヘッダーでA1(または別のシード済み会社)に切り替えるか、ここでフィードを接続してサンドボックスにデータを入れます。", - "dashboard.emptyTitle": "カタログを取り込む", - "dashboard.emptyMessage": "カタログ取込 → 充実 / 処理 → エクスポートまたはストアへプッシュ。下の「はじめに」から開始(またはフィード接続 / CSVアップロード)。", - "dashboard.connectFeedAnyway": "それでもフィードを接続", - "dashboard.connectFeedShort": "フィードを接続", - "dashboard.uploadCsv": "CSVをアップロード", - "dashboard.goToBilling": "請求へ", - "dashboard.freePlanTitle": "Freeプランをご利用中です", - "dashboard.freePlanMessageWithLimit": "{max} 件中 {used} 件の商品を使用中。フィードマッピング、基本クリーンアップ、EUエネルギーラベル(EPREL)は含まれます。AIタイトル・説明と容量増加はアップグレードが必要です。", - "dashboard.freePlanMessage": "フィードマッピング、基本クリーンアップ、EUエネルギーラベル(EPREL)は含まれます。AIタイトル・説明と容量増加はアップグレードが必要です。", - "dashboard.outOfCreditsTitle": "AIクレジットがなくなりました", - "dashboard.outOfCreditsMessage": "処理を続けるにはクレジットを追加購入するかプランをアップグレードしてください。", - "dashboard.productLimitTitle": "商品上限に達しました", - "dashboard.productLimitMessage": "{plan} プランでは商品 {max} 件までです(カタログ内 {count} 件)。さらに処理するにはアップグレードしてください。", - "dashboard.productLimitMessageFull": "{plan} プランの商品上限に達しました。さらに処理するにはアップグレードしてください。", - "dashboard.comparePlans": "プランを比較", - "dashboard.viewPlans": "プランを見る", - "dashboard.trialTitle": "トライアル · {plan}", - "dashboard.trialMessageDated": "トライアルは {date} に終了します。残りクレジット {credits}。", - "dashboard.trialMessage": "トライアルの残りクレジットは {credits} です。", - "dashboard.lowCreditsTitle": "クレジットが少なくなっています", - "dashboard.lowCreditsMessage": "クレジット残り {total} 中 {remaining}。ジョブが止まる前に補充またはアップグレードしてください。", - "dashboard.latestJobs": "最新の処理ジョブ", - "dashboard.noJobsEmpty": "まだジョブがありません — 先に商品をインポートしてください。", - "dashboard.noJobsReady": "最近のジョブはありません。準備ができたら商品から開始してください。", - "dashboard.startJob": "Products からジョブを開始", - "dashboard.quickLinksHint": "フィード、商品、ジョブ、エクスポート。", - "dashboard.feedsImportMap": "インポートとマップ", - "dashboard.productsBrowse": "閲覧と処理", - "dashboard.jobsMonitor": "タスクを監視", - "dashboard.exportsTemplates": "テンプレートとダウンロード", - "activation.title": "はじめに", - "activation.description": "Descrybeはカタログを取り込み、充実・処理し、エクスポートまたはストアへプッシュします。現在のステップを終えて続行してください。デモツアーはチェックリストの進捗を変えずに画面を説明します。", - "activation.descriptionShort": "下で強調されたステップから始めましょう — 一度に一つの操作です。ストア接続は任意です。", - "activation.nextCta": "このステップを開始", - "activation.valueProp": "Descrybeはカタログを取り込み、充実・処理し、エクスポートまたはストアへプッシュします。", - "activation.alreadyDone": "完了済み", - "activation.skipForNow": "今はスキップ", - "activation.showAllSteps": "全{total}ステップを表示", - "activation.showFewerSteps": "ステップを減らして表示", - "activation.corePathLabel": "要するに", - "activation.corePath": "カタログ取込 → 充実 / 処理 → エクスポートまたはストアへプッシュ", - "activation.storeWizardHint": "フィードやエクスポートには不要です — ライブショップへ商品を送る場合以外はスキップできます。", - "activation.storeWizardCta": "ガイド付きセットアップを開始", - "activation.focus.map": "次へ: フィードで Map を開き、列を対応付けて保存します。リストが空なら先にフィードを追加してください。", - "activation.focus.sync": "次へ: マッピング保存後にサンプルを同期します。マップ済みフィードで Sync を使い、未マップのソースは避けてください。", - "activation.focus.dismiss": "ヒントを閉じる", - "activation.dismiss": "チェックリストを閉じる", - "hypercare.report.title": "カットオーバー hypercare", - "hypercare.report.message": "移行後にデータの欠落や誤りがありますか?報告いただければワークスペースを修正します。", - "hypercare.report.cta": "欠落・誤ったデータを報告", - "hypercare.report.dismiss": "閉じる", - "hypercare.report.adminTriage": "hypercareキューを開く", + "dashboard.workflow.sync.detail": "マッピング後にサンプルを取得", + "dashboard.workflow.sync.ready": "サンプルを商品に同期", + "dashboard.workflow.process": "処理", + "dashboard.workflow.processActive": "アクティブ {count}", + "dashboard.workflow.processWaiting": "待機 {count}", + "dashboard.workflow.processDone": "完了 {count}", + "dashboard.workflow.processRun": "AIジョブを実行", + "dashboard.workflow.export": "エクスポート", + "dashboard.workflow.exportReady": "テンプレートとダウンロード", + "dashboard.workflow.exportMap": "マップしてエクスポート", + "dashboard.workflowHint": "カタログ取込 → 充実 / 処理 → エクスポートまたはストアへプッシュ。{name} の次のステップへ。", + "dashboard.overviewHint": "{name} のリアルタイム合計", + "dashboard.demoEmptyMessage": "ヘッダーでA1(または別のシード済み会社)に切り替えるか、ここでフィードを接続してサンドボックスにデータを入れます。", + "dashboard.emptyTitle": "カタログを取り込む", + "dashboard.emptyMessage": "カタログ取込 → 充実 / 処理 → エクスポートまたはストアへプッシュ。下の「はじめに」から開始(またはフィード接続 / CSVアップロード)。", + "dashboard.connectFeedAnyway": "それでもフィードを接続", + "dashboard.connectFeedShort": "フィードを接続", + "dashboard.uploadCsv": "CSVをアップロード", + "dashboard.goToBilling": "請求へ", + "dashboard.freePlanTitle": "Freeプランをご利用中です", + "dashboard.freePlanMessageWithLimit": "{max} 件中 {used} 件の商品を使用中。フィードマッピング、基本クリーンアップ、EUエネルギーラベル(EPREL)は含まれます。AIタイトル・説明と容量増加はアップグレードが必要です。", + "dashboard.freePlanMessage": "フィードマッピング、基本クリーンアップ、EUエネルギーラベル(EPREL)は含まれます。AIタイトル・説明と容量増加はアップグレードが必要です。", + "dashboard.outOfCreditsTitle": "AIクレジットがなくなりました", + "dashboard.outOfCreditsMessage": "処理を続けるにはクレジットを追加購入するかプランをアップグレードしてください。", + "dashboard.productLimitTitle": "商品上限に達しました", + "dashboard.productLimitMessage": "{plan} プランでは商品 {max} 件までです(カタログ内 {count} 件)。さらに処理するにはアップグレードしてください。", + "dashboard.productLimitMessageFull": "{plan} プランの商品上限に達しました。さらに処理するにはアップグレードしてください。", + "dashboard.comparePlans": "プランを比較", + "dashboard.viewPlans": "プランを見る", + "dashboard.trialTitle": "トライアル · {plan}", + "dashboard.trialMessageDated": "トライアルは {date} に終了します。残りクレジット {credits}。", + "dashboard.trialMessage": "トライアルの残りクレジットは {credits} です。", + "dashboard.lowCreditsTitle": "クレジットが少なくなっています", + "dashboard.lowCreditsMessage": "クレジット残り {total} 中 {remaining}。ジョブが止まる前に補充またはアップグレードしてください。", + "dashboard.latestJobs": "最新の処理ジョブ", + "dashboard.noJobsEmpty": "まだジョブがありません — 先に商品をインポートしてください。", + "dashboard.noJobsReady": "最近のジョブはありません。準備ができたら商品から開始してください。", + "dashboard.startJob": "Products からジョブを開始", + "dashboard.quickLinksHint": "フィード、商品、ジョブ、エクスポート。", + "dashboard.feedsImportMap": "インポートとマップ", + "dashboard.productsBrowse": "閲覧と処理", + "dashboard.jobsMonitor": "タスクを監視", + "dashboard.exportsTemplates": "テンプレートとダウンロード", + "activation.title": "はじめに", + "activation.description": "Descrybeはカタログを取り込み、充実・処理し、エクスポートまたはストアへプッシュします。現在のステップを終えて続行してください。デモツアーはチェックリストの進捗を変えずに画面を説明します。", + "activation.descriptionShort": "下で強調されたステップから始めましょう — 一度に一つの操作です。ストア接続は任意です。", + "activation.nextCta": "このステップを開始", + "activation.valueProp": "Descrybeはカタログを取り込み、充実・処理し、エクスポートまたはストアへプッシュします。", + "activation.alreadyDone": "完了済み", + "activation.skipForNow": "今はスキップ", + "activation.showAllSteps": "å…¨{total}ステップを表示", + "activation.showFewerSteps": "ステップを減らして表示", + "activation.corePathLabel": "要するに", + "activation.corePath": "カタログ取込 → 充実 / 処理 → エクスポートまたはストアへプッシュ", + "activation.storeWizardHint": "フィードやエクスポートには不要です — ライブショップへ商品を送る場合以外はスキップできます。", + "activation.storeWizardCta": "ガイド付きセットアップを開始", + "activation.focus.map": "次へ: フィードで Map を開き、列を対応付けて保存します。リストが空なら先にフィードを追加してください。", + "activation.focus.sync": "次へ: マッピング保存後にサンプルを同期します。マップ済みフィードで Sync を使い、未マップのソースは避けてください。", + "activation.focus.dismiss": "ヒントを閉じる", + "activation.dismiss": "チェックリストを閉じる", + "hypercare.report.title": "カットオーバー hypercare", + "hypercare.report.message": "移行後にデータの欠落や誤りがありますか?報告いただければワークスペースを修正します。", + "hypercare.report.cta": "欠落・誤ったデータを報告", + "hypercare.report.dismiss": "閉じる", + "hypercare.report.adminTriage": "hypercareキューを開く", "etl.gaps.title": "What did not migrate", - "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", + "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", "etl.gaps.dismiss": "Dismiss", "etl.gaps.apiKeys.title": "API keys", - "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", + "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", "etl.gaps.apiKeys.cta": "Open API keys", "etl.gaps.blobs.title": "File contents (blobs)", - "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", + "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", "etl.gaps.blobs.countHint": "{count} file records are metadata-only (bytes were not migrated).", "etl.gaps.blobs.cta": "Open Files", "etl.gaps.jobs.title": "Processing history", "etl.gaps.jobs.body": "Legacy job and task history was not backfilled for cutover. New jobs you start here will appear normally.", - "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", + "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", "etl.gaps.jobs.migratedHint": "{count} jobs were tagged migrated from an optional backfill.", "etl.gaps.jobs.cta": "Open Processing", "etl.gaps.woo.title": "Store credentials", - "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", + "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", "etl.gaps.woo.cta": "Open Stores", "etl.gaps.settings.title": "Company settings", "etl.gaps.settings.body": "Only language and merge-products settings were imported. Re-check other company preferences in Settings.", "etl.gaps.settings.cta": "Open company settings", - "activation.progress": "{total} 件中 {done} 件完了", - "activation.stepsLabel": "アクティベーション手順", - "activation.pausedTitle": "はじめが一時停止中です", - "activation.pausedBody": "いつでも再開できます — カタログ取込からエクスポートまたはストアへのプッシュまで。", - "activation.resume": "チェックリストを再開", - "activation.step.enable-fields.title": "商品フィールドを有効化", - "activation.step.enable-fields.body": "Descrybeがマップして整備する標準の商品列を選びます。", - "activation.step.connect-source.title": "商品フィードを追加", - "activation.step.connect-source.body": "CSVまたはXMLのカタログフィードを追加して商品をDescrybeに取り込みます。ライブストア接続は後の任意ステップです。", - "activation.step.map.title": "フィード列をマップ", - "activation.step.map.body": "FeedsでフィードのMapを開き、仕入先列をDescrybeフィールドに対応付けて保存します。", - "activation.step.sync-sample.title": "サンプルを同期", - "activation.step.sync-sample.body": "Feedsで、マップ済みフィードから小さなサンプルを同期し、本番前にマッピングを確認します。", - "activation.step.process.title": "商品を処理", - "activation.step.process.body": "未処理の商品を開き、処理を実行して整備されたカタログコンテンツを生成します。", - "activation.step.store-connect.title": "ストアを接続", - "activation.step.store-connect.body": "任意。WooCommerceまたはShopifyを連携してショップへ商品を送信します。フィードとエクスポートのみならスキップできます。", - "activation.step.export.title": "エクスポートを作成", - "activation.step.export.body": "整備された商品をXMLまたはCSVとしてダウンロード/公開するエクスポートフィードを作成します。", - "stats.products": "取込商品", - "stats.categories": "カテゴリ", - "stats.attributes": "属性", + "activation.progress": "{total} 件中 {done} 件完了", + "activation.stepsLabel": "アクティベーション手順", + "activation.pausedTitle": "はじめが一時停止中です", + "activation.pausedBody": "いつでも再開できます — カタログ取込からエクスポートまたはストアへのプッシュまで。", + "activation.resume": "チェックリストを再開", + "activation.step.enable-fields.title": "商品フィールドを有効化", + "activation.step.enable-fields.body": "Descrybeがマップして整備する標準の商品列を選びます。", + "activation.step.connect-source.title": "商品フィードを追加", + "activation.step.connect-source.body": "CSVまたはXMLのカタログフィードを追加して商品をDescrybeに取り込みます。ライブストア接続は後の任意ステップです。", + "activation.step.map.title": "フィード列をマップ", + "activation.step.map.body": "FeedsでフィードのMapを開き、仕入先列をDescrybeフィールドに対応付けて保存します。", + "activation.step.sync-sample.title": "サンプルを同期", + "activation.step.sync-sample.body": "Feedsで、マップ済みフィードから小さなサンプルを同期し、本番前にマッピングを確認します。", + "activation.step.process.title": "商品を処理", + "activation.step.process.body": "未処理の商品を開き、処理を実行して整備されたカタログコンテンツを生成します。", + "activation.step.store-connect.title": "ストアを接続", + "activation.step.store-connect.body": "任意。WooCommerceまたはShopifyを連携してショップへ商品を送信します。フィードとエクスポートのみならスキップできます。", + "activation.step.export.title": "エクスポートを作成", + "activation.step.export.body": "整備された商品をXMLまたはCSVとしてダウンロード/公開するエクスポートフィードを作成します。", + "stats.products": "取込商品", + "stats.categories": "カテゴリ", + "stats.attributes": "属性", "stats.feeds": "Feeds", - "stats.credits": "クレジット", - "stats.openCatalog": "カタログを開く", - "stats.productsHint": "カタログ {processed} · キュー {unprocessed}(別集計)", - "stats.catalogTree": "カタログツリー", - "stats.attributeLibrary": "属性ライブラリ", - "stats.importSources": "インポート元", - "stats.payAsYouGo": "従量課金", - "stats.walletBilling": "ウォレット · 請求", - "stats.enterpriseBilling": "エンタープライズ · 請求", - "stats.usedBilling": "使用 {used} · 請求", - "processing.jobStatus.processing": "処理中", - "processing.jobStatus.completed": "完了", - "processing.jobStatus.failed": "失敗", - "processing.jobStatus.cancelled": "キャンセル済み", - "processing.jobStatus.pending": "保留中", - "processing.jobStatus.queued": "キュー待ち", - "processing.jobStatus.skipped": "スキップ済み", - "processing.jobStatus.unknown": "不明", - "processing.job.error.all_failed": "{count} 件すべての商品が失敗しました。", - "processing.job.error.partial_failed": "{count} 件の商品が失敗しました。", - "processing.step.normalize": "正規化", - "processing.step.parse_specs": "仕様を解析", - "processing.step.fill_fields": "フィールドを埋める", + "stats.credits": "クレジット", + "stats.openCatalog": "カタログを開く", + "stats.productsHint": "カタログ {processed} · キュー {unprocessed}(別集計)", + "stats.catalogTree": "カタログツリー", + "stats.attributeLibrary": "属性ライブラリ", + "stats.importSources": "インポート元", + "stats.payAsYouGo": "従量課金", + "stats.walletBilling": "ウォレット · 請求", + "stats.enterpriseBilling": "エンタープライズ · 請求", + "stats.usedBilling": "使用 {used} · 請求", + "processing.jobStatus.processing": "処理中", + "processing.jobStatus.completed": "完了", + "processing.jobStatus.failed": "失敗", + "processing.jobStatus.cancelled": "キャンセル済み", + "processing.jobStatus.pending": "保留中", + "processing.jobStatus.queued": "キュー待ち", + "processing.jobStatus.skipped": "スキップ済み", + "processing.jobStatus.unknown": "不明", + "processing.job.error.all_failed": "{count} 件すべての商品が失敗しました。", + "processing.job.error.partial_failed": "{count} 件の商品が失敗しました。", + "processing.step.normalize": "正規化", + "processing.step.parse_specs": "仕様を解析", + "processing.step.fill_fields": "フィールドを埋める", "processing.step.eprel": "EPREL", - "processing.step.ai_enhance": "AI強化", - "processing.type.full": "フル処理", - "processing.type.enhance_only": "強化のみ", - "processing.type.title": "タイトルのみ", - "processing.type.description": "説明のみ", - "processing.type.attributes": "属性", - "processing.type.category": "カテゴリ", + "processing.step.ai_enhance": "AI強化", + "processing.type.full": "フル処理", + "processing.type.enhance_only": "強化のみ", + "processing.type.title": "タイトルのみ", + "processing.type.description": "説明のみ", + "processing.type.attributes": "属性", + "processing.type.category": "カテゴリ", "processing.type.eprel": "EPREL", "processing.type.seo": "SEO", - "processing.type.normalize": "正規化", - "errors.requestFailed": "リクエストに失敗しました", - "errors.maintenance": "システムはメンテナンス中です。後でもう一度お試しください。", - "errors.readOnly": "システムは読み取り専用モードです。変更は一時的に無効です。", - "errors.companyAdminDenied": "{action}できるのは会社の管理者のみです。管理者に問い合わせてください。", - "errors.companyAdminDenied.actionDefault": "これを実行", - "docs.tryIt.memberCannotCreate": "API キーを作成できるのは会社管理者のみです。レガシーキーは移行されていません — 下にキーを貼るか、管理者に新規作成を依頼してください。", - "docs.tryIt.noKeysLegacyAdmin": "レガシーAPIキーは移行されていません。Use my API key または 設定 → APIキー で新規作成 — シークレットは一度だけ表示されます。", - "docs.tryIt.noKeysLegacyMember": "APIキーがありません。レガシーキーは移行されていません — 管理者に作成を依頼するか、dk_ キーを貼り付けてください。", - "errors.couldNotUpdateLanguage": "言語を更新できませんでした", - "toast.support.replyTitle": "サポート返信", - "toast.support.replyBody": "スタッフがサポートチケットに返信しました。", + "processing.type.normalize": "正規化", + "errors.requestFailed": "リクエストに失敗しました", + "errors.maintenance": "システムはメンテナンス中です。後でもう一度お試しください。", + "errors.readOnly": "システムは読み取り専用モードです。変更は一時的に無効です。", + "errors.companyAdminDenied": "{action}できるのは会社の管理者のみです。管理者に問い合わせてください。", + "errors.companyAdminDenied.actionDefault": "これを実行", + "docs.tryIt.memberCannotCreate": "API キーを作成できるのは会社管理者のみです。レガシーキーは移行されていません — 下にキーを貼るか、管理者に新規作成を依頼してください。", + "docs.tryIt.noKeysLegacyAdmin": "レガシーAPIキーは移行されていません。Use my API key または 設定 → APIキー で新規作成 — シークレットは一度だけ表示されます。", + "docs.tryIt.noKeysLegacyMember": "APIキーがありません。レガシーキーは移行されていません — 管理者に作成を依頼するか、dk_ キーを貼り付けてください。", + "errors.couldNotUpdateLanguage": "言語を更新できませんでした", + "toast.support.replyTitle": "サポート返信", + "toast.support.replyBody": "スタッフがサポートチケットに返信しました。", "toast.support.replyRe": "Re: {subject}", - "toast.support.statusTitle": "チケットステータスが更新されました", - "toast.support.statusBody": "サポートチケットのステータスが変更されました。", - "toast.support.updateTitle": "サポート更新", - "assistant.label": "アシスタント", - "assistant.open": "システムアシスタントを開く", - "assistant.close": "システムアシスタントを閉じる", - "tutorial.demoTour": "デモツアー", - "tutorial.jumpToTopic": "トピックへ移動", - "tutorial.whereNeedHelp": "どこでサポートが必要ですか?", - "tutorial.skipTour": "ツアーをスキップ", - "tutorial.skipAria": "チュートリアルをスキップ", - "tutorial.pickerBody": "セクションを選ぶとデモのその部分を再開できます。ツアーを見るだけではアカウントデータは変更されません。", - "tutorial.sectionsAria": "チュートリアルのセクション", - "tutorial.open": "開く", - "tutorial.close": "閉じる", - "tutorial.resumeLastStep": "最後のステップを再開", - "tutorial.startFromBeginning": "最初から始める", - "tutorial.stepOf": "ステップ {current} / {total}", - "tutorial.jumpTo": "移動…", - "tutorial.jumpToSectionAria": "セクションへ移動", - "tutorial.back": "戻る", - "tutorial.pause": "一時停止", - "tutorial.continue": "続ける", - "tutorial.finishTour": "ツアーを終了", - "tutorial.missingTargetHint": "そのコントロールはこの画面にはまだありません。それでも「続ける」を選べます。ツアーでは保存や同期は不要です。", + "toast.support.statusTitle": "チケットステータスが更新されました", + "toast.support.statusBody": "サポートチケットのステータスが変更されました。", + "toast.support.updateTitle": "サポート更新", + "assistant.label": "アシスタント", + "assistant.open": "システムアシスタントを開く", + "assistant.close": "システムアシスタントを閉じる", + "tutorial.demoTour": "デモツアー", + "tutorial.jumpToTopic": "トピックへ移動", + "tutorial.whereNeedHelp": "どこでサポートが必要ですか?", + "tutorial.skipTour": "ツアーをスキップ", + "tutorial.skipAria": "チュートリアルをスキップ", + "tutorial.pickerBody": "セクションを選ぶとデモのその部分を再開できます。ツアーを見るだけではアカウントデータは変更されません。", + "tutorial.sectionsAria": "チュートリアルのセクション", + "tutorial.open": "開く", + "tutorial.close": "閉じる", + "tutorial.resumeLastStep": "最後のステップを再開", + "tutorial.startFromBeginning": "最初から始める", + "tutorial.stepOf": "ステップ {current} / {total}", + "tutorial.jumpTo": "移動…", + "tutorial.jumpToSectionAria": "セクションへ移動", + "tutorial.back": "戻る", + "tutorial.pause": "一時停止", + "tutorial.continue": "続ける", + "tutorial.finishTour": "ツアーを終了", + "tutorial.missingTargetHint": "そのコントロールはこの画面にはまだありません。それでも「続ける」を選べます。ツアーでは保存や同期は不要です。", "tutorial.section.welcome": "Welcome", "tutorial.section.catalog": "Catalog setup", "tutorial.section.sources": "Feeds", @@ -489,113 +489,113 @@ export const ja: MessageDict = { "tutorial.section.export": "Export & stores", "tutorial.section.grow": "Grow", "tutorial.section.done": "Done", - "tutorial.step.welcome.title": "Descrybeへようこそ", - "tutorial.step.welcome.body": "Descrybe の中核ループは Feeds → Process → Export / Stores です。このガイド付きデモは実ダッシュボード上でその画面を強調します — 保存・同期・フィールド有効化・フィード作成は不要です。いつでも一時停止し、ヘッダーから再開できます。1トピックだけ助けが必要なときはセクションへジャンプしてください。", - "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", + "tutorial.step.welcome.title": "Descrybeへようこそ", + "tutorial.step.welcome.body": "Descrybe の中核ループは Feeds → Process → Export / Stores です。このガイド付きデモは実ダッシュボード上でその画面を強調します — 保存・同期・フィールド有効化・フィード作成は不要です。いつでも一時停止し、ヘッダーから再開できます。1トピックだけ助けが必要なときはセクションへジャンプしてください。", + "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", "tutorial.step.welcome.nextLabel": "Start tour", - "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", - "tutorial.step.dashboard-overview.title": "コマンドセンター", - "tutorial.step.dashboard-overview.body": "カタログワークフロー帯は毎日の道筋を示します: Feeds → Map → Sync → Process。Getting started は実ワークスペース進捗を追跡します(このデモとは別)。本番作業の準備ができたら Manage feeds または Start processing を使い、その後エクスポートまたはストア接続へ進みます。", - "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", + "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", + "tutorial.step.dashboard-overview.title": "コマンドセンター", + "tutorial.step.dashboard-overview.body": "カタログワークフロー帯は毎日の道筋を示します: Feeds → Map → Sync → Process。Getting started は実ワークスペース進捗を追跡します(このデモとは別)。本番作業の準備ができたら Manage feeds または Start processing を使い、その後エクスポートまたはストア接続へ進みます。", + "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", "tutorial.step.dashboard-overview.missingHint": "The workflow strip and checklist appear after the dashboard loads.", - "tutorial.step.enable-fields.title": "標準フィールド", - "tutorial.step.enable-fields.body": "Standard Fieldsは、Descrybeがマップ・処理・エクスポートする商品列です — タイトル、説明、GTIN、画像など。Enable recommendedはほとんどのカタログ向けの妥当なデフォルトを有効にします。既存マッピングを壊さずに後からリストを調整できます。", - "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", + "tutorial.step.enable-fields.title": "標準フィールド", + "tutorial.step.enable-fields.body": "Standard Fieldsは、Descrybeがマップ・処理・エクスポートする商品列です — タイトル、説明、GTIN、画像など。Enable recommendedはほとんどのカタログ向けの妥当なデフォルトを有効にします。既存マッピングを壊さずに後からリストを調整できます。", + "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", "tutorial.step.enable-fields.warning": "Enabling or disabling fields affects mapping and processing for this company. Prefer Enable recommended once, then tweak carefully.", "tutorial.step.enable-fields.missingHint": "Wait for the Fields page to load, or open Fields from the Catalog section in the sidebar.", - "tutorial.step.catalog-depth.title": "カテゴリと属性", - "tutorial.step.catalog-depth.body": "サイドバーの Catalog セクションには Categories と Attributes もあります。Categories はカタログを整理し、属性はフィルターと構造化説明を支えます。このツアーを終えるために設定する必要はありません。", - "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", + "tutorial.step.catalog-depth.title": "カテゴリと属性", + "tutorial.step.catalog-depth.body": "サイドバーの Catalog セクションには Categories と Attributes もあります。Categories はカタログを整理し、属性はフィルターと構造化説明を支えます。このツアーを終えるために設定する必要はありません。", + "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", "tutorial.step.catalog-depth.missingHint": "Expand Catalog in the sidebar to open Categories or Attributes after the tour.", - "tutorial.step.connect-source.title": "商品ソースを追加", - "tutorial.step.connect-source.body": "フィードは仕入先カタログがDescrybeに入る経路です — CSV、XML、またはURLベースのファイル。Add Feedは新しいソースを作成し、各行はステータス(マッピング準備完了、マップ済み、アクティブ)を示します。Mapはそのフィードのフィールド対応画面を開きます。", - "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", + "tutorial.step.connect-source.title": "商品ソースを追加", + "tutorial.step.connect-source.body": "フィードは仕入先カタログがDescrybeに入る経路です — CSV、XML、またはURLベースのファイル。Add Feedは新しいソースを作成し、各行はステータス(マッピング準備完了、マップ済み、アクティブ)を示します。Mapはそのフィードのフィールド対応画面を開きます。", + "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", "tutorial.step.connect-source.warning": "Avoid deleting live feeds unless you intend to remove that source and its sync history.", - "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", - "tutorial.step.map.title": "ソースフィールドをマップ", - "tutorial.step.map.body": "フィードのMap画面で仕入先列をDescrybeのstandard fieldsに対応付けます。Auto-mapは列名から候補を示します。あいまいな一致を確認し、誤りを直してください。Save Mappingsがマップを保存し、同期と処理が各行の読み方を把握します。", - "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", - "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", + "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", + "tutorial.step.map.title": "ソースフィールドをマップ", + "tutorial.step.map.body": "フィードのMap画面で仕入先列をDescrybeのstandard fieldsに対応付けます。Auto-mapは列名から候補を示します。あいまいな一致を確認し、誤りを直してください。Save Mappingsがマップを保存し、同期と処理が各行の読み方を把握します。", + "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", + "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", "tutorial.step.map.missingHint": "Add a feed and click Map to see the mapping UI; or Continue to keep learning.", - "tutorial.step.sync-sample.title": "サンプルを同期(準備ができたら)", - "tutorial.step.sync-sample.body": "マッピング保存後、Sync + Process sampleは小さなバッチを取得して処理を実行し、フル実行前にタイトル・画像・属性を確認できます。フィード一覧の Full Sync now は、サンプルが問題なければ大きなインポート向けです。", - "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", + "tutorial.step.sync-sample.title": "サンプルを同期(準備ができたら)", + "tutorial.step.sync-sample.body": "マッピング保存後、Sync + Process sampleは小さなバッチを取得して処理を実行し、フル実行前にタイトル・画像・属性を確認できます。フィード一覧の Full Sync now は、サンプルが問題なければ大きなインポート向けです。", + "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", "tutorial.step.sync-sample.warning": "Syncing writes products into this company. Prefer a sample first; avoid Sync now on unmapped feeds.", "tutorial.step.sync-sample.missingHint": "Sync controls appear on feed rows and on the mapping screen footer.", - "tutorial.step.process.title": "商品を確認", - "tutorial.step.process.body": "Products は同期・処理済みのカタログ項目を一覧します。ステータスで絞り込み、行を開いて詳細を確認し、エネルギーラベルがある場合は EPREL バッジを使います。エクスポートやストア同期の前にマッピングミスを見つける場所です。", - "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", + "tutorial.step.process.title": "商品を確認", + "tutorial.step.process.body": "Products は同期・処理済みのカタログ項目を一覧します。ステータスで絞り込み、行を開いて詳細を確認し、エネルギーラベルがある場合は EPREL バッジを使います。エクスポートやストア同期の前にマッピングミスを見つける場所です。", + "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", "tutorial.step.process.missingHint": "Wait for the products table, or Continue if the catalog is still empty.", - "tutorial.step.processing-hub.title": "バックグラウンド処理", - "tutorial.step.processing-hub.body": "Processing のジョブは AI とパイプラインの進捗(完了・失敗)を示します。クレジットを意図的に使うときはダッシュボードまたは製品からジョブを開始します。", - "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", + "tutorial.step.processing-hub.title": "バックグラウンド処理", + "tutorial.step.processing-hub.body": "Processing のジョブは AI とパイプラインの進捗(完了・失敗)を示します。クレジットを意図的に使うときはダッシュボードまたは製品からジョブを開始します。", + "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", "tutorial.step.processing-hub.missingHint": "Open Jobs from the Processing section in the sidebar if the page is empty.", - "tutorial.step.stores-hub.title": "ストアとプラットフォーム", - "tutorial.step.stores-hub.body": "処理後、Stores は WooCommerce または Shopify に接続し、整理済みカタログをショップへ送れます。マーケットプレイス/CMS が宛先のときに使い、パートナーがファイル/URL だけでよい場合は Export feeds へ進みます。", - "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", + "tutorial.step.stores-hub.title": "ストアとプラットフォーム", + "tutorial.step.stores-hub.body": "処理後、Stores は WooCommerce または Shopify に接続し、整理済みカタログをショップへ送れます。マーケットプレイス/CMS が宛先のときに使い、パートナーがファイル/URL だけでよい場合は Export feeds へ進みます。", + "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", "tutorial.step.stores-hub.missingHint": "Open Stores from the sidebar to see connection cards.", - "tutorial.step.export.title": "整備済み商品をエクスポート", - "tutorial.step.export.body": "Export feedsは整備済み商品をXMLまたはCSVとしてチャネル・パートナー・ストア向けに公開します。エクスポートを作成し、形式とフィルタを選び、フィードURLを共有するかダウンロードします。エクスポートは処理済みカタログデータを読みます — 最良の結果のため先にマップと処理を。", - "tutorial.step.export.tip": "You don’t need to create an export during the demo.", - "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", + "tutorial.step.export.title": "整備済み商品をエクスポート", + "tutorial.step.export.body": "Export feedsは整備済み商品をXMLまたはCSVとしてチャネル・パートナー・ストア向けに公開します。エクスポートを作成し、形式とフィルタを選び、フィードURLを共有するかダウンロードします。エクスポートは処理済みカタログデータを読みます — 最良の結果のため先にマップと処理を。", + "tutorial.step.export.tip": "You don’t need to create an export during the demo.", + "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", "tutorial.step.export.missingHint": "Wait for Export feeds to load, or open Exports from the Feeds section in the sidebar.", - "tutorial.step.billing-hub.title": "クレジットと請求", - "tutorial.step.billing-hub.body": "Billingはプラン、ウォレット、残りクレジットを表示します。処理と一部のAI機能はこの残高を使います。大きなカタログラインの前に使用状況を確認してください。", - "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", + "tutorial.step.billing-hub.title": "クレジットと請求", + "tutorial.step.billing-hub.body": "Billingはプラン、ウォレット、残りクレジットを表示します。処理と一部のAI機能はこの残高を使います。大きなカタログラインの前に使用状況を確認してください。", + "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", "tutorial.step.billing-hub.missingHint": "Open Billing from the Account section in the sidebar.", - "tutorial.step.grow-hub.title": "キャンペーン、SEO、レビュー", - "tutorial.step.grow-hub.body": "Marketing では Campaigns がコンテンツを生成し、Content calendar が投稿を計画し、SEO が一覧の準備を確認し、Reviews が WooCommerce と連携します。健全なマップ済みカタログが前提です — Feeds → Process → Export / Stores を先に完了してください。", - "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", + "tutorial.step.grow-hub.title": "キャンペーン、SEO、レビュー", + "tutorial.step.grow-hub.body": "Marketing では Campaigns がコンテンツを生成し、Content calendar が投稿を計画し、SEO が一覧の準備を確認し、Reviews が WooCommerce と連携します。健全なマップ済みカタログが前提です — Feeds → Process → Export / Stores を先に完了してください。", + "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", "tutorial.step.grow-hub.missingHint": "Open Campaigns from Marketing in the sidebar, or Continue.", - "tutorial.step.tour-done.title": "探索の準備ができました", - "tutorial.step.tour-done.body": "これがプロダクトマップです: Feeds → Map → Sync → Process → Export / Stores。本番セットアップにはダッシュボードの Getting started を使います。ヘッダーからいつでも再開/再開始でき、Jump to… でセクションを復習できます。Skip tour はチェックリストを変えずにデモを終えます。", - "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", + "tutorial.step.tour-done.title": "探索の準備ができました", + "tutorial.step.tour-done.body": "これがプロダクトマップです: Feeds → Map → Sync → Process → Export / Stores。本番セットアップにはダッシュボードの Getting started を使います。ヘッダーからいつでも再開/再開始でき、Jump to… でセクションを復習できます。Skip tour はチェックリストを変えずにデモを終えます。", + "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", "tutorial.step.tour-done.nextLabel": "Finish tour", "tutorial.step.tour-done.missingHint": "Return to the dashboard to finish.", - "news.uxImprovements.title": "ユーザー体験の改善", - "flash.contentLanguageUpdated": "コンテンツ言語を更新しました。", - "theme.darkMode": "ダークモード", - "theme.lightMode": "ライトモード", - "forbidden.title.accessRestricted": "アクセス制限", - "forbidden.title.permissionDenied": "権限がありません", - "forbidden.message.support": "この領域はサポート担当とプラットフォーム管理者のみ利用できます。", - "forbidden.message.platform": "この領域はプラットフォーム管理者のみ利用できます。", - "forbidden.message.company": "この操作の権限がありません。会社の管理者に依頼してください。", - "forbidden.backToDashboard": "ダッシュボードに戻る", - "admin.chrome.platformOps": "プラットフォーム運用", - "admin.chrome.sidebar": "プラットフォーム運用サイドバー", - "admin.chrome.nav": "プラットフォーム運用", - "admin.chrome.mobileMenu": "プラットフォーム運用モバイルメニュー", - "admin.chrome.opsBadge": "運用", - "admin.chrome.backToApp": "アプリに戻る", - "admin.chrome.uiLanguage": "UI言語", - "admin.chrome.staff.supportDesk": "サポートデスク", - "admin.chrome.staff.platformAdmin": "プラットフォーム管理者", - "admin.chrome.staff.staff": "スタッフ", - "admin.chrome.staff.admin": "管理", - "admin.nav.section.overview": "概要", - "admin.nav.section.directory": "ディレクトリ", - "admin.nav.section.support": "サポート", - "admin.nav.section.ops": "オペレーション", - "admin.nav.section.commerce": "コマース", - "admin.nav.section.system": "システム", - "admin.nav.commandCenter": "コマンドセンター", - "admin.nav.analytics": "アナリティクス", - "admin.nav.usersOrgs": "ユーザーと組織", - "admin.nav.tickets": "チケット", - "admin.nav.knowledge": "ナレッジ", - "admin.nav.diagnostics": "診断", - "admin.nav.stuckProducts": "スタックした商品", + "news.uxImprovements.title": "ユーザー体験の改善", + "flash.contentLanguageUpdated": "コンテンツ言語を更新しました。", + "theme.darkMode": "ダークモード", + "theme.lightMode": "ライトモード", + "forbidden.title.accessRestricted": "アクセス制限", + "forbidden.title.permissionDenied": "権限がありません", + "forbidden.message.support": "この領域はサポート担当とプラットフォーム管理者のみ利用できます。", + "forbidden.message.platform": "この領域はプラットフォーム管理者のみ利用できます。", + "forbidden.message.company": "この操作の権限がありません。会社の管理者に依頼してください。", + "forbidden.backToDashboard": "ダッシュボードに戻る", + "admin.chrome.platformOps": "プラットフォーム運用", + "admin.chrome.sidebar": "プラットフォーム運用サイドバー", + "admin.chrome.nav": "プラットフォーム運用", + "admin.chrome.mobileMenu": "プラットフォーム運用モバイルメニュー", + "admin.chrome.opsBadge": "運用", + "admin.chrome.backToApp": "アプリに戻る", + "admin.chrome.uiLanguage": "UI言語", + "admin.chrome.staff.supportDesk": "サポートデスク", + "admin.chrome.staff.platformAdmin": "プラットフォーム管理者", + "admin.chrome.staff.staff": "スタッフ", + "admin.chrome.staff.admin": "管理", + "admin.nav.section.overview": "概要", + "admin.nav.section.directory": "ディレクトリ", + "admin.nav.section.support": "サポート", + "admin.nav.section.ops": "オペレーション", + "admin.nav.section.commerce": "コマース", + "admin.nav.section.system": "システム", + "admin.nav.commandCenter": "コマンドセンター", + "admin.nav.analytics": "アナリティクス", + "admin.nav.usersOrgs": "ユーザーと組織", + "admin.nav.tickets": "チケット", + "admin.nav.knowledge": "ナレッジ", + "admin.nav.diagnostics": "診断", + "admin.nav.stuckProducts": "スタックした商品", "admin.nav.orphanProcessed": "Orphan processed", - "admin.nav.billing": "請求", + "admin.nav.billing": "請求", "admin.nav.sales": "Sales", - "admin.nav.translations": "翻訳", - "admin.nav.settings": "設定", + "admin.nav.translations": "翻訳", + "admin.nav.settings": "設定", "admin.sales.title": "Sales leads", "admin.sales.description": "Inbound Contact sales messages and custom payment quotes.", "admin.sales.listTitle": "Leads", "admin.sales.listDesc": "{total} matching leads", - "admin.sales.searchPlaceholder": "Search name, email, company…", + "admin.sales.searchPlaceholder": "Search name, email, company…", "admin.sales.statusAll": "All statuses", "admin.sales.status.new": "New", "admin.sales.status.contacted": "Contacted", @@ -643,7 +643,7 @@ export const ja: MessageDict = { "admin.sales.col.status": "Status", "admin.sales.col.created": "Created", "sales.contact.title": "Contact sales", - "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", + "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", "sales.contact.formTitle": "Send a message", "sales.contact.formLead": "Enterprise and custom deals are prepared by our team, then paid via Stripe Checkout.", "sales.contact.name": "Name", @@ -653,233 +653,233 @@ export const ja: MessageDict = { "sales.contact.estimatedSkus": "Estimated SKUs (optional)", "sales.contact.message": "How can we help?", "sales.contact.submit": "Send message", - "sales.contact.submitting": "Sending…", + "sales.contact.submitting": "Sending…", "sales.contact.error": "Could not send your message. Please try again.", - "sales.contact.toast.success": "Message sent — we will follow up soon.", - "sales.contact.thanksTitle": "Thanks — we got your message", + "sales.contact.toast.success": "Message sent — we will follow up soon.", + "sales.contact.thanksTitle": "Thanks — we got your message", "sales.contact.thanksBody": "A platform admin will review your request and can send a Checkout link for a custom plan.", "sales.contact.bookDemo": "Book a live demo", "sales.contact.orBookDemo": "Or book a Calendly demo", "sales.contact.backPricing": "Back to pricing", - "admin.overview.eyebrow": "コマンドセンター", - "admin.overview.title": "プラットフォーム概要", - "admin.overview.description": "アナリティクス概要からのライブプラットフォーム状況 — 運用・インサイト・サポートへ。", - "admin.overview.tokens": "トークン", - "admin.overview.tokensHint": "全期間 · 期間", - "admin.overview.credits": "クレジット", - "admin.overview.creditsHint": "すべての会社", - "admin.overview.jobs": "ジョブ", - "admin.overview.jobsHint": "キューのスナップショット", - "admin.overview.platform": "プラットフォーム", - "admin.overview.platformHint": "テナント · ボリューム", - "admin.overview.signals": "最近のシグナル", - "admin.overview.shortcuts": "運用ショートカット", - "admin.overview.providers": "AIプロバイダー構成", - "admin.overview.internalAi": "内部AI", - "admin.overview.internalAiHint": "プラットフォーム設定", - "admin.overview.popularKeys": "人気キー", - "admin.overview.popularKeysHint": "テナントの人気プロバイダー", - "admin.overview.customUrl": "カスタムURL", - "admin.overview.customUrlHint": "テナントのカスタムベースURL", - "admin.overview.linkBilling": "請求", - "admin.overview.linkSettings": "設定", - "admin.overview.shortcut.diagnostics.title": "診断", - "admin.overview.shortcut.diagnostics.desc": "ヘルスチェック、キュー、最近の失敗", - "admin.overview.shortcut.analytics.title": "アナリティクス", - "admin.overview.shortcut.analytics.desc": "トークン、ジョブ、登録、プロバイダー", - "admin.overview.shortcut.knowledge.title": "ナレッジ", - "admin.overview.shortcut.knowledge.desc": "記事、テンプレート、自動返信", - "admin.overview.shortcut.users.title": "ユーザーと組織", - "admin.overview.shortcut.users.desc": "アカウント、会社、招待", - "admin.overview.shortcut.stuck.title": "スタックした商品", - "admin.overview.shortcut.stuck.desc": "2時間以上実行中", - "admin.overview.signal.stuckTitle": "{count} 件の停滞ジョブ", - "admin.overview.signal.stuckTitlePlural": "{count} 件の停滞ジョブ", - "admin.overview.signal.stuckDetail": "2時間以上実行中 — 確認し、必要ならリセットしてください。", - "admin.overview.signal.stuckCta": "停滞ジョブを開く", - "admin.overview.signal.failedTitle": "直近{days}日で{count}件失敗", - "admin.overview.signal.failedDetail": "同じ期間で{completed}件完了。", - "admin.overview.signal.failedDetailRate": "{rate}% 失敗率 · {completed} 件完了。", - "admin.overview.signal.failedCta": "診断を開く", - "admin.overview.signal.runningTitle": "{count} 件の実行中ジョブ", - "admin.overview.signal.runningTitlePlural": "{count} 件の実行中ジョブ", - "admin.overview.signal.runningDetail": "現在実行中の処理ジョブ。", - "admin.overview.signal.runningCta": "キューを表示", - "admin.overview.signal.ticketsTitle": "{count} 件の未解決サポートチケット", - "admin.overview.signal.ticketsTitlePlural": "{count} 件の未解決サポートチケット", - "admin.overview.signal.ticketsDetail": "サポートデスクの未対応または保留中のチケット。", - "admin.overview.signal.ticketsCta": "サポートを開く", - "admin.overview.signal.clearTitle": "高いシグナルなし", - "admin.overview.signal.clearDetail": "ライブ概要に停滞ジョブ・期間失敗・未解決チケットはありません(直近{days}日)。", - "admin.overview.signal.clearCta": "診断で確認", - "admin.overview.badge.action": "アクション", - "admin.overview.badge.watch": "監視", - "admin.overview.badge.live": "ライブ", - "admin.overview.badge.clear": "クリア", - "admin.overview.summaryLoadFailed": "ライブ概要を読み込めませんでした。下のショートカットは引き続き使えます。", - "admin.overview.keyMetrics": "主要指標", - "admin.overview.summaryWindow": "直近{days}日 · サマリーエンドポイント", - "admin.overview.tokensPeriod": "直近{days}日で{count}", - "admin.overview.creditsFoot": "割当{allocated}のうち残り{remaining}", - "admin.overview.jobsFoot": "失敗{failed} · 実行中{running} · 停滞{stuck}", - "admin.overview.platformFoot": "ユーザー{users} · 処理済み{processed} · 入力フィード{feeds}", - "admin.overview.fullDiagnostics": "詳細診断", - "admin.overview.also": "その他:", - "admin.overview.linkSupport": "サポートデスク", - "admin.overview.charts": "チャート", - "admin.overview.providerFoot": "ジョブ{jobs} · 商品{products}", - "admin.analytics.eyebrow": "インサイト", - "admin.analytics.title": "分析とレポート", - "admin.analytics.description": "トークン・ジョブ・登録・フィード・チケット・請求からのライブKPIと傾向。", - "admin.analytics.period": "期間", - "admin.analytics.refreshing": "更新中…", - "admin.analytics.llmTokens": "LLMトークン", - "admin.analytics.credits": "クレジット", - "admin.analytics.jobs": "ジョブ", - "admin.analytics.volume": "ボリューム", - "admin.analytics.failureRate": "失敗率", - "admin.analytics.stuckJobs": "停滞ジョブ", - "admin.analytics.apiKeys": "APIキー", - "admin.analytics.signups": "登録数", - "admin.analytics.internalAi": "内部AI", - "admin.analytics.internalAiHint": "プラットフォーム OpenAI(管理設定)", - "admin.analytics.popularKeys": "人気キー", - "admin.analytics.popularKeysHint": "テナント OpenAI / Groq / …", - "admin.analytics.customUrl": "カスタムURL/モデル", - "admin.analytics.customUrlHint": "テナントのベースURL + モデル + キー", - "admin.analytics.tokensByDay": "日別トークン", - "admin.analytics.tokensByProvider": "プロバイダークラス別トークン", - "admin.analytics.tokensByProviderAria": "プロバイダークラス別トークン", - "admin.analytics.internalCount": "内部 {count}", - "admin.analytics.popularCount": "人気 {count}", - "admin.analytics.customCount": "カスタム {count}", - "admin.analytics.jobsByDay": "日別ジョブ", - "admin.analytics.jobsByDayHint": "作成ジョブ(副系列 = 失敗)。", - "admin.analytics.signupsByDay": "日別登録", - "admin.analytics.signupsByDayHint": "新規ユーザー(主)と会社(副)", - "admin.analytics.processingJobsStatus": "processing_jobs(ステータス別)", - "admin.analytics.feedSyncStatus": "feed_sync_jobs(ステータス別)", - "admin.analytics.ticketsStatus": "support_tickets(ステータス別)", - "admin.analytics.providerDetail": "プロバイダー詳細", - "admin.analytics.providerDetailHint": "上位プロバイダーモード(ペイロードサイズで上限)。", - "admin.analytics.noProviderRows": "プロバイダー行なし", - "admin.analytics.provider": "プロバイダー", - "admin.analytics.class": "クラス", - "admin.analytics.tokensCol": "トークン", - "admin.analytics.productsCol": "商品", - "admin.analytics.companiesHint": "トークン上位の会社(プロバイダー内訳)", - "admin.analytics.noCompanies": "会社なし", - "admin.analytics.noCompaniesMsg": "会社リストが空です。", - "admin.analytics.company": "会社", - "admin.analytics.internal": "内部", - "admin.analytics.popular": "人気", - "admin.analytics.custom": "カスタム", - "admin.analytics.noBillingCycles": "請求サイクルはまだありません", - "admin.analytics.linkDiagnostics": "診断", - "admin.analytics.linkStuck": "スタックした商品", - "admin.users.eyebrow": "プラットフォーム管理者", - "admin.users.title": "ユーザーと組織", - "admin.users.description": "プラットフォームのユーザーディレクトリ、スタッフロール、会社プラン割り当て。", - "admin.users.staffRoleUnavailable": "このデプロイではスタッフロールの更新はまだ利用できません。必要な場合はプラットフォーム管理者に連絡してください。", - "admin.users.search": "検索", - "admin.users.tabUsers": "ユーザー", - "admin.users.tabCompanies": "会社", + "admin.overview.eyebrow": "コマンドセンター", + "admin.overview.title": "プラットフォーム概要", + "admin.overview.description": "アナリティクス概要からのライブプラットフォーム状況 — 運用・インサイト・サポートへ。", + "admin.overview.tokens": "トークン", + "admin.overview.tokensHint": "全期間 · 期間", + "admin.overview.credits": "クレジット", + "admin.overview.creditsHint": "すべての会社", + "admin.overview.jobs": "ジョブ", + "admin.overview.jobsHint": "キューのスナップショット", + "admin.overview.platform": "プラットフォーム", + "admin.overview.platformHint": "テナント · ボリューム", + "admin.overview.signals": "最近のシグナル", + "admin.overview.shortcuts": "運用ショートカット", + "admin.overview.providers": "AIプロバイダー構成", + "admin.overview.internalAi": "内部AI", + "admin.overview.internalAiHint": "プラットフォーム設定", + "admin.overview.popularKeys": "人気キー", + "admin.overview.popularKeysHint": "テナントの人気プロバイダー", + "admin.overview.customUrl": "カスタムURL", + "admin.overview.customUrlHint": "テナントのカスタムベースURL", + "admin.overview.linkBilling": "請求", + "admin.overview.linkSettings": "設定", + "admin.overview.shortcut.diagnostics.title": "診断", + "admin.overview.shortcut.diagnostics.desc": "ヘルスチェック、キュー、最近の失敗", + "admin.overview.shortcut.analytics.title": "アナリティクス", + "admin.overview.shortcut.analytics.desc": "トークン、ジョブ、登録、プロバイダー", + "admin.overview.shortcut.knowledge.title": "ナレッジ", + "admin.overview.shortcut.knowledge.desc": "記事、テンプレート、自動返信", + "admin.overview.shortcut.users.title": "ユーザーと組織", + "admin.overview.shortcut.users.desc": "アカウント、会社、招待", + "admin.overview.shortcut.stuck.title": "スタックした商品", + "admin.overview.shortcut.stuck.desc": "2時間以上実行中", + "admin.overview.signal.stuckTitle": "{count} 件の停滞ジョブ", + "admin.overview.signal.stuckTitlePlural": "{count} 件の停滞ジョブ", + "admin.overview.signal.stuckDetail": "2時間以上実行中 — 確認し、必要ならリセットしてください。", + "admin.overview.signal.stuckCta": "停滞ジョブを開く", + "admin.overview.signal.failedTitle": "ç›´è¿‘{days}日で{count}件失敗", + "admin.overview.signal.failedDetail": "同じ期間で{completed}件完了。", + "admin.overview.signal.failedDetailRate": "{rate}% 失敗率 · {completed} 件完了。", + "admin.overview.signal.failedCta": "診断を開く", + "admin.overview.signal.runningTitle": "{count} 件の実行中ジョブ", + "admin.overview.signal.runningTitlePlural": "{count} 件の実行中ジョブ", + "admin.overview.signal.runningDetail": "現在実行中の処理ジョブ。", + "admin.overview.signal.runningCta": "キューを表示", + "admin.overview.signal.ticketsTitle": "{count} 件の未解決サポートチケット", + "admin.overview.signal.ticketsTitlePlural": "{count} 件の未解決サポートチケット", + "admin.overview.signal.ticketsDetail": "サポートデスクの未対応または保留中のチケット。", + "admin.overview.signal.ticketsCta": "サポートを開く", + "admin.overview.signal.clearTitle": "高いシグナルなし", + "admin.overview.signal.clearDetail": "ライブ概要に停滞ジョブ・期間失敗・未解決チケットはありません(直近{days}日)。", + "admin.overview.signal.clearCta": "診断で確認", + "admin.overview.badge.action": "アクション", + "admin.overview.badge.watch": "監視", + "admin.overview.badge.live": "ライブ", + "admin.overview.badge.clear": "クリア", + "admin.overview.summaryLoadFailed": "ライブ概要を読み込めませんでした。下のショートカットは引き続き使えます。", + "admin.overview.keyMetrics": "主要指標", + "admin.overview.summaryWindow": "ç›´è¿‘{days}æ—¥ · サマリーエンドポイント", + "admin.overview.tokensPeriod": "ç›´è¿‘{days}日で{count}", + "admin.overview.creditsFoot": "割当{allocated}のうち残り{remaining}", + "admin.overview.jobsFoot": "失敗{failed} · 実行中{running} · 停滞{stuck}", + "admin.overview.platformFoot": "ユーザー{users} · 処理済み{processed} · 入力フィード{feeds}", + "admin.overview.fullDiagnostics": "詳細診断", + "admin.overview.also": "その他:", + "admin.overview.linkSupport": "サポートデスク", + "admin.overview.charts": "チャート", + "admin.overview.providerFoot": "ジョブ{jobs} · 商品{products}", + "admin.analytics.eyebrow": "インサイト", + "admin.analytics.title": "分析とレポート", + "admin.analytics.description": "トークン・ジョブ・登録・フィード・チケット・請求からのライブKPIと傾向。", + "admin.analytics.period": "期間", + "admin.analytics.refreshing": "更新中…", + "admin.analytics.llmTokens": "LLMトークン", + "admin.analytics.credits": "クレジット", + "admin.analytics.jobs": "ジョブ", + "admin.analytics.volume": "ボリューム", + "admin.analytics.failureRate": "失敗率", + "admin.analytics.stuckJobs": "停滞ジョブ", + "admin.analytics.apiKeys": "APIキー", + "admin.analytics.signups": "登録数", + "admin.analytics.internalAi": "内部AI", + "admin.analytics.internalAiHint": "プラットフォーム OpenAI(管理設定)", + "admin.analytics.popularKeys": "人気キー", + "admin.analytics.popularKeysHint": "テナント OpenAI / Groq / …", + "admin.analytics.customUrl": "カスタムURL/モデル", + "admin.analytics.customUrlHint": "テナントのベースURL + モデル + キー", + "admin.analytics.tokensByDay": "日別トークン", + "admin.analytics.tokensByProvider": "プロバイダークラス別トークン", + "admin.analytics.tokensByProviderAria": "プロバイダークラス別トークン", + "admin.analytics.internalCount": "内部 {count}", + "admin.analytics.popularCount": "人気 {count}", + "admin.analytics.customCount": "カスタム {count}", + "admin.analytics.jobsByDay": "日別ジョブ", + "admin.analytics.jobsByDayHint": "作成ジョブ(副系列 = 失敗)。", + "admin.analytics.signupsByDay": "日別登録", + "admin.analytics.signupsByDayHint": "新規ユーザー(主)と会社(副)", + "admin.analytics.processingJobsStatus": "processing_jobs(ステータス別)", + "admin.analytics.feedSyncStatus": "feed_sync_jobs(ステータス別)", + "admin.analytics.ticketsStatus": "support_tickets(ステータス別)", + "admin.analytics.providerDetail": "プロバイダー詳細", + "admin.analytics.providerDetailHint": "上位プロバイダーモード(ペイロードサイズで上限)。", + "admin.analytics.noProviderRows": "プロバイダー行なし", + "admin.analytics.provider": "プロバイダー", + "admin.analytics.class": "クラス", + "admin.analytics.tokensCol": "トークン", + "admin.analytics.productsCol": "商品", + "admin.analytics.companiesHint": "トークン上位の会社(プロバイダー内訳)", + "admin.analytics.noCompanies": "会社なし", + "admin.analytics.noCompaniesMsg": "会社リストが空です。", + "admin.analytics.company": "会社", + "admin.analytics.internal": "内部", + "admin.analytics.popular": "人気", + "admin.analytics.custom": "カスタム", + "admin.analytics.noBillingCycles": "請求サイクルはまだありません", + "admin.analytics.linkDiagnostics": "診断", + "admin.analytics.linkStuck": "スタックした商品", + "admin.users.eyebrow": "プラットフォーム管理者", + "admin.users.title": "ユーザーと組織", + "admin.users.description": "プラットフォームのユーザーディレクトリ、スタッフロール、会社プラン割り当て。", + "admin.users.staffRoleUnavailable": "このデプロイではスタッフロールの更新はまだ利用できません。必要な場合はプラットフォーム管理者に連絡してください。", + "admin.users.search": "検索", + "admin.users.tabUsers": "ユーザー", + "admin.users.tabCompanies": "会社", "admin.users.filterWithoutPlan": "Without plan", "admin.users.filterWithoutApiKeys": "Keys needing reissue", "admin.users.needsApiKeyReissue": "Needs API key reissue", - "admin.users.colName": "名前", - "admin.users.colStaffRole": "スタッフロール", - "admin.users.colStatus": "ステータス", - "admin.users.colCreated": "作成日", - "admin.users.colActions": "操作", - "admin.users.mustSetPassword": "パスワード設定が必要", - "admin.users.inactive": "無効", - "admin.users.reissueInvite": "招待を再発行", - "admin.users.setLocalPassword": "ローカルパスワードを設定", - "admin.users.switchToUser": "ユーザーに切り替え", - "admin.users.colCompany": "会社", - "admin.users.colPlan": "プラン", - "admin.users.colCredits": "クレジット", - "admin.users.colLanguage": "言語", - "admin.users.assignPlan": "プランを割り当て", - "admin.users.cloneCatalog": "自分の会社にコピー", - "admin.users.cloneCatalogAria": "{name} のカタログをサンドボックス会社へコピー", - "admin.users.cloneCatalogTitle": "会社カタログをコピー", - "admin.users.cloneCatalogDesc": "管理者アカウントのまま操作します。元データは変更されません。", - "admin.users.cloneCatalogFrom": "コピー元: {name}", - "admin.users.cloneCatalogInto": "コピー先: {name}", - "admin.users.cloneCatalogWarning": "コピー先のカテゴリ、フィード、商品、属性、マッピング、ブランドを置き換えます。プラン、請求、メンバー、APIキー、ストア連携はコピーされません。", - "admin.users.cloneCatalogCancel": "キャンセル", - "admin.users.cloneCatalogConfirm": "カタログをコピー", - "admin.users.cloneDestFallback": "サンドボックス会社", - "admin.users.fixA1": "A1カタログを修復", - "admin.users.fixA1Aria": "{name} のAIプロンプト、カテゴリ、enhanceハッシュを修復", - "admin.users.fixA1Title": "会社カタログを修復", - "admin.users.fixA1Desc": "修正済みAIプロンプトを再適用し、弱いenhanceハッシュを消去し、mapped_dataからカテゴリを補完します。", - "admin.users.fixA1Company": "会社: {name}", - "admin.users.fixA1Warning": "Platform Demoまたは明示的な会社を優先してください。フィード、マッピング、生製品は削除しません。A1コホートの上書きルールを保護します。", - "admin.users.fixA1Cancel": "キャンセル", - "admin.users.fixA1Confirm": "カタログを修復", - "admin.users.noUsers": "このフィルタに一致するユーザーはいません。", - "admin.users.noCompanies": "このフィルタに一致する会社はありません。", - "admin.users.assignRoleTitle": "スタッフロールを割り当て", - "admin.users.assignRoleDesc": "プラットフォームロールは管理パネル(Admin & Developer)とサポートデスク(サポートスタッフ)を制御します。", - "admin.users.staffRole": "スタッフロール", - "admin.users.saveRole": "ロールを保存", - "admin.users.assignPlanTitle": "プランを割り当て", - "admin.users.assignPlanDesc": "この会社に公開・レガシー・カスタムプランを割り当てます。", - "admin.users.selectPlan": "プランを選択", - "admin.users.assign": "割り当て", - "admin.settings.title": "プラットフォーム設定", - "admin.settings.description": "このデプロイのプラットフォーム認証情報、AIロール、メール、連携", - "admin.settings.intro": "ここでプラットフォームAIロール、SMTP、OAuth、EPREL、Pinecone、Stripeを設定します。シークレット欄を空にすると保存値を維持します。会社ごとのキーはテナント連携にあります。", - "admin.settings.aiRolesUnavailable": "このデプロイでは完全なAIロールはまだ利用できません。処理は引き続きプラットフォームOpenAI設定経由で保存されます。他ロールは対応後に永続化されます。", - "admin.settings.tab.integrations": "概要", - "admin.settings.tab.ai": "AIロール", - "admin.settings.tab.mail": "メール", - "admin.settings.tab.other": "その他", - "admin.settings.tab.admins": "管理ユーザー", - "admin.settings.mailCardDesc": "パスワード設定招待とプラットフォームの送信メール", - "admin.settings.integrationsCardDesc": "OAuth、EPREL、Pinecone、Stripe、フィード", - "admin.settings.tenantVsPlatform": "テナント vs プラットフォーム", - "admin.settings.hostSecrets": "サーバーのDB・セッション・署名シークレット — ホスト上でのみ設定", + "admin.users.colName": "名前", + "admin.users.colStaffRole": "スタッフロール", + "admin.users.colStatus": "ステータス", + "admin.users.colCreated": "作成日", + "admin.users.colActions": "操作", + "admin.users.mustSetPassword": "パスワード設定が必要", + "admin.users.inactive": "無効", + "admin.users.reissueInvite": "招待を再発行", + "admin.users.setLocalPassword": "ローカルパスワードを設定", + "admin.users.switchToUser": "ユーザーに切り替え", + "admin.users.colCompany": "会社", + "admin.users.colPlan": "プラン", + "admin.users.colCredits": "クレジット", + "admin.users.colLanguage": "言語", + "admin.users.assignPlan": "プランを割り当て", + "admin.users.cloneCatalog": "自分の会社にコピー", + "admin.users.cloneCatalogAria": "{name} のカタログをサンドボックス会社へコピー", + "admin.users.cloneCatalogTitle": "会社カタログをコピー", + "admin.users.cloneCatalogDesc": "管理者アカウントのまま操作します。元データは変更されません。", + "admin.users.cloneCatalogFrom": "コピー元: {name}", + "admin.users.cloneCatalogInto": "コピー先: {name}", + "admin.users.cloneCatalogWarning": "コピー先のカテゴリ、フィード、商品、属性、マッピング、ブランドを置き換えます。プラン、請求、メンバー、APIキー、ストア連携はコピーされません。", + "admin.users.cloneCatalogCancel": "キャンセル", + "admin.users.cloneCatalogConfirm": "カタログをコピー", + "admin.users.cloneDestFallback": "サンドボックス会社", + "admin.users.fixA1": "A1カタログを修復", + "admin.users.fixA1Aria": "{name} のAIプロンプト、カテゴリ、enhanceハッシュを修復", + "admin.users.fixA1Title": "会社カタログを修復", + "admin.users.fixA1Desc": "修正済みAIプロンプトを再適用し、弱いenhanceハッシュを消去し、mapped_dataからカテゴリを補完します。", + "admin.users.fixA1Company": "会社: {name}", + "admin.users.fixA1Warning": "Platform Demoまたは明示的な会社を優先してください。フィード、マッピング、生製品は削除しません。A1コホートの上書きルールを保護します。", + "admin.users.fixA1Cancel": "キャンセル", + "admin.users.fixA1Confirm": "カタログを修復", + "admin.users.noUsers": "このフィルタに一致するユーザーはいません。", + "admin.users.noCompanies": "このフィルタに一致する会社はありません。", + "admin.users.assignRoleTitle": "スタッフロールを割り当て", + "admin.users.assignRoleDesc": "プラットフォームロールは管理パネル(Admin & Developer)とサポートデスク(サポートスタッフ)を制御します。", + "admin.users.staffRole": "スタッフロール", + "admin.users.saveRole": "ロールを保存", + "admin.users.assignPlanTitle": "プランを割り当て", + "admin.users.assignPlanDesc": "この会社に公開・レガシー・カスタムプランを割り当てます。", + "admin.users.selectPlan": "プランを選択", + "admin.users.assign": "割り当て", + "admin.settings.title": "プラットフォーム設定", + "admin.settings.description": "このデプロイのプラットフォーム認証情報、AIロール、メール、連携", + "admin.settings.intro": "ここでプラットフォームAIロール、SMTP、OAuth、EPREL、Pinecone、Stripeを設定します。シークレット欄を空にすると保存値を維持します。会社ごとのキーはテナント連携にあります。", + "admin.settings.aiRolesUnavailable": "このデプロイでは完全なAIロールはまだ利用できません。処理は引き続きプラットフォームOpenAI設定経由で保存されます。他ロールは対応後に永続化されます。", + "admin.settings.tab.integrations": "概要", + "admin.settings.tab.ai": "AIロール", + "admin.settings.tab.mail": "メール", + "admin.settings.tab.other": "その他", + "admin.settings.tab.admins": "管理ユーザー", + "admin.settings.mailCardDesc": "パスワード設定招待とプラットフォームの送信メール", + "admin.settings.integrationsCardDesc": "OAuth、EPREL、Pinecone、Stripe、フィード", + "admin.settings.tenantVsPlatform": "テナント vs プラットフォーム", + "admin.settings.hostSecrets": "サーバーのDB・セッション・署名シークレット — ホスト上でのみ設定", "admin.settings.linkAi": "AI", - "admin.settings.linkEmail": "メール", - "admin.settings.linkBilling": "請求", - "admin.settings.provider": "プロバイダー", - "admin.settings.model": "モデル", - "admin.settings.baseUrl": "ベースURL", - "admin.settings.apiKey": "APIキー", - "admin.settings.embeddingDims": "埋め込み次元(任意)", - "admin.settings.smtpHost": "SMTPホスト", - "admin.settings.port": "ポート", - "admin.settings.username": "ユーザー名", - "admin.settings.fromAddress": "送信元アドレス", - "admin.settings.testRecipient": "テスト宛先(任意)", - "admin.settings.testRecipientPlaceholder": "既定は管理者メール", + "admin.settings.linkEmail": "メール", + "admin.settings.linkBilling": "請求", + "admin.settings.provider": "プロバイダー", + "admin.settings.model": "モデル", + "admin.settings.baseUrl": "ベースURL", + "admin.settings.apiKey": "APIキー", + "admin.settings.embeddingDims": "埋め込み次元(任意)", + "admin.settings.smtpHost": "SMTPホスト", + "admin.settings.port": "ポート", + "admin.settings.username": "ユーザー名", + "admin.settings.fromAddress": "送信元アドレス", + "admin.settings.testRecipient": "テスト宛先(任意)", + "admin.settings.testRecipientPlaceholder": "既定は管理者メール", "admin.settings.googleOauth": "Google OAuth", - "admin.settings.googleOauthDesc": "任意のプラットフォーム Google OAuth クライアント認証情報。", - "admin.settings.clientId": "クライアントID", + "admin.settings.googleOauthDesc": "任意のプラットフォーム Google OAuth クライアント認証情報。", + "admin.settings.clientId": "クライアントID", "admin.settings.eprel": "EPREL", - "admin.settings.timeout": "タイムアウト", - "admin.settings.ficheLanguage": "フィシュ言語", + "admin.settings.timeout": "タイムアウト", + "admin.settings.ficheLanguage": "フィシュ言語", "admin.settings.pinecone": "Pinecone", - "admin.settings.host": "ホスト", - "admin.settings.namespace": "名前空間", - "admin.settings.namespacePlaceholder": "任意", + "admin.settings.host": "ホスト", + "admin.settings.namespace": "名前空間", + "admin.settings.namespacePlaceholder": "任意", "admin.settings.stripe": "Stripe", - "admin.settings.priceStarterMo": "Starter月額価格ID", - "admin.settings.priceStarterYr": "Starter年額価格ID", + "admin.settings.priceStarterMo": "Starter月額価格ID", + "admin.settings.priceStarterYr": "Starter年額価格ID", "admin.settings.pricePlusMo": "Plus monthly price ID", "admin.settings.pricePlusYr": "Plus yearly price ID", - "admin.settings.priceGrowthMo": "Growth月額価格ID", - "admin.settings.priceGrowthYr": "Growth年額価格ID", - "admin.settings.priceBusinessMo": "Business月額価格ID", - "admin.settings.priceBusinessYr": "Business年額価格ID", + "admin.settings.priceGrowthMo": "Growth月額価格ID", + "admin.settings.priceGrowthYr": "Growth年額価格ID", + "admin.settings.priceBusinessMo": "Business月額価格ID", + "admin.settings.priceBusinessYr": "Business年額価格ID", "admin.settings.priceScaleMo": "Scale monthly price ID", "admin.settings.priceScaleYr": "Scale yearly price ID", "admin.settings.creditPackPrices": "AI credit pack price IDs (one-time)", - "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", + "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", "admin.settings.syncCreditPacks": "Sync Stripe packs", "admin.settings.syncCreditPacksOk": "Synced {count} credit pack price(s) ({mode} mode).", "admin.settings.syncCreditPacksModeHint": "Stripe mode for this sync: {mode}. Switch the secret key (sk_test_ vs sk_live_) to sync the other environment.", @@ -888,55 +888,55 @@ export const ja: MessageDict = { "admin.settings.pricePackMedium": "Growth pack (2,000 credits) price ID", "admin.settings.pricePackLarge": "Catalog pack (10,000 credits) price ID", "admin.settings.pricePackXL": "Scale pack (40,000 credits) price ID", - "admin.settings.feedAllowlist": "フィードのプライベートURL許可リスト", - "admin.settings.allowlist": "許可リスト", - "admin.settings.platformAdmins": "プラットフォーム管理者", - "admin.settings.colUserId": "ユーザーID", - "admin.settings.colEmail": "メール", - "admin.settings.colName": "名前", - "admin.settings.colAddedOn": "追加日", - "admin.settings.colRole": "ロール", - "admin.settings.platformAdminBadge": "プラットフォーム管理者", - "admin.settings.noAdmins": "管理ユーザーが見つかりません", - "admin.settings.adminStatusCheck": "管理者ステータス確認", - "admin.settings.bootstrapPage": "ブートストラップページ", - "admin.readiness.title": "カットオーバー準備状況", - "admin.readiness.detail": "DNS切替前にまだ対応が必要な hypercare 件数。", - "admin.readiness.mustSetPassword": "{count} 人のユーザーがパスワード設定が必要", - "admin.readiness.withoutAdmin": "管理者がいない会社 {count} 社", - "admin.readiness.withoutPlan": "有効プランのない会社 {count} 社", + "admin.settings.feedAllowlist": "フィードのプライベートURL許可リスト", + "admin.settings.allowlist": "許可リスト", + "admin.settings.platformAdmins": "プラットフォーム管理者", + "admin.settings.colUserId": "ユーザーID", + "admin.settings.colEmail": "メール", + "admin.settings.colName": "名前", + "admin.settings.colAddedOn": "追加日", + "admin.settings.colRole": "ロール", + "admin.settings.platformAdminBadge": "プラットフォーム管理者", + "admin.settings.noAdmins": "管理ユーザーが見つかりません", + "admin.settings.adminStatusCheck": "管理者ステータス確認", + "admin.settings.bootstrapPage": "ブートストラップページ", + "admin.readiness.title": "カットオーバー準備状況", + "admin.readiness.detail": "DNS切替前にまだ対応が必要な hypercare 件数。", + "admin.readiness.mustSetPassword": "{count} 人のユーザーがパスワード設定が必要", + "admin.readiness.withoutAdmin": "管理者がいない会社 {count} 社", + "admin.readiness.withoutPlan": "有効プランのない会社 {count} 社", "admin.readiness.withoutApiKeys": "{count} companies needing API key reissue", - "admin.readiness.linksAria": "準備状況のディープリンク", - "admin.readiness.linkUsers": "ユーザー", - "admin.readiness.linkBilling": "請求", - "admin.readiness.linkSettings": "設定", + "admin.readiness.linksAria": "準備状況のディープリンク", + "admin.readiness.linkUsers": "ユーザー", + "admin.readiness.linkBilling": "請求", + "admin.readiness.linkSettings": "設定", "admin.readiness.linkApiKeys": "Keys needing reissue", - "admin.diagnostics.eyebrow": "プラットフォーム", - "admin.diagnostics.title": "診断", - "admin.diagnostics.description": "アプリ健全性・キュー深度・最近のジョブ・設定フラグの運用コンソール。シークレットとDSNは表示されず、ジョブエラーはサニタイズされます。", - "admin.diagnostics.filterAria": "ジョブステータスフィルタ", - "admin.diagnostics.queue": "キュー", - "admin.diagnostics.noJobsInQueue": "キューにジョブはありません。", - "admin.diagnostics.sanitizedErrors": "サニタイズ済みエラー · 最大25", + "admin.diagnostics.eyebrow": "プラットフォーム", + "admin.diagnostics.title": "診断", + "admin.diagnostics.description": "アプリ健全性・キュー深度・最近のジョブ・設定フラグの運用コンソール。シークレットとDSNは表示されず、ジョブエラーはサニタイズされます。", + "admin.diagnostics.filterAria": "ジョブステータスフィルタ", + "admin.diagnostics.queue": "キュー", + "admin.diagnostics.noJobsInQueue": "キューにジョブはありません。", + "admin.diagnostics.sanitizedErrors": "サニタイズ済みエラー · 最大25", "admin.diagnostics.colId": "ID", - "admin.diagnostics.colCompany": "会社", - "admin.diagnostics.colStatus": "ステータス", - "admin.diagnostics.colProgress": "進捗", - "admin.diagnostics.colUpdated": "更新済み", - "admin.diagnostics.colError": "エラー", - "admin.diagnostics.colTicket": "チケット", - "admin.diagnostics.colWhen": "タイミング", - "admin.diagnostics.noJobsFilter": "このフィルタのジョブはありません。", - "admin.stuck.title": "スタックした商品", - "admin.stuck.description": "最近の処理ジョブを確認し、2時間超停滞しているものをリセット", - "admin.stuck.noJobs": "ジョブが見つかりません。", - "admin.stuck.filterAria": "ステータスでジョブを絞り込み", + "admin.diagnostics.colCompany": "会社", + "admin.diagnostics.colStatus": "ステータス", + "admin.diagnostics.colProgress": "進捗", + "admin.diagnostics.colUpdated": "更新済み", + "admin.diagnostics.colError": "エラー", + "admin.diagnostics.colTicket": "チケット", + "admin.diagnostics.colWhen": "タイミング", + "admin.diagnostics.noJobsFilter": "このフィルタのジョブはありません。", + "admin.stuck.title": "スタックした商品", + "admin.stuck.description": "最近の処理ジョブを確認し、2時間超停滞しているものをリセット", + "admin.stuck.noJobs": "ジョブが見つかりません。", + "admin.stuck.filterAria": "ステータスでジョブを絞り込み", "admin.orphan.title": "Orphan processed", - "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", + "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", "admin.orphan.cutoverHint": "Safe by default: refresh and dry-run never delete. Confirm delete sends confirm=true only after you approve the dialog.", "admin.orphan.refreshReport": "Refresh report", "admin.orphan.dryRunBtn": "Dry-run cleanup", - "admin.orphan.deleteBtn": "Confirm delete…", + "admin.orphan.deleteBtn": "Confirm delete…", "admin.orphan.loadFailed": "Could not load orphan report", "admin.orphan.dryRunFailed": "Dry-run cleanup failed", "admin.orphan.deleteFailed": "Confirmed orphan cleanup failed", @@ -947,7 +947,7 @@ export const ja: MessageDict = { "admin.orphan.samplesDesc": "Up to 25 most recently updated orphan catalog rows", "admin.orphan.cleanBadge": "Clean", "admin.orphan.needsCleanupBadge": "Needs cleanup", - "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", + "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", "admin.orphan.noSamples": "No sample rows in this report.", "admin.orphan.colProcessed": "Processed ID", "admin.orphan.colCompany": "Company", @@ -962,2876 +962,2877 @@ export const ja: MessageDict = { "admin.orphan.confirmTitle": "Delete orphan processed rows?", "admin.orphan.confirmDesc": "This permanently deletes {total} processed_products row(s) whose raw is missing or unprocessed. Job product links use ON DELETE SET NULL.", "admin.orphan.confirmDelete": "Delete orphans", - "admin.billing.title": "請求管理者", - "admin.billing.description": "プラン、クレジット、パッケージ単位の機能権限、プラットフォーム全体の機能スイッチを管理します。", - "admin.billing.noCompanies": "会社が見つかりません。", - "admin.billing.noCompaniesFilter": "このフィルタに一致する会社はありません。", - "admin.billing.assignPlanTitle": "プランを割り当て", - "admin.billing.assignPlanDesc": "会社に請求プランを割り当てます。任意のトライアルクレジットは試用期間の会社残高をリセットします。", - "admin.billing.creditsTitle": "クレジットを追加 / 調整", - "admin.billing.creditsDesc": "会社の残高に加算または減算します。", - "admin.billing.searchCompany": "会社を検索…", - "admin.knowledge.draft": "下書き", - "admin.knowledge.badge.draft": "下書き", - "admin.knowledge.newArticle": "新しい記事", - "admin.knowledge.editArticle": "記事を編集", - "admin.knowledge.noMatchingArticles": "一致する記事がありません", - "admin.knowledge.noArticles": "ナレッジ記事がありません", - "admin.knowledge.emptyCategoryMsg": "カテゴリ「{category}」の準備ができました — コンテンツエージェントが埋める記事シェルを追加してください。", - "admin.knowledge.emptyArticlesMsg": "カテゴリとキーワード付きの FAQ 風シェルを追加してください。本文のプレースホルダーはコンテンツエージェント用に残します。", - "admin.knowledge.col.title": "タイトル", - "admin.knowledge.col.name": "名前", - "admin.knowledge.edit": "編集", - "admin.knowledge.newTemplate": "新しいテンプレート", - "admin.knowledge.editTemplate": "テンプレートを編集", - "admin.knowledge.allCategories": "すべて", - "admin.settings.enablePlatformSmtp": "プラットフォームSMTPを有効化", - "admin.plans.title": "サブスクリプションプラン", - "admin.plans.description": "公開 ladder, A1 / レガシー, プラットフォーム Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under 非表示.", - "admin.plans.searchPlaceholder": "名前または説明を検索…", - "admin.plans.searchAria": "プランを検索", - "admin.plans.filterAria": "可視性でプランをフィルタ", - "admin.plans.filter.catalog": "カタログ", - "admin.plans.filter.public": "公開", - "admin.plans.filter.legacy": "レガシー", - "admin.plans.filter.custom": "カスタム", - "admin.plans.filter.hidden": "非表示", - "admin.plans.filter.all": "すべて", - "admin.plans.col.plan": "プラン", - "admin.plans.col.visibility": "可視性", - "admin.plans.col.monthlyCredits": "月次クレジット", - "admin.plans.col.maxProducts": "最大商品数", - "admin.plans.col.term": "期間", - "admin.plans.customPackageFlag": "カスタムパッケージフラグ", - "admin.plans.visibility.public": "公開", - "admin.plans.visibility.legacy": "レガシー", - "admin.plans.visibility.hidden": "非表示", - "admin.plans.visibility.custom": "カスタム", - "admin.plans.edit": "編集", - "admin.plans.editAria": "{name} を編集", - "admin.plans.assign": "割り当て", - "admin.plans.assignAria": "{name} を割り当て", - "admin.plans.permissions": "プラン権限", - "admin.plans.permissionsAria": "編集 プラン権限 for {name}", - "admin.plans.showing": "{total} 件中 {filtered} 件のプランを表示", - "admin.plans.unlimited": "無制限", - "admin.plans.optionLabel": "{name} ({credits} credits) · {kind}(訳)", - "admin.permissions.noteStrong": "プラン entitlements only.", - "admin.permissions.noteBody": "These toggles set what this package may include. プラットフォーム-wide on/オフ masters are on the {global} tab — a plan can enable a feature that still stays オフ when the platform switch is 無効.", - "admin.permissions.globalTab": "グローバルスイッチ", - "admin.permissions.title": "プラン権限", - "admin.permissions.descCount": "{enabled}/{total} 有効", - "admin.permissions.matchesProfile": "matches {profile}(訳)", - "admin.permissions.customizedOverrides": "customized overrides(訳)", - "admin.permissions.planDefaults": "plan defaults(訳)", - "admin.permissions.badge.legacy": "Migrated legacy package(訳)", - "admin.permissions.badge.publicLadder": "公開 ladder", - "admin.permissions.badge.ladderCustom": "公開 ladder · カスタム flag", - "admin.permissions.badge.customDeal": "カスタム deal", - "admin.permissions.badge.clientDeal": "Client deal(訳)", - "admin.permissions.badge.customOverrides": "カスタム overrides", - "admin.permissions.badge.defaults": "デフォルト", - "admin.permissions.badge.customFlag": "カスタム flag", - "admin.permissions.package": "パッケージ", - "admin.permissions.noPlans": "プランなし", - "admin.permissions.suffix.legacy": "· legacy", - "admin.permissions.suffix.default": " · デフォルト", - "admin.permissions.suffix.custom": " · カスタム", - "admin.permissions.section": "セクション", - "admin.permissions.allSections": "すべてのセクション", - "admin.permissions.state": "状態", - "admin.permissions.stateAll": "すべて", - "admin.permissions.stateOn": "有効", - "admin.permissions.stateOff": "無効", - "admin.permissions.stateDiffers": "相違あり from default", - "admin.permissions.search": "検索", - "admin.permissions.searchPlaceholder": "キーまたはラベルで絞り込み", - "admin.permissions.profilesAria": "プラン feature profiles", - "admin.permissions.applyProfile": "プロファイルを適用", - "admin.permissions.applyLegacy": "レガシープロファイルを適用", - "admin.permissions.profilesHint": "One-click matrices for public ladder packages and migrated legacy navigation. 保存s overrides for the 選択済み package only.", - "admin.permissions.applyNamed": "{label} を適用", - "admin.permissions.applyGeneric": "プロファイルを適用", - "admin.permissions.enableAll": "すべて有効化", - "admin.permissions.disableAll": "すべて無効化", - "admin.permissions.clearOverrides": "オーバーライドをクリア", - "admin.permissions.globallyOff": "Globally オフ", - "admin.permissions.enableSection": "Enable section(訳)", - "admin.permissions.disableSection": "Disable section(訳)", - "admin.permissions.noMatch": "現在のフィルタに一致する機能はありません。", - "admin.permissions.differs": "相違あり", - "admin.permissions.platformOffHint": "オフ プラットフォーム全体 even if this plan enables it.", - "admin.permissions.sectionToggled": "{label} {state} for this plan.(訳)", - "admin.permissions.state.enabled": "有効", - "admin.permissions.state.disabled": "無効", - "admin.permissions.loadFailed": "読み込みに失敗 プラン権限", - "admin.permissions.saveFailed": "保存に失敗 feature", - "admin.permissions.enableAllFailed": "すべて有効化 失敗", - "admin.permissions.disableAllFailed": "すべて無効化 失敗", - "admin.permissions.profileFailed": "失敗: apply profile", - "admin.permissions.resetFailed": "失敗: reset defaults", - "admin.permissions.sectionFailed": "セクション update 失敗", - "admin.profile.legacy.label": "レガシー", - "admin.profile.legacy.description": "Migrated legacy navigation: catalog, フィード, 請求, and 設定; no 戻るground Tasks, ストア, or marketing.", - "admin.profile.free.label": "無料", - "admin.profile.free.description": "公開 Free ladder — AI, APIキーs, live email, and own-key AI オフ.", + "admin.billing.title": "請求管理者", + "admin.billing.description": "プラン、クレジット、パッケージ単位の機能権限、プラットフォーム全体の機能スイッチを管理します。", + "admin.billing.noCompanies": "会社が見つかりません。", + "admin.billing.noCompaniesFilter": "このフィルタに一致する会社はありません。", + "admin.billing.assignPlanTitle": "プランを割り当て", + "admin.billing.assignPlanDesc": "会社に請求プランを割り当てます。任意のトライアルクレジットは試用期間の会社残高をリセットします。", + "admin.billing.creditsTitle": "クレジットを追加 / 調整", + "admin.billing.creditsDesc": "会社の残高に加算または減算します。", + "admin.billing.searchCompany": "会社を検索…", + "admin.knowledge.draft": "下書き", + "admin.knowledge.badge.draft": "下書き", + "admin.knowledge.newArticle": "新しい記事", + "admin.knowledge.editArticle": "記事を編集", + "admin.knowledge.noMatchingArticles": "一致する記事がありません", + "admin.knowledge.noArticles": "ナレッジ記事がありません", + "admin.knowledge.emptyCategoryMsg": "カテゴリ「{category}」の準備ができました — コンテンツエージェントが埋める記事シェルを追加してください。", + "admin.knowledge.emptyArticlesMsg": "カテゴリとキーワード付きの FAQ 風シェルを追加してください。本文のプレースホルダーはコンテンツエージェント用に残します。", + "admin.knowledge.col.title": "タイトル", + "admin.knowledge.col.name": "名前", + "admin.knowledge.edit": "編集", + "admin.knowledge.newTemplate": "新しいテンプレート", + "admin.knowledge.editTemplate": "テンプレートを編集", + "admin.knowledge.allCategories": "すべて", + "admin.settings.enablePlatformSmtp": "プラットフォームSMTPを有効化", + "admin.plans.title": "サブスクリプションプラン", + "admin.plans.description": "公開 ladder, A1 / レガシー, プラットフォーム Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under 非表示.", + "admin.plans.searchPlaceholder": "名前または説明を検索…", + "admin.plans.searchAria": "プランを検索", + "admin.plans.filterAria": "可視性でプランをフィルタ", + "admin.plans.filter.catalog": "カタログ", + "admin.plans.filter.public": "公開", + "admin.plans.filter.legacy": "レガシー", + "admin.plans.filter.custom": "カスタム", + "admin.plans.filter.hidden": "非表示", + "admin.plans.filter.all": "すべて", + "admin.plans.col.plan": "プラン", + "admin.plans.col.visibility": "可視性", + "admin.plans.col.monthlyCredits": "月次クレジット", + "admin.plans.col.maxProducts": "最大商品数", + "admin.plans.col.term": "期間", + "admin.plans.customPackageFlag": "カスタムパッケージフラグ", + "admin.plans.visibility.public": "公開", + "admin.plans.visibility.legacy": "レガシー", + "admin.plans.visibility.hidden": "非表示", + "admin.plans.visibility.custom": "カスタム", + "admin.plans.edit": "編集", + "admin.plans.editAria": "{name} を編集", + "admin.plans.assign": "割り当て", + "admin.plans.assignAria": "{name} を割り当て", + "admin.plans.permissions": "プラン権限", + "admin.plans.permissionsAria": "編集 プラン権限 for {name}", + "admin.plans.showing": "{total} 件中 {filtered} 件のプランを表示", + "admin.plans.unlimited": "無制限", + "admin.plans.optionLabel": "{name} ({credits} credits) · {kind}(訳)", + "admin.permissions.noteStrong": "プラン entitlements only.", + "admin.permissions.noteBody": "These toggles set what this package may include. プラットフォーム-wide on/オフ masters are on the {global} tab — a plan can enable a feature that still stays オフ when the platform switch is 無効.", + "admin.permissions.globalTab": "グローバルスイッチ", + "admin.permissions.title": "プラン権限", + "admin.permissions.descCount": "{enabled}/{total} 有効", + "admin.permissions.matchesProfile": "matches {profile}(訳)", + "admin.permissions.customizedOverrides": "customized overrides(訳)", + "admin.permissions.planDefaults": "plan defaults(訳)", + "admin.permissions.badge.legacy": "Migrated legacy package(訳)", + "admin.permissions.badge.publicLadder": "公開 ladder", + "admin.permissions.badge.ladderCustom": "公開 ladder · カスタム flag", + "admin.permissions.badge.customDeal": "カスタム deal", + "admin.permissions.badge.clientDeal": "Client deal(訳)", + "admin.permissions.badge.customOverrides": "カスタム overrides", + "admin.permissions.badge.defaults": "デフォルト", + "admin.permissions.badge.customFlag": "カスタム flag", + "admin.permissions.package": "パッケージ", + "admin.permissions.noPlans": "プランなし", + "admin.permissions.suffix.legacy": "· legacy", + "admin.permissions.suffix.default": " · デフォルト", + "admin.permissions.suffix.custom": " · カスタム", + "admin.permissions.section": "セクション", + "admin.permissions.allSections": "すべてのセクション", + "admin.permissions.state": "状態", + "admin.permissions.stateAll": "すべて", + "admin.permissions.stateOn": "有効", + "admin.permissions.stateOff": "無効", + "admin.permissions.stateDiffers": "相違あり from default", + "admin.permissions.search": "検索", + "admin.permissions.searchPlaceholder": "キーまたはラベルで絞り込み", + "admin.permissions.profilesAria": "プラン feature profiles", + "admin.permissions.applyProfile": "プロファイルを適用", + "admin.permissions.applyLegacy": "レガシープロファイルを適用", + "admin.permissions.profilesHint": "One-click matrices for public ladder packages and migrated legacy navigation. 保存s overrides for the 選択済み package only.", + "admin.permissions.applyNamed": "{label} を適用", + "admin.permissions.applyGeneric": "プロファイルを適用", + "admin.permissions.enableAll": "すべて有効化", + "admin.permissions.disableAll": "すべて無効化", + "admin.permissions.clearOverrides": "オーバーライドをクリア", + "admin.permissions.globallyOff": "Globally オフ", + "admin.permissions.enableSection": "Enable section(訳)", + "admin.permissions.disableSection": "Disable section(訳)", + "admin.permissions.noMatch": "現在のフィルタに一致する機能はありません。", + "admin.permissions.differs": "相違あり", + "admin.permissions.platformOffHint": "オフ プラットフォーム全体 even if this plan enables it.", + "admin.permissions.sectionToggled": "{label} {state} for this plan.(訳)", + "admin.permissions.state.enabled": "有効", + "admin.permissions.state.disabled": "無効", + "admin.permissions.loadFailed": "読み込みに失敗 プラン権限", + "admin.permissions.saveFailed": "保存に失敗 feature", + "admin.permissions.enableAllFailed": "すべて有効化 失敗", + "admin.permissions.disableAllFailed": "すべて無効化 失敗", + "admin.permissions.profileFailed": "失敗: apply profile", + "admin.permissions.resetFailed": "失敗: reset defaults", + "admin.permissions.sectionFailed": "セクション update 失敗", + "admin.profile.legacy.label": "レガシー", + "admin.profile.legacy.description": "Migrated legacy navigation: catalog, フィード, 請求, and 設定; no 戻るground Tasks, ストア, or marketing.", + "admin.profile.free.label": "ç„¡æ–™", + "admin.profile.free.description": "公開 Free ladder — AI, APIキーs, live email, and own-key AI オフ.", "admin.profile.starter.label": "Starter", - "admin.profile.starter.description": "公開 スターター — AI on; own-key AI オフ.", + "admin.profile.starter.description": "公開 スターター — AI on; own-key AI オフ.", "admin.profile.growth.label": "Growth", - "admin.profile.growth.description": "カタログ機能はすべてオン。", + "admin.profile.growth.description": "カタログ機能はすべてオン。", "admin.profile.business.label": "Business", - "admin.profile.business.description": "カタログ機能はすべてオン。", - "admin.profile.enterprise.label": "Enterprise / all-on(訳)", - "admin.profile.enterprise.description": "Full 機能マトリクス (custom and Enterprise default).", - "admin.gates.noteStrong": "プラットフォーム-wide masters.", - "admin.gates.noteBody": "These switches apply to every package. Effective access is {combo}. Per-package entitlements stay on the {permissions} tab.(訳)", - "admin.gates.combo": "plan permission AND global section AND global feature(訳)", - "admin.gates.permissionsTab": "プラン権限", - "admin.gates.sectionsOff": "{count} section オフ", - "admin.gates.sectionsOffPlural": "{count} sections オフ", - "admin.gates.featuresOff": "{count} feature master オフ", - "admin.gates.featuresOffPlural": "{count} feature masters オフ", - "admin.gates.title": "Global feature masters(訳)", - "admin.gates.description": "Disable a feature here to turn it オフ for every package, even when a plan enables it.", - "admin.gates.section": "セクション", - "admin.gates.allSections": "すべてのセクション", - "admin.gates.search": "検索", - "admin.gates.searchPlaceholder": "キーまたはラベルで絞り込み", - "admin.gates.sectionOff": "セクション オフ", - "admin.gates.noMatch": "現在のフィルタに一致する機能はありません。", - "admin.gates.featureAria": "{label} global(訳)", - "admin.gates.sectionsTitle": "Global section switches(訳)", - "admin.gates.sectionsDesc": "Turn an entire 商品 area on or オフ for all packages. “セクション + features” also updates every feature master in that section.", - "admin.gates.sectionAria": "{label} global section(訳)", - "admin.gates.enableSectionFeatures": "Enable section + features(訳)", - "admin.gates.disableSectionFeatures": "Disable section + features(訳)", - "admin.gates.sectionSuccess": "{label} {state} for all packages.(訳)", - "admin.gates.sectionSuccessWithFeatures": "{label} {state} for all packages (section and feature masters).(訳)", - "admin.gates.featureSuccess": "{key} {state} globally.(訳)", - "admin.gates.state.enabled": "有効", - "admin.gates.state.disabled": "無効", - "admin.gates.loadFailed": "読み込みに失敗 global feature switches", - "admin.gates.sectionFailed": "失敗: update global section", - "admin.gates.saveFailed": "保存に失敗 global feature", - "admin.billing.createPlan": "プランを作成", - "admin.billing.assignPlanBtn": "プランを割り当て", - "admin.billing.stat.plans": "プラン", - "admin.billing.stat.catalogHidden": "{catalog} catalog · {hidden} hidden(訳)", - "admin.billing.stat.creditsAllocated": "クレジット allocated", - "admin.billing.stat.acrossCompanies": "Across 会社 on this page (first 50)", - "admin.billing.stat.creditsUsed": "クレジット used", - "admin.billing.stat.creditsConsumed": "クレジット consumed on this page", - "admin.billing.stat.noActivePlan": "有効なプランなし", - "admin.billing.stat.noActivePlanHint": "会社 with no active subscription (this page)", - "admin.billing.tab.plans": "プラン", - "admin.billing.tab.permissions": "プラン権限", - "admin.billing.tab.global": "グローバルスイッチ", - "admin.billing.tab.companies": "会社", - "admin.billing.cyclesTitle": "請求 cycles", - "admin.billing.cyclesDesc": "Process due renewals for 会社 on scheduled 請求サイクル.", - "admin.billing.runCycles": "Run due 請求サイクル", - "admin.billing.companiesTitle": "会社", - "admin.billing.companiesDesc": "Credit balances and plan status — assign plans or adjust credits.(訳)", - "admin.billing.searchCompaniesAria": "検索 会社", - "admin.billing.planStatusAria": "プランステータス", - "admin.billing.filter.all": "すべて 会社", - "admin.billing.filter.withPlan": "Has active plan(訳)", - "admin.billing.filter.withoutPlan": "有効なプランなし", - "admin.billing.col.company": "会社", - "admin.billing.col.planStatus": "プランステータス", - "admin.billing.col.creditsRemaining": "残りクレジット", - "admin.billing.col.total": "合計", - "admin.billing.col.used": "使用済み", - "admin.billing.col.usagePct": "Usage %(訳)", - "admin.billing.badge.noPlan": "No plan(訳)", - "admin.billing.badge.active": "有効", - "admin.billing.assignPlanAria": "Assign plan to {name}(訳)", - "admin.billing.addCredits": "クレジットを追加", - "admin.billing.addCreditsAria": "Add credits for {name}(訳)", - "admin.billing.showingCompanies": "{total} 社中 {filtered} 社を表示", - "admin.billing.editPlanTitle": "編集 plan", - "admin.billing.createPlanTitle": "プランを作成", - "admin.billing.editPlanDesc": "Update credits, 商品 caps, and whether this plan is marked custom.", - "admin.billing.createPlanDesc": "作成 a package. カスタム plans stay hidden from public pricing.", - "admin.billing.field.name": "名前", - "admin.billing.field.description": "説明", - "admin.billing.field.descriptionPlaceholder": "任意 short summary for admins", - "admin.billing.field.monthlyCredits": "月次クレジット", - "admin.billing.field.yearlyCredits": "Yearly credits(訳)", - "admin.billing.field.maxProducts": "最大商品数", - "admin.billing.field.maxProductsPlaceholder": "Blank = unlimited(訳)", - "admin.billing.field.term": "期間", - "admin.billing.term.monthly": "月次", - "admin.billing.term.yearly": "年次", - "admin.billing.customPackage": "カスタム package", - "admin.billing.customPackageHint": "非表示 from public pricing. Use for client deals; leave オフ for Free–ビジネス.", - "admin.billing.previewBadge": "Preview badge: {preview}.(訳)", - "admin.billing.company": "会社", - "admin.billing.selectCompany": "選択 会社", - "admin.billing.noPlanSuffix": " · no plan(訳)", - "admin.billing.plan": "プラン", - "admin.billing.selectPlan": "プランを選択", - "admin.billing.trialAssignment": "Trial assignment(訳)", - "admin.billing.trialHint": "任意 trial flag + credit grant for sales or evaluation trials.", - "admin.billing.trialCredits": "Trial credits(訳)", - "admin.billing.assign": "割り当て", - "admin.billing.amount": "Amount(訳)", - "admin.billing.amountHint": "Use a negative value to debit.(訳)", - "admin.billing.apply": "適用", - "admin.billing.planUpdated": "プランを更新しました。", - "admin.billing.planCreated": "プランを作成しました。", - "admin.billing.loadFailed": "読み込みに失敗 請求 data", - "admin.billing.updateFailed": "Update plan 失敗", - "admin.billing.createFailed": "作成 plan 失敗", - "admin.billing.assignFailed": "Assign 失敗", - "admin.billing.creditsFailed": "Add credits 失敗", - "admin.billing.cyclesFailed": "Run cycles 失敗", - "admin.knowledge.supportInbox": "サポート inbox", - "admin.knowledge.aiRoles": "AIロール", - "admin.knowledge.tab.articles": "記事", - "admin.knowledge.tab.templates": "テンプレート", - "admin.knowledge.tab.settings": "Auto-reply(訳)", - "admin.knowledge.allStatuses": "すべて statuses", - "admin.knowledge.published": "公開済み", - "admin.knowledge.createArticle": "作成 article", - "admin.knowledge.col.categories": "カテゴリ", - "admin.knowledge.col.status": "ステータス", - "admin.knowledge.col.keywords": "キーワード", - "admin.knowledge.badge.published": "公開済み", - "admin.knowledge.createTemplate": "作成 template", - "admin.knowledge.badge.active": "有効", - "admin.knowledge.badge.inactive": "無効", - "admin.knowledge.autoFirstResponses": "Enable automatic first responses(訳)", - "admin.knowledge.faqMatching": "FAQ / template matching(訳)", - "admin.knowledge.retryOnReply": "再試行 on first customer reply (if no prior auto)", - "admin.knowledge.matchThreshold": "Match confidence threshold(訳)", - "admin.knowledge.enableAiFallback": "Enable AI fallback(訳)", - "admin.knowledge.deliveryMode": "Delivery mode(訳)", - "admin.knowledge.delivery.draft": "Draft only (internal note)(訳)", - "admin.knowledge.delivery.autoSend": "Auto-send to customer(訳)", - "admin.knowledge.aiThreshold": "AI confidence threshold(訳)", - "admin.knowledge.usePlatformRole": "Use platform サポート AI role (recommended)", - "admin.knowledge.modelOverride": "モデル override", - "admin.knowledge.providerOverride": "プロバイダー override", - "admin.knowledge.baseUrlOverride": "ベース URL override", - "admin.knowledge.supportAiRoleTitle": "サポート AI role (fallback provider)", - "admin.knowledge.configured": "設定済み", - "admin.knowledge.notReadyBadge": "Not ready(訳)", - "admin.knowledge.enabled": "有効", - "admin.knowledge.disabled": "無効", - "admin.knowledge.openAiRoles": "開く プラットフォーム 設定 → AI roles", - "admin.knowledge.field.title": "タイトル", - "admin.knowledge.field.slug": "スラッグ", - "admin.knowledge.field.body": "Body (markdown)(訳)", - "admin.knowledge.field.keywords": "キーワード", - "admin.knowledge.keywordsPlaceholder": "カンマ区切り", - "admin.knowledge.field.intents": "Intent keys(訳)", - "admin.knowledge.intentsPlaceholder": "カンマ区切り", - "admin.knowledge.field.categories": "カテゴリ slugs", - "admin.knowledge.categoriesPlaceholder": "請求, account…", - "admin.knowledge.field.weight": "Priority weight(訳)", - "admin.knowledge.publishedEligible": "Published (eligible for matching)(訳)", - "admin.knowledge.field.name": "名前", - "admin.knowledge.field.templateBody": "本文", - "admin.knowledge.active": "有効", - "admin.settings.card.aiRolesTitle": "プラットフォーム AI roles", - "admin.settings.card.aiRolesDesc": "処理, vectorization, docs/API, and サポート — separate keys/models", - "admin.settings.roleOff": " (オフ)", - "admin.settings.roleNotSet": " · not set(訳)", - "admin.settings.someRolesUnavailable": "Some AI roles are not 利用可能 on this deployment yet. 処理 still uses the platform 開くAI 設定 until all roles are サポートed.", - "admin.settings.configure": "Configure(訳)", - "admin.settings.card.smtpTitle": "プラットフォーム SMTP", - "admin.settings.configured": "設定済み", - "admin.settings.notConfigured": "Not configured(訳)", - "admin.settings.source": "source: {source}(訳)", - "admin.settings.smtpEnabled": "SMTP 有効", - "admin.settings.smtpDisabled": "SMTP 無効", - "admin.settings.passwordSet": " · password set(訳)", - "admin.settings.card.otherTitle": "Other integrations(訳)", - "admin.settings.oauthSet": "Google OAuth set(訳)", - "admin.settings.oauthOff": "Google OAuth オフ", - "admin.settings.eprelOn": "EPREL on(訳)", - "admin.settings.eprelOff": "EPREL オフ", - "admin.settings.pineconeSet": "Pinecone set(訳)", - "admin.settings.pineconeOff": "Pinecone オフ", - "admin.settings.stripeSet": "Stripe set(訳)", - "admin.settings.stripeOff": "Stripe オフ", - "admin.settings.password": "パスワード", - "admin.settings.passwordSavedHint": "(保存済み — leave blank to keep)", - "admin.settings.secretKey": "Secret key(訳)", - "admin.settings.secretConfiguredHint": "(configured — leave blank to keep)(訳)", - "admin.settings.passwordConfigured": "パスワード configured", - "admin.settings.noSmtpPassword": "No SMTP password(訳)", - "admin.settings.enabled": "有効", - "admin.settings.disabled": "無効", - "admin.settings.saveRole": "保存 {label}", - "admin.settings.testConnection": "Test connection(訳)", - "admin.settings.saveMail": "保存 mail 設定", - "admin.settings.saveIntegrations": "保存 integrations", - "admin.settings.eprelEnabled": "EPREL enrichment 有効", - "admin.settings.loadFailed": "プラットフォーム 設定 could not be loaded. Saving is 無効 until reload succeeds.", - "admin.settings.testAccepted": "Test message accepted by SMTP(訳)", - "admin.stuck.cleanupBtn": "スタックしたジョブのクリーンアップ(2時間超の実行)", - "admin.stuck.jobsTitle": "処理ジョブ", - "admin.stuck.jobsDesc": "直近100件 · 実行中 {running}", - "admin.stuck.filterAll": "すべて", - "admin.stuck.filterRunning": "実行中", - "admin.stuck.filterFailed": "失敗", - "admin.stuck.filterPending": "保留中", - "admin.stuck.filterCompleted": "完了", + "admin.profile.business.description": "カタログ機能はすべてオン。", + "admin.profile.enterprise.label": "Enterprise / all-on(訳)", + "admin.profile.enterprise.description": "Full 機能マトリクス (custom and Enterprise default).", + "admin.gates.noteStrong": "プラットフォーム-wide masters.", + "admin.gates.noteBody": "These switches apply to every package. Effective access is {combo}. Per-package entitlements stay on the {permissions} tab.(訳)", + "admin.gates.combo": "plan permission AND global section AND global feature(訳)", + "admin.gates.permissionsTab": "プラン権限", + "admin.gates.sectionsOff": "{count} section オフ", + "admin.gates.sectionsOffPlural": "{count} sections オフ", + "admin.gates.featuresOff": "{count} feature master オフ", + "admin.gates.featuresOffPlural": "{count} feature masters オフ", + "admin.gates.title": "Global feature masters(訳)", + "admin.gates.description": "Disable a feature here to turn it オフ for every package, even when a plan enables it.", + "admin.gates.section": "セクション", + "admin.gates.allSections": "すべてのセクション", + "admin.gates.search": "検索", + "admin.gates.searchPlaceholder": "キーまたはラベルで絞り込み", + "admin.gates.sectionOff": "セクション オフ", + "admin.gates.noMatch": "現在のフィルタに一致する機能はありません。", + "admin.gates.featureAria": "{label} global(訳)", + "admin.gates.sectionsTitle": "Global section switches(訳)", + "admin.gates.sectionsDesc": "Turn an entire 商品 area on or オフ for all packages. “セクション + features” also updates every feature master in that section.", + "admin.gates.sectionAria": "{label} global section(訳)", + "admin.gates.enableSectionFeatures": "Enable section + features(訳)", + "admin.gates.disableSectionFeatures": "Disable section + features(訳)", + "admin.gates.sectionSuccess": "{label} {state} for all packages.(訳)", + "admin.gates.sectionSuccessWithFeatures": "{label} {state} for all packages (section and feature masters).(訳)", + "admin.gates.featureSuccess": "{key} {state} globally.(訳)", + "admin.gates.state.enabled": "有効", + "admin.gates.state.disabled": "無効", + "admin.gates.loadFailed": "読み込みに失敗 global feature switches", + "admin.gates.sectionFailed": "失敗: update global section", + "admin.gates.saveFailed": "保存に失敗 global feature", + "admin.billing.createPlan": "プランを作成", + "admin.billing.assignPlanBtn": "プランを割り当て", + "admin.billing.stat.plans": "プラン", + "admin.billing.stat.catalogHidden": "{catalog} catalog · {hidden} hidden(訳)", + "admin.billing.stat.creditsAllocated": "クレジット allocated", + "admin.billing.stat.acrossCompanies": "Across 会社 on this page (first 50)", + "admin.billing.stat.creditsUsed": "クレジット used", + "admin.billing.stat.creditsConsumed": "クレジット consumed on this page", + "admin.billing.stat.noActivePlan": "有効なプランなし", + "admin.billing.stat.noActivePlanHint": "会社 with no active subscription (this page)", + "admin.billing.tab.plans": "プラン", + "admin.billing.tab.permissions": "プラン権限", + "admin.billing.tab.global": "グローバルスイッチ", + "admin.billing.tab.companies": "会社", + "admin.billing.cyclesTitle": "請求 cycles", + "admin.billing.cyclesDesc": "Process due renewals for 会社 on scheduled 請求サイクル.", + "admin.billing.runCycles": "Run due 請求サイクル", + "admin.billing.companiesTitle": "会社", + "admin.billing.companiesDesc": "Credit balances and plan status — assign plans or adjust credits.(訳)", + "admin.billing.searchCompaniesAria": "検索 会社", + "admin.billing.planStatusAria": "プランステータス", + "admin.billing.filter.all": "すべて 会社", + "admin.billing.filter.withPlan": "Has active plan(訳)", + "admin.billing.filter.withoutPlan": "有効なプランなし", + "admin.billing.col.company": "会社", + "admin.billing.col.planStatus": "プランステータス", + "admin.billing.col.creditsRemaining": "残りクレジット", + "admin.billing.col.total": "合計", + "admin.billing.col.used": "使用済み", + "admin.billing.col.usagePct": "Usage %(訳)", + "admin.billing.badge.noPlan": "No plan(訳)", + "admin.billing.badge.active": "有効", + "admin.billing.assignPlanAria": "Assign plan to {name}(訳)", + "admin.billing.addCredits": "クレジットを追加", + "admin.billing.addCreditsAria": "Add credits for {name}(訳)", + "admin.billing.showingCompanies": "{total} 社中 {filtered} 社を表示", + "admin.billing.editPlanTitle": "編集 plan", + "admin.billing.createPlanTitle": "プランを作成", + "admin.billing.editPlanDesc": "Update credits, 商品 caps, and whether this plan is marked custom.", + "admin.billing.createPlanDesc": "作成 a package. カスタム plans stay hidden from public pricing.", + "admin.billing.field.name": "名前", + "admin.billing.field.description": "説明", + "admin.billing.field.descriptionPlaceholder": "任意 short summary for admins", + "admin.billing.field.monthlyCredits": "月次クレジット", + "admin.billing.field.yearlyCredits": "Yearly credits(訳)", + "admin.billing.field.maxProducts": "最大商品数", + "admin.billing.field.maxProductsPlaceholder": "Blank = unlimited(訳)", + "admin.billing.field.term": "期間", + "admin.billing.term.monthly": "月次", + "admin.billing.term.yearly": "年次", + "admin.billing.customPackage": "カスタム package", + "admin.billing.customPackageHint": "非表示 from public pricing. Use for client deals; leave オフ for Free–ビジネス.", + "admin.billing.previewBadge": "Preview badge: {preview}.(訳)", + "admin.billing.company": "会社", + "admin.billing.selectCompany": "選択 会社", + "admin.billing.noPlanSuffix": " · no plan(訳)", + "admin.billing.plan": "プラン", + "admin.billing.selectPlan": "プランを選択", + "admin.billing.trialAssignment": "Trial assignment(訳)", + "admin.billing.trialHint": "任意 trial flag + credit grant for sales or evaluation trials.", + "admin.billing.trialCredits": "Trial credits(訳)", + "admin.billing.assign": "割り当て", + "admin.billing.amount": "Amount(訳)", + "admin.billing.amountHint": "Use a negative value to debit.(訳)", + "admin.billing.apply": "適用", + "admin.billing.planUpdated": "プランを更新しました。", + "admin.billing.planCreated": "プランを作成しました。", + "admin.billing.loadFailed": "読み込みに失敗 請求 data", + "admin.billing.updateFailed": "Update plan 失敗", + "admin.billing.createFailed": "作成 plan 失敗", + "admin.billing.assignFailed": "Assign 失敗", + "admin.billing.creditsFailed": "Add credits 失敗", + "admin.billing.cyclesFailed": "Run cycles 失敗", + "admin.knowledge.supportInbox": "サポート inbox", + "admin.knowledge.aiRoles": "AIロール", + "admin.knowledge.tab.articles": "記事", + "admin.knowledge.tab.templates": "テンプレート", + "admin.knowledge.tab.settings": "Auto-reply(訳)", + "admin.knowledge.allStatuses": "すべて statuses", + "admin.knowledge.published": "公開済み", + "admin.knowledge.createArticle": "作成 article", + "admin.knowledge.col.categories": "カテゴリ", + "admin.knowledge.col.status": "ステータス", + "admin.knowledge.col.keywords": "キーワード", + "admin.knowledge.badge.published": "公開済み", + "admin.knowledge.createTemplate": "作成 template", + "admin.knowledge.badge.active": "有効", + "admin.knowledge.badge.inactive": "無効", + "admin.knowledge.autoFirstResponses": "Enable automatic first responses(訳)", + "admin.knowledge.faqMatching": "FAQ / template matching(訳)", + "admin.knowledge.retryOnReply": "再試行 on first customer reply (if no prior auto)", + "admin.knowledge.matchThreshold": "Match confidence threshold(訳)", + "admin.knowledge.enableAiFallback": "Enable AI fallback(訳)", + "admin.knowledge.deliveryMode": "Delivery mode(訳)", + "admin.knowledge.delivery.draft": "Draft only (internal note)(訳)", + "admin.knowledge.delivery.autoSend": "Auto-send to customer(訳)", + "admin.knowledge.aiThreshold": "AI confidence threshold(訳)", + "admin.knowledge.usePlatformRole": "Use platform サポート AI role (recommended)", + "admin.knowledge.modelOverride": "モデル override", + "admin.knowledge.providerOverride": "プロバイダー override", + "admin.knowledge.baseUrlOverride": "ベース URL override", + "admin.knowledge.supportAiRoleTitle": "サポート AI role (fallback provider)", + "admin.knowledge.configured": "設定済み", + "admin.knowledge.notReadyBadge": "Not ready(訳)", + "admin.knowledge.enabled": "有効", + "admin.knowledge.disabled": "無効", + "admin.knowledge.openAiRoles": "開く プラットフォーム 設定 → AI roles", + "admin.knowledge.field.title": "タイトル", + "admin.knowledge.field.slug": "スラッグ", + "admin.knowledge.field.body": "Body (markdown)(訳)", + "admin.knowledge.field.keywords": "キーワード", + "admin.knowledge.keywordsPlaceholder": "カンマ区切り", + "admin.knowledge.field.intents": "Intent keys(訳)", + "admin.knowledge.intentsPlaceholder": "カンマ区切り", + "admin.knowledge.field.categories": "カテゴリ slugs", + "admin.knowledge.categoriesPlaceholder": "請求, account…", + "admin.knowledge.field.weight": "Priority weight(訳)", + "admin.knowledge.publishedEligible": "Published (eligible for matching)(訳)", + "admin.knowledge.field.name": "名前", + "admin.knowledge.field.templateBody": "本文", + "admin.knowledge.active": "有効", + "admin.settings.card.aiRolesTitle": "プラットフォーム AI roles", + "admin.settings.card.aiRolesDesc": "処理, vectorization, docs/API, and サポート — separate keys/models", + "admin.settings.roleOff": " (オフ)", + "admin.settings.roleNotSet": " · not set(訳)", + "admin.settings.someRolesUnavailable": "Some AI roles are not 利用可能 on this deployment yet. 処理 still uses the platform 開くAI 設定 until all roles are サポートed.", + "admin.settings.configure": "Configure(訳)", + "admin.settings.card.smtpTitle": "プラットフォーム SMTP", + "admin.settings.configured": "設定済み", + "admin.settings.notConfigured": "Not configured(訳)", + "admin.settings.source": "source: {source}(訳)", + "admin.settings.smtpEnabled": "SMTP 有効", + "admin.settings.smtpDisabled": "SMTP 無効", + "admin.settings.passwordSet": " · password set(訳)", + "admin.settings.card.otherTitle": "Other integrations(訳)", + "admin.settings.oauthSet": "Google OAuth set(訳)", + "admin.settings.oauthOff": "Google OAuth オフ", + "admin.settings.eprelOn": "EPREL on(訳)", + "admin.settings.eprelOff": "EPREL オフ", + "admin.settings.pineconeSet": "Pinecone set(訳)", + "admin.settings.pineconeOff": "Pinecone オフ", + "admin.settings.stripeSet": "Stripe set(訳)", + "admin.settings.stripeOff": "Stripe オフ", + "admin.settings.password": "パスワード", + "admin.settings.passwordSavedHint": "(保存済み — leave blank to keep)", + "admin.settings.secretKey": "Secret key(訳)", + "admin.settings.secretConfiguredHint": "(configured — leave blank to keep)(訳)", + "admin.settings.passwordConfigured": "パスワード configured", + "admin.settings.noSmtpPassword": "No SMTP password(訳)", + "admin.settings.enabled": "有効", + "admin.settings.disabled": "無効", + "admin.settings.saveRole": "保存 {label}", + "admin.settings.testConnection": "Test connection(訳)", + "admin.settings.saveMail": "保存 mail 設定", + "admin.settings.saveIntegrations": "保存 integrations", + "admin.settings.eprelEnabled": "EPREL enrichment 有効", + "admin.settings.loadFailed": "プラットフォーム 設定 could not be loaded. Saving is 無効 until reload succeeds.", + "admin.settings.testAccepted": "Test message accepted by SMTP(訳)", + "admin.stuck.cleanupBtn": "スタックしたジョブのクリーンアップ(2時間超の実行)", + "admin.stuck.jobsTitle": "処理ジョブ", + "admin.stuck.jobsDesc": "ç›´è¿‘100ä»¶ · 実行中 {running}", + "admin.stuck.filterAll": "すべて", + "admin.stuck.filterRunning": "実行中", + "admin.stuck.filterFailed": "失敗", + "admin.stuck.filterPending": "保留中", + "admin.stuck.filterCompleted": "完了", "admin.stuck.colId": "ID", - "admin.stuck.colCompany": "会社", - "admin.stuck.colStatus": "ステータス", - "admin.stuck.colProgress": "進捗", - "admin.stuck.colUpdated": "更新済み", - "admin.stuck.colError": "エラー", - "admin.stuck.loadFailed": "ジョブを読み込めませんでした", - "admin.stuck.cleanupFailed": "クリーンアップに失敗しました", - "admin.support.knowledgeLink": "ナレッジと自動返信", - "admin.support.queueTitle": "チケットキュー", - "admin.support.queueMeta": "{total} · 範囲 {scope}", - "admin.support.queueMetaStatus": "· status {status}(訳)", - "admin.support.ticketCountOne": "{count} チケット", - "admin.support.ticketCountMany": "{count} チケット", - "admin.support.statusAll": "すべて statuses", - "admin.support.scopeAll": "すべて チケット", - "admin.support.scopeInbox": "受信箱", - "admin.support.scopeMine": "自分", - "admin.support.scopeUnassigned": "未割当", - "admin.support.flagAny": "すべての自動状態", - "admin.support.flagNeedsHuman": "人手対応が必要", - "admin.support.flagAiDraft": "AI 下書き", - "admin.support.colSubject": "件名", - "admin.support.colStatus": "ステータス", - "admin.support.colAuto": "自動", - "admin.support.colPriority": "優先度", - "admin.support.colAssignee": "担当者", - "admin.support.colCompany": "会社", - "admin.support.colUpdated": "更新済み", - "admin.support.colActions": "操作", - "admin.support.autoOff": "自動オフ", - "admin.support.claim": "担当する", - "admin.support.claimAria": "チケット {subject} を担当", - "admin.support.unassigned": "未割当", - "admin.support.you": "あなた", - "admin.support.assigned": "割当済み", - "admin.support.loadQueueFailed": "サポートキューを読み込めませんでした", - "admin.support.claimFailed": "チケットの担当に失敗しました", - "admin.support.ticketFallbackTitle": "サポート チケット", - "admin.support.ticketMeta": "{company} · {requester}", - "admin.support.ticketMetaFallback": "スタッフレビュースレッド", - "admin.support.companyFallback": "会社", - "admin.support.requesterFallback": "依頼者", - "admin.support.backQueue": "キュー", - "admin.support.resolve": "解決", - "admin.support.markPending": "保留にする", - "admin.support.reopen": "再開", - "admin.support.assigneeLabel": "担当者:", - "admin.support.unassign": "割当解除", - "admin.support.assignToStaff": "スタッフに割り当て", - "admin.support.apply": "適用", - "admin.support.autoPanelTitle": "自動マッチ / AI アシスト", - "admin.support.autoPanelDesc": "FAQ マッチと AI 下書き/送信のスタッフ専用結果。顧客に下書きは見えません。", - "admin.support.autoDisabledBadge": "自動無効", - "admin.support.autoStatusLabel": "ステータス:", - "admin.support.lastAttempt": "最終試行:", - "admin.support.reenableAuto": "自動を再有効化", - "admin.support.disableAuto": "このチケットの自動を無効化", - "admin.support.aiDraftTitle": "AI 下書き(承認または編集)", - "admin.support.aiDraftDesc": "下書きのみモードで内部メモが残りました。必要なら編集して顧客に送信するか、破棄して手動対応してください。", - "admin.support.confidence": "信頼度 {value}", - "admin.support.statusAfterSend": "送信後の状態", - "admin.support.approveSend": "承認して送信", - "admin.support.discardDraft": "下書きを破棄", - "admin.support.threadTitle": "スレッド", - "admin.support.threadMeta": "{count} · 最終更新 {when}", - "admin.support.messageCountOne": "{count} 件のメッセージ", - "admin.support.messageCountMany": "{count} 件のメッセージ", - "admin.support.replyTitle": "返信", - "admin.support.replyDesc": "公開返信は顧客に通知されます。内部メモはスタッフのみ。公開返信後の既定ステータスは保留です。", - "admin.support.internalNote": "内部メモ(顧客には非表示)", - "admin.support.setStatus": "状態を設定", - "admin.support.statusDefault": "デフォルト", - "admin.support.saveNote": "メモを保存", - "admin.support.sendReply": "Send reply(訳)", - "admin.support.replyAndResolve": "返信して解決", - "admin.support.closedBanner": "このチケットはクローズされています。会話を続けるには再開してください。", - "admin.support.priorityMeta": "優先度 {priority}", - "admin.support.authorAiDraft": "AI 下書き(スタッフのみ)", - "admin.support.authorInternal": "内部メモ", - "admin.support.authorStaff": "スタッフ", - "admin.support.authorCustomer": "顧客", - "admin.support.flash.noteSaved": "内部メモを保存しました。", - "admin.support.flash.replySent": "返信を送信しました。", - "admin.support.flash.resolved": "チケットを解決済みにしました。", - "admin.support.flash.pending": "チケットを保留(顧客待ち)にしました。", - "admin.support.flash.reopened": "チケットを再開しました。", - "admin.support.flash.statusSet": "チケット状態を {status} に設定しました。", - "admin.support.flash.autoDisabled": "このチケットの自動返信を無効にしました。", - "admin.support.flash.autoEnabled": "このチケットの自動返信を再有効化しました。", - "admin.support.loadTicketFailed": "チケットの読み込みに失敗しました", - "admin.support.replyFailed": "返信の送信に失敗しました", - "admin.support.statusFailed": "状態の更新に失敗しました", - "admin.support.unassignFailed": "割当解除に失敗しました", - "admin.support.assignFailed": "チケットの割当に失敗しました", - "admin.support.autoFailed": "自動返信設定の更新に失敗しました", - "admin.support.approveFailed": "AI 下書きの承認に失敗しました", - "admin.support.discardFailed": "AI 下書きの破棄に失敗しました", - "admin.settings.sourceResolved": "{sources} から解決", - "admin.settings.sourceUpdated": " · 更新 {when}", - "admin.settings.updatedAt": "更新 {when}", - "admin.settings.tenantDesc": "会社の AI キーとマーケティングメールは連携設定のままです。セッションと暗号化の秘密はサーバー環境にあり、ここでは編集しません。", - "admin.settings.perCompanyAiEmail": "会社ごとの AI/メール —", - "admin.settings.plansCredits": "プランとクレジット —", - "admin.settings.fromDatabase": "データベースから", - "admin.settings.fromEnvironment": "環境から", - "admin.settings.sourceBadge": "ソース: {source}", - "admin.settings.storedKey": "保存済みキー: {masked}", - "admin.settings.enableRole": "このロールを有効化", - "admin.settings.clearApiKey": "保存済み API キーを消去", - "admin.settings.apiKeyKeepPlaceholder": "•••• 空欄で維持", - "admin.settings.apiKeyNewPlaceholder": "sk-… またはローカル", - "admin.settings.smtpCardTitle": "プラットフォーム SMTP", - "admin.settings.smtpCardDesc": "パスワード設定招待とプラットフォーム送信メールに使用。マーケティングの Resend/SMTP は会社ごとの連携 → メールのままです。", - "admin.settings.smtpBadgeOn": "SMTP 有効", - "admin.settings.smtpBadgeOff": "SMTP 無効", - "admin.settings.enableSmtp": "プラットフォームSMTPを有効化", - "admin.settings.storedPassword": "保存済みパスワード: {masked}", - "admin.settings.clearSmtpPassword": "保存済み SMTP パスワードを消去", - "admin.settings.sendTestEmail": "テストメールを送信", - "admin.settings.enableGoogle": "Google OAuth を有効化", - "admin.settings.clientSecret": "クライアントシークレット", - "admin.settings.leaveBlankKeep": "(空欄で維持)", - "admin.settings.storedSecret": "保存済みシークレット: {masked}", - "admin.settings.clearClientSecret": "保存済みクライアントシークレットを消去", - "admin.settings.eprelDesc": "処理中の無料の公開 EU エネルギラベルデータ。全プランで既定オン — 有効化や有料アップグレードは不要。無効化や調整にのみコントロールを使います。", - "admin.settings.optionalKeySaved": "任意の API キーを保存済み", - "admin.settings.noApiKeyNeeded": "API キー不要", - "admin.settings.optionalApiKey": "任意の API キー", - "admin.settings.optionalApiKeySavedHint": "(保存済み — leave blank to keep)", - "admin.settings.optionalApiKeyPublicHint": "(公開 API はキーなしで動作)", - "admin.settings.clearEprelKey": "保存済み EPREL API キーを消去", - "admin.settings.pineconeDesc": "処理中の任意のベクトルカテゴリ提案。ここを空にするとホスト環境の値が使われます。", - "admin.settings.apiKeyConfigured": "API キー設定済み", - "admin.settings.noApiKey": "API キーなし", - "admin.settings.apiKeyLabel": "APIキー", - "admin.settings.clearPineconeKey": "保存済み Pinecone API キーを消去", - "admin.settings.stripeDesc": "サーバー Stripe 設定の任意上書き。パスワード欄を推奨。保存後に値は再表示されません。", - "admin.settings.stripeMock": "Stripe モックモードを強制(本番以外のみ — 実課金を無効化)", - "admin.settings.webhookSecret": "Webhook シークレット", - "admin.settings.clearStripeSecret": "Stripe シークレットキーを消去", - "admin.settings.clearStripeWebhook": "Stripe Webhook シークレットを消去", - "admin.settings.feedAllowlistDesc": "プライベートフィード URL に許可するホスト/CIDR(カンマ区切り)。", - "admin.settings.adminsDesc": "このデプロイのプラットフォーム管理者", - "admin.settings.onboardingTitle": "管理者オンボーディング補助", - "admin.settings.onboardingDesc": "まだパスワードが必要な対象ユーザーに set-password 招待メールを使ってオンボードします。", - "admin.settings.sendInvites": "set-password メールを送信", - "admin.settings.adminStatusBefore": "プラットフォーム管理者はこの画面では作成できません。", - "admin.settings.adminStatusAfter": " でアクセスを確認するか、既存の管理者/運用にアカウント昇格を依頼してください。", - "admin.settings.loadUsersFailed": "管理者ユーザーを読み込めませんでした", - "admin.settings.sendFailed": "送信に失敗しました", - "admin.settings.saveMailFailed": "メール設定を保存できませんでした", - "admin.settings.smtpNotConfigured": "SMTP が未設定です — 先にメール設定を有効化して保存してください。", - "admin.settings.smtpTestFailed": "SMTP テストに失敗しました", - "admin.settings.testEmailFailed": "テストメールを送信できませんでした", - "admin.settings.saveIntegrationFailed": "連携設定を保存できませんでした", - "admin.settings.aiSaved": "{label} のAI設定を保存しました。APIキーは二度と表示されません。", - "admin.settings.aiSaveFailed": "{label} の AI 設定を保存できませんでした", - "admin.settings.aiTestOk": "{label}: 接続 OK", - "admin.settings.aiTestSkipped": "{label}: スキップ — 資格情報を保存し(ロールを有効化して)テストしてください。", - "admin.settings.aiTestFailed": "{label}: 接続失敗", - "admin.settings.aiTestError": "{label} の接続をテストできませんでした", - "admin.settings.aiRole.processing.label": "処理", - "admin.settings.aiRole.processing.desc": "製品パイプラインの chat/completions(タイトル・説明・強化)。", - "admin.settings.aiRole.vectorization.label": "ベクトル化", - "admin.settings.aiRole.vectorization.desc": "検索 / Pinecone インデックス用の埋め込み(インデックス次元に合わせる)。", + "admin.stuck.colCompany": "会社", + "admin.stuck.colStatus": "ステータス", + "admin.stuck.colProgress": "進捗", + "admin.stuck.colUpdated": "更新済み", + "admin.stuck.colError": "エラー", + "admin.stuck.loadFailed": "ジョブを読み込めませんでした", + "admin.stuck.cleanupFailed": "クリーンアップに失敗しました", + "admin.support.knowledgeLink": "ナレッジと自動返信", + "admin.support.queueTitle": "チケットキュー", + "admin.support.queueMeta": "{total} · 範囲 {scope}", + "admin.support.queueMetaStatus": "· status {status}(訳)", + "admin.support.ticketCountOne": "{count} チケット", + "admin.support.ticketCountMany": "{count} チケット", + "admin.support.statusAll": "すべて statuses", + "admin.support.scopeAll": "すべて チケット", + "admin.support.scopeInbox": "受信箱", + "admin.support.scopeMine": "自分", + "admin.support.scopeUnassigned": "未割当", + "admin.support.flagAny": "すべての自動状態", + "admin.support.flagNeedsHuman": "人手対応が必要", + "admin.support.flagAiDraft": "AI 下書き", + "admin.support.colSubject": "件名", + "admin.support.colStatus": "ステータス", + "admin.support.colAuto": "自動", + "admin.support.colPriority": "優先度", + "admin.support.colAssignee": "担当者", + "admin.support.colCompany": "会社", + "admin.support.colUpdated": "更新済み", + "admin.support.colActions": "操作", + "admin.support.autoOff": "自動オフ", + "admin.support.claim": "担当する", + "admin.support.claimAria": "チケット {subject} を担当", + "admin.support.unassigned": "未割当", + "admin.support.you": "あなた", + "admin.support.assigned": "割当済み", + "admin.support.loadQueueFailed": "サポートキューを読み込めませんでした", + "admin.support.claimFailed": "チケットの担当に失敗しました", + "admin.support.ticketFallbackTitle": "サポート チケット", + "admin.support.ticketMeta": "{company} · {requester}", + "admin.support.ticketMetaFallback": "スタッフレビュースレッド", + "admin.support.companyFallback": "会社", + "admin.support.requesterFallback": "依頼者", + "admin.support.backQueue": "キュー", + "admin.support.resolve": "解決", + "admin.support.markPending": "保留にする", + "admin.support.reopen": "再開", + "admin.support.assigneeLabel": "担当者:", + "admin.support.unassign": "割当解除", + "admin.support.assignToStaff": "スタッフに割り当て", + "admin.support.apply": "適用", + "admin.support.autoPanelTitle": "自動マッチ / AI アシスト", + "admin.support.autoPanelDesc": "FAQ マッチと AI 下書き/送信のスタッフ専用結果。顧客に下書きは見えません。", + "admin.support.autoDisabledBadge": "自動無効", + "admin.support.autoStatusLabel": "ステータス:", + "admin.support.lastAttempt": "最終試行:", + "admin.support.reenableAuto": "自動を再有効化", + "admin.support.disableAuto": "このチケットの自動を無効化", + "admin.support.aiDraftTitle": "AI 下書き(承認または編集)", + "admin.support.aiDraftDesc": "下書きのみモードで内部メモが残りました。必要なら編集して顧客に送信するか、破棄して手動対応してください。", + "admin.support.confidence": "信頼度 {value}", + "admin.support.statusAfterSend": "送信後の状態", + "admin.support.approveSend": "承認して送信", + "admin.support.discardDraft": "下書きを破棄", + "admin.support.threadTitle": "スレッド", + "admin.support.threadMeta": "{count} · 最終更新 {when}", + "admin.support.messageCountOne": "{count} 件のメッセージ", + "admin.support.messageCountMany": "{count} 件のメッセージ", + "admin.support.replyTitle": "返信", + "admin.support.replyDesc": "公開返信は顧客に通知されます。内部メモはスタッフのみ。公開返信後の既定ステータスは保留です。", + "admin.support.internalNote": "内部メモ(顧客には非表示)", + "admin.support.setStatus": "状態を設定", + "admin.support.statusDefault": "デフォルト", + "admin.support.saveNote": "メモを保存", + "admin.support.sendReply": "Send reply(訳)", + "admin.support.replyAndResolve": "返信して解決", + "admin.support.closedBanner": "このチケットはクローズされています。会話を続けるには再開してください。", + "admin.support.priorityMeta": "優先度 {priority}", + "admin.support.authorAiDraft": "AI 下書き(スタッフのみ)", + "admin.support.authorInternal": "内部メモ", + "admin.support.authorStaff": "スタッフ", + "admin.support.authorCustomer": "顧客", + "admin.support.flash.noteSaved": "内部メモを保存しました。", + "admin.support.flash.replySent": "返信を送信しました。", + "admin.support.flash.resolved": "チケットを解決済みにしました。", + "admin.support.flash.pending": "チケットを保留(顧客待ち)にしました。", + "admin.support.flash.reopened": "チケットを再開しました。", + "admin.support.flash.statusSet": "チケット状態を {status} に設定しました。", + "admin.support.flash.autoDisabled": "このチケットの自動返信を無効にしました。", + "admin.support.flash.autoEnabled": "このチケットの自動返信を再有効化しました。", + "admin.support.loadTicketFailed": "チケットの読み込みに失敗しました", + "admin.support.replyFailed": "返信の送信に失敗しました", + "admin.support.statusFailed": "状態の更新に失敗しました", + "admin.support.unassignFailed": "割当解除に失敗しました", + "admin.support.assignFailed": "チケットの割当に失敗しました", + "admin.support.autoFailed": "自動返信設定の更新に失敗しました", + "admin.support.approveFailed": "AI 下書きの承認に失敗しました", + "admin.support.discardFailed": "AI 下書きの破棄に失敗しました", + "admin.settings.sourceResolved": "{sources} から解決", + "admin.settings.sourceUpdated": " · æ›´æ–° {when}", + "admin.settings.updatedAt": "æ›´æ–° {when}", + "admin.settings.tenantDesc": "会社の AI キーとマーケティングメールは連携設定のままです。セッションと暗号化の秘密はサーバー環境にあり、ここでは編集しません。", + "admin.settings.perCompanyAiEmail": "会社ごとの AI/メール —", + "admin.settings.plansCredits": "プランとクレジット —", + "admin.settings.fromDatabase": "データベースから", + "admin.settings.fromEnvironment": "環境から", + "admin.settings.sourceBadge": "ソース: {source}", + "admin.settings.storedKey": "保存済みキー: {masked}", + "admin.settings.enableRole": "このロールを有効化", + "admin.settings.clearApiKey": "保存済み API キーを消去", + "admin.settings.apiKeyKeepPlaceholder": "•••• 空欄で維持", + "admin.settings.apiKeyNewPlaceholder": "sk-… またはローカル", + "admin.settings.smtpCardTitle": "プラットフォーム SMTP", + "admin.settings.smtpCardDesc": "パスワード設定招待とプラットフォーム送信メールに使用。マーケティングの Resend/SMTP は会社ごとの連携 → メールのままです。", + "admin.settings.smtpBadgeOn": "SMTP 有効", + "admin.settings.smtpBadgeOff": "SMTP 無効", + "admin.settings.enableSmtp": "プラットフォームSMTPを有効化", + "admin.settings.storedPassword": "保存済みパスワード: {masked}", + "admin.settings.clearSmtpPassword": "保存済み SMTP パスワードを消去", + "admin.settings.sendTestEmail": "テストメールを送信", + "admin.settings.enableGoogle": "Google OAuth を有効化", + "admin.settings.clientSecret": "クライアントシークレット", + "admin.settings.leaveBlankKeep": "(空欄で維持)", + "admin.settings.storedSecret": "保存済みシークレット: {masked}", + "admin.settings.clearClientSecret": "保存済みクライアントシークレットを消去", + "admin.settings.eprelDesc": "処理中の無料の公開 EU エネルギラベルデータ。全プランで既定オン — 有効化や有料アップグレードは不要。無効化や調整にのみコントロールを使います。", + "admin.settings.optionalKeySaved": "任意の API キーを保存済み", + "admin.settings.noApiKeyNeeded": "API キー不要", + "admin.settings.optionalApiKey": "任意の API キー", + "admin.settings.optionalApiKeySavedHint": "(保存済み — leave blank to keep)", + "admin.settings.optionalApiKeyPublicHint": "(公開 API はキーなしで動作)", + "admin.settings.clearEprelKey": "保存済み EPREL API キーを消去", + "admin.settings.pineconeDesc": "処理中の任意のベクトルカテゴリ提案。ここを空にするとホスト環境の値が使われます。", + "admin.settings.apiKeyConfigured": "API キー設定済み", + "admin.settings.noApiKey": "API キーなし", + "admin.settings.apiKeyLabel": "APIキー", + "admin.settings.clearPineconeKey": "保存済み Pinecone API キーを消去", + "admin.settings.stripeDesc": "サーバー Stripe 設定の任意上書き。パスワード欄を推奨。保存後に値は再表示されません。", + "admin.settings.stripeMock": "Stripe モックモードを強制(本番以外のみ — 実課金を無効化)", + "admin.settings.webhookSecret": "Webhook シークレット", + "admin.settings.clearStripeSecret": "Stripe シークレットキーを消去", + "admin.settings.clearStripeWebhook": "Stripe Webhook シークレットを消去", + "admin.settings.feedAllowlistDesc": "プライベートフィード URL に許可するホスト/CIDR(カンマ区切り)。", + "admin.settings.adminsDesc": "このデプロイのプラットフォーム管理者", + "admin.settings.onboardingTitle": "管理者オンボーディング補助", + "admin.settings.onboardingDesc": "まだパスワードが必要な対象ユーザーに set-password 招待メールを使ってオンボードします。", + "admin.settings.sendInvites": "set-password メールを送信", + "admin.settings.adminStatusBefore": "プラットフォーム管理者はこの画面では作成できません。", + "admin.settings.adminStatusAfter": " でアクセスを確認するか、既存の管理者/運用にアカウント昇格を依頼してください。", + "admin.settings.loadUsersFailed": "管理者ユーザーを読み込めませんでした", + "admin.settings.sendFailed": "送信に失敗しました", + "admin.settings.saveMailFailed": "メール設定を保存できませんでした", + "admin.settings.smtpNotConfigured": "SMTP が未設定です — 先にメール設定を有効化して保存してください。", + "admin.settings.smtpTestFailed": "SMTP テストに失敗しました", + "admin.settings.testEmailFailed": "テストメールを送信できませんでした", + "admin.settings.saveIntegrationFailed": "連携設定を保存できませんでした", + "admin.settings.aiSaved": "{label} のAI設定を保存しました。APIキーは二度と表示されません。", + "admin.settings.aiSaveFailed": "{label} の AI 設定を保存できませんでした", + "admin.settings.aiTestOk": "{label}: 接続 OK", + "admin.settings.aiTestSkipped": "{label}: スキップ — 資格情報を保存し(ロールを有効化して)テストしてください。", + "admin.settings.aiTestFailed": "{label}: 接続失敗", + "admin.settings.aiTestError": "{label} の接続をテストできませんでした", + "admin.settings.aiRole.processing.label": "処理", + "admin.settings.aiRole.processing.desc": "製品パイプラインの chat/completions(タイトル・説明・強化)。", + "admin.settings.aiRole.vectorization.label": "ベクトル化", + "admin.settings.aiRole.vectorization.desc": "検索 / Pinecone インデックス用の埋め込み(インデックス次元に合わせる)。", "admin.settings.aiRole.docs_api.label": "Docs / API", - "admin.settings.aiRole.docs_api.desc": "将来の docs/API アシスタント枠 — /docs Ask はルールベースのまま、このロールを呼び出してはいけません。", - "admin.settings.aiRole.support.label": "サポート", - "admin.settings.aiRole.support.desc": "チケット自動返信の AI フォールバック — ここでプロバイダ/キー/モデルを設定し、サポートナレッジ → 自動返信で配信を有効化。", + "admin.settings.aiRole.docs_api.desc": "将来の docs/API アシスタント枠 — /docs Ask はルールベースのまま、このロールを呼び出してはいけません。", + "admin.settings.aiRole.support.label": "サポート", + "admin.settings.aiRole.support.desc": "チケット自動返信の AI フォールバック — ここでプロバイダ/キー/モデルを設定し、サポートナレッジ → 自動返信で配信を有効化。", "admin.settings.providerOption.openai": "OpenAI", "admin.settings.providerOption.openrouter": "OpenRouter", "admin.settings.providerOption.azure": "Azure OpenAI", "admin.settings.providerOption.ollama": "Ollama", - "admin.settings.providerOption.custom": "カスタム / その他", - "admin.support.title": "サポートセンター", - "admin.support.description": "スタッフ受信箱 — キューから取得、範囲で絞り込み、スレッドを開いて解決", - "admin.support.unavailable": "サポートキューは利用できません。続く場合はプラットフォーム管理者に連絡してください。", - "admin.support.noTickets": "このキューにチケットはありません。", - "admin.support.ticketNotFound": "チケットが見つかりません。", - "admin.support.notAvailable": "このデプロイではサポートを利用できません。", - "admin.support.loadFailed": "このチケットを読み込めませんでした。", - "admin.support.noMessages": "メッセージはまだありません。", - "admin.support.queueScopeAria": "キュー範囲", - "admin.support.statusFilterAria": "ステータスフィルタ", - "admin.support.autoAssistFilterAria": "オートアシストフィルタ", - "admin.support.searchPlaceholder": "件名・メール・会社を検索", - "admin.support.searchAria": "チケットを検索", - "admin.support.assignStaffAria": "スタッフに割り当て", - "admin.support.aiDraftAria": "AI下書き本文", - "admin.support.replyPlaceholder": "返信を書く…", - "admin.support.replyAria": "返信本文", - "admin.knowledge.eyebrow": "プラットフォーム管理者", - "admin.knowledge.title": "サポートナレッジ", - "admin.knowledge.description": "FAQ自動一致用にヘルプ記事を構成します。コンテンツエージェントが本文を埋めます — 事実は正確に。", - "admin.knowledge.notReady": "サポートナレッジの準備ができていません", - "admin.knowledge.noTemplates": "返信テンプレートなし", - "admin.knowledge.articleDesc": "Markdown本文は安全なアップロードで画像をサポートします。商品事実を創作せず、コンテンツエージェント用のプレースホルダを残してください。", - "admin.knowledge.templateDesc": "許可プレースホルダ: subject, category。", - "admin.knowledge.searchPlaceholder": "タイトル・スラッグ・キーワードを検索…", - "admin.knowledge.searchAria": "記事を検索", - "admin.knowledge.publishFilterAria": "公開ステータスフィルタ", - "admin.knowledge.deleteArticleAria": "記事を削除", - "admin.knowledge.deleteTemplateAria": "テンプレートを削除", - "admin.support.autoReplyStatus.matched": "FAQ 一致", - "admin.support.autoReplyStatus.aiDraft": "AI 下書き待ち", - "admin.support.autoReplyStatus.aiSent": "AI 返信送信済み", - "admin.support.autoReplyStatus.skipped": "自動スキップ", - "admin.support.autoReplyStatus.failed": "自動失敗", - "admin.support.autoReplyStatus.handedOff": "人手対応が必要", - "admin.support.autoReplyStatus.none": "自動試行なし", - "admin.support.autoSource.kb": "ナレッジベース", - "admin.support.autoSource.template": "テンプレート", - "admin.support.autoSource.ai": "AI支援", - "admin.support.autoSource.automated": "Automated(訳)", - "admin.knowledge.categoriesHeading": "カテゴリ", - "admin.knowledge.categoriesHint": "コンテンツエージェント用の空のシードバケット。", - "admin.knowledge.showingArticles": "{shown} 件の記事を表示(本文は編集時に読み込み)。", - "admin.knowledge.showingArticlesOf": "{total} 件中 {shown} 件を表示(本文は編集時に読み込み)。", - "admin.knowledge.templatesHint": "任意のプレースホルダ {{subject}} / {{category}} 付き定型返信。", - "admin.knowledge.faqAutoMatchTitle": "FAQ 自動マッチ", - "admin.knowledge.faqAutoMatchDesc": "チケット作成時のキーワード一致。既定しきい値 0.78(範囲 0.50–0.95)。", - "admin.knowledge.aiFallbackTitle": "AI フォールバック", - "admin.knowledge.aiFallbackDesc": "FAQ 一致がしきい値未満のときに使用。返信はプラットフォームの {role} AI ロールを使います。", - "admin.knowledge.noModel": "モデルなし", - "admin.knowledge.keyLast4": "キー …{last4}", - "admin.knowledge.sourceLabel": "ソース {source}", - "admin.knowledge.apiKeyNote": "API キーは常にこのロールから取得されます。上の上書きはプロバイダ / モデル / ベース URL のみ変更します。", - "admin.knowledge.saveAutoSettings": "自動返信設定を保存", - "admin.knowledge.insertImage": "画像を挿入", - "admin.knowledge.uploading": "アップロード中…", - "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP、最大 2 MiB。UPLOAD_DIR/support-kb に保存(HMAC 公開 URL)。", - "admin.knowledge.unavailableMsg": "このデプロイではサポートナレッジを利用できません。プラットフォーム管理者に連絡してください。", - "admin.knowledge.loadFailed": "サポートナレッジを読み込めませんでした", - "admin.knowledge.loadArticleFailed": "記事を読み込めませんでした", - "admin.knowledge.loadTemplateFailed": "テンプレートを読み込めませんでした", - "admin.knowledge.saveArticleFailed": "記事を保存できませんでした", - "admin.knowledge.saveTemplateFailed": "テンプレートを保存できませんでした", - "admin.knowledge.deleteArticleFailed": "記事を削除できませんでした", - "admin.knowledge.deleteTemplateFailed": "テンプレートを削除できませんでした", - "admin.knowledge.saveAutoFailed": "自動返信設定を保存できませんでした", - "admin.knowledge.uploadImageFailed": "画像をアップロードできませんでした", - "admin.translations.eyebrow": "プラットフォーム", - "admin.translations.title": "翻訳", - "admin.translations.description": "ダッシュボードUIのカバレッジを確認し、ファイルベースのロケールパックを編集します。", - "admin.translations.unavailable": "翻訳を利用できません", - "admin.translations.sourceOfTruth": "信頼できる情報源", - "admin.translations.sourceOfTruthLabel": "信頼できる情報源:", - "admin.translations.colLocale": "ロケール", - "admin.translations.colTranslated": "翻訳済み", - "admin.translations.colMissing": "不足", - "admin.translations.colStatus": "ステータス", - "admin.translations.badgeBase": "ベース", - "admin.translations.badgeComplete": "完了", - "admin.translations.badgeUnregistered": "未登録", - "admin.translations.badgeGaps": "不足", - "admin.translations.language": "言語", - "admin.translations.show": "表示", - "admin.translations.filterMissing": "不足のみ", - "admin.translations.filterTranslated": "翻訳済みのみ", - "admin.translations.filterAll": "すべてのキー", - "admin.translations.search": "検索", - "admin.translations.searchPlaceholder": "キーまたはテキスト…", - "admin.translations.noKeysMatch": "一致するキーなし", - "admin.translations.badgeMissing": "不足", - "admin.translations.badgeUnsaved": "未保存", - "admin.translations.english": "英語", - "admin.bootstrap.title": "ブートストラップ管理者アクセス", - "admin.bootstrap.description": "アカウントに既にプラットフォーム管理者アクセスがあるか確認します。新規管理者は既存の管理者による付与が必要です。", - "admin.bootstrap.statusTitle": "プラットフォーム管理者ステータス", - "admin.bootstrap.statusDesc": "プラットフォーム管理者アクセスは既存の管理者が付与します。このロールのセルフサーブ・ブートストラップはありません。", - "admin.bootstrap.alreadyAdmin": "既にプラットフォーム管理者アクセスがあります。", - "admin.bootstrap.signedInAs": "{email} としてサインイン中。続行するには管理パネルを開いてください。", - "admin.bootstrap.signedInAsShort": "{email} としてサインイン中", - "admin.bootstrap.notAdminTitle": "プラットフォーム管理者ではありません", - "admin.bootstrap.notAdminMsg": "サインインしていますがプラットフォーム管理者としてマークされていません。既存の管理者にアクセス付与を依頼し、サインアウトしてから再度サインインしてください。", - "admin.bootstrap.goToPanel": "管理パネルへ", - "admin.bootstrap.loadFailed": "プロフィールの読み込みに失敗しました", - "admin.migrate.title": "組織の移行", - "admin.migrate.description": "この移行ツールは廃止済みで、データを変更しません。", - "admin.migrate.notAvailable": "利用不可", - "admin.migrate.body": "以前のIDプロバイダからの組織移行は不要です。会社とローカル認証は「ユーザーと組織」で管理します。", - "admin.migrate.hint": "古いブックマークから開いた場合は、「ユーザーと組織」「プラットフォーム請求」「停滞商品」に進んでください。", - "admin.migrate.adminHome": "管理ホーム", - "admin.migrate.users": "ユーザー", - "admin.redirect.diagnostics": "診断へリダイレクト中…", - "admin.redirect.stuck": "停滞商品へリダイレクト中…", - "common.refresh": "更新", - "common.delete": "削除", - "common.clearSearch": "検索をクリア", - "common.loading": "読み込み中…", - "common.never": "なし", - "common.back": "戻る", - "common.startOver": "最初から", - "common.create": "作成", - "common.required": "必須", - "common.actions": "操作", - "common.status": "ステータス", - "common.nameCol": "名前", - "common.products": "商品", - "common.more": "+あと{count}件", - "feeds.title": "あなたのフィード", - "feeds.loadingDesc": "サプライヤーフィードを読み込み中…", - "feeds.desc": "このページ {page} · フィード合計 {total} — サプライヤーCSV/XMLのURLとアップロード。ストアから接続すると案内付きオプションがあります。", - "feeds.storesHub": "ストアハブ", - "feeds.addFeed": "Feedを追加", - "feeds.searchPlaceholder": "フィードを検索...", - "feeds.emptyTitle": "商品フィードはまだありません", - "feeds.emptyMessage": "サプライヤーのCSV/XML URLに接続するかファイルをアップロードして、カタログへ商品を同期します。", - "feeds.connectFeed": "Feedを接続", - "feeds.uploadCsvCta": "CSVをアップロード", - "feeds.noMatchTitle": "一致するFeedなし", - "feeds.noMatchMessage": "別の検索語を試すか、検索をクリアしてすべてのフィードを表示してください。", - "feeds.col.source": "ソース", - "feeds.col.mapping": "マッピング", - "feeds.col.lastData": "最終同期", - "feeds.copyUrl": "URLをコピー", - "feeds.fieldsMapped": "{count} フィールド", - "feeds.fieldsMappedTitle": "{count} フィールドをマップ済み", - "feeds.fieldsMappedTitlePlural": "{count} フィールドをマップ済み", - "feeds.mappingsSaved": "フィールドマッピングを保存しました", - "feeds.mapped": "マップ済み", - "feeds.notMapped": "未マップ", - "feeds.notMappedTitle": "フィールドマッピングはまだありません — 「マップ」を開いて設定", - "feeds.productsFromFeed": "このフィードからの商品 {count} 件", - "feeds.noProductsYet": "このフィードからの商品インポートはまだありません", - "feeds.syncing": "同期中…", - "feeds.syncingShort": "同期中", - "feeds.syncingHint": "大きなフィードでは数分かかることがあります", - "feeds.liveSync": "フィード同期", - "feeds.productData": "カタログ更新", - "feeds.mapFields": "フィールドをマップ", - "feeds.map": "マップ", - "feeds.sync": "同期", - "feeds.syncNow": "今すぐ同期", - "feeds.syncManualTitle": "今すぐ一回だけ同期します。自動同期はフィード編集で設定した間隔を使います。", - "feeds.syncInProgress": "同期中", - "feeds.addTitle": "Feedを追加", - "feeds.addDesc": "商品フィードURLに接続するかCSVをアップロードします。下のサンプルで想定構造に合わせてください。", - "feeds.field.name": "名前", - "feeds.field.namePlaceholder": "自分の商品フィード", - "feeds.tab.url": "フィードURL", - "feeds.tab.file": "CSVファイル", - "feeds.field.url": "フィードURL", - "feeds.field.urlPlaceholder": "https://…", - "feeds.field.type": "タイプ", - "feeds.field.file": "CSVファイル", - "feeds.fileHint": "最大5 MiB。作成後に列をマップしてから同期 — URLフィードと同じ流れです。", - "feeds.field.interval": "自動同期間隔(分)", - "feeds.field.intervalHint": "フィードが有効なあいだ、Descrybe が自動で取り込む頻度です。一覧の Sync は一回限りの取り込みで、このスケジュールは変わりません。", - "feeds.createFeed": "フィードを作成", - "feeds.editTitle": "Feedを編集", - "feeds.editDesc": "名前・種類・自動同期スケジュール・ソース URL を更新します。フィード一覧の Sync は一回限りの取り込みです。", - "feeds.csvSource": "CSVソース", - "feeds.uploadedCsv": "アップロード済みCSV", - "feeds.replaceFileHint": "ファイルを差し替えるには新しいフィードを作成します。同期は保存済みアップロードを再読み込みします。", - "feeds.csvTypeLocked": "アップロードしたCSVフィードは種別CSVのままです。", - "feeds.saveChanges": "変更を保存", - "feeds.historyTitle": "同期履歴", - "feeds.historyDesc": "「{name}」の最近の同期ジョブ。", - "feeds.historyLastSynced": "最終成功同期 {relative}({absolute})。", - "feeds.historyNeverSynced": "まだ成功した同期はありません。", - "feeds.historyLoading": "同期履歴を読み込み中…", - "feeds.historyEmpty": "同期ジョブはまだありません。", - "feeds.history.started": "開始済み", - "feeds.history.completed": "完了", - "feeds.loadFailed": "フィードの読み込みに失敗しました", - "feeds.copyFailed": "URLをコピーできませんでした", - "feeds.created": "Feedを作成しました", - "feeds.updated": "Feedを更新しました。", - "feeds.mapBeforeSync": "このフィードを同期する前にフィールドをマップしてください。", - "feeds.activateBeforeSync": "同期する前にフィードを有効化してください。", - "feeds.syncFinished": "同期が完了しました", - "feeds.viewProducts": "商品を表示", - "feeds.processing": "処理", - "feeds.syncFailed": "同期に失敗しました", - "feeds.statusUpdateFailed": "ステータスを更新できませんでした", - "feeds.deleteConfirm": "フィード「{name}」を削除しますか?この操作は取り消せません。", - "feeds.deleted": "Feedを削除しました。", - "feeds.deleteFailed": "フィードを削除できませんでした", - "feeds.historyLoadFailed": "同期履歴を読み込めませんでした", - "feeds.ftpUnsupported": "FTP/FTPS同期は未対応です。サプライヤーに公開HTTPSフィードURLを依頼するか、ここでCSVフィードをアップロードするか、Uploadsからファイルを取り込んでください。", - "feeds.ftpUnsupportedShort": "FTP同期は未対応", + "admin.settings.providerOption.custom": "カスタム / その他", + "admin.support.title": "サポートセンター", + "admin.support.description": "スタッフ受信箱 — キューから取得、範囲で絞り込み、スレッドを開いて解決", + "admin.support.unavailable": "サポートキューは利用できません。続く場合はプラットフォーム管理者に連絡してください。", + "admin.support.noTickets": "このキューにチケットはありません。", + "admin.support.ticketNotFound": "チケットが見つかりません。", + "admin.support.notAvailable": "このデプロイではサポートを利用できません。", + "admin.support.loadFailed": "このチケットを読み込めませんでした。", + "admin.support.noMessages": "メッセージはまだありません。", + "admin.support.queueScopeAria": "キュー範囲", + "admin.support.statusFilterAria": "ステータスフィルタ", + "admin.support.autoAssistFilterAria": "オートアシストフィルタ", + "admin.support.searchPlaceholder": "件名・メール・会社を検索", + "admin.support.searchAria": "チケットを検索", + "admin.support.assignStaffAria": "スタッフに割り当て", + "admin.support.aiDraftAria": "AI下書き本文", + "admin.support.replyPlaceholder": "返信を書く…", + "admin.support.replyAria": "返信本文", + "admin.knowledge.eyebrow": "プラットフォーム管理者", + "admin.knowledge.title": "サポートナレッジ", + "admin.knowledge.description": "FAQ自動一致用にヘルプ記事を構成します。コンテンツエージェントが本文を埋めます — 事実は正確に。", + "admin.knowledge.notReady": "サポートナレッジの準備ができていません", + "admin.knowledge.noTemplates": "返信テンプレートなし", + "admin.knowledge.articleDesc": "Markdown本文は安全なアップロードで画像をサポートします。商品事実を創作せず、コンテンツエージェント用のプレースホルダを残してください。", + "admin.knowledge.templateDesc": "許可プレースホルダ: subject, category。", + "admin.knowledge.searchPlaceholder": "タイトル・スラッグ・キーワードを検索…", + "admin.knowledge.searchAria": "記事を検索", + "admin.knowledge.publishFilterAria": "公開ステータスフィルタ", + "admin.knowledge.deleteArticleAria": "記事を削除", + "admin.knowledge.deleteTemplateAria": "テンプレートを削除", + "admin.support.autoReplyStatus.matched": "FAQ 一致", + "admin.support.autoReplyStatus.aiDraft": "AI 下書き待ち", + "admin.support.autoReplyStatus.aiSent": "AI 返信送信済み", + "admin.support.autoReplyStatus.skipped": "自動スキップ", + "admin.support.autoReplyStatus.failed": "自動失敗", + "admin.support.autoReplyStatus.handedOff": "人手対応が必要", + "admin.support.autoReplyStatus.none": "自動試行なし", + "admin.support.autoSource.kb": "ナレッジベース", + "admin.support.autoSource.template": "テンプレート", + "admin.support.autoSource.ai": "AI支援", + "admin.support.autoSource.automated": "Automated(訳)", + "admin.knowledge.categoriesHeading": "カテゴリ", + "admin.knowledge.categoriesHint": "コンテンツエージェント用の空のシードバケット。", + "admin.knowledge.showingArticles": "{shown} 件の記事を表示(本文は編集時に読み込み)。", + "admin.knowledge.showingArticlesOf": "{total} 件中 {shown} 件を表示(本文は編集時に読み込み)。", + "admin.knowledge.templatesHint": "任意のプレースホルダ {{subject}} / {{category}} 付き定型返信。", + "admin.knowledge.faqAutoMatchTitle": "FAQ 自動マッチ", + "admin.knowledge.faqAutoMatchDesc": "チケット作成時のキーワード一致。既定しきい値 0.78(範囲 0.50–0.95)。", + "admin.knowledge.aiFallbackTitle": "AI フォールバック", + "admin.knowledge.aiFallbackDesc": "FAQ 一致がしきい値未満のときに使用。返信はプラットフォームの {role} AI ロールを使います。", + "admin.knowledge.noModel": "モデルなし", + "admin.knowledge.keyLast4": "キー …{last4}", + "admin.knowledge.sourceLabel": "ソース {source}", + "admin.knowledge.apiKeyNote": "API キーは常にこのロールから取得されます。上の上書きはプロバイダ / モデル / ベース URL のみ変更します。", + "admin.knowledge.saveAutoSettings": "自動返信設定を保存", + "admin.knowledge.insertImage": "画像を挿入", + "admin.knowledge.uploading": "アップロード中…", + "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP、最大 2 MiB。UPLOAD_DIR/support-kb に保存(HMAC 公開 URL)。", + "admin.knowledge.unavailableMsg": "このデプロイではサポートナレッジを利用できません。プラットフォーム管理者に連絡してください。", + "admin.knowledge.loadFailed": "サポートナレッジを読み込めませんでした", + "admin.knowledge.loadArticleFailed": "記事を読み込めませんでした", + "admin.knowledge.loadTemplateFailed": "テンプレートを読み込めませんでした", + "admin.knowledge.saveArticleFailed": "記事を保存できませんでした", + "admin.knowledge.saveTemplateFailed": "テンプレートを保存できませんでした", + "admin.knowledge.deleteArticleFailed": "記事を削除できませんでした", + "admin.knowledge.deleteTemplateFailed": "テンプレートを削除できませんでした", + "admin.knowledge.saveAutoFailed": "自動返信設定を保存できませんでした", + "admin.knowledge.uploadImageFailed": "画像をアップロードできませんでした", + "admin.translations.eyebrow": "プラットフォーム", + "admin.translations.title": "翻訳", + "admin.translations.description": "ダッシュボードUIのカバレッジを確認し、ファイルベースのロケールパックを編集します。", + "admin.translations.unavailable": "翻訳を利用できません", + "admin.translations.sourceOfTruth": "信頼できる情報源", + "admin.translations.sourceOfTruthLabel": "信頼できる情報源:", + "admin.translations.colLocale": "ロケール", + "admin.translations.colTranslated": "翻訳済み", + "admin.translations.colMissing": "不足", + "admin.translations.colStatus": "ステータス", + "admin.translations.badgeBase": "ベース", + "admin.translations.badgeComplete": "完了", + "admin.translations.badgeUnregistered": "未登録", + "admin.translations.badgeGaps": "不足", + "admin.translations.language": "言語", + "admin.translations.show": "表示", + "admin.translations.filterMissing": "不足のみ", + "admin.translations.filterTranslated": "翻訳済みのみ", + "admin.translations.filterAll": "すべてのキー", + "admin.translations.search": "検索", + "admin.translations.searchPlaceholder": "キーまたはテキスト…", + "admin.translations.noKeysMatch": "一致するキーなし", + "admin.translations.badgeMissing": "不足", + "admin.translations.badgeUnsaved": "未保存", + "admin.translations.english": "英語", + "admin.bootstrap.title": "ブートストラップ管理者アクセス", + "admin.bootstrap.description": "アカウントに既にプラットフォーム管理者アクセスがあるか確認します。新規管理者は既存の管理者による付与が必要です。", + "admin.bootstrap.statusTitle": "プラットフォーム管理者ステータス", + "admin.bootstrap.statusDesc": "プラットフォーム管理者アクセスは既存の管理者が付与します。このロールのセルフサーブ・ブートストラップはありません。", + "admin.bootstrap.alreadyAdmin": "既にプラットフォーム管理者アクセスがあります。", + "admin.bootstrap.signedInAs": "{email} としてサインイン中。続行するには管理パネルを開いてください。", + "admin.bootstrap.signedInAsShort": "{email} としてサインイン中", + "admin.bootstrap.notAdminTitle": "プラットフォーム管理者ではありません", + "admin.bootstrap.notAdminMsg": "サインインしていますがプラットフォーム管理者としてマークされていません。既存の管理者にアクセス付与を依頼し、サインアウトしてから再度サインインしてください。", + "admin.bootstrap.goToPanel": "管理パネルへ", + "admin.bootstrap.loadFailed": "プロフィールの読み込みに失敗しました", + "admin.migrate.title": "組織の移行", + "admin.migrate.description": "この移行ツールは廃止済みで、データを変更しません。", + "admin.migrate.notAvailable": "利用不可", + "admin.migrate.body": "以前のIDプロバイダからの組織移行は不要です。会社とローカル認証は「ユーザーと組織」で管理します。", + "admin.migrate.hint": "古いブックマークから開いた場合は、「ユーザーと組織」「プラットフォーム請求」「停滞商品」に進んでください。", + "admin.migrate.adminHome": "管理ホーム", + "admin.migrate.users": "ユーザー", + "admin.redirect.diagnostics": "診断へリダイレクト中…", + "admin.redirect.stuck": "停滞商品へリダイレクト中…", + "common.refresh": "æ›´æ–°", + "common.delete": "削除", + "common.clearSearch": "検索をクリア", + "common.loading": "読み込み中…", + "common.never": "なし", + "common.back": "戻る", + "common.startOver": "最初から", + "common.create": "作成", + "common.required": "å¿…é ˆ", + "common.actions": "操作", + "common.status": "ステータス", + "common.nameCol": "名前", + "common.products": "商品", + "common.more": "+あと{count}ä»¶", + "feeds.title": "あなたのフィード", + "feeds.loadingDesc": "サプライヤーフィードを読み込み中…", + "feeds.desc": "このページ {page} · フィード合計 {total} — サプライヤーCSV/XMLのURLとアップロード。ストアから接続すると案内付きオプションがあります。", + "feeds.storesHub": "ストアハブ", + "feeds.addFeed": "Feedを追加", + "feeds.searchPlaceholder": "フィードを検索...", + "feeds.emptyTitle": "商品フィードはまだありません", + "feeds.emptyMessage": "サプライヤーのCSV/XML URLに接続するかファイルをアップロードして、カタログへ商品を同期します。", + "feeds.connectFeed": "Feedを接続", + "feeds.uploadCsvCta": "CSVをアップロード", + "feeds.noMatchTitle": "一致するFeedなし", + "feeds.noMatchMessage": "別の検索語を試すか、検索をクリアしてすべてのフィードを表示してください。", + "feeds.col.source": "ソース", + "feeds.col.mapping": "マッピング", + "feeds.col.lastData": "最終同期", + "feeds.copyUrl": "URLをコピー", + "feeds.fieldsMapped": "{count} フィールド", + "feeds.fieldsMappedTitle": "{count} フィールドをマップ済み", + "feeds.fieldsMappedTitlePlural": "{count} フィールドをマップ済み", + "feeds.mappingsSaved": "フィールドマッピングを保存しました", + "feeds.mapped": "マップ済み", + "feeds.notMapped": "未マップ", + "feeds.notMappedTitle": "フィールドマッピングはまだありません — 「マップ」を開いて設定", + "feeds.productsFromFeed": "このフィードからの商品 {count} ä»¶", + "feeds.noProductsYet": "このフィードからの商品インポートはまだありません", + "feeds.syncing": "同期中…", + "feeds.syncingShort": "同期中", + "feeds.syncingHint": "大きなフィードでは数分かかることがあります", + "feeds.liveSync": "フィード同期", + "feeds.productData": "カタログ更新", + "feeds.mapFields": "フィールドをマップ", + "feeds.map": "マップ", + "feeds.sync": "同期", + "feeds.syncNow": "今すぐ同期", + "feeds.syncManualTitle": "今すぐ一回だけ同期します。自動同期はフィード編集で設定した間隔を使います。", + "feeds.syncInProgress": "同期中", + "feeds.addTitle": "Feedを追加", + "feeds.addDesc": "商品フィードURLに接続するかCSVをアップロードします。下のサンプルで想定構造に合わせてください。", + "feeds.field.name": "名前", + "feeds.field.namePlaceholder": "自分の商品フィード", + "feeds.tab.url": "フィードURL", + "feeds.tab.file": "CSVファイル", + "feeds.field.url": "フィードURL", + "feeds.field.urlPlaceholder": "https://…", + "feeds.field.type": "タイプ", + "feeds.field.file": "CSVファイル", + "feeds.fileHint": "最大5 MiB。作成後に列をマップしてから同期 — URLフィードと同じ流れです。", + "feeds.field.interval": "自動同期間隔(分)", + "feeds.field.intervalHint": "フィードが有効なあいだ、Descrybe が自動で取り込む頻度です。一覧の Sync は一回限りの取り込みで、このスケジュールは変わりません。", + "feeds.createFeed": "フィードを作成", + "feeds.editTitle": "Feedを編集", + "feeds.editDesc": "名前・種類・自動同期スケジュール・ソース URL を更新します。フィード一覧の Sync は一回限りの取り込みです。", + "feeds.csvSource": "CSVソース", + "feeds.uploadedCsv": "アップロード済みCSV", + "feeds.replaceFileHint": "ファイルを差し替えるには新しいフィードを作成します。同期は保存済みアップロードを再読み込みします。", + "feeds.csvTypeLocked": "アップロードしたCSVフィードは種別CSVのままです。", + "feeds.saveChanges": "変更を保存", + "feeds.historyTitle": "同期履歴", + "feeds.historyDesc": "「{name}」の最近の同期ジョブ。", + "feeds.historyLastSynced": "最終成功同期 {relative}({absolute})。", + "feeds.historyNeverSynced": "まだ成功した同期はありません。", + "feeds.historyLoading": "同期履歴を読み込み中…", + "feeds.historyEmpty": "同期ジョブはまだありません。", + "feeds.history.started": "開始済み", + "feeds.history.completed": "完了", + "feeds.loadFailed": "フィードの読み込みに失敗しました", + "feeds.copyFailed": "URLをコピーできませんでした", + "feeds.created": "Feedを作成しました", + "feeds.updated": "Feedを更新しました。", + "feeds.mapBeforeSync": "このフィードを同期する前にフィールドをマップしてください。", + "feeds.activateBeforeSync": "同期する前にフィードを有効化してください。", + "feeds.syncFinished": "同期が完了しました", + "feeds.viewProducts": "商品を表示", + "feeds.processing": "処理", + "feeds.syncFailed": "同期に失敗しました", + "feeds.statusUpdateFailed": "ステータスを更新できませんでした", + "feeds.deleteConfirm": "フィード「{name}」を削除しますか?この操作は取り消せません。", + "feeds.deleted": "Feedを削除しました。", + "feeds.deleteFailed": "フィードを削除できませんでした", + "feeds.historyLoadFailed": "同期履歴を読み込めませんでした", + "feeds.ftpUnsupported": "FTP/FTPS同期は未対応です。サプライヤーに公開HTTPSフィードURLを依頼するか、ここでCSVフィードをアップロードするか、Uploadsからファイルを取り込んでください。", + "feeds.ftpUnsupportedShort": "FTP同期は未対応", "feeds.ftpBadge": "FTP", - "feeds.ftpMigrateBanner": "一部のフィードがまだFTP/FTPSです。Descrybeはそれらを取得できません。公開HTTPS URLへ切り替え、CSVフィードを追加するか、Uploadsからアップロードしてください。", - "feeds.ftpUploadCta": "Uploadsへ", - "feeds.ftpHttpsCta": "HTTPSフィードを追加", - "feeds.ftpCsvCta": "CSVフィードをアップロード", - "feeds.status.mappingIncomplete": "マッピング未完了", - "feeds.status.readyForMapping": "マッピング準備完了", - "feeds.status.mapped": "マップ済み", - "feeds.status.active": "有効", - "feeds.status.inactive": "無効", - "feeds.status.error": "エラー", - "feeds.status.unknown": "不明", - "feeds.actions.menu": "フィード操作", - "feeds.actions.menuSyncing": "フィード操作(同期中)", - "feeds.actions.editFeed": "Feedを編集", - "feeds.actions.editMapping": "マッピングを編集", - "feeds.actions.syncNow": "今すぐ同期", - "feeds.actions.syncInProgress": "同期中…", - "feeds.actions.activateToSync": "同期するにはフィードを有効化", - "feeds.actions.viewHistory": "同期履歴を表示", - "feeds.actions.deactivate": "フィードを無効化", - "feeds.actions.activate": "フィードを有効化", - "feeds.actions.delete": "フィードを削除", - "feeds.stats.totalFeeds": "フィード合計", - "feeds.stats.activeMapped": "{active} 件有効 · {mapped} 件マップ済み", - "feeds.stats.activeOnly": "{active} 件が有効", - "feeds.stats.totalProducts": "取込商品", - "feeds.stats.acrossFeeds": "生データ行(カタログ+キューの合計ではない)", - "feeds.stats.processed": "カタログ内", - "feeds.stats.readyCatalog": "カタログ行 — 取込合計の内訳ではない", - "feeds.stats.unprocessed": "処理待ち", - "feeds.stats.waiting": "生キュー — 取込合計の内訳ではない", - "feeds.format.howTo": "フィードの構成方法", - "feeds.format.required": "必須:", - "feeds.preview.title": "フィードソースのプレビュー", - "feeds.preview.truncated": "切り詰め", - "feeds.preview.refresh": "プレビューを更新", - "feeds.preview.copy": "プレビューをコピー", - "feeds.preview.loading": "プレビューを読み込み中…", - "feeds.preview.empty": "スキーマを抽出してフィードソースをプレビューします。", - "feeds.schema.search": "フィールドを検索…", - "feeds.schema.fieldName": "フィールド名", - "feeds.schema.sourcePath": "ソースパス", - "feeds.schema.confirm": "確認", - "feeds.schema.apply": "適用", - "feeds.preflight.missingItemPath": "同期する前に商品要素のパスを選択してください。", - "feeds.preflight.emptyMappings": "同期する前に少なくとも1つのソースフィールドをマップしてください。", - "feeds.preflight.missingRequired": "同期する前に必須フィールドをマップしてください: {fields}。", - "feeds.preflight.unknownSource": "抽出スキーマに一部のマップ済みソースが見つかりません: {fields}{more}。サンプル値に頼る前に再抽出するかパスを修正してください。", - "feeds.preflight.emptySample": "必須フィールドのサンプル値が空です: {fields}。フル同期の前にソース列を確認してください。", - "feeds.preflight.fix": "同期する前にフィールドマッピングを修正してください。", - "mapping.title": "フィードマッピング", - "mapping.titleNamed": "マップ: {name}", - "mapping.description": "繰り返しの商品要素を選択し、ソースフィールドを抽出してから、Descrybe の商品フィールドにマッピングします。", - "mapping.autoMap": "自動マップ", - "mapping.fuzzy": "ファジー {count} 件", - "mapping.extractSchema": "スキーマを抽出", - "mapping.backToFeeds": "Feeds に戻る", - "mapping.ftpStillEdit": "{message} ここでもマッピングを編集できます。商品を更新するにはHTTPSへ切り替えるかファイルをアップロードしてください。", - "mapping.ftpUploadCta": "Uploadsへ", - "mapping.ftpHttpsCta": "HTTPSフィードを追加", - "mapping.ftpCsvCta": "CSVフィードをアップロード", - "mapping.loading": "フィードの詳細を読み込み中…", - "mapping.step1": "商品要素を選択", - "mapping.step2": "フィールドをマップ", - "mapping.step1Heading": "ステップ 1: 商品要素を選択", - "mapping.csvHint": "CSV フィードは列ヘッダーをソースフィールドとして使います。スキーマを抽出して列を読み込んでから、マッピングに進んでください。", - "mapping.howToSelect": "商品要素の選び方:", - "mapping.howToHint": "任意のガイド", - "mapping.howTo.1": "スキーマを抽出するか、プレビュー内の繰り返しタグをクリックします", - "mapping.howTo.2": "各要素には 1 件の商品の詳細が含まれる必要があります", - "mapping.howTo.3": "パスを確認します(例:", - "mapping.howTo.4": "ソースフィールドを商品フィールドにマッピングへ進みます", - "mapping.productElementPath": "商品要素のパス", - "mapping.pathPlaceholder": "例: rss/channel/item または products/product", - "mapping.continue": "続行 →", - "mapping.continueFields": "フィールドマッピングへ続行 →", - "mapping.discovered": "サンプル行 {rows} 件からソースフィールド {fields} 件を検出しました。", - "mapping.suggestionsCount": "· 自動マッピングの候補 {count} 件", - "mapping.step2Heading": "ステップ 2: フィールドをマップ", - "mapping.requiredFieldsBadge": "必須フィールド {count}", - "mapping.unmappedRequired": "未マップの必須 {count}", - "mapping.sourceFieldsBadge": "ソースフィールド {count}", - "mapping.suggestedBadge": "候補 {count}", - "mapping.step2Help": "ソース列または XPath ノードを商品フィールドにマップします。必須フィールドには * が付きます。ヘルプアイコンにカーソルを合わせると短い用語ヒントが表示されます。", - "mapping.requiredFields": "必須フィールド", - "mapping.requiredMapped": "· {mapped}/{total} マップ済み", - "mapping.requiredProgressDone": "必須フィールドはすべてマッピング済み — 次のステップに進めます。", - "mapping.requiredProgressHint": "* のフィールドは、このフィードで商品を同期する前にマッピングが必要です。", - "mapping.requiredProgressAria": "必須フィールドの進捗: {mapped} / {total} マッピング済み", + "feeds.ftpMigrateBanner": "一部のフィードがまだFTP/FTPSです。Descrybeはそれらを取得できません。公開HTTPS URLへ切り替え、CSVフィードを追加するか、Uploadsからアップロードしてください。", + "feeds.ftpUploadCta": "Uploadsへ", + "feeds.ftpHttpsCta": "HTTPSフィードを追加", + "feeds.ftpCsvCta": "CSVフィードをアップロード", + "feeds.status.mappingIncomplete": "マッピング未完了", + "feeds.status.readyForMapping": "マッピング準備完了", + "feeds.status.mapped": "マップ済み", + "feeds.status.active": "有効", + "feeds.status.inactive": "無効", + "feeds.status.error": "エラー", + "feeds.status.unknown": "不明", + "feeds.actions.menu": "フィード操作", + "feeds.actions.menuSyncing": "フィード操作(同期中)", + "feeds.actions.editFeed": "Feedを編集", + "feeds.actions.editMapping": "マッピングを編集", + "feeds.actions.syncNow": "今すぐ同期", + "feeds.actions.syncInProgress": "同期中…", + "feeds.actions.activateToSync": "同期するにはフィードを有効化", + "feeds.actions.viewHistory": "同期履歴を表示", + "feeds.actions.deactivate": "フィードを無効化", + "feeds.actions.activate": "フィードを有効化", + "feeds.actions.delete": "フィードを削除", + "feeds.stats.totalFeeds": "フィード合計", + "feeds.stats.activeMapped": "{active} 件有効 · {mapped} 件マップ済み", + "feeds.stats.activeOnly": "{active} 件が有効", + "feeds.stats.totalProducts": "取込商品", + "feeds.stats.acrossFeeds": "生データ行(カタログ+キューの合計ではない)", + "feeds.stats.processed": "カタログ内", + "feeds.stats.readyCatalog": "カタログ行 — 取込合計の内訳ではない", + "feeds.stats.unprocessed": "処理待ち", + "feeds.stats.waiting": "生キュー — 取込合計の内訳ではない", + "feeds.format.howTo": "フィードの構成方法", + "feeds.format.required": "å¿…é ˆ:", + "feeds.preview.title": "フィードソースのプレビュー", + "feeds.preview.truncated": "切り詰め", + "feeds.preview.refresh": "プレビューを更新", + "feeds.preview.copy": "プレビューをコピー", + "feeds.preview.loading": "プレビューを読み込み中…", + "feeds.preview.empty": "スキーマを抽出してフィードソースをプレビューします。", + "feeds.schema.search": "フィールドを検索…", + "feeds.schema.fieldName": "フィールド名", + "feeds.schema.sourcePath": "ソースパス", + "feeds.schema.confirm": "確認", + "feeds.schema.apply": "適用", + "feeds.preflight.missingItemPath": "同期する前に商品要素のパスを選択してください。", + "feeds.preflight.emptyMappings": "同期する前に少なくとも1つのソースフィールドをマップしてください。", + "feeds.preflight.missingRequired": "同期する前に必須フィールドをマップしてください: {fields}。", + "feeds.preflight.unknownSource": "抽出スキーマに一部のマップ済みソースが見つかりません: {fields}{more}。サンプル値に頼る前に再抽出するかパスを修正してください。", + "feeds.preflight.emptySample": "必須フィールドのサンプル値が空です: {fields}。フル同期の前にソース列を確認してください。", + "feeds.preflight.fix": "同期する前にフィールドマッピングを修正してください。", + "mapping.title": "フィードマッピング", + "mapping.titleNamed": "マップ: {name}", + "mapping.description": "繰り返しの商品要素を選択し、ソースフィールドを抽出してから、Descrybe の商品フィールドにマッピングします。", + "mapping.autoMap": "自動マップ", + "mapping.fuzzy": "ファジー {count} ä»¶", + "mapping.extractSchema": "スキーマを抽出", + "mapping.backToFeeds": "Feeds に戻る", + "mapping.ftpStillEdit": "{message} ここでもマッピングを編集できます。商品を更新するにはHTTPSへ切り替えるかファイルをアップロードしてください。", + "mapping.ftpUploadCta": "Uploadsへ", + "mapping.ftpHttpsCta": "HTTPSフィードを追加", + "mapping.ftpCsvCta": "CSVフィードをアップロード", + "mapping.loading": "フィードの詳細を読み込み中…", + "mapping.step1": "商品要素を選択", + "mapping.step2": "フィールドをマップ", + "mapping.step1Heading": "ステップ 1: 商品要素を選択", + "mapping.csvHint": "CSV フィードは列ヘッダーをソースフィールドとして使います。スキーマを抽出して列を読み込んでから、マッピングに進んでください。", + "mapping.howToSelect": "商品要素の選び方:", + "mapping.howToHint": "任意のガイド", + "mapping.howTo.1": "スキーマを抽出するか、プレビュー内の繰り返しタグをクリックします", + "mapping.howTo.2": "各要素には 1 件の商品の詳細が含まれる必要があります", + "mapping.howTo.3": "パスを確認します(例:", + "mapping.howTo.4": "ソースフィールドを商品フィールドにマッピングへ進みます", + "mapping.productElementPath": "商品要素のパス", + "mapping.pathPlaceholder": "例: rss/channel/item または products/product", + "mapping.continue": "続行 →", + "mapping.continueFields": "フィールドマッピングへ続行 →", + "mapping.discovered": "サンプル行 {rows} 件からソースフィールド {fields} 件を検出しました。", + "mapping.suggestionsCount": "· 自動マッピングの候補 {count} ä»¶", + "mapping.step2Heading": "ステップ 2: フィールドをマップ", + "mapping.requiredFieldsBadge": "必須フィールド {count}", + "mapping.unmappedRequired": "未マップの必須 {count}", + "mapping.sourceFieldsBadge": "ソースフィールド {count}", + "mapping.suggestedBadge": "候補 {count}", + "mapping.step2Help": "ソース列または XPath ノードを商品フィールドにマップします。必須フィールドには * が付きます。ヘルプアイコンにカーソルを合わせると短い用語ヒントが表示されます。", + "mapping.requiredFields": "必須フィールド", + "mapping.requiredMapped": "· {mapped}/{total} マップ済み", + "mapping.requiredProgressDone": "必須フィールドはすべてマッピング済み — 次のステップに進めます。", + "mapping.requiredProgressHint": "* のフィールドは、このフィードで商品を同期する前にマッピングが必要です。", + "mapping.requiredProgressAria": "必須フィールドの進捗: {mapped} / {total} マッピング済み", "mapping.nextAfterSaveReady": "Mappings saved. Next, sync a small sample to check products look right.", "mapping.nextAfterSaveIncomplete": "Mappings saved. Finish the remaining required fields, then sync a sample.", "mapping.nextCtaSyncSample": "Sync + process sample", "mapping.nextCtaFinishRequired": "Show missing required fields", - "mapping.highConfidence": "高信頼度マッピング {count} 件の準備完了", - "mapping.highConfidencePlural": "高信頼度マッピング {count} 件の準備完了", - "mapping.highConfidenceHelp": "完全一致およびエイリアス一致(例: EAN → GTIN)。すべて適用するか、表の行ごとのチップで受け入れます。", - "mapping.reviewMappings": "マッピングを確認", - "mapping.needItemPath": "フィールドをマッピングする前に商品要素パスを入力してください。", - "mapping.removeMapping": "マッピングを削除", - "mapping.sourcePlaceholder": "列名または xpath", - "mapping.processAfterSync": "同期後に処理する商品", - "mapping.noFuzzyLeft": "確認が必要なファジー一致は残っていません。", - "mapping.syncedQueued": "フィードを同期し、処理待ちに {queued} 件の商品をキューしました{jobId}。", - "mapping.saveMappings": "マッピングを保存", - "mapping.syncProcessSample": "同期 + サンプル処理", + "mapping.highConfidence": "高信頼度マッピング {count} 件の準備完了", + "mapping.highConfidencePlural": "高信頼度マッピング {count} 件の準備完了", + "mapping.highConfidenceHelp": "完全一致およびエイリアス一致(例: EAN → GTIN)。すべて適用するか、表の行ごとのチップで受け入れます。", + "mapping.reviewMappings": "マッピングを確認", + "mapping.needItemPath": "フィールドをマッピングする前に商品要素パスを入力してください。", + "mapping.removeMapping": "マッピングを削除", + "mapping.sourcePlaceholder": "列名または xpath", + "mapping.processAfterSync": "同期後に処理する商品", + "mapping.noFuzzyLeft": "確認が必要なファジー一致は残っていません。", + "mapping.syncedQueued": "フィードを同期し、処理待ちに {queued} 件の商品をキューしました{jobId}。", + "mapping.saveMappings": "マッピングを保存", + "mapping.syncProcessSample": "同期 + サンプル処理", "mapping.badgeCsv": "CSV", - "mapping.requiredAria": "必須フィールドのヘルプ", - "mapping.applySuggestions": "候補を適用 ({count})", - "mapping.confirmFuzzy": "ファジーを確認 ({count})", - "mapping.fuzzyNeedConfirm": "確認が必要なファジー一致 {count} 件", - "mapping.fuzzyNeedConfirmPlural": "確認が必要なファジー一致 {count} 件", - "mapping.fuzzyHelp": "信頼度の低い名前一致は自動適用されません。ここで確認するか、表の行ごとに受け入れてください。", - "mapping.missingRequiredTitle": "必須フィールドにはまだソースマッピングが必要です:", - "mapping.applyTip": "ヒント: 上の候補を適用してください — 多くの必須フィールドは一般的なソース名と一致します。", - "mapping.formatLabel": "形式:", - "mapping.itemPathLabel": "アイテムパス:", - "mapping.reExtract": "再抽出", - "mapping.manualRows": "手動行", - "mapping.schemaTable": "スキーマ表", - "mapping.addField": "フィールドを追加", - "mapping.noSchemaYet": "まだ抽出されたスキーマはありません。", - "mapping.orManualRows": "または下の手動行を使用します。", - "mapping.sourceField": "ソースフィールド", - "mapping.selectSource": "ソースを選択…", - "mapping.mapsTo": "マップ先", - "mapping.none": "なし", - "mapping.backToItem": "← アイテム選択に戻る", - "mapping.unsaved": "未保存の変更", - "mapping.requiredFieldsColon": "必須フィールド:", - "mapping.sampleOptions": "サンプルオプション", - "mapping.sampleSize": "サンプルサイズ", - "mapping.noExactAlias": "適用できる完全一致/エイリアス候補はありません。下のファジー一致を確認してください。", - "mapping.noSuggestionsExtract": "候補がありません — 先にスキーマを抽出してください。", - "mapping.schemaExtracted": "スキーマを抽出しました: サンプル行 {rows} 件からフィールド {fields} 件。", - "mapping.saved": "フィールドマッピングを保存しました{version}。", + "mapping.requiredAria": "必須フィールドのヘルプ", + "mapping.applySuggestions": "候補を適用 ({count})", + "mapping.confirmFuzzy": "ファジーを確認 ({count})", + "mapping.fuzzyNeedConfirm": "確認が必要なファジー一致 {count} ä»¶", + "mapping.fuzzyNeedConfirmPlural": "確認が必要なファジー一致 {count} ä»¶", + "mapping.fuzzyHelp": "信頼度の低い名前一致は自動適用されません。ここで確認するか、表の行ごとに受け入れてください。", + "mapping.missingRequiredTitle": "必須フィールドにはまだソースマッピングが必要です:", + "mapping.applyTip": "ヒント: 上の候補を適用してください — 多くの必須フィールドは一般的なソース名と一致します。", + "mapping.formatLabel": "形式:", + "mapping.itemPathLabel": "アイテムパス:", + "mapping.reExtract": "再抽出", + "mapping.manualRows": "手動行", + "mapping.schemaTable": "スキーマ表", + "mapping.addField": "フィールドを追加", + "mapping.noSchemaYet": "まだ抽出されたスキーマはありません。", + "mapping.orManualRows": "または下の手動行を使用します。", + "mapping.sourceField": "ソースフィールド", + "mapping.selectSource": "ソースを選択…", + "mapping.mapsTo": "マップ先", + "mapping.none": "なし", + "mapping.backToItem": "← アイテム選択に戻る", + "mapping.unsaved": "未保存の変更", + "mapping.requiredFieldsColon": "必須フィールド:", + "mapping.sampleOptions": "サンプルオプション", + "mapping.sampleSize": "サンプルサイズ", + "mapping.noExactAlias": "適用できる完全一致/エイリアス候補はありません。下のファジー一致を確認してください。", + "mapping.noSuggestionsExtract": "候補がありません — 先にスキーマを抽出してください。", + "mapping.schemaExtracted": "スキーマを抽出しました: サンプル行 {rows} 件からフィールド {fields} 件。", + "mapping.saved": "フィールドマッピングを保存しました{version}。", "mapping.savedVersion": " (v{version})", - "mapping.syncNoProducts": "同期が完了しました。処理する商品はありません。", - "mapping.jobSuffix": " (ジョブ {jobId})", - "mapping.appliedReplace": "{kind} マッピングを {count} 件適用しました。", - "mapping.appliedNew": "新しい {kind} マッピングを {count} 件適用しました(合計 {total})。", - "mapping.kindHighConfidence": "高信頼度", - "mapping.kindFuzzy": "ファジー", - "mapping.fuzzyConfirmFlash": "確認が必要なファジー一致 {count} 件 — 下の「ファジーを確認」または行ごとのチップを使ってください。", - "mapping.fuzzyConfirmFlashPlural": "確認が必要なファジー一致 {count} 件 — 下の「ファジーを確認」または行ごとのチップを使ってください。", - "mapping.formatHelp.title": "フィードの構成方法", - "mapping.formatHelp.required": "必須:", - "mapping.formatHelp.requiredBody": "{gtin} (EAN/UPC)、{title}(または {name})、{brand}", - "mapping.formatHelp.https": "リモートフィードには公開 HTTPS URL を使用してください(FTP や localhost は不可)。ローカルファイルには CSV アップロードが使えます。", - "mapping.formatHelp.specs": "仕様は「ラベル: 値」のペア(例: {ram})。寸法: {height}、{width}、{depth}、{mass}", - "mapping.formatHelp.also": "価格、在庫、画像、カテゴリ、保証、EPREL ID、HTML 説明、追加画像、動画 URL なども対応 — 完全なサンプルをダウンロードしてください。", - "mapping.formatHelp.downloadXml": "サンプル XML をダウンロード", - "mapping.formatHelp.downloadCsv": "サンプル CSV をダウンロード", - "mapping.formatHelp.xmlExample": "XML の例", - "mapping.formatHelp.csvExample": "CSV の例(ヘッダー + 行)", - "mapping.sourcePreview.title": "フィードソースのプレビュー", - "mapping.sourcePreview.truncated": "切り詰め", - "mapping.sourcePreview.refresh": "プレビューを更新", - "mapping.sourcePreview.copy": "プレビューをコピー", - "mapping.sourcePreview.loading": "フィードサンプルを読み込み中…", - "mapping.sourcePreview.errorHint": "商品要素のパスは手動でも入力できます。フィード URL に到達できるときにスキーマを抽出してください。", - "mapping.sourcePreview.retry": "再試行", - "mapping.sourcePreview.empty": "まだプレビューがありません", - "mapping.sourcePreview.emptyHintXml": "「スキーマを抽出」をクリックしてサンプルをダウンロードしフィールドを検出するか、アイテムパスを手動入力してください。", - "mapping.sourcePreview.emptyHintCsv": "「スキーマを抽出」をクリックしてサンプルをダウンロードしフィールドを検出してください。", - "mapping.sourcePreview.selectPath": "パスを選択: {path}", - "mapping.sourcePreview.clickTag": "タグ行をクリックして商品要素のパスを設定します。", - "mapping.table.search": "フィールドを検索…", - "mapping.table.all": "すべてのフィールド", - "mapping.table.mapped": "マップ済み", - "mapping.table.unmapped": "未マップ", - "mapping.table.fieldName": "フィールド名", - "mapping.table.sourcePath": "ソースパス", - "mapping.table.sampleValues": "サンプル値", - "mapping.table.type": "タイプ", - "mapping.table.mapTo": "マップ先", - "mapping.table.emptySchema": "フィードスキーマを抽出してソースフィールドを埋めるか、手動でマッピングを追加してください。", - "mapping.table.noMatch": "条件に一致するフィールドはありません。", - "mapping.table.unique": "一意 {count}", - "mapping.table.nested": "ネスト", - "mapping.table.apply": "適用", - "mapping.table.confirm": "確認", - "mapping.table.suggestedMatch": "候補の一致 {confidence}", - "mapping.table.confirmFuzzyMatch": "ファジー一致を確認 ({percent}%)", - "mapping.preview.title": "マッピングプレビュー", - "mapping.preview.subtitle": "現在のフィールドマッピングに基づくサンプル商品の形", - "mapping.preview.usingSamples": "· 抽出したサンプルを使用", - "mapping.preview.formatCsv": "形式: csv", - "mapping.preview.item": "アイテム: {path}", - "mapping.preview.sourceFields": "· ソースフィールド {count}", - "mapping.preview.empty": "まだフィールドがマップされていません", - "mapping.preview.emptyHint": "ソース列または XPath ノードを商品フィールドにマップすると、ここにサンプル商品のプレビューが表示されます。", - "mapping.preview.rawSample": "生のサンプル断片", - "imports.title": "アップロード", - "imports.description": "このワークスペースに保存されたCSVインポート — 商品・カテゴリ・属性。", - "imports.importProducts": "商品をインポート", - "imports.emptyTitle": "アップロードはまだありません", - "imports.emptyMessage": "商品・カテゴリ・属性のCSVインポートはアップロード後にここに表示されます。", - "imports.goProducts": "商品へ", - "imports.categories": "カテゴリ", - "imports.recent": "最近のアップロード", - "imports.fileCount": "{count} ファイル", - "imports.fileCountPlural": "{count} ファイル", - "imports.col.fileName": "ファイル名", - "imports.col.kind": "種類", - "imports.col.uploaded": "アップロード済み", - "imports.col.size": "サイズ", - "imports.actions": "アップロード操作", - "imports.loadFailed": "アップロードの読み込みに失敗しました", - "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", + "mapping.syncNoProducts": "同期が完了しました。処理する商品はありません。", + "mapping.jobSuffix": " (ジョブ {jobId})", + "mapping.appliedReplace": "{kind} マッピングを {count} 件適用しました。", + "mapping.appliedNew": "新しい {kind} マッピングを {count} 件適用しました(合計 {total})。", + "mapping.kindHighConfidence": "高信頼度", + "mapping.kindFuzzy": "ファジー", + "mapping.fuzzyConfirmFlash": "確認が必要なファジー一致 {count} ä»¶ — 下の「ファジーを確認」または行ごとのチップを使ってください。", + "mapping.fuzzyConfirmFlashPlural": "確認が必要なファジー一致 {count} ä»¶ — 下の「ファジーを確認」または行ごとのチップを使ってください。", + "mapping.formatHelp.title": "フィードの構成方法", + "mapping.formatHelp.required": "å¿…é ˆ:", + "mapping.formatHelp.requiredBody": "{gtin} (EAN/UPC)、{title}(または {name})、{brand}", + "mapping.formatHelp.https": "リモートフィードには公開 HTTPS URL を使用してください(FTP ã‚„ localhost は不可)。ローカルファイルには CSV アップロードが使えます。", + "mapping.formatHelp.specs": "仕様は「ラベル: 値」のペア(例: {ram})。寸法: {height}、{width}、{depth}、{mass}", + "mapping.formatHelp.also": "価格、在庫、画像、カテゴリ、保証、EPREL ID、HTML 説明、追加画像、動画 URL なども対応 — 完全なサンプルをダウンロードしてください。", + "mapping.formatHelp.downloadXml": "サンプル XML をダウンロード", + "mapping.formatHelp.downloadCsv": "サンプル CSV をダウンロード", + "mapping.formatHelp.xmlExample": "XML の例", + "mapping.formatHelp.csvExample": "CSV の例(ヘッダー + 行)", + "mapping.sourcePreview.title": "フィードソースのプレビュー", + "mapping.sourcePreview.truncated": "切り詰め", + "mapping.sourcePreview.refresh": "プレビューを更新", + "mapping.sourcePreview.copy": "プレビューをコピー", + "mapping.sourcePreview.loading": "フィードサンプルを読み込み中…", + "mapping.sourcePreview.errorHint": "商品要素のパスは手動でも入力できます。フィード URL に到達できるときにスキーマを抽出してください。", + "mapping.sourcePreview.retry": "再試行", + "mapping.sourcePreview.empty": "まだプレビューがありません", + "mapping.sourcePreview.emptyHintXml": "「スキーマを抽出」をクリックしてサンプルをダウンロードしフィールドを検出するか、アイテムパスを手動入力してください。", + "mapping.sourcePreview.emptyHintCsv": "「スキーマを抽出」をクリックしてサンプルをダウンロードしフィールドを検出してください。", + "mapping.sourcePreview.selectPath": "パスを選択: {path}", + "mapping.sourcePreview.clickTag": "タグ行をクリックして商品要素のパスを設定します。", + "mapping.table.search": "フィールドを検索…", + "mapping.table.all": "すべてのフィールド", + "mapping.table.mapped": "マップ済み", + "mapping.table.unmapped": "未マップ", + "mapping.table.fieldName": "フィールド名", + "mapping.table.sourcePath": "ソースパス", + "mapping.table.sampleValues": "サンプル値", + "mapping.table.type": "タイプ", + "mapping.table.mapTo": "マップ先", + "mapping.table.emptySchema": "フィードスキーマを抽出してソースフィールドを埋めるか、手動でマッピングを追加してください。", + "mapping.table.noMatch": "条件に一致するフィールドはありません。", + "mapping.table.unique": "一意 {count}", + "mapping.table.nested": "ネスト", + "mapping.table.apply": "適用", + "mapping.table.confirm": "確認", + "mapping.table.suggestedMatch": "候補の一致 {confidence}", + "mapping.table.confirmFuzzyMatch": "ファジー一致を確認 ({percent}%)", + "mapping.preview.title": "マッピングプレビュー", + "mapping.preview.subtitle": "現在のフィールドマッピングに基づくサンプル商品の形", + "mapping.preview.usingSamples": "· 抽出したサンプルを使用", + "mapping.preview.formatCsv": "形式: csv", + "mapping.preview.item": "アイテム: {path}", + "mapping.preview.sourceFields": "· ソースフィールド {count}", + "mapping.preview.empty": "まだフィールドがマップされていません", + "mapping.preview.emptyHint": "ソース列または XPath ノードを商品フィールドにマップすると、ここにサンプル商品のプレビューが表示されます。", + "mapping.preview.rawSample": "生のサンプル断片", + "imports.title": "アップロード", + "imports.description": "このワークスペースに保存されたCSVインポート — 商品・カテゴリ・属性。", + "imports.importProducts": "商品をインポート", + "imports.emptyTitle": "アップロードはまだありません", + "imports.emptyMessage": "商品・カテゴリ・属性のCSVインポートはアップロード後にここに表示されます。", + "imports.goProducts": "商品へ", + "imports.categories": "カテゴリ", + "imports.recent": "最近のアップロード", + "imports.fileCount": "{count} ファイル", + "imports.fileCountPlural": "{count} ファイル", + "imports.col.fileName": "ファイル名", + "imports.col.kind": "種類", + "imports.col.uploaded": "アップロード済み", + "imports.col.size": "サイズ", + "imports.actions": "アップロード操作", + "imports.loadFailed": "アップロードの読み込みに失敗しました", + "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", "imports.metadataOnlyBadge": "Metadata only (blob not migrated)", - "imports.deleteConfirm": "「{name}」を削除しますか?アップロード記録(およびローカルblobがあればそれも)が削除されます。", - "imports.deleted": "アップロードを削除しました。", - "imports.deleteFailed": "アップロードを削除できませんでした", - "imports.status.uploaded": "アップロード済み", - "reviews.redirectLoading": "WooCommerceレビューを開いています…", - "reviews.tab": "レビュー", - "reviews.syncTitle": "レビューインポート (ストア → Descrybe)", - "reviews.syncDesc": "受信インポート — WooCommerce商品レビューをDescrybeに取り込み、キャンペーンと評判に活用", - "reviews.syncQueued": "レビュー同期をキューに追加しました", - "reviews.statusBadge": "レビュー: {status}", - "reviews.syncedCount": "{count} 件同期済み", - "reviews.lastSync": "最終同期: {date}", - "reviews.noSyncYet": "レビュー同期はまだ完了していません。", - "reviews.needsReconnect": "移行後に認証情報を再接続するまでレビューインポートは実行できません。接続タブで保存してから接続をテストしてください。", - "reviews.queueImport": "レビューインポートをキュー (ストア → Descrybe)", - "reviews.queueing": "キューに追加中...", - "reviews.saveTestFirst": "同期前に認証情報を保存し接続をテストしてください", - "reviews.refreshList": "リストを更新", - "reviews.loading": "レビューを読み込み中…", - "reviews.emptyTitle": "レビューはまだありません", - "reviews.emptyMessage": "ストア接続後にレビュー同期をキューに入れます。リストが空でもこのタブは使えます。", - "reviews.col.product": "商品", - "reviews.col.reviewer": "レビューア", - "reviews.col.rating": "評価", - "reviews.col.review": "確認", - "reviews.queuedSuccess": "レビュー同期をキューに入れました。まもなく実行されます。", - "reviews.queueFailed": "レビュー同期をキューに入れられませんでした", - "campaigns.title": "キャンペーン", - "campaigns.description": "カタログから季節のメールキャンペーンを作成 — シーズンを選び、商品とオーディエンスを設定して生成します。", - "campaigns.new": "新しいキャンペーン", - "campaigns.loading": "読み込み中 キャンペーン…", - "campaigns.loadFailed": "読み込みに失敗 キャンペーン", - "campaigns.deleteConfirm": "キャンペーン「{name}」を削除しますか?この操作は元に戻せません。", - "campaigns.deleted": "キャンペーンを削除しました", - "campaigns.deleteFailed": "キャンペーンの削除に失敗しました", - "campaigns.partialUnavailable": "キャンペーンに現在十分にアクセスできません。サービス復旧まで生成と送信が失敗する可能性があります。", - "campaigns.searchPlaceholder": "検索 キャンペーン…", - "campaigns.unavailableTitle": "キャンペーン利用不可", - "campaigns.unavailableMessage": "キャンペーンサービスに現在接続できません。作成ウィザードは開けますが、生成と送信はサービス復旧まで待機します。", - "campaigns.openWizard": "作成ウィザードを開く", - "campaigns.backDashboard": "ダッシュボードに戻る", - "campaigns.browseProducts": "商品を閲覧", - "campaigns.emptyTitle": "まだキャンペーンがありません", - "campaigns.noMatches": "一致なし", - "campaigns.emptyMessage": "ブラックフライデー、クリスマス、またはカスタムキャンペーンを数ステップで作成 — 季節用の初期設定からすぐ始められます。", - "campaigns.noMatchesMessage": "別の名前、シーズン、またはステータスを試してください。", - "campaigns.create": "作成 キャンペーン", - "campaigns.col.season": "シーズン", - "campaigns.col.updated": "更新済み", - "campaigns.scheduled": "予定 {date}", - "campaigns.newTitle": "新しいキャンペーン", - "campaigns.newDesc": "シーズンを選び、商品とオーディエンスを選択し、プロンプトを書いてから生成・テスト・スケジュールします。", - "campaigns.editTitle": "編集 キャンペーン", - "campaigns.editDesc": "シーズン・商品・オーディエンスを更新し、再生成・テスト送信・スケジュールを行います。", - "campaignWizard.loading": "キャンペーンウィザードを読み込み中…", - "campaignWizard.apiMissing": "キャンペーンAPIは一時的に利用できません。ウィザードは閲覧できますが、保存/生成/送信には到達可能な /api/campaigns が必要です。", - "campaignWizard.upgradeTitle": "AIキャンペーンは有料機能です", - "campaignWizard.upgradeMessage": "Freeプランではシーズンとオーディエンスを準備できますが、AI生成にはStarter以上が必要です。アップグレードでAIメール下書きを解除。", - "campaignWizard.comparePlans": "プランを比較", - "campaignWizard.step.season": "シーズン", - "campaignWizard.step.catalog": "商品", - "campaignWizard.step.audience": "オーディエンス", - "campaignWizard.step.prompt": "プロンプト", - "campaignWizard.step.preview": "プレビュー", - "campaignWizard.step.send": "送信", - "campaignWizard.pickSeason": "シーズンを選択", - "campaignWizard.pickSeasonHelp": "テンプレートから開始 — 後ですべて編集できます。", - "campaignWizard.name": "キャンペーン名", - "campaignWizard.namePlaceholder": "ブラックフライデー 2026", - "campaignWizard.catalogTitle": "カテゴリと商品", - "campaignWizard.catalogHelp": "このメールで紹介する内容を選択。カテゴリだけでも素早く始められます。", - "campaignWizard.categories": "カテゴリ", - "campaignWizard.noCategories": "カテゴリがまだありません — カタログで追加してください。", - "campaignWizard.categoriesSelected": "{count} カテゴリを選択済み", - "campaignWizard.categoriesSelectedPlural": "{count} カテゴリを選択済み", - "campaignWizard.productsOptional": "商品(任意)", - "campaignWizard.selectedCount": "{count} 件選択", - "campaignWizard.searchProducts": "商品を検索…", - "campaignWizard.noProducts": "商品が見つかりません。", - "campaignWizard.audienceTitle": "誰が受け取りますか?", - "campaignWizard.audienceHelp": "既定は全員。注文が同期されていればカテゴリや過去購入者で絞り込めます。", - "campaignWizard.audience.all": "すべての連絡先", - "campaignWizard.audience.allHint": "リスト全体に送信(メールプロバイダ設定時)。", - "campaignWizard.audience.byCategory": "カテゴリ関心別", - "campaignWizard.audience.byCategoryHint": "選択したカテゴリに関連する人。", - "campaignWizard.audience.purchased": "カテゴリで購入済み", - "campaignWizard.audience.purchasedHint": "オーディエンスカテゴリの商品を購入した顧客(同期注文から)。", - "campaignWizard.audience.notPurchased": "未購入", - "campaignWizard.audience.notPurchasedHint": "それらのカテゴリを未購入の連絡先 — ウィンバックに最適。", - "campaignWizard.ordersHint": "購入済/未購入ターゲティングはWooCommerce注文の同期後に表示されます。", - "campaignWizard.audienceCategories": "オーディエンスカテゴリ", - "campaignWizard.promptTitle": "メールプロンプト", - "campaignWizard.promptHelp": "{season} 用のしっかりした既定を入れました。自由に編集するか、そのまま使えます。", - "campaignWizard.promptSeasonFallback": "今シーズン", - "campaignWizard.useDefaultPrompt": "既定のシーズナルプロンプトを使う", - "campaignWizard.promptLabel": "プロンプト", - "campaignWizard.advanced": "詳細オプション", - "campaignWizard.advancedHelp": "AI生成はブランドキット(設定時)と選択商品を使います。テンプレートのみのプレビューはAIをスキップしレイアウト見本になります。", - "campaignWizard.planFree": "無料", - "campaignWizard.planPaid": "有料", - "campaignWizard.planLine": "プラン:", - "campaignWizard.aiLocked": "— AI生成はロックされています。", - "campaignWizard.generateAi": "AIを生成", - "campaignWizard.templatePreview": "テンプレートプレビュー", - "campaignWizard.saveDraft": "下書きを保存", - "campaignWizard.previewTitle": "プレビュー", - "campaignWizard.status": "ステータス:", - "campaignWizard.generateToSee": "下書きを生成するとメール本文が表示されます。", - "campaignWizard.noPreview": "まだプレビューがありません。プロンプトに戻り、AI生成またはテンプレートプレビューを実行してください。", - "campaignWizard.backToPrompt": "プロンプトに戻る", - "campaignWizard.subject": "件名", - "campaignWizard.emailPreview": "メールプレビュー", - "campaignWizard.regenerateAi": "AIで再生成", - "campaignWizard.regenerate": "再生成", - "campaignWizard.continueSend": "送信へ進む", - "campaignWizard.testSend": "テスト送信", - "campaignWizard.testSendHelp": "スケジュール前に自分宛に1通送ってください。", - "campaignWizard.testEmail": "テストメール", + "imports.deleteConfirm": "「{name}」を削除しますか?アップロード記録(およびローカルblobがあればそれも)が削除されます。", + "imports.deleted": "アップロードを削除しました。", + "imports.deleteFailed": "アップロードを削除できませんでした", + "imports.status.uploaded": "アップロード済み", + "reviews.redirectLoading": "WooCommerceレビューを開いています…", + "reviews.tab": "レビュー", + "reviews.syncTitle": "レビューインポート (ストア → Descrybe)", + "reviews.syncDesc": "受信インポート — WooCommerce商品レビューをDescrybeに取り込み、キャンペーンと評判に活用", + "reviews.syncQueued": "レビュー同期をキューに追加しました", + "reviews.statusBadge": "レビュー: {status}", + "reviews.syncedCount": "{count} 件同期済み", + "reviews.lastSync": "最終同期: {date}", + "reviews.noSyncYet": "レビュー同期はまだ完了していません。", + "reviews.needsReconnect": "移行後に認証情報を再接続するまでレビューインポートは実行できません。接続タブで保存してから接続をテストしてください。", + "reviews.queueImport": "レビューインポートをキュー (ストア → Descrybe)", + "reviews.queueing": "キューに追加中...", + "reviews.saveTestFirst": "同期前に認証情報を保存し接続をテストしてください", + "reviews.refreshList": "リストを更新", + "reviews.loading": "レビューを読み込み中…", + "reviews.emptyTitle": "レビューはまだありません", + "reviews.emptyMessage": "ストア接続後にレビュー同期をキューに入れます。リストが空でもこのタブは使えます。", + "reviews.col.product": "商品", + "reviews.col.reviewer": "レビューア", + "reviews.col.rating": "評価", + "reviews.col.review": "確認", + "reviews.queuedSuccess": "レビュー同期をキューに入れました。まもなく実行されます。", + "reviews.queueFailed": "レビュー同期をキューに入れられませんでした", + "campaigns.title": "キャンペーン", + "campaigns.description": "カタログから季節のメールキャンペーンを作成 — シーズンを選び、商品とオーディエンスを設定して生成します。", + "campaigns.new": "新しいキャンペーン", + "campaigns.loading": "読み込み中 キャンペーン…", + "campaigns.loadFailed": "読み込みに失敗 キャンペーン", + "campaigns.deleteConfirm": "キャンペーン「{name}」を削除しますか?この操作は元に戻せません。", + "campaigns.deleted": "キャンペーンを削除しました", + "campaigns.deleteFailed": "キャンペーンの削除に失敗しました", + "campaigns.partialUnavailable": "キャンペーンに現在十分にアクセスできません。サービス復旧まで生成と送信が失敗する可能性があります。", + "campaigns.searchPlaceholder": "検索 キャンペーン…", + "campaigns.unavailableTitle": "キャンペーン利用不可", + "campaigns.unavailableMessage": "キャンペーンサービスに現在接続できません。作成ウィザードは開けますが、生成と送信はサービス復旧まで待機します。", + "campaigns.openWizard": "作成ウィザードを開く", + "campaigns.backDashboard": "ダッシュボードに戻る", + "campaigns.browseProducts": "商品を閲覧", + "campaigns.emptyTitle": "まだキャンペーンがありません", + "campaigns.noMatches": "一致なし", + "campaigns.emptyMessage": "ブラックフライデー、クリスマス、またはカスタムキャンペーンを数ステップで作成 — 季節用の初期設定からすぐ始められます。", + "campaigns.noMatchesMessage": "別の名前、シーズン、またはステータスを試してください。", + "campaigns.create": "作成 キャンペーン", + "campaigns.col.season": "シーズン", + "campaigns.col.updated": "更新済み", + "campaigns.scheduled": "予定 {date}", + "campaigns.newTitle": "新しいキャンペーン", + "campaigns.newDesc": "シーズンを選び、商品とオーディエンスを選択し、プロンプトを書いてから生成・テスト・スケジュールします。", + "campaigns.editTitle": "編集 キャンペーン", + "campaigns.editDesc": "シーズン・商品・オーディエンスを更新し、再生成・テスト送信・スケジュールを行います。", + "campaignWizard.loading": "キャンペーンウィザードを読み込み中…", + "campaignWizard.apiMissing": "キャンペーンAPIは一時的に利用できません。ウィザードは閲覧できますが、保存/生成/送信には到達可能な /api/campaigns が必要です。", + "campaignWizard.upgradeTitle": "AIキャンペーンは有料機能です", + "campaignWizard.upgradeMessage": "Freeプランではシーズンとオーディエンスを準備できますが、AI生成にはStarter以上が必要です。アップグレードでAIメール下書きを解除。", + "campaignWizard.comparePlans": "プランを比較", + "campaignWizard.step.season": "シーズン", + "campaignWizard.step.catalog": "商品", + "campaignWizard.step.audience": "オーディエンス", + "campaignWizard.step.prompt": "プロンプト", + "campaignWizard.step.preview": "プレビュー", + "campaignWizard.step.send": "送信", + "campaignWizard.pickSeason": "シーズンを選択", + "campaignWizard.pickSeasonHelp": "テンプレートから開始 — 後ですべて編集できます。", + "campaignWizard.name": "キャンペーン名", + "campaignWizard.namePlaceholder": "ブラックフライデー 2026", + "campaignWizard.catalogTitle": "カテゴリと商品", + "campaignWizard.catalogHelp": "このメールで紹介する内容を選択。カテゴリだけでも素早く始められます。", + "campaignWizard.categories": "カテゴリ", + "campaignWizard.noCategories": "カテゴリがまだありません — カタログで追加してください。", + "campaignWizard.categoriesSelected": "{count} カテゴリを選択済み", + "campaignWizard.categoriesSelectedPlural": "{count} カテゴリを選択済み", + "campaignWizard.productsOptional": "商品(任意)", + "campaignWizard.selectedCount": "{count} 件選択", + "campaignWizard.searchProducts": "商品を検索…", + "campaignWizard.noProducts": "商品が見つかりません。", + "campaignWizard.audienceTitle": "誰が受け取りますか?", + "campaignWizard.audienceHelp": "既定は全員。注文が同期されていればカテゴリや過去購入者で絞り込めます。", + "campaignWizard.audience.all": "すべての連絡先", + "campaignWizard.audience.allHint": "リスト全体に送信(メールプロバイダ設定時)。", + "campaignWizard.audience.byCategory": "カテゴリ関心別", + "campaignWizard.audience.byCategoryHint": "選択したカテゴリに関連する人。", + "campaignWizard.audience.purchased": "カテゴリで購入済み", + "campaignWizard.audience.purchasedHint": "オーディエンスカテゴリの商品を購入した顧客(同期注文から)。", + "campaignWizard.audience.notPurchased": "未購入", + "campaignWizard.audience.notPurchasedHint": "それらのカテゴリを未購入の連絡先 — ウィンバックに最適。", + "campaignWizard.ordersHint": "購入済/未購入ターゲティングはWooCommerce注文の同期後に表示されます。", + "campaignWizard.audienceCategories": "オーディエンスカテゴリ", + "campaignWizard.promptTitle": "メールプロンプト", + "campaignWizard.promptHelp": "{season} 用のしっかりした既定を入れました。自由に編集するか、そのまま使えます。", + "campaignWizard.promptSeasonFallback": "今シーズン", + "campaignWizard.useDefaultPrompt": "既定のシーズナルプロンプトを使う", + "campaignWizard.promptLabel": "プロンプト", + "campaignWizard.advanced": "詳細オプション", + "campaignWizard.advancedHelp": "AI生成はブランドキット(設定時)と選択商品を使います。テンプレートのみのプレビューはAIをスキップしレイアウト見本になります。", + "campaignWizard.planFree": "ç„¡æ–™", + "campaignWizard.planPaid": "有料", + "campaignWizard.planLine": "プラン:", + "campaignWizard.aiLocked": "— AI生成はロックされています。", + "campaignWizard.generateAi": "AIを生成", + "campaignWizard.templatePreview": "テンプレートプレビュー", + "campaignWizard.saveDraft": "下書きを保存", + "campaignWizard.previewTitle": "プレビュー", + "campaignWizard.status": "ステータス:", + "campaignWizard.generateToSee": "下書きを生成するとメール本文が表示されます。", + "campaignWizard.noPreview": "まだプレビューがありません。プロンプトに戻り、AI生成またはテンプレートプレビューを実行してください。", + "campaignWizard.backToPrompt": "プロンプトに戻る", + "campaignWizard.subject": "件名", + "campaignWizard.emailPreview": "メールプレビュー", + "campaignWizard.regenerateAi": "AIで再生成", + "campaignWizard.regenerate": "再生成", + "campaignWizard.continueSend": "送信へ進む", + "campaignWizard.testSend": "テスト送信", + "campaignWizard.testSendHelp": "スケジュール前に自分宛に1通送ってください。", + "campaignWizard.testEmail": "テストメール", "campaignWizard.testEmailPlaceholder": "you@company.com", - "campaignWizard.sendTest": "テスト送信", - "campaignWizard.scheduleTitle": "スケジュール", - "campaignWizard.scheduleHelp": "このキャンペーンの送信タイミングを選んでください。", - "campaignWizard.sendAt": "送信時刻", - "campaignWizard.schedule": "キャンペーンをスケジュール", - "campaignWizard.generateToContinue": "続行するには生成", - "campaignWizard.done": "完了", - "campaignWizard.loadFailed": "ウィザードの読み込みに失敗しました", - "campaignWizard.pickCatalog": "カテゴリまたは商品を少なくとも1つ選んでください", - "campaignWizard.pickAudienceCats": "このフィルター用のオーディエンスカテゴリを選んでください", - "campaignWizard.completeStep": "続行するにはこのステップを完了してください", - "campaignWizard.aiDraftReady": "AI下書きを生成しました", - "campaignWizard.templateReady": "テンプレートプレビューの準備完了", - "campaignWizard.unavailableSave": "キャンペーンは現在利用できません。機能が公開されるまで下書きは保存できません。", - "campaignWizard.generateFailed": "生成に失敗しました", - "campaignWizard.generateFirst": "先にプレビューを生成してください", - "campaignWizard.enterTestEmail": "テスト用メールアドレスを入力してください", - "campaignWizard.testFailed": "テスト送信に失敗しました", - "campaignWizard.pickSchedule": "日時を選択してください", - "campaignWizard.scheduled": "キャンペーンをスケジュールしました", - "campaignWizard.scheduleFailed": "スケジュールに失敗しました", - "campaignWizard.draftSaved": "下書きを保存しました", - "campaignWizard.unavailableShort": "キャンペーンは現在利用できません。", - "campaignWizard.saveFailed": "保存に失敗しました", - "marketing.calendarTitle": "コンテンツカレンダー", - "marketing.calendarDesc": "シーズナルキャンペーンを日付に紐づけ、ショッピング既定のエクスポートフィードを準備します。", - "marketing.loadFailed": "カレンダーの読み込みに失敗しました", - "marketing.prepared": "キャンペーンを準備しました", - "marketing.alreadyReady": "キャンペーンは既に準備済みです", - "marketing.exportFeedsHint": "{name} → エクスポートフィード", - "marketing.prepareFailed": "キャンペーンを準備できませんでした", - "marketing.requestFailed": "リクエストに失敗しました", - "marketing.emptyTitle": "季節プリセットはありません", - "marketing.emptyMessage": "マーケティングAPIが利用可能になると、カレンダープリセットがここに表示されます。", - "marketing.openCampaigns": "メールキャンペーンを開く", - "marketing.window": "期間:", - "marketing.linkedExport": "リンク済みエクスポート:", - "marketing.openPrepared": "準備済みフィードを開く", - "marketing.preparing": "準備中…", - "marketing.prepareNamed": "{name} キャンペーンを準備", - "marketing.footer": "メールキャンペーンは {link} — このページはカタログのエクスポートフィードの準備のみです。", - "common.done": "完了", - "common.copied": "クリップボードにコピーしました。", - "common.copyFailed": "コピーできませんでした。テキストを選択して手動でコピーしてください。", - "common.submitting": "送信中…", - "common.sending": "送信中…", - "settings.companyAdminOnlyView": "会社設定を変更できるのは会社管理者のみです。現在のワークスペース詳細は閲覧できます。", - "settings.activeCompanyHelp": "カタログ・フィード・請求・APIキー用のワークスペース。ここまたはヘッダーからいつでも切り替えられます。", - "settings.noCompanySelected": "会社が選択されていません", - "settings.creditsOverviewHelp": "アクティブな会社のAIクレジット残高。詳細な使用量は請求にあります。", - "settings.billingLabel": "請求", - "settings.remainingLabel": "残り", - "settings.creditsUnavailable": "このワークスペースではクレジット残高はまだ利用できません。", - "settings.openBilling": "使用量と請求を開く", - "settings.companyNameHelp": "この名前は招待と組織設定に表示されます", - "settings.contentSettingsHelp": "生成コンテンツの言語と商品マッチングを設定", - "settings.mergeProductsHelp": "有効時、CSVインポートは同じGTINの行を1商品に結合します。各行を独立させるにはオフにしてください。", - "settings.emailIntegrationHelp": "招待・キャンペーン・トランザクションメール用に Resend または SMTP を設定します。", - "settings.configureEmail": "メールを設定", - "settings.aiIntegrationsHelp": "プラットフォームクレジットまたは独自キーに加え、タイトル・説明・SEO・キャンペーン用の編集可能なプロンプト。キーは保存時に暗号化。", - "settings.openAiIntegrations": "AI連携を開く", - "settings.companyNameRequired": "会社名を入力してください。", - "settings.companySaved": "会社設定を保存しました。", - "settings.companyUpdateFailed": "会社を更新できませんでした", - "settings.mergeOn": "同じGTINの商品はフィード間でマージされます。", - "settings.mergeOff": "同じGTINの商品は別々のままです。", - "settings.mergeUpdateFailed": "マージ設定を更新できませんでした", - "settings.inAppToastsHelp": "このブラウザのみに保存。失敗はデフォルトでオン、完了はノイズ軽減のためミュート。フォームフィードバックと元に戻すはミュートされません。", - "settings.emailAlertsHelp": "メールアラート設定は近日公開。失敗アラートはデフォルトオン(アプリ内と同様)。完了メールはオプトインしない限りオフです。", - "settings.emailAlertsBody": "当面は会社 → メール連携でトランザクションメールを設定してください。上記のアプリ内アラートは引き続き適用されます。", - "settings.apiKeysLegacyNotice": "レガシーAPIキーは移行されていません。新しいキーを作成してアクセスを復元 — シークレットは一度だけ表示されます。", - "settings.apiKeysAdminOnly": "APIキーの作成・取り消しは会社の管理者のみ。既存のキー接頭辞は閲覧できます。", - "settings.apiKeysCopyUnavailableNotice": "既存キーはコピー不可 — 接頭辞のみ保存。新規キーでシークレットを一度コピーし、必要なら古いキーを取り消してください。", - "settings.apiKeysForbidden": "APIキーを表示する権限がありません。会社の管理者に依頼してください。", - "settings.noApiKeys": "APIキーはまだありません", - "settings.noApiKeysHelpAdmin": "レガシーAPIキーは移行されていません。Descrybe API(X-API-Key)用に新しいキーを作成してください。完全なシークレットは一度だけ表示されます。", - "settings.noApiKeysHelpMember": "この会社にはまだAPIキーがありません。レガシーキーは移行されていません — 管理者に作成を依頼してください。", - "settings.unnamedKey": "無名キー", - "settings.neverUsed": "未使用", - "settings.apiKeyActions": "APIキー操作", - "settings.copyUnavailable": "コピー不可", - "settings.copyUnavailableTitle": "完全なシークレットはキー作成時に一度だけ表示されます", - "settings.revoke": "取り消す", - "settings.apiKeyNameRequired": "このAPIキーの名前を入力してください。", - "settings.apiKeyCreatedOnce": "APIキーを作成しました。今すぐコピー — 再表示されません。", - "settings.apiKeyCreated": "APIキーを作成しました。", - "settings.apiKeyCreateFailed": "APIキーを作成できませんでした", - "settings.apiKeyRevokeConfirm": "このAPIキーを取り消しますか?これを使うリクエストは動作しなくなります。", - "settings.apiKeyRevoked": "APIキーを取り消しました。", - "settings.apiKeyRevokeFailed": "APIキーを取り消せませんでした", - "settings.apiKeyCopied": "APIキーをコピーしました。", - "settings.createApiKeyOnceHelp": "このキーを今すぐコピーしてください — 再表示されません。/api/v1 では Authorization: Bearer または X-API-Key として使用します。", - "settings.createApiKeyNameHelp": "後で区別できるようキーに名前を付けてください。作成後は Authorization: Bearer(推奨)または X-API-Key として送信します。", - "settings.keyNamePlaceholder": "例: Production", - "settings.newApiKeyAria": "新規APIキー(一度だけ表示)", - "settings.copyApiKeyAria": "APIキーをコピー", - "settings.alert.sync_fail.title": "同期失敗", - "settings.alert.sync_fail.description": "フィード同期がタイムアウトするか、APIがエラーを返したとき。", - "settings.alert.sync_done.title": "同期完了", - "settings.alert.sync_done.description": "フィード同期が正常に完了したとき。", - "settings.alert.ai_fail.title": "AI / 処理の失敗", - "settings.alert.ai_fail.description": "処理ジョブの開始または実行に失敗したとき。", - "settings.alert.ai_done.title": "AI / 処理完了", - "settings.alert.ai_done.description": "バックグラウンド処理ジョブが正常完了したとき。ジョブ開始トーストは常時オンで、元に戻すが使えます。", - "settings.alert.export_fail.title": "エクスポート失敗", - "settings.alert.export_fail.description": "商品またはエクスポートフィードのエクスポートに失敗したとき。", - "settings.alert.export_done.title": "エクスポート完了", - "settings.alert.export_done.description": "エクスポートが正常に完了したとき。", - "settings.alert.support_reply.title": "サポートスタッフの返信", - "settings.alert.support_reply.description": "プラットフォームの担当者がサポートチケットに返信したとき。", - "settings.alert.support_status.title": "サポートステータスの変更", - "settings.alert.support_status.description": "サポートチケットが保留または解決に移ったとき。", - "empty.forbidden.title.company": "権限がありません", - "empty.forbidden.title.platform": "アクセス制限", - "empty.forbidden.message.company": "この操作の権限がありません。会社の管理者に依頼してください。", - "empty.forbidden.message.platform": "この領域はプラットフォーム管理者のみ利用できます。", - "empty.forbidden.message.support": "この領域はサポート担当とプラットフォーム管理者のみ利用できます。", - "empty.forbidden.backDashboard": "ダッシュボードに戻る", - "empty.forbidden.apiKeys": "APIキーを表示する権限がありません。会社の管理者に依頼してください。", - "empty.forbidden.ai": "AIプロバイダー設定を表示する権限がありません。会社の管理者に依頼してください。", - "empty.forbidden.email": "メールプロバイダー設定を表示する権限がありません。会社の管理者に依頼してください。", - "confirm.defaultTitle": "削除の確認", - "confirm.defaultDescription": "よろしいですか?", - "confirm.defaultConfirm": "確認", - "confirm.deleteFeed": "フィード「{name}」を削除しますか?この操作は取り消せません。", - "confirm.deleteCampaign": "キャンペーン「{name}」を削除しますか?この操作は元に戻せません。", - "confirm.deleteExportFeed": "このエクスポートフィードを削除しますか?", - "confirm.rotateExportToken": "フィードURLトークンをローテーションしますか?古い公開URLは直ちに無効になります。", - "confirm.deleteUpload": "「{name}」を削除しますか?アップロード記録(およびローカルblobがあればそれも)が削除されます。", - "confirm.revokeApiKey": "このAPIキーを取り消しますか?これを使うリクエストは動作しなくなります。", - "confirm.deleteKnowledgeArticle": "このナレッジ記事を削除しますか?", - "confirm.deleteReplyTemplate": "この返信テンプレートを削除しますか?", - "confirm.deleteStructuredField": "このフィールドを削除してもよろしいですか?この操作は元に戻せません。", - "toast.campaign.pickAudience": "カテゴリまたは商品を少なくとも1つ選んでください", - "toast.campaign.pickCategories": "このフィルター用のオーディエンスカテゴリを選んでください", - "toast.campaign.completeStep": "続行するにはこのステップを完了してください", - "toast.campaign.aiDraft": "AI下書きを生成しました", - "toast.campaign.templatePreview": "テンプレートプレビューの準備完了", - "toast.campaign.generateFirst": "先にプレビューを生成してください", - "toast.campaign.testSent": "{email} にテストメールを送信しました", - "toast.campaign.scheduled": "キャンペーンをスケジュールしました", - "toast.campaign.draftSaved": "下書きを保存しました", - "toast.campaign.deleted": "キャンペーンを削除しました", - "toast.campaign.prepared": "キャンペーンを準備しました", - "toast.campaign.alreadyReady": "キャンペーンは既に準備済みです", - "toast.campaign.prepareFailed": "キャンペーンを準備できませんでした", - "toast.campaign.deleteFailed": "キャンペーンの削除に失敗しました", - "toast.feed.copyFailed": "URLをコピーできませんでした", - "toast.feed.created": "Feedを作成しました", - "toast.feed.updated": "Feedを更新しました。", - "toast.feed.mapBeforeSync": "このフィードを同期する前にフィールドをマップしてください。", - "toast.feed.activateBeforeSync": "同期する前にフィードを有効化してください。", - "toast.feed.syncFinished": "同期が完了しました", - "toast.feed.deleted": "Feedを削除しました。", - "toast.feed.mappingLoadFailed": "フィールドマッピングを読み込めませんでした。同期前にマッピングを開いて修正してください。", - "toast.feed.syncFailed": "同期に失敗しました", - "toast.feed.statusFailed": "ステータスを更新できませんでした", - "toast.feed.deleteFailed": "フィードを削除できませんでした", - "toast.feed.beforeSampling": "サンプリング前", - "toast.processing.jobCompleted": "処理が完了しました", - "toast.processing.jobFailed": "処理に失敗しました", - "toast.products.startFailed": "処理を開始できませんでした", - "toast.products.jobStarted": "処理ジョブを開始しました", - "toast.products.acceptUndone": "承認を取り消しました", - "toast.products.resetComplete": "リセット完了", - "toast.products.nameAcceptUndone": "名前の承認を取り消しました", - "toast.products.descAcceptUndone": "説明の承認を取り消しました", - "toast.products.cancelOne": "処理をキャンセルしました", - "toast.products.cancelMany": "処理ジョブをキャンセルしました", - "toast.products.startJobFailed": "処理ジョブを開始できませんでした", - "toast.products.acceptFailed": "エンリッチメントを承認できませんでした", - "toast.products.updateFailed": "商品を更新できませんでした", - "toast.products.undoAcceptFailed": "承認の取り消しに失敗しました", - "toast.products.undoFieldAcceptFailed": "フィールド承認の取り消しに失敗しました", - "toast.products.undoFieldDiscardFailed": "フィールド破棄の取り消しに失敗しました", - "toast.products.rejectFailed": "エンリッチメントを拒否できませんでした", - "toast.products.exportFailed": "選択した商品をエクスポートできませんでした", - "toast.products.resetFailed": "商品をリセットできませんでした", - "toast.products.cancelFailed": "処理ジョブをキャンセルできませんでした", - "toast.support.ticketCreated": "チケットを作成しました", - "toast.support.replySent": "返信を送信しました", - "toast.support.thanksFeedback": "フィードバックありがとうございます", - "toast.support.createFailed": "チケットを作成できませんでした", - "toast.support.unavailable": "サポート利用不可", - "toast.support.loadFailed": "サポートチケットの読み込みに失敗しました", - "toast.support.loadTicketFailed": "チケットの読み込みに失敗しました", - "toast.support.replyFailed": "返信を送信できませんでした", - "toast.support.ratingUnavailable": "評価は利用できません", - "toast.support.alreadyRated": "評価済み", - "toast.support.ratingFailed": "評価を送信できませんでした", - "toast.structured.fieldAdded": "フィールドを追加しました", - "toast.structured.fieldAddedBody": "構造化説明フィールドを追加しました。", - "toast.structured.fieldDeleted": "フィールドを削除しました", - "toast.structured.fieldDeletedBody": "構造化説明フィールドを削除しました。", - "toast.structured.addFailed": "フィールドの追加に失敗しました", - "toast.structured.deleteFailed": "フィールドの削除に失敗しました", - "toast.brand.saved": "ブランドキットを保存しました", - "toast.brand.logoUploaded": "ロゴをアップロードしました", - "toast.brand.saveFailed": "ブランドキットの保存に失敗しました", - "toast.brand.uploadFailed": "ロゴのアップロードに失敗しました", - "toast.vector.indexCreated": "ベクトルインデックスを作成しました", - "toast.vector.dbInitialized": "ベクトルデータベースを初期化しました", - "toast.vector.indexFailed": "ベクトルインデックスの作成に失敗しました", - "toast.vector.initFailed": "ベクトルデータベースの初期化に失敗しました", - "toast.vector.searchFailed": "カテゴリの検索に失敗しました", - "toast.export.refreshFailed": "フィードの更新に失敗しました", - "toast.mapping.loadFailed": "フィードマッピングの読み込みに失敗しました", - "toast.mapping.extractFailed": "スキーマの抽出に失敗しました", - "toast.mapping.saveFailed": "フィールドマッピングの保存に失敗しました", - "toast.mapping.sampleFailed": "サンプルの同期+処理に失敗しました", - "toast.attrs.createFailed": "作成に失敗しました", - "toast.attrs.importFailed": "インポートに失敗しました", - "toast.attrs.updateFailed": "更新に失敗しました", - "toast.attrs.deleteFailed": "削除に失敗しました", - "toast.switcher.loadUsersFailed": "切り替え可能なユーザーを読み込めませんでした", - "toast.switcher.switchFailed": "ユーザーを切り替えられませんでした", - "toast.switcher.returnFailed": "元のユーザーに戻れませんでした", - "toast.switcher.companyFailed": "会社を切り替えられませんでした", - "toast.requestFailed": "リクエストに失敗しました", - "flash.campaign.unavailableDraft": "キャンペーンは現在利用できません。機能が公開されるまで下書きは保存できません。", - "flash.campaign.testEmailRequired": "テスト用メールアドレスを入力してください", - "flash.campaign.scheduleRequired": "日時を選択してください", - "flash.campaign.unavailable": "キャンペーンは現在利用できません。", - "flash.campaign.generateFailed": "生成に失敗しました", - "flash.campaign.testFailed": "テスト送信に失敗しました", - "flash.campaign.scheduleFailed": "スケジュールに失敗しました", - "flash.campaign.saveFailed": "保存に失敗しました", - "flash.feed.copyFailed": "URLをコピーできませんでした", - "flash.feed.csvRequired": ".csvファイルを選択してください。", - "flash.feed.csvFileRequired": "CSVファイルを選択してください。", - "flash.feed.urlRequired": "フィードURLは必須です。", - "flash.feed.updated": "Feedを更新しました。", - "flash.feed.syncFinishedNamed": "\"{name}\" の同期が完了しました({status}: {products})。", - "flash.feed.deleted": "Feedを削除しました。", - "flash.feed.createFailed": "フィードを作成できませんでした", - "flash.feed.updateFailed": "フィードを更新できませんでした", - "flash.settings.companyNameRequired": "会社名を入力してください。", - "flash.settings.companySaved": "会社設定を保存しました。", - "flash.settings.companyFailed": "会社を更新できませんでした", - "flash.settings.mergeFailed": "マージ設定を更新できませんでした", - "flash.settings.apiKeyNameRequired": "このAPIキーの名前を入力してください。", - "flash.settings.apiKeyCreatedFailed": "APIキーを作成できませんでした", - "flash.settings.apiKeyRevoked": "APIキーを取り消しました。", - "flash.settings.apiKeyRevokeFailed": "APIキーを取り消せませんでした", - "flash.settings.copyFailed": "コピーできませんでした。テキストを選択して手動でコピーしてください。", - "flash.products.accepted": "{count} 件の商品を承認 — 処理済みに移動しました。", - "flash.products.updated": "商品を更新しました。", - "flash.products.enrichmentAccepted": "エンリッチメントを承認 — 処理済みに移動しました。", - "flash.products.originalEmpty": "元の値が空のため、PATCHではエンリッチメントをクリアできません。", - "flash.products.selectExport": "エクスポートする商品を少なくとも1つ選択してください。", - "flash.products.exported": "エクスポートフィード経由で {count} 件の商品をエクスポートしました。", - "flash.support.missingId": "チケットIDがありません", - "flash.support.notFound": "チケットが見つかりません", - "flash.support.unavailable": "サポートは一時的に利用できません。", - "flash.support.ratingUnavailable": "評価は一時的に利用できません。後でもう一度お試しください。", - "flash.support.alreadyRated": "このチケットは既に評価済みです。", - "flash.support.queueUnavailable": "このデプロイではサポートキューを利用できません。", - "flash.support.deploymentUnavailable": "このデプロイではサポートを利用できません。", - "flash.support.replyRequired": "返信本文は必須です。", - "flash.support.draftRequired": "承認前に下書き本文が必要です。", - "flash.support.claimed": "チケットを引き受けました。", - "flash.support.unassigned": "チケットの担当を解除しました。", - "flash.support.assigneeCleared": "担当者をクリアしました。", - "flash.support.assigneeUpdated": "担当者を更新しました。", - "flash.support.draftApproved": "AI下書きを承認し、顧客に送信しました。", - "flash.support.draftSent": "下書きをスタッフ返信として送信しました。", - "flash.support.draftDiscarded": "AI下書きを破棄しました。チケットを有人キューに渡しました。", - "flash.support.autoReplyDisabled": "自動返信を無効化しました(下書きは内部メモのまま)。", - "flash.structured.keyRequired": "フィールドキーは必須です", - "flash.category.nameRequired": "名前と一意のIDは必須です。", - "flash.category.textEmpty": "テキストは空にできません", - "flash.export.noConfigs": "エクスポートフィードはまだありません。エクスポートフィードで作成してから、選択した商品のエクスポートに戻ってください。", - "flash.export.selectFormat": "エクスポートフィードを選択してください。", - "flash.files.deleted": "アップロードを削除しました。", - "flash.mapping.noSuggestions": "候補がありません — ソースフィールド名を確認してください。", - "flash.mapping.allMapped": "候補はすべてマッピング済みです。テーブルの信頼度チップを確認してください。", - "flash.mapping.extractFirst": "候補がありません — 先にスキーマを抽出してください。", - "flash.mapping.pathRequired": "フィールドをマッピングする前に商品要素パスを入力してください。", - "flash.billing.checkoutCanceled": "Checkoutはキャンセルされました。変更はありません。", - "flash.billing.portalReturn": "請求ポータルから戻りました。プランはここか Plans で管理できます。", - "flash.billing.invalidAmount": "有効なクレジット数を入力してください。", - "flash.billing.companyNotFound": "会社が見つかりません。", - "flash.billing.creditsAdded": "{amount} クレジットを追加しました。", - "flash.unsubscribe.missingToken": "配信停止トークンがありません。", - "flash.unsubscribe.loadFailed": "配信停止ステータスを読み込めませんでした。", - "flash.unsubscribe.failed": "配信停止に失敗しました。", - "flash.seo.filledMeta": "「{label}」のメタを入力しました({mode})。", - "flash.shopify.saved": "Shopify設定を保存しました。", - "flash.woo.saved": "WooCommerce設定を保存しました。", - "flash.woo.syncSaved": "同期設定を保存しました。", - "flash.woo.autoCategories": "{count} 件のカテゴリを自動マッピングしました。", - "flash.woo.autoAttributes": "{count} 件の属性を自動マッピングしました。", - "flash.ai.promptsSaved": "プロンプトテンプレートを保存しました。次のAI実行に適用されます。", - "flash.ai.promptRestored": "組み込みのデフォルトプロンプトを復元しました。", - "flash.ai.connectionOk": "接続OK({detail})。", - "flash.ai.connectionByok": "、独自キー", - "flash.email.saved": "メールプロバイダーを保存しました。ドメインを確認してからテスト送信してください。", - "flash.email.testDryRun": "ドライランでテストを記録しました — メールは送信されていません。", - "flash.email.testSent": "テストメールを送信しました。配信に成功すると差出人アドレスが検証済みになります。", - "flash.fields.apiUnavailable": "標準フィールドAPIは利用できません。変更を保存できません。", - "flash.fields.updated": "フィールドを更新しました", - "flash.fields.created": "フィールドを作成しました", - "flash.fields.enabledRecommended": "推奨のECフィールドを有効化しました", - "flash.fields.deleted": "フィールドを削除しました", - "flash.fields.groupUpdated": "グループを更新しました", - "flash.fields.groupCreated": "グループを作成しました", - "flash.fields.groupDeleted": "グループを削除しました", - "flash.processing.cancelled": "「{name}」をキャンセルしました。", - "flash.processing.retried": "「{name}」を再試行キューに入れました。", - "flash.admin.staffRoleUpdated": "{email} のスタッフロールを更新しました。", - "flash.admin.staffRoleUnavailable": "このサーバーではスタッフロールの更新はまだ利用できません。", - "flash.admin.catalogCloned": "{source} を {dest} にコピーしました: 商品 {products}、カテゴリ {categories}。", - "flash.admin.fixA1Success": "{name} のカタログ修復が完了: プロンプト {prompts} 件更新、ハッシュ {hashes} 件消去、カテゴリ {categories} 件補完。", - "flash.admin.fixA1Error": "{name} のカタログ修復に失敗しました。", - "flash.admin.planAssigned": "{name} にプランを割り当てました。", - "flash.admin.planAssignedShort": "プランを割り当てました。", - "flash.admin.creditsUpdated": "クレジットを更新しました。", - "flash.admin.cyclesProcessed": "処理した請求サイクル: {count}", - "flash.admin.invitesSummary": "パスワード設定招待: {parts}。メール配信: {smtp}。", - "flash.admin.smtpOn": "オン", - "flash.admin.smtpOff": "オフ", - "flash.admin.localPasswordSet": "{email} のローカルパスワードを設定しました。", - "flash.admin.localPasswordUnavailable": "この環境ではローカルパスワードツールを利用できません。", - "flash.admin.switchedUser": "ユーザーを切り替えました。再読み込み中…", - "flash.admin.switchUnavailable": "この環境ではユーザー切り替えを利用できません。", - "flash.admin.diagnosticsRateLimit": "診断のレート制限に達しました(20/分)。1分待って更新してください。", - "flash.admin.smtpSaved": "プラットフォームSMTP設定を保存しました。パスワードは非表示のままです。", - "flash.admin.integrationSaved": "連携設定を保存しました。シークレット欄が再度すべて表示されることはありません。", - "flash.admin.aiSaved": "{label} のAI設定を保存しました。APIキーは二度と表示されません。", - "flash.admin.cleanup": "クリーンアップ: {jobs} 件のジョブ失敗、{products} 件の商品をリセット。", - "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", + "campaignWizard.sendTest": "テスト送信", + "campaignWizard.scheduleTitle": "スケジュール", + "campaignWizard.scheduleHelp": "このキャンペーンの送信タイミングを選んでください。", + "campaignWizard.sendAt": "送信時刻", + "campaignWizard.schedule": "キャンペーンをスケジュール", + "campaignWizard.generateToContinue": "続行するには生成", + "campaignWizard.done": "完了", + "campaignWizard.loadFailed": "ウィザードの読み込みに失敗しました", + "campaignWizard.pickCatalog": "カテゴリまたは商品を少なくとも1つ選んでください", + "campaignWizard.pickAudienceCats": "このフィルター用のオーディエンスカテゴリを選んでください", + "campaignWizard.completeStep": "続行するにはこのステップを完了してください", + "campaignWizard.aiDraftReady": "AI下書きを生成しました", + "campaignWizard.templateReady": "テンプレートプレビューの準備完了", + "campaignWizard.unavailableSave": "キャンペーンは現在利用できません。機能が公開されるまで下書きは保存できません。", + "campaignWizard.generateFailed": "生成に失敗しました", + "campaignWizard.generateFirst": "先にプレビューを生成してください", + "campaignWizard.enterTestEmail": "テスト用メールアドレスを入力してください", + "campaignWizard.testFailed": "テスト送信に失敗しました", + "campaignWizard.pickSchedule": "日時を選択してください", + "campaignWizard.scheduled": "キャンペーンをスケジュールしました", + "campaignWizard.scheduleFailed": "スケジュールに失敗しました", + "campaignWizard.draftSaved": "下書きを保存しました", + "campaignWizard.unavailableShort": "キャンペーンは現在利用できません。", + "campaignWizard.saveFailed": "保存に失敗しました", + "marketing.calendarTitle": "コンテンツカレンダー", + "marketing.calendarDesc": "シーズナルキャンペーンを日付に紐づけ、ショッピング既定のエクスポートフィードを準備します。", + "marketing.loadFailed": "カレンダーの読み込みに失敗しました", + "marketing.prepared": "キャンペーンを準備しました", + "marketing.alreadyReady": "キャンペーンは既に準備済みです", + "marketing.exportFeedsHint": "{name} → エクスポートフィード", + "marketing.prepareFailed": "キャンペーンを準備できませんでした", + "marketing.requestFailed": "リクエストに失敗しました", + "marketing.emptyTitle": "季節プリセットはありません", + "marketing.emptyMessage": "マーケティングAPIが利用可能になると、カレンダープリセットがここに表示されます。", + "marketing.openCampaigns": "メールキャンペーンを開く", + "marketing.window": "期間:", + "marketing.linkedExport": "リンク済みエクスポート:", + "marketing.openPrepared": "準備済みフィードを開く", + "marketing.preparing": "準備中…", + "marketing.prepareNamed": "{name} キャンペーンを準備", + "marketing.footer": "メールキャンペーンは {link} — このページはカタログのエクスポートフィードの準備のみです。", + "common.done": "完了", + "common.copied": "クリップボードにコピーしました。", + "common.copyFailed": "コピーできませんでした。テキストを選択して手動でコピーしてください。", + "common.submitting": "送信中…", + "common.sending": "送信中…", + "settings.companyAdminOnlyView": "会社設定を変更できるのは会社管理者のみです。現在のワークスペース詳細は閲覧できます。", + "settings.activeCompanyHelp": "カタログ・フィード・請求・APIキー用のワークスペース。ここまたはヘッダーからいつでも切り替えられます。", + "settings.noCompanySelected": "会社が選択されていません", + "settings.creditsOverviewHelp": "アクティブな会社のAIクレジット残高。詳細な使用量は請求にあります。", + "settings.billingLabel": "請求", + "settings.remainingLabel": "残り", + "settings.creditsUnavailable": "このワークスペースではクレジット残高はまだ利用できません。", + "settings.openBilling": "使用量と請求を開く", + "settings.companyNameHelp": "この名前は招待と組織設定に表示されます", + "settings.contentSettingsHelp": "生成コンテンツの言語と商品マッチングを設定", + "settings.mergeProductsHelp": "有効時、CSVインポートは同じGTINの行を1商品に結合します。各行を独立させるにはオフにしてください。", + "settings.emailIntegrationHelp": "招待・キャンペーン・トランザクションメール用に Resend または SMTP を設定します。", + "settings.configureEmail": "メールを設定", + "settings.aiIntegrationsHelp": "プラットフォームクレジットまたは独自キーに加え、タイトル・説明・SEO・キャンペーン用の編集可能なプロンプト。キーは保存時に暗号化。", + "settings.openAiIntegrations": "AI連携を開く", + "settings.companyNameRequired": "会社名を入力してください。", + "settings.companySaved": "会社設定を保存しました。", + "settings.companyUpdateFailed": "会社を更新できませんでした", + "settings.mergeOn": "同じGTINの商品はフィード間でマージされます。", + "settings.mergeOff": "同じGTINの商品は別々のままです。", + "settings.mergeUpdateFailed": "マージ設定を更新できませんでした", + "settings.inAppToastsHelp": "このブラウザのみに保存。失敗はデフォルトでオン、完了はノイズ軽減のためミュート。フォームフィードバックと元に戻すはミュートされません。", + "settings.emailAlertsHelp": "メールアラート設定は近日公開。失敗アラートはデフォルトオン(アプリ内と同様)。完了メールはオプトインしない限りオフです。", + "settings.emailAlertsBody": "当面は会社 → メール連携でトランザクションメールを設定してください。上記のアプリ内アラートは引き続き適用されます。", + "settings.apiKeysLegacyNotice": "レガシーAPIキーは移行されていません。新しいキーを作成してアクセスを復元 — シークレットは一度だけ表示されます。", + "settings.apiKeysAdminOnly": "APIキーの作成・取り消しは会社の管理者のみ。既存のキー接頭辞は閲覧できます。", + "settings.apiKeysCopyUnavailableNotice": "既存キーはコピー不可 — 接頭辞のみ保存。新規キーでシークレットを一度コピーし、必要なら古いキーを取り消してください。", + "settings.apiKeysForbidden": "APIキーを表示する権限がありません。会社の管理者に依頼してください。", + "settings.noApiKeys": "APIキーはまだありません", + "settings.noApiKeysHelpAdmin": "レガシーAPIキーは移行されていません。Descrybe API(X-API-Key)用に新しいキーを作成してください。完全なシークレットは一度だけ表示されます。", + "settings.noApiKeysHelpMember": "この会社にはまだAPIキーがありません。レガシーキーは移行されていません — 管理者に作成を依頼してください。", + "settings.unnamedKey": "無名キー", + "settings.neverUsed": "未使用", + "settings.apiKeyActions": "APIキー操作", + "settings.copyUnavailable": "コピー不可", + "settings.copyUnavailableTitle": "完全なシークレットはキー作成時に一度だけ表示されます", + "settings.revoke": "取り消す", + "settings.apiKeyNameRequired": "このAPIキーの名前を入力してください。", + "settings.apiKeyCreatedOnce": "APIキーを作成しました。今すぐコピー — 再表示されません。", + "settings.apiKeyCreated": "APIキーを作成しました。", + "settings.apiKeyCreateFailed": "APIキーを作成できませんでした", + "settings.apiKeyRevokeConfirm": "このAPIキーを取り消しますか?これを使うリクエストは動作しなくなります。", + "settings.apiKeyRevoked": "APIキーを取り消しました。", + "settings.apiKeyRevokeFailed": "APIキーを取り消せませんでした", + "settings.apiKeyCopied": "APIキーをコピーしました。", + "settings.createApiKeyOnceHelp": "このキーを今すぐコピーしてください — 再表示されません。/api/v1 では Authorization: Bearer または X-API-Key として使用します。", + "settings.createApiKeyNameHelp": "後で区別できるようキーに名前を付けてください。作成後は Authorization: Bearer(推奨)または X-API-Key として送信します。", + "settings.keyNamePlaceholder": "例: Production", + "settings.newApiKeyAria": "新規APIキー(一度だけ表示)", + "settings.copyApiKeyAria": "APIキーをコピー", + "settings.alert.sync_fail.title": "同期失敗", + "settings.alert.sync_fail.description": "フィード同期がタイムアウトするか、APIがエラーを返したとき。", + "settings.alert.sync_done.title": "同期完了", + "settings.alert.sync_done.description": "フィード同期が正常に完了したとき。", + "settings.alert.ai_fail.title": "AI / 処理の失敗", + "settings.alert.ai_fail.description": "処理ジョブの開始または実行に失敗したとき。", + "settings.alert.ai_done.title": "AI / 処理完了", + "settings.alert.ai_done.description": "バックグラウンド処理ジョブが正常完了したとき。ジョブ開始トーストは常時オンで、元に戻すが使えます。", + "settings.alert.export_fail.title": "エクスポート失敗", + "settings.alert.export_fail.description": "商品またはエクスポートフィードのエクスポートに失敗したとき。", + "settings.alert.export_done.title": "エクスポート完了", + "settings.alert.export_done.description": "エクスポートが正常に完了したとき。", + "settings.alert.support_reply.title": "サポートスタッフの返信", + "settings.alert.support_reply.description": "プラットフォームの担当者がサポートチケットに返信したとき。", + "settings.alert.support_status.title": "サポートステータスの変更", + "settings.alert.support_status.description": "サポートチケットが保留または解決に移ったとき。", + "empty.forbidden.title.company": "権限がありません", + "empty.forbidden.title.platform": "アクセス制限", + "empty.forbidden.message.company": "この操作の権限がありません。会社の管理者に依頼してください。", + "empty.forbidden.message.platform": "この領域はプラットフォーム管理者のみ利用できます。", + "empty.forbidden.message.support": "この領域はサポート担当とプラットフォーム管理者のみ利用できます。", + "empty.forbidden.backDashboard": "ダッシュボードに戻る", + "empty.forbidden.apiKeys": "APIキーを表示する権限がありません。会社の管理者に依頼してください。", + "empty.forbidden.ai": "AIプロバイダー設定を表示する権限がありません。会社の管理者に依頼してください。", + "empty.forbidden.email": "メールプロバイダー設定を表示する権限がありません。会社の管理者に依頼してください。", + "confirm.defaultTitle": "削除の確認", + "confirm.defaultDescription": "よろしいですか?", + "confirm.defaultConfirm": "確認", + "confirm.deleteFeed": "フィード「{name}」を削除しますか?この操作は取り消せません。", + "confirm.deleteCampaign": "キャンペーン「{name}」を削除しますか?この操作は元に戻せません。", + "confirm.deleteExportFeed": "このエクスポートフィードを削除しますか?", + "confirm.rotateExportToken": "フィードURLトークンをローテーションしますか?古い公開URLは直ちに無効になります。", + "confirm.deleteUpload": "「{name}」を削除しますか?アップロード記録(およびローカルblobがあればそれも)が削除されます。", + "confirm.revokeApiKey": "このAPIキーを取り消しますか?これを使うリクエストは動作しなくなります。", + "confirm.deleteKnowledgeArticle": "このナレッジ記事を削除しますか?", + "confirm.deleteReplyTemplate": "この返信テンプレートを削除しますか?", + "confirm.deleteStructuredField": "このフィールドを削除してもよろしいですか?この操作は元に戻せません。", + "toast.campaign.pickAudience": "カテゴリまたは商品を少なくとも1つ選んでください", + "toast.campaign.pickCategories": "このフィルター用のオーディエンスカテゴリを選んでください", + "toast.campaign.completeStep": "続行するにはこのステップを完了してください", + "toast.campaign.aiDraft": "AI下書きを生成しました", + "toast.campaign.templatePreview": "テンプレートプレビューの準備完了", + "toast.campaign.generateFirst": "先にプレビューを生成してください", + "toast.campaign.testSent": "{email} にテストメールを送信しました", + "toast.campaign.scheduled": "キャンペーンをスケジュールしました", + "toast.campaign.draftSaved": "下書きを保存しました", + "toast.campaign.deleted": "キャンペーンを削除しました", + "toast.campaign.prepared": "キャンペーンを準備しました", + "toast.campaign.alreadyReady": "キャンペーンは既に準備済みです", + "toast.campaign.prepareFailed": "キャンペーンを準備できませんでした", + "toast.campaign.deleteFailed": "キャンペーンの削除に失敗しました", + "toast.feed.copyFailed": "URLをコピーできませんでした", + "toast.feed.created": "Feedを作成しました", + "toast.feed.updated": "Feedを更新しました。", + "toast.feed.mapBeforeSync": "このフィードを同期する前にフィールドをマップしてください。", + "toast.feed.activateBeforeSync": "同期する前にフィードを有効化してください。", + "toast.feed.syncFinished": "同期が完了しました", + "toast.feed.deleted": "Feedを削除しました。", + "toast.feed.mappingLoadFailed": "フィールドマッピングを読み込めませんでした。同期前にマッピングを開いて修正してください。", + "toast.feed.syncFailed": "同期に失敗しました", + "toast.feed.statusFailed": "ステータスを更新できませんでした", + "toast.feed.deleteFailed": "フィードを削除できませんでした", + "toast.feed.beforeSampling": "サンプリング前", + "toast.processing.jobCompleted": "処理が完了しました", + "toast.processing.jobFailed": "処理に失敗しました", + "toast.products.startFailed": "処理を開始できませんでした", + "toast.products.jobStarted": "処理ジョブを開始しました", + "toast.products.acceptUndone": "承認を取り消しました", + "toast.products.resetComplete": "リセット完了", + "toast.products.nameAcceptUndone": "名前の承認を取り消しました", + "toast.products.descAcceptUndone": "説明の承認を取り消しました", + "toast.products.cancelOne": "処理をキャンセルしました", + "toast.products.cancelMany": "処理ジョブをキャンセルしました", + "toast.products.startJobFailed": "処理ジョブを開始できませんでした", + "toast.products.acceptFailed": "エンリッチメントを承認できませんでした", + "toast.products.updateFailed": "商品を更新できませんでした", + "toast.products.undoAcceptFailed": "承認の取り消しに失敗しました", + "toast.products.undoFieldAcceptFailed": "フィールド承認の取り消しに失敗しました", + "toast.products.undoFieldDiscardFailed": "フィールド破棄の取り消しに失敗しました", + "toast.products.rejectFailed": "エンリッチメントを拒否できませんでした", + "toast.products.exportFailed": "選択した商品をエクスポートできませんでした", + "toast.products.resetFailed": "商品をリセットできませんでした", + "toast.products.cancelFailed": "処理ジョブをキャンセルできませんでした", + "toast.support.ticketCreated": "チケットを作成しました", + "toast.support.replySent": "返信を送信しました", + "toast.support.thanksFeedback": "フィードバックありがとうございます", + "toast.support.createFailed": "チケットを作成できませんでした", + "toast.support.unavailable": "サポート利用不可", + "toast.support.loadFailed": "サポートチケットの読み込みに失敗しました", + "toast.support.loadTicketFailed": "チケットの読み込みに失敗しました", + "toast.support.replyFailed": "返信を送信できませんでした", + "toast.support.ratingUnavailable": "評価は利用できません", + "toast.support.alreadyRated": "評価済み", + "toast.support.ratingFailed": "評価を送信できませんでした", + "toast.structured.fieldAdded": "フィールドを追加しました", + "toast.structured.fieldAddedBody": "構造化説明フィールドを追加しました。", + "toast.structured.fieldDeleted": "フィールドを削除しました", + "toast.structured.fieldDeletedBody": "構造化説明フィールドを削除しました。", + "toast.structured.addFailed": "フィールドの追加に失敗しました", + "toast.structured.deleteFailed": "フィールドの削除に失敗しました", + "toast.brand.saved": "ブランドキットを保存しました", + "toast.brand.logoUploaded": "ロゴをアップロードしました", + "toast.brand.saveFailed": "ブランドキットの保存に失敗しました", + "toast.brand.uploadFailed": "ロゴのアップロードに失敗しました", + "toast.vector.indexCreated": "ベクトルインデックスを作成しました", + "toast.vector.dbInitialized": "ベクトルデータベースを初期化しました", + "toast.vector.indexFailed": "ベクトルインデックスの作成に失敗しました", + "toast.vector.initFailed": "ベクトルデータベースの初期化に失敗しました", + "toast.vector.searchFailed": "カテゴリの検索に失敗しました", + "toast.export.refreshFailed": "フィードの更新に失敗しました", + "toast.mapping.loadFailed": "フィードマッピングの読み込みに失敗しました", + "toast.mapping.extractFailed": "スキーマの抽出に失敗しました", + "toast.mapping.saveFailed": "フィールドマッピングの保存に失敗しました", + "toast.mapping.sampleFailed": "サンプルの同期+処理に失敗しました", + "toast.attrs.createFailed": "作成に失敗しました", + "toast.attrs.importFailed": "インポートに失敗しました", + "toast.attrs.updateFailed": "更新に失敗しました", + "toast.attrs.deleteFailed": "削除に失敗しました", + "toast.switcher.loadUsersFailed": "切り替え可能なユーザーを読み込めませんでした", + "toast.switcher.switchFailed": "ユーザーを切り替えられませんでした", + "toast.switcher.returnFailed": "元のユーザーに戻れませんでした", + "toast.switcher.companyFailed": "会社を切り替えられませんでした", + "toast.requestFailed": "リクエストに失敗しました", + "flash.campaign.unavailableDraft": "キャンペーンは現在利用できません。機能が公開されるまで下書きは保存できません。", + "flash.campaign.testEmailRequired": "テスト用メールアドレスを入力してください", + "flash.campaign.scheduleRequired": "日時を選択してください", + "flash.campaign.unavailable": "キャンペーンは現在利用できません。", + "flash.campaign.generateFailed": "生成に失敗しました", + "flash.campaign.testFailed": "テスト送信に失敗しました", + "flash.campaign.scheduleFailed": "スケジュールに失敗しました", + "flash.campaign.saveFailed": "保存に失敗しました", + "flash.feed.copyFailed": "URLをコピーできませんでした", + "flash.feed.csvRequired": ".csvファイルを選択してください。", + "flash.feed.csvFileRequired": "CSVファイルを選択してください。", + "flash.feed.urlRequired": "フィードURLは必須です。", + "flash.feed.updated": "Feedを更新しました。", + "flash.feed.syncFinishedNamed": "\"{name}\" の同期が完了しました({status}: {products})。", + "flash.feed.deleted": "Feedを削除しました。", + "flash.feed.createFailed": "フィードを作成できませんでした", + "flash.feed.updateFailed": "フィードを更新できませんでした", + "flash.settings.companyNameRequired": "会社名を入力してください。", + "flash.settings.companySaved": "会社設定を保存しました。", + "flash.settings.companyFailed": "会社を更新できませんでした", + "flash.settings.mergeFailed": "マージ設定を更新できませんでした", + "flash.settings.apiKeyNameRequired": "このAPIキーの名前を入力してください。", + "flash.settings.apiKeyCreatedFailed": "APIキーを作成できませんでした", + "flash.settings.apiKeyRevoked": "APIキーを取り消しました。", + "flash.settings.apiKeyRevokeFailed": "APIキーを取り消せませんでした", + "flash.settings.copyFailed": "コピーできませんでした。テキストを選択して手動でコピーしてください。", + "flash.products.accepted": "{count} 件の商品を承認 — 処理済みに移動しました。", + "flash.products.updated": "商品を更新しました。", + "flash.products.enrichmentAccepted": "エンリッチメントを承認 — 処理済みに移動しました。", + "flash.products.originalEmpty": "元の値が空のため、PATCHではエンリッチメントをクリアできません。", + "flash.products.selectExport": "エクスポートする商品を少なくとも1つ選択してください。", + "flash.products.exported": "エクスポートフィード経由で {count} 件の商品をエクスポートしました。", + "flash.support.missingId": "チケットIDがありません", + "flash.support.notFound": "チケットが見つかりません", + "flash.support.unavailable": "サポートは一時的に利用できません。", + "flash.support.ratingUnavailable": "評価は一時的に利用できません。後でもう一度お試しください。", + "flash.support.alreadyRated": "このチケットは既に評価済みです。", + "flash.support.queueUnavailable": "このデプロイではサポートキューを利用できません。", + "flash.support.deploymentUnavailable": "このデプロイではサポートを利用できません。", + "flash.support.replyRequired": "返信本文は必須です。", + "flash.support.draftRequired": "承認前に下書き本文が必要です。", + "flash.support.claimed": "チケットを引き受けました。", + "flash.support.unassigned": "チケットの担当を解除しました。", + "flash.support.assigneeCleared": "担当者をクリアしました。", + "flash.support.assigneeUpdated": "担当者を更新しました。", + "flash.support.draftApproved": "AI下書きを承認し、顧客に送信しました。", + "flash.support.draftSent": "下書きをスタッフ返信として送信しました。", + "flash.support.draftDiscarded": "AI下書きを破棄しました。チケットを有人キューに渡しました。", + "flash.support.autoReplyDisabled": "自動返信を無効化しました(下書きは内部メモのまま)。", + "flash.structured.keyRequired": "フィールドキーは必須です", + "flash.category.nameRequired": "名前と一意のIDは必須です。", + "flash.category.textEmpty": "テキストは空にできません", + "flash.export.noConfigs": "エクスポートフィードはまだありません。エクスポートフィードで作成してから、選択した商品のエクスポートに戻ってください。", + "flash.export.selectFormat": "エクスポートフィードを選択してください。", + "flash.files.deleted": "アップロードを削除しました。", + "flash.mapping.noSuggestions": "候補がありません — ソースフィールド名を確認してください。", + "flash.mapping.allMapped": "候補はすべてマッピング済みです。テーブルの信頼度チップを確認してください。", + "flash.mapping.extractFirst": "候補がありません — 先にスキーマを抽出してください。", + "flash.mapping.pathRequired": "フィールドをマッピングする前に商品要素パスを入力してください。", + "flash.billing.checkoutCanceled": "Checkoutはキャンセルされました。変更はありません。", + "flash.billing.portalReturn": "請求ポータルから戻りました。プランはここか Plans で管理できます。", + "flash.billing.invalidAmount": "有効なクレジット数を入力してください。", + "flash.billing.companyNotFound": "会社が見つかりません。", + "flash.billing.creditsAdded": "{amount} クレジットを追加しました。", + "flash.unsubscribe.missingToken": "配信停止トークンがありません。", + "flash.unsubscribe.loadFailed": "配信停止ステータスを読み込めませんでした。", + "flash.unsubscribe.failed": "配信停止に失敗しました。", + "flash.seo.filledMeta": "「{label}」のメタを入力しました({mode})。", + "flash.shopify.saved": "Shopify設定を保存しました。", + "flash.woo.saved": "WooCommerce設定を保存しました。", + "flash.woo.syncSaved": "同期設定を保存しました。", + "flash.woo.autoCategories": "{count} 件のカテゴリを自動マッピングしました。", + "flash.woo.autoAttributes": "{count} 件の属性を自動マッピングしました。", + "flash.ai.promptsSaved": "プロンプトテンプレートを保存しました。次のAI実行に適用されます。", + "flash.ai.promptRestored": "組み込みのデフォルトプロンプトを復元しました。", + "flash.ai.connectionOk": "接続OK({detail})。", + "flash.ai.connectionByok": "、独自キー", + "flash.email.saved": "メールプロバイダーを保存しました。ドメインを確認してからテスト送信してください。", + "flash.email.testDryRun": "ドライランでテストを記録しました — メールは送信されていません。", + "flash.email.testSent": "テストメールを送信しました。配信に成功すると差出人アドレスが検証済みになります。", + "flash.fields.apiUnavailable": "標準フィールドAPIは利用できません。変更を保存できません。", + "flash.fields.updated": "フィールドを更新しました", + "flash.fields.created": "フィールドを作成しました", + "flash.fields.enabledRecommended": "推奨のECフィールドを有効化しました", + "flash.fields.deleted": "フィールドを削除しました", + "flash.fields.groupUpdated": "グループを更新しました", + "flash.fields.groupCreated": "グループを作成しました", + "flash.fields.groupDeleted": "グループを削除しました", + "flash.processing.cancelled": "「{name}」をキャンセルしました。", + "flash.processing.retried": "「{name}」を再試行キューに入れました。", + "flash.admin.staffRoleUpdated": "{email} のスタッフロールを更新しました。", + "flash.admin.staffRoleUnavailable": "このサーバーではスタッフロールの更新はまだ利用できません。", + "flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.", + "flash.admin.fixA1Success": "Catalog repair finished for {name}: {prompts} prompts, {hashes} hashes, {categories} processed←mapped, {mapped_backfilled} mapped←processed. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).", + "flash.admin.fixA1Error": "{name} のカタログ修復に失敗しました。", + "flash.admin.cloneDestMissing": "No sandbox destination. Switch to Platform Demo (staff home), then clone again.", + "flash.admin.planAssigned": "{name} にプランを割り当てました。", + "flash.admin.planAssignedShort": "プランを割り当てました。", + "flash.admin.creditsUpdated": "クレジットを更新しました。", + "flash.admin.cyclesProcessed": "処理した請求サイクル: {count}", + "flash.admin.invitesSummary": "パスワード設定招待: {parts}。メール配信: {smtp}。", + "flash.admin.smtpOn": "オン", + "flash.admin.smtpOff": "オフ", + "flash.admin.localPasswordSet": "{email} のローカルパスワードを設定しました。", + "flash.admin.localPasswordUnavailable": "この環境ではローカルパスワードツールを利用できません。", + "flash.admin.switchedUser": "ユーザーを切り替えました。再読み込み中…", + "flash.admin.switchUnavailable": "この環境ではユーザー切り替えを利用できません。", + "flash.admin.diagnosticsRateLimit": "診断のレート制限に達しました(20/分)。1分待って更新してください。", + "flash.admin.smtpSaved": "プラットフォームSMTP設定を保存しました。パスワードは非表示のままです。", + "flash.admin.integrationSaved": "連携設定を保存しました。シークレット欄が再度すべて表示されることはありません。", + "flash.admin.aiSaved": "{label} のAI設定を保存しました。APIキーは二度と表示されません。", + "flash.admin.cleanup": "クリーンアップ: {jobs} 件のジョブ失敗、{products} 件の商品をリセット。", + "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", "flash.admin.orphanDeleted": "Deleted {deleted} orphan row(s). Remaining: {remaining}.", - "flash.admin.articleUpdated": "記事を更新しました。", - "flash.admin.articleCreated": "記事を作成しました。", - "flash.admin.templateUpdated": "テンプレートを更新しました。", - "flash.admin.templateCreated": "テンプレートを作成しました。", - "flash.admin.articleDeleted": "記事を削除しました。", - "flash.admin.templateDeleted": "テンプレートを削除しました。", - "flash.admin.autoReplySaved": "自動返信設定を保存しました。", - "flash.admin.imageUploaded": "画像をアップロードし、markdownに挿入しました。", - "flash.admin.translationsSaved": "{locale} 向けに {count} 件の文字列を保存しました。準備できたらメッセージパックをコミットしてください。", - "flash.admin.featuresUpdated": "{key} を更新しました。", - "flash.admin.featuresAllOn": "このプランの全機能を有効にしました。", - "flash.admin.featuresAllOff": "このプランの全機能を無効にしました。", - "flash.admin.profileApplied": "{name} に {label} プロファイルを適用しました。", - "flash.admin.overridesCleared": "オーバーライドをクリア — プラン名のデフォルトを使用します。", - "empty.plans.none": "プランが見つかりません。", - "empty.plans.noMatch": "このフィルターに一致するプランはありません。", - "empty.plans.selectPackage": "機能を編集するパッケージを選択してください。", - "empty.products.processingTitle": "処理中の商品はありません", - "empty.products.processingMessageCan": "ライブ進捗は処理ページにあります。実行中のジョブを開いてステップ状況を確認してください。ジョブ項目フィルタが利用可能になると、このタブに処理中の商品が表示されます。", - "empty.products.processingMessageCannot": "カタログから処理を開始すると、ジョブ中の商品がここに表示されます。", - "empty.products.reviewTitle": "要レビューの商品はありません", - "empty.products.reviewMessage": "処理ジョブ完了後、エンリッチ済み商品がここに表示されます。行を開いて原文と比較し、承認・編集・拒否してください。", - "empty.products.errorTitle": "エラーのある商品はありません", - "empty.products.errorMessage": "商品の処理に失敗するとここに表示され、再試行できます。", - "empty.products.filterTitleUnprocessed": "未処理の一致はありません", - "empty.products.filterTitle": "一致する商品はありません", - "empty.products.filterMessage": "別の検索・カテゴリ・フィードを試すか、フィルタをクリアしてすべてを表示してください。", - "empty.products.unprocessedTitle": "未処理の商品はまだありません", - "empty.products.unprocessedMessage": "サプライヤーフィードを接続するかCSVをアップロードして商品をカタログに取り込みます。", - "empty.products.noneTitle": "商品はまだありません", - "empty.products.noneMessageStores": "フィードまたはストアから取り込み、処理ジョブを開始してカタログを構築します。", - "empty.products.noneMessage": "フィードから取り込むかCSVをアップロードし、処理ジョブを開始してカタログを構築します。", - "empty.products.viewJobs": "ジョブを表示", - "empty.products.startJob": "ジョブを開始", - "empty.products.clearFilters": "フィルタをクリア", - "empty.products.viewProcessed": "処理済みを表示", - "empty.products.retryCatalog": "カタログから再試行", - "empty.products.connectFeed": "Feedを接続", - "empty.products.addProduct": "商品を追加", - "empty.products.uploadCsv": "CSVをアップロード", - "empty.feeds.noneTitle": "商品フィードはまだありません", - "empty.feeds.noneMessage": "サプライヤーの CSV/XML URL に接続するかファイルをアップロード。次: Map → Sync → Process。", - "empty.feeds.noMatchTitle": "一致するFeedなし", - "empty.feeds.noMatchMessage": "別の検索語を試すか、検索をクリアしてすべてのフィードを表示してください。", - "empty.export.loadFailedTitle": "エクスポートフィードを読み込めませんでした", - "empty.export.loadFailedMessage": "エクスポートの読み込み中に問題が発生しました。再試行するか、上記のエラーで詳細を確認してください。", - "empty.export.noneTitle": "エクスポートフィードはまだありません", - "empty.export.noneMessage": "Google Shopping、Meta、またはカスタムCSV/XMLフィードを作成し、出力する商品とフィールドを選びます。Merchant Centerやパートナー向けの公開URLを生成するか、商品画面で選択分だけエクスポートできます。", - "empty.export.noMatchTitle": "一致するFeedなし", - "empty.export.noMatchMessage": "別の検索語を試してください。", - "empty.files.noneTitle": "アップロードはまだありません", - "empty.files.noneMessage": "商品・カテゴリ・属性の CSV インポートはアップロード後にここに表示されます。プラットフォーム移行後、ファイル本体(blob)はコピーされていません — 必要な場合は再アップロードしてください。", - "empty.files.uploadCta": "CSV をアップロード", - "empty.export.fromProductsCta": "Products からエクスポート", - "empty.dashboard.noJobsTitle": "最近のジョブはありません", - "empty.dashboard.noJobsMessage": "Products から処理を開始するとジョブがここに表示されます。エクスポート前にタイトルと説明を充実させてください。", - "empty.stores.noneTitle": "ストア未接続", - "empty.stores.noneMessage": "WooCommerce または Shopify を接続してカタログと注文を同期します。仕入先ファイルなら Feed URL または CSV アップロードを使います。", - "empty.stores.noneTitleMember": "まだストアが接続されていません", - "empty.stores.noneMessageMember": "WooCommerce / Shopify を接続できるのは会社管理者のみです。管理者に依頼するか、権限があれば Feed URL / CSV を使ってください。", - "empty.woo.openConnection": "接続設定を開く", - "empty.shopify.openConnection": "接続設定を開く", - "empty.processing.noneTitle": "ジョブはまだありません", - "empty.processing.noneMessage": "準備ができたら商品からジョブを開始してください。進捗と履歴がここに表示されます。", - "empty.campaigns.unavailableTitle": "キャンペーン利用不可", - "empty.campaigns.unavailableMessage": "キャンペーンサービスに現在接続できません。作成ウィザードは開けますが、生成と送信はサービス復旧まで待機します。", - "empty.calendar.noneTitle": "季節プリセットはありません", - "empty.calendar.noneMessage": "マーケティングAPIが利用可能になると、カレンダープリセットがここに表示されます。", - "empty.seo.noneTitle": "スコア対象のカタログがありません", - "empty.seo.noneMessage": "先に商品を処理するかカテゴリを追加してください。カタログデータがあるとSEOスコアが表示されます。", - "empty.vector.unavailableTitle": "ベクトルカテゴリは利用できません", - "empty.vector.noMatchTitle": "一致はまだありません", - "empty.vector.noMatchMessage": "商品説明を入力して検索し、ベクトルカテゴリの一致を表示します。", - "empty.structured.unavailableTitle": "構造化説明は利用できません", - "empty.structured.unavailableMessage": "このAPIはまだこのバックエンドにありません。/api/structured-descriptions が接続されるまで Export ID フィールドは管理できません。", - "empty.structured.noneTitle": "構造化説明フィールドはまだありません", - "empty.structured.noneMessage": "ここにフィールドを追加するか、カテゴリ説明フォーミュラで Export ID を作成すると、エクスポートフィードで使えるように表示されます。", - "empty.support.unavailableTitle": "サポート利用不可", - "empty.support.noneTitle": "チケットはまだありません", - "empty.support.unavailableMessage": "サポートAPIに現在接続できません。しばらくして再試行するか、サービス復旧後に新規チケットを開いてください。", - "empty.support.filterMessage": "このステータスに一致するチケットはありません。別のフィルタを試すか、新規チケットを作成してください。", - "empty.support.noneMessage": "問題を記述すると、チームがこのスレッドで返信します。スタッフが返信するとアプリ内通知も届きます。", - "empty.support.createTicket": "チケットを作成", - "empty.support.clearFilter": "フィルタをクリア", - "empty.support.ticketNotFoundTitle": "チケットが見つかりません", - "empty.support.ticketNotFoundMessage": "このチケットは削除されたか、アクセス権がありません。", - "empty.support.noMessagesTitle": "メッセージなし", - "empty.support.noMessagesMessage": "このスレッドにはまだメッセージがありません。", - "empty.settings.noApiKeysTitle": "APIキーはまだありません", - "empty.shopify.noOrdersTitle": "注文はまだありません", - "empty.shopify.noOrdersMessage": "Shopify 接続後に注文インポートを実行すると注文が表示されます。初回同期までは空リストが普通です。", - "empty.woo.noOrdersTitle": "注文はまだありません", - "empty.woo.noOrdersMessage": "WooCommerce 接続後に注文同期を実行すると注文が表示されます。初回同期までは空リストが普通です。", - "empty.woo.noReviewsTitle": "レビューはまだありません", - "empty.woo.noReviewsMessage": "接続済みストアからレビューインポートをキューするとレビューが表示されます。空でもこのタブは使えます。", - "empty.admin.noProviderTitle": "プロバイダー行なし", - "empty.admin.noProviderMessage": "商品がプロバイダータイプを記録すると、トークンがここに表示されます。", - "empty.admin.noCompaniesTitle": "会社なし", - "empty.admin.noCompaniesMessage": "会社リストが空です。", - "empty.admin.noCyclesTitle": "請求サイクルはまだありません", - "empty.admin.noCyclesMessage": "請求実行が履歴行を作成するとサイクルが表示されます。", - "empty.admin.noCompaniesFound": "会社が見つかりません。", - "empty.admin.noCompaniesMatch": "このフィルタに一致する会社はありません。", - "empty.admin.notPlatformTitle": "プラットフォーム管理者ではありません", - "empty.admin.notPlatformMessage": "サインインしていますがプラットフォーム管理者としてマークされていません。既存の管理者にアクセス付与を依頼し、サインアウトしてから再度サインインしてください。", - "empty.admin.noJobsFilter": "このフィルタのジョブはありません。", - "empty.admin.noAdminUsers": "管理ユーザーが見つかりません", - "empty.admin.noJobs": "ジョブが見つかりません。", - "empty.admin.queueUnavailable": "サポートキューは利用できません。続く場合はプラットフォーム管理者に連絡してください。", - "empty.admin.noTicketsQueue": "このキューにチケットはありません。", - "empty.admin.knowledgeTitle": "サポートナレッジ", - "empty.admin.knowledgeNotReadyTitle": "サポートナレッジの準備ができていません", - "empty.admin.knowledgeNotReadyMessage": "このデプロイでは記事と自動返信設定がまだありません。", - "empty.admin.noTemplatesTitle": "返信テンプレートなし", - "empty.admin.noTemplatesMessage": "テンプレートは記事と同様に照合され、ラベル付き自動返信として投稿されます。", - "empty.admin.ticketNotFound": "チケットが見つかりません。", - "empty.admin.supportUnavailable": "このデプロイではサポートを利用できません。", - "empty.admin.ticketLoadFailed": "このチケットを読み込めませんでした。", - "empty.admin.noMessages": "メッセージはまだありません。", - "empty.admin.translationsUnavailableTitle": "翻訳を利用できません", - "empty.admin.translationsUnavailableMessage": "このビルドでは翻訳カタログのエンドポイントを利用できません。", - "empty.admin.noKeysMatchTitle": "一致するキーなし", - "empty.admin.noKeysMatchMessage": "別のフィルタや検索を試すか、英語に新しいキーが追加された後に更新してください。", - "empty.admin.noUsersMatch": "このフィルタに一致するユーザーはいません。", - "empty.admin.noCompaniesMatchFilter": "このフィルタに一致する会社はありません。", - "blast.title": "一斉メールの確認", - "blast.dryRunDescription": "ドライランモード中です — 実際のメールはDescrybeから送信されません。確認するとドライラン送信が記録されます。", - "blast.liveDescription": "実際のメールが配信先に送信されます。続行するには I understand と入力してください。", - "blast.recipients": "このリクエストの受信者数: {count}", - "blast.typePhrase": "「I understand」と入力", + "flash.admin.articleUpdated": "記事を更新しました。", + "flash.admin.articleCreated": "記事を作成しました。", + "flash.admin.templateUpdated": "テンプレートを更新しました。", + "flash.admin.templateCreated": "テンプレートを作成しました。", + "flash.admin.articleDeleted": "記事を削除しました。", + "flash.admin.templateDeleted": "テンプレートを削除しました。", + "flash.admin.autoReplySaved": "自動返信設定を保存しました。", + "flash.admin.imageUploaded": "画像をアップロードし、markdownに挿入しました。", + "flash.admin.translationsSaved": "{locale} 向けに {count} 件の文字列を保存しました。準備できたらメッセージパックをコミットしてください。", + "flash.admin.featuresUpdated": "{key} を更新しました。", + "flash.admin.featuresAllOn": "このプランの全機能を有効にしました。", + "flash.admin.featuresAllOff": "このプランの全機能を無効にしました。", + "flash.admin.profileApplied": "{name} に {label} プロファイルを適用しました。", + "flash.admin.overridesCleared": "オーバーライドをクリア — プラン名のデフォルトを使用します。", + "empty.plans.none": "プランが見つかりません。", + "empty.plans.noMatch": "このフィルターに一致するプランはありません。", + "empty.plans.selectPackage": "機能を編集するパッケージを選択してください。", + "empty.products.processingTitle": "処理中の商品はありません", + "empty.products.processingMessageCan": "ライブ進捗は処理ページにあります。実行中のジョブを開いてステップ状況を確認してください。ジョブ項目フィルタが利用可能になると、このタブに処理中の商品が表示されます。", + "empty.products.processingMessageCannot": "カタログから処理を開始すると、ジョブ中の商品がここに表示されます。", + "empty.products.reviewTitle": "要レビューの商品はありません", + "empty.products.reviewMessage": "処理ジョブ完了後、エンリッチ済み商品がここに表示されます。行を開いて原文と比較し、承認・編集・拒否してください。", + "empty.products.errorTitle": "エラーのある商品はありません", + "empty.products.errorMessage": "商品の処理に失敗するとここに表示され、再試行できます。", + "empty.products.filterTitleUnprocessed": "未処理の一致はありません", + "empty.products.filterTitle": "一致する商品はありません", + "empty.products.filterMessage": "別の検索・カテゴリ・フィードを試すか、フィルタをクリアしてすべてを表示してください。", + "empty.products.unprocessedTitle": "未処理の商品はまだありません", + "empty.products.unprocessedMessage": "サプライヤーフィードを接続するかCSVをアップロードして商品をカタログに取り込みます。", + "empty.products.noneTitle": "商品はまだありません", + "empty.products.noneMessageStores": "フィードまたはストアから取り込み、処理ジョブを開始してカタログを構築します。", + "empty.products.noneMessage": "フィードから取り込むかCSVをアップロードし、処理ジョブを開始してカタログを構築します。", + "empty.products.viewJobs": "ジョブを表示", + "empty.products.startJob": "ジョブを開始", + "empty.products.clearFilters": "フィルタをクリア", + "empty.products.viewProcessed": "処理済みを表示", + "empty.products.retryCatalog": "カタログから再試行", + "empty.products.connectFeed": "Feedを接続", + "empty.products.addProduct": "商品を追加", + "empty.products.uploadCsv": "CSVをアップロード", + "empty.feeds.noneTitle": "商品フィードはまだありません", + "empty.feeds.noneMessage": "サプライヤーの CSV/XML URL に接続するかファイルをアップロード。次: Map → Sync → Process。", + "empty.feeds.noMatchTitle": "一致するFeedなし", + "empty.feeds.noMatchMessage": "別の検索語を試すか、検索をクリアしてすべてのフィードを表示してください。", + "empty.export.loadFailedTitle": "エクスポートフィードを読み込めませんでした", + "empty.export.loadFailedMessage": "エクスポートの読み込み中に問題が発生しました。再試行するか、上記のエラーで詳細を確認してください。", + "empty.export.noneTitle": "エクスポートフィードはまだありません", + "empty.export.noneMessage": "Google Shopping、Meta、またはカスタムCSV/XMLフィードを作成し、出力する商品とフィールドを選びます。Merchant Centerやパートナー向けの公開URLを生成するか、商品画面で選択分だけエクスポートできます。", + "empty.export.noMatchTitle": "一致するFeedなし", + "empty.export.noMatchMessage": "別の検索語を試してください。", + "empty.files.noneTitle": "アップロードはまだありません", + "empty.files.noneMessage": "商品・カテゴリ・属性の CSV インポートはアップロード後にここに表示されます。プラットフォーム移行後、ファイル本体(blob)はコピーされていません — 必要な場合は再アップロードしてください。", + "empty.files.uploadCta": "CSV をアップロード", + "empty.export.fromProductsCta": "Products からエクスポート", + "empty.dashboard.noJobsTitle": "最近のジョブはありません", + "empty.dashboard.noJobsMessage": "Products から処理を開始するとジョブがここに表示されます。エクスポート前にタイトルと説明を充実させてください。", + "empty.stores.noneTitle": "ストア未接続", + "empty.stores.noneMessage": "WooCommerce または Shopify を接続してカタログと注文を同期します。仕入先ファイルなら Feed URL または CSV アップロードを使います。", + "empty.stores.noneTitleMember": "まだストアが接続されていません", + "empty.stores.noneMessageMember": "WooCommerce / Shopify を接続できるのは会社管理者のみです。管理者に依頼するか、権限があれば Feed URL / CSV を使ってください。", + "empty.woo.openConnection": "接続設定を開く", + "empty.shopify.openConnection": "接続設定を開く", + "empty.processing.noneTitle": "ジョブはまだありません", + "empty.processing.noneMessage": "準備ができたら商品からジョブを開始してください。進捗と履歴がここに表示されます。", + "empty.campaigns.unavailableTitle": "キャンペーン利用不可", + "empty.campaigns.unavailableMessage": "キャンペーンサービスに現在接続できません。作成ウィザードは開けますが、生成と送信はサービス復旧まで待機します。", + "empty.calendar.noneTitle": "季節プリセットはありません", + "empty.calendar.noneMessage": "マーケティングAPIが利用可能になると、カレンダープリセットがここに表示されます。", + "empty.seo.noneTitle": "スコア対象のカタログがありません", + "empty.seo.noneMessage": "先に商品を処理するかカテゴリを追加してください。カタログデータがあるとSEOスコアが表示されます。", + "empty.vector.unavailableTitle": "ベクトルカテゴリは利用できません", + "empty.vector.noMatchTitle": "一致はまだありません", + "empty.vector.noMatchMessage": "商品説明を入力して検索し、ベクトルカテゴリの一致を表示します。", + "empty.structured.unavailableTitle": "構造化説明は利用できません", + "empty.structured.unavailableMessage": "このAPIはまだこのバックエンドにありません。/api/structured-descriptions が接続されるまで Export ID フィールドは管理できません。", + "empty.structured.noneTitle": "構造化説明フィールドはまだありません", + "empty.structured.noneMessage": "ここにフィールドを追加するか、カテゴリ説明フォーミュラで Export ID を作成すると、エクスポートフィードで使えるように表示されます。", + "empty.support.unavailableTitle": "サポート利用不可", + "empty.support.noneTitle": "チケットはまだありません", + "empty.support.unavailableMessage": "サポートAPIに現在接続できません。しばらくして再試行するか、サービス復旧後に新規チケットを開いてください。", + "empty.support.filterMessage": "このステータスに一致するチケットはありません。別のフィルタを試すか、新規チケットを作成してください。", + "empty.support.noneMessage": "問題を記述すると、チームがこのスレッドで返信します。スタッフが返信するとアプリ内通知も届きます。", + "empty.support.createTicket": "チケットを作成", + "empty.support.clearFilter": "フィルタをクリア", + "empty.support.ticketNotFoundTitle": "チケットが見つかりません", + "empty.support.ticketNotFoundMessage": "このチケットは削除されたか、アクセス権がありません。", + "empty.support.noMessagesTitle": "メッセージなし", + "empty.support.noMessagesMessage": "このスレッドにはまだメッセージがありません。", + "empty.settings.noApiKeysTitle": "APIキーはまだありません", + "empty.shopify.noOrdersTitle": "注文はまだありません", + "empty.shopify.noOrdersMessage": "Shopify 接続後に注文インポートを実行すると注文が表示されます。初回同期までは空リストが普通です。", + "empty.woo.noOrdersTitle": "注文はまだありません", + "empty.woo.noOrdersMessage": "WooCommerce 接続後に注文同期を実行すると注文が表示されます。初回同期までは空リストが普通です。", + "empty.woo.noReviewsTitle": "レビューはまだありません", + "empty.woo.noReviewsMessage": "接続済みストアからレビューインポートをキューするとレビューが表示されます。空でもこのタブは使えます。", + "empty.admin.noProviderTitle": "プロバイダー行なし", + "empty.admin.noProviderMessage": "商品がプロバイダータイプを記録すると、トークンがここに表示されます。", + "empty.admin.noCompaniesTitle": "会社なし", + "empty.admin.noCompaniesMessage": "会社リストが空です。", + "empty.admin.noCyclesTitle": "請求サイクルはまだありません", + "empty.admin.noCyclesMessage": "請求実行が履歴行を作成するとサイクルが表示されます。", + "empty.admin.noCompaniesFound": "会社が見つかりません。", + "empty.admin.noCompaniesMatch": "このフィルタに一致する会社はありません。", + "empty.admin.notPlatformTitle": "プラットフォーム管理者ではありません", + "empty.admin.notPlatformMessage": "サインインしていますがプラットフォーム管理者としてマークされていません。既存の管理者にアクセス付与を依頼し、サインアウトしてから再度サインインしてください。", + "empty.admin.noJobsFilter": "このフィルタのジョブはありません。", + "empty.admin.noAdminUsers": "管理ユーザーが見つかりません", + "empty.admin.noJobs": "ジョブが見つかりません。", + "empty.admin.queueUnavailable": "サポートキューは利用できません。続く場合はプラットフォーム管理者に連絡してください。", + "empty.admin.noTicketsQueue": "このキューにチケットはありません。", + "empty.admin.knowledgeTitle": "サポートナレッジ", + "empty.admin.knowledgeNotReadyTitle": "サポートナレッジの準備ができていません", + "empty.admin.knowledgeNotReadyMessage": "このデプロイでは記事と自動返信設定がまだありません。", + "empty.admin.noTemplatesTitle": "返信テンプレートなし", + "empty.admin.noTemplatesMessage": "テンプレートは記事と同様に照合され、ラベル付き自動返信として投稿されます。", + "empty.admin.ticketNotFound": "チケットが見つかりません。", + "empty.admin.supportUnavailable": "このデプロイではサポートを利用できません。", + "empty.admin.ticketLoadFailed": "このチケットを読み込めませんでした。", + "empty.admin.noMessages": "メッセージはまだありません。", + "empty.admin.translationsUnavailableTitle": "翻訳を利用できません", + "empty.admin.translationsUnavailableMessage": "このビルドでは翻訳カタログのエンドポイントを利用できません。", + "empty.admin.noKeysMatchTitle": "一致するキーなし", + "empty.admin.noKeysMatchMessage": "別のフィルタや検索を試すか、英語に新しいキーが追加された後に更新してください。", + "empty.admin.noUsersMatch": "このフィルタに一致するユーザーはいません。", + "empty.admin.noCompaniesMatchFilter": "このフィルタに一致する会社はありません。", + "blast.title": "一斉メールの確認", + "blast.dryRunDescription": "ドライランモード中です — 実際のメールはDescrybeから送信されません。確認するとドライラン送信が記録されます。", + "blast.liveDescription": "実際のメールが配信先に送信されます。続行するには I understand と入力してください。", + "blast.recipients": "このリクエストの受信者数: {count}", + "blast.typePhrase": "「I understand」と入力", "blast.placeholder": "I understand", - "blast.runDryRun": "ドライランを実行", - "blast.send": "一斉送信", - "marketing.footerBefore": "メールキャンペーンは", - "marketing.footerAfter": "— このページはカタログのエクスポートフィードの準備のみです。", - "support.title": "サポートセンター", - "support.description": "開く a チケット for 請求, bugs, or account help. スタッフ replies show here and as in-app notifications.", - "support.newTicket": "New チケット", - "support.createTicket": "チケットを作成", - "support.loadingTickets": "読み込み中 チケット…", - "support.loadFailed": "サポートチケットの読み込みに失敗しました", - "support.unavailableBanner": "サポート is not fully 利用可能 yet. You can still prepare a チケット; submitting may wait until the service is ready.", - "support.yourTickets": "チケット一覧", - "support.ticketCount": "{count} チケット", - "support.ticketCountOne": "{count} チケット", - "support.statusFilterSuffix": "· status {status}(訳)", - "support.filterByStatus": "フィルタ by status", - "support.unavailableTitle": "サポート利用不可", - "support.emptyTitle": "チケットはまだありません", - "support.unavailableEmpty": "サポートAPIに現在接続できません。しばらくして再試行するか、サービス復旧後に新規チケットを開いてください。", - "support.emptyFiltered": "このステータスに一致するチケットはありません。別のフィルタを試すか、新規チケットを作成してください。", - "support.emptyHelp": "問題を記述すると、チームがこのスレッドで返信します。スタッフが返信するとアプリ内通知も届きます。", - "support.clearFilter": "フィルタをクリア", - "support.table.subject": "件名", - "support.table.category": "カテゴリ", - "support.table.status": "ステータス", - "support.table.priority": "優先度", - "support.table.updated": "更新済み", - "support.openTicketAria": "開く チケット {subject}", - "support.status.all": "すべて", - "support.status.open": "開く", - "support.status.pending": "保留中", - "support.status.resolved": "解決済み", - "support.status.closed": "クローズ", - "support.new.title": "新規サポートチケット", - "support.new.description": "Tell us what you need help with. Include steps, error messages, or invoice details when relevant.(訳)", - "support.new.back": "戻る to チケット", - "support.new.details": "チケット details", - "support.new.detailsHelp": "ステータス starts as open. You may get an automated answer first; a human teammate can take over anytime from the same thread.", - "support.new.subject": "件名", - "support.new.subjectPlaceholder": "Short summary(訳)", - "support.new.category": "カテゴリ", - "support.new.priority": "優先度", - "support.new.optional": "任意 details", - "support.new.optionalHint": "(SKU, tags — helps routing)(訳)", - "support.new.relatedSku": "Related SKU(訳)", - "support.new.relatedSkuPlaceholder": "e.g. ABC-123(訳)", - "support.new.relatedSkuHelp": "商品 or フィード SKU if this is about a specific item.", - "support.new.tags": "タグ", - "support.new.tagsPlaceholder": "login, invoice (comma-separated)(訳)", - "support.new.tagsHelp": "Up to 10 short labels. We normalize spaces and punctuation.(訳)", - "support.new.tagsWillSend": "Will send: {tags}(訳)", - "support.new.message": "メッセージ", - "support.new.messagePlaceholder": "Describe the issue, what you expected, and anything that helps us reproduce it.(訳)", - "support.new.createdTitle": "チケットを作成しました", - "support.new.createdBody": "We will reply in this thread. Watch for in-app notifications.(訳)", - "support.new.viewTicket": "View チケット", - "support.new.unavailable": "サポート is temporarily 利用不可. Your message was not submitted — try again shortly.", - "support.new.unavailableTitle": "サポート利用不可", - "support.new.createFailed": "チケットを作成できませんでした", - "support.ticket.fallbackTitle": "サポート チケット", - "support.ticket.description": "Conversation thread with Descrybe サポート.", - "support.ticket.meta": "{category} · {priority} · Updated {when}(訳)", - "support.ticket.allTickets": "すべて チケット", - "support.ticket.loading": "読み込み中 チケット…", - "support.ticket.missingId": "チケットIDがありません", - "support.ticket.notFound": "チケットが見つかりません", - "support.ticket.notFoundMessage": "このチケットは削除されたか、アクセス権がありません。", - "support.ticket.backCenter": "戻る to サポート Center", - "support.ticket.unavailable": "サポートは一時的に利用できません。", - "support.ticket.loadFailed": "チケットの読み込みに失敗しました", - "support.ticket.openedMeta": "開くed {when} · {category} · {priority} priority", - "support.ticket.sku": "SKU {sku}(訳)", - "support.ticket.messagesAria": "チケット messages", - "support.ticket.noMessages": "メッセージなし", - "support.ticket.noMessagesHelp": "このスレッドにはまだメッセージがありません。", - "support.ticket.yourReply": "Your reply(訳)", - "support.ticket.replyPlaceholder": "Add details or reply to サポート…", - "support.ticket.sendReply": "Send reply(訳)", - "support.ticket.replySent": "返信を送信しました", - "support.ticket.reopened": "チケット reopened for staff review.", - "support.ticket.replyAdded": "Your message was added to the thread.(訳)", - "support.ticket.replyFailed": "返信を送信できませんでした", - "support.ticket.reopenHint": "Replying reopens this チケット for staff.", - "support.ticket.humanHint": "Replying asks a human teammate to continue from here.(訳)", - "support.ticket.closedBanner": "This チケット is closed. 作成 a new チケット if you still need help.", - "support.kind.you": "あなた", - "support.kind.human": "サポート", - "support.kind.auto": "Automated(訳)", - "support.kind.ai": "AI支援", - "support.kind.system": "システム", - "support.kind.autoBadge": "Automated answer(訳)", - "support.kind.aiBadge": "AI支援", - "support.progress.closed.title": "チケット closed", - "support.progress.closed.message": "This conversation is closed. 開く a new チケット if you still need help.", - "support.progress.resolved.title": "Marked resolved(訳)", - "support.progress.resolved.message": "We believe this is sorted. Reply to reopen, or leave a quick rating below.(訳)", - "support.progress.quickAnswer.title": "Quick answer sent(訳)", - "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply here — a human will take over.(訳)", - "support.progress.onIt.title": "We're on it(訳)", - "support.progress.onIt.handedMessage": "A サポート teammate has your チケット and will reply in this thread.", - "support.progress.onIt.pendingMessage": "サポート is reviewing your message. You will see updates in this thread.", - "support.progress.received.title": "チケット received", - "support.progress.received.message": "Thanks — we have your request. Automated help may appear shortly, or a teammate will reply.(訳)", - "support.category.billing": "請求", - "support.category.billing.help": "請求書, payment methods, plan changes, and Stripe receipts.", - "support.category.billing_credits": "請求 / credits", - "support.category.billing_credits.help": "Credit balance, usage quotas, and top-ups.(訳)", - "support.category.bug": "Bug / error(訳)", - "support.category.bug.help": "Unexpected errors, broken screens, or steps that fail every time.(訳)", - "support.category.account": "Account / access(訳)", - "support.category.account.help": "Login, invites, 会社 membership, and permissions.", - "support.category.integrations": "連携", - "support.category.integrations.help": "WooCommerce、Shopify、公開 API、またはコネクタ設定。", - "support.category.processing": "処理 / AI", - "support.category.processing.help": "商品 処理, AI prompts, and generation quality.", - "support.category.export": "エクスポート / channels", - "support.category.export.help": "エクスポート フィード, channels, and sync destinations.", - "support.category.migration": "移行/データ", - "support.category.migration.help": "カットオーバー後の欠落・誤データ — 商品、フィード、ストア、請求、チーム。", - "support.category.other": "その他", - "support.category.other.help": "Anything else — we will route it to the right teammate.(訳)", - "support.priority.low": "低", - "support.priority.low.help": "Nice-to-have or non-blocking — we will get to it in turn.(訳)", - "support.priority.normal": "通常", - "support.priority.normal.help": "Standard request. Most チケット use this.", - "support.priority.high": "高", - "support.priority.high.help": "Blocking work or revenue impact — use sparingly.(訳)", - "support.csat.thanks": "フィードバックありがとうございます", - "support.csat.unavailable": "評価は一時的に利用できません。後でもう一度お試しください。", - "support.csat.unavailableTitle": "評価は利用できません", - "support.csat.alreadyRated": "このチケットは既に評価済みです。", - "support.csat.alreadyRatedTitle": "評価済み", - "support.csat.submitFailed": "評価を送信できませんでした", - "support.csat.yourRating": "Your rating(訳)", - "support.csat.ratedOutOf": "You rated this チケット {score} out of 5", - "support.csat.howDidWeDo": "How did we do?(訳)", - "support.csat.formHelp": "This チケット is {status}. Rate your experience (1–5). 任意 comment helps us improve.", - "support.csat.rating": "評価", - "support.csat.scoreAria": "{value} — {label}(訳)", - "support.csat.whatWentWrong": "What went wrong? (任意)", - "support.csat.whatWentWrongPlaceholder": "A short note helps us follow up.(訳)", - "support.csat.anythingElse": "Anything else? (任意)", - "support.csat.optionalFeedback": "任意 フィードback", - "support.csat.submit": "Submit rating(訳)", - "support.csat.score.1": "Very dissatisfied(訳)", - "support.csat.score.2": "Dissatisfied(訳)", + "blast.runDryRun": "ドライランを実行", + "blast.send": "一斉送信", + "marketing.footerBefore": "メールキャンペーンは", + "marketing.footerAfter": "— このページはカタログのエクスポートフィードの準備のみです。", + "support.title": "サポートセンター", + "support.description": "開く a チケット for 請求, bugs, or account help. スタッフ replies show here and as in-app notifications.", + "support.newTicket": "New チケット", + "support.createTicket": "チケットを作成", + "support.loadingTickets": "読み込み中 チケット…", + "support.loadFailed": "サポートチケットの読み込みに失敗しました", + "support.unavailableBanner": "サポート is not fully 利用可能 yet. You can still prepare a チケット; submitting may wait until the service is ready.", + "support.yourTickets": "チケット一覧", + "support.ticketCount": "{count} チケット", + "support.ticketCountOne": "{count} チケット", + "support.statusFilterSuffix": "· status {status}(訳)", + "support.filterByStatus": "フィルタ by status", + "support.unavailableTitle": "サポート利用不可", + "support.emptyTitle": "チケットはまだありません", + "support.unavailableEmpty": "サポートAPIに現在接続できません。しばらくして再試行するか、サービス復旧後に新規チケットを開いてください。", + "support.emptyFiltered": "このステータスに一致するチケットはありません。別のフィルタを試すか、新規チケットを作成してください。", + "support.emptyHelp": "問題を記述すると、チームがこのスレッドで返信します。スタッフが返信するとアプリ内通知も届きます。", + "support.clearFilter": "フィルタをクリア", + "support.table.subject": "件名", + "support.table.category": "カテゴリ", + "support.table.status": "ステータス", + "support.table.priority": "優先度", + "support.table.updated": "更新済み", + "support.openTicketAria": "開く チケット {subject}", + "support.status.all": "すべて", + "support.status.open": "開く", + "support.status.pending": "保留中", + "support.status.resolved": "解決済み", + "support.status.closed": "クローズ", + "support.new.title": "新規サポートチケット", + "support.new.description": "Tell us what you need help with. Include steps, error messages, or invoice details when relevant.(訳)", + "support.new.back": "戻る to チケット", + "support.new.details": "チケット details", + "support.new.detailsHelp": "ステータス starts as open. You may get an automated answer first; a human teammate can take over anytime from the same thread.", + "support.new.subject": "件名", + "support.new.subjectPlaceholder": "Short summary(訳)", + "support.new.category": "カテゴリ", + "support.new.priority": "優先度", + "support.new.optional": "任意 details", + "support.new.optionalHint": "(SKU, tags — helps routing)(訳)", + "support.new.relatedSku": "Related SKU(訳)", + "support.new.relatedSkuPlaceholder": "e.g. ABC-123(訳)", + "support.new.relatedSkuHelp": "商品 or フィード SKU if this is about a specific item.", + "support.new.tags": "ã‚¿ã‚°", + "support.new.tagsPlaceholder": "login, invoice (comma-separated)(訳)", + "support.new.tagsHelp": "Up to 10 short labels. We normalize spaces and punctuation.(訳)", + "support.new.tagsWillSend": "Will send: {tags}(訳)", + "support.new.message": "メッセージ", + "support.new.messagePlaceholder": "Describe the issue, what you expected, and anything that helps us reproduce it.(訳)", + "support.new.createdTitle": "チケットを作成しました", + "support.new.createdBody": "We will reply in this thread. Watch for in-app notifications.(訳)", + "support.new.viewTicket": "View チケット", + "support.new.unavailable": "サポート is temporarily 利用不可. Your message was not submitted — try again shortly.", + "support.new.unavailableTitle": "サポート利用不可", + "support.new.createFailed": "チケットを作成できませんでした", + "support.ticket.fallbackTitle": "サポート チケット", + "support.ticket.description": "Conversation thread with Descrybe サポート.", + "support.ticket.meta": "{category} · {priority} · Updated {when}(訳)", + "support.ticket.allTickets": "すべて チケット", + "support.ticket.loading": "読み込み中 チケット…", + "support.ticket.missingId": "チケットIDがありません", + "support.ticket.notFound": "チケットが見つかりません", + "support.ticket.notFoundMessage": "このチケットは削除されたか、アクセス権がありません。", + "support.ticket.backCenter": "戻る to サポート Center", + "support.ticket.unavailable": "サポートは一時的に利用できません。", + "support.ticket.loadFailed": "チケットの読み込みに失敗しました", + "support.ticket.openedMeta": "開くed {when} · {category} · {priority} priority", + "support.ticket.sku": "SKU {sku}(訳)", + "support.ticket.messagesAria": "チケット messages", + "support.ticket.noMessages": "メッセージなし", + "support.ticket.noMessagesHelp": "このスレッドにはまだメッセージがありません。", + "support.ticket.yourReply": "Your reply(訳)", + "support.ticket.replyPlaceholder": "Add details or reply to サポート…", + "support.ticket.sendReply": "Send reply(訳)", + "support.ticket.replySent": "返信を送信しました", + "support.ticket.reopened": "チケット reopened for staff review.", + "support.ticket.replyAdded": "Your message was added to the thread.(訳)", + "support.ticket.replyFailed": "返信を送信できませんでした", + "support.ticket.reopenHint": "Replying reopens this チケット for staff.", + "support.ticket.humanHint": "Replying asks a human teammate to continue from here.(訳)", + "support.ticket.closedBanner": "This チケット is closed. 作成 a new チケット if you still need help.", + "support.kind.you": "あなた", + "support.kind.human": "サポート", + "support.kind.auto": "Automated(訳)", + "support.kind.ai": "AI支援", + "support.kind.system": "システム", + "support.kind.autoBadge": "Automated answer(訳)", + "support.kind.aiBadge": "AI支援", + "support.progress.closed.title": "チケット closed", + "support.progress.closed.message": "This conversation is closed. 開く a new チケット if you still need help.", + "support.progress.resolved.title": "Marked resolved(訳)", + "support.progress.resolved.message": "We believe this is sorted. Reply to reopen, or leave a quick rating below.(訳)", + "support.progress.quickAnswer.title": "Quick answer sent(訳)", + "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply here — a human will take over.(訳)", + "support.progress.onIt.title": "We're on it(訳)", + "support.progress.onIt.handedMessage": "A サポート teammate has your チケット and will reply in this thread.", + "support.progress.onIt.pendingMessage": "サポート is reviewing your message. You will see updates in this thread.", + "support.progress.received.title": "チケット received", + "support.progress.received.message": "Thanks — we have your request. Automated help may appear shortly, or a teammate will reply.(訳)", + "support.category.billing": "請求", + "support.category.billing.help": "請求書, payment methods, plan changes, and Stripe receipts.", + "support.category.billing_credits": "請求 / credits", + "support.category.billing_credits.help": "Credit balance, usage quotas, and top-ups.(訳)", + "support.category.bug": "Bug / error(訳)", + "support.category.bug.help": "Unexpected errors, broken screens, or steps that fail every time.(訳)", + "support.category.account": "Account / access(訳)", + "support.category.account.help": "Login, invites, 会社 membership, and permissions.", + "support.category.integrations": "連携", + "support.category.integrations.help": "WooCommerce、Shopify、公開 API、またはコネクタ設定。", + "support.category.processing": "処理 / AI", + "support.category.processing.help": "商品 処理, AI prompts, and generation quality.", + "support.category.export": "エクスポート / channels", + "support.category.export.help": "エクスポート フィード, channels, and sync destinations.", + "support.category.migration": "移行/データ", + "support.category.migration.help": "カットオーバー後の欠落・誤データ — 商品、フィード、ストア、請求、チーム。", + "support.category.other": "その他", + "support.category.other.help": "Anything else — we will route it to the right teammate.(訳)", + "support.priority.low": "低", + "support.priority.low.help": "Nice-to-have or non-blocking — we will get to it in turn.(訳)", + "support.priority.normal": "通常", + "support.priority.normal.help": "Standard request. Most チケット use this.", + "support.priority.high": "高", + "support.priority.high.help": "Blocking work or revenue impact — use sparingly.(訳)", + "support.csat.thanks": "フィードバックありがとうございます", + "support.csat.unavailable": "評価は一時的に利用できません。後でもう一度お試しください。", + "support.csat.unavailableTitle": "評価は利用できません", + "support.csat.alreadyRated": "このチケットは既に評価済みです。", + "support.csat.alreadyRatedTitle": "評価済み", + "support.csat.submitFailed": "評価を送信できませんでした", + "support.csat.yourRating": "Your rating(訳)", + "support.csat.ratedOutOf": "You rated this チケット {score} out of 5", + "support.csat.howDidWeDo": "How did we do?(訳)", + "support.csat.formHelp": "This チケット is {status}. Rate your experience (1–5). 任意 comment helps us improve.", + "support.csat.rating": "評価", + "support.csat.scoreAria": "{value} — {label}(訳)", + "support.csat.whatWentWrong": "What went wrong? (任意)", + "support.csat.whatWentWrongPlaceholder": "A short note helps us follow up.(訳)", + "support.csat.anythingElse": "Anything else? (任意)", + "support.csat.optionalFeedback": "任意 フィードback", + "support.csat.submit": "Submit rating(訳)", + "support.csat.score.1": "Very dissatisfied(訳)", + "support.csat.score.2": "Dissatisfied(訳)", "support.csat.score.3": "OK", - "support.csat.score.4": "Satisfied(訳)", - "support.csat.score.5": "Very satisfied(訳)", - "catalog.delete": "削除", - "catalog.deleting": "削除中…", - "catalog.saving": "保存中…", - "catalog.adding": "追加中…", - "catalog.assigning": "割り当て中…", - "catalog.uploading": "アップロード中…", - "catalog.create": "作成", - "catalog.createFailed": "作成に失敗しました", - "catalog.updateFailed": "更新に失敗しました", - "catalog.deleteFailed": "削除に失敗しました", - "catalog.importFailed": "インポートに失敗しました", - "catalog.confirm": "確認", - "catalog.confirmDeletion": "削除の確認", - "catalog.areYouSure": "よろしいですか?", - "catalog.previous": "前へ", - "catalog.next": "次へ", - "catalog.expand": "展開", - "catalog.collapse": "折りたたむ", - "catalog.clearSearch": "検索をクリア", - "catalog.clearFilters": "フィルタをクリア", - "catalog.clearSelection": "選択をクリア", - "catalog.add": "追加", - "catalog.update": "更新", - "catalog.edit": "編集", - "catalog.accept": "承認", - "catalog.reject": "却下", - "catalog.reset": "リセット", - "catalog.undo": "元に戻す", - "catalog.close": "閉じる", - "catalog.closePanel": "パネルを閉じる", - "catalog.closeMenus": "メニューを閉じる", - "catalog.openMenu": "メニューを開く", - "catalog.loading": "読み込み中…", - "catalog.empty": "空", - "catalog.required": "必須", - "catalog.optional": "任意", - "catalog.features": "機能", - "catalog.csvImportFinished": "CSVインポートが完了しました。", - "catalog.comparePlans": "プランを比較", - "catalog.saveChanges": "変更を保存", - "catalog.saveFormula": "数式を保存", - "catalog.saveFormulaShort": "数式を保存", - "catalog.noResults": "結果なし", - "products.title": "商品", - "products.description": "カタログを閲覧・確認・処理します。", - "products.loadFailed": "商品の読み込みに失敗しました", - "products.unnamed": "無名の商品", - "products.tabs.navLabel": "商品ビュー", - "products.tab.processed": "処理済み", - "products.tab.processedHint": "エクスポートまたは同期の準備ができた商品", - "products.tab.needsReview": "要確認", - "products.tab.needsReviewHint": "承認・編集・拒否待ちのエンリッチ済み商品", - "products.tab.needsReviewShort": "確認", - "products.tab.error": "エラー", - "products.tab.errorHint": "ジョブ中に失敗した商品", - "products.tab.processing": "処理中", - "products.tab.processingHint": "実行中のジョブにある商品", - "products.tab.busy": "処理中", - "products.tab.unprocessed": "未処理", - "products.tab.unprocessedHint": "まだ処理していないカタログ商品", - "products.tab.raw": "未処理", - "products.status.processed": "処理済み", - "products.status.needsReview": "要確認", - "products.status.processing": "処理", - "products.status.error": "エラー", - "products.status.failed": "失敗", - "products.status.unprocessed": "未処理", - "products.status.pending": "保留中", - "products.status.unknown": "不明", - "products.pagination.showing": "{total} 件中 {start}–{end} を表示", - "products.empty.processing.title": "ジョブはまだありません", - "products.empty.processing.messageJobs": "実行中のジョブはありません。未処理から開始するか、処理ページで進捗を確認してください。", - "products.empty.processing.messageBasic": "ジョブ実行中の商品がここに表示されます。", - "products.empty.needsReview.title": "要レビューの商品はありません", - "products.empty.needsReview.message": "処理ジョブ完了後、エンリッチ済み商品がここに表示されます。行を開いて原文と比較し、承認・編集・拒否してください。", - "products.empty.error.title": "エラーのある商品はありません", - "products.empty.error.message": "商品の処理に失敗するとここに表示され、再試行できます。", - "products.empty.noUnprocessedMatches": "未処理の一致はありません", - "products.empty.noMatch": "一致する商品はありません", - "products.empty.filtersHint": "別の検索・カテゴリ・フィードを試すか、フィルタをクリアしてすべてを表示してください。", - "products.empty.noUnprocessed.title": "未処理の商品はまだありません", - "products.empty.noUnprocessed.message": "サプライヤーフィードを接続するかCSVをアップロードして商品をカタログに取り込みます。", - "products.empty.none.title": "商品はまだありません", - "products.empty.none.messageStores": "先に Feeds → Map → Sync を完了し、その後 Process。フィードまたはストアからインポートしてください。", - "products.empty.none.messageBasic": "先に Feeds → Map → Sync を完了し、その後 Process。フィードを接続するか CSV をアップロードしてください。", - "products.actions.viewJobs": "ジョブを表示", - "products.actions.startJob": "ジョブを開始", - "products.actions.viewProcessed": "処理済みを表示", - "products.actions.retryFromCatalog": "カタログから再試行", - "products.actions.connectFeed": "Feedを接続", - "products.actions.addProduct": "商品を追加", - "products.actions.uploadCsv": "CSVをアップロード", - "products.actions.exportSelected": "選択をエクスポート", - "products.export.title": "選択した商品をエクスポート", - "products.export.confirm": "エクスポートを確認", - "products.export.loadFailed": "エクスポートフィードオプションの読み込みに失敗しました。もう一度お試しください。", - "products.export.noneFound": "エクスポートフィードはまだありません。エクスポートフィードで作成してから、選択した商品のエクスポートに戻ってください。", - "products.export.selectFormat": "エクスポートフィードを選択してください。", - "products.export.failed": "選択した商品をエクスポートできませんでした", - "products.upload.title": "CSVをアップロード", - "products.upload.description": "CSVから商品をインポートします(GTIN/EAN、名前、カテゴリなど)。サンプルをダウンロードして全列セットを確認してください。", - "products.upload.submit": "アップロードしてインポート", - "products.upload.chooseFirst": "先にCSVファイルを選択してください。", - "products.upload.csvOnly": "CSVファイルをアップロードしてください。", + "support.csat.score.4": "Satisfied(訳)", + "support.csat.score.5": "Very satisfied(訳)", + "catalog.delete": "削除", + "catalog.deleting": "削除中…", + "catalog.saving": "保存中…", + "catalog.adding": "追加中…", + "catalog.assigning": "割り当て中…", + "catalog.uploading": "アップロード中…", + "catalog.create": "作成", + "catalog.createFailed": "作成に失敗しました", + "catalog.updateFailed": "更新に失敗しました", + "catalog.deleteFailed": "削除に失敗しました", + "catalog.importFailed": "インポートに失敗しました", + "catalog.confirm": "確認", + "catalog.confirmDeletion": "削除の確認", + "catalog.areYouSure": "よろしいですか?", + "catalog.previous": "前へ", + "catalog.next": "次へ", + "catalog.expand": "展開", + "catalog.collapse": "折りたたむ", + "catalog.clearSearch": "検索をクリア", + "catalog.clearFilters": "フィルタをクリア", + "catalog.clearSelection": "選択をクリア", + "catalog.add": "追加", + "catalog.update": "æ›´æ–°", + "catalog.edit": "編集", + "catalog.accept": "承認", + "catalog.reject": "却下", + "catalog.reset": "リセット", + "catalog.undo": "元に戻す", + "catalog.close": "閉じる", + "catalog.closePanel": "パネルを閉じる", + "catalog.closeMenus": "メニューを閉じる", + "catalog.openMenu": "メニューを開く", + "catalog.loading": "読み込み中…", + "catalog.empty": "空", + "catalog.required": "å¿…é ˆ", + "catalog.optional": "任意", + "catalog.features": "機能", + "catalog.csvImportFinished": "CSVインポートが完了しました。", + "catalog.comparePlans": "プランを比較", + "catalog.saveChanges": "変更を保存", + "catalog.saveFormula": "数式を保存", + "catalog.saveFormulaShort": "数式を保存", + "catalog.noResults": "結果なし", + "products.title": "商品", + "products.description": "カタログを閲覧・確認・処理します。", + "products.loadFailed": "商品の読み込みに失敗しました", + "products.unnamed": "無名の商品", + "products.tabs.navLabel": "商品ビュー", + "products.tab.processed": "処理済み", + "products.tab.processedHint": "エクスポートまたは同期の準備ができた商品", + "products.tab.needsReview": "要確認", + "products.tab.needsReviewHint": "承認・編集・拒否待ちのエンリッチ済み商品", + "products.tab.needsReviewShort": "確認", + "products.tab.error": "エラー", + "products.tab.errorHint": "ジョブ中に失敗した商品", + "products.tab.processing": "処理中", + "products.tab.processingHint": "実行中のジョブにある商品", + "products.tab.busy": "処理中", + "products.tab.unprocessed": "未処理", + "products.tab.unprocessedHint": "まだ処理していないカタログ商品", + "products.tab.raw": "未処理", + "products.status.processed": "処理済み", + "products.status.needsReview": "要確認", + "products.status.processing": "処理", + "products.status.error": "エラー", + "products.status.failed": "失敗", + "products.status.unprocessed": "未処理", + "products.status.pending": "保留中", + "products.status.unknown": "不明", + "products.pagination.showing": "{total} 件中 {start}–{end} を表示", + "products.empty.processing.title": "ジョブはまだありません", + "products.empty.processing.messageJobs": "実行中のジョブはありません。未処理から開始するか、処理ページで進捗を確認してください。", + "products.empty.processing.messageBasic": "ジョブ実行中の商品がここに表示されます。", + "products.empty.needsReview.title": "要レビューの商品はありません", + "products.empty.needsReview.message": "処理ジョブ完了後、エンリッチ済み商品がここに表示されます。行を開いて原文と比較し、承認・編集・拒否してください。", + "products.empty.error.title": "エラーのある商品はありません", + "products.empty.error.message": "商品の処理に失敗するとここに表示され、再試行できます。", + "products.empty.noUnprocessedMatches": "未処理の一致はありません", + "products.empty.noMatch": "一致する商品はありません", + "products.empty.filtersHint": "別の検索・カテゴリ・フィードを試すか、フィルタをクリアしてすべてを表示してください。", + "products.empty.noUnprocessed.title": "未処理の商品はまだありません", + "products.empty.noUnprocessed.message": "サプライヤーフィードを接続するかCSVをアップロードして商品をカタログに取り込みます。", + "products.empty.none.title": "商品はまだありません", + "products.empty.none.messageStores": "先に Feeds → Map → Sync を完了し、その後 Process。フィードまたはストアからインポートしてください。", + "products.empty.none.messageBasic": "先に Feeds → Map → Sync を完了し、その後 Process。フィードを接続するか CSV をアップロードしてください。", + "products.actions.viewJobs": "ジョブを表示", + "products.actions.startJob": "ジョブを開始", + "products.actions.viewProcessed": "処理済みを表示", + "products.actions.retryFromCatalog": "カタログから再試行", + "products.actions.connectFeed": "Feedを接続", + "products.actions.addProduct": "商品を追加", + "products.actions.uploadCsv": "CSVをアップロード", + "products.actions.exportSelected": "選択をエクスポート", + "products.export.title": "選択した商品をエクスポート", + "products.export.confirm": "エクスポートを確認", + "products.export.loadFailed": "エクスポートフィードオプションの読み込みに失敗しました。もう一度お試しください。", + "products.export.noneFound": "エクスポートフィードはまだありません。エクスポートフィードで作成してから、選択した商品のエクスポートに戻ってください。", + "products.export.selectFormat": "エクスポートフィードを選択してください。", + "products.export.failed": "選択した商品をエクスポートできませんでした", + "products.upload.title": "CSVをアップロード", + "products.upload.description": "CSVから商品をインポートします(GTIN/EAN、名前、カテゴリなど)。サンプルをダウンロードして全列セットを確認してください。", + "products.upload.submit": "アップロードしてインポート", + "products.upload.chooseFirst": "先にCSVファイルを選択してください。", + "products.upload.csvOnly": "CSVファイルをアップロードしてください。", "products.upload.tooLarge": "CSV must be 5 MB or smaller.", - "products.processing.started": "処理ジョブを開始しました", - "products.processing.startFailed": "処理を開始できませんでした", - "products.processing.startJobFailed": "処理ジョブを開始できませんでした", - "products.processing.cancelled": "処理をキャンセルしました", - "products.processing.jobsCancelled": "処理ジョブをキャンセルしました", - "products.processing.cancelFailed": "処理ジョブをキャンセルできませんでした", - "products.processing.justCancelled": "開始直後のジョブがキャンセルされました。", - "products.processing.viewInProcessing": "処理で表示", - "products.processing.confirm": "処理を確認", - "products.processing.freePlanTitle": "Freeプラン — AIなしで処理", - "products.processing.freePlanBody": "通常ize, specs, fill, and EPREL run at no credit cost. AI titles/descriptions require a paid plan or credits.", - "products.enrichment.acceptTitle": "エンリッチメントを承認しますか?", - "products.enrichment.acceptConfirm": "エンリッチメント承認を確認", - "products.enrichment.acceptSelected": "選択した {count} 件の商品のエンリッチメントを承認しますか?処理済みに移動します。", - "products.enrichment.rejectConfirm": "エンリッチメント拒否を確認", - "products.enrichment.rejectBody": "エンリッチメントを拒否し、この商品を未処理に戻しますか?後で再処理できます。", - "products.enrichment.rejectSelectedConfirm": "選択の拒否を確認", - "products.enrichment.resetConfirm": "未処理へのリセットを確認", - "products.enrichment.resetSelected": "選択した {count} 件を未処理にリセットしますか?未処理アイテムとして再表示されます。", - "products.enrichment.accepted": "エンリッチメントを承認 — 処理済みに移動しました。", - "products.enrichment.rejected": "エンリッチメントを拒否 — 商品を未処理に戻しました。", - "products.enrichment.acceptFailed": "エンリッチメントを承認できませんでした", - "products.enrichment.rejectFailed": "エンリッチメントを拒否できませんでした", - "products.enrichment.acceptUndone": "承認を取り消しました", - "products.enrichment.undoAcceptFailed": "承認の取り消しに失敗しました", - "products.enrichment.resetDone": "商品を未処理に戻しました。", - "products.enrichment.resetFailed": "商品をリセットできませんでした", - "products.enrichment.valueReset": "エンリッチ値を元に戻しました。", - "products.enrichment.originalEmpty": "元の値が空のため、PATCHではエンリッチメントをクリアできません。", - "products.enrichment.staysNeedsReview": "すべて承認するまで商品は要レビューのままです。", - "products.field.nameAcceptUndone": "名前の承認を取り消しました", - "products.field.descriptionAcceptUndone": "説明の承認を取り消しました", - "products.field.nameDiscardUndone": "名前の破棄を取り消しました", - "products.field.descriptionDiscardUndone": "説明の破棄を取り消しました", - "products.field.undoAcceptFailed": "フィールド承認の取り消しに失敗しました", - "products.field.undoDiscardFailed": "フィールド破棄の取り消しに失敗しました", - "products.updateFailed": "商品を更新できませんでした", - "products.keyboardTips": "キーボードのヒント", - "products.keyboardTipsShort": "キーボードのヒント(?)", - "products.option.categories": "カテゴリ", - "products.option.attributes": "属性 / 仕様", - "products.option.titlesAi": "タイトル(AI)", - "products.option.descriptionsAi": "説明(AI)", - "products.enrichment.piece.name": "名前", - "products.enrichment.piece.description": "説明", - "products.enrichment.piece.attributes": "属性", - "products.enrichment.piece.category": "カテゴリ", - "products.enrichment.state.processed": "処理済み", - "products.enrichment.state.feed": "フィードから", - "products.enrichment.state.missing": "不足", - "products.enrichment.help.name": "商品タイトル。緑 = AI処理済みの名前、オレンジ = フィード/元の名前のみ、グレー = 未設定。", - "products.enrichment.help.description": "商品説明。緑 = AI処理済み、オレンジ = フィード/元のみ、グレー = 未設定。", - "products.enrichment.help.attributes": "仕様と属性。緑 = AI/エンリッチ済み属性、オレンジ = フィードのみ、グレー = なし。", - "products.enrichment.help.category": "割り当てられたカテゴリ。緑 = カテゴリ設定済み、グレー = 未設定。", - "products.enrichment.chipTitle": "{label}: {state}。{help}", - "products.enrichment.complete": "完了 — {parts}", - "products.enrichment.missingSummary": "不足 {missing} — {parts}", - "products.issue.title": "タイトル", + "products.processing.started": "処理ジョブを開始しました", + "products.processing.startFailed": "処理を開始できませんでした", + "products.processing.startJobFailed": "処理ジョブを開始できませんでした", + "products.processing.cancelled": "処理をキャンセルしました", + "products.processing.jobsCancelled": "処理ジョブをキャンセルしました", + "products.processing.cancelFailed": "処理ジョブをキャンセルできませんでした", + "products.processing.justCancelled": "開始直後のジョブがキャンセルされました。", + "products.processing.viewInProcessing": "処理で表示", + "products.processing.confirm": "処理を確認", + "products.processing.freePlanTitle": "Freeプラン — AIなしで処理", + "products.processing.freePlanBody": "通常ize, specs, fill, and EPREL run at no credit cost. AI titles/descriptions require a paid plan or credits.", + "products.enrichment.acceptTitle": "エンリッチメントを承認しますか?", + "products.enrichment.acceptConfirm": "エンリッチメント承認を確認", + "products.enrichment.acceptSelected": "選択した {count} 件の商品のエンリッチメントを承認しますか?処理済みに移動します。", + "products.enrichment.rejectConfirm": "エンリッチメント拒否を確認", + "products.enrichment.rejectBody": "エンリッチメントを拒否し、この商品を未処理に戻しますか?後で再処理できます。", + "products.enrichment.rejectSelectedConfirm": "選択の拒否を確認", + "products.enrichment.resetConfirm": "未処理へのリセットを確認", + "products.enrichment.resetSelected": "選択した {count} 件を未処理にリセットしますか?未処理アイテムとして再表示されます。", + "products.enrichment.accepted": "エンリッチメントを承認 — 処理済みに移動しました。", + "products.enrichment.rejected": "エンリッチメントを拒否 — 商品を未処理に戻しました。", + "products.enrichment.acceptFailed": "エンリッチメントを承認できませんでした", + "products.enrichment.rejectFailed": "エンリッチメントを拒否できませんでした", + "products.enrichment.acceptUndone": "承認を取り消しました", + "products.enrichment.undoAcceptFailed": "承認の取り消しに失敗しました", + "products.enrichment.resetDone": "商品を未処理に戻しました。", + "products.enrichment.resetFailed": "商品をリセットできませんでした", + "products.enrichment.valueReset": "エンリッチ値を元に戻しました。", + "products.enrichment.originalEmpty": "元の値が空のため、PATCHではエンリッチメントをクリアできません。", + "products.enrichment.staysNeedsReview": "すべて承認するまで商品は要レビューのままです。", + "products.field.nameAcceptUndone": "名前の承認を取り消しました", + "products.field.descriptionAcceptUndone": "説明の承認を取り消しました", + "products.field.nameDiscardUndone": "名前の破棄を取り消しました", + "products.field.descriptionDiscardUndone": "説明の破棄を取り消しました", + "products.field.undoAcceptFailed": "フィールド承認の取り消しに失敗しました", + "products.field.undoDiscardFailed": "フィールド破棄の取り消しに失敗しました", + "products.updateFailed": "商品を更新できませんでした", + "products.keyboardTips": "キーボードのヒント", + "products.keyboardTipsShort": "キーボードのヒント(?)", + "products.option.categories": "カテゴリ", + "products.option.attributes": "属性 / 仕様", + "products.option.titlesAi": "タイトル(AI)", + "products.option.descriptionsAi": "説明(AI)", + "products.enrichment.piece.name": "名前", + "products.enrichment.piece.description": "説明", + "products.enrichment.piece.attributes": "属性", + "products.enrichment.piece.category": "カテゴリ", + "products.enrichment.state.processed": "処理済み", + "products.enrichment.state.feed": "フィードから", + "products.enrichment.state.missing": "不足", + "products.enrichment.help.name": "商品タイトル。緑 = AI処理済みの名前、オレンジ = フィード/元の名前のみ、グレー = 未設定。", + "products.enrichment.help.description": "商品説明。緑 = AI処理済み、オレンジ = フィード/元のみ、グレー = 未設定。", + "products.enrichment.help.attributes": "仕様と属性。緑 = AI/エンリッチ済み属性、オレンジ = フィードのみ、グレー = なし。", + "products.enrichment.help.category": "割り当てられたカテゴリ。緑 = カテゴリ設定済み、グレー = 未設定。", + "products.enrichment.chipTitle": "{label}: {state}。{help}", + "products.enrichment.complete": "完了 — {parts}", + "products.enrichment.missingSummary": "不足 {missing} — {parts}", + "products.issue.title": "タイトル", "products.issue.gtin": "GTIN", - "products.issue.category": "カテゴリ", - "products.filters.allCategories": "すべてのカテゴリ", - "products.filters.allFeeds": "すべてのフィード", - "products.filters.allCoverage": "すべてのカバレッジ", - "products.filters.anyFeedChange": "フィードの変更すべて", - "products.filters.eprelAll": "EPREL: すべて", - "products.filters.feedChangesAll": "フィードの変更: すべて", - "products.filters.byCategory": "カテゴリで絞り込む", - "products.filters.byCoverage": "カバレッジで絞り込む", - "products.filters.byFeed": "フィードで絞り込み", - "products.filters.byEprel": "EPRELで絞り込み", - "products.filters.byFeedSync": "フィード同期の変更で絞り込む", - "products.filters.coverageHint": "名前 / 説明 / 属性 / カテゴリの充足度で絞り込む", - "products.filters.feedSyncHint": "最新フィード同期による価格・在庫・タイトル変更で絞り込む", - "products.filters.eprelHint": "EPRELエネルギーラベル登録IDの有無で商品を絞り込む", - "products.filters.availabilityChanged": "在庫状況が変更されました", - "products.eprel.badgeTitle": "この商品にEPREL IDがあります(European Product Registry for Energy Labelling)。", - "products.eprel.help": "この商品に European Product Registry for Energy Labelling(EPREL)IDがあります。", - "products.feedData": "フィードデータ", - "attributes.title": "属性", - "attributes.description": "商品フィールド、リスト値、カテゴリ割り当てを定義します。", - "attributes.loadFailed": "属性の読み込みに失敗しました", - "attributes.loading": "属性を読み込み中…", - "attributes.zero": "属性0件", - "attributes.addNew": "新しい属性を追加", - "attributes.create": "属性を作成", - "attributes.edit": "属性を編集", - "attributes.delete": "属性を削除", - "attributes.displayName": "属性の表示名", - "attributes.actions": "属性の操作", - "attributes.created": "属性を作成しました。", - "attributes.createdAssignFailed": "属性は作成されましたが、カテゴリの割り当てに失敗しました。", - "attributes.updated": "属性を更新しました。", - "attributes.deleted": "属性を削除しました。", - "attributes.addValue": "値を追加", - "attributes.manageValues": "このリスト属性の値を追加、編集、または削除します。", - "attributes.valueTypeHint": "この属性の値の入力方法を選択してください。", - "attributes.createDescription": "新しい属性定義を作成します。作成時にカテゴリへ割り当てできます。", - "attributes.assignToCategories": "属性をカテゴリに割り当て", - "attributes.assignFailed": "選択したカテゴリに属性を割り当てられませんでした。", - "attributes.bulkAssignFailed": "一括割り当てに失敗しました", - "attributes.filterByCategory": "カテゴリで絞り込む", - "attributes.saveValueFailed": "値を保存できませんでした", - "attributes.deleteValueFailed": "値を削除できませんでした", - "attributes.csvNeedHeader": "CSVにはヘッダーと少なくとも1行が必要です", - "attributes.csvNeedColumns": "CSVには \"category_id\" と \"attribute_key\" 列が必要です", - "attributes.type.string": "テキスト", - "attributes.type.stringHint": "自由テキスト — 名前、モデル、短いメモ", - "attributes.type.number": "数値", - "attributes.type.numberHint": "数値。必要に応じて単位を追加(cm、kg、W)", - "attributes.type.boolean": "はい / いいえ", - "attributes.type.booleanHint": "真または偽 — 例: GPSあり、ワイヤレス充電", - "attributes.type.date": "日付", - "attributes.type.dateHint": "カレンダー日付(発売日、保証終了など)", - "attributes.type.list": "ドロップダウン", - "attributes.type.listHint": "定義済みリストからオプションを1つだけ選択", - "attributes.type.multiselect": "複数選択", - "attributes.type.multiselectHint": "リストから1つ以上のオプションを選択", - "attributes.color": "色", - "categories.title": "カテゴリ", - "categories.description": "カタログ階層を整理します。カテゴリを編集してタイトル/説明の数式とAIプロンプトを開きます。", - "categories.loadFailed": "カテゴリの読み込みに失敗しました", - "categories.add": "カテゴリを追加", - "categories.edit": "カテゴリを編集", - "categories.delete": "カテゴリを削除", - "categories.deleteConfirm": "このカテゴリを削除してもよろしいですか?この操作は元に戻せません。", - "categories.name": "カテゴリ名", - "categories.namePlaceholder": "カテゴリ名", - "categories.descriptionPlaceholder": "任意のカテゴリ説明", - "categories.uniqueIdPlaceholder": "任意の一意ID", - "categories.searchPlaceholder": "名前またはIDで検索...", - "categories.created": "{name} を作成しました。", - "categories.updated": "カテゴリを正常に更新しました。", - "categories.deleted": "カテゴリを正常に削除しました。", - "categories.notFound": "カテゴリが見つかりません。", - "categories.loadCategoryFailed": "カテゴリの読み込みに失敗しました", - "categories.noCategoriesYet": "カテゴリがまだありません", - "categories.noMatch": "“{query}” に一致するカテゴリはありません。検索をクリアするか別の語句を試してください。", - "categories.emptyHint": "カテゴリを追加するかCSVをインポートしてツリーを構築します。", - "categories.promptCountOne": "{count} 件のカテゴリにAI生成プロンプトがあります。⋮ メニュー → AIプロンプトを編集、またはカテゴリを編集してAIプロンプトを編集を選んでください。", - "categories.promptCountMany": "{count} 件のカテゴリにAI生成プロンプトがあります。⋮ メニュー → AIプロンプトを編集、またはカテゴリを編集してAIプロンプトを編集を選んでください。", - "categories.actions": "カテゴリ操作", - "categories.chooseCsv": "CSVを選択", - "categories.createSingleOrImport": "カテゴリを1件作成するか、CSVからまとめてインポートします。", - "categories.createSingle": "カテゴリを1件作成。", - "categories.missingNameColumn": "必須列 'name' がありません", - "categories.missingUniqueIdColumn": "必須列 'unique_id' がありません", - "categories.nameAndIdRequired": "名前と一意のIDは必須です。", - "categories.csvNeedRows": "ファイルにはヘッダー行と少なくとも1行のデータが必要です", - "categories.titleFormula": "タイトル数式", - "categories.descriptionFormula": "説明数式", - "categories.setTitleFormula": "タイトル数式を設定", - "categories.editTitleFormula": "タイトル数式を編集", - "categories.setDescriptionFormula": "説明数式を設定", - "categories.editDescriptionFormula": "説明数式を編集", - "categories.setAiPrompt": "AIプロンプトを設定", - "categories.editAiPrompt": "AIプロンプトを編集", - "categories.editAiPromptShort": "AIプロンプトを編集", - "categories.aiPromptSet": "AI生成プロンプトが設定されています", - "categories.aiPromptTitle": "カテゴリAIプロンプト", - "categories.aiPromptDescription": "このカテゴリの商品を強化するときに使うカテゴリ別生成テンプレート。", - "categories.aiPromptSaved": "AIプロンプトを保存しました。", - "categories.aiPromptCleared": "AIプロンプトをクリアしました(会社のデフォルトが適用されます)。", - "categories.aiPromptSaveFailed": "プロンプトの保存に失敗しました", - "categories.aiPromptAssignFailed": "プロンプトの割り当てに失敗しました", - "categories.assignAiPrompt": "AIプロンプトを割り当て", - "categories.assignAiPromptHelp": "このAI生成プロンプトを他のカテゴリにコピーします。", - "categories.loadingPrompt": "プロンプトを読み込み中…", - "categories.brandVoice": "ブランドボイス", - "categories.productName": "商品名", + "products.issue.category": "カテゴリ", + "products.filters.allCategories": "すべてのカテゴリ", + "products.filters.allFeeds": "すべてのフィード", + "products.filters.allCoverage": "すべてのカバレッジ", + "products.filters.anyFeedChange": "フィードの変更すべて", + "products.filters.eprelAll": "EPREL: すべて", + "products.filters.feedChangesAll": "フィードの変更: すべて", + "products.filters.byCategory": "カテゴリで絞り込む", + "products.filters.byCoverage": "カバレッジで絞り込む", + "products.filters.byFeed": "フィードで絞り込み", + "products.filters.byEprel": "EPRELで絞り込み", + "products.filters.byFeedSync": "フィード同期の変更で絞り込む", + "products.filters.coverageHint": "名前 / 説明 / 属性 / カテゴリの充足度で絞り込む", + "products.filters.feedSyncHint": "最新フィード同期による価格・在庫・タイトル変更で絞り込む", + "products.filters.eprelHint": "EPRELエネルギーラベル登録IDの有無で商品を絞り込む", + "products.filters.availabilityChanged": "在庫状況が変更されました", + "products.eprel.badgeTitle": "この商品にEPREL IDがあります(European Product Registry for Energy Labelling)。", + "products.eprel.help": "この商品に European Product Registry for Energy Labelling(EPREL)IDがあります。", + "products.feedData": "フィードデータ", + "attributes.title": "属性", + "attributes.description": "商品フィールド、リスト値、カテゴリ割り当てを定義します。", + "attributes.loadFailed": "属性の読み込みに失敗しました", + "attributes.loading": "属性を読み込み中…", + "attributes.zero": "属性0ä»¶", + "attributes.addNew": "新しい属性を追加", + "attributes.create": "属性を作成", + "attributes.edit": "属性を編集", + "attributes.delete": "属性を削除", + "attributes.displayName": "属性の表示名", + "attributes.actions": "属性の操作", + "attributes.created": "属性を作成しました。", + "attributes.createdAssignFailed": "属性は作成されましたが、カテゴリの割り当てに失敗しました。", + "attributes.updated": "属性を更新しました。", + "attributes.deleted": "属性を削除しました。", + "attributes.addValue": "値を追加", + "attributes.manageValues": "このリスト属性の値を追加、編集、または削除します。", + "attributes.valueTypeHint": "この属性の値の入力方法を選択してください。", + "attributes.createDescription": "新しい属性定義を作成します。作成時にカテゴリへ割り当てできます。", + "attributes.assignToCategories": "属性をカテゴリに割り当て", + "attributes.assignFailed": "選択したカテゴリに属性を割り当てられませんでした。", + "attributes.bulkAssignFailed": "一括割り当てに失敗しました", + "attributes.filterByCategory": "カテゴリで絞り込む", + "attributes.saveValueFailed": "値を保存できませんでした", + "attributes.deleteValueFailed": "値を削除できませんでした", + "attributes.csvNeedHeader": "CSVにはヘッダーと少なくとも1行が必要です", + "attributes.csvNeedColumns": "CSVには \"category_id\" と \"attribute_key\" 列が必要です", + "attributes.type.string": "テキスト", + "attributes.type.stringHint": "自由テキスト — 名前、モデル、短いメモ", + "attributes.type.number": "数値", + "attributes.type.numberHint": "数値。必要に応じて単位を追加(cm、kg、W)", + "attributes.type.boolean": "はい / いいえ", + "attributes.type.booleanHint": "真または偽 — 例: GPSあり、ワイヤレス充電", + "attributes.type.date": "日付", + "attributes.type.dateHint": "カレンダー日付(発売日、保証終了など)", + "attributes.type.list": "ドロップダウン", + "attributes.type.listHint": "定義済みリストからオプションを1つだけ選択", + "attributes.type.multiselect": "複数選択", + "attributes.type.multiselectHint": "リストから1つ以上のオプションを選択", + "attributes.color": "色", + "categories.title": "カテゴリ", + "categories.description": "カタログ階層を整理します。カテゴリを編集してタイトル/説明の数式とAIプロンプトを開きます。", + "categories.loadFailed": "カテゴリの読み込みに失敗しました", + "categories.add": "カテゴリを追加", + "categories.edit": "カテゴリを編集", + "categories.delete": "カテゴリを削除", + "categories.deleteConfirm": "このカテゴリを削除してもよろしいですか?この操作は元に戻せません。", + "categories.name": "カテゴリ名", + "categories.namePlaceholder": "カテゴリ名", + "categories.descriptionPlaceholder": "任意のカテゴリ説明", + "categories.uniqueIdPlaceholder": "任意の一意ID", + "categories.searchPlaceholder": "名前またはIDで検索...", + "categories.created": "{name} を作成しました。", + "categories.updated": "カテゴリを正常に更新しました。", + "categories.deleted": "カテゴリを正常に削除しました。", + "categories.notFound": "カテゴリが見つかりません。", + "categories.loadCategoryFailed": "カテゴリの読み込みに失敗しました", + "categories.noCategoriesYet": "カテゴリがまだありません", + "categories.noMatch": "“{query}” に一致するカテゴリはありません。検索をクリアするか別の語句を試してください。", + "categories.emptyHint": "カテゴリを追加するかCSVをインポートしてツリーを構築します。", + "categories.promptCountOne": "{count} 件のカテゴリにAI生成プロンプトがあります。⋮ メニュー → AIプロンプトを編集、またはカテゴリを編集してAIプロンプトを編集を選んでください。", + "categories.promptCountMany": "{count} 件のカテゴリにAI生成プロンプトがあります。⋮ メニュー → AIプロンプトを編集、またはカテゴリを編集してAIプロンプトを編集を選んでください。", + "categories.actions": "カテゴリ操作", + "categories.chooseCsv": "CSVを選択", + "categories.createSingleOrImport": "カテゴリを1件作成するか、CSVからまとめてインポートします。", + "categories.createSingle": "カテゴリを1件作成。", + "categories.missingNameColumn": "必須列 'name' がありません", + "categories.missingUniqueIdColumn": "必須列 'unique_id' がありません", + "categories.nameAndIdRequired": "名前と一意のIDは必須です。", + "categories.csvNeedRows": "ファイルにはヘッダー行と少なくとも1行のデータが必要です", + "categories.titleFormula": "タイトル数式", + "categories.descriptionFormula": "説明数式", + "categories.setTitleFormula": "タイトル数式を設定", + "categories.editTitleFormula": "タイトル数式を編集", + "categories.setDescriptionFormula": "説明数式を設定", + "categories.editDescriptionFormula": "説明数式を編集", + "categories.setAiPrompt": "AIプロンプトを設定", + "categories.editAiPrompt": "AIプロンプトを編集", + "categories.editAiPromptShort": "AIプロンプトを編集", + "categories.aiPromptSet": "AI生成プロンプトが設定されています", + "categories.aiPromptTitle": "カテゴリAIプロンプト", + "categories.aiPromptDescription": "このカテゴリの商品を強化するときに使うカテゴリ別生成テンプレート。", + "categories.aiPromptSaved": "AIプロンプトを保存しました。", + "categories.aiPromptCleared": "AIプロンプトをクリアしました(会社のデフォルトが適用されます)。", + "categories.aiPromptSaveFailed": "プロンプトの保存に失敗しました", + "categories.aiPromptAssignFailed": "プロンプトの割り当てに失敗しました", + "categories.assignAiPrompt": "AIプロンプトを割り当て", + "categories.assignAiPromptHelp": "このAI生成プロンプトを他のカテゴリにコピーします。", + "categories.loadingPrompt": "プロンプトを読み込み中…", + "categories.brandVoice": "ブランドボイス", + "categories.productName": "商品名", "categories.gtin": "GTIN", - "categories.backToCategories": "カテゴリに戻る", - "categories.cancelReturn": "キャンセルしてカテゴリに戻る", - "categories.assignFormula": "数式を割り当て", - "categories.assignFormulaOther": "数式を他のカテゴリに割り当て", - "categories.assignTitleFormula": "タイトル数式を割り当て", - "categories.assignDescriptionFormula": "説明数式を割り当て", - "categories.assignSelectHelp": "このテンプレートを適用するカテゴリを選択してください。", - "categories.assignTitleHelp": "このタイトル数式テンプレートを適用するカテゴリを選択してください。", - "categories.assignDescriptionHelp": "この説明数式テンプレートを適用するカテゴリを選択してください。", - "categories.searchCategories": "カテゴリを検索…", - "categories.matching": "(一致)", - "categories.titleFormulaHelp": "このカテゴリ向けに変数と静的テキストから商品タイトルを組み立てます。", - "categories.descriptionFormulaHelp": "このカテゴリ向けにAIが生成するSEOメタ文と本文セクションを定義します。", - "categories.loadingFormula": "数式を読み込み中…", - "categories.titleFormulaSaved": "タイトル数式を保存しました", - "categories.titleFormulaRemoved": "タイトル数式を削除しました", - "categories.titleFormulaSaveFailed": "タイトル数式の保存に失敗しました", - "categories.titleFormulaAssignFailed": "タイトル数式の割り当てに失敗しました", - "categories.descriptionFormulaRemoved": "説明数式を削除しました", - "categories.descriptionFormulaSaved": "説明フォーミュラを保存しました", - "categories.descriptionFormulaSavedWithExports": "説明フォーミュラを保存し、{count} 件のエクスポート ID を同期しました", - "categories.descriptionFormulaSaveFailed": "説明数式の保存に失敗しました", - "categories.descriptionFormulaAssignFailed": "説明数式の割り当てに失敗しました", - "categories.seoTitlePlaceholder": "AIにSEOタイトルの書き方を指示…", - "categories.seoDescriptionPlaceholder": "AIにSEO説明の書き方を指示…", - "categories.sectionPromptPlaceholder": "このセクションでAIに何を書かせますか?", - "categories.sectionKeyPlaceholder": "例: short_description(英数字と_)", - "categories.formulaElementTypes": "数式要素の種類", - "categories.formulaElements": "数式要素", - "categories.elementSeparator": "要素の区切り", - "categories.elementSeparatorHint": "スペース、ダッシュなど", - "categories.dragToReorder": "ドラッグして並び替え", - "categories.addCustomVariable": "カスタム変数を追加", - "categories.editCustomVariable": "カスタム変数を編集", - "categories.customVariableHelp": "タイトル数式用の再利用可能な変数を定義します。", - "categories.manageVariables": "変数を管理", - "categories.manageVariablesHelp": "タイトル数式で使える変数の表示・編集・追加。", - "categories.searchVariables": "変数を検索…", - "categories.variableAdded": "変数を追加しました", - "categories.variableUpdated": "変数を更新しました", - "categories.variableDeleted": "変数を削除しました", - "categories.variableDeleteFailed": "変数の削除に失敗しました", - "categories.variableNameRequired": "変数名は必須です", - "categories.displayNameRequired": "表示名は必須です", - "categories.variableNamePattern": "名前に使えるのは英数字とアンダースコアのみです", - "categories.deleteVariableConfirm": "この変数を削除してもよろしいですか?使用中の数式に影響する可能性があります。", - "categories.removeElementConfirm": "この要素を数式から削除してもよろしいですか?", - "categories.addTextElement": "テキスト要素を追加", - "categories.addTextElementHelp": "数式に静的テキスト要素を追加します。", - "categories.editTextElement": "テキスト要素を編集", - "categories.editTextElementHelp": "数式内のテキスト要素を編集します。", - "categories.staticTextPlaceholder": "静的テキストを入力", - "categories.textCannotBeEmpty": "テキストは空にできません", - "categories.exampleProductName": "商品名", - "categories.exampleWidget": "Acme Widget Pro(例)", - "fields.title": "標準フィールド", - "fields.description": "標準の商品フィールドを定義し、グループに整理します", - "fields.loading": "標準フィールドを読み込み中…", - "fields.loadFailed": "フィールドの読み込みに失敗しました", - "fields.loadGroupsFailed": "フィールドグループの読み込みに失敗しました", - "fields.addField": "新しいフィールドを追加", - "fields.addGroup": "新しいグループを追加", - "fields.createField": "フィールドを作成", - "fields.createGroup": "グループを作成", - "fields.editField": "フィールドを編集", - "fields.editGroup": "グループを編集", - "fields.basicInfo": "基本情報", - "fields.createFieldHelp": "商品データ用の新しい標準フィールドを作成", - "fields.editFieldHelp": "この標準フィールドの詳細を更新します", - "fields.createGroupHelp": "標準フィールドを整理する新しいグループを作成", - "fields.editGroupHelp": "このフィールドグループの詳細を更新します", - "fields.dataTypeHint": "このフィールドのデータ型", - "fields.defaultValueOptional": "デフォルト値(任意)", - "fields.fieldDescriptionPlaceholder": "このフィールドの説明を入力", - "fields.groupDescriptionPlaceholder": "このグループの説明を入力", - "fields.keyHint": "小文字・数字・アンダースコアのみ", - "fields.exampleTitle": "商品タイトル", - "fields.noFields": "フィールドが見つかりません。「フィールドを追加」をクリックして作成してください。", - "fields.noFieldsMatch": "検索に一致するフィールドがありません", - "fields.noGroups": "グループが見つかりません。最初のグループを作成してください。", - "fields.noGroupsMatch": "検索に一致するグループがありません", - "fields.fieldCreated": "フィールドを作成しました", - "fields.fieldUpdated": "フィールドを更新しました", - "fields.fieldDeleted": "フィールドを削除しました", - "fields.groupCreated": "グループを作成しました", - "fields.groupUpdated": "グループを更新しました", - "fields.groupDeleted": "グループを削除しました", - "fields.saveFieldFailed": "フィールドの保存に失敗しました", - "fields.saveGroupFailed": "グループの保存に失敗しました", - "fields.updateFieldFailed": "フィールドの更新に失敗しました", - "fields.updateUnitFailed": "単位の更新に失敗しました", - "fields.deleteFieldFailed": "フィールドの削除に失敗しました", - "fields.deleteGroupFailed": "グループの削除に失敗しました", - "fields.bulkUpdateFailed": "一括更新に失敗しました", - "fields.enableRecommendedFailed": "推奨フィールドの有効化に失敗しました", - "fields.enabledRecommended": "推奨のECフィールドを有効化しました", - "fields.deleteFieldConfirm": "この操作は元に戻せません。フィールドを完全に削除し、使用しているテンプレートからも取り除きます。", - "fields.deleteGroupConfirm": "この操作は元に戻せません。グループを完全に削除します。このグループのフィールドは再割り当てが必要です。", - "fields.type.string": "テキスト", - "fields.type.stringHint": "自由記述 — 名前、コード、短いメモ", - "fields.type.number": "数値", - "fields.type.numberHint": "数値。必要なら単位を追加(EUR、pcs)", - "fields.type.boolean": "はい / いいえ", - "fields.type.booleanHint": "真または偽", - "fields.type.date": "日付", - "fields.type.dateHint": "カレンダー上の日付", + "categories.backToCategories": "カテゴリに戻る", + "categories.cancelReturn": "キャンセルしてカテゴリに戻る", + "categories.assignFormula": "数式を割り当て", + "categories.assignFormulaOther": "数式を他のカテゴリに割り当て", + "categories.assignTitleFormula": "タイトル数式を割り当て", + "categories.assignDescriptionFormula": "説明数式を割り当て", + "categories.assignSelectHelp": "このテンプレートを適用するカテゴリを選択してください。", + "categories.assignTitleHelp": "このタイトル数式テンプレートを適用するカテゴリを選択してください。", + "categories.assignDescriptionHelp": "この説明数式テンプレートを適用するカテゴリを選択してください。", + "categories.searchCategories": "カテゴリを検索…", + "categories.matching": "(一致)", + "categories.titleFormulaHelp": "このカテゴリ向けに変数と静的テキストから商品タイトルを組み立てます。", + "categories.descriptionFormulaHelp": "このカテゴリ向けにAIが生成するSEOメタ文と本文セクションを定義します。", + "categories.loadingFormula": "数式を読み込み中…", + "categories.titleFormulaSaved": "タイトル数式を保存しました", + "categories.titleFormulaRemoved": "タイトル数式を削除しました", + "categories.titleFormulaSaveFailed": "タイトル数式の保存に失敗しました", + "categories.titleFormulaAssignFailed": "タイトル数式の割り当てに失敗しました", + "categories.descriptionFormulaRemoved": "説明数式を削除しました", + "categories.descriptionFormulaSaved": "説明フォーミュラを保存しました", + "categories.descriptionFormulaSavedWithExports": "説明フォーミュラを保存し、{count} 件のエクスポート ID を同期しました", + "categories.descriptionFormulaSaveFailed": "説明数式の保存に失敗しました", + "categories.descriptionFormulaAssignFailed": "説明数式の割り当てに失敗しました", + "categories.seoTitlePlaceholder": "AIにSEOタイトルの書き方を指示…", + "categories.seoDescriptionPlaceholder": "AIにSEO説明の書き方を指示…", + "categories.sectionPromptPlaceholder": "このセクションでAIに何を書かせますか?", + "categories.sectionKeyPlaceholder": "例: short_description(英数字と_)", + "categories.formulaElementTypes": "数式要素の種類", + "categories.formulaElements": "数式要素", + "categories.elementSeparator": "要素の区切り", + "categories.elementSeparatorHint": "スペース、ダッシュなど", + "categories.dragToReorder": "ドラッグして並び替え", + "categories.addCustomVariable": "カスタム変数を追加", + "categories.editCustomVariable": "カスタム変数を編集", + "categories.customVariableHelp": "タイトル数式用の再利用可能な変数を定義します。", + "categories.manageVariables": "変数を管理", + "categories.manageVariablesHelp": "タイトル数式で使える変数の表示・編集・追加。", + "categories.searchVariables": "変数を検索…", + "categories.variableAdded": "変数を追加しました", + "categories.variableUpdated": "変数を更新しました", + "categories.variableDeleted": "変数を削除しました", + "categories.variableDeleteFailed": "変数の削除に失敗しました", + "categories.variableNameRequired": "変数名は必須です", + "categories.displayNameRequired": "表示名は必須です", + "categories.variableNamePattern": "名前に使えるのは英数字とアンダースコアのみです", + "categories.deleteVariableConfirm": "この変数を削除してもよろしいですか?使用中の数式に影響する可能性があります。", + "categories.removeElementConfirm": "この要素を数式から削除してもよろしいですか?", + "categories.addTextElement": "テキスト要素を追加", + "categories.addTextElementHelp": "数式に静的テキスト要素を追加します。", + "categories.editTextElement": "テキスト要素を編集", + "categories.editTextElementHelp": "数式内のテキスト要素を編集します。", + "categories.staticTextPlaceholder": "静的テキストを入力", + "categories.textCannotBeEmpty": "テキストは空にできません", + "categories.exampleProductName": "商品名", + "categories.exampleWidget": "Acme Widget Pro(例)", + "fields.title": "標準フィールド", + "fields.description": "標準の商品フィールドを定義し、グループに整理します", + "fields.loading": "標準フィールドを読み込み中…", + "fields.loadFailed": "フィールドの読み込みに失敗しました", + "fields.loadGroupsFailed": "フィールドグループの読み込みに失敗しました", + "fields.addField": "新しいフィールドを追加", + "fields.addGroup": "新しいグループを追加", + "fields.createField": "フィールドを作成", + "fields.createGroup": "グループを作成", + "fields.editField": "フィールドを編集", + "fields.editGroup": "グループを編集", + "fields.basicInfo": "基本情報", + "fields.createFieldHelp": "商品データ用の新しい標準フィールドを作成", + "fields.editFieldHelp": "この標準フィールドの詳細を更新します", + "fields.createGroupHelp": "標準フィールドを整理する新しいグループを作成", + "fields.editGroupHelp": "このフィールドグループの詳細を更新します", + "fields.dataTypeHint": "このフィールドのデータ型", + "fields.defaultValueOptional": "デフォルト値(任意)", + "fields.fieldDescriptionPlaceholder": "このフィールドの説明を入力", + "fields.groupDescriptionPlaceholder": "このグループの説明を入力", + "fields.keyHint": "小文字・数字・アンダースコアのみ", + "fields.exampleTitle": "商品タイトル", + "fields.noFields": "フィールドが見つかりません。「フィールドを追加」をクリックして作成してください。", + "fields.noFieldsMatch": "検索に一致するフィールドがありません", + "fields.noGroups": "グループが見つかりません。最初のグループを作成してください。", + "fields.noGroupsMatch": "検索に一致するグループがありません", + "fields.fieldCreated": "フィールドを作成しました", + "fields.fieldUpdated": "フィールドを更新しました", + "fields.fieldDeleted": "フィールドを削除しました", + "fields.groupCreated": "グループを作成しました", + "fields.groupUpdated": "グループを更新しました", + "fields.groupDeleted": "グループを削除しました", + "fields.saveFieldFailed": "フィールドの保存に失敗しました", + "fields.saveGroupFailed": "グループの保存に失敗しました", + "fields.updateFieldFailed": "フィールドの更新に失敗しました", + "fields.updateUnitFailed": "単位の更新に失敗しました", + "fields.deleteFieldFailed": "フィールドの削除に失敗しました", + "fields.deleteGroupFailed": "グループの削除に失敗しました", + "fields.bulkUpdateFailed": "一括更新に失敗しました", + "fields.enableRecommendedFailed": "推奨フィールドの有効化に失敗しました", + "fields.enabledRecommended": "推奨のECフィールドを有効化しました", + "fields.deleteFieldConfirm": "この操作は元に戻せません。フィールドを完全に削除し、使用しているテンプレートからも取り除きます。", + "fields.deleteGroupConfirm": "この操作は元に戻せません。グループを完全に削除します。このグループのフィールドは再割り当てが必要です。", + "fields.type.string": "テキスト", + "fields.type.stringHint": "自由記述 — 名前、コード、短いメモ", + "fields.type.number": "数値", + "fields.type.numberHint": "数値。必要なら単位を追加(EUR、pcs)", + "fields.type.boolean": "はい / いいえ", + "fields.type.booleanHint": "真または偽", + "fields.type.date": "日付", + "fields.type.dateHint": "カレンダー上の日付", "fields.type.url": "URL", - "fields.type.urlHint": "Webリンク(商品ページ、動画、メーカー)", - "fields.type.image": "画像", - "fields.type.imageHint": "画像URLまたはギャラリー画像", - "fields.type.dimension": "寸法", - "fields.type.dimensionHint": "長さの測定(幅、高さ、奥行き)", - "fields.type.weight": "重量", - "fields.type.weightHint": "質量 / 配送重量", - "fields.type.color": "色", - "fields.type.colorHint": "色名またはコード", - "fields.type.custom": "カスタム", - "fields.type.customHint": "特殊 / 自由形式フィールド", - "empty.admin.knowledgeHeading": "サポートナレッジ", - "empty.admin.translationsHeading": "翻訳", - "flash.attrs.createdLinkFailed": "属性は作成されましたが、カテゴリの割り当てに失敗しました。", - "flash.attrs.created": "属性を作成しました。", - "flash.attrs.csvImported": "CSVインポートが完了しました。", - "flash.attrs.updated": "属性を更新しました。", - "flash.attrs.deleted": "属性を削除しました。", - "flash.attrs.valueDeleted": "値を削除しました。", - "flash.attrs.assignedLinks": "{count} 件のカテゴリ–属性リンクを割り当てました。", - "flash.brand.saved": "ブランドキットを保存しました。", - "flash.brand.logoType": "ロゴは PNG、JPEG、または WebP である必要があります", - "flash.brand.logoSize": "ロゴが2 MiBの上限を超えています", - "flash.brand.logoUploaded": "ロゴをアップロードしました。", - "flash.categories.updated": "カテゴリを正常に更新しました。", - "flash.categories.deleted": "カテゴリを正常に削除しました。", - "flash.categories.csvImported": "CSVインポートが完了しました。", + "fields.type.urlHint": "Webリンク(商品ページ、動画、メーカー)", + "fields.type.image": "画像", + "fields.type.imageHint": "画像URLまたはギャラリー画像", + "fields.type.dimension": "寸法", + "fields.type.dimensionHint": "長さの測定(幅、高さ、奥行き)", + "fields.type.weight": "重量", + "fields.type.weightHint": "質量 / 配送重量", + "fields.type.color": "色", + "fields.type.colorHint": "色名またはコード", + "fields.type.custom": "カスタム", + "fields.type.customHint": "特殊 / 自由形式フィールド", + "empty.admin.knowledgeHeading": "サポートナレッジ", + "empty.admin.translationsHeading": "翻訳", + "flash.attrs.createdLinkFailed": "属性は作成されましたが、カテゴリの割り当てに失敗しました。", + "flash.attrs.created": "属性を作成しました。", + "flash.attrs.csvImported": "CSVインポートが完了しました。", + "flash.attrs.updated": "属性を更新しました。", + "flash.attrs.deleted": "属性を削除しました。", + "flash.attrs.valueDeleted": "値を削除しました。", + "flash.attrs.assignedLinks": "{count} 件のカテゴリ–属性リンクを割り当てました。", + "flash.brand.saved": "ブランドキットを保存しました。", + "flash.brand.logoType": "ロゴは PNG、JPEG、または WebP である必要があります", + "flash.brand.logoSize": "ロゴが2 MiBの上限を超えています", + "flash.brand.logoUploaded": "ロゴをアップロードしました。", + "flash.categories.updated": "カテゴリを正常に更新しました。", + "flash.categories.deleted": "カテゴリを正常に削除しました。", + "flash.categories.csvImported": "CSVインポートが完了しました。", "flash.products.csvImported": "Product CSV import finished.", - "flash.categories.descFormulaAssigned": "説明フォーミュラを {count} 件のカテゴリに割り当てました", - "flash.categories.promptAssigned": "プロンプトを {count} {noun} に割り当てました。", - "flash.categories.promptNounOne": "カテゴリ", - "flash.categories.promptNounMany": "カテゴリ", - "flash.categories.titleFormulaAssigned": "タイトルフォーミュラを {count} {noun} に割り当てました", - "flash.categories.variableDeleted": "変数を削除しました", - "flash.export.updated": "エクスポートフィードを更新しました。", - "flash.export.created": "エクスポートフィードを作成しました。", - "flash.export.urlCopied": "公開 {format} フィードURLをコピーしました。商品フィードを取得する任意のシステムに貼り付けてください。", - "flash.export.copyFailed": "URLのクリップボードへのコピーに失敗しました", - "flash.export.refreshed": "フィードを更新しました。", - "flash.export.refreshedWithCount": "フィードを更新しました({count} 件)。", - "flash.export.deleted": "エクスポートフィードを削除しました。", - "flash.export.tokenRotated": "公開フィードURLトークンをローテーションしました。古いURLを使うシステムを更新してください。", - "common.edit": "編集", - "common.previous": "前へ", - "common.next": "次へ", - "common.saving": "保存中…", - "common.deleting": "削除中…", - "common.adding": "追加中…", - "common.processing": "処理中…", - "common.upload": "アップロード", - "common.expand": "展開", - "common.collapse": "折りたたむ", - "common.optional": "任意", - "common.enabled": "有効", - "common.on": "オン", - "common.off": "オフ", - "common.system": "システム", - "common.type": "タイプ", - "common.unit": "単位", - "common.group": "グループ", - "common.search": "検索", - "common.openMenu": "メニューを開く", - "common.areYouSure": "よろしいですか?", - "common.selectGroup": "グループを選択", - "attributes.addAttribute": "属性を追加", - "attributes.searchPlaceholder": "属性を検索…", - "attributes.searchAria": "属性を検索(Enterキーで検索)", - "attributes.filterCategoryAria": "カテゴリで絞り込む", - "attributes.allCategories": "すべてのカテゴリ", - "attributes.col.name": "名前", - "attributes.col.key": "属性キー", - "attributes.col.type": "タイプ", - "attributes.col.unit": "単位", - "attributes.col.categories": "カテゴリ", - "attributes.col.updated": "最終更新", - "attributes.col.actions": "操作", - "attributes.emptyTitle": "属性が見つかりません", - "attributes.emptyFiltered": "検索またはカテゴリフィルタをクリアしてみてください。", - "attributes.emptyHint": "属性を追加するか CSV をインポートして開始してください。", - "attributes.noValues": "値なし", - "attributes.actionsAria": "属性の操作", - "attributes.editDetails": "詳細を編集", - "attributes.loadingValues": "値を読み込み中...", - "attributes.noValuesYetHint": "まだ値がありません。「Manage Values」で値を追加してください。", - "attributes.pageZero": "属性0件", - "attributes.pageShowing": "{total} 件中 {from}–{to} 件の属性を表示", - "attributes.linkCategoryFailed": "選択したカテゴリに属性を割り当てられませんでした。", - "attributes.createdLinkFailed": "属性は作成されましたが、カテゴリの割り当てに失敗しました。", - "attributes.createFailed": "作成に失敗しました", - "attributes.importFinished": "CSVインポートが完了しました。", - "attributes.importFailed": "インポートに失敗しました", - "attributes.updateFailed": "更新に失敗しました", - "attributes.deleteFailed": "削除に失敗しました", - "attributes.valueUpdated": "値を更新しました。", - "attributes.valueAdded": "値を追加しました。", - "attributes.valueSaveFailed": "値を保存できませんでした", - "attributes.valueDeleted": "値を削除しました。", - "attributes.valueDeleteFailed": "値を削除できませんでした", - "attributes.csvNeedRows": "CSVにはヘッダーと少なくとも1行が必要です", - "attributes.rowUnknown": "行 {row}: 不明なカテゴリまたは属性", - "attributes.rowLinkFailed": "行 {row}: {detail}", - "attributes.linkFailedShort": "リンク失敗", - "attributes.assignedLinks": "{count} 件のカテゴリ–属性リンクを割り当てました。", - "attributes.rowsFailed": "{count} 行が失敗しました。", - "attributes.addTitle": "新しい属性を追加", - "attributes.addDesc": "新しい属性定義を作成します。作成時にカテゴリへ割り当てできます。", - "attributes.tab.single": "単一", - "attributes.tab.bulk": "一括インポート", - "attributes.field.key": "属性キー", - "attributes.field.keyPlaceholder": "属性-key", - "attributes.field.displayName": "表示名", - "attributes.field.displayNamePlaceholder": "属性の表示名", - "attributes.field.type": "タイプ", - "attributes.field.typeDefaultHint": "この属性の値の入力方法を選択してください。", - "attributes.field.category": "カテゴリ", - "attributes.field.categoryPlaceholder": "カテゴリを選択…", - "attributes.field.categoryHint": "この属性が属するカテゴリを選択してください。属性はカテゴリに割り当てる必要があります。", - "attributes.field.unitOptional": "単位(任意)", - "attributes.field.unitPlaceholder": "例: cm、kg など", - "attributes.field.exampleOptional": "例(任意)", - "attributes.field.examplePlaceholder": "例: 100x200", - "attributes.createAttribute": "属性を作成", - "attributes.bulk.fileLabel": "CSVまたはTSVファイル", - "attributes.bulk.downloadCsv": "CSVテンプレートをダウンロード", - "attributes.bulk.downloadTsv": "TSVテンプレートをダウンロード", - "attributes.bulk.uploadHint": "次の列を含む CSV または TSV ファイルをアップロード:", - "attributes.bulk.col.key": "一意の識別子(必須)", - "attributes.bulk.col.name": "表示名(必須)", - "attributes.bulk.col.valueType": "string(テキスト)、number、boolean(はい/いいえ)、date、list(ドロップダウン)、multiselect", - "attributes.bulk.col.categoryId": "カテゴリ一意ID", - "attributes.bulk.col.unitExample": "任意", - "attributes.bulk.col.parentKey": "リスト値の親キー", - "attributes.editTitle": "属性を編集", - "attributes.editDesc": "属性「{name}」の詳細を更新", - "attributes.field.keyHint": "この属性の一意の識別子", - "attributes.field.displayNameHint": "ユーザーに表示される名前", - "attributes.deleteTitle": "属性を削除", - "attributes.deleteDesc": "「{name}」を削除しますか?この操作は元に戻せません。", - "attributes.deleteWarningValues": "警告: この属性に関連するすべての値も削除されます。", - "attributes.manageTitleNamed": "{name} の値を管理", - "attributes.manageTitle": "値を管理", - "attributes.manageDesc": "このリスト属性の値を追加、編集、または削除します。", - "attributes.valueKey": "値キー", - "attributes.valueKeyHint": "この値の一意の識別子", - "attributes.displayValue": "表示値", - "attributes.displayValuePlaceholder": "表示する値", - "attributes.displayValueHint": "この値に表示される表示名", - "attributes.updateValue": "値を更新", - "attributes.noValuesYet": "まだ値がありません。", - "attributes.assignTitle": "属性をカテゴリに割り当て", - "attributes.assignDesc": "カテゴリの一意IDを属性キーに対応付けるCSVをアップロード。", - "attributes.downloadTemplate": "テンプレートをダウンロード", - "attributes.csvFile": "CSVファイル", - "attributes.assignSuccess": "割り当てを適用しました。", - "attributes.assigning": "割り当て中…", - "attributes.uploadAndAssign": "アップロードして割り当て", - "attributes.type.string.label": "テキスト", - "attributes.type.string.hint": "自由テキスト — 名前、モデル、短いメモ", - "attributes.type.number.label": "数値", - "attributes.type.number.hint": "数値。必要に応じて単位を追加(cm、kg、W)", - "attributes.type.boolean.label": "はい / いいえ", - "attributes.type.boolean.hint": "真または偽 — 例: GPSあり、ワイヤレス充電", - "attributes.type.date.label": "日付", - "attributes.type.date.hint": "カレンダー日付(発売日、保証終了など)", - "attributes.type.list.label": "ドロップダウン", - "attributes.type.list.hint": "定義済みリストからオプションを1つだけ選択", - "attributes.type.multiselect.label": "複数選択", - "attributes.type.multiselect.hint": "リストから1つ以上のオプションを選択", - "standardFields.title": "標準フィールド", - "standardFields.description": "標準の商品フィールドを定義し、グループに整理します", - "standardFields.apiUnavailable": "標準フィールドAPIは利用できません。変更を保存できません。", - "standardFields.apiUnreachable": "標準フィールドAPIに現在到達できません。/api/standard-fields と /api/field-groups が応答するまで作成/編集は無効のままです。", - "standardFields.loading": "標準フィールドを読み込み中…", - "standardFields.tab.fields": "フィールド", - "standardFields.tab.groups": "グループ", - "standardFields.heading": "標準フィールド", - "standardFields.headingHint": "マッピングと処理用にフィールドを有効化 — 行ごとに1つのトグル。", - "standardFields.enableRecommended": "推奨を有効化", - "standardFields.enableSelected": "選択を有効化({count})", - "standardFields.disableSelected": "選択を無効化", - "standardFields.addField": "フィールドを追加", - "standardFields.searchFields": "フィールドを検索...", - "standardFields.col.enabled": "有効", - "standardFields.col.name": "名前", - "standardFields.col.key": "キー", - "standardFields.col.type": "タイプ", - "standardFields.col.unit": "単位", - "standardFields.col.group": "グループ", - "standardFields.col.status": "ステータス", - "standardFields.emptySearch": "検索に一致するフィールドがありません", - "standardFields.emptyHint": "フィールドが見つかりません。「フィールドを追加」をクリックして作成してください。", - "standardFields.selectFieldAria": "{name} を選択", - "standardFields.enableFieldAria": "{name} を有効化", - "standardFields.systemFieldTitle": "システムフィールド — 削除できません", - "standardFields.groupsHeading": "フィールドグループ", - "standardFields.addGroup": "グループを追加", - "standardFields.searchGroups": "グループを検索...", - "standardFields.col.description": "説明", - "standardFields.col.displayOrder": "表示順", - "standardFields.emptyGroupsSearch": "検索に一致するグループがありません", - "standardFields.emptyGroupsHint": "グループが見つかりません。最初のグループを作成してください。", - "standardFields.unknownGroup": "不明なグループ", - "standardFields.loadGroupsFailed": "フィールドグループの読み込みに失敗しました", - "standardFields.loadFieldsFailed": "フィールドの読み込みに失敗しました", - "standardFields.fieldUpdated": "フィールドを更新しました", - "standardFields.fieldCreated": "フィールドを作成しました", - "standardFields.saveFieldFailed": "フィールドの保存に失敗しました", - "standardFields.enabledNamed": "{name} を有効にしました", - "standardFields.disabledNamed": "{name} を無効化しました", - "standardFields.updateFieldFailed": "フィールドの更新に失敗しました", - "standardFields.updateUnitFailed": "単位の更新に失敗しました", - "standardFields.bulkEnabled": "{count} 件のフィールドを有効化", - "standardFields.bulkDisabled": "{count} 件のフィールドを無効化", - "standardFields.bulkFailed": "一括更新に失敗しました", - "standardFields.recommendedEnabled": "推奨のECフィールドを有効化しました", - "standardFields.recommendedFailed": "推奨フィールドの有効化に失敗しました", - "standardFields.fieldDeleted": "フィールドを削除しました", - "standardFields.deleteFieldFailed": "フィールドの削除に失敗しました", - "standardFields.groupUpdated": "グループを更新しました", - "standardFields.groupCreated": "グループを作成しました", - "standardFields.saveGroupFailed": "グループの保存に失敗しました", - "standardFields.groupDeleted": "グループを削除しました", - "standardFields.deleteGroupFailed": "グループの削除に失敗しました", - "standardFields.editField": "フィールドを編集", - "standardFields.addNewField": "新しいフィールドを追加", - "standardFields.editFieldDesc": "この標準フィールドの詳細を更新します", - "standardFields.addFieldDesc": "商品データ用の新しい標準フィールドを作成", - "standardFields.field.name": "名前", - "standardFields.field.namePlaceholder": "商品タイトル", - "standardFields.field.nameHint": "このフィールドの表示名", - "standardFields.field.key": "キー", + "flash.categories.descFormulaAssigned": "説明フォーミュラを {count} 件のカテゴリに割り当てました", + "flash.categories.promptAssigned": "プロンプトを {count} {noun} に割り当てました。", + "flash.categories.promptNounOne": "カテゴリ", + "flash.categories.promptNounMany": "カテゴリ", + "flash.categories.titleFormulaAssigned": "タイトルフォーミュラを {count} {noun} に割り当てました", + "flash.categories.variableDeleted": "変数を削除しました", + "flash.export.updated": "エクスポートフィードを更新しました。", + "flash.export.created": "エクスポートフィードを作成しました。", + "flash.export.urlCopied": "公開 {format} フィードURLをコピーしました。商品フィードを取得する任意のシステムに貼り付けてください。", + "flash.export.copyFailed": "URLのクリップボードへのコピーに失敗しました", + "flash.export.refreshed": "フィードを更新しました。", + "flash.export.refreshedWithCount": "フィードを更新しました({count} 件)。", + "flash.export.deleted": "エクスポートフィードを削除しました。", + "flash.export.tokenRotated": "公開フィードURLトークンをローテーションしました。古いURLを使うシステムを更新してください。", + "common.edit": "編集", + "common.previous": "前へ", + "common.next": "次へ", + "common.saving": "保存中…", + "common.deleting": "削除中…", + "common.adding": "追加中…", + "common.processing": "処理中…", + "common.upload": "アップロード", + "common.expand": "展開", + "common.collapse": "折りたたむ", + "common.optional": "任意", + "common.enabled": "有効", + "common.on": "オン", + "common.off": "オフ", + "common.system": "システム", + "common.type": "タイプ", + "common.unit": "単位", + "common.group": "グループ", + "common.search": "検索", + "common.openMenu": "メニューを開く", + "common.areYouSure": "よろしいですか?", + "common.selectGroup": "グループを選択", + "attributes.addAttribute": "属性を追加", + "attributes.searchPlaceholder": "属性を検索…", + "attributes.searchAria": "属性を検索(Enterキーで検索)", + "attributes.filterCategoryAria": "カテゴリで絞り込む", + "attributes.allCategories": "すべてのカテゴリ", + "attributes.col.name": "名前", + "attributes.col.key": "属性キー", + "attributes.col.type": "タイプ", + "attributes.col.unit": "単位", + "attributes.col.categories": "カテゴリ", + "attributes.col.updated": "最終更新", + "attributes.col.actions": "操作", + "attributes.emptyTitle": "属性が見つかりません", + "attributes.emptyFiltered": "検索またはカテゴリフィルタをクリアしてみてください。", + "attributes.emptyHint": "属性を追加するか CSV をインポートして開始してください。", + "attributes.noValues": "値なし", + "attributes.actionsAria": "属性の操作", + "attributes.editDetails": "詳細を編集", + "attributes.loadingValues": "値を読み込み中...", + "attributes.noValuesYetHint": "まだ値がありません。「Manage Values」で値を追加してください。", + "attributes.pageZero": "属性0ä»¶", + "attributes.pageShowing": "{total} 件中 {from}–{to} 件の属性を表示", + "attributes.linkCategoryFailed": "選択したカテゴリに属性を割り当てられませんでした。", + "attributes.createdLinkFailed": "属性は作成されましたが、カテゴリの割り当てに失敗しました。", + "attributes.createFailed": "作成に失敗しました", + "attributes.importFinished": "CSVインポートが完了しました。", + "attributes.importFailed": "インポートに失敗しました", + "attributes.updateFailed": "更新に失敗しました", + "attributes.deleteFailed": "削除に失敗しました", + "attributes.valueUpdated": "値を更新しました。", + "attributes.valueAdded": "値を追加しました。", + "attributes.valueSaveFailed": "値を保存できませんでした", + "attributes.valueDeleted": "値を削除しました。", + "attributes.valueDeleteFailed": "値を削除できませんでした", + "attributes.csvNeedRows": "CSVにはヘッダーと少なくとも1行が必要です", + "attributes.rowUnknown": "行 {row}: 不明なカテゴリまたは属性", + "attributes.rowLinkFailed": "行 {row}: {detail}", + "attributes.linkFailedShort": "リンク失敗", + "attributes.assignedLinks": "{count} 件のカテゴリ–属性リンクを割り当てました。", + "attributes.rowsFailed": "{count} 行が失敗しました。", + "attributes.addTitle": "新しい属性を追加", + "attributes.addDesc": "新しい属性定義を作成します。作成時にカテゴリへ割り当てできます。", + "attributes.tab.single": "単一", + "attributes.tab.bulk": "一括インポート", + "attributes.field.key": "属性キー", + "attributes.field.keyPlaceholder": "属性-key", + "attributes.field.displayName": "表示名", + "attributes.field.displayNamePlaceholder": "属性の表示名", + "attributes.field.type": "タイプ", + "attributes.field.typeDefaultHint": "この属性の値の入力方法を選択してください。", + "attributes.field.category": "カテゴリ", + "attributes.field.categoryPlaceholder": "カテゴリを選択…", + "attributes.field.categoryHint": "この属性が属するカテゴリを選択してください。属性はカテゴリに割り当てる必要があります。", + "attributes.field.unitOptional": "単位(任意)", + "attributes.field.unitPlaceholder": "例: cm、kg など", + "attributes.field.exampleOptional": "例(任意)", + "attributes.field.examplePlaceholder": "例: 100x200", + "attributes.createAttribute": "属性を作成", + "attributes.bulk.fileLabel": "CSVまたはTSVファイル", + "attributes.bulk.downloadCsv": "CSVテンプレートをダウンロード", + "attributes.bulk.downloadTsv": "TSVテンプレートをダウンロード", + "attributes.bulk.uploadHint": "次の列を含む CSV または TSV ファイルをアップロード:", + "attributes.bulk.col.key": "一意の識別子(必須)", + "attributes.bulk.col.name": "表示名(必須)", + "attributes.bulk.col.valueType": "string(テキスト)、number、boolean(はい/いいえ)、date、list(ドロップダウン)、multiselect", + "attributes.bulk.col.categoryId": "カテゴリ一意ID", + "attributes.bulk.col.unitExample": "任意", + "attributes.bulk.col.parentKey": "リスト値の親キー", + "attributes.editTitle": "属性を編集", + "attributes.editDesc": "属性「{name}」の詳細を更新", + "attributes.field.keyHint": "この属性の一意の識別子", + "attributes.field.displayNameHint": "ユーザーに表示される名前", + "attributes.deleteTitle": "属性を削除", + "attributes.deleteDesc": "「{name}」を削除しますか?この操作は元に戻せません。", + "attributes.deleteWarningValues": "警告: この属性に関連するすべての値も削除されます。", + "attributes.manageTitleNamed": "{name} の値を管理", + "attributes.manageTitle": "値を管理", + "attributes.manageDesc": "このリスト属性の値を追加、編集、または削除します。", + "attributes.valueKey": "値キー", + "attributes.valueKeyHint": "この値の一意の識別子", + "attributes.displayValue": "表示値", + "attributes.displayValuePlaceholder": "表示する値", + "attributes.displayValueHint": "この値に表示される表示名", + "attributes.updateValue": "値を更新", + "attributes.noValuesYet": "まだ値がありません。", + "attributes.assignTitle": "属性をカテゴリに割り当て", + "attributes.assignDesc": "カテゴリの一意IDを属性キーに対応付けるCSVをアップロード。", + "attributes.downloadTemplate": "テンプレートをダウンロード", + "attributes.csvFile": "CSVファイル", + "attributes.assignSuccess": "割り当てを適用しました。", + "attributes.assigning": "割り当て中…", + "attributes.uploadAndAssign": "アップロードして割り当て", + "attributes.type.string.label": "テキスト", + "attributes.type.string.hint": "自由テキスト — 名前、モデル、短いメモ", + "attributes.type.number.label": "数値", + "attributes.type.number.hint": "数値。必要に応じて単位を追加(cm、kg、W)", + "attributes.type.boolean.label": "はい / いいえ", + "attributes.type.boolean.hint": "真または偽 — 例: GPSあり、ワイヤレス充電", + "attributes.type.date.label": "日付", + "attributes.type.date.hint": "カレンダー日付(発売日、保証終了など)", + "attributes.type.list.label": "ドロップダウン", + "attributes.type.list.hint": "定義済みリストからオプションを1つだけ選択", + "attributes.type.multiselect.label": "複数選択", + "attributes.type.multiselect.hint": "リストから1つ以上のオプションを選択", + "standardFields.title": "標準フィールド", + "standardFields.description": "標準の商品フィールドを定義し、グループに整理します", + "standardFields.apiUnavailable": "標準フィールドAPIは利用できません。変更を保存できません。", + "standardFields.apiUnreachable": "標準フィールドAPIに現在到達できません。/api/standard-fields と /api/field-groups が応答するまで作成/編集は無効のままです。", + "standardFields.loading": "標準フィールドを読み込み中…", + "standardFields.tab.fields": "フィールド", + "standardFields.tab.groups": "グループ", + "standardFields.heading": "標準フィールド", + "standardFields.headingHint": "マッピングと処理用にフィールドを有効化 — 行ごとに1つのトグル。", + "standardFields.enableRecommended": "推奨を有効化", + "standardFields.enableSelected": "選択を有効化({count})", + "standardFields.disableSelected": "選択を無効化", + "standardFields.addField": "フィールドを追加", + "standardFields.searchFields": "フィールドを検索...", + "standardFields.col.enabled": "有効", + "standardFields.col.name": "名前", + "standardFields.col.key": "キー", + "standardFields.col.type": "タイプ", + "standardFields.col.unit": "単位", + "standardFields.col.group": "グループ", + "standardFields.col.status": "ステータス", + "standardFields.emptySearch": "検索に一致するフィールドがありません", + "standardFields.emptyHint": "フィールドが見つかりません。「フィールドを追加」をクリックして作成してください。", + "standardFields.selectFieldAria": "{name} を選択", + "standardFields.enableFieldAria": "{name} を有効化", + "standardFields.systemFieldTitle": "システムフィールド — 削除できません", + "standardFields.groupsHeading": "フィールドグループ", + "standardFields.addGroup": "グループを追加", + "standardFields.searchGroups": "グループを検索...", + "standardFields.col.description": "説明", + "standardFields.col.displayOrder": "表示順", + "standardFields.emptyGroupsSearch": "検索に一致するグループがありません", + "standardFields.emptyGroupsHint": "グループが見つかりません。最初のグループを作成してください。", + "standardFields.unknownGroup": "不明なグループ", + "standardFields.loadGroupsFailed": "フィールドグループの読み込みに失敗しました", + "standardFields.loadFieldsFailed": "フィールドの読み込みに失敗しました", + "standardFields.fieldUpdated": "フィールドを更新しました", + "standardFields.fieldCreated": "フィールドを作成しました", + "standardFields.saveFieldFailed": "フィールドの保存に失敗しました", + "standardFields.enabledNamed": "{name} を有効にしました", + "standardFields.disabledNamed": "{name} を無効化しました", + "standardFields.updateFieldFailed": "フィールドの更新に失敗しました", + "standardFields.updateUnitFailed": "単位の更新に失敗しました", + "standardFields.bulkEnabled": "{count} 件のフィールドを有効化", + "standardFields.bulkDisabled": "{count} 件のフィールドを無効化", + "standardFields.bulkFailed": "一括更新に失敗しました", + "standardFields.recommendedEnabled": "推奨のECフィールドを有効化しました", + "standardFields.recommendedFailed": "推奨フィールドの有効化に失敗しました", + "standardFields.fieldDeleted": "フィールドを削除しました", + "standardFields.deleteFieldFailed": "フィールドの削除に失敗しました", + "standardFields.groupUpdated": "グループを更新しました", + "standardFields.groupCreated": "グループを作成しました", + "standardFields.saveGroupFailed": "グループの保存に失敗しました", + "standardFields.groupDeleted": "グループを削除しました", + "standardFields.deleteGroupFailed": "グループの削除に失敗しました", + "standardFields.editField": "フィールドを編集", + "standardFields.addNewField": "新しいフィールドを追加", + "standardFields.editFieldDesc": "この標準フィールドの詳細を更新します", + "standardFields.addFieldDesc": "商品データ用の新しい標準フィールドを作成", + "standardFields.field.name": "名前", + "standardFields.field.namePlaceholder": "商品タイトル", + "standardFields.field.nameHint": "このフィールドの表示名", + "standardFields.field.key": "キー", "standardFields.field.keyPlaceholder": "product_title", - "standardFields.field.keyTitle": "小文字・数字・アンダースコアのみ", - "standardFields.field.keyHint": "一意の識別子(小文字、スペースなし)", - "standardFields.field.type": "タイプ", - "standardFields.field.typeDefaultHint": "このフィールドのデータ型", - "standardFields.field.group": "グループ", - "standardFields.field.groupHint": "このフィールドが属するグループ", - "standardFields.field.enabled": "有効", - "standardFields.field.enabledHint": "マッピングと処理でこのフィールドを使用", - "standardFields.field.required": "必須フィールド", - "standardFields.field.requiredHint": "必須フィールドは、商品を同期する前にすべてのフィードでマッピングする必要があります。", - "standardFields.field.unit": "単位", - "standardFields.field.unitPlaceholder": "kg、EUR、cm…", - "standardFields.field.unitHint": "このフィールドに表示する任意の単位", - "standardFields.field.description": "説明", - "standardFields.field.descriptionPlaceholder": "このフィールドの説明を入力", - "standardFields.field.default": "デフォルト値", - "standardFields.field.defaultPlaceholder": "デフォルト値(任意)", - "standardFields.field.defaultHint": "値が指定されていない場合のデフォルト値", - "standardFields.saveUnavailable": "保存(利用不可)", - "standardFields.updateField": "フィールドを更新", - "standardFields.createField": "フィールドを作成", - "standardFields.editGroup": "グループを編集", - "standardFields.addNewGroup": "新しいグループを追加", - "standardFields.editGroupDesc": "このフィールドグループの詳細を更新します", - "standardFields.addGroupDesc": "標準フィールドを整理する新しいグループを作成", - "standardFields.group.name": "名前", - "standardFields.group.namePlaceholder": "基本情報", - "standardFields.group.nameHint": "このグループの表示名", - "standardFields.group.description": "説明", - "standardFields.group.descriptionPlaceholder": "このグループの説明を入力", - "standardFields.group.descriptionHint": "このグループの目的を説明する任意の説明", - "standardFields.group.order": "表示順", - "standardFields.group.orderHint": "小さい番号が先に表示されます", - "standardFields.updateGroup": "グループを更新", - "standardFields.createGroup": "グループを作成", - "standardFields.deleteFieldDesc": "この操作は元に戻せません。フィールドを完全に削除し、使用しているテンプレートからも取り除きます。", - "standardFields.deleteGroupDesc": "この操作は元に戻せません。グループを完全に削除します。このグループのフィールドは再割り当てが必要です。", - "standardFields.type.string.label": "テキスト", - "standardFields.type.string.hint": "自由記述 — 名前、コード、短いメモ", - "standardFields.type.number.label": "数値", - "standardFields.type.number.hint": "数値。必要なら単位を追加(EUR、pcs)", - "standardFields.type.boolean.label": "はい / いいえ", - "standardFields.type.boolean.hint": "真または偽", - "standardFields.type.date.label": "日付", - "standardFields.type.date.hint": "カレンダー上の日付", + "standardFields.field.keyTitle": "小文字・数字・アンダースコアのみ", + "standardFields.field.keyHint": "一意の識別子(小文字、スペースなし)", + "standardFields.field.type": "タイプ", + "standardFields.field.typeDefaultHint": "このフィールドのデータ型", + "standardFields.field.group": "グループ", + "standardFields.field.groupHint": "このフィールドが属するグループ", + "standardFields.field.enabled": "有効", + "standardFields.field.enabledHint": "マッピングと処理でこのフィールドを使用", + "standardFields.field.required": "必須フィールド", + "standardFields.field.requiredHint": "必須フィールドは、商品を同期する前にすべてのフィードでマッピングする必要があります。", + "standardFields.field.unit": "単位", + "standardFields.field.unitPlaceholder": "kg、EUR、cm…", + "standardFields.field.unitHint": "このフィールドに表示する任意の単位", + "standardFields.field.description": "説明", + "standardFields.field.descriptionPlaceholder": "このフィールドの説明を入力", + "standardFields.field.default": "デフォルト値", + "standardFields.field.defaultPlaceholder": "デフォルト値(任意)", + "standardFields.field.defaultHint": "値が指定されていない場合のデフォルト値", + "standardFields.saveUnavailable": "保存(利用不可)", + "standardFields.updateField": "フィールドを更新", + "standardFields.createField": "フィールドを作成", + "standardFields.editGroup": "グループを編集", + "standardFields.addNewGroup": "新しいグループを追加", + "standardFields.editGroupDesc": "このフィールドグループの詳細を更新します", + "standardFields.addGroupDesc": "標準フィールドを整理する新しいグループを作成", + "standardFields.group.name": "名前", + "standardFields.group.namePlaceholder": "基本情報", + "standardFields.group.nameHint": "このグループの表示名", + "standardFields.group.description": "説明", + "standardFields.group.descriptionPlaceholder": "このグループの説明を入力", + "standardFields.group.descriptionHint": "このグループの目的を説明する任意の説明", + "standardFields.group.order": "表示順", + "standardFields.group.orderHint": "小さい番号が先に表示されます", + "standardFields.updateGroup": "グループを更新", + "standardFields.createGroup": "グループを作成", + "standardFields.deleteFieldDesc": "この操作は元に戻せません。フィールドを完全に削除し、使用しているテンプレートからも取り除きます。", + "standardFields.deleteGroupDesc": "この操作は元に戻せません。グループを完全に削除します。このグループのフィールドは再割り当てが必要です。", + "standardFields.type.string.label": "テキスト", + "standardFields.type.string.hint": "自由記述 — 名前、コード、短いメモ", + "standardFields.type.number.label": "数値", + "standardFields.type.number.hint": "数値。必要なら単位を追加(EUR、pcs)", + "standardFields.type.boolean.label": "はい / いいえ", + "standardFields.type.boolean.hint": "真または偽", + "standardFields.type.date.label": "日付", + "standardFields.type.date.hint": "カレンダー上の日付", "standardFields.type.url.label": "URL", - "standardFields.type.url.hint": "Webリンク(商品ページ、動画、メーカー)", - "standardFields.type.image.label": "画像", - "standardFields.type.image.hint": "画像URLまたはギャラリー画像", - "standardFields.type.dimension.label": "寸法", - "standardFields.type.dimension.hint": "長さの測定(幅、高さ、奥行き)", - "standardFields.type.weight.label": "重量", - "standardFields.type.weight.hint": "質量 / 配送重量", - "standardFields.type.color.label": "色", - "standardFields.type.color.hint": "色名またはコード", - "standardFields.type.custom.label": "カスタム", - "standardFields.type.custom.hint": "特殊 / 自由形式フィールド", + "standardFields.type.url.hint": "Webリンク(商品ページ、動画、メーカー)", + "standardFields.type.image.label": "画像", + "standardFields.type.image.hint": "画像URLまたはギャラリー画像", + "standardFields.type.dimension.label": "寸法", + "standardFields.type.dimension.hint": "長さの測定(幅、高さ、奥行き)", + "standardFields.type.weight.label": "重量", + "standardFields.type.weight.hint": "質量 / 配送重量", + "standardFields.type.color.label": "色", + "standardFields.type.color.hint": "色名またはコード", + "standardFields.type.custom.label": "カスタム", + "standardFields.type.custom.hint": "特殊 / 自由形式フィールド", "standardFields.fallback.gtin": "GTIN/EAN", - "standardFields.fallback.title": "商品名", - "standardFields.fallback.brand": "ブランド", - "standardFields.fallback.description": "説明", - "standardFields.fallback.product_model": "商品モデル", - "standardFields.fallback.price": "価格", - "standardFields.fallback.sale_price": "セール価格", - "standardFields.fallback.purchase_price": "仕入価格", - "standardFields.fallback.currency": "通貨", - "standardFields.fallback.image_url": "画像URL", - "standardFields.fallback.main_image": "メイン画像", - "standardFields.fallback.additional_image_urls": "追加画像", - "standardFields.fallback.product_url": "商品URL", - "standardFields.fallback.official_link": "公式リンク", + "standardFields.fallback.title": "商品名", + "standardFields.fallback.brand": "ブランド", + "standardFields.fallback.description": "説明", + "standardFields.fallback.product_model": "商品モデル", + "standardFields.fallback.price": "価格", + "standardFields.fallback.sale_price": "セール価格", + "standardFields.fallback.purchase_price": "仕入価格", + "standardFields.fallback.currency": "通貨", + "standardFields.fallback.image_url": "画像URL", + "standardFields.fallback.main_image": "メイン画像", + "standardFields.fallback.additional_image_urls": "追加画像", + "standardFields.fallback.product_url": "商品URL", + "standardFields.fallback.official_link": "公式リンク", "standardFields.fallback.sku": "SKU", "standardFields.fallback.mpn": "MPN", - "standardFields.fallback.category": "カテゴリ", - "standardFields.fallback.availability": "在庫状況", - "standardFields.fallback.stock": "在庫", - "standardFields.fallback.color": "色", - "standardFields.fallback.size": "サイズ", - "standardFields.fallback.material": "素材", - "standardFields.fallback.warranty": "保証", - "standardFields.fallback.service": "サービス", - "standardFields.fallback.weight": "重量", - "standardFields.fallback.net_depth": "正味奥行き", - "standardFields.fallback.net_height": "正味高さ", - "standardFields.fallback.net_width": "正味幅", - "standardFields.fallback.net_mass": "正味質量", - "standardFields.fallback.video_url": "動画URL", + "standardFields.fallback.category": "カテゴリ", + "standardFields.fallback.availability": "在庫状況", + "standardFields.fallback.stock": "在庫", + "standardFields.fallback.color": "色", + "standardFields.fallback.size": "サイズ", + "standardFields.fallback.material": "素材", + "standardFields.fallback.warranty": "保証", + "standardFields.fallback.service": "サービス", + "standardFields.fallback.weight": "重量", + "standardFields.fallback.net_depth": "正味奥行き", + "standardFields.fallback.net_height": "正味高さ", + "standardFields.fallback.net_width": "正味幅", + "standardFields.fallback.net_mass": "正味質量", + "standardFields.fallback.video_url": "å‹•ç”»URL", "standardFields.fallback.eprel_id": "EPREL ID", - "standardFields.fallback.specs": "仕様", - "standardFields.fallback.specifications": "仕様(レガシー)", - "standardFields.tip.gtin": "GTIN — 商品を識別するバーコード/EAN/UPC。", - "standardFields.tip.title": "カタログやチャネルに表示される顧客向け商品名。", - "standardFields.tip.brand": "メーカーまたはブランド名(小売業者ではない)。", - "standardFields.tip.description": "より長い商品文。エンリッチメントとチャネル掲載に使用。", - "standardFields.tip.product_model": "メーカーのモデル名/番号。", - "standardFields.tip.price": "通常販売価格(数値。通貨は別途マッピング)。", - "standardFields.tip.sale_price": "セール時の割引またはプロモーション価格。", - "standardFields.tip.purchase_price": "原価 / 仕入価格(内部)。", - "standardFields.tip.currency": "価格フィールド用のISO通貨コード(例: EUR、USD)。", - "standardFields.tip.image_url": "商品のメイン画像URL。", - "standardFields.tip.main_image": "メインギャラリー画像URL(image のエイリアス)。", - "standardFields.tip.additional_image_urls": "追加画像URL(カンマ区切りまたは繰り返しノード)。", - "standardFields.tip.product_url": "店舗またはサイト上の公開商品ページURL。", - "standardFields.tip.official_link": "メーカーまたはブランドの商品ページURL。", - "standardFields.tip.sku": "SKU — 社内の品目コード。", - "standardFields.tip.mpn": "MPN — サプライヤーの部品コード。", - "standardFields.tip.category": "商品カテゴリまたはタクソノミパス。", - "standardFields.tip.availability": "在庫あり / 在庫なし / 予約 などのステータス。", - "standardFields.tip.stock": "数値の在庫数量。", - "standardFields.tip.color": "バリエーション用の色属性。", - "standardFields.tip.size": "バリエーション用のサイズ属性。", - "standardFields.tip.material": "主な素材または組成。", - "standardFields.tip.warranty": "保証期間または文言。", - "standardFields.tip.service": "サービスまたはサポートのメモ。", - "standardFields.tip.weight": "配送重量または正味重量。", - "standardFields.tip.eprel_id": "EUエネルギーラベル(EPREL)の製品識別子。", - "standardFields.tip.specs": "構造化された技術仕様。", - "standardFields.tip.specifications": "レガシーの仕様フィールド。両方ある場合は specs を優先。", - "export.dialog.title": "選択した商品をエクスポート", - "export.dialog.description": "選択した{count}件の商品をエクスポートします。形式とフィールドを定義するエクスポートフィードを選んでください — 同期対象の選択に似ていますが、ダウンロードまたはパートナー向けです。", - "export.dialog.loadFailed": "エクスポートフィードオプションの読み込みに失敗しました。もう一度お試しください。", - "export.dialog.selectPlaceholder": "エクスポートフィードを選択…", - "export.dialog.help": "選択は商品を決め、フィードはチャネル形式とマッピングされたフィールドを決めます。", - "export.dialog.emptyTitle": "エクスポートフィードはまだありません", - "export.dialog.emptyMessage": "形式とフィールドを選ぶエクスポートフィードを作成してから、この選択をエクスポートしてください。", - "export.dialog.createFeedCta": "エクスポートフィードを作成", - "export.dialog.confirmAria": "エクスポートを確認", - "export.dialog.export": "エクスポート", - "billing.title": "利用状況と請求", - "billing.loadFailed": "請求情報の読み込みに失敗しました", - "billing.usageLoadFailed": "利用状況の読み込みに失敗しました", - "billing.checkoutComplete": "Checkout完了。プランとクレジットはまもなく更新されます。", - "billing.checkoutCompletePlan": "プランを更新しました。{plan} のクレジットの準備ができました。", - "billing.checkoutCanceled": "Checkoutはキャンセルされました。変更はありません。", - "billing.portalReturned": "請求ポータルから戻りました。プランはここか Plans で管理できます。", - "billing.comparePlans": "プランを比較", - "billing.managePayment": "支払いを管理", - "billing.addCredits": "クレジットを追加", - "billing.addingCredits": "追加中…", - "billing.addCreditsTitle": "クレジットを追加", - "billing.addCreditsDescription": "プラットフォーム管理者専用。AIタイトル、説明、その他の有料ステップ用クレジットはすぐに利用できます。", - "billing.creditAmount": "クレジット額", - "billing.invalidCreditAmount": "有効なクレジット数を入力してください。", - "billing.companyNotFound": "会社が見つかりません。", - "billing.creditsAdded": "{amount} クレジットを追加しました。", - "billing.addCreditsFailed": "クレジットの追加に失敗しました。プラットフォーム管理者権限が必要な場合があります。", - "billing.planApplied": "プランを適用しました。クレジットの準備ができました。", - "billing.checkoutFailed": "チェックアウト失敗", - "billing.portalFailed": "請求ポータルを開けませんでした", - "billing.noPlanAssigned": "プラン未割当", - "billing.unlimited": "無制限", - "billing.payAsYouGo": "従量課金", - "billing.noMonthlyAiCredits": "月次AIクレジットなし", - "billing.header.noPlan": "まだプランが割り当てられていません。プランを選ぶか会社管理者に依頼してください。", - "billing.header.free": "AIクレジットなしでフィードをマッピングし、商品データを整備。", - "billing.header.enterprise": "無制限の商品とAI容量。", - "billing.header.payg": "従量課金 — クレジットは会社ウォレットから供給されます。", - "billing.header.remaining": "この期間の残りAIクレジット: {remaining}。", - "billing.na": "なし", - "billing.range.7d": "過去7日", - "billing.range.30d": "過去30日", - "billing.range.cycle": "現在の請求サイクル", - "billing.range.all": "全期間", - "billing.rangeOpt.7d": "過去7日", - "billing.rangeOpt.30d": "過去30日", - "billing.rangeOpt.cycle": "現在のサイクル", - "billing.rangeOpt.all": "全期間", - "billing.freeBannerTitle": "Freeプランをご利用中です", - "billing.freeBannerMessage": "アップグレードでAIタイトル・説明とより高い商品上限を利用できます。", - "billing.outOfCreditsTitle": "AIクレジットがなくなりました", - "billing.productLimitTitle": "商品上限に達しました", - "billing.outOfCreditsMessage": "クレジット追加またはアップグレードまで、AIタイトルと説明は一時停止されます。", - "billing.productLimitMessage": "アップグレードで商品容量を増やせます。", - "billing.lowCreditsTitle": "クレジットが少なくなっています", - "billing.lowCreditsMessage": "{plan} の残りクレジットは {remaining} のみです。次の大規模バッチの前にアップグレードしてください。", - "billing.currentPlan": "現在のプラン", - "billing.periodEnds": "請求期間は {date} に終了", - "billing.openEndedContract": "オープン契約", - "billing.creditWallet": "クレジットウォレット", - "billing.creditsRemaining": "残りクレジット", - "billing.enterpriseCapacity": "エンタープライズ管理容量", - "billing.paygUsed": "{used} 使用 · 月次割当なし", - "billing.trialLeftover": "トライアル / 残クレジット", - "billing.aiLockedFree": "FreeではAI利用不可", - "billing.usedOf": "{total} 中 {used} 使用", - "billing.noBalanceTitle": "クレジット残高はまだありません", - "billing.noBalanceBody": "このワークスペースの請求設定が完了すると、プランのクレジットがここに表示されます。", - "billing.needCapacity": "容量が足りませんか?", - "billing.selfServeUpgrade": "Starter、Growth、または Business へのセルフサービスアップグレード", - "billing.viaStripe": "Stripe経由", - "billing.checkoutUnavailable": "Stripe の設定が完了するまでセルフサービス購入は利用できません。プランについては営業にお問い合わせください。", - "billing.upgradeToGrowth": "Growthにアップグレード", - "billing.askAdminPlan": "会社管理者にプラン変更を依頼してください。", - "billing.usage": "利用状況", - "billing.productsProcessed": "{count} 件の商品を処理 · {range}", - "billing.updating": "更新中…", - "billing.productsByDay": "日別商品", - "billing.chartAmber": "アンバー = トークン。範囲: {range}。", - "billing.chartRange": "範囲: {range}。", - "billing.nothingToChartTitle": "まだグラフ化するデータがありません", - "billing.nothingToChartBody": "商品を追加するかフィードを接続 — 利用状況がここに表示されます。", - "billing.dailyChartsHint": "日次チャートは直近7日、30日、または現在の請求サイクルで利用できます。", - "billing.noNewProducts": "{range} に新商品はありません", - "billing.catalogOverall": "カタログ全体で {count} 件の商品があります。", - "billing.chartProducts": "商品", - "billing.chartTokens": "トークン", - "billing.chartEmpty": "この期間に商品はありません。", - "billing.adminStats": "{tokens} トークン · {jobs} ジョブ · {input} 入力 / {export} エクスポートフィード", - "billing.whatUsesCredits": "クレジットを使うもの", - "billing.burnsCredits": "クレジット消費", - "billing.noCreditCost": "クレジット費用なし", - "billing.publicPricing": "公開料金", - "billing.managePlanOnPlans": "プランでプランを管理", - "billing.recovery.pastDueTitle": "支払い延滞", - "billing.recovery.pastDueAdmin": "サブスクリプションの支払いに失敗しました。Customer Portal で支払いを更新してください — この猶予期間中はアクセスは開いたままです。", - "billing.recovery.pastDueMember": "請求に対応が必要です。会社管理者に Customer Portal での支払い更新を依頼してください。この猶予期間中はアクセスは開いたままです。", - "billing.recovery.openPortal": "Customer Portalを開く", - "billing.recovery.contactAdmin": "会社管理者に連絡", - "billing.recovery.goToBilling": "請求へ", - "billing.recovery.missingPlanTitle": "プラン未割り当て", - "billing.recovery.missingPlanMessage": "この会社には有効なプランがありません(移行スキップ後によくあります)。Checkout でプランを割り当てるかサポートに問い合わせてください — Unlimited 容量を想定しないでください。", - "billing.recovery.choosePlan": "プランを選択", - "billing.upgrade": "アップグレード", - "billing.askCompanyAdmin": "会社の管理者に問い合わせる", - "billing.memberHint": "プラン変更または Checkout を開けるのは会社管理者のみです。", - "billing.unlimitedPlanWallet": "無制限プラン · ウォレット {wallet}", - "billing.creditsSuffix": "{label} クレジット", - "billing.perMonth": "{amount} / 月", - "billing.zeroPerMonth": "0 / 月", - "billing.upTo": "最大 {count}", - "billing.skusUnlimited": "{used} SKU(無制限)", + "standardFields.fallback.specs": "仕様", + "standardFields.fallback.specifications": "仕様(レガシー)", + "standardFields.tip.gtin": "GTIN — 商品を識別するバーコード/EAN/UPC。", + "standardFields.tip.title": "カタログやチャネルに表示される顧客向け商品名。", + "standardFields.tip.brand": "メーカーまたはブランド名(小売業者ではない)。", + "standardFields.tip.description": "より長い商品文。エンリッチメントとチャネル掲載に使用。", + "standardFields.tip.product_model": "メーカーのモデル名/番号。", + "standardFields.tip.price": "通常販売価格(数値。通貨は別途マッピング)。", + "standardFields.tip.sale_price": "セール時の割引またはプロモーション価格。", + "standardFields.tip.purchase_price": "原価 / 仕入価格(内部)。", + "standardFields.tip.currency": "価格フィールド用のISO通貨コード(例: EUR、USD)。", + "standardFields.tip.image_url": "商品のメイン画像URL。", + "standardFields.tip.main_image": "メインギャラリー画像URL(image のエイリアス)。", + "standardFields.tip.additional_image_urls": "追加画像URL(カンマ区切りまたは繰り返しノード)。", + "standardFields.tip.product_url": "店舗またはサイト上の公開商品ページURL。", + "standardFields.tip.official_link": "メーカーまたはブランドの商品ページURL。", + "standardFields.tip.sku": "SKU — 社内の品目コード。", + "standardFields.tip.mpn": "MPN — サプライヤーの部品コード。", + "standardFields.tip.category": "商品カテゴリまたはタクソノミパス。", + "standardFields.tip.availability": "在庫あり / 在庫なし / 予約 などのステータス。", + "standardFields.tip.stock": "数値の在庫数量。", + "standardFields.tip.color": "バリエーション用の色属性。", + "standardFields.tip.size": "バリエーション用のサイズ属性。", + "standardFields.tip.material": "主な素材または組成。", + "standardFields.tip.warranty": "保証期間または文言。", + "standardFields.tip.service": "サービスまたはサポートのメモ。", + "standardFields.tip.weight": "配送重量または正味重量。", + "standardFields.tip.eprel_id": "EUエネルギーラベル(EPREL)の製品識別子。", + "standardFields.tip.specs": "構造化された技術仕様。", + "standardFields.tip.specifications": "レガシーの仕様フィールド。両方ある場合は specs を優先。", + "export.dialog.title": "選択した商品をエクスポート", + "export.dialog.description": "選択した{count}件の商品をエクスポートします。形式とフィールドを定義するエクスポートフィードを選んでください — 同期対象の選択に似ていますが、ダウンロードまたはパートナー向けです。", + "export.dialog.loadFailed": "エクスポートフィードオプションの読み込みに失敗しました。もう一度お試しください。", + "export.dialog.selectPlaceholder": "エクスポートフィードを選択…", + "export.dialog.help": "選択は商品を決め、フィードはチャネル形式とマッピングされたフィールドを決めます。", + "export.dialog.emptyTitle": "エクスポートフィードはまだありません", + "export.dialog.emptyMessage": "形式とフィールドを選ぶエクスポートフィードを作成してから、この選択をエクスポートしてください。", + "export.dialog.createFeedCta": "エクスポートフィードを作成", + "export.dialog.confirmAria": "エクスポートを確認", + "export.dialog.export": "エクスポート", + "billing.title": "利用状況と請求", + "billing.loadFailed": "請求情報の読み込みに失敗しました", + "billing.usageLoadFailed": "利用状況の読み込みに失敗しました", + "billing.checkoutComplete": "Checkout完了。プランとクレジットはまもなく更新されます。", + "billing.checkoutCompletePlan": "プランを更新しました。{plan} のクレジットの準備ができました。", + "billing.checkoutCanceled": "Checkoutはキャンセルされました。変更はありません。", + "billing.portalReturned": "請求ポータルから戻りました。プランはここか Plans で管理できます。", + "billing.comparePlans": "プランを比較", + "billing.managePayment": "支払いを管理", + "billing.addCredits": "クレジットを追加", + "billing.addingCredits": "追加中…", + "billing.addCreditsTitle": "クレジットを追加", + "billing.addCreditsDescription": "プラットフォーム管理者専用。AIタイトル、説明、その他の有料ステップ用クレジットはすぐに利用できます。", + "billing.creditAmount": "クレジット額", + "billing.invalidCreditAmount": "有効なクレジット数を入力してください。", + "billing.companyNotFound": "会社が見つかりません。", + "billing.creditsAdded": "{amount} クレジットを追加しました。", + "billing.addCreditsFailed": "クレジットの追加に失敗しました。プラットフォーム管理者権限が必要な場合があります。", + "billing.planApplied": "プランを適用しました。クレジットの準備ができました。", + "billing.checkoutFailed": "チェックアウト失敗", + "billing.portalFailed": "請求ポータルを開けませんでした", + "billing.noPlanAssigned": "プラン未割当", + "billing.unlimited": "無制限", + "billing.payAsYouGo": "従量課金", + "billing.noMonthlyAiCredits": "月次AIクレジットなし", + "billing.header.noPlan": "まだプランが割り当てられていません。プランを選ぶか会社管理者に依頼してください。", + "billing.header.free": "AIクレジットなしでフィードをマッピングし、商品データを整備。", + "billing.header.enterprise": "無制限の商品とAI容量。", + "billing.header.payg": "従量課金 — クレジットは会社ウォレットから供給されます。", + "billing.header.remaining": "この期間の残りAIクレジット: {remaining}。", + "billing.na": "なし", + "billing.range.7d": "過去7æ—¥", + "billing.range.30d": "過去30æ—¥", + "billing.range.cycle": "現在の請求サイクル", + "billing.range.all": "全期間", + "billing.rangeOpt.7d": "過去7æ—¥", + "billing.rangeOpt.30d": "過去30æ—¥", + "billing.rangeOpt.cycle": "現在のサイクル", + "billing.rangeOpt.all": "全期間", + "billing.freeBannerTitle": "Freeプランをご利用中です", + "billing.freeBannerMessage": "アップグレードでAIタイトル・説明とより高い商品上限を利用できます。", + "billing.outOfCreditsTitle": "AIクレジットがなくなりました", + "billing.productLimitTitle": "商品上限に達しました", + "billing.outOfCreditsMessage": "クレジット追加またはアップグレードまで、AIタイトルと説明は一時停止されます。", + "billing.productLimitMessage": "アップグレードで商品容量を増やせます。", + "billing.lowCreditsTitle": "クレジットが少なくなっています", + "billing.lowCreditsMessage": "{plan} の残りクレジットは {remaining} のみです。次の大規模バッチの前にアップグレードしてください。", + "billing.currentPlan": "現在のプラン", + "billing.periodEnds": "請求期間は {date} に終了", + "billing.openEndedContract": "オープン契約", + "billing.creditWallet": "クレジットウォレット", + "billing.creditsRemaining": "残りクレジット", + "billing.enterpriseCapacity": "エンタープライズ管理容量", + "billing.paygUsed": "{used} 使用 · 月次割当なし", + "billing.trialLeftover": "トライアル / 残クレジット", + "billing.aiLockedFree": "FreeではAI利用不可", + "billing.usedOf": "{total} 中 {used} 使用", + "billing.noBalanceTitle": "クレジット残高はまだありません", + "billing.noBalanceBody": "このワークスペースの請求設定が完了すると、プランのクレジットがここに表示されます。", + "billing.needCapacity": "容量が足りませんか?", + "billing.selfServeUpgrade": "Starter、Growth、または Business へのセルフサービスアップグレード", + "billing.viaStripe": "Stripe経由", + "billing.checkoutUnavailable": "Stripe の設定が完了するまでセルフサービス購入は利用できません。プランについては営業にお問い合わせください。", + "billing.upgradeToGrowth": "Growthにアップグレード", + "billing.askAdminPlan": "会社管理者にプラン変更を依頼してください。", + "billing.usage": "利用状況", + "billing.productsProcessed": "{count} 件の商品を処理 · {range}", + "billing.updating": "更新中…", + "billing.productsByDay": "日別商品", + "billing.chartAmber": "アンバー = トークン。範囲: {range}。", + "billing.chartRange": "範囲: {range}。", + "billing.nothingToChartTitle": "まだグラフ化するデータがありません", + "billing.nothingToChartBody": "商品を追加するかフィードを接続 — 利用状況がここに表示されます。", + "billing.dailyChartsHint": "日次チャートは直近7日、30日、または現在の請求サイクルで利用できます。", + "billing.noNewProducts": "{range} に新商品はありません", + "billing.catalogOverall": "カタログ全体で {count} 件の商品があります。", + "billing.chartProducts": "商品", + "billing.chartTokens": "トークン", + "billing.chartEmpty": "この期間に商品はありません。", + "billing.adminStats": "{tokens} トークン · {jobs} ジョブ · {input} 入力 / {export} エクスポートフィード", + "billing.whatUsesCredits": "クレジットを使うもの", + "billing.burnsCredits": "クレジット消費", + "billing.noCreditCost": "クレジット費用なし", + "billing.publicPricing": "公開料金", + "billing.managePlanOnPlans": "プランでプランを管理", + "billing.recovery.pastDueTitle": "支払い延滞", + "billing.recovery.pastDueAdmin": "サブスクリプションの支払いに失敗しました。Customer Portal で支払いを更新してください — この猶予期間中はアクセスは開いたままです。", + "billing.recovery.pastDueMember": "請求に対応が必要です。会社管理者に Customer Portal での支払い更新を依頼してください。この猶予期間中はアクセスは開いたままです。", + "billing.recovery.openPortal": "Customer Portalを開く", + "billing.recovery.contactAdmin": "会社管理者に連絡", + "billing.recovery.goToBilling": "請求へ", + "billing.recovery.missingPlanTitle": "プラン未割り当て", + "billing.recovery.missingPlanMessage": "この会社には有効なプランがありません(移行スキップ後によくあります)。Checkout でプランを割り当てるかサポートに問い合わせてください — Unlimited 容量を想定しないでください。", + "billing.recovery.choosePlan": "プランを選択", + "billing.upgrade": "アップグレード", + "billing.askCompanyAdmin": "会社の管理者に問い合わせる", + "billing.memberHint": "プラン変更または Checkout を開けるのは会社管理者のみです。", + "billing.unlimitedPlanWallet": "無制限プラン · ウォレット {wallet}", + "billing.creditsSuffix": "{label} クレジット", + "billing.perMonth": "{amount} / 月", + "billing.zeroPerMonth": "0 / 月", + "billing.upTo": "最大 {count}", + "billing.skusUnlimited": "{used} SKU(無制限)", "billing.skusOnly": "{used} SKU", "billing.skusOf": "{used} / {max} SKU", - "billing.planKind.none": "有効なプランなし", - "billing.planKind.enterprise": "エンタープライズ / カスタム", - "billing.planKind.trial": "トライアル", - "billing.planKind.standard": "標準プラン", - "billing.creditUsage.normalize.label": "正規化、仕様、埋め込み", - "billing.creditUsage.normalize.detail": "データクリーンアップと属性埋め込みはAIクレジットを消費せずに実行されます。", - "billing.creditUsage.ai.label": "AIタイトルと説明", - "billing.creditUsage.ai.detail": "AI機能と生成テキスト量に基づき商品ごとに課金されます。", - "billing.creditUsage.eprel.label": "EPREL / エネルギーラベル", - "billing.creditUsage.eprel.detail": "すべてのプランで無料の公開EU EPRELデータ(クレジット不要)。", - "billing.creditUsage.campaign.label": "キャンペーンAIとブランド適用", - "billing.creditUsage.campaign.detail": "マネージドモデルを使う有料AIステップは会社クレジットを消費します。", - "exports.title": "エクスポートフィード", - "exports.description": "チャネルごとに公開する内容 — 商品とフィールド — を選び、ログイン不要の公開フィードURLを共有します。", - "exports.descriptionFiltered": "公開の Google Shopping、Meta、カスタムフィードリンク。{total} 件中 {filtered} 件を表示。", - "exports.loadFailed": "エクスポートフィードの読み込みに失敗しました", - "exports.loadFeedFailed": "エクスポートフィードの読み込みに失敗しました", - "exports.refresh": "更新", - "exports.refreshing": "更新中…", - "exports.create": "エクスポートフィードを作成", - "exports.edit": "エクスポートフィードを編集", - "exports.editDescription": "名前、ステータス、含める商品、マッピングするフィールドを更新します。", - "exports.howToTitle": "エクスポート内容の選び方", - "exports.howTo.choose": "フィードに含めるもの", - "exports.howTo.chooseBody": "— 作成/編集時にソースフィードと商品ステータスを設定し、公開URLにそれらの商品だけ含めるようにします。", - "exports.howTo.subset": "一時的なサブセット", - "exports.howTo.subsetBody": "—", - "exports.howTo.productsLink": "商品", - "exports.howTo.subsetTail": "で行を選択し、エクスポートすると、フィードの形式とフィールドでその商品だけダウンロードできます。", - "exports.howTo.google": "Google Shopping(訳)", - "exports.howTo.googleBody": "— CSV または XML プリセットを作成し、Generate で公開URLを Merchant Center → Products → Feeds → scheduled fetch にコピー。", - "exports.howTo.meta": "Metaカタログ", - "exports.howTo.metaBody": "— Commerce Manager データソース用の CSV プリセット。", - "exports.howTo.custom": "カスタムCSV/XML", - "exports.howTo.customBody": "— 任意のパートナー。同じ公開URLが cron / webhook 形式のポーラーで使えます。", + "billing.planKind.none": "有効なプランなし", + "billing.planKind.enterprise": "エンタープライズ / カスタム", + "billing.planKind.trial": "トライアル", + "billing.planKind.standard": "標準プラン", + "billing.creditUsage.normalize.label": "正規化、仕様、埋め込み", + "billing.creditUsage.normalize.detail": "データクリーンアップと属性埋め込みはAIクレジットを消費せずに実行されます。", + "billing.creditUsage.ai.label": "AIタイトルと説明", + "billing.creditUsage.ai.detail": "AI機能と生成テキスト量に基づき商品ごとに課金されます。", + "billing.creditUsage.eprel.label": "EPREL / エネルギーラベル", + "billing.creditUsage.eprel.detail": "すべてのプランで無料の公開EU EPRELデータ(クレジット不要)。", + "billing.creditUsage.campaign.label": "キャンペーンAIとブランド適用", + "billing.creditUsage.campaign.detail": "マネージドモデルを使う有料AIステップは会社クレジットを消費します。", + "exports.title": "エクスポートフィード", + "exports.description": "チャネルごとに公開する内容 — 商品とフィールド — を選び、ログイン不要の公開フィードURLを共有します。", + "exports.descriptionFiltered": "公開の Google Shopping、Meta、カスタムフィードリンク。{total} 件中 {filtered} 件を表示。", + "exports.loadFailed": "エクスポートフィードの読み込みに失敗しました", + "exports.loadFeedFailed": "エクスポートフィードの読み込みに失敗しました", + "exports.refresh": "æ›´æ–°", + "exports.refreshing": "更新中…", + "exports.create": "エクスポートフィードを作成", + "exports.edit": "エクスポートフィードを編集", + "exports.editDescription": "名前、ステータス、含める商品、マッピングするフィールドを更新します。", + "exports.howToTitle": "エクスポート内容の選び方", + "exports.howTo.choose": "フィードに含めるもの", + "exports.howTo.chooseBody": "— 作成/編集時にソースフィードと商品ステータスを設定し、公開URLにそれらの商品だけ含めるようにします。", + "exports.howTo.subset": "一時的なサブセット", + "exports.howTo.subsetBody": "—", + "exports.howTo.productsLink": "商品", + "exports.howTo.subsetTail": "で行を選択し、エクスポートすると、フィードの形式とフィールドでその商品だけダウンロードできます。", + "exports.howTo.google": "Google Shopping(訳)", + "exports.howTo.googleBody": "— CSV または XML プリセットを作成し、Generate で公開URLã‚’ Merchant Center → Products → Feeds → scheduled fetch にコピー。", + "exports.howTo.meta": "Metaカタログ", + "exports.howTo.metaBody": "— Commerce Manager データソース用の CSV プリセット。", + "exports.howTo.custom": "カスタムCSV/XML", + "exports.howTo.customBody": "— 任意のパートナー。同じ公開URLが cron / webhook 形式のポーラーで使えます。", "exports.howTo.rest": "REST", - "exports.howTo.restBody": "— APIキー:", - "exports.howTo.settingsApiKeys": "設定 → APIキー", - "exports.howTo.restTail": "(レガシーキーは移行されていません)pull", + "exports.howTo.restBody": "— APIキー:", + "exports.howTo.settingsApiKeys": "設定 → APIキー", + "exports.howTo.restTail": "(レガシーキーは移行されていません)pull", "exports.howTo.openapi": "OpenAPI", - "exports.feedStatus": "フィードの状態", - "exports.generating": "エクスポート生成中 — 大きなカタログでは時間がかかることがあります。", - "exports.generationFailed": "生成に失敗しました。上記のエラーを確認し、Refresh Feed を再試行してください。", - "exports.exportedProducts": "{count} 件の商品をエクスポートしました", - "exports.lastGenerated": "最終生成: {time}", - "exports.neverGenerated": "未生成", - "exports.searchPlaceholder": "フィードを検索...", - "exports.searchAria": "フィードを検索", - "exports.clearSearch": "検索をクリア", - "exports.loading": "フィードを読み込み中…", - "exports.loadErrorTitle": "エクスポートフィードを読み込めませんでした", - "exports.loadErrorBody": "エクスポートの読み込み中に問題が発生しました。再試行するか、上記のエラーで詳細を確認してください。", - "exports.tryAgain": "再試行", - "exports.emptyTitle": "エクスポートフィードはまだありません", - "exports.emptyBody": "Google Shopping、Meta、またはカスタムCSV/XMLフィードを作成し、出力する商品とフィールドを選びます。Merchant Centerやパートナー向けの公開URLを生成するか、商品画面で選択分だけエクスポートできます。", - "exports.emptyCta": "Google ショッピングフィードを作成", - "exports.noMatchTitle": "一致するFeedなし", - "exports.noMatchBody": "別の検索語を試してください。", - "exports.col.name": "名前", - "exports.col.format": "形式", - "exports.col.feedUrl": "フィードURL", - "exports.col.lastGenerated": "最終生成", - "exports.col.status": "ステータス", - "exports.col.actions": "操作", - "exports.working": "処理中。", - "exports.generatingShort": "生成中…", - "exports.copyUrl": "URLをコピー", - "exports.openMenu": "メニューを開く", - "exports.preview": "プレビュー", - "exports.download": "ダウンロード", - "exports.refreshFeed": "フィードを更新", - "exports.editAction": "編集", - "exports.delete": "削除", - "exports.rotateToken": "URLトークンをローテーション", - "exports.rotateFailed": "フィードURLトークンのローテーションに失敗しました", - "exports.deleting": "削除中…", - "exports.channelPreset": "チャネルプリセット", - "exports.name": "名前", - "exports.format": "形式", - "exports.sourceFeed": "ソースフィード(任意)", - "exports.sourceFeedHelp": "このフィードを1つの入力フィードの商品に限定するか、「すべての商品」のままにします — 公開URLに含める内容の選び方です。", - "exports.allProducts": "すべての商品", - "exports.rootElement": "ルート要素", - "exports.itemElement": "アイテム要素", - "exports.productStatuses": "商品ステータス(カンマ区切り)", - "exports.productStatusesHelp": "これらのステータスの商品のみ含めます(例: active)。空欄ですべてのステータス。", - "exports.status": "ステータス", - "exports.active": "有効", - "exports.inactive": "無効", - "exports.fieldMappings": "フィールドマッピング", - "exports.addField": "フィールドを追加", - "exports.outputKey": "出力キー", - "exports.source": "ソース", - "exports.customSource": "カスタム(attr.* / spec.*)", - "exports.removeField": "フィールドを削除", - "exports.fieldHelp": "エクスポートは処理済み商品を読み取ります(フォールバックは生の mapped_data)。EPRELフィールドには eprel_* / energy_*、1つの仕様には spec.*、すべての仕様をXMLノードに展開するには specifications.* を使います。", - "exports.saving": "保存中…", - "exports.saveChanges": "変更を保存", - "exports.createFeed": "フィードを作成", - "exports.updated": "エクスポートフィードを更新しました。", - "exports.created": "エクスポートフィードを作成しました。", - "exports.saveFailed": "保存に失敗しました", - "exports.urlCopied": "公開 {format} フィードURLをコピーしました。商品フィードを取得する任意のシステムに貼り付けてください。", - "exports.copyFailed": "URLのクリップボードへのコピーに失敗しました", - "exports.refreshed": "フィードを更新しました", - "exports.refreshedWithCount": "フィードを更新しました({count} 件)。", - "exports.refreshFailed": "フィードの更新に失敗しました", - "exports.deleteConfirm": "このエクスポートフィードを削除しますか?", - "exports.deleted": "エクスポートフィードを削除しました。", - "exports.deleteFailed": "エクスポートフィードの削除に失敗しました", - "exports.defaultName": "新しいエクスポートフィード", - "exports.fallbackName": "エクスポートフィード", - "exports.dialog.selectTitle": "選択した商品をエクスポート", - "exports.dialog.selectDescription": "選択した {count} 件の商品に使うエクスポートフィード設定を選択してください。", - "exports.dialog.noneFound": "エクスポートフィード設定が見つかりません。Export Feeds セクションで作成してください。", - "exports.dialog.loadFailed": "エクスポートフィードオプションの読み込みに失敗しました。もう一度お試しください。", - "exports.dialog.selectRequired": "エクスポートフィード形式を選択してください。", - "exports.dialog.selectPlaceholder": "エクスポートフィード形式を選択...", - "exports.dialog.confirmAria": "エクスポートを確認", - "exports.dialog.export": "エクスポート", + "exports.feedStatus": "フィードの状態", + "exports.generating": "エクスポート生成中 — 大きなカタログでは時間がかかることがあります。", + "exports.generationFailed": "生成に失敗しました。上記のエラーを確認し、Refresh Feed を再試行してください。", + "exports.exportedProducts": "{count} 件の商品をエクスポートしました", + "exports.lastGenerated": "最終生成: {time}", + "exports.neverGenerated": "未生成", + "exports.searchPlaceholder": "フィードを検索...", + "exports.searchAria": "フィードを検索", + "exports.clearSearch": "検索をクリア", + "exports.loading": "フィードを読み込み中…", + "exports.loadErrorTitle": "エクスポートフィードを読み込めませんでした", + "exports.loadErrorBody": "エクスポートの読み込み中に問題が発生しました。再試行するか、上記のエラーで詳細を確認してください。", + "exports.tryAgain": "再試行", + "exports.emptyTitle": "エクスポートフィードはまだありません", + "exports.emptyBody": "Google Shopping、Meta、またはカスタムCSV/XMLフィードを作成し、出力する商品とフィールドを選びます。Merchant Centerやパートナー向けの公開URLを生成するか、商品画面で選択分だけエクスポートできます。", + "exports.emptyCta": "Google ショッピングフィードを作成", + "exports.noMatchTitle": "一致するFeedなし", + "exports.noMatchBody": "別の検索語を試してください。", + "exports.col.name": "名前", + "exports.col.format": "形式", + "exports.col.feedUrl": "フィードURL", + "exports.col.lastGenerated": "最終生成", + "exports.col.status": "ステータス", + "exports.col.actions": "操作", + "exports.working": "処理中。", + "exports.generatingShort": "生成中…", + "exports.copyUrl": "URLをコピー", + "exports.openMenu": "メニューを開く", + "exports.preview": "プレビュー", + "exports.download": "ダウンロード", + "exports.refreshFeed": "フィードを更新", + "exports.editAction": "編集", + "exports.delete": "削除", + "exports.rotateToken": "URLトークンをローテーション", + "exports.rotateFailed": "フィードURLトークンのローテーションに失敗しました", + "exports.deleting": "削除中…", + "exports.channelPreset": "チャネルプリセット", + "exports.name": "名前", + "exports.format": "形式", + "exports.sourceFeed": "ソースフィード(任意)", + "exports.sourceFeedHelp": "このフィードを1つの入力フィードの商品に限定するか、「すべての商品」のままにします — 公開URLに含める内容の選び方です。", + "exports.allProducts": "すべての商品", + "exports.rootElement": "ルート要素", + "exports.itemElement": "アイテム要素", + "exports.productStatuses": "商品ステータス(カンマ区切り)", + "exports.productStatusesHelp": "これらのステータスの商品のみ含めます(例: active)。空欄ですべてのステータス。", + "exports.status": "ステータス", + "exports.active": "有効", + "exports.inactive": "無効", + "exports.fieldMappings": "フィールドマッピング", + "exports.addField": "フィールドを追加", + "exports.outputKey": "出力キー", + "exports.source": "ソース", + "exports.customSource": "カスタム(attr.* / spec.*)", + "exports.removeField": "フィールドを削除", + "exports.fieldHelp": "エクスポートは処理済み商品を読み取ります(フォールバックは生の mapped_data)。EPRELフィールドには eprel_* / energy_*、1つの仕様には spec.*、すべての仕様をXMLノードに展開するには specifications.* を使います。", + "exports.saving": "保存中…", + "exports.saveChanges": "変更を保存", + "exports.createFeed": "フィードを作成", + "exports.updated": "エクスポートフィードを更新しました。", + "exports.created": "エクスポートフィードを作成しました。", + "exports.saveFailed": "保存に失敗しました", + "exports.urlCopied": "公開 {format} フィードURLをコピーしました。商品フィードを取得する任意のシステムに貼り付けてください。", + "exports.copyFailed": "URLのクリップボードへのコピーに失敗しました", + "exports.refreshed": "フィードを更新しました", + "exports.refreshedWithCount": "フィードを更新しました({count} 件)。", + "exports.refreshFailed": "フィードの更新に失敗しました", + "exports.deleteConfirm": "このエクスポートフィードを削除しますか?", + "exports.deleted": "エクスポートフィードを削除しました。", + "exports.deleteFailed": "エクスポートフィードの削除に失敗しました", + "exports.defaultName": "新しいエクスポートフィード", + "exports.fallbackName": "エクスポートフィード", + "exports.dialog.selectTitle": "選択した商品をエクスポート", + "exports.dialog.selectDescription": "選択した {count} 件の商品に使うエクスポートフィード設定を選択してください。", + "exports.dialog.noneFound": "エクスポートフィード設定が見つかりません。Export Feeds セクションで作成してください。", + "exports.dialog.loadFailed": "エクスポートフィードオプションの読み込みに失敗しました。もう一度お試しください。", + "exports.dialog.selectRequired": "エクスポートフィード形式を選択してください。", + "exports.dialog.selectPlaceholder": "エクスポートフィード形式を選択...", + "exports.dialog.confirmAria": "エクスポートを確認", + "exports.dialog.export": "エクスポート", "exports.preset.google_shopping_csv.label": "Google Shopping (CSV)", "exports.preset.google_shopping_csv.shortLabel": "Google Shopping CSV", - "exports.preset.google_shopping_csv.description": "標準のGoogle列(id、title、price、gtin、…)を持つ Merchant Center 商品フィード。", - "exports.preset.google_shopping_csv.hint": "フィードを更新したら、公開CSV URLを Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch にコピーします。", + "exports.preset.google_shopping_csv.description": "標準のGoogle列(id、title、price、gtin、…)を持つ Merchant Center 商品フィード。", + "exports.preset.google_shopping_csv.hint": "フィードを更新したら、公開CSV URLã‚’ Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch にコピーします。", "exports.preset.google_shopping_csv.defaultName": "Google Shopping CSV", - "exports.preset.google_shopping_xml.label": "Google Shopping (XML)(訳)", - "exports.preset.google_shopping_xml.shortLabel": "Google Shopping XML(訳)", - "exports.preset.google_shopping_xml.description": "Merchant Center XMLフィード用の、XML要素と同じGoogle列(g:id、g:title、…)。", - "exports.preset.google_shopping_xml.hint": "公開XML URLを Merchant Center に scheduled fetch として貼り付けます。必要なら Field mappings で不足しているストアフィールド(link、price)をマッピングします。", - "exports.preset.google_shopping_xml.defaultName": "Google Shopping XML(訳)", - "exports.preset.meta_csv.label": "Metaカタログ(CSV)", - "exports.preset.meta_csv.shortLabel": "Meta CSV(訳)", - "exports.preset.meta_csv.description": "Facebook / Instagram Commerce カタログ列(id、title、availability、price、image_link、…)。", - "exports.preset.meta_csv.hint": "Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed で公開CSV URLを貼り付けます。", - "exports.preset.meta_csv.defaultName": "Metaカタログ CSV", - "exports.preset.custom_csv.label": "カスタムCSV", - "exports.preset.custom_csv.shortLabel": "カスタムCSV", - "exports.preset.custom_csv.description": "任意のパートナーや webhook 用に独自の列と商品ソースを選択できます。", - "exports.preset.custom_csv.hint": "出力キーは自由に追加・名前変更できます。公開URLはログインなしでダウンロードできます。", - "exports.preset.custom_csv.defaultName": "カスタムCSVエクスポート", - "exports.preset.custom_xml.label": "カスタムXML", - "exports.preset.custom_xml.shortLabel": "カスタムXML", - "exports.preset.custom_xml.description": "独自の root/item 名とフィールドマッピングでカスタムXML形状を構築。", - "exports.preset.custom_xml.hint": "root と item の要素名を設定し、各出力キーを商品ソースにマッピングします。", - "exports.preset.custom_xml.defaultName": "カスタムXMLエクスポート", - "processing.title": "処理", - "processing.description": "商品処理ジョブのライブパイプライン進捗。このタブが表示されている間は自動更新されます。完了したジョブは承認/編集/却下のため Needs Review にリンクします。", - "processing.refresh": "更新", - "processing.loadFailed": "処理ジョブの読み込みに失敗しました", - "processing.tooManyRequests": "リクエストが多すぎます — しばらく待ってから再試行してください。", - "processing.serverError": "{fallback}(サーバーエラー {status})。しばらくしてから再試行してください。", + "exports.preset.google_shopping_xml.label": "Google Shopping (XML)(訳)", + "exports.preset.google_shopping_xml.shortLabel": "Google Shopping XML(訳)", + "exports.preset.google_shopping_xml.description": "Merchant Center XMLフィード用の、XML要素と同じGoogle列(g:id、g:title、…)。", + "exports.preset.google_shopping_xml.hint": "公開XML URLã‚’ Merchant Center に scheduled fetch として貼り付けます。必要なら Field mappings で不足しているストアフィールド(link、price)をマッピングします。", + "exports.preset.google_shopping_xml.defaultName": "Google Shopping XML(訳)", + "exports.preset.meta_csv.label": "Metaカタログ(CSV)", + "exports.preset.meta_csv.shortLabel": "Meta CSV(訳)", + "exports.preset.meta_csv.description": "Facebook / Instagram Commerce カタログ列(id、title、availability、price、image_link、…)。", + "exports.preset.meta_csv.hint": "Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed で公開CSV URLを貼り付けます。", + "exports.preset.meta_csv.defaultName": "Metaカタログ CSV", + "exports.preset.custom_csv.label": "カスタムCSV", + "exports.preset.custom_csv.shortLabel": "カスタムCSV", + "exports.preset.custom_csv.description": "任意のパートナーや webhook 用に独自の列と商品ソースを選択できます。", + "exports.preset.custom_csv.hint": "出力キーは自由に追加・名前変更できます。公開URLはログインなしでダウンロードできます。", + "exports.preset.custom_csv.defaultName": "カスタムCSVエクスポート", + "exports.preset.custom_xml.label": "カスタムXML", + "exports.preset.custom_xml.shortLabel": "カスタムXML", + "exports.preset.custom_xml.description": "独自の root/item 名とフィールドマッピングでカスタムXML形状を構築。", + "exports.preset.custom_xml.hint": "root と item の要素名を設定し、各出力キーを商品ソースにマッピングします。", + "exports.preset.custom_xml.defaultName": "カスタムXMLエクスポート", + "processing.title": "処理", + "processing.description": "商品処理ジョブのライブパイプライン進捗。このタブが表示されている間は自動更新されます。完了したジョブは承認/編集/却下のため Needs Review にリンクします。", + "processing.refresh": "æ›´æ–°", + "processing.loadFailed": "処理ジョブの読み込みに失敗しました", + "processing.tooManyRequests": "リクエストが多すぎます — しばらく待ってから再試行してください。", + "processing.serverError": "{fallback}(サーバーエラー {status})。しばらくしてから再試行してください。", "processing.httpError": "{fallback} (HTTP {status})", - "processing.cancelFailed": "このタスクをキャンセルできませんでした", - "processing.retryFailed": "このタスクを再試行できませんでした", - "processing.cancelledMsg": "「{name}」をキャンセルしました。", - "processing.queuedRetry": "「{name}」を再試行キューに入れました。", - "processing.jobFallback": "ジョブ {id}", - "processing.tasks": "タスク", - "processing.pipelineHint": "パイプライン: normalize → specs → fill → EPREL → AI。大規模な開始は兄弟ジョブに分割されることがあります。", - "processing.emptyTitle": "バックグラウンドタスクはまだありません", - "processing.emptyBody": "まだバックグラウンドジョブはありません。準備ができたら Products から新しいジョブを開始してください。", - "processing.startJob": "ジョブを開始", - "processing.connectFeed": "Feedを接続", - "processing.splitBatch": "バッチ分割 · {jobs} ジョブ · {products} 件の商品", - "processing.col.task": "タスク", - "processing.col.status": "ステータス", - "processing.col.steps": "ステップ", - "processing.col.progress": "進捗", - "processing.col.started": "開始済み", - "processing.col.completed": "完了", - "processing.col.actions": "操作", - "processing.partOfBatch": "· バッチの一部", - "processing.nowStep": "現在: {step}", - "processing.skip": "(スキップ)", - "processing.reviewResults": "結果を確認", - "processing.reviewTitle": "Needs Review を開いてエンリッチメントを承認、編集、または却下", - "processing.cancel": "キャンセル", - "processing.cancelling": "キャンセル中…", - "processing.cancelTitle": "この待機中または実行中のジョブをキャンセル", - "processing.retry": "再試行", - "processing.retrying": "再試行中…", - "processing.actions.onPage": "このページに {count} 件", - "processing.actions.clearSelection": "選択をクリア", - "processing.actions.processSelected": "選択を処理", - "processing.actions.processAria": "選択した商品を処理", - "processing.actions.processAriaCount": "このページで選択した {count} 件の商品{plural}を処理", - "processing.actions.whatToProcess": "処理対象", - "processing.actions.freeNoAiTitle": "Freeプラン — AIクレジットなし", - "processing.actions.freeNoAiBody": "Normalize、specs、fill、EPREL は引き続き実行されます。AIタイトル/説明には有料プランまたはクレジットが必要です。", - "processing.actions.comparePlans": "プランを比較", - "processing.actions.selectAll": "すべて選択", - "processing.actions.selectAllAria": "すべての処理モードを選択", - "processing.actions.upgradeRequired": "{label}(アップグレードが必要)", - "processing.actions.upgradeSuffix": " · アップグレード", - "processing.actions.credits": "{credits} クレジット", - "processing.actions.free": "無料", - "processing.actions.autoCategorizeTitle": "カテゴリ分類を自動追加中", - "processing.actions.autoCategorizeBody": "{types} 処理のため {count} 件の商品にカテゴリ分類が必要です", - "processing.actions.aiLocked": "Free ではAIオプションがロックされています。タイトル/説明を処理するにはアップグレードしてください。", - "processing.actions.totalCredits": "合計クレジット(このページで {count}):", - "processing.actions.starting": "開始中…", - "processing.actions.processCount": "このページの {count} 件を処理", - "processing.actions.close": "閉じる", - "processing.actions.accept": "承認", - "processing.actions.acceptEnrichment": "エンリッチメントを承認", - "processing.actions.export": "エクスポート", - "processing.actions.exportSelected": "選択をエクスポート", - "processing.actions.reject": "却下", - "processing.actions.rejectReset": "拒否(リセット)", - "processing.actions.resetUnprocessed": "未処理にリセット", - "processing.actions.confirmTitle": "処理を確認", - "processing.actions.confirmBody": "このページの {count} 件の商品を {credits} クレジットで処理します。クレジットはジョブ開始時に消費され、この操作からは取り消せません。", - "processing.actions.confirmStart": "処理を開始", - "processing.option.category": "カテゴリ", - "processing.option.attributes": "属性 / 仕様", - "processing.option.title": "タイトル(AI)", - "processing.option.description": "説明(AI)", - "processing.receipt.view": "処理で表示", - "processing.receipt.undo": "元に戻す", - "processing.receipt.format": "{succeeded} 成功 · {skipped} スキップ · {failed} 失敗", - "processing.receipt.cancelledOne": "処理をキャンセルしました", - "processing.receipt.cancelledMany": "処理ジョブをキャンセルしました", - "processing.receipt.cancelledDesc": "開始直後のジョブがキャンセルされました。", - "processing.receipt.cancelFailed": "処理ジョブをキャンセルできませんでした", - "unsubscribe.title": "配信停止", - "unsubscribe.me": "配信を停止する", - "unsubscribe.invalidLink": "無効なリンク", - "unsubscribe.failedShort": "配信停止に失敗しました", - "unsubscribe.already": "すでに配信停止済みです。", - "unsubscribe.confirmPrompt": "以下で確認してマーケティングメールの配信を停止します。", - "unsubscribe.done": "配信を停止しました。", - "stores.title": "ストアとソース", - "stores.description": "店舗や仕入先を一か所で接続 — Woo、Shopify、フィードURL、CSV。ライブ店舗: 商品は Descrybe → ストア、注文/レビューは ストア → Descrybe。カタログ準備後にエクスポート。", - "stores.allInputFeeds": "すべての入力フィード", - "stores.exportFeeds": "エクスポートFeed", - "stores.migrationNote": "Descrybe プラットフォーム移行後は、WooCommerce / Shopify の認証情報の再入力が必要になる場合があります。同期の不具合ではなく、再接続の手順です。", - "stores.docsPrefix": "ドキュメント:", - "stores.docsApiOverview": "API概要", - "stores.docsSuffix": "公開の商品アクセス用。ライブのストア同期には下の WooCommerce または Shopify を使います。", - "stores.connectorsHeading": "ストアとカタログのコネクタ", - "stores.statusAria": "ステータス: {label}", + "processing.cancelFailed": "このタスクをキャンセルできませんでした", + "processing.retryFailed": "このタスクを再試行できませんでした", + "processing.cancelledMsg": "「{name}」をキャンセルしました。", + "processing.queuedRetry": "「{name}」を再試行キューに入れました。", + "processing.jobFallback": "ジョブ {id}", + "processing.tasks": "タスク", + "processing.pipelineHint": "パイプライン: normalize → specs → fill → EPREL → AI。大規模な開始は兄弟ジョブに分割されることがあります。", + "processing.emptyTitle": "バックグラウンドタスクはまだありません", + "processing.emptyBody": "まだバックグラウンドジョブはありません。準備ができたら Products から新しいジョブを開始してください。", + "processing.startJob": "ジョブを開始", + "processing.connectFeed": "Feedを接続", + "processing.splitBatch": "バッチ分割 · {jobs} ジョブ · {products} 件の商品", + "processing.col.task": "タスク", + "processing.col.status": "ステータス", + "processing.col.steps": "ステップ", + "processing.col.progress": "進捗", + "processing.col.started": "開始済み", + "processing.col.completed": "完了", + "processing.col.actions": "操作", + "processing.partOfBatch": "· バッチの一部", + "processing.nowStep": "現在: {step}", + "processing.skip": "(スキップ)", + "processing.reviewResults": "結果を確認", + "processing.reviewTitle": "Needs Review を開いてエンリッチメントを承認、編集、または却下", + "processing.cancel": "キャンセル", + "processing.cancelling": "キャンセル中…", + "processing.cancelTitle": "この待機中または実行中のジョブをキャンセル", + "processing.retry": "再試行", + "processing.retrying": "再試行中…", + "processing.actions.onPage": "このページに {count} ä»¶", + "processing.actions.clearSelection": "選択をクリア", + "processing.actions.processSelected": "選択を処理", + "processing.actions.processAria": "選択した商品を処理", + "processing.actions.processAriaCount": "このページで選択した {count} 件の商品{plural}を処理", + "processing.actions.whatToProcess": "処理対象", + "processing.actions.freeNoAiTitle": "Freeプラン — AIクレジットなし", + "processing.actions.freeNoAiBody": "Normalize、specs、fill、EPREL は引き続き実行されます。AIタイトル/説明には有料プランまたはクレジットが必要です。", + "processing.actions.comparePlans": "プランを比較", + "processing.actions.selectAll": "すべて選択", + "processing.actions.selectAllAria": "すべての処理モードを選択", + "processing.actions.upgradeRequired": "{label}(アップグレードが必要)", + "processing.actions.upgradeSuffix": " · アップグレード", + "processing.actions.credits": "{credits} クレジット", + "processing.actions.free": "ç„¡æ–™", + "processing.actions.autoCategorizeTitle": "カテゴリ分類を自動追加中", + "processing.actions.autoCategorizeBody": "{types} 処理のため {count} 件の商品にカテゴリ分類が必要です", + "processing.actions.aiLocked": "Free ではAIオプションがロックされています。タイトル/説明を処理するにはアップグレードしてください。", + "processing.actions.totalCredits": "合計クレジット(このページで {count}):", + "processing.actions.starting": "開始中…", + "processing.actions.processCount": "このページの {count} 件を処理", + "processing.actions.close": "閉じる", + "processing.actions.accept": "承認", + "processing.actions.acceptEnrichment": "エンリッチメントを承認", + "processing.actions.export": "エクスポート", + "processing.actions.exportSelected": "選択をエクスポート", + "processing.actions.reject": "却下", + "processing.actions.rejectReset": "拒否(リセット)", + "processing.actions.resetUnprocessed": "未処理にリセット", + "processing.actions.confirmTitle": "処理を確認", + "processing.actions.confirmBody": "このページの {count} 件の商品を {credits} クレジットで処理します。クレジットはジョブ開始時に消費され、この操作からは取り消せません。", + "processing.actions.confirmStart": "処理を開始", + "processing.option.category": "カテゴリ", + "processing.option.attributes": "属性 / 仕様", + "processing.option.title": "タイトル(AI)", + "processing.option.description": "説明(AI)", + "processing.receipt.view": "処理で表示", + "processing.receipt.undo": "元に戻す", + "processing.receipt.format": "{succeeded} 成功 · {skipped} スキップ · {failed} 失敗", + "processing.receipt.cancelledOne": "処理をキャンセルしました", + "processing.receipt.cancelledMany": "処理ジョブをキャンセルしました", + "processing.receipt.cancelledDesc": "開始直後のジョブがキャンセルされました。", + "processing.receipt.cancelFailed": "処理ジョブをキャンセルできませんでした", + "unsubscribe.title": "配信停止", + "unsubscribe.me": "配信を停止する", + "unsubscribe.invalidLink": "無効なリンク", + "unsubscribe.failedShort": "配信停止に失敗しました", + "unsubscribe.already": "すでに配信停止済みです。", + "unsubscribe.confirmPrompt": "以下で確認してマーケティングメールの配信を停止します。", + "unsubscribe.done": "配信を停止しました。", + "stores.title": "ストアとソース", + "stores.description": "店舗や仕入先を一か所で接続 — Woo、Shopify、フィードURL、CSV。ライブ店舗: 商品は Descrybe → ストア、注文/レビューは ストア → Descrybe。カタログ準備後にエクスポート。", + "stores.allInputFeeds": "すべての入力フィード", + "stores.exportFeeds": "エクスポートFeed", + "stores.migrationNote": "Descrybe プラットフォーム移行後は、WooCommerce / Shopify の認証情報の再入力が必要になる場合があります。同期の不具合ではなく、再接続の手順です。", + "stores.docsPrefix": "ドキュメント:", + "stores.docsApiOverview": "API概要", + "stores.docsSuffix": "公開の商品アクセス用。ライブのストア同期には下の WooCommerce または Shopify を使います。", + "stores.connectorsHeading": "ストアとカタログのコネクタ", + "stores.statusAria": "ステータス: {label}", "stores.ctaAria": "{cta}: {title}", - "stores.startTitle": "どこから始めますか?", - "stores.startBody": "Woo ストア → WooCommerce。Shopify やその他のプラットフォーム → フィード URL または CSV アップロード。Merchant Center やパートナー向け → エクスポートフィード(Google Shopping プリセットまたはカスタムフィールド)。移行後は同期を期待する前に Woo/Shopify を再接続してください。", - "stores.startBodyMember": "WooCommerce または Shopify の接続は会社管理者に依頼してください。接続済みストアの同期・閲覧や、プランで許可されていれば Feed URL / CSV / エクスポートフィードは利用できます。", - "stores.wizard.title": "ストア設定ガイド", - "stores.wizard.description": "ストアを接続し、接続をテストし、最初の商品同期をキューに入れて完了です。", - "stores.wizard.guidedSetup": "ガイド付きセットアップ", - "stores.wizard.guidedSetupAria": "ガイド付きストア設定を開始", - "stores.wizard.adminOnly": "ガイド付きストア設定(認証情報の保存と初回同期)は会社管理者のみ実行できます。接続済みストアは引き続き開けます。", - "stores.wizard.pickChannel": "ストアコネクタを選択", - "stores.wizard.pickChannelBody": "WooCommerce または Shopify を選びます。コネクタページで接続→テスト→初回同期を行い、ここに戻ります。", + "stores.startTitle": "どこから始めますか?", + "stores.startBody": "Woo ストア → WooCommerce。Shopify やその他のプラットフォーム → フィード URL または CSV アップロード。Merchant Center やパートナー向け → エクスポートフィード(Google Shopping プリセットまたはカスタムフィールド)。移行後は同期を期待する前に Woo/Shopify を再接続してください。", + "stores.startBodyMember": "WooCommerce または Shopify の接続は会社管理者に依頼してください。接続済みストアの同期・閲覧や、プランで許可されていれば Feed URL / CSV / エクスポートフィードは利用できます。", + "stores.wizard.title": "ストア設定ガイド", + "stores.wizard.description": "ストアを接続し、接続をテストし、最初の商品同期をキューに入れて完了です。", + "stores.wizard.guidedSetup": "ガイド付きセットアップ", + "stores.wizard.guidedSetupAria": "ガイド付きストア設定を開始", + "stores.wizard.adminOnly": "ガイド付きストア設定(認証情報の保存と初回同期)は会社管理者のみ実行できます。接続済みストアは引き続き開けます。", + "stores.wizard.pickChannel": "ストアコネクタを選択", + "stores.wizard.pickChannelBody": "WooCommerce または Shopify を選びます。コネクタページで接続→テスト→初回同期を行い、ここに戻ります。", "stores.wizard.channel.shopify": "Shopify", "stores.wizard.channel.woocommerce": "WooCommerce", - "stores.wizard.channelLabel": "設定中: {channel}", - "stores.wizard.changeChannel": "コネクタを変更", - "stores.wizard.noChannels": "プランにストアコネクタがありません。アップグレードするか管理者に問い合わせてください。", - "stores.wizard.progress": "{done} / {total} 完了", - "stores.wizard.stepsLabel": "ストア設定ステップ", - "stores.wizard.step.connect.title": "接続", - "stores.wizard.step.connect.body": "コネクタページで認証情報を保存します。", - "stores.wizard.step.test.title": "接続テスト", - "stores.wizard.step.test.body": "接続テストが成功するまで実行します。", - "stores.wizard.step.sync.title": "初回同期", - "stores.wizard.step.sync.body": "最初の商品同期をキューに入れます(必要なら同期を有効化)。", - "stores.wizard.step.done.title": "完了", - "stores.wizard.step.done.body": "ストアが接続され、同期が開始または完了しました。", - "stores.wizard.openConnector": "コネクタを開く", - "stores.wizard.viewProducts": "商品を見る", - "stores.wizard.backToHub": "ストア一覧へ", - "stores.wizard.banner.generic": "ガイド設定: このステップを終えたらウィザードに戻ってください。", - "stores.wizard.banner.test": "ガイド設定 — 接続をテストしてからウィザードに戻ってください。", - "stores.wizard.banner.sync": "ガイド設定 — 初回商品同期をキューに入れてからウィザードに戻ってください。", - "stores.wizard.banner.return": "ウィザードに戻る", - "stores.wizard.banner.dismiss": "閉じる", + "stores.wizard.channelLabel": "設定中: {channel}", + "stores.wizard.changeChannel": "コネクタを変更", + "stores.wizard.noChannels": "プランにストアコネクタがありません。アップグレードするか管理者に問い合わせてください。", + "stores.wizard.progress": "{done} / {total} 完了", + "stores.wizard.stepsLabel": "ストア設定ステップ", + "stores.wizard.step.connect.title": "接続", + "stores.wizard.step.connect.body": "コネクタページで認証情報を保存します。", + "stores.wizard.step.test.title": "接続テスト", + "stores.wizard.step.test.body": "接続テストが成功するまで実行します。", + "stores.wizard.step.sync.title": "初回同期", + "stores.wizard.step.sync.body": "最初の商品同期をキューに入れます(必要なら同期を有効化)。", + "stores.wizard.step.done.title": "完了", + "stores.wizard.step.done.body": "ストアが接続され、同期が開始または完了しました。", + "stores.wizard.openConnector": "コネクタを開く", + "stores.wizard.viewProducts": "商品を見る", + "stores.wizard.backToHub": "ストア一覧へ", + "stores.wizard.banner.generic": "ガイド設定: このステップを終えたらウィザードに戻ってください。", + "stores.wizard.banner.test": "ガイド設定 — 接続をテストしてからウィザードに戻ってください。", + "stores.wizard.banner.sync": "ガイド設定 — 初回商品同期をキューに入れてからウィザードに戻ってください。", + "stores.wizard.banner.return": "ウィザードに戻る", + "stores.wizard.banner.dismiss": "閉じる", "stores.woo.title": "WooCommerce", - "stores.woo.description": "商品を Descrybe → WooCommerce へプッシュ。注文とレビューを WooCommerce → Descrybe へ取り込みます。", - "stores.woo.ctaReconnect": "Wooを再接続", - "stores.woo.ctaOpen": "Wooを開く", - "stores.woo.ctaConnect": "Wooに接続", - "stores.woo.ctaView": "Woo を表示", + "stores.woo.description": "商品を Descrybe → WooCommerce へプッシュ。注文とレビューを WooCommerce → Descrybe へ取り込みます。", + "stores.woo.ctaReconnect": "Wooを再接続", + "stores.woo.ctaOpen": "Wooを開く", + "stores.woo.ctaConnect": "Wooに接続", + "stores.woo.ctaView": "Woo を表示", "stores.shopify.title": "Shopify", - "stores.shopify.description": "商品を Descrybe → Shopify へ送信。注文を Shopify → Descrybe へ取り込み。レビューは Shopify Admin API では利用不可。", - "stores.shopify.ctaReconnect": "Shopifyを再接続", - "stores.shopify.ctaOpen": "Shopifyを開く", - "stores.shopify.ctaConnect": "Shopifyに接続", - "stores.shopify.ctaView": "Shopify を表示", - "stores.feedUrl.title": "フィードURL", - "stores.feedUrl.description": "Pull any supplier or ストア catalog from a public CSV or XML URL on a schedule. Map fields, then sync.", - "stores.feedUrl.cta": "Feed URLを追加", - "stores.csv.title": "CSVアップロード", - "stores.csv.description": "商品 CSV を入力フィードとしてアップロードします。単発の仕入先ファイルや Shopify 管理画面のエクスポートに最適です。", - "stores.csv.cta": "CSVをアップロード", - "stores.export.title": "エクスポート / REST", - "stores.export.description": "公開 URL 付きで Google Shopping またはカスタム CSV/XML を公開します。または API キー(/api/v1)で商品を取得します。", - "stores.export.cta": "エクスポートを開く", - "stores.apiKeys.title": "APIキー", - "stores.apiKeys.description": "旧 API キーは移行されていません。設定で新しいキーを作成して /api/v1 アクセスを復旧してください。シークレットは一度だけ表示されます。", - "stores.apiKeys.descriptionMember": "/api/v1 用の会社 API キーです。レガシーキーは移行されていません — 作成・取り消しは管理者のみ;設定でプレフィックスを確認できます。", - "stores.apiKeys.cta": "APIキーを管理", - "stores.apiKeys.ctaView": "API キーを表示", - "stores.status.needsReconnect": "再接続が必要", - "stores.status.connected": "接続済み", - "stores.status.notConnected": "未接続", - "stores.status.ready": "準備完了", - "stores.status.outbound": "アウトバウンド", - "stores.status.reissue": "再発行", - "store.tab.connection": "接続", - "store.tab.orders": "注文", - "store.tab.settings": "設定", - "store.tab.categories": "カテゴリ", - "store.tab.attributes": "属性", - "store.tab.reviews": "レビュー", - "store.badge.credentialsOnFile": "認証情報が保存済み", - "store.badge.syncEnabled": "商品プッシュ有効", - "store.badge.syncDisabled": "商品プッシュ無効", - "store.badge.syncQueued": "商品プッシュ待機中", - "store.badge.dryRun": "ドライラン", - "store.badge.testStatus": "テスト: {status}", - "store.badge.syncStatus": "商品プッシュ: {status}", - "store.badge.ordersQueued": "注文同期をキュー投入", - "store.badge.ordersStatus": "注文: {status}", - "store.badge.syncedCount": "{count} 件同期済み", - "store.badge.mappedCount": "{count} マッピング済み", - "store.badge.productsCount": "{count} 件の商品", - "store.badge.optionsCount": "{count} 件のオプション", - "store.lastSync": "最終同期: {date}", - "store.noOrdersSyncYet": "注文同期はまだ完了していません。", - "store.save": "保存", - "store.saving": "保存中...", - "store.testing": "テスト中...", - "store.testConnection": "接続をテスト", - "store.queueing": "キューに追加中...", - "store.queueProductPush": "商品プッシュをキュー (Descrybe → ストア)", - "store.queueFirstProductSync": "初回商品プッシュをキュー (Descrybe → ストア)", - "store.queueOrdersImport": "注文インポートをキュー (ストア → Descrybe)", - "store.refreshList": "リストを更新", - "store.saveBeforeTest": "テスト前に認証情報を保存してください", - "store.saveTestBeforeQueue": "同期前に認証情報を保存し接続をテストしてください", - "store.connectionOk": "接続OK", - "store.connectionSuccessful": "接続に成功しました", - "store.connectionSuccessfulDot": "接続に成功しました。", - "store.connectionFailed": "接続に失敗しました", - "store.connectionFailedDot": "接続に失敗しました。", - "store.connectionTestFailed": "接続テストに失敗しました", - "store.testFailed": "テスト失敗", - "store.setupSteps": "セットアップ手順", - "store.col.order": "注文", - "store.col.customer": "顧客", - "store.col.status": "ステータス", - "store.col.total": "合計", - "store.col.date": "日付", - "store.loadingOrders": "注文を読み込み中…", - "store.loadingOrdersDot": "注文を読み込み中。", - "flash.store.saveFailed": "設定を保存できませんでした", - "flash.store.queueSyncFailed": "同期をキューに入れられませんでした", - "flash.store.queueOrdersFailed": "注文同期をキューに入れられませんでした", - "flash.store.connectedTo": "{name} に接続しました。", - "flash.shopify.loadFailed": "Shopify設定の読み込みに失敗しました", - "flash.shopify.productSyncQueued": "商品同期をキューに入れました。ワーカーがまもなく実行します。", - "flash.shopify.ordersSyncQueued": "注文同期をキューに入れました。ワーカーがまもなく実行します。", - "flash.woo.loadFailed": "WooCommerce設定の読み込みに失敗しました", - "flash.woo.productSyncQueued": "商品同期をキューに入れました。まもなく実行されます。", - "flash.woo.ordersSyncQueued": "注文同期をキューに入れました。まもなく実行されます。", - "flash.woo.reviewsSyncQueued": "レビュー同期をキューに入れました。まもなく実行されます。", - "flash.woo.queueReviewsFailed": "レビュー同期をキューに入れられませんでした", - "flash.woo.remoteMapsFailed": "リモートマップの読み込みに失敗しました", - "flash.woo.syncSettingsFailed": "同期設定を保存できませんでした", - "flash.woo.categoryAutoMapFailed": "カテゴリの自動マップに失敗しました", - "flash.woo.attributeAutoMapFailed": "属性の自動マップに失敗しました", - "shopify.title": "Shopify連携", - "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", - "shopify.adminOnly": "Only 会社 admins can change Shopify connection 設定. 同期 and browse stay 利用可能.", - "shopify.lockedTitle": "Shopify接続はロックされています", - "shopify.noCredentialsMember": "Shopifyの認証情報はまだ登録されていません。会社の管理者にストア接続を依頼してください。保存と接続テストの後、同期と注文の閲覧が利用できます。", - "shopify.enterToken": "認証情報を入力", - "shopify.noCredentials": "Shopifyの認証情報が未登録です。*.myshopify.com ドメインと Dev Dashboard の Client ID + シークレット(または従来の Admin API トークン)を入力し、保存してから接続をテストしてください。プラットフォーム移行後、古いシークレットは引き継がれません。新しいトークンで再接続してください。", - "shopify.allConnectors": "すべてのストアコネクタ", - "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", + "stores.shopify.description": "商品を Descrybe → Shopify へ送信。注文を Shopify → Descrybe へ取り込み。レビューは Shopify Admin API では利用不可。", + "stores.shopify.ctaReconnect": "Shopifyを再接続", + "stores.shopify.ctaOpen": "Shopifyを開く", + "stores.shopify.ctaConnect": "Shopifyに接続", + "stores.shopify.ctaView": "Shopify を表示", + "stores.feedUrl.title": "フィードURL", + "stores.feedUrl.description": "Pull any supplier or ストア catalog from a public CSV or XML URL on a schedule. Map fields, then sync.", + "stores.feedUrl.cta": "Feed URLを追加", + "stores.csv.title": "CSVアップロード", + "stores.csv.description": "商品 CSV を入力フィードとしてアップロードします。単発の仕入先ファイルや Shopify 管理画面のエクスポートに最適です。", + "stores.csv.cta": "CSVをアップロード", + "stores.export.title": "エクスポート / REST", + "stores.export.description": "公開 URL 付きで Google Shopping またはカスタム CSV/XML を公開します。または API キー(/api/v1)で商品を取得します。", + "stores.export.cta": "エクスポートを開く", + "stores.apiKeys.title": "APIキー", + "stores.apiKeys.description": "æ—§ API キーは移行されていません。設定で新しいキーを作成して /api/v1 アクセスを復旧してください。シークレットは一度だけ表示されます。", + "stores.apiKeys.descriptionMember": "/api/v1 用の会社 API キーです。レガシーキーは移行されていません — 作成・取り消しは管理者のみ;設定でプレフィックスを確認できます。", + "stores.apiKeys.cta": "APIキーを管理", + "stores.apiKeys.ctaView": "API キーを表示", + "stores.status.needsReconnect": "再接続が必要", + "stores.status.connected": "接続済み", + "stores.status.notConnected": "未接続", + "stores.status.ready": "準備完了", + "stores.status.outbound": "アウトバウンド", + "stores.status.reissue": "再発行", + "store.tab.connection": "接続", + "store.tab.orders": "注文", + "store.tab.settings": "設定", + "store.tab.categories": "カテゴリ", + "store.tab.attributes": "属性", + "store.tab.reviews": "レビュー", + "store.badge.credentialsOnFile": "認証情報が保存済み", + "store.badge.syncEnabled": "商品プッシュ有効", + "store.badge.syncDisabled": "商品プッシュ無効", + "store.badge.syncQueued": "商品プッシュ待機中", + "store.badge.dryRun": "ドライラン", + "store.badge.testStatus": "テスト: {status}", + "store.badge.syncStatus": "商品プッシュ: {status}", + "store.badge.ordersQueued": "注文同期をキュー投入", + "store.badge.ordersStatus": "注文: {status}", + "store.badge.syncedCount": "{count} 件同期済み", + "store.badge.mappedCount": "{count} マッピング済み", + "store.badge.productsCount": "{count} 件の商品", + "store.badge.optionsCount": "{count} 件のオプション", + "store.lastSync": "最終同期: {date}", + "store.noOrdersSyncYet": "注文同期はまだ完了していません。", + "store.save": "保存", + "store.saving": "保存中...", + "store.testing": "テスト中...", + "store.testConnection": "接続をテスト", + "store.queueing": "キューに追加中...", + "store.queueProductPush": "商品プッシュをキュー (Descrybe → ストア)", + "store.queueFirstProductSync": "初回商品プッシュをキュー (Descrybe → ストア)", + "store.queueOrdersImport": "注文インポートをキュー (ストア → Descrybe)", + "store.refreshList": "リストを更新", + "store.saveBeforeTest": "テスト前に認証情報を保存してください", + "store.saveTestBeforeQueue": "同期前に認証情報を保存し接続をテストしてください", + "store.connectionOk": "接続OK", + "store.connectionSuccessful": "接続に成功しました", + "store.connectionSuccessfulDot": "接続に成功しました。", + "store.connectionFailed": "接続に失敗しました", + "store.connectionFailedDot": "接続に失敗しました。", + "store.connectionTestFailed": "接続テストに失敗しました", + "store.testFailed": "テスト失敗", + "store.setupSteps": "セットアップ手順", + "store.col.order": "注文", + "store.col.customer": "顧客", + "store.col.status": "ステータス", + "store.col.total": "合計", + "store.col.date": "日付", + "store.loadingOrders": "注文を読み込み中…", + "store.loadingOrdersDot": "注文を読み込み中。", + "flash.store.saveFailed": "設定を保存できませんでした", + "flash.store.queueSyncFailed": "同期をキューに入れられませんでした", + "flash.store.queueOrdersFailed": "注文同期をキューに入れられませんでした", + "flash.store.connectedTo": "{name} に接続しました。", + "flash.shopify.loadFailed": "Shopify設定の読み込みに失敗しました", + "flash.shopify.productSyncQueued": "商品同期をキューに入れました。ワーカーがまもなく実行します。", + "flash.shopify.ordersSyncQueued": "注文同期をキューに入れました。ワーカーがまもなく実行します。", + "flash.woo.loadFailed": "WooCommerce設定の読み込みに失敗しました", + "flash.woo.productSyncQueued": "商品同期をキューに入れました。まもなく実行されます。", + "flash.woo.ordersSyncQueued": "注文同期をキューに入れました。まもなく実行されます。", + "flash.woo.reviewsSyncQueued": "レビュー同期をキューに入れました。まもなく実行されます。", + "flash.woo.queueReviewsFailed": "レビュー同期をキューに入れられませんでした", + "flash.woo.remoteMapsFailed": "リモートマップの読み込みに失敗しました", + "flash.woo.syncSettingsFailed": "同期設定を保存できませんでした", + "flash.woo.categoryAutoMapFailed": "カテゴリの自動マップに失敗しました", + "flash.woo.attributeAutoMapFailed": "属性の自動マップに失敗しました", + "shopify.title": "Shopify連携", + "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", + "shopify.adminOnly": "Only 会社 admins can change Shopify connection 設定. 同期 and browse stay 利用可能.", + "shopify.lockedTitle": "Shopify接続はロックされています", + "shopify.noCredentialsMember": "Shopifyの認証情報はまだ登録されていません。会社の管理者にストア接続を依頼してください。保存と接続テストの後、同期と注文の閲覧が利用できます。", + "shopify.enterToken": "認証情報を入力", + "shopify.noCredentials": "Shopifyの認証情報が未登録です。*.myshopify.com ドメインと Dev Dashboard の Client ID + シークレット(または従来の Admin API トークン)を入力し、保存してから接続をテストしてください。プラットフォーム移行後、古いシークレットは引き継がれません。新しいトークンで再接続してください。", + "shopify.allConnectors": "すべてのストアコネクタ", + "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", "shopify.setup.oauthNote": "Still manual: create/install the app in Shopify and paste Client ID + secret here. Descrybe does not host a one-click App Store install. Legacy permanent shpat_ tokens from older Admin custom apps still work.", - "shopify.setup.scopesTitle": "必要なAdmin APIスコープ", + "shopify.setup.scopesTitle": "必要なAdmin APIスコープ", "shopify.setup.scopesIntro": "Add these scopes on the app version in the Dev Dashboard before you release and install:", "shopify.setup.step3.scopes": "write_products, read_products, read_orders", "shopify.setup.step3.mid": ", then", @@ -3841,810 +3842,810 @@ export const ja: MessageDict = { "shopify.setup.step5.clientId": "Client ID", "shopify.setup.step5.and": "and", "shopify.setup.step5.clientSecret": "Client secret", - "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", + "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", "shopify.setup.step5.save": "Save", - "shopify.setup.step5.arrow": "→", + "shopify.setup.step5.arrow": "→", "shopify.setup.step5.test": "Test Connection", "shopify.setup.step5.after": ". Descrybe stores secrets encrypted and refreshes the short-lived access token automatically.", "shopify.setup.step6.products": "Products", - "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", + "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", "shopify.setup.step6.orders": "Orders", - "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", + "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", "shopify.setup.step7.before": "No live shop yet? Enable", "shopify.setup.step7.dryRun": "Dry run", "shopify.setup.step7.after": "(or use the special dry-run access token) to walk through the flow without calling Shopify.", "shopify.setup.openDevDashboard": "Open Dev Dashboard", "shopify.setup.openDevelopApps": "Open shop Develop apps", "shopify.setup.openDevelopAppsNeedDomain": "Enter your shop domain below to unlock a direct Admin link for this store.", - "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", + "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", "shopify.setup.copyScopes": "Copy required scopes", "shopify.setup.scopesCopied": "Scopes copied", "shopify.setup.docsCreate": "Create app docs", "shopify.setup.docsTokens": "Access token docs", - "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", + "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", "shopify.setup.hideLegacyToken": "Hide legacy token field", - "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", + "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", "shopify.field.clientId": "Client ID", "shopify.field.clientSecret": "Client secret", - "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", + "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", "shopify.field.accessTokenHelp": "Only for custom apps created in Shopify Admin before January 2026. New apps should use Client ID + secret instead.", "shopify.placeholder.clientId": "Client ID from Dev Dashboard", - "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", + "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", "shopify.placeholder.clientSecret": "Client secret", - "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", + "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", "shopify.setup.scope.write_products": "write_products", - "shopify.setup.scope.write_productsWhy": "Shopifyで商品を作成・更新(送信プッシュ)", + "shopify.setup.scope.write_productsWhy": "Shopifyで商品を作成・更新(送信プッシュ)", "shopify.setup.scope.read_products": "read_products", - "shopify.setup.scope.read_productsWhy": "更新前にSKUで既存商品を検索", + "shopify.setup.scope.read_productsWhy": "更新前にSKUで既存商品を検索", "shopify.setup.scope.read_orders": "read_orders", - "shopify.setup.scope.read_ordersWhy": "Descrybeへ注文を取り込む(受信)", - "shopify.setup.step1": "プラットフォーム移行前にShopifyを接続していた場合: 新しい Dev Dashboard アプリを作成する(または新しいレガシートークンで再接続する)— 保存済みの古いシークレットは引き継がれません。", + "shopify.setup.scope.read_ordersWhy": "Descrybeへ注文を取り込む(受信)", + "shopify.setup.step1": "プラットフォーム移行前にShopifyを接続していた場合: 新しい Dev Dashboard アプリを作成する(または新しいレガシートークンで再接続する)— 保存済みの古いシークレットは引き継がれません。", "shopify.setup.step2.before": "Open the", "shopify.setup.step2.path": "Shopify Dev Dashboard", - "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", + "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", "shopify.setup.step3.before": "Create a version: set App URL (default home is fine for API-only), add scopes", "shopify.setup.step3.after": ".", "shopify.setup.step4.before": "From the app Home tab,", "shopify.setup.step4.after": "on your store (merchant must approve scopes).", - "shopify.testSectionTitle": "接続を確認", - "shopify.testHint": "先にショップドメインとトークンを保存してから接続テストを実行してください。成功すると、同期をキューする前にトークンとスコープが確認されます。", - "shopify.overwriteTitle": "Shopify商品を上書きしますか?", - "shopify.overwriteBodyCount": "送信の商品プッシュをキューに入れます。以前リンクした Shopify 商品 {count} 件が Descrybe の内容で更新される可能性があります。", - "shopify.overwriteBody": "送信の商品プッシュをキューに入れます。一致する Shopify 商品が Descrybe の内容で更新される可能性があります。", - "shopify.credentialsTitle": "ストア認証情報", - "shopify.credentialsDesc.before": "ショップドメインは次である必要があります", + "shopify.testSectionTitle": "接続を確認", + "shopify.testHint": "先にショップドメインとトークンを保存してから接続テストを実行してください。成功すると、同期をキューする前にトークンとスコープが確認されます。", + "shopify.overwriteTitle": "Shopify商品を上書きしますか?", + "shopify.overwriteBodyCount": "送信の商品プッシュをキューに入れます。以前リンクした Shopify 商品 {count} 件が Descrybe の内容で更新される可能性があります。", + "shopify.overwriteBody": "送信の商品プッシュをキューに入れます。一致する Shopify 商品が Descrybe の内容で更新される可能性があります。", + "shopify.credentialsTitle": "ストア認証情報", + "shopify.credentialsDesc.before": "ショップドメインは次である必要があります", "shopify.credentialsDesc.code": "*.myshopify.com", "shopify.credentialsDesc.after": "domain. Prefer Dev Dashboard Client ID + secret; legacy Admin API tokens still work.", - "shopify.field.shopDomain": "ショップドメイン", - "shopify.field.accessToken": "Admin APIアクセストークン", - "shopify.field.apiVersion": "APIバージョン", - "shopify.placeholder.tokenKeep": "********(空欄で現状維持)", - "shopify.enableSync": "商品プッシュを有効化 (Descrybe → Shopify)", - "shopify.dryRunLabel": "ドライラン(Shopifyライブ呼び出しなし)", - "shopify.ordersTitle": "注文インポート (Shopify → Descrybe)", - "shopify.ordersDesc": "Shopify → Descrybe — 注文と明細を Descrybe に取り込み(Shopify へは書き戻しません)。", - "shopify.ordersNeedsReconnect": "移行後に認証情報を再接続するまで注文インポートは実行できません。接続タブで保存してから接続をテストしてください。", - "shopify.notesTitle": "メモ", - "shopify.notesDesc": "Shopify connector capabilities(訳)", - "shopify.notes.productsLabel": "商品 (Descrybe → Shopify)", - "shopify.notes.productsBody": "— 処理済みの Descrybe 商品は Shopify で作成または更新されます(キャッシュされた Shopify 商品 id がない場合は GraphQL の SKU 一致)。再同期で一致したリモート項目が上書きされることがあります。", - "shopify.notes.ordersLabel": "注文 (Shopify → Descrybe)", - "shopify.notes.ordersBody": "— pulled for reporting and future audience workflows.(訳)", - "shopify.notes.reviewsLabel": "レビュー", - "shopify.notes.reviewsBody": "-- not サポートed. Shopify has no first-party 商品 reviews Admin API (third-party review apps are out of scope here).", - "shopify.notes.encryption.before": "トークン are encrypted at rest with", - "woo.title": "WooCommerce連携", - "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", - "woo.allStores": "すべてのストア", - "woo.adminOnly": "WooCommerce の接続とマッピングを変更できるのは会社管理者のみです。同期と閲覧はそのまま利用できます。", - "woo.enterCredentials": "認証情報を入力", - "woo.noCredentials": "WooCommerceの認証情報が未登録です。ストアURLを入力し、WordPressで読み取り/書き込みのREST APIキーを作成して Consumer Key と Secret を貼り付け、保存してから接続をテストしてください。プラットフォーム移行後、古いシークレットは引き継がれません。新しいキーで再接続してください。", - "woo.lockedTitle": "WooCommerce接続はロックされています", - "woo.noCredentialsMember": "WooCommerceの認証情報はまだ登録されていません。会社の管理者にストア接続を依頼してください。保存と接続テストの後、同期・注文・レビューが利用できます。", + "shopify.field.shopDomain": "ショップドメイン", + "shopify.field.accessToken": "Admin APIアクセストークン", + "shopify.field.apiVersion": "APIバージョン", + "shopify.placeholder.tokenKeep": "********(空欄で現状維持)", + "shopify.enableSync": "商品プッシュを有効化 (Descrybe → Shopify)", + "shopify.dryRunLabel": "ドライラン(Shopifyライブ呼び出しなし)", + "shopify.ordersTitle": "注文インポート (Shopify → Descrybe)", + "shopify.ordersDesc": "Shopify → Descrybe — 注文と明細を Descrybe に取り込み(Shopify へは書き戻しません)。", + "shopify.ordersNeedsReconnect": "移行後に認証情報を再接続するまで注文インポートは実行できません。接続タブで保存してから接続をテストしてください。", + "shopify.notesTitle": "メモ", + "shopify.notesDesc": "Shopify connector capabilities(訳)", + "shopify.notes.productsLabel": "商品 (Descrybe → Shopify)", + "shopify.notes.productsBody": "— 処理済みの Descrybe 商品は Shopify で作成または更新されます(キャッシュされた Shopify 商品 id がない場合は GraphQL の SKU 一致)。再同期で一致したリモート項目が上書きされることがあります。", + "shopify.notes.ordersLabel": "注文 (Shopify → Descrybe)", + "shopify.notes.ordersBody": "— pulled for reporting and future audience workflows.(訳)", + "shopify.notes.reviewsLabel": "レビュー", + "shopify.notes.reviewsBody": "-- not サポートed. Shopify has no first-party 商品 reviews Admin API (third-party review apps are out of scope here).", + "shopify.notes.encryption.before": "トークン are encrypted at rest with", + "woo.title": "WooCommerce連携", + "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", + "woo.allStores": "すべてのストア", + "woo.adminOnly": "WooCommerce の接続とマッピングを変更できるのは会社管理者のみです。同期と閲覧はそのまま利用できます。", + "woo.enterCredentials": "認証情報を入力", + "woo.noCredentials": "WooCommerceの認証情報が未登録です。ストアURLを入力し、WordPressで読み取り/書き込みのREST APIキーを作成して Consumer Key と Secret を貼り付け、保存してから接続をテストしてください。プラットフォーム移行後、古いシークレットは引き継がれません。新しいキーで再接続してください。", + "woo.lockedTitle": "WooCommerce接続はロックされています", + "woo.noCredentialsMember": "WooCommerceの認証情報はまだ登録されていません。会社の管理者にストア接続を依頼してください。保存と接続テストの後、同期・注文・レビューが利用できます。", "woo.setupDesc": "Follow these steps to create a WooCommerce REST API key in WordPress and connect it here. Descrybe never creates keys on your store for you.", - "woo.setup.step1": "プラットフォーム移行前にWooCommerceを接続していた場合: 新しいREST APIキーを作成してください — 保存済みの古い認証情報は使用できません。", + "woo.setup.step1": "プラットフォーム移行前にWooCommerceを接続していた場合: 新しいREST APIキーを作成してください — 保存済みの古い認証情報は使用できません。", "woo.setup.step2.before": "Enter your store", "woo.setup.step2.path": "HTTPS URL", "woo.setup.step2.after": "in the form below (example: https://yourstore.com).", "woo.setup.step3.before": "In WordPress admin, open", - "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", + "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", "woo.setup.step3.after": "(or use the deep link once your store URL is filled in).", "woo.setup.step4.before": "Click", "woo.setup.step4.addKey": "Add key", "woo.setup.step4.mid": ", set permissions to", "woo.setup.step4.permissions": "Read/Write", - "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", + "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", "woo.setup.step5.before": "Paste the key and secret below, enable sync if ready, then", "woo.setup.step5.save": "Save", - "woo.setup.step5.arrow": "→", + "woo.setup.step5.arrow": "→", "woo.setup.step5.test": "Test Connection", "woo.setup.step5.after": ".", "woo.setup.step6.products": "Products", - "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", + "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", "woo.setup.step6.orders": "Orders", "woo.setup.step6.and": "and", "woo.setup.step6.reviews": "reviews", - "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", - "woo.setup.openKeys": "REST API キーを開く", - "woo.setup.addKey": "キーを追加", - "woo.setup.openKeysHint": "WordPress 管理 → WooCommerce → 設定 → 高度な設定 → REST API を開きます。", - "woo.setup.openKeysNeedUrl": "管理リンクを開くには、先に有効なストア URL を保存してください。", - "woo.setup.docsLink": "WooCommerce REST API ドキュメント", - "woo.overwriteTitle": "WooCommerce商品を上書きしますか?", - "woo.overwriteBodyCount": "送信の商品プッシュをキューに入れます。以前リンクした WooCommerce 商品 {count} 件が Descrybe の内容で更新される可能性があります。", - "woo.overwriteBody": "送信の商品プッシュをキューに入れます。一致する WooCommerce 商品が Descrybe の内容で更新される可能性があります。", + "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", + "woo.setup.openKeys": "REST API キーを開く", + "woo.setup.addKey": "キーを追加", + "woo.setup.openKeysHint": "WordPress 管理 → WooCommerce → 設定 → 高度な設定 → REST API を開きます。", + "woo.setup.openKeysNeedUrl": "管理リンクを開くには、先に有効なストア URL を保存してください。", + "woo.setup.docsLink": "WooCommerce REST API ドキュメント", + "woo.overwriteTitle": "WooCommerce商品を上書きしますか?", + "woo.overwriteBodyCount": "送信の商品プッシュをキューに入れます。以前リンクした WooCommerce 商品 {count} 件が Descrybe の内容で更新される可能性があります。", + "woo.overwriteBody": "送信の商品プッシュをキューに入れます。一致する WooCommerce 商品が Descrybe の内容で更新される可能性があります。", "woo.connectionTitle": "Store connection", "woo.connectionDesc": "Paste your store URL and a Read/Write REST API key pair. Save, then Test Connection before queuing syncs.", - "woo.enableSync": "商品プッシュを有効化 (Descrybe → WooCommerce)", - "woo.field.storeUrl": "ストアURL", - "woo.field.storeUrlHelp": "https の公開サイト URL。WooCommerce REST API と WordPress 管理へのディープリンクに使用します。", + "woo.enableSync": "商品プッシュを有効化 (Descrybe → WooCommerce)", + "woo.field.storeUrl": "ストアURL", + "woo.field.storeUrlHelp": "https の公開サイト URL。WooCommerce REST API と WordPress 管理へのディープリンクに使用します。", "woo.field.consumerKey": "Consumer Key", "woo.field.consumerSecret": "Consumer Secret", - "woo.field.credentialsHelp": "読み取り/書き込み権限のコンシューマーキーとシークレット。既存の認証情報を残す場合は空のままにします。", - "woo.placeholder.keep": "********(変更なし)", - "woo.keepCredentialsHint": "保存時にキー/シークレットを空にすると既存の認証情報を維持します。", - "woo.saveConfiguration": "設定を保存", - "woo.categoryMappingTitle": "カテゴリマッピング", - "woo.categoryMappingDesc": "社内カテゴリを WooCommerce カテゴリに対応付けます", - "woo.autoMapCategories": "カテゴリを自動マップ", - "woo.autoMapping": "自動マッピング...", - "woo.refreshCategories": "カテゴリを更新", - "woo.availableCategories": "利用可能なWooCommerceカテゴリ", - "woo.categoriesEmptyHint": "接続をテストしてから更新し、WooCommerceカテゴリを読み込みます。", - "woo.attributeMappingTitle": "属性マッピング", - "woo.attributeMappingDesc": "社内属性を WooCommerce 属性に対応付けます", - "woo.autoMapAttributes": "属性を自動マップ", - "woo.refreshAttributes": "属性を更新", - "woo.availableAttributes": "利用可能なWooCommerce属性", - "woo.attributesEmptyHint": "接続をテストしてから更新し、WooCommerce属性を読み込みます。", - "woo.ordersTitle": "注文インポート (WooCommerce → Descrybe)", - "woo.ordersDesc": "WooCommerce → Descrybe — 注文と明細を Descrybe に取り込み(ストアへは書き戻しません)。", - "woo.ordersNeedsReconnect": "移行後に認証情報を再接続するまで注文インポートは実行できません。接続タブで保存してから接続をテストしてください。", - "woo.syncSettingsTitle": "同期設定", - "woo.syncSettingsDesc": "商品の Descrybe → WooCommerce 送信方法を設定", - "woo.matchStrategy": "商品 Matching Strategy", - "woo.matchStrategyHelp": "商品プッシュ (Descrybe → WooCommerce) は SKU または EAN/GTIN でリモート商品を照合します。接続タブから手動でキューします。", - "woo.lastSyncLabel": "最終同期", - "woo.saveSyncSettings": "同期設定を保存", + "woo.field.credentialsHelp": "読み取り/書き込み権限のコンシューマーキーとシークレット。既存の認証情報を残す場合は空のままにします。", + "woo.placeholder.keep": "********(変更なし)", + "woo.keepCredentialsHint": "保存時にキー/シークレットを空にすると既存の認証情報を維持します。", + "woo.saveConfiguration": "設定を保存", + "woo.categoryMappingTitle": "カテゴリマッピング", + "woo.categoryMappingDesc": "社内カテゴリを WooCommerce カテゴリに対応付けます", + "woo.autoMapCategories": "カテゴリを自動マップ", + "woo.autoMapping": "自動マッピング...", + "woo.refreshCategories": "カテゴリを更新", + "woo.availableCategories": "利用可能なWooCommerceカテゴリ", + "woo.categoriesEmptyHint": "接続をテストしてから更新し、WooCommerceカテゴリを読み込みます。", + "woo.attributeMappingTitle": "属性マッピング", + "woo.attributeMappingDesc": "社内属性を WooCommerce 属性に対応付けます", + "woo.autoMapAttributes": "属性を自動マップ", + "woo.refreshAttributes": "属性を更新", + "woo.availableAttributes": "利用可能なWooCommerce属性", + "woo.attributesEmptyHint": "接続をテストしてから更新し、WooCommerce属性を読み込みます。", + "woo.ordersTitle": "注文インポート (WooCommerce → Descrybe)", + "woo.ordersDesc": "WooCommerce → Descrybe — 注文と明細を Descrybe に取り込み(ストアへは書き戻しません)。", + "woo.ordersNeedsReconnect": "移行後に認証情報を再接続するまで注文インポートは実行できません。接続タブで保存してから接続をテストしてください。", + "woo.syncSettingsTitle": "同期設定", + "woo.syncSettingsDesc": "商品の Descrybe → WooCommerce 送信方法を設定", + "woo.matchStrategy": "商品 Matching Strategy", + "woo.matchStrategyHelp": "商品プッシュ (Descrybe → WooCommerce) は SKU または EAN/GTIN でリモート商品を照合します。接続タブから手動でキューします。", + "woo.lastSyncLabel": "最終同期", + "woo.saveSyncSettings": "同期設定を保存", "woo.match.sku": "SKU", "woo.match.ean": "EAN/GTIN", - "plan.feature.section.shell": "シェル", - "plan.feature.section.dashboard": "ダッシュボード", - "plan.feature.section.catalog": "カタログ", + "plan.feature.section.shell": "シェル", + "plan.feature.section.dashboard": "ダッシュボード", + "plan.feature.section.catalog": "カタログ", "plan.feature.section.feeds": "Feeds", - "plan.feature.section.stores": "ストア", - "plan.feature.section.processing": "処理", - "plan.feature.section.marketing": "マーケティング", - "plan.feature.section.integrations": "連携", - "plan.feature.section.billing": "請求", - "plan.feature.section.settings": "設定", - "plan.feature.section.support": "サポート", - "plan.feature.section.capabilities": "機能", - "plan.feature.shell.navigation": "サイドバーナビゲーション", - "plan.feature.shell.command_palette": "コマンドパレット", - "plan.feature.shell.company_switcher": "会社切替", - "plan.feature.shell.support_notifications": "サポート通知ベル", - "plan.feature.shell.tutorial": "製品チュートリアル", - "plan.feature.shell.account_menu": "アカウントメニュー", - "plan.feature.shell.billing_recovery_banner": "請求復旧バナー", - "plan.feature.dashboard.overview": "ダッシュボード概要", - "plan.feature.dashboard.stats": "統計カード", - "plan.feature.dashboard.quick_links": "クイックリンク", - "plan.feature.dashboard.recent_jobs": "最近のジョブ", - "plan.feature.dashboard.news_feed": "ニュースフィード", - "plan.feature.dashboard.activation_checklist": "有効化チェックリスト", - "plan.feature.dashboard.migrated_checklist": "移行コホートチェックリスト", - "plan.feature.dashboard.etl_gaps": "ETLギャップパネル", - "plan.feature.dashboard.store_reconnect": "ストア再接続バナー", - "plan.feature.dashboard.upgrade_banners": "アップグレードバナー", - "plan.feature.catalog.products": "商品", - "plan.feature.catalog.products.tab_processed": "商品 - 処理済みタブ", - "plan.feature.catalog.products.tab_needs_review": "商品 - 要確認タブ", - "plan.feature.catalog.products.tab_error": "商品 - エラータブ", - "plan.feature.catalog.products.tab_processing": "商品 - 処理中タブ", - "plan.feature.catalog.products.tab_unprocessed": "商品 - 未処理タブ", - "plan.feature.catalog.products.process_categories": "カテゴリを処理", - "plan.feature.catalog.products.process_attributes": "属性 / 仕様を処理", - "plan.feature.catalog.products.process_ai_titles": "AIタイトルを処理", - "plan.feature.catalog.products.process_ai_descriptions": "AI説明を処理", - "plan.feature.catalog.products.enrichment_review": "エンリッチメント確認パネル", - "plan.feature.catalog.products.export_selection": "選択した商品をエクスポート", - "plan.feature.catalog.products.upgrade_prompt": "商品アップグレード案内", - "plan.feature.catalog.categories": "カテゴリ", - "plan.feature.catalog.categories.title_formula": "カテゴリタイトル数式", - "plan.feature.catalog.categories.description_formula": "カテゴリ説明数式", - "plan.feature.catalog.attributes": "属性", - "plan.feature.catalog.attributes.bulk_import": "属性の一括インポート", - "plan.feature.catalog.standard_fields": "標準フィールド", - "plan.feature.catalog.standard_fields.groups": "標準フィールドグループ", - "plan.feature.catalog.structured_descriptions": "構造化説明フィールド", - "plan.feature.catalog.vector_categories": "ベクトルカテゴリ", - "plan.feature.feeds.list": "インポートフィード", - "plan.feature.feeds.add_url": "Feed URLを追加", - "plan.feature.feeds.add_csv": "CSVアップロードでフィード追加", - "plan.feature.feeds.sync": "フィードを同期", - "plan.feature.feeds.mapping": "フィードマッピング", - "plan.feature.feeds.mapping.select_item": "マッピング - item要素を選択", - "plan.feature.feeds.mapping.map_fields": "マッピング - フィールドを対応付け", - "plan.feature.feeds.export_feeds": "エクスポートFeed", - "plan.feature.feeds.export_feeds.create": "エクスポートフィードを作成", - "plan.feature.feeds.export_feeds.generate": "エクスポートフィードを生成", - "plan.feature.feeds.uploads": "ファイルアップロード", - "plan.feature.stores.hub": "ストアハブ", - "plan.feature.stores.woocommerce": "WooCommerce連携", - "plan.feature.stores.woocommerce.connection": "WooCommerce接続", - "plan.feature.stores.woocommerce.categories": "WooCommerceカテゴリ同期", - "plan.feature.stores.woocommerce.attributes": "WooCommerce属性同期", - "plan.feature.stores.woocommerce.orders": "WooCommerce注文", - "plan.feature.stores.woocommerce.reviews": "WooCommerceレビュー", - "plan.feature.stores.woocommerce.settings": "WooCommerce設定", - "plan.feature.stores.shopify": "Shopify連携", - "plan.feature.stores.shopify.connection": "Shopify接続", - "plan.feature.stores.shopify.orders": "Shopify注文", - "plan.feature.stores.shopify.settings": "Shopify設定", - "plan.feature.processing.monitor": "処理モニター", - "plan.feature.marketing.campaigns": "キャンペーン", - "plan.feature.marketing.campaigns.create": "新規キャンペーンウィザード", - "plan.feature.marketing.campaigns.generate_ai": "キャンペーンAI生成", - "plan.feature.marketing.campaigns.send": "キャンペーン送信 / ブラスト", - "plan.feature.marketing.content_calendar": "コンテンツカレンダー", - "plan.feature.marketing.brand_kit": "ブランドキット", - "plan.feature.marketing.brand_ai_apply": "プロンプトにブランドAIを適用", - "plan.feature.marketing.seo": "SEO推奨", - "plan.feature.marketing.seo.template_fill": "SEOテンプレート入力", - "plan.feature.marketing.seo.ai_rewrite": "SEO AIリライト", - "plan.feature.marketing.reviews": "レビュー", - "plan.feature.integrations.ai": "AI連携", - "plan.feature.integrations.ai.byok": "独自のAIキーを使用", - "plan.feature.integrations.email": "メール送信", - "plan.feature.integrations.email.test": "メールテスト送信", - "plan.feature.integrations.email.blast": "メール一斉送信", - "plan.feature.billing.overview": "請求概要", - "plan.feature.billing.customer_portal": "Stripeカスタマーポータル", - "plan.feature.billing.quick_upgrade": "クイックアップグレード決済", - "plan.feature.billing.plans_compare": "プランを比較", - "plan.feature.billing.checkout": "Stripeチェックアウト", - "plan.feature.settings.profile": "プロフィール設定", - "plan.feature.settings.company": "会社の設定", - "plan.feature.settings.alerts": "アラート設定", - "plan.feature.settings.api_keys": "APIキー", - "plan.feature.settings.team": "チーム管理", - "plan.feature.settings.team_invite": "チームメイトを招待", - "plan.feature.support.center": "サポートセンター", - "plan.feature.support.ticket_create": "新規サポートチケット", - "plan.feature.support.ticket_thread": "サポートチケットスレッド", - "plan.feature.capability.sku_cap": "商品SKU上限", - "plan.feature.capability.ai_credits": "AIクレジットウォレット", - "plan.feature.capability.ai_processing": "AI処理ジョブ", - "plan.feature.capability.eprel": "EPRELエンリッチメント", - "plan.feature.capability.normalize_specs_fill": "正規化 / 仕様 / 入力", - "plan.feature.capability.campaign_ai": "キャンペーンAI生成", - "plan.feature.capability.email_live_send": "本番メール配信", - "plan.feature.capability.brand_ai_apply": "AIプロンプトのブランドボイス", - "plan.feature.capability.seo_ai_rewrite": "SEO AIリライト", - "plan.feature.capability.feed_source_limit": "フィードソース上限(マーケティング)", - "plan.feature.capability.export_feed_limit": "エクスポートフィード上限(マーケティング)", - "plan.feature.capability.storage_limit": "ストレージ上限(マーケティング)", - "plan.feature.capability.api_access": "REST APIアクセス(マーケティング)", - "plan.feature.capability.byok": "独自のAIキーを使用", - "billing.plan.free": "無料", - "products.actions.selectAll": "すべて選択", - "products.actions.upgradeSuffix": " · アップグレード", - "products.actions.upgradeRequired": "{label}(アップグレードが必要)", - "products.actions.free": "無料", - "products.actions.credits": "{credits} クレジット", - "products.actions.autoCategorizeTitle": "カテゴリ分類を自動追加中", - "products.actions.autoCategorizeBody": "{types} 処理のため {count} 件の商品にカテゴリ分類が必要です", - "products.actions.aiLocked": "Free ではAIオプションがロックされています。タイトル/説明を処理するにはアップグレードしてください。", - "products.actions.processSelected": "選択を処理", - "products.actions.markProcessed": "処理済みにする", - "products.actions.resetUnprocessed": "未処理にリセット", - "products.actions.export": "エクスポート", - "products.upload.dropHint": "CSVをここにドロップするかクリックして参照", - "products.upload.supportsHint": ".csv商品インポートに対応(ean, name, category…)", - "products.export.chooseConfig": "選択した{count}件の商品をエクスポートします。形式とフィールドを定義するエクスポートフィードを選んでください。", - "products.export.selectPlaceholder": "エクスポートフィードを選択…", - "fields.typeLabel": "タイプ", - "fields.groupLabel": "グループ", - "fields.selectGroup": "グループを選択", - "fields.groupBelongsHint": "このフィールドが属するグループ", - "fields.addFieldShort": "フィールドを追加", - "fields.enableRecommended": "推奨を有効化", - "feeds.activated": "フィードを有効化しました。", - "feeds.deactivated": "フィードを無効化しました。", - "feeds.syncTimeout": "同期 timed out waiting for the server. The job may still finish — open 同期 History to check status.", - "feeds.createdMapHint": "フィードを作成しました。同期前にフィールドをマップしてください。", - "feeds.createdPlain": "フィードを作成しました。", - "feeds.createdMapDesc": "ソース列を商品フィールドにマップしてから同期します。", - "feeds.lastLiveSync": "最終成功フィード同期: {when}", - "feeds.noLiveSyncProducts": "成功したフィード同期はまだありません。カタログの最終更新 {when}。", - "feeds.noDataYet": "同期またはカタログデータはまだありません。", - "products.filters.incomplete": "未完了", - "products.filters.complete44": "完了 (4/4)", - "products.filters.missingName": "名前なし", - "products.filters.missingDescription": "説明なし", - "products.filters.missingAttributes": "属性なし", - "products.filters.missingCategory": "カテゴリなし", - "products.filters.hasEprel": "EPRELあり", - "products.filters.noEprel": "EPRELなし", - "products.filters.priceChanged": "価格変更", - "products.filters.stockChanged": "在庫変更", - "products.filters.titleChanged": "タイトル変更", - "products.filters.newFromFeed": "フィードから新規", - "products.filters.otherFieldChange": "その他のフィールド変更", - "products.filters.sortUpdatedNewest": "更新(新しい順)", - "products.filters.sortUpdatedOldest": "更新(古い順)", - "products.filters.sortNameAsc": "名前(A-Z)", - "products.filters.sortNameDesc": "名前(Z-A)", - "products.filters.searchPlaceholder": "商品を検索...", - "products.filters.searchCategories": "カテゴリを検索...", - "products.filters.selectFeed": "フィードを選択", - "products.filters.loadingFeeds": "フィードを読み込み中…", - "products.table.loading": "商品を読み込み中", - "products.table.uncategorized": "未分類", - "products.table.assignCategory": "カテゴリを割り当て", - "products.table.changeCategory": "{name}のカテゴリを変更", - "products.table.selectCategory": "カテゴリを選択…", - "products.table.saveCategory": "カテゴリを保存", - "products.table.cancelCategory": "カテゴリ編集をキャンセル", - "products.table.categoryRequired": "カテゴリを選択してください", - "products.table.noCategoriesAvailable": "カテゴリがまだありません — カタログで作成してください", - "products.table.qualityUnavailable": "品質情報なし", - "products.table.full": "フル", - "products.table.empty": "空", - "products.table.saveName": "名前を保存", - "products.table.cancelRename": "名前変更をキャンセル", - "products.table.noSyncYet": "まだ同期なし", - "products.feedSync.feedAndWhen": "{feed} · {when}", - "products.feedSync.syncedWhen": "同期済み {when}", - "products.table.productOptions": "商品オプション", - "products.edit.details": "商品詳細", - "products.edit.noEprel": "この商品にEPREL IDはありません。", - "products.edit.specsPresent": "この商品に技術仕様があります。", - "products.edit.noEnrichedName": "エンリッチ名なし", - "products.edit.resetName": "エンリッチ名を元に戻す", - "products.edit.cannotClearName": "元が空のため、PATCHでエンリッチ名をクリアできません", - "products.edit.showPreview": "プレビューを表示", - "products.edit.editHtml": "HTMLを編集", - "products.edit.noEnrichedDescription": "エンリッチ説明なし", - "products.edit.resetDescription": "エンリッチ説明を元に戻す", - "products.edit.cannotClearDescription": "元が空のため、PATCH経由でエンリッチされた説明をクリアできません", - "products.edit.unknownFeed": "不明なフィード", - "products.edit.noProcessedName": "処理済み名はありません", - "products.edit.feedNamed": "フィード · {name}", - "products.edit.noAiDescription": "AI説明なし", - "products.edit.sourceLabel": "ソースラベル", - "products.edit.coverageTitle": "名前・説明・属性・カテゴリのうち、いくつが存在するかを示します(フィードまたは処理済み)。", - "products.edit.coverageReady": "{count}/4 準備完了", - "products.edit.eprelPresentTitle": "この商品に European Product Registry for Energy Labelling(EPREL)IDがあります。", - "products.edit.noEprelBadge": "EPRELなし", - "products.edit.specsBadge": "仕様", - "products.edit.reviewBannerTitle": "承認前にエンリッチ済みフィールドを確認", - "products.edit.reviewBannerHelp": "レビュータブで元データとAIを比較します。ショートカット: A 承認 · R 却下 · Alt+1/2 フィールド · ⌘/Ctrl+Enter すべて承認。", - "products.edit.tab.review": "確認", - "products.edit.tab.details": "詳細", - "products.edit.tab.content": "コンテンツ", - "products.edit.tab.attributes": "属性", - "products.edit.tab.feed": "フィード", - "products.edit.changed": "変更済み", - "products.edit.matched": "一致", - "products.edit.original": "元", - "products.edit.enriched": "エンリッチ済み", - "products.edit.discardName": "名前を破棄", - "products.edit.acceptName": "名前を承認", - "products.edit.discardDescription": "説明を破棄", - "products.edit.acceptDescription": "説明を承認", - "products.edit.noCategory": "No カテゴリ", - "products.edit.whatsFilledIn": "入力済みの項目", - "products.edit.coverageLegend": "Gray = missing · Orange = from フィード · Green = processed", - "products.edit.feedSource": "フィード source", - "products.edit.updatedRelative": "· 更新済み {when}", - "products.edit.viewAllFeedFields": "View all フィード fields ({filled}/{total})", - "products.edit.productIdentity": "商品 identity", - "products.edit.aiProcessedName": "AI処理済みの名前", - "products.edit.originalName": "元の名前", - "products.edit.productIdSku": "商品 ID / SKU", - "products.edit.rowUpdated": "商品行を更新済み {when}", - "products.edit.noRawUpdateTime": "No raw 商品 update time", - "products.edit.feedSyncLabel": "· フィード sync {when}", - "products.edit.neverRecorded": "未記録", - "products.edit.feedFilledCount": "{filled}件入力済み · {total}フィールド", - "products.edit.noMappedFeedFields": "No mapped フィード fields on this 商品.", - "products.edit.fieldCol": "フィールド", - "products.edit.valueFromFeed": "値 from フィード", - "products.edit.core": "コア", - "products.edit.aiProcessedDescription": "AI-Processed 説明", - "products.edit.originalDescription": "元の説明", - "products.edit.noAttrsYet": "No 属性 or specification data on this 商品 yet.", - "products.edit.fromFeed": "フィードから", - "products.edit.feedAttrsHelp": "フィードから解析した値(仕様HTML、保証、寸法、EPREL)。キーは可能な場合 attribute_key にリンクされます。", - "products.edit.fieldsCount": "{count} フィールド", - "products.edit.originalAttributes": "元の属性", - "products.edit.aiAttributes": "AI / エンリッチ済み属性", - "products.edit.editableAttributes": "編集可能な属性", - "products.edit.editableAttributesHelp": "変更は商品の属性マップに保存されます。下のフィード/AI行は異なる場合の参照として残ります。", - "products.edit.addAttribute": "属性を追加", - "products.edit.attrKeyPlaceholder": "キー", - "products.edit.attrValuePlaceholder": "値", - "products.edit.removeAttribute": "{key} を削除", - "products.edit.noEditableAttrs": "編集可能な属性はまだありません。キー/値のペアを追加してください。", - "products.edit.reject": "却下", - "products.edit.accept": "承認", - "taskIndicator.title": "バックグラウンドタスク", - "taskIndicator.activeOne": "1件のジョブ実行中", - "taskIndicator.activeMany": "{count}件のジョブ実行中", - "taskIndicator.view": "進捗を表示", - "taskIndicator.expand": "タスク一覧を展開", - "taskIndicator.collapse": "タスク一覧を折りたたむ", - "taskIndicator.progressAria": "ジョブ進捗 {pct} パーセント", - "taskIndicator.progressCounts": "{done} / {total} 件の商品", - "attributes.assignBulk": "カテゴリに割り当て", - "products.filters.search": "検索", - "products.filters.sortAria": "並べ替え: {label}", - "products.filters.sortLabel": "並べ替え: {label}", - "products.table.colIdName": "ID/名前", - "products.table.colCoverage": "カバレッジ", - "products.table.coverageTitle": "カバレッジ: N=名前、D=説明、A=属性、C=カテゴリ。グレー=未設定、オレンジ=フィード由来、緑=処理済み。EPRELはエネルギーラベル登録IDを示します。", - "products.table.colFeed": "フィード", - "products.table.colCategory": "カテゴリ", - "products.table.colStatus": "ステータス", - "products.table.colUpdated": "最終更新", - "products.table.colActions": "操作", - "products.table.loadingDots": "商品を読み込み中…", - "products.table.noneFound": "商品が見つかりません。", - "products.table.selectProduct": "商品 {name} を選択", - "products.table.rename": "{name} の名前を変更", - "products.table.productNameAria": "{name} の商品名", - "products.table.selectPage": "選択 {count} on this page", - "products.table.deselectPage": "このページの{count}件の選択を解除", - "categories.assign": "割り当て", - "categories.titleFormulaSubtitle": "{name} の商品タイトル生成方法を設定します", - "categories.addText": "テキストを追加", - "categories.aboutTitleFormulas": "タイトルフォーミュラについて", - "categories.aboutTitleFormulasHelp": "タイトルは次の要素から左から右へ組み立てられます。", - "categories.variablesReplacedHelp": "変数は利用可能な場合に商品データに置き換えられます。欠落値はスキップされます。", - "categories.variableTypeHelp": "商品データからの動的フィールド(例: ブランド)。", - "categories.textTypeHelp": "書いたとおりに常に表示される静的テキスト。", - "categories.assignTitleCopyHelp": "「割り当て」で、同じタイトルパターンを共有すべき他のカテゴリにこのフォーミュラをコピーします。", - "categories.titleFormulaInvalid": "このタイトルフォーミュラページには有効なカテゴリが必要です。カテゴリに戻り、「タイトルフォーミュラを編集」を再度開いてください。", - "categories.preview.title": "タイトルプレビュー", - "categories.preview.description": "商品タイトルはこの構造になります", - "categories.preview.exampleTab": "プレビュー例", - "categories.preview.structureTab": "フォーミュラ構造", - "categories.preview.noElements": "まだ要素がありません", - "categories.brandTips.title": "ブランド向けのヒント", - "categories.brandTips.freePlan": "ブランドキットは Free で編集可能です。AI 適用は有料プランで解除されます。", - "categories.brandTips.editBrandKit": "ブランドキットを編集", - "categories.brandTips.emptyBefore": "声や優先用語を ", - "categories.brandTips.emptyAfter": " に追加すると、ここにヒントが表示されます。", - "categories.brandTips.brandKit": "ブランドキット", - "categories.brandTips.descGuidanceBefore": "説明セクション向けの ", - "categories.brandTips.descGuidanceAfter": " からのガイダンス。", - "categories.formulaElementsTitle": "フォーミュラ要素", - "categories.formulaElementsHelp": "ドラッグ&ドロップで要素を並べ替え", - "categories.noElementsAdded": "要素がありません", - "categories.addElementsHint": "右側のパネルから変数またはテキストを追加", - "categories.editTextElementAria": "テキスト要素 {value} を編集", - "categories.removeElementAria": "{type} 要素 {value} を削除", - "categories.tab.single": "単一", - "categories.tab.bulk": "一括アップロード", - "categories.uniqueIdLabel": "一意 ID", - "categories.parentLabel": "親", - "categories.noneRoot": "なし(ルート)", - "categories.descriptionLabel": "説明", - "categories.csvUploadHelp": "name、unique_id、任意で parent_unique_id と description 列のある CSV をアップロードします。", - "categories.downloadTemplate": "テンプレートをダウンロード", - "categories.variableNameKey": "名前(キー)", - "categories.displayName": "表示名", - "categories.exampleValue": "例の値", - "categories.variableExists": "名前 \"{name}\" の変数は既に存在します。", - "categories.addVariable": "変数を追加", - "categories.updateVariable": "変数を更新", - "categories.col.displayName": "表示名", - "categories.col.key": "キー", - "categories.col.description": "説明", - "categories.col.example": "例", - "categories.noVariablesFound": "変数が見つかりません", - "categories.availableVariables": "利用可能な変数", - "categories.manage": "管理", - "categories.noVariablesMatch": "“{query}” に一致する変数はありません。", - "categories.noUnusedVariables": "未使用の変数がありません。カスタム変数を追加するか、要素を削除して解放してください。", - "categories.exampleColon": "例: {value}", - "categories.editVariableAria": "{label} を編集", + "plan.feature.section.stores": "ストア", + "plan.feature.section.processing": "処理", + "plan.feature.section.marketing": "マーケティング", + "plan.feature.section.integrations": "連携", + "plan.feature.section.billing": "請求", + "plan.feature.section.settings": "設定", + "plan.feature.section.support": "サポート", + "plan.feature.section.capabilities": "機能", + "plan.feature.shell.navigation": "サイドバーナビゲーション", + "plan.feature.shell.command_palette": "コマンドパレット", + "plan.feature.shell.company_switcher": "会社切替", + "plan.feature.shell.support_notifications": "サポート通知ベル", + "plan.feature.shell.tutorial": "製品チュートリアル", + "plan.feature.shell.account_menu": "アカウントメニュー", + "plan.feature.shell.billing_recovery_banner": "請求復旧バナー", + "plan.feature.dashboard.overview": "ダッシュボード概要", + "plan.feature.dashboard.stats": "統計カード", + "plan.feature.dashboard.quick_links": "クイックリンク", + "plan.feature.dashboard.recent_jobs": "最近のジョブ", + "plan.feature.dashboard.news_feed": "ニュースフィード", + "plan.feature.dashboard.activation_checklist": "有効化チェックリスト", + "plan.feature.dashboard.migrated_checklist": "移行コホートチェックリスト", + "plan.feature.dashboard.etl_gaps": "ETLギャップパネル", + "plan.feature.dashboard.store_reconnect": "ストア再接続バナー", + "plan.feature.dashboard.upgrade_banners": "アップグレードバナー", + "plan.feature.catalog.products": "商品", + "plan.feature.catalog.products.tab_processed": "商品 - 処理済みタブ", + "plan.feature.catalog.products.tab_needs_review": "商品 - 要確認タブ", + "plan.feature.catalog.products.tab_error": "商品 - エラータブ", + "plan.feature.catalog.products.tab_processing": "商品 - 処理中タブ", + "plan.feature.catalog.products.tab_unprocessed": "商品 - 未処理タブ", + "plan.feature.catalog.products.process_categories": "カテゴリを処理", + "plan.feature.catalog.products.process_attributes": "属性 / 仕様を処理", + "plan.feature.catalog.products.process_ai_titles": "AIタイトルを処理", + "plan.feature.catalog.products.process_ai_descriptions": "AI説明を処理", + "plan.feature.catalog.products.enrichment_review": "エンリッチメント確認パネル", + "plan.feature.catalog.products.export_selection": "選択した商品をエクスポート", + "plan.feature.catalog.products.upgrade_prompt": "商品アップグレード案内", + "plan.feature.catalog.categories": "カテゴリ", + "plan.feature.catalog.categories.title_formula": "カテゴリタイトル数式", + "plan.feature.catalog.categories.description_formula": "カテゴリ説明数式", + "plan.feature.catalog.attributes": "属性", + "plan.feature.catalog.attributes.bulk_import": "属性の一括インポート", + "plan.feature.catalog.standard_fields": "標準フィールド", + "plan.feature.catalog.standard_fields.groups": "標準フィールドグループ", + "plan.feature.catalog.structured_descriptions": "構造化説明フィールド", + "plan.feature.catalog.vector_categories": "ベクトルカテゴリ", + "plan.feature.feeds.list": "インポートフィード", + "plan.feature.feeds.add_url": "Feed URLを追加", + "plan.feature.feeds.add_csv": "CSVアップロードでフィード追加", + "plan.feature.feeds.sync": "フィードを同期", + "plan.feature.feeds.mapping": "フィードマッピング", + "plan.feature.feeds.mapping.select_item": "マッピング - item要素を選択", + "plan.feature.feeds.mapping.map_fields": "マッピング - フィールドを対応付け", + "plan.feature.feeds.export_feeds": "エクスポートFeed", + "plan.feature.feeds.export_feeds.create": "エクスポートフィードを作成", + "plan.feature.feeds.export_feeds.generate": "エクスポートフィードを生成", + "plan.feature.feeds.uploads": "ファイルアップロード", + "plan.feature.stores.hub": "ストアハブ", + "plan.feature.stores.woocommerce": "WooCommerce連携", + "plan.feature.stores.woocommerce.connection": "WooCommerce接続", + "plan.feature.stores.woocommerce.categories": "WooCommerceカテゴリ同期", + "plan.feature.stores.woocommerce.attributes": "WooCommerce属性同期", + "plan.feature.stores.woocommerce.orders": "WooCommerce注文", + "plan.feature.stores.woocommerce.reviews": "WooCommerceレビュー", + "plan.feature.stores.woocommerce.settings": "WooCommerce設定", + "plan.feature.stores.shopify": "Shopify連携", + "plan.feature.stores.shopify.connection": "Shopify接続", + "plan.feature.stores.shopify.orders": "Shopify注文", + "plan.feature.stores.shopify.settings": "Shopify設定", + "plan.feature.processing.monitor": "処理モニター", + "plan.feature.marketing.campaigns": "キャンペーン", + "plan.feature.marketing.campaigns.create": "新規キャンペーンウィザード", + "plan.feature.marketing.campaigns.generate_ai": "キャンペーンAI生成", + "plan.feature.marketing.campaigns.send": "キャンペーン送信 / ブラスト", + "plan.feature.marketing.content_calendar": "コンテンツカレンダー", + "plan.feature.marketing.brand_kit": "ブランドキット", + "plan.feature.marketing.brand_ai_apply": "プロンプトにブランドAIを適用", + "plan.feature.marketing.seo": "SEO推奨", + "plan.feature.marketing.seo.template_fill": "SEOテンプレート入力", + "plan.feature.marketing.seo.ai_rewrite": "SEO AIリライト", + "plan.feature.marketing.reviews": "レビュー", + "plan.feature.integrations.ai": "AI連携", + "plan.feature.integrations.ai.byok": "独自のAIキーを使用", + "plan.feature.integrations.email": "メール送信", + "plan.feature.integrations.email.test": "メールテスト送信", + "plan.feature.integrations.email.blast": "メール一斉送信", + "plan.feature.billing.overview": "請求概要", + "plan.feature.billing.customer_portal": "Stripeカスタマーポータル", + "plan.feature.billing.quick_upgrade": "クイックアップグレード決済", + "plan.feature.billing.plans_compare": "プランを比較", + "plan.feature.billing.checkout": "Stripeチェックアウト", + "plan.feature.settings.profile": "プロフィール設定", + "plan.feature.settings.company": "会社の設定", + "plan.feature.settings.alerts": "アラート設定", + "plan.feature.settings.api_keys": "APIキー", + "plan.feature.settings.team": "チーム管理", + "plan.feature.settings.team_invite": "チームメイトを招待", + "plan.feature.support.center": "サポートセンター", + "plan.feature.support.ticket_create": "新規サポートチケット", + "plan.feature.support.ticket_thread": "サポートチケットスレッド", + "plan.feature.capability.sku_cap": "商品SKU上限", + "plan.feature.capability.ai_credits": "AIクレジットウォレット", + "plan.feature.capability.ai_processing": "AI処理ジョブ", + "plan.feature.capability.eprel": "EPRELエンリッチメント", + "plan.feature.capability.normalize_specs_fill": "正規化 / 仕様 / 入力", + "plan.feature.capability.campaign_ai": "キャンペーンAI生成", + "plan.feature.capability.email_live_send": "本番メール配信", + "plan.feature.capability.brand_ai_apply": "AIプロンプトのブランドボイス", + "plan.feature.capability.seo_ai_rewrite": "SEO AIリライト", + "plan.feature.capability.feed_source_limit": "フィードソース上限(マーケティング)", + "plan.feature.capability.export_feed_limit": "エクスポートフィード上限(マーケティング)", + "plan.feature.capability.storage_limit": "ストレージ上限(マーケティング)", + "plan.feature.capability.api_access": "REST APIアクセス(マーケティング)", + "plan.feature.capability.byok": "独自のAIキーを使用", + "billing.plan.free": "ç„¡æ–™", + "products.actions.selectAll": "すべて選択", + "products.actions.upgradeSuffix": " · アップグレード", + "products.actions.upgradeRequired": "{label}(アップグレードが必要)", + "products.actions.free": "ç„¡æ–™", + "products.actions.credits": "{credits} クレジット", + "products.actions.autoCategorizeTitle": "カテゴリ分類を自動追加中", + "products.actions.autoCategorizeBody": "{types} 処理のため {count} 件の商品にカテゴリ分類が必要です", + "products.actions.aiLocked": "Free ではAIオプションがロックされています。タイトル/説明を処理するにはアップグレードしてください。", + "products.actions.processSelected": "選択を処理", + "products.actions.markProcessed": "処理済みにする", + "products.actions.resetUnprocessed": "未処理にリセット", + "products.actions.export": "エクスポート", + "products.upload.dropHint": "CSVをここにドロップするかクリックして参照", + "products.upload.supportsHint": ".csv商品インポートに対応(ean, name, category…)", + "products.export.chooseConfig": "選択した{count}件の商品をエクスポートします。形式とフィールドを定義するエクスポートフィードを選んでください。", + "products.export.selectPlaceholder": "エクスポートフィードを選択…", + "fields.typeLabel": "タイプ", + "fields.groupLabel": "グループ", + "fields.selectGroup": "グループを選択", + "fields.groupBelongsHint": "このフィールドが属するグループ", + "fields.addFieldShort": "フィールドを追加", + "fields.enableRecommended": "推奨を有効化", + "feeds.activated": "フィードを有効化しました。", + "feeds.deactivated": "フィードを無効化しました。", + "feeds.syncTimeout": "同期 timed out waiting for the server. The job may still finish — open 同期 History to check status.", + "feeds.createdMapHint": "フィードを作成しました。同期前にフィールドをマップしてください。", + "feeds.createdPlain": "フィードを作成しました。", + "feeds.createdMapDesc": "ソース列を商品フィールドにマップしてから同期します。", + "feeds.lastLiveSync": "最終成功フィード同期: {when}", + "feeds.noLiveSyncProducts": "成功したフィード同期はまだありません。カタログの最終更新 {when}。", + "feeds.noDataYet": "同期またはカタログデータはまだありません。", + "products.filters.incomplete": "未完了", + "products.filters.complete44": "完了 (4/4)", + "products.filters.missingName": "名前なし", + "products.filters.missingDescription": "説明なし", + "products.filters.missingAttributes": "属性なし", + "products.filters.missingCategory": "カテゴリなし", + "products.filters.hasEprel": "EPRELあり", + "products.filters.noEprel": "EPRELなし", + "products.filters.priceChanged": "価格変更", + "products.filters.stockChanged": "在庫変更", + "products.filters.titleChanged": "タイトル変更", + "products.filters.newFromFeed": "フィードから新規", + "products.filters.otherFieldChange": "その他のフィールド変更", + "products.filters.sortUpdatedNewest": "更新(新しい順)", + "products.filters.sortUpdatedOldest": "更新(古い順)", + "products.filters.sortNameAsc": "名前(A-Z)", + "products.filters.sortNameDesc": "名前(Z-A)", + "products.filters.searchPlaceholder": "商品を検索...", + "products.filters.searchCategories": "カテゴリを検索...", + "products.filters.selectFeed": "フィードを選択", + "products.filters.loadingFeeds": "フィードを読み込み中…", + "products.table.loading": "商品を読み込み中", + "products.table.uncategorized": "未分類", + "products.table.assignCategory": "カテゴリを割り当て", + "products.table.changeCategory": "{name}のカテゴリを変更", + "products.table.selectCategory": "カテゴリを選択…", + "products.table.saveCategory": "カテゴリを保存", + "products.table.cancelCategory": "カテゴリ編集をキャンセル", + "products.table.categoryRequired": "カテゴリを選択してください", + "products.table.noCategoriesAvailable": "カテゴリがまだありません — カタログで作成してください", + "products.table.qualityUnavailable": "品質情報なし", + "products.table.full": "フル", + "products.table.empty": "空", + "products.table.saveName": "名前を保存", + "products.table.cancelRename": "名前変更をキャンセル", + "products.table.noSyncYet": "まだ同期なし", + "products.feedSync.feedAndWhen": "{feed} · {when}", + "products.feedSync.syncedWhen": "同期済み {when}", + "products.table.productOptions": "商品オプション", + "products.edit.details": "商品詳細", + "products.edit.noEprel": "この商品にEPREL IDはありません。", + "products.edit.specsPresent": "この商品に技術仕様があります。", + "products.edit.noEnrichedName": "エンリッチ名なし", + "products.edit.resetName": "エンリッチ名を元に戻す", + "products.edit.cannotClearName": "元が空のため、PATCHでエンリッチ名をクリアできません", + "products.edit.showPreview": "プレビューを表示", + "products.edit.editHtml": "HTMLを編集", + "products.edit.noEnrichedDescription": "エンリッチ説明なし", + "products.edit.resetDescription": "エンリッチ説明を元に戻す", + "products.edit.cannotClearDescription": "元が空のため、PATCH経由でエンリッチされた説明をクリアできません", + "products.edit.unknownFeed": "不明なフィード", + "products.edit.noProcessedName": "処理済み名はありません", + "products.edit.feedNamed": "フィード · {name}", + "products.edit.noAiDescription": "AI説明なし", + "products.edit.sourceLabel": "ソースラベル", + "products.edit.coverageTitle": "名前・説明・属性・カテゴリのうち、いくつが存在するかを示します(フィードまたは処理済み)。", + "products.edit.coverageReady": "{count}/4 準備完了", + "products.edit.eprelPresentTitle": "この商品に European Product Registry for Energy Labelling(EPREL)IDがあります。", + "products.edit.noEprelBadge": "EPRELなし", + "products.edit.specsBadge": "仕様", + "products.edit.reviewBannerTitle": "承認前にエンリッチ済みフィールドを確認", + "products.edit.reviewBannerHelp": "レビュータブで元データとAIを比較します。ショートカット: A 承認 · R 却下 · Alt+1/2 フィールド · ⌘/Ctrl+Enter すべて承認。", + "products.edit.tab.review": "確認", + "products.edit.tab.details": "詳細", + "products.edit.tab.content": "コンテンツ", + "products.edit.tab.attributes": "属性", + "products.edit.tab.feed": "フィード", + "products.edit.changed": "変更済み", + "products.edit.matched": "一致", + "products.edit.original": "å…ƒ", + "products.edit.enriched": "エンリッチ済み", + "products.edit.discardName": "名前を破棄", + "products.edit.acceptName": "名前を承認", + "products.edit.discardDescription": "説明を破棄", + "products.edit.acceptDescription": "説明を承認", + "products.edit.noCategory": "No カテゴリ", + "products.edit.whatsFilledIn": "入力済みの項目", + "products.edit.coverageLegend": "Gray = missing · Orange = from フィード · Green = processed", + "products.edit.feedSource": "フィード source", + "products.edit.updatedRelative": "· 更新済み {when}", + "products.edit.viewAllFeedFields": "View all フィード fields ({filled}/{total})", + "products.edit.productIdentity": "商品 identity", + "products.edit.aiProcessedName": "AI処理済みの名前", + "products.edit.originalName": "元の名前", + "products.edit.productIdSku": "商品 ID / SKU", + "products.edit.rowUpdated": "商品行を更新済み {when}", + "products.edit.noRawUpdateTime": "No raw 商品 update time", + "products.edit.feedSyncLabel": "· フィード sync {when}", + "products.edit.neverRecorded": "未記録", + "products.edit.feedFilledCount": "{filled}件入力済み · {total}フィールド", + "products.edit.noMappedFeedFields": "No mapped フィード fields on this 商品.", + "products.edit.fieldCol": "フィールド", + "products.edit.valueFromFeed": "値 from フィード", + "products.edit.core": "コア", + "products.edit.aiProcessedDescription": "AI-Processed 説明", + "products.edit.originalDescription": "元の説明", + "products.edit.noAttrsYet": "No 属性 or specification data on this 商品 yet.", + "products.edit.fromFeed": "フィードから", + "products.edit.feedAttrsHelp": "フィードから解析した値(仕様HTML、保証、寸法、EPREL)。キーは可能な場合 attribute_key にリンクされます。", + "products.edit.fieldsCount": "{count} フィールド", + "products.edit.originalAttributes": "元の属性", + "products.edit.aiAttributes": "AI / エンリッチ済み属性", + "products.edit.editableAttributes": "編集可能な属性", + "products.edit.editableAttributesHelp": "変更は商品の属性マップに保存されます。下のフィード/AI行は異なる場合の参照として残ります。", + "products.edit.addAttribute": "属性を追加", + "products.edit.attrKeyPlaceholder": "キー", + "products.edit.attrValuePlaceholder": "値", + "products.edit.removeAttribute": "{key} を削除", + "products.edit.noEditableAttrs": "編集可能な属性はまだありません。キー/値のペアを追加してください。", + "products.edit.reject": "却下", + "products.edit.accept": "承認", + "taskIndicator.title": "バックグラウンドタスク", + "taskIndicator.activeOne": "1件のジョブ実行中", + "taskIndicator.activeMany": "{count}件のジョブ実行中", + "taskIndicator.view": "進捗を表示", + "taskIndicator.expand": "タスク一覧を展開", + "taskIndicator.collapse": "タスク一覧を折りたたむ", + "taskIndicator.progressAria": "ジョブ進捗 {pct} パーセント", + "taskIndicator.progressCounts": "{done} / {total} 件の商品", + "attributes.assignBulk": "カテゴリに割り当て", + "products.filters.search": "検索", + "products.filters.sortAria": "並べ替え: {label}", + "products.filters.sortLabel": "並べ替え: {label}", + "products.table.colIdName": "ID/名前", + "products.table.colCoverage": "カバレッジ", + "products.table.coverageTitle": "カバレッジ: N=名前、D=説明、A=属性、C=カテゴリ。グレー=未設定、オレンジ=フィード由来、緑=処理済み。EPRELはエネルギーラベル登録IDを示します。", + "products.table.colFeed": "フィード", + "products.table.colCategory": "カテゴリ", + "products.table.colStatus": "ステータス", + "products.table.colUpdated": "最終更新", + "products.table.colActions": "操作", + "products.table.loadingDots": "商品を読み込み中…", + "products.table.noneFound": "商品が見つかりません。", + "products.table.selectProduct": "商品 {name} を選択", + "products.table.rename": "{name} の名前を変更", + "products.table.productNameAria": "{name} の商品名", + "products.table.selectPage": "選択 {count} on this page", + "products.table.deselectPage": "このページの{count}件の選択を解除", + "categories.assign": "割り当て", + "categories.titleFormulaSubtitle": "{name} の商品タイトル生成方法を設定します", + "categories.addText": "テキストを追加", + "categories.aboutTitleFormulas": "タイトルフォーミュラについて", + "categories.aboutTitleFormulasHelp": "タイトルは次の要素から左から右へ組み立てられます。", + "categories.variablesReplacedHelp": "変数は利用可能な場合に商品データに置き換えられます。欠落値はスキップされます。", + "categories.variableTypeHelp": "商品データからの動的フィールド(例: ブランド)。", + "categories.textTypeHelp": "書いたとおりに常に表示される静的テキスト。", + "categories.assignTitleCopyHelp": "「割り当て」で、同じタイトルパターンを共有すべき他のカテゴリにこのフォーミュラをコピーします。", + "categories.titleFormulaInvalid": "このタイトルフォーミュラページには有効なカテゴリが必要です。カテゴリに戻り、「タイトルフォーミュラを編集」を再度開いてください。", + "categories.preview.title": "タイトルプレビュー", + "categories.preview.description": "商品タイトルはこの構造になります", + "categories.preview.exampleTab": "プレビュー例", + "categories.preview.structureTab": "フォーミュラ構造", + "categories.preview.noElements": "まだ要素がありません", + "categories.brandTips.title": "ブランド向けのヒント", + "categories.brandTips.freePlan": "ブランドキットは Free で編集可能です。AI 適用は有料プランで解除されます。", + "categories.brandTips.editBrandKit": "ブランドキットを編集", + "categories.brandTips.emptyBefore": "声や優先用語を ", + "categories.brandTips.emptyAfter": " に追加すると、ここにヒントが表示されます。", + "categories.brandTips.brandKit": "ブランドキット", + "categories.brandTips.descGuidanceBefore": "説明セクション向けの ", + "categories.brandTips.descGuidanceAfter": " からのガイダンス。", + "categories.formulaElementsTitle": "フォーミュラ要素", + "categories.formulaElementsHelp": "ドラッグ&ドロップで要素を並べ替え", + "categories.noElementsAdded": "要素がありません", + "categories.addElementsHint": "右側のパネルから変数またはテキストを追加", + "categories.editTextElementAria": "テキスト要素 {value} を編集", + "categories.removeElementAria": "{type} 要素 {value} を削除", + "categories.tab.single": "単一", + "categories.tab.bulk": "一括アップロード", + "categories.uniqueIdLabel": "一意 ID", + "categories.parentLabel": "親", + "categories.noneRoot": "なし(ルート)", + "categories.descriptionLabel": "説明", + "categories.csvUploadHelp": "name、unique_id、任意で parent_unique_id と description 列のある CSV をアップロードします。", + "categories.downloadTemplate": "テンプレートをダウンロード", + "categories.variableNameKey": "名前(キー)", + "categories.displayName": "表示名", + "categories.exampleValue": "例の値", + "categories.variableExists": "名前 \"{name}\" の変数は既に存在します。", + "categories.addVariable": "変数を追加", + "categories.updateVariable": "変数を更新", + "categories.col.displayName": "表示名", + "categories.col.key": "キー", + "categories.col.description": "説明", + "categories.col.example": "例", + "categories.noVariablesFound": "変数が見つかりません", + "categories.availableVariables": "利用可能な変数", + "categories.manage": "管理", + "categories.noVariablesMatch": "“{query}” に一致する変数はありません。", + "categories.noUnusedVariables": "未使用の変数がありません。カスタム変数を追加するか、要素を削除して解放してください。", + "categories.exampleColon": "例: {value}", + "categories.editVariableAria": "{label} を編集", "categories.deleteVariableAria": "{label} ???", - "categories.addVariableAria": "{label} を追加", - "categories.textLabel": "テキスト", - "categories.textAppearsAsWritten": "このテキストはタイトルに書いたとおり表示されます", - "categories.addTextButton": "テキストを追加", - "categories.updateTextButton": "テキストを更新", - "categories.structureDescriptionsFor": "{name} の商品説明を構成", - "categories.metaInformation": "メタ情報", - "categories.metaInformationHelp": "SEO タイトルとメタ説明タグ用に AI が使う指示です。", - "categories.metaTitleFormula": "メタタイトルフォーミュラ", - "categories.metaTitleHint": "検索結果とブラウザタブに表示されます(約 50–60 文字)。", - "categories.metaDescriptionFormula": "メタ説明フォーミュラ", - "categories.metaDescriptionHint": "検索結果のタイトル下に表示されます(約 120–155 文字)。", - "categories.resetToDefault": "デフォルトに戻す", - "categories.descriptionSections": "説明セクション", - "categories.descriptionSectionsHelp": "セクションをドラッグして生成説明の順序を設定します。", - "categories.noSectionsYet": "まだセクションがありません", - "categories.addSectionsHint": "見出し、段落、またはリストを追加して開始します。", - "categories.aiInstructions": "AI 指示", - "categories.exportIdOptional": "エクスポート ID(任意)", - "categories.exportIdUnique": "エクスポート ID は一意である必要があります", - "categories.addSection": "セクションを追加", - "categories.aboutDescriptionFormulas": "説明フォーミュラについて", - "categories.aboutDescriptionFormulasHelp": "このカテゴリの商品説明の書き方を AI に伝える指示です。", - "categories.sectionTypesHeading": "セクションの種類", - "categories.sectionTypeHeadings": "見出し(H1–H4):", - "categories.sectionTypeHeadingsHelp": "タイトルとサブタイトル", - "categories.sectionTypeParagraphs": "段落:", - "categories.sectionTypeParagraphsHelp": "主な本文ブロック", - "categories.sectionTypeLists": "箇条書き:", - "categories.sectionTypeListsHelp": "特徴と仕様", - "categories.aiInstructionsHeading": "AI 指示", - "categories.aiInstructionsBody": "セクションごとに明確な役割を書いてください(内容・トーン・長さ)。曖昧なプロンプトは曖昧な文章になります。", - "categories.exportIdsHeading": "エクスポート ID", - "categories.exportIdsBody": "任意の ID でセクションをエクスポートフィードに対応付けます(例: short_description)。", - "categories.assignDescCopyHelp": "「割り当て」で、同じ構造を共有すべき他のカテゴリにこのテンプレートをコピーします。", - "categories.descriptionFormulaInvalid": "この説明フォーミュラページには有効なカテゴリが必要です。カテゴリに戻り、「説明フォーミュラを編集」を再度開いてください。", - "categories.sectionType.h1": "見出し 1", - "categories.sectionType.h2": "見出し 2", - "categories.sectionType.h3": "見出し 3", - "categories.sectionType.h4": "見出し 4", - "categories.sectionType.p": "段落", - "categories.sectionType.ul": "箇条書き", - "categories.aiGenerationPrompt": "AI 生成プロンプト", - "categories.aiPromptOverrides": "{name} の会社の商品エンハンス用ユーザープロンプトを上書きします", - "categories.promptTemplate": "プロンプトテンプレート", - "categories.promptTemplateHelp": "{{name}} や {{description}} のようなプレースホルダーを使います。空のままにすると、連携 → AI の会社デフォルトを使用します。", - "categories.clear": "クリア", - "categories.promptLabel": "プロンプト", - "categories.charactersCount": "{count} 文字", - "categories.activeOverride": "· このカテゴリで上書きが有効", - "categories.usingCompanyDefault": "· 会社 / 組み込みのデフォルトを使用中", - "categories.usingCompanyDefaultForLang": "· この言語は空 — 会社 / 組み込みデフォルトが適用されます", - "categories.aiPromptSavedLang": "{lang} のAIプロンプトを保存しました。", - "categories.aiPromptClearedLang": "{lang} のAIプロンプトをクリアしました(会社のデフォルトが適用されます)。", - "contentLang.switcherLabel": "コンテンツ言語", - "contentLang.primary": "プライマリ", - "contentLang.hasOverride": "カスタム", - "contentLang.addLanguage": "言語を追加…", - "contentLang.add": "追加", - "contentLang.removeLanguage": "{lang} を削除", - "contentLang.resultsHint": "言語を切り替えて、各コンテンツ言語のAIタイトルと説明を確認します。", - "contentLang.settingsTitle": "コンテンツ言語", - "contentLang.settingsHelp": "プライマリ言語がデフォルトで使われます。追加言語には個別のプロンプトとAI結果があり(各実行でクレジットを消費します)。", - "ai.prompts.languageHelp": "コンテンツ言語ごとに会社プロンプトを編集します。空の言語はその言語の組み込みデフォルトにフォールバックします。", - "header.accountSettingsAria": "{email} のアカウント設定", - "switcher.switchUserAria": "ユーザー切替: {label}", - "switcher.unavailable": "この環境ではユーザー切替を利用できません。", - "switcher.loadFailed": "ユーザーを読み込めませんでした。", - "support.notifications.aria": "サポート通知", - "support.notifications.ariaUnread": "サポート通知、未読 {count} 件", - "time.never": "なし", - "time.invalid": "無効な日付", - "time.unknown": "不明な日付", - "time.justNow": "たった今", - "time.neverUsed": "未使用", - "billing.plan.enterprise": "エンタープライズ", - "news.heading": "プラットフォームの更新", - "news.subtitle": "最新の機能と改善", - "news.keyFeatures": "主な機能:", - "news.badge.new": "新着", - "news.footer": "以上です — 次のリリース後にまたご確認ください。", - "news.category.enhancement": "改善", - "news.category.feature": "機能", - "news.category.integration": "連携", - "news.category.newFeature": "新機能", - "news.category.billing": "請求", - "news.uxImprovements.description": "ガイドツアー制御、API改善、ナビゲーション向上で使いやすさを強化しました。", - "news.uxImprovements.f1": "ガイドツアーのスキップ/非表示", - "news.uxImprovements.f2": "APIの信頼性向上", - "news.uxImprovements.f3": "UIナビゲーションの強化", - "news.uxImprovements.f4": "ワークフロー効率の向上", - "news.multiselect.title": "複数選択属性のサポート", - "news.multiselect.description": "リスト型属性で商品に複数の値を持てるようになりました。", - "news.multiselect.f1": "複数選択属性タイプ", - "news.multiselect.f2": "商品編集での複数値選択", - "news.multiselect.f3": "1つの属性に複数の値を保存", - "news.multiselect.f4": "複数選択フィールドの抽出強化", - "news.multiselect.f5": "エクスポートフィード互換性の向上", - "news.csvEan.title": "CSV EANアップロード", - "news.csvEan.description": "EANコードのCSVをアップロードして数百の商品を一括処理。", - "news.csvEan.f1": "ドラッグ&ドロップでのCSVアップロード", - "news.csvEan.f2": "EAN形式の検証(EAN-8、EAN-13、UPC-12、GTIN-14)", - "news.csvEan.f3": "重複の自動検出", - "news.csvEan.f4": "商品の一括処理", - "news.csvEan.f5": "詳細な処理統計", - "news.brick.title": "BRICKコード属性のサポート", - "news.brick.description": "標準化された分類とエクスポート向けのBRICKコード属性対応。", - "news.brick.f1": "BRICKコード属性の処理", - "news.brick.f2": "エクスポートでのコード自動整形", - "news.brick.f3": "XMLフィードへのBRICKコード統合", - "news.brick.f4": "エクスポートフィード互換性の改善", - "news.apiV1.title": "API v1リリース", - "news.apiV1.description": "カテゴリ・属性・フィード・商品・エクスポート向けの新しいAPI v1エンドポイント。", - "news.apiV1.f1": "RESTful API v1エンドポイント", - "news.apiV1.f2": "カテゴリと属性の管理", - "news.apiV1.f3": "フィードの作成と管理", - "news.apiV1.f4": "APIによる商品処理", - "news.apiV1.f5": "エクスポートフィードへのプログラムアクセス", - "news.apiV1.f6": "認証と認可", - "news.feedFiltering.title": "商品ページのフィードフィルタ", - "news.feedFiltering.description": "フィードフィルタ最適化、読み込み状態、パフォーマンス向上の商品ページ。", - "news.feedFiltering.f1": "フィードフィルタの強化", - "news.feedFiltering.f2": "読み込み状態の改善", - "news.feedFiltering.f3": "クエリ性能の最適化", - "news.feedFiltering.f4": "ページネーション処理の改善", - "news.feedFiltering.f5": "エクスポート機能の改善", - "news.exportFeeds.title": "エクスポートフィードシステム", - "news.exportFeeds.description": "カスタム設定付きの包括的なXML/CSVエクスポートフィード。", - "news.exportFeeds.f1": "XMLおよびCSVエクスポート形式", - "news.exportFeeds.f2": "カスタムフィールドマッピング", - "news.exportFeeds.f3": "エクスポートプレビュー", - "news.exportFeeds.f4": "ジョブベースの商品エクスポート", - "news.exportFeeds.f5": "EPRELデータ連携", - "news.exportFeeds.f6": "公開エクスポートフィードURL", - "news.woocommerce.title": "WooCommerce連携", - "news.woocommerce.description": "WooCommerceストアと商品・カテゴリ・属性を同期。", - "news.woocommerce.f1": "ストア認証情報の設定", - "news.woocommerce.f2": "カテゴリと属性のマッピング", - "news.woocommerce.f3": "双方向の商品同期", - "news.woocommerce.f4": "マッチ戦略オプション", - "news.eprel.title": "EPRELエネルギラベル連携", - "news.eprel.description": "欧州エネルギラベル登録との連携で効率データを取得。", - "news.eprel.f1": "EPREL IDの自動処理", - "news.eprel.f2": "エネルギラベル画像の取得", - "news.eprel.f3": "製品エネルギーフィシュのダウンロード", - "news.eprel.f4": "エネルギークラスの抽出", - "news.eprel.f5": "多言語サポート", - "news.aiCategorization.title": "商品カテゴリ分類の強化", - "news.aiCategorization.description": "精度向上と階層カテゴリ対応のAI分類システム。", - "news.aiCategorization.f1": "階層カテゴリナビ", - "news.aiCategorization.f2": "信頼度スコア", - "news.aiCategorization.f3": "多言語サポート", - "news.aiCategorization.f4": "自動フォールバック処理", - "news.standardFields.title": "標準フィールド管理", - "news.standardFields.description": "グループ・検証・デフォルト値付きで標準商品フィールドを管理。", - "news.standardFields.f1": "フィールドグループでの整理", - "news.standardFields.f2": "システム/カスタムフィールド", - "news.standardFields.f3": "フィールド検証ルール", - "news.standardFields.f4": "デフォルト値のサポート", - "news.standardFields.f5": "フィールドの自動セットアップ", - "news.billingSystem.title": "クレジットベースの課金", - "news.billingSystem.description": "利用状況追跡と柔軟な支払いオプション付きのクレジット課金システム。", - "news.billingSystem.f1": "クレジットベースの処理", - "news.billingSystem.f2": "利用状況アナリティクス", - "news.billingSystem.f3": "柔軟な請求サイクル", - "news.billingSystem.f4": "支払い方法の管理", - "news.billingSystem.f5": "請求書の生成", - "products.pageTitle": "商品管理", - "products.pageDescriptionStoresBefore": "商品カタログを管理・処理・最適化します。ストアを接続するか、CSVを次からインポート:", - "products.pageDescriptionBasic": "商品カタログを管理・処理・最適化します。Feedsからインポートするか、CSVをアップロードしてください。", - "products.keyboard.esc": "— 商品編集パネルやダイアログを閉じる", - "products.keyboard.toggle": "— このヒントの表示切替", - "products.keyboard.reviewPrefix": "要確認パネルで:", - "products.keyboard.acceptAll": "すべて承認", - "products.keyboard.rejectShort": "却下", - "products.keyboard.acceptFields": "名前 / 説明を承認", - "products.connectStore": "ストアを接続", - "products.updating": "更新中…", - "products.needLinkedRaw": "選択した商品を処理するにはリンクされた生データ商品が必要です。", - "products.selectToProcess": "処理する商品を少なくとも1つ選択してください。", - "products.undoResetHint": "元に戻すとリセットで商品が未処理に戻ります。", - "products.field.accepted": "{label} を商品に反映しました。", - "products.field.acceptFailed": "{field} を承認できませんでした", - "products.field.discarded": "{label} のエンリッチメントを破棄しました。", - "products.field.discardFailed": "{field} を破棄できませんでした", - "products.upgradeRequired": "アップグレードが必要です", - "products.upgradeBody": "この機能には有料プランまたはAIクレジットが必要です。", - "products.enrichment.rejectTitle": "エンリッチメントを却下しますか?", - "products.enrichment.rejectSelectedTitle": "選択した商品を却下しますか?", - "products.enrichment.resetTitle": "未処理にリセットしますか?", - "products.selectedOnPage": "このページで {count} 件選択", - "products.selectionPageOnly": "{total} 件中 {shown} 件表示 — 選択はこのページのみ", - "products.edit.coverageHint": "名前・説明・属性・カテゴリのうち、いくつが存在するかを示します(フィードまたは処理済み)。", - "products.edit.noEprelShort": "EPRELなし", - "products.edit.specs": "仕様", - "products.edit.reviewBannerBody": "レビュータブで元データとAIを比較します。ショートカット: A 承認 · R 却下 · Alt+1/2 フィールド · ⌘/Ctrl+Enter すべて承認。", - "products.edit.whatsFilled": "入力済みの項目", - "products.edit.legend": "Gray = missing · Orange = from フィード · Green = processed", - "products.edit.updatedAgo": "· 更新 {relative}", - "products.edit.status": "ステータス", - "products.edit.noRawUpdate": "No raw 商品 update time", - "products.edit.feedSyncPart": "· フィード同期", - "products.edit.filledFields": "{filled}件入力済み · {total}フィールド", - "products.edit.noMappedFields": "No mapped フィード fields on this 商品.", - "products.edit.emptyBadge": "空", - "products.edit.coreBadge": "コア", - "products.edit.feedAttrsHint": "フィードから解析した値(仕様HTML、保証、寸法、EPREL)。キーは可能な場合 attribute_key にリンクされます。", - "products.edit.originalAttrs": "元の属性", - "products.edit.aiAttrs": "AI/エンリッチ属性", - "mapping.confidence.exact": "完全一致", - "mapping.confidence.alias": "エイリアス", - "mapping.confidence.fuzzy": "あいまい", - "field.group.basic": "基本情報", - "field.group.pricing": "価格", - "field.group.media": "メディア", - "field.group.taxonomy": "分類", - "field.group.inventory": "在庫", - "field.group.attributes": "属性", - "field.group.shipping": "配送", - "field.group.compliance": "コンプライアンス", - "field.group.other": "その他", - "common.yes": "はい", - "common.no": "いいえ", - "status.running": "実行中", - "flash.admin.analyticsLoadFailed": "分析の読み込みに失敗しました", - "flash.admin.diagnosticsLoadFailed": "診断の読み込みに失敗しました", - "flash.admin.diagnosticsUnavailable": "このデプロイでは診断を利用できません。プラットフォーム管理者に連絡してください。", - "flash.admin.diagnosticsUnreachable": "診断APIに到達できません。APIが稼働していること、および PUBLIC_API_URL / Vite プロキシがその先を指していることを確認してください。", - "admin.charts.statusEmpty": "この内訳に行はまだありません。", - "admin.charts.seriesEmpty": "この期間のデータはまだありません。", - "admin.charts.primaryDefault": "主系列", - "admin.charts.statusAria": "ステータス分布", - "admin.charts.seriesAria": "{label}のチャート", - "admin.analytics.lastNDaysAria": "直近{days}日", - "admin.analytics.overview": "概要", - "admin.analytics.overviewHint": "直近{days}日の期間コンテキスト付きプラットフォーム合計。", - "admin.analytics.tokensInPeriod": "期間内 {tokens} · 処理済み商品から", - "admin.analytics.creditsRemainingOf": "割当{allocated}のうち残り{remaining}", - "admin.analytics.noJobsYet": "ジョブはまだありません", - "admin.analytics.feedsVolume": "入力 {input} · エクスポートフィード {export}", - "admin.analytics.usersCompaniesRaw": "ユーザー {users} · 会社 {companies} · 生データ {raw}", - "admin.analytics.operations": "オペレーション", - "admin.analytics.operationsHint": "選択期間の信頼性シグナル、キー、成長。", - "admin.analytics.failedCompleted": "失敗 {failed} · 完了 {completed}", - "admin.analytics.runningOver2h": "実行中 > 2時間 ·", - "admin.analytics.apiKeysTotal": "合計 {total}(失効済みを含む)", - "admin.analytics.signupsDetail": "ユーザー · 会社 {companies} · 未解決/保留チケット {tickets}", - "admin.analytics.providerMix": "プロバイダー構成", - "admin.analytics.providerMixHint": "AI認証情報の設定方法別のトークン消費。", - "admin.analytics.productsJobs": "商品 {products} · ジョブ {jobs}", - "admin.analytics.trends": "トレンド", - "admin.analytics.trendsHint": "トークン・プロバイダー・ジョブ・登録の日次系列。", - "admin.analytics.tokensByDayHint": "完了した商品処理のトークン(副系列=その日の商品数)", - "admin.analytics.seriesTokens": "トークン", - "admin.analytics.seriesProducts": "商品", - "admin.analytics.emptyTokens": "この期間にトークン付きの処理済み商品はありません。", - "admin.analytics.tokensByProviderHint": "日次内訳: 内部 / 人気 / カスタム(プロバイダータイプ別)", - "admin.analytics.emptyProviderTokens": "この期間にプロバイダー付きトークンはまだありません。", - "admin.analytics.providerDayTip": "{date}: 内部 {internal} · 人気 {popular} · カスタム {custom}", - "admin.analytics.seriesCreated": "作成日", - "admin.analytics.seriesFailed": "失敗", - "admin.analytics.emptyJobsSeries": "この期間に作成された処理ジョブはありません。", - "admin.analytics.seriesUsers": "ユーザー", - "admin.analytics.seriesCompanies": "会社", - "admin.analytics.emptySignups": "この期間にユーザーまたは会社の登録はありません。", - "admin.analytics.statusMix": "ステータス構成", - "admin.analytics.statusMixHint": "ジョブ・フィード同期・サポートの全期間キュー。", - "admin.analytics.jobStatus": "ジョブステータス", - "admin.analytics.feedSyncQueue": "フィード同期キュー", - "admin.analytics.supportTickets": "サポートチケット", - "admin.analytics.emptyJobStatus": "処理ジョブはまだありません。", - "admin.analytics.emptyFeedSync": "フィード同期ジョブはまだありません。", - "admin.analytics.emptyTickets": "サポートチケットはまだありません。", - "admin.analytics.usageDetail": "利用詳細", - "admin.analytics.usageDetailHint": "プロバイダーモード、上位会社、請求サイクル集計。", - "admin.analytics.companyUsage": "会社別利用", - "admin.analytics.jobsCol": "ジョブ", - "admin.analytics.billingCycles": "請求 cycles", - "admin.analytics.billingCyclesHint": "過去の請求サイクルの履歴集計(アクティブなサブスクリプションより遅れる場合があります)", - "admin.analytics.periodCol": "期間", - "admin.analytics.creditsCol": "クレジット", - "admin.analytics.dataNotes": "データ注記", - "admin.diagnostics.endpointNotMounted": "エンドポイント未搭載", - "admin.diagnostics.noPayload": "診断ペイロードなし", - "admin.diagnostics.unavailableShort": "このデプロイでは診断を利用できません。", - "admin.diagnostics.fixThenRefresh": "上のエラーを修正してから更新してください。", - "admin.diagnostics.refreshOrConfirm": "更新するか、APIが正常か確認してください。", - "admin.diagnostics.systemStatus": "システム状態", - "admin.diagnostics.snapshot": "スナップショット {when}", - "admin.diagnostics.queueTotal": "合計 {total}", - "admin.diagnostics.queueStuck": "processing_jobs · 実行停滞(>2時間):", - "admin.diagnostics.driver": "ドライバ: {driver}", - "admin.diagnostics.openStuck": "停滞商品を開く", - "admin.diagnostics.configPresence": "設定の有無", - "admin.diagnostics.configHint": "真偽値のみ · env {env} · RPM {rpm} · バッチ {batch} · 再試行 {retries}", - "admin.diagnostics.cutoverTitle": "カットオーバー準備", - "admin.diagnostics.cutoverHint": "存在フラグのみ — gooseバージョン、ワーカー経過、プラン不足。ライブStripe/SMTPなし。", + "categories.addVariableAria": "{label} を追加", + "categories.textLabel": "テキスト", + "categories.textAppearsAsWritten": "このテキストはタイトルに書いたとおり表示されます", + "categories.addTextButton": "テキストを追加", + "categories.updateTextButton": "テキストを更新", + "categories.structureDescriptionsFor": "{name} の商品説明を構成", + "categories.metaInformation": "メタ情報", + "categories.metaInformationHelp": "SEO タイトルとメタ説明タグ用に AI が使う指示です。", + "categories.metaTitleFormula": "メタタイトルフォーミュラ", + "categories.metaTitleHint": "検索結果とブラウザタブに表示されます(約 50–60 文字)。", + "categories.metaDescriptionFormula": "メタ説明フォーミュラ", + "categories.metaDescriptionHint": "検索結果のタイトル下に表示されます(約 120–155 文字)。", + "categories.resetToDefault": "デフォルトに戻す", + "categories.descriptionSections": "説明セクション", + "categories.descriptionSectionsHelp": "セクションをドラッグして生成説明の順序を設定します。", + "categories.noSectionsYet": "まだセクションがありません", + "categories.addSectionsHint": "見出し、段落、またはリストを追加して開始します。", + "categories.aiInstructions": "AI 指示", + "categories.exportIdOptional": "エクスポート ID(任意)", + "categories.exportIdUnique": "エクスポート ID は一意である必要があります", + "categories.addSection": "セクションを追加", + "categories.aboutDescriptionFormulas": "説明フォーミュラについて", + "categories.aboutDescriptionFormulasHelp": "このカテゴリの商品説明の書き方を AI に伝える指示です。", + "categories.sectionTypesHeading": "セクションの種類", + "categories.sectionTypeHeadings": "見出し(H1–H4):", + "categories.sectionTypeHeadingsHelp": "タイトルとサブタイトル", + "categories.sectionTypeParagraphs": "段落:", + "categories.sectionTypeParagraphsHelp": "主な本文ブロック", + "categories.sectionTypeLists": "箇条書き:", + "categories.sectionTypeListsHelp": "特徴と仕様", + "categories.aiInstructionsHeading": "AI 指示", + "categories.aiInstructionsBody": "セクションごとに明確な役割を書いてください(内容・トーン・長さ)。曖昧なプロンプトは曖昧な文章になります。", + "categories.exportIdsHeading": "エクスポート ID", + "categories.exportIdsBody": "任意の ID でセクションをエクスポートフィードに対応付けます(例: short_description)。", + "categories.assignDescCopyHelp": "「割り当て」で、同じ構造を共有すべき他のカテゴリにこのテンプレートをコピーします。", + "categories.descriptionFormulaInvalid": "この説明フォーミュラページには有効なカテゴリが必要です。カテゴリに戻り、「説明フォーミュラを編集」を再度開いてください。", + "categories.sectionType.h1": "見出し 1", + "categories.sectionType.h2": "見出し 2", + "categories.sectionType.h3": "見出し 3", + "categories.sectionType.h4": "見出し 4", + "categories.sectionType.p": "段落", + "categories.sectionType.ul": "箇条書き", + "categories.aiGenerationPrompt": "AI 生成プロンプト", + "categories.aiPromptOverrides": "{name} の会社の商品エンハンス用ユーザープロンプトを上書きします", + "categories.promptTemplate": "プロンプトテンプレート", + "categories.promptTemplateHelp": "{{name}} ã‚„ {{description}} のようなプレースホルダーを使います。空のままにすると、連携 → AI の会社デフォルトを使用します。", + "categories.clear": "クリア", + "categories.promptLabel": "プロンプト", + "categories.charactersCount": "{count} 文字", + "categories.activeOverride": "· このカテゴリで上書きが有効", + "categories.usingCompanyDefault": "· 会社 / 組み込みのデフォルトを使用中", + "categories.usingCompanyDefaultForLang": "· この言語は空 — 会社 / 組み込みデフォルトが適用されます", + "categories.aiPromptSavedLang": "{lang} のAIプロンプトを保存しました。", + "categories.aiPromptClearedLang": "{lang} のAIプロンプトをクリアしました(会社のデフォルトが適用されます)。", + "contentLang.switcherLabel": "コンテンツ言語", + "contentLang.primary": "プライマリ", + "contentLang.hasOverride": "カスタム", + "contentLang.addLanguage": "言語を追加…", + "contentLang.add": "追加", + "contentLang.removeLanguage": "{lang} を削除", + "contentLang.resultsHint": "言語を切り替えて、各コンテンツ言語のAIタイトルと説明を確認します。", + "contentLang.settingsTitle": "コンテンツ言語", + "contentLang.settingsHelp": "プライマリ言語がデフォルトで使われます。追加言語には個別のプロンプトとAI結果があり(各実行でクレジットを消費します)。", + "ai.prompts.languageHelp": "コンテンツ言語ごとに会社プロンプトを編集します。空の言語はその言語の組み込みデフォルトにフォールバックします。", + "header.accountSettingsAria": "{email} のアカウント設定", + "switcher.switchUserAria": "ユーザー切替: {label}", + "switcher.unavailable": "この環境ではユーザー切替を利用できません。", + "switcher.loadFailed": "ユーザーを読み込めませんでした。", + "support.notifications.aria": "サポート通知", + "support.notifications.ariaUnread": "サポート通知、未読 {count} ä»¶", + "time.never": "なし", + "time.invalid": "無効な日付", + "time.unknown": "不明な日付", + "time.justNow": "たった今", + "time.neverUsed": "未使用", + "billing.plan.enterprise": "エンタープライズ", + "news.heading": "プラットフォームの更新", + "news.subtitle": "最新の機能と改善", + "news.keyFeatures": "主な機能:", + "news.badge.new": "新着", + "news.footer": "以上です — 次のリリース後にまたご確認ください。", + "news.category.enhancement": "改善", + "news.category.feature": "機能", + "news.category.integration": "連携", + "news.category.newFeature": "新機能", + "news.category.billing": "請求", + "news.uxImprovements.description": "ガイドツアー制御、API改善、ナビゲーション向上で使いやすさを強化しました。", + "news.uxImprovements.f1": "ガイドツアーのスキップ/非表示", + "news.uxImprovements.f2": "APIの信頼性向上", + "news.uxImprovements.f3": "UIナビゲーションの強化", + "news.uxImprovements.f4": "ワークフロー効率の向上", + "news.multiselect.title": "複数選択属性のサポート", + "news.multiselect.description": "リスト型属性で商品に複数の値を持てるようになりました。", + "news.multiselect.f1": "複数選択属性タイプ", + "news.multiselect.f2": "商品編集での複数値選択", + "news.multiselect.f3": "1つの属性に複数の値を保存", + "news.multiselect.f4": "複数選択フィールドの抽出強化", + "news.multiselect.f5": "エクスポートフィード互換性の向上", + "news.csvEan.title": "CSV EANアップロード", + "news.csvEan.description": "EANコードのCSVをアップロードして数百の商品を一括処理。", + "news.csvEan.f1": "ドラッグ&ドロップでのCSVアップロード", + "news.csvEan.f2": "EAN形式の検証(EAN-8、EAN-13、UPC-12、GTIN-14)", + "news.csvEan.f3": "重複の自動検出", + "news.csvEan.f4": "商品の一括処理", + "news.csvEan.f5": "詳細な処理統計", + "news.brick.title": "BRICKコード属性のサポート", + "news.brick.description": "標準化された分類とエクスポート向けのBRICKコード属性対応。", + "news.brick.f1": "BRICKコード属性の処理", + "news.brick.f2": "エクスポートでのコード自動整形", + "news.brick.f3": "XMLフィードへのBRICKコード統合", + "news.brick.f4": "エクスポートフィード互換性の改善", + "news.apiV1.title": "API v1リリース", + "news.apiV1.description": "カテゴリ・属性・フィード・商品・エクスポート向けの新しいAPI v1エンドポイント。", + "news.apiV1.f1": "RESTful API v1エンドポイント", + "news.apiV1.f2": "カテゴリと属性の管理", + "news.apiV1.f3": "フィードの作成と管理", + "news.apiV1.f4": "APIによる商品処理", + "news.apiV1.f5": "エクスポートフィードへのプログラムアクセス", + "news.apiV1.f6": "認証と認可", + "news.feedFiltering.title": "商品ページのフィードフィルタ", + "news.feedFiltering.description": "フィードフィルタ最適化、読み込み状態、パフォーマンス向上の商品ページ。", + "news.feedFiltering.f1": "フィードフィルタの強化", + "news.feedFiltering.f2": "読み込み状態の改善", + "news.feedFiltering.f3": "クエリ性能の最適化", + "news.feedFiltering.f4": "ページネーション処理の改善", + "news.feedFiltering.f5": "エクスポート機能の改善", + "news.exportFeeds.title": "エクスポートフィードシステム", + "news.exportFeeds.description": "カスタム設定付きの包括的なXML/CSVエクスポートフィード。", + "news.exportFeeds.f1": "XMLおよびCSVエクスポート形式", + "news.exportFeeds.f2": "カスタムフィールドマッピング", + "news.exportFeeds.f3": "エクスポートプレビュー", + "news.exportFeeds.f4": "ジョブベースの商品エクスポート", + "news.exportFeeds.f5": "EPRELデータ連携", + "news.exportFeeds.f6": "公開エクスポートフィードURL", + "news.woocommerce.title": "WooCommerce連携", + "news.woocommerce.description": "WooCommerceストアと商品・カテゴリ・属性を同期。", + "news.woocommerce.f1": "ストア認証情報の設定", + "news.woocommerce.f2": "カテゴリと属性のマッピング", + "news.woocommerce.f3": "双方向の商品同期", + "news.woocommerce.f4": "マッチ戦略オプション", + "news.eprel.title": "EPRELエネルギラベル連携", + "news.eprel.description": "欧州エネルギラベル登録との連携で効率データを取得。", + "news.eprel.f1": "EPREL IDの自動処理", + "news.eprel.f2": "エネルギラベル画像の取得", + "news.eprel.f3": "製品エネルギーフィシュのダウンロード", + "news.eprel.f4": "エネルギークラスの抽出", + "news.eprel.f5": "多言語サポート", + "news.aiCategorization.title": "商品カテゴリ分類の強化", + "news.aiCategorization.description": "精度向上と階層カテゴリ対応のAI分類システム。", + "news.aiCategorization.f1": "階層カテゴリナビ", + "news.aiCategorization.f2": "信頼度スコア", + "news.aiCategorization.f3": "多言語サポート", + "news.aiCategorization.f4": "自動フォールバック処理", + "news.standardFields.title": "標準フィールド管理", + "news.standardFields.description": "グループ・検証・デフォルト値付きで標準商品フィールドを管理。", + "news.standardFields.f1": "フィールドグループでの整理", + "news.standardFields.f2": "システム/カスタムフィールド", + "news.standardFields.f3": "フィールド検証ルール", + "news.standardFields.f4": "デフォルト値のサポート", + "news.standardFields.f5": "フィールドの自動セットアップ", + "news.billingSystem.title": "クレジットベースの課金", + "news.billingSystem.description": "利用状況追跡と柔軟な支払いオプション付きのクレジット課金システム。", + "news.billingSystem.f1": "クレジットベースの処理", + "news.billingSystem.f2": "利用状況アナリティクス", + "news.billingSystem.f3": "柔軟な請求サイクル", + "news.billingSystem.f4": "支払い方法の管理", + "news.billingSystem.f5": "請求書の生成", + "products.pageTitle": "商品管理", + "products.pageDescriptionStoresBefore": "商品カタログを管理・処理・最適化します。ストアを接続するか、CSVを次からインポート:", + "products.pageDescriptionBasic": "商品カタログを管理・処理・最適化します。Feedsからインポートするか、CSVをアップロードしてください。", + "products.keyboard.esc": "— 商品編集パネルやダイアログを閉じる", + "products.keyboard.toggle": "— このヒントの表示切替", + "products.keyboard.reviewPrefix": "要確認パネルで:", + "products.keyboard.acceptAll": "すべて承認", + "products.keyboard.rejectShort": "却下", + "products.keyboard.acceptFields": "名前 / 説明を承認", + "products.connectStore": "ストアを接続", + "products.updating": "更新中…", + "products.needLinkedRaw": "選択した商品を処理するにはリンクされた生データ商品が必要です。", + "products.selectToProcess": "処理する商品を少なくとも1つ選択してください。", + "products.undoResetHint": "元に戻すとリセットで商品が未処理に戻ります。", + "products.field.accepted": "{label} を商品に反映しました。", + "products.field.acceptFailed": "{field} を承認できませんでした", + "products.field.discarded": "{label} のエンリッチメントを破棄しました。", + "products.field.discardFailed": "{field} を破棄できませんでした", + "products.upgradeRequired": "アップグレードが必要です", + "products.upgradeBody": "この機能には有料プランまたはAIクレジットが必要です。", + "products.enrichment.rejectTitle": "エンリッチメントを却下しますか?", + "products.enrichment.rejectSelectedTitle": "選択した商品を却下しますか?", + "products.enrichment.resetTitle": "未処理にリセットしますか?", + "products.selectedOnPage": "このページで {count} 件選択", + "products.selectionPageOnly": "{total} 件中 {shown} 件表示 — 選択はこのページのみ", + "products.edit.coverageHint": "名前・説明・属性・カテゴリのうち、いくつが存在するかを示します(フィードまたは処理済み)。", + "products.edit.noEprelShort": "EPRELなし", + "products.edit.specs": "仕様", + "products.edit.reviewBannerBody": "レビュータブで元データとAIを比較します。ショートカット: A 承認 · R 却下 · Alt+1/2 フィールド · ⌘/Ctrl+Enter すべて承認。", + "products.edit.whatsFilled": "入力済みの項目", + "products.edit.legend": "Gray = missing · Orange = from フィード · Green = processed", + "products.edit.updatedAgo": "· æ›´æ–° {relative}", + "products.edit.status": "ステータス", + "products.edit.noRawUpdate": "No raw 商品 update time", + "products.edit.feedSyncPart": "· フィード同期", + "products.edit.filledFields": "{filled}件入力済み · {total}フィールド", + "products.edit.noMappedFields": "No mapped フィード fields on this 商品.", + "products.edit.emptyBadge": "空", + "products.edit.coreBadge": "コア", + "products.edit.feedAttrsHint": "フィードから解析した値(仕様HTML、保証、寸法、EPREL)。キーは可能な場合 attribute_key にリンクされます。", + "products.edit.originalAttrs": "元の属性", + "products.edit.aiAttrs": "AI/エンリッチ属性", + "mapping.confidence.exact": "完全一致", + "mapping.confidence.alias": "エイリアス", + "mapping.confidence.fuzzy": "あいまい", + "field.group.basic": "基本情報", + "field.group.pricing": "価格", + "field.group.media": "メディア", + "field.group.taxonomy": "分類", + "field.group.inventory": "在庫", + "field.group.attributes": "属性", + "field.group.shipping": "配送", + "field.group.compliance": "コンプライアンス", + "field.group.other": "その他", + "common.yes": "はい", + "common.no": "いいえ", + "status.running": "実行中", + "flash.admin.analyticsLoadFailed": "分析の読み込みに失敗しました", + "flash.admin.diagnosticsLoadFailed": "診断の読み込みに失敗しました", + "flash.admin.diagnosticsUnavailable": "このデプロイでは診断を利用できません。プラットフォーム管理者に連絡してください。", + "flash.admin.diagnosticsUnreachable": "診断APIに到達できません。APIが稼働していること、および PUBLIC_API_URL / Vite プロキシがその先を指していることを確認してください。", + "admin.charts.statusEmpty": "この内訳に行はまだありません。", + "admin.charts.seriesEmpty": "この期間のデータはまだありません。", + "admin.charts.primaryDefault": "主系列", + "admin.charts.statusAria": "ステータス分布", + "admin.charts.seriesAria": "{label}のチャート", + "admin.analytics.lastNDaysAria": "ç›´è¿‘{days}æ—¥", + "admin.analytics.overview": "概要", + "admin.analytics.overviewHint": "ç›´è¿‘{days}日の期間コンテキスト付きプラットフォーム合計。", + "admin.analytics.tokensInPeriod": "期間内 {tokens} · 処理済み商品から", + "admin.analytics.creditsRemainingOf": "割当{allocated}のうち残り{remaining}", + "admin.analytics.noJobsYet": "ジョブはまだありません", + "admin.analytics.feedsVolume": "入力 {input} · エクスポートフィード {export}", + "admin.analytics.usersCompaniesRaw": "ユーザー {users} · 会社 {companies} · 生データ {raw}", + "admin.analytics.operations": "オペレーション", + "admin.analytics.operationsHint": "選択期間の信頼性シグナル、キー、成長。", + "admin.analytics.failedCompleted": "失敗 {failed} · 完了 {completed}", + "admin.analytics.runningOver2h": "実行中 > 2時間 ·", + "admin.analytics.apiKeysTotal": "合計 {total}(失効済みを含む)", + "admin.analytics.signupsDetail": "ユーザー · 会社 {companies} · 未解決/保留チケット {tickets}", + "admin.analytics.providerMix": "プロバイダー構成", + "admin.analytics.providerMixHint": "AI認証情報の設定方法別のトークン消費。", + "admin.analytics.productsJobs": "商品 {products} · ジョブ {jobs}", + "admin.analytics.trends": "トレンド", + "admin.analytics.trendsHint": "トークン・プロバイダー・ジョブ・登録の日次系列。", + "admin.analytics.tokensByDayHint": "完了した商品処理のトークン(副系列=その日の商品数)", + "admin.analytics.seriesTokens": "トークン", + "admin.analytics.seriesProducts": "商品", + "admin.analytics.emptyTokens": "この期間にトークン付きの処理済み商品はありません。", + "admin.analytics.tokensByProviderHint": "日次内訳: 内部 / 人気 / カスタム(プロバイダータイプ別)", + "admin.analytics.emptyProviderTokens": "この期間にプロバイダー付きトークンはまだありません。", + "admin.analytics.providerDayTip": "{date}: 内部 {internal} · 人気 {popular} · カスタム {custom}", + "admin.analytics.seriesCreated": "作成日", + "admin.analytics.seriesFailed": "失敗", + "admin.analytics.emptyJobsSeries": "この期間に作成された処理ジョブはありません。", + "admin.analytics.seriesUsers": "ユーザー", + "admin.analytics.seriesCompanies": "会社", + "admin.analytics.emptySignups": "この期間にユーザーまたは会社の登録はありません。", + "admin.analytics.statusMix": "ステータス構成", + "admin.analytics.statusMixHint": "ジョブ・フィード同期・サポートの全期間キュー。", + "admin.analytics.jobStatus": "ジョブステータス", + "admin.analytics.feedSyncQueue": "フィード同期キュー", + "admin.analytics.supportTickets": "サポートチケット", + "admin.analytics.emptyJobStatus": "処理ジョブはまだありません。", + "admin.analytics.emptyFeedSync": "フィード同期ジョブはまだありません。", + "admin.analytics.emptyTickets": "サポートチケットはまだありません。", + "admin.analytics.usageDetail": "利用詳細", + "admin.analytics.usageDetailHint": "プロバイダーモード、上位会社、請求サイクル集計。", + "admin.analytics.companyUsage": "会社別利用", + "admin.analytics.jobsCol": "ジョブ", + "admin.analytics.billingCycles": "請求 cycles", + "admin.analytics.billingCyclesHint": "過去の請求サイクルの履歴集計(アクティブなサブスクリプションより遅れる場合があります)", + "admin.analytics.periodCol": "期間", + "admin.analytics.creditsCol": "クレジット", + "admin.analytics.dataNotes": "データ注記", + "admin.diagnostics.endpointNotMounted": "エンドポイント未搭載", + "admin.diagnostics.noPayload": "診断ペイロードなし", + "admin.diagnostics.unavailableShort": "このデプロイでは診断を利用できません。", + "admin.diagnostics.fixThenRefresh": "上のエラーを修正してから更新してください。", + "admin.diagnostics.refreshOrConfirm": "更新するか、APIが正常か確認してください。", + "admin.diagnostics.systemStatus": "システム状態", + "admin.diagnostics.snapshot": "スナップショット {when}", + "admin.diagnostics.queueTotal": "合計 {total}", + "admin.diagnostics.queueStuck": "processing_jobs · 実行停滞(>2時間):", + "admin.diagnostics.driver": "ドライバ: {driver}", + "admin.diagnostics.openStuck": "停滞商品を開く", + "admin.diagnostics.configPresence": "設定の有無", + "admin.diagnostics.configHint": "真偽値のみ · env {env} · RPM {rpm} · バッチ {batch} · 再試行 {retries}", + "admin.diagnostics.cutoverTitle": "カットオーバー準備", + "admin.diagnostics.cutoverHint": "存在フラグのみ — gooseバージョン、ワーカー経過、プラン不足。ライブStripe/SMTPなし。", "admin.diagnostics.cutoverGoose": "Goose", - "admin.diagnostics.cutoverGooseVersion": "version_max {max} · 想定 ≥ {min}", - "admin.diagnostics.cutoverGooseRequired": "必須マイグレーション", - "admin.diagnostics.cutoverWorker": "ワーカー", - "admin.diagnostics.cutoverWorkerAge": "最終確認 {age}秒前 · {stale}秒で失効", - "admin.diagnostics.cutoverWorkerAgeUnknown": "経過不明 · {stale}秒で失効", - "admin.diagnostics.cutoverPlansMissing": "プラン未設定の企業", - "admin.diagnostics.cutoverPlansUnavailable": "プラン件数が取得できません", + "admin.diagnostics.cutoverGooseVersion": "version_max {max} · 想定 ≥ {min}", + "admin.diagnostics.cutoverGooseRequired": "必須マイグレーション", + "admin.diagnostics.cutoverWorker": "ワーカー", + "admin.diagnostics.cutoverWorkerAge": "最終確認 {age}秒前 · {stale}秒で失効", + "admin.diagnostics.cutoverWorkerAgeUnknown": "経過不明 · {stale}秒で失効", + "admin.diagnostics.cutoverPlansMissing": "プラン未設定の企業", + "admin.diagnostics.cutoverPlansUnavailable": "プラン件数が取得できません", "admin.diagnostics.cutoverApiKeysMissing": "Companies without API keys", "admin.diagnostics.cutoverApiKeysUnavailable": "API key inventory unavailable", - "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", + "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", "admin.diagnostics.cutoverApiKeysLink": "List companies needing reissue", - "admin.diagnostics.cutoverApplied": "適用済", - "admin.diagnostics.cutoverPending": "未適用", + "admin.diagnostics.cutoverApplied": "適用済", + "admin.diagnostics.cutoverPending": "未適用", "admin.diagnostics.etlInventoryTitle": "ETL gap inventory", - "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", + "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", "admin.diagnostics.etlInventoryFiles": "Files metadata-only", "admin.diagnostics.etlInventoryFilesDetail": "metadata-only / total file rows", "admin.diagnostics.etlInventoryJobs": "Jobs migrated tag", @@ -4652,611 +4653,611 @@ export const ja: MessageDict = { "admin.diagnostics.etlInventoryJobsRan": "optional jobs domain backfill detected", "admin.diagnostics.etlInventoryTasks": "Tasks rows", "admin.diagnostics.etlInventoryTasksDetail": "legacy task history present in Postgres", - "admin.diagnostics.recentJobs": "最近のジョブ", - "admin.diagnostics.recentAiFailures": "最近のサポートAI失敗", - "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", - "admin.diagnostics.relatedTools": "関連運用ツール", - "admin.diagnostics.toolStuckTitle": "スタックした商品", - "admin.diagnostics.toolStuckDesc": "2時間超の実行中ジョブをクリーンアップ。", + "admin.diagnostics.recentJobs": "最近のジョブ", + "admin.diagnostics.recentAiFailures": "最近のサポートAI失敗", + "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", + "admin.diagnostics.relatedTools": "関連運用ツール", + "admin.diagnostics.toolStuckTitle": "スタックした商品", + "admin.diagnostics.toolStuckDesc": "2時間超の実行中ジョブをクリーンアップ。", "admin.diagnostics.toolOrphanTitle": "Orphan processed", - "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", - "admin.diagnostics.toolAnalyticsTitle": "アナリティクス", - "admin.diagnostics.toolAnalyticsDesc": "トレンドとプラットフォーム利用チャート。", - "admin.diagnostics.toolBootstrapTitle": "ブートストラップ", - "admin.diagnostics.toolBootstrapDesc": "このアカウントのプラットフォーム管理者アクセスを確認。", - "admin.diagnostics.toolSettingsTitle": "設定", - "admin.diagnostics.toolSettingsDesc": "プラットフォームのメール、AI、システムモード。", - "admin.diagnostics.config.maintenance_mode": "メンテナンスモード", - "admin.diagnostics.config.read_only_mode": "読み取り専用モード", - "admin.diagnostics.config.session_secure": "セキュアセッションCookie", - "admin.diagnostics.config.smtp_enabled": "SMTP 有効", - "admin.diagnostics.config.email_dry_run": "メールdry-run", - "admin.diagnostics.config.smtp_host_set": "SMTPホスト設定済み", - "admin.diagnostics.config.stripe_mock": "Stripeモック", - "admin.diagnostics.config.eprel_enabled": "EPREL有効", - "admin.diagnostics.config.upload_dir_configured": "アップロードディレクトリ設定済み", - "admin.diagnostics.config.trusted_proxies_configured": "信頼プロキシ設定済み", - "admin.diagnostics.config.web_origin_set": "Webオリジン設定済み", - "admin.diagnostics.config.public_api_url_set": "公開API URL設定済み", - "admin.diagnostics.config.token_signing_secret_set": "トークン署名シークレット設定済み", - "admin.diagnostics.config.openai_key_set": "OpenAIキー設定済み", - "admin.diagnostics.config.pinecone_key_set": "Pineconeキー設定済み", - "admin.diagnostics.config.stripe_secret_set": "Stripeシークレット設定済み", - "admin.diagnostics.config.stripe_webhook_secret_set": "Stripe Webhookシークレット設定済み", - "admin.diagnostics.config.stripe_mock_rejected_in_prod": "本番でStripeモック拒否", - "admin.diagnostics.config.credentials_encryption_key_set": "認証情報暗号化キー設定済み", - "categories.selectAll": "すべて選択", - "categories.selectedCount": "{count} 件選択", - "categories.noMatchingCategories": "一致するカテゴリがありません", - "categories.assigningProgress": "割り当て中… {progress}%", - "categories.assignToCount": "{count} 件に割り当て", - "categories.aiPromptSavedForCategory": "このカテゴリには AI 生成プロンプトが保存されています。", - "categories.titleAndDescriptionFormulasSaved": "このカテゴリにはタイトルと説明の数式が保存されています。", - "categories.titleFormulaSavedForCategory": "このカテゴリにはタイトル数式が保存されています。", - "categories.descriptionFormulaSavedForCategory": "このカテゴリには説明数式が保存されています。", - "site.account": "アカウント", - "site.goToApp": "アプリへ", - "site.logIn": "ログイン", - "site.getStarted": "始める", - "site.nav.primary": "メイン", - "site.nav.mobile": "モバイル", - "site.nav.home": "ホーム", - "site.nav.pricing": "料金", - "site.nav.apiDocs": "API ドキュメント", - "seo.home.title": "Descrybe — サプライヤーフィードを完成した商品ページに変換", - "seo.home.description": "サプライヤーの CSV または XML フィードを接続し、カテゴリと属性にマッピングし、ルールに従ってタイトルと説明を生成し、エクスポートまたは WooCommerce と同期します。", - "seo.pricing.title": "料金 — Free、Starter、Growth、Business | Descrybe", - "seo.pricing.description": "100 商品とフィードマッピングで無料開始。有料プランでは AI によるタイトル・説明、追加 SKU、エクスポートフィード、WooCommerce 同期を提供 — 月額 49 ドルから。無制限カタログ向け Enterprise あり。", - "seo.privacy.title": "プライバシーポリシー | Descrybe", - "seo.privacy.description": "Descrybe が商品データプラットフォームの利用時に、アカウントデータ、商品カタログ、サプライヤーフィードをどのように収集・利用・保護するかについて。", - "seo.terms.title": "利用規約 | Descrybe", - "seo.terms.description": "Descrybe の利用条件:フィードのインポート、カタログのエンリッチメント、AI 支援コンテンツ、エクスポート、およびビジネス向け WooCommerce 同期。", - "seo.features.title": "機能 — フィード、エンリッチメント、エクスポート | Descrybe", - "seo.features.description": "Descrybe がサプライヤーフィードを取り込み、フィールドをタクソノミーにマッピングし、商品データをエンリッチし、エクスポートフィード、WooCommerce、または API でカタログを配信する仕組みをご確認ください。", - "pricing.page.eyebrow": "料金", - "pricing.page.title": "成長するカタログ向けのシンプルなプラン", - "pricing.page.lead": "フィードのマッピングと基本的な整形から無料で始められます。AI によるタイトル/説明、商品数の増加、エクスポートフィード、WooCommerce 連携が必要になったらアップグレード — Starter から Enterprise まで。", - "pricing.page.subscribedBefore": "すでにご契約済みですか?利用状況の管理は", - "pricing.page.subscribedMid": "、プラン比較は", - "pricing.page.plansLink": "プラン", - "pricing.page.subscribedAfter": "へ。", - "legal.lastUpdated": "最終更新日: {date}", - "legal.backHome": "← ホームに戻る", - "legal.emailLabel": "メール:", - "legal.postalLabel": "郵便住所:", - "legal.privacy.title": "プライバシーポリシー", - "legal.privacy.intro.h": "はじめに", - "legal.privacy.intro.p1": "Descrybe(「当社」「私たち」)は、お客様のプライバシーを尊重し、個人情報の保護に努めています。本プライバシーポリシーは、お客様が Descrybe の商品データプラットフォームおよび関連サービス(総称して「本サービス」)を利用する際に、当社がお客様の情報をどのように収集、利用、開示、保護するかを説明するものです。", - "legal.privacy.intro.p2": "本サービスにアクセスまたは利用することにより、お客様は本プライバシーポリシーに記載された慣行に同意したものとみなされます。ここに記載された方針および慣行に同意されない場合は、本サービスを利用しないでください。", - "legal.privacy.collect.h": "収集する情報", - "legal.privacy.collect.lead": "当社は、本サービスの利用者から、および利用者に関して、次のような各種情報を収集します。", - "legal.privacy.collect.personal.h": "個人情報", - "legal.privacy.collect.personal.p": "アカウント登録時に、氏名、メールアドレス、電話番号、会社名、請求情報など、お客様を特定しうる情報を収集します。これらの情報は、お客様が当社に提供した際に直接収集します。", - "legal.privacy.collect.userData.h": "ユーザーデータ", - "legal.privacy.collect.userData.p": "本サービスの提供のため、商品データ、サプライヤーフィード、商品説明、およびお客様が当社プラットフォームにアップロード、入力、またはその他の方法で送信するその他のコンテンツを収集および処理します。これには、商品属性、タクソノミー構造、テンプレート、ならびに本サービスの運用に必要なその他のデータが含まれる場合があります。", - "legal.privacy.collect.usage.h": "利用情報", - "legal.privacy.collect.usage.p": "当社は、お客様のデバイスおよび本サービスとのやり取りに関する一定の情報を自動的に収集します。これには、IP アドレス、デバイスタイプ、ブラウザの種類、オペレーティングシステム、アクセス時間、閲覧ページ、使用機能、その他のシステム活動が含まれます。当社はこの情報を、本サービスおよびユーザー体験の向上に使用します。", - "legal.privacy.collect.cookies.h": "Cookie およびトラッキング技術", - "legal.privacy.collect.cookies.p": "当社は、Cookie、ウェブビーコン、および類似のトラッキング技術を使用し、当社ウェブサイト上でのお客様の閲覧活動に関する情報を収集します。ブラウザ設定およびその他のツールにより Cookie を制御できます。ただし、特定の Cookie をブロックすると、本サービスのすべての機能を利用できなくなる場合があります。", - "legal.privacy.use.h": "情報の利用方法", - "legal.privacy.use.lead": "当社は、収集した情報を次のようなさまざまな目的で利用します。", - "legal.privacy.use.li1": "本サービスの提供、維持、および改善", - "legal.privacy.use.li2": "取引の処理、ならびに確認書、請求書、サービス通知を含む関連情報の送信", - "legal.privacy.use.li3": "新製品、サービス、機能、および機能性の開発", - "legal.privacy.use.li4": "お客様の体験のパーソナライズ、およびお客様の関心に関連するコンテンツと機能の提供", - "legal.privacy.use.li5": "お客様の依頼、フィードバック、および質問への対応", - "legal.privacy.use.li6": "技術的なお知らせ、更新情報、セキュリティアラート、ならびにサポートおよび管理メッセージの送信", - "legal.privacy.use.li7": "本サービスに関連する傾向、利用状況、および活動の監視と分析", - "legal.privacy.use.li8": "詐欺的な取引およびその他の違法行為の検出、調査、および防止", - "legal.privacy.use.li9": "当社の権利、財産、および安全、ならびに当社の利用者またはその他の者の権利、財産、および安全の保護", - "legal.privacy.use.li10": "法的義務の履行および当社の利用規約の執行", - "legal.privacy.ai.h": "AI および機械学習", - "legal.privacy.ai.p1": "本サービスは、人工知能および機械学習技術を使用して商品データを処理し、コンテンツを生成し、その他の自動化機能を提供します。お客様が本サービスに提供するデータは、当社の AI モデルの訓練および改善に使用される場合があります。ただし、当社はお客様のデータを保護し、機密性を維持するための適切な安全策を適用します。", - "legal.privacy.ai.p2": "当社は、お客様の明示的な同意なく、個人を特定できる情報を一般的な AI モデルの訓練に使用しません。AI 訓練に使用される商品データは、可能な限り匿名化および集計されます。", - "legal.privacy.share.h": "情報の共有方法", - "legal.privacy.share.lead": "当社は、次の状況においてお客様の情報を共有する場合があります。", - "legal.privacy.share.providers.h": "サービスプロバイダー", - "legal.privacy.share.providers.p": "当社は、決済処理、データ分析、メール送信、ホスティング、カスタマーサポート、マーケティング支援など、当社に代わってサービスを行う第三者のベンダー、サービスプロバイダー、契約業者、または代理人と、お客様の情報を共有する場合があります。", - "legal.privacy.share.transfers.h": "事業譲渡", - "legal.privacy.share.transfers.p": "当社が合併、買収、資金調達、再編、破産、または企業資産の売却に関与する場合、お客様の情報はその取引の一環として移転されることがあります。個人情報の所有権または管理に関するかかる変更については、お客様にお知らせします。", - "legal.privacy.share.legal.h": "法的要件", - "legal.privacy.share.legal.p": "法令により要求される場合、または公的機関(例:裁判所もしくは政府機関)からの有効な要請に応じて、当社はお客様の情報を開示する場合があります。また、当社の利用規約を執行し、当社の権利、プライバシー、安全、または財産、および/または当社の関連会社、利用者、もしくはその他の者の権利、プライバシー、安全、または財産を保護するために、お客様の情報を開示する場合があります。", - "legal.privacy.share.consent.h": "お客様の同意による場合", - "legal.privacy.share.consent.p": "お客様が第三者との共有に同意した場合、当社はお客様の情報を第三者と共有することがあります。", - "legal.privacy.security.h": "データセキュリティ", - "legal.privacy.security.p1": "当社は、お客様の個人情報を偶発的な損失、ならびに不正アクセス、利用、改変、および開示から保護するために設計された適切な技術的・組織的措置を実施しています。お客様が当社に提供するすべての情報は、ファイアウォールの背後にある安全なサーバーに保存されます。", - "legal.privacy.security.p2": "お客様の情報のセキュリティは、お客様ご自身にも依存します。本サービスの特定の部分にアクセスするためのパスワードを当社が提供した場合(またはお客様が選択した場合)、お客様はそのパスワードの機密を保持する責任を負います。パスワードを他者と共有しないようお願いいたします。", - "legal.privacy.security.p3": "残念ながら、インターネットを介した情報の送信は完全に安全ではありません。当社はお客様の個人情報の保護に最善を尽くしますが、本サービスに送信される個人情報の安全性を保証することはできません。個人情報のいかなる送信も、お客様ご自身のリスクで行われます。", - "legal.privacy.rights.h": "お客様の権利と選択肢", - "legal.privacy.rights.lead": "当社は、お客様が当社に提供する個人情報に関して選択肢を提供するよう努めています。お客様の所在地に応じて、個人情報に関する一定の権利を有する場合があります。これには次が含まれます。", - "legal.privacy.rights.li1": "個人情報へのアクセスおよび更新", - "legal.privacy.rights.li2": "個人情報の削除の請求", - "legal.privacy.rights.li3": "個人情報の処理への異議または制限", - "legal.privacy.rights.li4": "データのポータビリティ", - "legal.privacy.rights.li5": "同意の撤回(該当する場合)", - "legal.privacy.rights.footer": "権利を行使するには、本プライバシーポリシー末尾の連絡先情報を使用して当社までご連絡ください。これらの権利の一部は、お客様の所在地および具体的な状況により、制限されるか適用されない場合があることにご留意ください。", - "legal.privacy.retention.h": "データの保持", - "legal.privacy.retention.p1": "当社は、本プライバシーポリシーに記載された目的を達成するために必要な期間、お客様の個人情報を保持します。ただし、法令によりより長い保持期間が要求または許可される場合を除きます。保持期間を決定する際、当社は情報の量、性質、および機微性、不正利用または開示による損害の潜在的リスク、処理の目的、ならびに適用される法的要件を考慮します。", - "legal.privacy.retention.p2": "当社は、法的義務の履行、紛争の解決、および当社の合意の執行などの目的のため、アカウント閉鎖後も一定の情報を保持する場合があります。", - "legal.privacy.intl.h": "国際データ転送", - "legal.privacy.intl.p1": "お客様の個人情報は、お客様の居住国以外の国に転送され、処理される場合があります。これらの国のデータ保護法は、お客様の国の法令と異なる場合があります。", - "legal.privacy.intl.p2": "欧州経済領域または包括的なデータ保護法を有するその他の地域の外の国にお客様の個人情報を転送する場合、当社は個人情報を保護するための適切な安全策が存在すること、および転送が適用されるデータ保護規制に適合することを確保します。", - "legal.privacy.children.h": "未成年者のプライバシー", - "legal.privacy.children.p": "本サービスは 16 歳未満の方を対象としておらず、当社は 16 歳未満の方から故意に個人情報を収集しません。保護者の同意の確認なく 16 歳未満の方から個人情報を収集または受領したことが判明した場合、当社はその情報を削除します。当社が 16 歳未満の方からの、またはその方に関する情報を保有していると思われる場合は、当社までご連絡ください。", - "legal.privacy.changes.h": "プライバシーポリシーの変更", - "legal.privacy.changes.p1": "当社は、随時プライバシーポリシーを更新する場合があります。利用者の個人情報の取扱い方法について実質的な変更を行う場合、アカウントに登録されたメールアドレスへの電子メールおよび/または当社ウェブサイト上の通知によりお知らせします。", - "legal.privacy.changes.p2": "プライバシーポリシーの最終改訂日はページ上部に表示されます。お客様は、当社が最新で有効かつ配達可能なメールアドレスを保持していることを確保し、変更の有無を確認するために当社ウェブサイトおよび本プライバシーポリシーを定期的に訪問する責任を負います。", - "legal.privacy.contact.h": "お問い合わせ", - "legal.privacy.contact.lead": "当社のプライバシーポリシーまたはデータ慣行についてご質問やご懸念がある場合は、次の宛先までご連絡ください。", - "legal.terms.title": "利用規約", - "legal.terms.s1.h": "1. 規約への同意", - "legal.terms.s1.p": "Descrybe の商品データプラットフォームおよび関連サービス(総称して「本サービス」)にアクセスまたは利用することにより、お客様は本利用規約ならびにすべての適用法令に拘束されることに同意したものとみなされます。これらの条件のいずれかに同意されない場合、本サービスの利用またはアクセスは禁止されます。", - "legal.terms.s2.h": "2. 利用ライセンス", - "legal.terms.s2.p1": "本利用規約の遵守を条件として、Descrybe はお客様に対し、事業目的で本サービスにアクセスおよび利用するための限定的、非独占的、譲渡不可、かつ取消可能なライセンスを付与します。", - "legal.terms.s2.lead": "本ライセンスには次は含まれません。", - "legal.terms.s2.li1": "本サービスまたはそのコンテンツの改変もしくは複製", - "legal.terms.s2.li2": "許可された事業利用以外の商業目的での本サービスの利用", - "legal.terms.s2.li3": "本サービスに含まれるソフトウェアの逆コンパイルまたはリバースエンジニアリングの試み", - "legal.terms.s2.li4": "素材からの著作権表示または所有権表示の削除", - "legal.terms.s2.li5": "素材の他者への譲渡、または他のサーバー上での素材の「ミラーリング」", - "legal.terms.s2.p2": "本ライセンスは、これらの制限のいずれかに違反した場合に自動的に終了し、Descrybe はいつでも終了させることができます。", - "legal.terms.s3.h": "3. サブスクリプションおよび支払い", - "legal.terms.s3.p1": "本サービスへのアクセスには有料サブスクリプションが必要な場合があります。支払い条件はサブスクリプション手続き中に明示されます。すべての支払いは、Descrybe が書面で別途指定しない限り、返金不可です。", - "legal.terms.s3.p2": "Descrybe は、合理的な事前通知をもってサブスクリプション料金を変更する権利を留保します。料金変更後の本サービスの継続利用は、新しい料金への同意を構成します。", - "legal.terms.s4.h": "4. ユーザーコンテンツ", - "legal.terms.s4.p1": "お客様は、本サービス上または本サービスを通じて送信、投稿、または表示する一切のコンテンツ(「ユーザーコンテンツ」)に関するすべての権利を保持します。Descrybe にユーザーコンテンツを提供することにより、お客様は Descrybe に対し、本サービスの提供に関連して当該コンテンツを使用、複製、改変、翻案、公開、翻訳、および配信するための世界的、非独占的、かつロイヤリティフリーのライセンスを付与します。", - "legal.terms.s4.lead": "お客様は次を表明し保証します。", - "legal.terms.s4.li1": "提供するユーザーコンテンツに関するすべての権利を所有または管理していること", - "legal.terms.s4.li2": "ユーザーコンテンツが本利用規約に違反しないこと", - "legal.terms.s4.li3": "ユーザーコンテンツがいかなる個人または事業体にも損害を与えないこと", - "legal.terms.s5.h": "5. 人工知能", - "legal.terms.s5.p1": "本サービスは、人工知能および機械学習技術を使用します。お客様は、AI により生成されたコンテンツが完璧ではない場合があることを認識し、事業運営で使用する前にすべての AI 生成コンテンツを確認することに同意します。", - "legal.terms.s5.p2": "Descrybe は、当社のプライバシーポリシーに従い、匿名化および集計されたユーザーコンテンツを当社の AI モデルの訓練および改善に使用する場合があります。AI 訓練へのデータの使用を希望されない場合は、当社にご連絡ください。", - "legal.terms.s6.h": "6. 知的財産", - "legal.terms.s6.p": "本サービスおよびそのオリジナルのコンテンツ、機能、および機能性は Descrybe の所有物であり、国際的な著作権、商標、特許、営業秘密、およびその他の知的財産権または所有権に関する法令により保護されています。", - "legal.terms.s7.h": "7. 保証の否認", - "legal.terms.s7.p1": "本サービスは「現状有姿」および「提供可能な状態」で提供されます。Descrybe は、明示または黙示を問わずいかなる保証も行わず、商品性、特定目的適合性、非侵害、または履行過程に関する黙示の保証を含む(これらに限定されない)すべての保証をここに否認します。", - "legal.terms.s7.p2": "Descrybe は、本サービスが中断なく、安全に、または特定の時間もしくは場所で利用可能であること、あるいはエラーまたは欠陥が修正されることを保証しません。", - "legal.terms.s8.h": "8. 責任の制限", - "legal.terms.s8.lead": "いかなる場合も、Descrybe は、間接的、付随的、特別、結果的、または懲罰的損害(利益、データ、利用、のれんの喪失、またはその他の無形の損失を含むがこれらに限定されない)について、次に起因する場合であっても責任を負いません。", - "legal.terms.s8.li1": "本サービスへのアクセスもしくは利用、またはアクセスもしくは利用ができないこと", - "legal.terms.s8.li2": "本サービス上の第三者の行為またはコンテンツ", - "legal.terms.s8.li3": "本サービスから取得したコンテンツ", - "legal.terms.s8.li4": "お客様の送信またはコンテンツへの不正アクセス、利用、または改変", - "legal.terms.s9.h": "9. 終了", - "legal.terms.s9.p1": "Descrybe は、本利用規約に違反した場合を含む(これに限定されない)いかなる理由でも、事前の通知または責任なく、お客様の本サービスへのアクセスを直ちに終了または停止することができます。", - "legal.terms.s9.p2": "終了後、本サービスを利用するお客様の権利は直ちに消滅します。アカウントを終了したい場合は、本サービスの利用を中止するか、アカウント削除を依頼するため当社にご連絡ください。", - "legal.terms.s10.h": "10. 準拠法", - "legal.terms.s10.p": "本規約は、法の抵触に関する原則を考慮することなく、スロベニアの法令に準拠し、同法令に従って解釈されるものとします。", - "legal.terms.s11.h": "11. 規約の変更", - "legal.terms.s11.p": "Descrybe は、いつでも本利用規約を変更または差し替える権利を留保します。変更の有無について本規約を定期的に確認することはお客様の責任です。変更の掲載後に本サービスを継続して利用することは、当該変更への同意を構成します。", - "legal.terms.s12.h": "12. お問い合わせ", - "legal.terms.s12.lead": "本利用規約についてご質問がある場合は、次の宛先までご連絡ください。", - "plans.loadFailed": "プランを読み込めませんでした", - "plans.loading": "プランを読み込み中…", - "plans.apiUnavailable": "このバックエンドではプラン API がまだ利用できません。公開料金比較を表示しています。", - "plans.title": "プランを選択", - "plans.sub.onPrefix": "現在のプラン:", - "plans.sub.enterpriseSuffix": "— 商品と AI は無制限。セルフサービスでのアップグレードは不要です。", - "plans.sub.paygSuffix": "— 従量課金。以下の公開プランを比較するか、Enterprise については営業にお問い合わせください。", - "plans.sub.creditsMid": "(残り AI クレジット {remaining})。", - "plans.sub.creditsSuffix": "Checkout で Starter → Growth → Business にアップグレードするか、Enterprise については営業にお問い合わせください。", - "plans.sub.none": "まだプランが割り当てられていません(例:スキップされた移行後)。下からプランを選択してください — Checkout または管理者が割り当てるまで、容量は無制限ではありません。", - "plans.stripeHint": "セルフサービスのアップグレードは Stripe Checkout を使用します。", - "plans.checkoutUnavailable": "Stripe の設定が完了するまでセルフサービス Checkout は利用できません。プランについては営業にお問い合わせください。", - "plans.fallbackName": "プラン", - "plans.fallbackDescription": "カタログ向けの容量", - "plans.badge.current": "現在", - "plans.badge.popular": "人気", - "plans.price.custom": "カスタム", - "plans.price.forever": "永久", - "plans.price.perMonth": "/月", - "plans.price.seePricing": "料金を見る", - "plans.capacity.unlimitedSkus": "無制限の SKU", - "plans.capacity.unlimitedAi": "無制限の AI クレジット", - "plans.capacity.upToProducts": "最大 {count} 商品", - "plans.capacity.creditsPerMonth": "月あたり AI クレジット {count}", - "plans.cta.requestUpgrade": "アップグレードを依頼", - "plans.cta.current": "現在のプラン", - "plans.cta.contactSales": "営業に問い合わせ", - "plans.cta.switchInBilling": "請求で切り替え", - "plans.cta.upgradeTo": "{name} にアップグレード", - "plans.cta.startingCheckout": "Checkout を開始中…", - "plans.planApplied": "プラン {plan} を適用しました。クレジットの準備ができました。", - "plans.faq.title": "よくある質問", - "plans.faq.limit.q": "上限に達するとどうなりますか?", - "plans.faq.limit.a": "まずソフトな警告が表示されます。AI クレジットがなくなるか SKU 上限に達すると、その容量を必要とするジョブは、空きを確保するか、次のサイクルを待つか、プランをアップグレードするまでブロックされます。", - "plans.faq.selfServe.q": "自分でプランをアップグレードできますか?", - "plans.faq.selfServe.a": "会社の管理者は、プランカードの Checkout から Starter、Growth、Business をセルフサービスで契約できます。メンバーは管理者に依頼する必要があります — Checkout には管理者ロールが必要です。Enterprise は常に営業経由です。プラットフォーム管理者は引き続き Billing Admin でプランを割り当てできます。", - "plans.faq.enterprise.q": "Enterprise と数百万の SKU", - "plans.faq.enterprise.a": "カスタム容量、独自 AI キー(BYOK)、SLA、アカウント管理は営業経由です。Calendly で時間を予約してください — 数百万 SKU 規模では Enterprise はセルフサービスではありません。アプリでは SKU および AI 容量を無制限と表示します。", - "plans.faq.pricing.q": "公開料金はどこにありますか?", - "plans.faq.pricing.aBefore": "マーケティング比較は", - "plans.faq.pricing.pricingPage": "料金ページ", - "plans.faq.pricing.aMid": "でご確認ください — CTA は開始(登録)または営業に問い合わせです。利用状況はいつでも", - "plans.faq.pricing.aAfter": "で管理できます。", - "plans.custom.title": "カスタムプランが必要ですか?", - "plans.custom.body": "Enterprise の容量、独自 AI キー、および SLA は当社チームが対応します。", - "plans.custom.looking": "公開プランの詳細をお探しですか?", - "ai.title": "AI連携", - "ai.description": "プラットフォームのクレジットか独自キーを選び、変数でプロンプトをカスタマイズします。", - "ai.crumb": "AI連携", - "ai.adminOnly": "AI設定を変更できるのは会社の管理者のみです。現在の設定は閲覧できます。", - "ai.badge.ownKey": "独自キー", - "ai.badge.platform": "プラットフォームのクレジット / キー", - "ai.badge.active": "有効: {label}", - "ai.badge.platformKeyAvailable": "プラットフォームキー利用可", - "ai.badge.lastTest": "最終テスト: {status}", - "ai.providerMode.title": "プロバイダーモード", - "ai.providerMode.desc": "プラットフォームは Descrybe のクレジットと当社キーを使用します。人気またはカスタムは、ご自身の OpenAI 互換キーを使用します(プロバイダー呼び出し自体はプラットフォームクレジットを消費しません。機能クレジットのルールは引き続き適用されます)。", - "ai.whoPays": "モデル料金の負担者は?", - "ai.mode.internal": "プラットフォーム(Descrybe クレジット / キー)", - "ai.mode.popular": "独自キー — 人気プロバイダー", - "ai.mode.custom": "独自キー — カスタムエンドポイント", - "ai.useCompanyKey": "処理・SEO AI・キャンペーン AI にこの会社キーを使う", - "ai.popular.title": "人気プロバイダー", - "ai.popular.desc": "OpenAI 互換エンドポイント。Anthropic は OpenRouter 経由。", - "ai.field.provider": "プロバイダー", - "ai.field.model": "モデル", - "ai.placeholder.modelId": "モデル ID", - "ai.baseUrlLabel": "ベース URL: {url}", - "ai.custom.title": "カスタムエンドポイント", - "ai.custom.desc": "AI プロバイダーの HTTPS ベース URL を入力してください。", - "ai.field.baseUrl": "ベース URL", - "ai.apiKey.title": "API キー", - "ai.apiKey.desc": "既存キーを維持する場合は空のままにしてください。生のシークレットは返されず、マスクされた last4 のみです。", - "ai.storedKey": "保存済みキー: {masked}", - "ai.field.apiKey": "API キー", - "ai.placeholder.keepKey": "•••• 空欄で維持", - "ai.clearStoredKey": "保存済み API キーを削除", - "ai.saveProvider": "プロバイダーを保存", - "ai.testConnection": "接続をテスト", - "ai.prompts.title": "プロンプトテンプレート", - "ai.prompts.descBefore": "商品コピー、SEO メタ、キャンペーンメール用のシステム/ユーザープロンプトをカスタマイズします。次のような変数を挿入できます", - "ai.prompts.descMid": "— 実行時に埋め込まれます。ブランドキットの声は次として利用できます", - "ai.prompts.descAfter": "。", - "ai.field.feature": "機能", - "ai.badge.custom": "カスタム", - "ai.badge.builtin": "組み込みデフォルト", - "ai.badge.disabledDefault": "無効 → デフォルトを使用", - "ai.useCustomPrompt": "このカスタムプロンプトを使う(オフ = 組み込みデフォルト)", - "ai.insertVariableInto": "変数の挿入先", - "ai.insert.system": "システム", - "ai.insert.user": "ユーザー", - "ai.field.systemPrompt": "システムプロンプト", - "ai.field.userPrompt": "ユーザープロンプト", - "ai.savePrompts": "プロンプトを保存", - "ai.resetDefault": "デフォルトに戻す", - "ai.editBrandVoice": "ブランドボイスを編集", - "ai.flash.loadFailed": "AI 設定の読み込みに失敗しました", - "ai.flash.usingPlatform": "プラットフォーム AI を使用中(設定済みの Descrybe クレジット / キー)。", - "ai.flash.providerSaved": "AI プロバイダーを保存しました。キーは暗号化され、以後は表示されません。", - "ai.flash.saveFailed": "保存できませんでした", - "ai.flash.savePromptsFailed": "プロンプトを保存できませんでした", - "ai.flash.resetFailed": "プロンプトをリセットできませんでした", - "ai.flash.connectionFailed": "接続に失敗しました", - "ai.flash.testFailed": "テストに失敗しました", - "ai.action.changeSettings": "AI プロバイダー設定を変更する", - "ai.action.changePrompts": "AI プロンプトを変更する", - "ai.action.testProvider": "AI プロバイダーをテストする", - "email.title": "メール送信", - "email.description": "マーケティングキャンペーン向けの Resend または SMTP。シークレットは保管時に暗号化されます。", - "email.adminOnly": "メールプロバイダー設定を変更できるのは会社の管理者のみです。現在の設定は閲覧できます。", - "email.crumb": "メール連携", - "email.dryRunForced": "ドライランが強制されています({reason})。Free プランと EMAIL_DRY_RUN では実際の一斉送信は行われません。", - "email.dryRunPolicy": "ポリシー", - "email.badge.verified": "検証済み", - "email.badge.notVerified": "未検証", - "email.badge.canSendReal": "実送信可能", - "email.badge.realBlocked": "実送信ブロック中", - "email.badge.lastTest": "最終テスト: {status}", - "email.provider.title": "プロバイダー", - "email.provider.desc": "会社ごとの設定。プラットフォームの SMTP/Resend 環境は、シークレット欠落時のフォールバックのみです。", - "email.field.provider": "プロバイダー", + "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", + "admin.diagnostics.toolAnalyticsTitle": "アナリティクス", + "admin.diagnostics.toolAnalyticsDesc": "トレンドとプラットフォーム利用チャート。", + "admin.diagnostics.toolBootstrapTitle": "ブートストラップ", + "admin.diagnostics.toolBootstrapDesc": "このアカウントのプラットフォーム管理者アクセスを確認。", + "admin.diagnostics.toolSettingsTitle": "設定", + "admin.diagnostics.toolSettingsDesc": "プラットフォームのメール、AI、システムモード。", + "admin.diagnostics.config.maintenance_mode": "メンテナンスモード", + "admin.diagnostics.config.read_only_mode": "読み取り専用モード", + "admin.diagnostics.config.session_secure": "セキュアセッションCookie", + "admin.diagnostics.config.smtp_enabled": "SMTP 有効", + "admin.diagnostics.config.email_dry_run": "メールdry-run", + "admin.diagnostics.config.smtp_host_set": "SMTPホスト設定済み", + "admin.diagnostics.config.stripe_mock": "Stripeモック", + "admin.diagnostics.config.eprel_enabled": "EPREL有効", + "admin.diagnostics.config.upload_dir_configured": "アップロードディレクトリ設定済み", + "admin.diagnostics.config.trusted_proxies_configured": "信頼プロキシ設定済み", + "admin.diagnostics.config.web_origin_set": "Webオリジン設定済み", + "admin.diagnostics.config.public_api_url_set": "公開API URL設定済み", + "admin.diagnostics.config.token_signing_secret_set": "トークン署名シークレット設定済み", + "admin.diagnostics.config.openai_key_set": "OpenAIキー設定済み", + "admin.diagnostics.config.pinecone_key_set": "Pineconeキー設定済み", + "admin.diagnostics.config.stripe_secret_set": "Stripeシークレット設定済み", + "admin.diagnostics.config.stripe_webhook_secret_set": "Stripe Webhookシークレット設定済み", + "admin.diagnostics.config.stripe_mock_rejected_in_prod": "本番でStripeモック拒否", + "admin.diagnostics.config.credentials_encryption_key_set": "認証情報暗号化キー設定済み", + "categories.selectAll": "すべて選択", + "categories.selectedCount": "{count} 件選択", + "categories.noMatchingCategories": "一致するカテゴリがありません", + "categories.assigningProgress": "割り当て中… {progress}%", + "categories.assignToCount": "{count} 件に割り当て", + "categories.aiPromptSavedForCategory": "このカテゴリには AI 生成プロンプトが保存されています。", + "categories.titleAndDescriptionFormulasSaved": "このカテゴリにはタイトルと説明の数式が保存されています。", + "categories.titleFormulaSavedForCategory": "このカテゴリにはタイトル数式が保存されています。", + "categories.descriptionFormulaSavedForCategory": "このカテゴリには説明数式が保存されています。", + "site.account": "アカウント", + "site.goToApp": "アプリへ", + "site.logIn": "ログイン", + "site.getStarted": "始める", + "site.nav.primary": "メイン", + "site.nav.mobile": "モバイル", + "site.nav.home": "ホーム", + "site.nav.pricing": "料金", + "site.nav.apiDocs": "API ドキュメント", + "seo.home.title": "Descrybe — サプライヤーフィードを完成した商品ページに変換", + "seo.home.description": "サプライヤーの CSV または XML フィードを接続し、カテゴリと属性にマッピングし、ルールに従ってタイトルと説明を生成し、エクスポートまたは WooCommerce と同期します。", + "seo.pricing.title": "料金 — Free、Starter、Growth、Business | Descrybe", + "seo.pricing.description": "100 商品とフィードマッピングで無料開始。有料プランでは AI によるタイトル・説明、追加 SKU、エクスポートフィード、WooCommerce 同期を提供 — 月額 49 ドルから。無制限カタログ向け Enterprise あり。", + "seo.privacy.title": "プライバシーポリシー | Descrybe", + "seo.privacy.description": "Descrybe が商品データプラットフォームの利用時に、アカウントデータ、商品カタログ、サプライヤーフィードをどのように収集・利用・保護するかについて。", + "seo.terms.title": "利用規約 | Descrybe", + "seo.terms.description": "Descrybe の利用条件:フィードのインポート、カタログのエンリッチメント、AI 支援コンテンツ、エクスポート、およびビジネス向け WooCommerce 同期。", + "seo.features.title": "機能 — フィード、エンリッチメント、エクスポート | Descrybe", + "seo.features.description": "Descrybe がサプライヤーフィードを取り込み、フィールドをタクソノミーにマッピングし、商品データをエンリッチし、エクスポートフィード、WooCommerce、または API でカタログを配信する仕組みをご確認ください。", + "pricing.page.eyebrow": "料金", + "pricing.page.title": "成長するカタログ向けのシンプルなプラン", + "pricing.page.lead": "フィードのマッピングと基本的な整形から無料で始められます。AI によるタイトル/説明、商品数の増加、エクスポートフィード、WooCommerce 連携が必要になったらアップグレード — Starter から Enterprise まで。", + "pricing.page.subscribedBefore": "すでにご契約済みですか?利用状況の管理は", + "pricing.page.subscribedMid": "、プラン比較は", + "pricing.page.plansLink": "プラン", + "pricing.page.subscribedAfter": "へ。", + "legal.lastUpdated": "最終更新日: {date}", + "legal.backHome": "← ホームに戻る", + "legal.emailLabel": "メール:", + "legal.postalLabel": "郵便住所:", + "legal.privacy.title": "プライバシーポリシー", + "legal.privacy.intro.h": "はじめに", + "legal.privacy.intro.p1": "Descrybe(「当社」「私たち」)は、お客様のプライバシーを尊重し、個人情報の保護に努めています。本プライバシーポリシーは、お客様が Descrybe の商品データプラットフォームおよび関連サービス(総称して「本サービス」)を利用する際に、当社がお客様の情報をどのように収集、利用、開示、保護するかを説明するものです。", + "legal.privacy.intro.p2": "本サービスにアクセスまたは利用することにより、お客様は本プライバシーポリシーに記載された慣行に同意したものとみなされます。ここに記載された方針および慣行に同意されない場合は、本サービスを利用しないでください。", + "legal.privacy.collect.h": "収集する情報", + "legal.privacy.collect.lead": "当社は、本サービスの利用者から、および利用者に関して、次のような各種情報を収集します。", + "legal.privacy.collect.personal.h": "個人情報", + "legal.privacy.collect.personal.p": "アカウント登録時に、氏名、メールアドレス、電話番号、会社名、請求情報など、お客様を特定しうる情報を収集します。これらの情報は、お客様が当社に提供した際に直接収集します。", + "legal.privacy.collect.userData.h": "ユーザーデータ", + "legal.privacy.collect.userData.p": "本サービスの提供のため、商品データ、サプライヤーフィード、商品説明、およびお客様が当社プラットフォームにアップロード、入力、またはその他の方法で送信するその他のコンテンツを収集および処理します。これには、商品属性、タクソノミー構造、テンプレート、ならびに本サービスの運用に必要なその他のデータが含まれる場合があります。", + "legal.privacy.collect.usage.h": "利用情報", + "legal.privacy.collect.usage.p": "当社は、お客様のデバイスおよび本サービスとのやり取りに関する一定の情報を自動的に収集します。これには、IP アドレス、デバイスタイプ、ブラウザの種類、オペレーティングシステム、アクセス時間、閲覧ページ、使用機能、その他のシステム活動が含まれます。当社はこの情報を、本サービスおよびユーザー体験の向上に使用します。", + "legal.privacy.collect.cookies.h": "Cookie およびトラッキング技術", + "legal.privacy.collect.cookies.p": "当社は、Cookie、ウェブビーコン、および類似のトラッキング技術を使用し、当社ウェブサイト上でのお客様の閲覧活動に関する情報を収集します。ブラウザ設定およびその他のツールにより Cookie を制御できます。ただし、特定の Cookie をブロックすると、本サービスのすべての機能を利用できなくなる場合があります。", + "legal.privacy.use.h": "情報の利用方法", + "legal.privacy.use.lead": "当社は、収集した情報を次のようなさまざまな目的で利用します。", + "legal.privacy.use.li1": "本サービスの提供、維持、および改善", + "legal.privacy.use.li2": "取引の処理、ならびに確認書、請求書、サービス通知を含む関連情報の送信", + "legal.privacy.use.li3": "新製品、サービス、機能、および機能性の開発", + "legal.privacy.use.li4": "お客様の体験のパーソナライズ、およびお客様の関心に関連するコンテンツと機能の提供", + "legal.privacy.use.li5": "お客様の依頼、フィードバック、および質問への対応", + "legal.privacy.use.li6": "技術的なお知らせ、更新情報、セキュリティアラート、ならびにサポートおよび管理メッセージの送信", + "legal.privacy.use.li7": "本サービスに関連する傾向、利用状況、および活動の監視と分析", + "legal.privacy.use.li8": "詐欺的な取引およびその他の違法行為の検出、調査、および防止", + "legal.privacy.use.li9": "当社の権利、財産、および安全、ならびに当社の利用者またはその他の者の権利、財産、および安全の保護", + "legal.privacy.use.li10": "法的義務の履行および当社の利用規約の執行", + "legal.privacy.ai.h": "AI および機械学習", + "legal.privacy.ai.p1": "本サービスは、人工知能および機械学習技術を使用して商品データを処理し、コンテンツを生成し、その他の自動化機能を提供します。お客様が本サービスに提供するデータは、当社の AI モデルの訓練および改善に使用される場合があります。ただし、当社はお客様のデータを保護し、機密性を維持するための適切な安全策を適用します。", + "legal.privacy.ai.p2": "当社は、お客様の明示的な同意なく、個人を特定できる情報を一般的な AI モデルの訓練に使用しません。AI 訓練に使用される商品データは、可能な限り匿名化および集計されます。", + "legal.privacy.share.h": "情報の共有方法", + "legal.privacy.share.lead": "当社は、次の状況においてお客様の情報を共有する場合があります。", + "legal.privacy.share.providers.h": "サービスプロバイダー", + "legal.privacy.share.providers.p": "当社は、決済処理、データ分析、メール送信、ホスティング、カスタマーサポート、マーケティング支援など、当社に代わってサービスを行う第三者のベンダー、サービスプロバイダー、契約業者、または代理人と、お客様の情報を共有する場合があります。", + "legal.privacy.share.transfers.h": "事業譲渡", + "legal.privacy.share.transfers.p": "当社が合併、買収、資金調達、再編、破産、または企業資産の売却に関与する場合、お客様の情報はその取引の一環として移転されることがあります。個人情報の所有権または管理に関するかかる変更については、お客様にお知らせします。", + "legal.privacy.share.legal.h": "法的要件", + "legal.privacy.share.legal.p": "法令により要求される場合、または公的機関(例:裁判所もしくは政府機関)からの有効な要請に応じて、当社はお客様の情報を開示する場合があります。また、当社の利用規約を執行し、当社の権利、プライバシー、安全、または財産、および/または当社の関連会社、利用者、もしくはその他の者の権利、プライバシー、安全、または財産を保護するために、お客様の情報を開示する場合があります。", + "legal.privacy.share.consent.h": "お客様の同意による場合", + "legal.privacy.share.consent.p": "お客様が第三者との共有に同意した場合、当社はお客様の情報を第三者と共有することがあります。", + "legal.privacy.security.h": "データセキュリティ", + "legal.privacy.security.p1": "当社は、お客様の個人情報を偶発的な損失、ならびに不正アクセス、利用、改変、および開示から保護するために設計された適切な技術的・組織的措置を実施しています。お客様が当社に提供するすべての情報は、ファイアウォールの背後にある安全なサーバーに保存されます。", + "legal.privacy.security.p2": "お客様の情報のセキュリティは、お客様ご自身にも依存します。本サービスの特定の部分にアクセスするためのパスワードを当社が提供した場合(またはお客様が選択した場合)、お客様はそのパスワードの機密を保持する責任を負います。パスワードを他者と共有しないようお願いいたします。", + "legal.privacy.security.p3": "残念ながら、インターネットを介した情報の送信は完全に安全ではありません。当社はお客様の個人情報の保護に最善を尽くしますが、本サービスに送信される個人情報の安全性を保証することはできません。個人情報のいかなる送信も、お客様ご自身のリスクで行われます。", + "legal.privacy.rights.h": "お客様の権利と選択肢", + "legal.privacy.rights.lead": "当社は、お客様が当社に提供する個人情報に関して選択肢を提供するよう努めています。お客様の所在地に応じて、個人情報に関する一定の権利を有する場合があります。これには次が含まれます。", + "legal.privacy.rights.li1": "個人情報へのアクセスおよび更新", + "legal.privacy.rights.li2": "個人情報の削除の請求", + "legal.privacy.rights.li3": "個人情報の処理への異議または制限", + "legal.privacy.rights.li4": "データのポータビリティ", + "legal.privacy.rights.li5": "同意の撤回(該当する場合)", + "legal.privacy.rights.footer": "権利を行使するには、本プライバシーポリシー末尾の連絡先情報を使用して当社までご連絡ください。これらの権利の一部は、お客様の所在地および具体的な状況により、制限されるか適用されない場合があることにご留意ください。", + "legal.privacy.retention.h": "データの保持", + "legal.privacy.retention.p1": "当社は、本プライバシーポリシーに記載された目的を達成するために必要な期間、お客様の個人情報を保持します。ただし、法令によりより長い保持期間が要求または許可される場合を除きます。保持期間を決定する際、当社は情報の量、性質、および機微性、不正利用または開示による損害の潜在的リスク、処理の目的、ならびに適用される法的要件を考慮します。", + "legal.privacy.retention.p2": "当社は、法的義務の履行、紛争の解決、および当社の合意の執行などの目的のため、アカウント閉鎖後も一定の情報を保持する場合があります。", + "legal.privacy.intl.h": "国際データ転送", + "legal.privacy.intl.p1": "お客様の個人情報は、お客様の居住国以外の国に転送され、処理される場合があります。これらの国のデータ保護法は、お客様の国の法令と異なる場合があります。", + "legal.privacy.intl.p2": "欧州経済領域または包括的なデータ保護法を有するその他の地域の外の国にお客様の個人情報を転送する場合、当社は個人情報を保護するための適切な安全策が存在すること、および転送が適用されるデータ保護規制に適合することを確保します。", + "legal.privacy.children.h": "未成年者のプライバシー", + "legal.privacy.children.p": "本サービスは 16 歳未満の方を対象としておらず、当社は 16 歳未満の方から故意に個人情報を収集しません。保護者の同意の確認なく 16 歳未満の方から個人情報を収集または受領したことが判明した場合、当社はその情報を削除します。当社が 16 歳未満の方からの、またはその方に関する情報を保有していると思われる場合は、当社までご連絡ください。", + "legal.privacy.changes.h": "プライバシーポリシーの変更", + "legal.privacy.changes.p1": "当社は、随時プライバシーポリシーを更新する場合があります。利用者の個人情報の取扱い方法について実質的な変更を行う場合、アカウントに登録されたメールアドレスへの電子メールおよび/または当社ウェブサイト上の通知によりお知らせします。", + "legal.privacy.changes.p2": "プライバシーポリシーの最終改訂日はページ上部に表示されます。お客様は、当社が最新で有効かつ配達可能なメールアドレスを保持していることを確保し、変更の有無を確認するために当社ウェブサイトおよび本プライバシーポリシーを定期的に訪問する責任を負います。", + "legal.privacy.contact.h": "お問い合わせ", + "legal.privacy.contact.lead": "当社のプライバシーポリシーまたはデータ慣行についてご質問やご懸念がある場合は、次の宛先までご連絡ください。", + "legal.terms.title": "利用規約", + "legal.terms.s1.h": "1. 規約への同意", + "legal.terms.s1.p": "Descrybe の商品データプラットフォームおよび関連サービス(総称して「本サービス」)にアクセスまたは利用することにより、お客様は本利用規約ならびにすべての適用法令に拘束されることに同意したものとみなされます。これらの条件のいずれかに同意されない場合、本サービスの利用またはアクセスは禁止されます。", + "legal.terms.s2.h": "2. 利用ライセンス", + "legal.terms.s2.p1": "本利用規約の遵守を条件として、Descrybe はお客様に対し、事業目的で本サービスにアクセスおよび利用するための限定的、非独占的、譲渡不可、かつ取消可能なライセンスを付与します。", + "legal.terms.s2.lead": "本ライセンスには次は含まれません。", + "legal.terms.s2.li1": "本サービスまたはそのコンテンツの改変もしくは複製", + "legal.terms.s2.li2": "許可された事業利用以外の商業目的での本サービスの利用", + "legal.terms.s2.li3": "本サービスに含まれるソフトウェアの逆コンパイルまたはリバースエンジニアリングの試み", + "legal.terms.s2.li4": "素材からの著作権表示または所有権表示の削除", + "legal.terms.s2.li5": "素材の他者への譲渡、または他のサーバー上での素材の「ミラーリング」", + "legal.terms.s2.p2": "本ライセンスは、これらの制限のいずれかに違反した場合に自動的に終了し、Descrybe はいつでも終了させることができます。", + "legal.terms.s3.h": "3. サブスクリプションおよび支払い", + "legal.terms.s3.p1": "本サービスへのアクセスには有料サブスクリプションが必要な場合があります。支払い条件はサブスクリプション手続き中に明示されます。すべての支払いは、Descrybe が書面で別途指定しない限り、返金不可です。", + "legal.terms.s3.p2": "Descrybe は、合理的な事前通知をもってサブスクリプション料金を変更する権利を留保します。料金変更後の本サービスの継続利用は、新しい料金への同意を構成します。", + "legal.terms.s4.h": "4. ユーザーコンテンツ", + "legal.terms.s4.p1": "お客様は、本サービス上または本サービスを通じて送信、投稿、または表示する一切のコンテンツ(「ユーザーコンテンツ」)に関するすべての権利を保持します。Descrybe にユーザーコンテンツを提供することにより、お客様は Descrybe に対し、本サービスの提供に関連して当該コンテンツを使用、複製、改変、翻案、公開、翻訳、および配信するための世界的、非独占的、かつロイヤリティフリーのライセンスを付与します。", + "legal.terms.s4.lead": "お客様は次を表明し保証します。", + "legal.terms.s4.li1": "提供するユーザーコンテンツに関するすべての権利を所有または管理していること", + "legal.terms.s4.li2": "ユーザーコンテンツが本利用規約に違反しないこと", + "legal.terms.s4.li3": "ユーザーコンテンツがいかなる個人または事業体にも損害を与えないこと", + "legal.terms.s5.h": "5. 人工知能", + "legal.terms.s5.p1": "本サービスは、人工知能および機械学習技術を使用します。お客様は、AI により生成されたコンテンツが完璧ではない場合があることを認識し、事業運営で使用する前にすべての AI 生成コンテンツを確認することに同意します。", + "legal.terms.s5.p2": "Descrybe は、当社のプライバシーポリシーに従い、匿名化および集計されたユーザーコンテンツを当社の AI モデルの訓練および改善に使用する場合があります。AI 訓練へのデータの使用を希望されない場合は、当社にご連絡ください。", + "legal.terms.s6.h": "6. 知的財産", + "legal.terms.s6.p": "本サービスおよびそのオリジナルのコンテンツ、機能、および機能性は Descrybe の所有物であり、国際的な著作権、商標、特許、営業秘密、およびその他の知的財産権または所有権に関する法令により保護されています。", + "legal.terms.s7.h": "7. 保証の否認", + "legal.terms.s7.p1": "本サービスは「現状有姿」および「提供可能な状態」で提供されます。Descrybe は、明示または黙示を問わずいかなる保証も行わず、商品性、特定目的適合性、非侵害、または履行過程に関する黙示の保証を含む(これらに限定されない)すべての保証をここに否認します。", + "legal.terms.s7.p2": "Descrybe は、本サービスが中断なく、安全に、または特定の時間もしくは場所で利用可能であること、あるいはエラーまたは欠陥が修正されることを保証しません。", + "legal.terms.s8.h": "8. 責任の制限", + "legal.terms.s8.lead": "いかなる場合も、Descrybe は、間接的、付随的、特別、結果的、または懲罰的損害(利益、データ、利用、のれんの喪失、またはその他の無形の損失を含むがこれらに限定されない)について、次に起因する場合であっても責任を負いません。", + "legal.terms.s8.li1": "本サービスへのアクセスもしくは利用、またはアクセスもしくは利用ができないこと", + "legal.terms.s8.li2": "本サービス上の第三者の行為またはコンテンツ", + "legal.terms.s8.li3": "本サービスから取得したコンテンツ", + "legal.terms.s8.li4": "お客様の送信またはコンテンツへの不正アクセス、利用、または改変", + "legal.terms.s9.h": "9. 終了", + "legal.terms.s9.p1": "Descrybe は、本利用規約に違反した場合を含む(これに限定されない)いかなる理由でも、事前の通知または責任なく、お客様の本サービスへのアクセスを直ちに終了または停止することができます。", + "legal.terms.s9.p2": "終了後、本サービスを利用するお客様の権利は直ちに消滅します。アカウントを終了したい場合は、本サービスの利用を中止するか、アカウント削除を依頼するため当社にご連絡ください。", + "legal.terms.s10.h": "10. 準拠法", + "legal.terms.s10.p": "本規約は、法の抵触に関する原則を考慮することなく、スロベニアの法令に準拠し、同法令に従って解釈されるものとします。", + "legal.terms.s11.h": "11. 規約の変更", + "legal.terms.s11.p": "Descrybe は、いつでも本利用規約を変更または差し替える権利を留保します。変更の有無について本規約を定期的に確認することはお客様の責任です。変更の掲載後に本サービスを継続して利用することは、当該変更への同意を構成します。", + "legal.terms.s12.h": "12. お問い合わせ", + "legal.terms.s12.lead": "本利用規約についてご質問がある場合は、次の宛先までご連絡ください。", + "plans.loadFailed": "プランを読み込めませんでした", + "plans.loading": "プランを読み込み中…", + "plans.apiUnavailable": "このバックエンドではプラン API がまだ利用できません。公開料金比較を表示しています。", + "plans.title": "プランを選択", + "plans.sub.onPrefix": "現在のプラン:", + "plans.sub.enterpriseSuffix": "— 商品と AI は無制限。セルフサービスでのアップグレードは不要です。", + "plans.sub.paygSuffix": "— 従量課金。以下の公開プランを比較するか、Enterprise については営業にお問い合わせください。", + "plans.sub.creditsMid": "(残り AI クレジット {remaining})。", + "plans.sub.creditsSuffix": "Checkout で Starter → Growth → Business にアップグレードするか、Enterprise については営業にお問い合わせください。", + "plans.sub.none": "まだプランが割り当てられていません(例:スキップされた移行後)。下からプランを選択してください — Checkout または管理者が割り当てるまで、容量は無制限ではありません。", + "plans.stripeHint": "セルフサービスのアップグレードは Stripe Checkout を使用します。", + "plans.checkoutUnavailable": "Stripe の設定が完了するまでセルフサービス Checkout は利用できません。プランについては営業にお問い合わせください。", + "plans.fallbackName": "プラン", + "plans.fallbackDescription": "カタログ向けの容量", + "plans.badge.current": "現在", + "plans.badge.popular": "人気", + "plans.price.custom": "カスタム", + "plans.price.forever": "永久", + "plans.price.perMonth": "/月", + "plans.price.seePricing": "料金を見る", + "plans.capacity.unlimitedSkus": "無制限の SKU", + "plans.capacity.unlimitedAi": "無制限の AI クレジット", + "plans.capacity.upToProducts": "最大 {count} 商品", + "plans.capacity.creditsPerMonth": "月あたり AI クレジット {count}", + "plans.cta.requestUpgrade": "アップグレードを依頼", + "plans.cta.current": "現在のプラン", + "plans.cta.contactSales": "営業に問い合わせ", + "plans.cta.switchInBilling": "請求で切り替え", + "plans.cta.upgradeTo": "{name} にアップグレード", + "plans.cta.startingCheckout": "Checkout を開始中…", + "plans.planApplied": "プラン {plan} を適用しました。クレジットの準備ができました。", + "plans.faq.title": "よくある質問", + "plans.faq.limit.q": "上限に達するとどうなりますか?", + "plans.faq.limit.a": "まずソフトな警告が表示されます。AI クレジットがなくなるか SKU 上限に達すると、その容量を必要とするジョブは、空きを確保するか、次のサイクルを待つか、プランをアップグレードするまでブロックされます。", + "plans.faq.selfServe.q": "自分でプランをアップグレードできますか?", + "plans.faq.selfServe.a": "会社の管理者は、プランカードの Checkout から Starter、Growth、Business をセルフサービスで契約できます。メンバーは管理者に依頼する必要があります — Checkout には管理者ロールが必要です。Enterprise は常に営業経由です。プラットフォーム管理者は引き続き Billing Admin でプランを割り当てできます。", + "plans.faq.enterprise.q": "Enterprise と数百万の SKU", + "plans.faq.enterprise.a": "カスタム容量、独自 AI キー(BYOK)、SLA、アカウント管理は営業経由です。Calendly で時間を予約してください — 数百万 SKU 規模では Enterprise はセルフサービスではありません。アプリでは SKU および AI 容量を無制限と表示します。", + "plans.faq.pricing.q": "公開料金はどこにありますか?", + "plans.faq.pricing.aBefore": "マーケティング比較は", + "plans.faq.pricing.pricingPage": "料金ページ", + "plans.faq.pricing.aMid": "でご確認ください — CTA は開始(登録)または営業に問い合わせです。利用状況はいつでも", + "plans.faq.pricing.aAfter": "で管理できます。", + "plans.custom.title": "カスタムプランが必要ですか?", + "plans.custom.body": "Enterprise の容量、独自 AI キー、および SLA は当社チームが対応します。", + "plans.custom.looking": "公開プランの詳細をお探しですか?", + "ai.title": "AI連携", + "ai.description": "プラットフォームのクレジットか独自キーを選び、変数でプロンプトをカスタマイズします。", + "ai.crumb": "AI連携", + "ai.adminOnly": "AI設定を変更できるのは会社の管理者のみです。現在の設定は閲覧できます。", + "ai.badge.ownKey": "独自キー", + "ai.badge.platform": "プラットフォームのクレジット / キー", + "ai.badge.active": "有効: {label}", + "ai.badge.platformKeyAvailable": "プラットフォームキー利用可", + "ai.badge.lastTest": "最終テスト: {status}", + "ai.providerMode.title": "プロバイダーモード", + "ai.providerMode.desc": "プラットフォームは Descrybe のクレジットと当社キーを使用します。人気またはカスタムは、ご自身の OpenAI 互換キーを使用します(プロバイダー呼び出し自体はプラットフォームクレジットを消費しません。機能クレジットのルールは引き続き適用されます)。", + "ai.whoPays": "モデル料金の負担者は?", + "ai.mode.internal": "プラットフォーム(Descrybe クレジット / キー)", + "ai.mode.popular": "独自キー — 人気プロバイダー", + "ai.mode.custom": "独自キー — カスタムエンドポイント", + "ai.useCompanyKey": "処理・SEO AI・キャンペーン AI にこの会社キーを使う", + "ai.popular.title": "人気プロバイダー", + "ai.popular.desc": "OpenAI 互換エンドポイント。Anthropic は OpenRouter 経由。", + "ai.field.provider": "プロバイダー", + "ai.field.model": "モデル", + "ai.placeholder.modelId": "モデル ID", + "ai.baseUrlLabel": "ベース URL: {url}", + "ai.custom.title": "カスタムエンドポイント", + "ai.custom.desc": "AI プロバイダーの HTTPS ベース URL を入力してください。", + "ai.field.baseUrl": "ベース URL", + "ai.apiKey.title": "API キー", + "ai.apiKey.desc": "既存キーを維持する場合は空のままにしてください。生のシークレットは返されず、マスクされた last4 のみです。", + "ai.storedKey": "保存済みキー: {masked}", + "ai.field.apiKey": "API キー", + "ai.placeholder.keepKey": "•••• 空欄で維持", + "ai.clearStoredKey": "保存済み API キーを削除", + "ai.saveProvider": "プロバイダーを保存", + "ai.testConnection": "接続をテスト", + "ai.prompts.title": "プロンプトテンプレート", + "ai.prompts.descBefore": "商品コピー、SEO メタ、キャンペーンメール用のシステム/ユーザープロンプトをカスタマイズします。次のような変数を挿入できます", + "ai.prompts.descMid": "— 実行時に埋め込まれます。ブランドキットの声は次として利用できます", + "ai.prompts.descAfter": "。", + "ai.field.feature": "機能", + "ai.badge.custom": "カスタム", + "ai.badge.builtin": "組み込みデフォルト", + "ai.badge.disabledDefault": "無効 → デフォルトを使用", + "ai.useCustomPrompt": "このカスタムプロンプトを使う(オフ = 組み込みデフォルト)", + "ai.insertVariableInto": "変数の挿入先", + "ai.insert.system": "システム", + "ai.insert.user": "ユーザー", + "ai.field.systemPrompt": "システムプロンプト", + "ai.field.userPrompt": "ユーザープロンプト", + "ai.savePrompts": "プロンプトを保存", + "ai.resetDefault": "デフォルトに戻す", + "ai.editBrandVoice": "ブランドボイスを編集", + "ai.flash.loadFailed": "AI 設定の読み込みに失敗しました", + "ai.flash.usingPlatform": "プラットフォーム AI を使用中(設定済みの Descrybe クレジット / キー)。", + "ai.flash.providerSaved": "AI プロバイダーを保存しました。キーは暗号化され、以後は表示されません。", + "ai.flash.saveFailed": "保存できませんでした", + "ai.flash.savePromptsFailed": "プロンプトを保存できませんでした", + "ai.flash.resetFailed": "プロンプトをリセットできませんでした", + "ai.flash.connectionFailed": "接続に失敗しました", + "ai.flash.testFailed": "テストに失敗しました", + "ai.action.changeSettings": "AI プロバイダー設定を変更する", + "ai.action.changePrompts": "AI プロンプトを変更する", + "ai.action.testProvider": "AI プロバイダーをテストする", + "email.title": "メール送信", + "email.description": "マーケティングキャンペーン向けの Resend または SMTP。シークレットは保管時に暗号化されます。", + "email.adminOnly": "メールプロバイダー設定を変更できるのは会社の管理者のみです。現在の設定は閲覧できます。", + "email.crumb": "メール連携", + "email.dryRunForced": "ドライランが強制されています({reason})。Free プランと EMAIL_DRY_RUN では実際の一斉送信は行われません。", + "email.dryRunPolicy": "ポリシー", + "email.badge.verified": "検証済み", + "email.badge.notVerified": "未検証", + "email.badge.canSendReal": "実送信可能", + "email.badge.realBlocked": "実送信ブロック中", + "email.badge.lastTest": "最終テスト: {status}", + "email.provider.title": "プロバイダー", + "email.provider.desc": "会社ごとの設定。プラットフォームの SMTP/Resend 環境は、シークレット欠落時のフォールバックのみです。", + "email.field.provider": "プロバイダー", "email.provider.resend": "Resend", "email.provider.smtp": "SMTP", - "email.field.fromEmail": "送信元メール", - "email.field.domain": "ドメイン", - "email.field.from": "差出人", - "email.field.fromName": "送信者名", + "email.field.fromEmail": "送信元メール", + "email.field.domain": "ドメイン", + "email.field.from": "差出人", + "email.field.fromName": "送信者名", "email.field.replyTo": "Reply-To", - "email.resendKeySaved": "Resend API キー(保存済み — 空欄で維持)", - "email.resendKey": "Resend API キー", - "email.field.smtpHost": "SMTP ホスト", - "email.field.port": "ポート", - "email.field.username": "ユーザー名", - "email.field.passwordSaved": "パスワード(保存済み)", - "email.field.password": "パスワード", - "email.verifyDomain": "ドメインを検証", - "email.testGate.title": "テストと一斉送信ゲート", - "email.testGate.desc": "テスト送信で送信元アドレスを確認します。実際の一斉送信には “I understand” の入力が必要です。", - "email.field.recipient": "受信者", - "email.sendTest": "テスト送信", - "email.confirmBlast": "一斉送信を確認…", - "email.flash.loadFailed": "メール設定の読み込みに失敗しました", - "email.flash.saveFailed": "保存できませんでした", - "email.flash.verifyUpdated": "検証を更新しました。", - "email.flash.verifyFailed": "検証に失敗しました", - "email.flash.testFailed": "テスト送信に失敗しました", - "email.flash.blastDryRun": "ドライランモードで配信チェックを記録しました — メールは送信されていません。", - "email.flash.blastDone": "配信チェック完了: {sent} 件送信、{failed} 件失敗。", - "email.flash.blastFailed": "一斉送信に失敗しました", - "email.blast.subject": "Descrybe メール配信チェック", - "email.blast.body": "これは Descrybe からの単一アドレス配信チェックで、メール連携が送信できることを確認します。受信者: {recipient}", - "email.action.changeSettings": "メールプロバイダー設定を変更する", - "email.action.verifyDomain": "メールドメインを検証する", - "email.action.sendTest": "テストメールを送信する", - "email.action.sendBlasts": "メール一斉送信を行う", - "seo.title": "SEO 推奨事項", - "seo.description": "カタログのメタ、タイトル、画像、キーワード向けのチェックリストスコア。テンプレート入力は無料、AI 書き換えは有料です。", - "seo.upgradeTitle": "AI 書き換えは有料機能です", - "seo.upgradeMessage": "Free プランでもルールベースのテンプレートで不足メタを修正できます。AI 書き換えを使うにはアップグレードするかクレジットを追加してください。", - "seo.comparePlans": "プランを比較", - "seo.openProducts": "商品を開く", - "seo.overallScore": "総合 SEO スコア", - "seo.overallScoreHint": "チェックリスト項目の平均", - "seo.productsScanned": "スキャンした商品", - "seo.productsScannedHint": "会社内で処理済みの商品", - "seo.categoriesScanned": "スキャンしたカテゴリ", - "seo.categoriesScannedHint": "メタ数式チェックを含む", - "seo.aiRewrite": "AI 書き換え", - "seo.available": "利用可", - "seo.gated": "制限中", - "seo.templateFree": "テンプレート入力は全プランで無料のままです", - "seo.checklist": "チェックリスト", - "seo.affectedFindings": "{affected} 件影響 · {count} 件の検出", - "seo.fixable": "修正可能", - "seo.clearFilter": "フィルターをクリア", - "seo.findings": "検出結果", - "seo.noFindings": "このフィルターの検出はありません — よくできました。", - "seo.col.issue": "問題", - "seo.col.entity": "エンティティ", - "seo.col.severity": "重要度", - "seo.col.actions": "操作", - "seo.filling": "入力中…", - "seo.templateFill": "テンプレート入力", - "seo.aiTitleAllowed": "AI で書き換える(クレジットを使用)", - "seo.aiTitleGated": "有料プランまたはクレジットが必要", - "seo.rewriting": "書き換え中…", - "seo.aiRewriteBtn": "AI 書き換え", - "seo.viewProduct": "商品を表示", - "seo.flash.loadFailed": "SEO 推奨事項の読み込みに失敗しました", - "seo.flash.aiPaid": "AI 書き換えには有料プランまたはクレジットが必要です。", - "seo.flash.applyFailed": "修正の適用に失敗しました", - "brand.title": "ブランドキット", - "brand.description": "声、ガイドライン、色を定義し、商品タイトルと説明をブランドに沿ったままにします。", - "brand.loading": "ブランドキットを読み込み中…", - "brand.adminOnly": "ブランドキットを編集できるのは会社の管理者のみです。現在の声、色、ロゴは閲覧できます。", - "brand.aiApplyFreeAdmin": "Free でもブランドキットは編集できます。AI 適用(enhance プロンプトへのブランドボイス注入)は Starter 以上で解除されます。", - "brand.aiApplyGated": "AI 適用(enhance プロンプトへのブランドボイス注入)は Starter 以上で解除されます。", - "brand.aiEnhanceUses": "AI enhance は商品処理時にこのブランドボイスを使用します。", - "brand.comparePlans": "プランを比較", - "brand.voice.title": "声とガイドライン", - "brand.voice.desc": "トーン、やる/やらない規則、推奨表現", - "brand.field.voiceTone": "声 / トーン", - "brand.placeholder.voiceTone": "例: 自信があり、簡潔、技術的だが親しみやすい", - "brand.field.dos": "やるべきこと(1行に1つ)", - "brand.placeholder.dos": "主な利点から始める\nタイトルは80文字未満に保つ", - "brand.field.donts": "やってはいけないこと(1行に1つ)", - "brand.placeholder.donts": "すべて大文字は使わない\n根拠のない最上級表現を避ける", - "brand.field.preferredTerms": "推奨用語(1行に1つ、またはカンマ区切り)", - "brand.placeholder.preferredTerms": "ワイヤレス、プレミアム、エネルギークラス", - "brand.visual.title": "ビジュアルアイデンティティ", - "brand.visual.desc": "ブランド対応のヒントとキャンペーンで使う色とロゴ", - "brand.field.primaryColor": "プライマリカラー", - "brand.field.secondaryColor": "セカンダリカラー", - "brand.field.logoImage": "ロゴ画像", - "brand.logoHint": "PNG、JPEG、または WebP(最大 2 MiB)。会社のアップロード領域に保存されます。", - "brand.uploading": "アップロード中…", - "brand.uploadLogo": "ロゴをアップロード", - "brand.clear": "クリア", - "brand.field.logoUrl": "ロゴ URL", - "brand.placeholder.logoUrl": "https://… またはアップロード済み /api/brand/logo/files/…", - "brand.logoAlt": "ブランドロゴのプレビュー", - "brand.tipsTitle": "数式 / プレビューのヒント", - "brand.saving": "保存中…", - "brand.save": "ブランドキットを保存", - "brand.flash.loadFailed": "ブランドキットの読み込みに失敗しました", - "structured.title": "構造化説明フィールド", - "structured.loading": "構造化説明フィールドを読み込み中…", - "structured.backDashboard": "ダッシュボードに戻る", - "structured.categoryFormulas": "カテゴリ数式", - "structured.exportFeeds": "エクスポートフィード", - "structured.intro": "これらのフィールドは、説明数式のセクションに Export IDs を追加すると自動作成されます。エクスポートフィードで商品説明の特定部分を含めるために使えます。", - "structured.addField": "フィールドを追加", - "structured.openCategories": "カテゴリを開く", - "structured.tableCaption": "これらのフィールドは、エクスポート用に商品説明の一部を構造化するために使われます。", - "structured.col.fieldKey": "フィールドキー", - "structured.col.type": "タイプ", - "structured.col.created": "作成日", - "structured.col.actions": "操作", - "structured.dialogTitle": "構造化説明フィールドを追加", - "structured.fieldKeyLabel": "フィールドキー(必須)", - "structured.fieldKeyPlaceholder": "例: features, specifications", - "structured.fieldTypeLabel": "フィールドタイプ", - "structured.type.text": "テキスト", - "structured.type.number": "数値", - "structured.type.boolean": "真偽値", - "structured.type.list": "リスト", - "structured.adding": "追加中...", - "structured.flash.loadFailed": "構造化説明フィールドの読み込みに失敗しました", - "assistant.ariaLabel": "システムアシスタント", - "assistant.title": "システムアシスタント", - "assistant.subtitle": "案内、ガイド、対応アクションの実行", - "assistant.resetAria": "会話をリセット", - "assistant.resetTitle": "リセット", - "assistant.closeAria": "アシスタントを閉じる", - "assistant.messageLabel": "メッセージ", - "assistant.placeholder": "例: フィード URL、API キー、属性、処理を追加…", - "assistant.sendAria": "送信", - "site.bookDemo": "デモを予約", - "site.demoShort": "デモ", - "site.allRightsReserved": "全著作権所有。", - "site.cookiePolicy": "Cookieポリシー", - "site.cookieSettings": "Cookie設定", - "consent.title": "Cookieと分析", - "consent.description": "Descrybeの動作に必要なCookieを使用します。任意の分析・マーケティングCookieは利用状況の把握とキャンペーン測定に役立ちます。選択はいつでも変更できます。", - "consent.acceptAll": "すべて許可", - "consent.rejectNonEssential": "必須以外を拒否", - "consent.customize": "カスタマイズ", - "consent.save": "設定を保存", - "consent.necessary": "必須", - "consent.necessaryDesc": "ログイン、セキュリティ(CSRF)、テーマ、言語、この選択の保存に必要です。", - "consent.alwaysOn": "常にオン", - "consent.analytics": "分析", - "consent.analyticsDesc": "製品の利用状況の把握に役立ちます(GTM経由のGoogle Analytics)。", - "consent.marketing": "マーケティング", - "consent.marketingDesc": "GTMに広告タグがある場合の広告測定・パーソナライズに使用します。", - "consent.policyLink": "Cookieポリシーを読む", - "seo.cookies.title": "Cookieポリシー | Descrybe", - "seo.cookies.description": "Descrybeが必須・分析・マーケティングCookie(GTM/GA4を含む)をどう使うか、同意の変更方法について。", - "legal.cookies.title": "Cookieポリシー", - "legal.cookies.intro.h": "概要", - "legal.cookies.intro.p1": "本Cookieポリシーは、ウェブサイトおよびアプリでDescrybeがCookie等をどのように使用するかを説明します。プライバシーポリシーとあわせてお読みください。", - "legal.cookies.intro.p2": "必要な場合、分析またはマーケティングCookieを有効にする前に同意を求めます。必須Cookieはサービスを安全に提供するためのもので、同意は不要です。", - "legal.cookies.types.h": "Cookieの区分", - "legal.cookies.necessary.h": "必須", - "legal.cookies.necessary.p": "ログイン維持、CSRFによるフォーム保護、テーマ・言語の保存、Cookie選択の記憶に使います。これらがないと製品は正しく動作しません。", - "legal.cookies.analytics.h": "分析", - "legal.cookies.analytics.p": "分析を許可すると、ページビューや製品イベント測定のためGA4 Cookieを設定し得るGTMタグを読み込みます。analytics_storageが許可されるまでイベントは送信されません。", - "legal.cookies.marketing.h": "マーケティング", - "legal.cookies.marketing.p": "マーケティングを許可すると、GTM内の広告タグが広告ストレージ等をキャンペーン測定・パーソナライズに使う場合があります。", - "legal.cookies.gtm.h": "GoogleタグマネージャとGA4", - "legal.cookies.gtm.p": "設定されている場合、DescrybeはGTMコンテナを読み込みます。GA4はそのコンテナ内で設定します。Consent Mode v2は、カテゴリを許可するまで分析・広告ストレージを既定で拒否します。", - "legal.cookies.third.h": "第三者", - "legal.cookies.third.p": "同意がある場合、Google(タグマネージャ/Analytics)はページURL、端末・ブラウザ情報、イベント名などの技術データを処理する場合があります。パスワード、APIキー、連絡先を分析イベントに意図的に送りません。", - "legal.cookies.manage.h": "同意の変更方法", - "legal.cookies.manage.p": "フッターのCookie設定(または下のボタン)でバナーを再度開けます。ブラウザでサイトデータを削除することもできます。", - "site.privacyPolicy": "プライバシーポリシー", - "site.termsOfService": "利用規約", - "site.legalNav": "法務", - "site.footer.aria": "サイト", - "site.footer.description": "Descrybeはサプライヤーフィードを、チャネル向けに整った商品カタログへ変換します。フィールドをマッピングし、属性と掲載文を充実させてから、エクスポートまたはWooCommerceへ同期します。", - "site.footer.rightsLine": "© {year} {name}. 無断転載を禁じます。", - "site.footer.navTitle": "ナビゲーション", - "site.footer.platform": "プラットフォーム", - "site.footer.solutions": "ソリューション", - "site.footer.contact": "お問い合わせ", - "home.hero.tagline": "ECチームのための商品データ", - "home.hero.title": "サプライヤーフィードから商品ページへ", - "home.hero.lead": "サプライヤーフィードを接続し、カテゴリへマッピング、必須属性を埋め、ルールに沿ったタイトルと説明文を作成。その後、ストアへエクスポートまたは同期します。", - "home.hero.learnMore": "詳しく見る", - "home.hero.apply": "アクセスを申請", - "home.hero.supportedBy": "サポート", + "email.resendKeySaved": "Resend API キー(保存済み — 空欄で維持)", + "email.resendKey": "Resend API キー", + "email.field.smtpHost": "SMTP ホスト", + "email.field.port": "ポート", + "email.field.username": "ユーザー名", + "email.field.passwordSaved": "パスワード(保存済み)", + "email.field.password": "パスワード", + "email.verifyDomain": "ドメインを検証", + "email.testGate.title": "テストと一斉送信ゲート", + "email.testGate.desc": "テスト送信で送信元アドレスを確認します。実際の一斉送信には “I understand” の入力が必要です。", + "email.field.recipient": "受信者", + "email.sendTest": "テスト送信", + "email.confirmBlast": "一斉送信を確認…", + "email.flash.loadFailed": "メール設定の読み込みに失敗しました", + "email.flash.saveFailed": "保存できませんでした", + "email.flash.verifyUpdated": "検証を更新しました。", + "email.flash.verifyFailed": "検証に失敗しました", + "email.flash.testFailed": "テスト送信に失敗しました", + "email.flash.blastDryRun": "ドライランモードで配信チェックを記録しました — メールは送信されていません。", + "email.flash.blastDone": "配信チェック完了: {sent} 件送信、{failed} 件失敗。", + "email.flash.blastFailed": "一斉送信に失敗しました", + "email.blast.subject": "Descrybe メール配信チェック", + "email.blast.body": "これは Descrybe からの単一アドレス配信チェックで、メール連携が送信できることを確認します。受信者: {recipient}", + "email.action.changeSettings": "メールプロバイダー設定を変更する", + "email.action.verifyDomain": "メールドメインを検証する", + "email.action.sendTest": "テストメールを送信する", + "email.action.sendBlasts": "メール一斉送信を行う", + "seo.title": "SEO 推奨事項", + "seo.description": "カタログのメタ、タイトル、画像、キーワード向けのチェックリストスコア。テンプレート入力は無料、AI 書き換えは有料です。", + "seo.upgradeTitle": "AI 書き換えは有料機能です", + "seo.upgradeMessage": "Free プランでもルールベースのテンプレートで不足メタを修正できます。AI 書き換えを使うにはアップグレードするかクレジットを追加してください。", + "seo.comparePlans": "プランを比較", + "seo.openProducts": "商品を開く", + "seo.overallScore": "総合 SEO スコア", + "seo.overallScoreHint": "チェックリスト項目の平均", + "seo.productsScanned": "スキャンした商品", + "seo.productsScannedHint": "会社内で処理済みの商品", + "seo.categoriesScanned": "スキャンしたカテゴリ", + "seo.categoriesScannedHint": "メタ数式チェックを含む", + "seo.aiRewrite": "AI 書き換え", + "seo.available": "利用可", + "seo.gated": "制限中", + "seo.templateFree": "テンプレート入力は全プランで無料のままです", + "seo.checklist": "チェックリスト", + "seo.affectedFindings": "{affected} 件影響 · {count} 件の検出", + "seo.fixable": "修正可能", + "seo.clearFilter": "フィルターをクリア", + "seo.findings": "検出結果", + "seo.noFindings": "このフィルターの検出はありません — よくできました。", + "seo.col.issue": "問題", + "seo.col.entity": "エンティティ", + "seo.col.severity": "重要度", + "seo.col.actions": "操作", + "seo.filling": "入力中…", + "seo.templateFill": "テンプレート入力", + "seo.aiTitleAllowed": "AI で書き換える(クレジットを使用)", + "seo.aiTitleGated": "有料プランまたはクレジットが必要", + "seo.rewriting": "書き換え中…", + "seo.aiRewriteBtn": "AI 書き換え", + "seo.viewProduct": "商品を表示", + "seo.flash.loadFailed": "SEO 推奨事項の読み込みに失敗しました", + "seo.flash.aiPaid": "AI 書き換えには有料プランまたはクレジットが必要です。", + "seo.flash.applyFailed": "修正の適用に失敗しました", + "brand.title": "ブランドキット", + "brand.description": "声、ガイドライン、色を定義し、商品タイトルと説明をブランドに沿ったままにします。", + "brand.loading": "ブランドキットを読み込み中…", + "brand.adminOnly": "ブランドキットを編集できるのは会社の管理者のみです。現在の声、色、ロゴは閲覧できます。", + "brand.aiApplyFreeAdmin": "Free でもブランドキットは編集できます。AI 適用(enhance プロンプトへのブランドボイス注入)は Starter 以上で解除されます。", + "brand.aiApplyGated": "AI 適用(enhance プロンプトへのブランドボイス注入)は Starter 以上で解除されます。", + "brand.aiEnhanceUses": "AI enhance は商品処理時にこのブランドボイスを使用します。", + "brand.comparePlans": "プランを比較", + "brand.voice.title": "声とガイドライン", + "brand.voice.desc": "トーン、やる/やらない規則、推奨表現", + "brand.field.voiceTone": "声 / トーン", + "brand.placeholder.voiceTone": "例: 自信があり、簡潔、技術的だが親しみやすい", + "brand.field.dos": "やるべきこと(1行に1つ)", + "brand.placeholder.dos": "主な利点から始める\nタイトルは80文字未満に保つ", + "brand.field.donts": "やってはいけないこと(1行に1つ)", + "brand.placeholder.donts": "すべて大文字は使わない\n根拠のない最上級表現を避ける", + "brand.field.preferredTerms": "推奨用語(1行に1つ、またはカンマ区切り)", + "brand.placeholder.preferredTerms": "ワイヤレス、プレミアム、エネルギークラス", + "brand.visual.title": "ビジュアルアイデンティティ", + "brand.visual.desc": "ブランド対応のヒントとキャンペーンで使う色とロゴ", + "brand.field.primaryColor": "プライマリカラー", + "brand.field.secondaryColor": "セカンダリカラー", + "brand.field.logoImage": "ロゴ画像", + "brand.logoHint": "PNG、JPEG、または WebP(最大 2 MiB)。会社のアップロード領域に保存されます。", + "brand.uploading": "アップロード中…", + "brand.uploadLogo": "ロゴをアップロード", + "brand.clear": "クリア", + "brand.field.logoUrl": "ロゴ URL", + "brand.placeholder.logoUrl": "https://… またはアップロード済み /api/brand/logo/files/…", + "brand.logoAlt": "ブランドロゴのプレビュー", + "brand.tipsTitle": "数式 / プレビューのヒント", + "brand.saving": "保存中…", + "brand.save": "ブランドキットを保存", + "brand.flash.loadFailed": "ブランドキットの読み込みに失敗しました", + "structured.title": "構造化説明フィールド", + "structured.loading": "構造化説明フィールドを読み込み中…", + "structured.backDashboard": "ダッシュボードに戻る", + "structured.categoryFormulas": "カテゴリ数式", + "structured.exportFeeds": "エクスポートフィード", + "structured.intro": "これらのフィールドは、説明数式のセクションに Export IDs を追加すると自動作成されます。エクスポートフィードで商品説明の特定部分を含めるために使えます。", + "structured.addField": "フィールドを追加", + "structured.openCategories": "カテゴリを開く", + "structured.tableCaption": "これらのフィールドは、エクスポート用に商品説明の一部を構造化するために使われます。", + "structured.col.fieldKey": "フィールドキー", + "structured.col.type": "タイプ", + "structured.col.created": "作成日", + "structured.col.actions": "操作", + "structured.dialogTitle": "構造化説明フィールドを追加", + "structured.fieldKeyLabel": "フィールドキー(必須)", + "structured.fieldKeyPlaceholder": "例: features, specifications", + "structured.fieldTypeLabel": "フィールドタイプ", + "structured.type.text": "テキスト", + "structured.type.number": "数値", + "structured.type.boolean": "真偽値", + "structured.type.list": "リスト", + "structured.adding": "追加中...", + "structured.flash.loadFailed": "構造化説明フィールドの読み込みに失敗しました", + "assistant.ariaLabel": "システムアシスタント", + "assistant.title": "システムアシスタント", + "assistant.subtitle": "案内、ガイド、対応アクションの実行", + "assistant.resetAria": "会話をリセット", + "assistant.resetTitle": "リセット", + "assistant.closeAria": "アシスタントを閉じる", + "assistant.messageLabel": "メッセージ", + "assistant.placeholder": "例: フィード URL、API キー、属性、処理を追加…", + "assistant.sendAria": "送信", + "site.bookDemo": "デモを予約", + "site.demoShort": "デモ", + "site.allRightsReserved": "全著作権所有。", + "site.cookiePolicy": "Cookieポリシー", + "site.cookieSettings": "Cookie設定", + "consent.title": "Cookieと分析", + "consent.description": "Descrybeの動作に必要なCookieを使用します。任意の分析・マーケティングCookieは利用状況の把握とキャンペーン測定に役立ちます。選択はいつでも変更できます。", + "consent.acceptAll": "すべて許可", + "consent.rejectNonEssential": "必須以外を拒否", + "consent.customize": "カスタマイズ", + "consent.save": "設定を保存", + "consent.necessary": "å¿…é ˆ", + "consent.necessaryDesc": "ログイン、セキュリティ(CSRF)、テーマ、言語、この選択の保存に必要です。", + "consent.alwaysOn": "常にオン", + "consent.analytics": "分析", + "consent.analyticsDesc": "製品の利用状況の把握に役立ちます(GTM経由のGoogle Analytics)。", + "consent.marketing": "マーケティング", + "consent.marketingDesc": "GTMに広告タグがある場合の広告測定・パーソナライズに使用します。", + "consent.policyLink": "Cookieポリシーを読む", + "seo.cookies.title": "Cookieポリシー | Descrybe", + "seo.cookies.description": "Descrybeが必須・分析・マーケティングCookie(GTM/GA4を含む)をどう使うか、同意の変更方法について。", + "legal.cookies.title": "Cookieポリシー", + "legal.cookies.intro.h": "概要", + "legal.cookies.intro.p1": "本Cookieポリシーは、ウェブサイトおよびアプリでDescrybeがCookie等をどのように使用するかを説明します。プライバシーポリシーとあわせてお読みください。", + "legal.cookies.intro.p2": "必要な場合、分析またはマーケティングCookieを有効にする前に同意を求めます。必須Cookieはサービスを安全に提供するためのもので、同意は不要です。", + "legal.cookies.types.h": "Cookieの区分", + "legal.cookies.necessary.h": "å¿…é ˆ", + "legal.cookies.necessary.p": "ログイン維持、CSRFによるフォーム保護、テーマ・言語の保存、Cookie選択の記憶に使います。これらがないと製品は正しく動作しません。", + "legal.cookies.analytics.h": "分析", + "legal.cookies.analytics.p": "分析を許可すると、ページビューや製品イベント測定のためGA4 Cookieを設定し得るGTMタグを読み込みます。analytics_storageが許可されるまでイベントは送信されません。", + "legal.cookies.marketing.h": "マーケティング", + "legal.cookies.marketing.p": "マーケティングを許可すると、GTM内の広告タグが広告ストレージ等をキャンペーン測定・パーソナライズに使う場合があります。", + "legal.cookies.gtm.h": "GoogleタグマネージャとGA4", + "legal.cookies.gtm.p": "設定されている場合、DescrybeはGTMコンテナを読み込みます。GA4はそのコンテナ内で設定します。Consent Mode v2は、カテゴリを許可するまで分析・広告ストレージを既定で拒否します。", + "legal.cookies.third.h": "第三者", + "legal.cookies.third.p": "同意がある場合、Google(タグマネージャ/Analytics)はページURL、端末・ブラウザ情報、イベント名などの技術データを処理する場合があります。パスワード、APIキー、連絡先を分析イベントに意図的に送りません。", + "legal.cookies.manage.h": "同意の変更方法", + "legal.cookies.manage.p": "フッターのCookie設定(または下のボタン)でバナーを再度開けます。ブラウザでサイトデータを削除することもできます。", + "site.privacyPolicy": "プライバシーポリシー", + "site.termsOfService": "利用規約", + "site.legalNav": "法務", + "site.footer.aria": "サイト", + "site.footer.description": "Descrybeはサプライヤーフィードを、チャネル向けに整った商品カタログへ変換します。フィールドをマッピングし、属性と掲載文を充実させてから、エクスポートまたはWooCommerceへ同期します。", + "site.footer.rightsLine": "© {year} {name}. 無断転載を禁じます。", + "site.footer.navTitle": "ナビゲーション", + "site.footer.platform": "プラットフォーム", + "site.footer.solutions": "ソリューション", + "site.footer.contact": "お問い合わせ", + "home.hero.tagline": "ECチームのための商品データ", + "home.hero.title": "サプライヤーフィードから商品ページへ", + "home.hero.lead": "サプライヤーフィードを接続し、カテゴリへマッピング、必須属性を埋め、ルールに沿ったタイトルと説明文を作成。その後、ストアへエクスポートまたは同期します。", + "home.hero.learnMore": "詳しく見る", + "home.hero.apply": "アクセスを申請", + "home.hero.supportedBy": "サポート", "home.hero.msAlt": "Microsoft for Startups", - "home.image.previewAlt": "Descrybeプラットフォームのプレビュー — フィードから商品ページへ", - "home.how.title": "Descrybeが商品投入にかかる時間を短縮する仕組み", - "home.how.lead": "乱雑なサプライヤーデータを一度取り込めば、Descrybeが分類、属性補完、掲載文の作成、チャネルへの配信を支援します。", - "home.how.apply": "アクセスを申請", - "home.how.step1.title": "タクソノミーをインポート", - "home.how.step1.desc": "ストアですでに使っているカテゴリと属性を設定します", - "home.how.step1.f1": "カテゴリごとに必須属性を定義", - "home.how.step1.f2": "カテゴリごとのタイトル式を設定", - "home.how.step1.f3": "商品説明と検索スニペットのテンプレートを設定", - "home.how.step2.title": "サプライヤーデータをインポート", - "home.how.step2.desc": "フィードURLを接続するか、商品ファイルをアップロード", - "home.how.step2.f1": "CSV・XML・APIソースからインポート", - "home.how.step2.f2": "サプライヤーからの自動インポートをスケジュール", - "home.how.step2.f3": "シンプルなドラッグ&ドロップでソースフィールドをマッピング", - "home.how.step3.title": "変換とエンリッチ", - "home.how.step3.desc": "処理する商品を選び、Descrybeに任せます:", - "home.how.step3.f1": "適切なカテゴリを割り当て", - "home.how.step3.f2": "必須の商品属性を入力", - "home.how.step3.f3": "明確で検索に強いタイトルと説明文を作成", - "home.how.step4.title": "チャネルへエクスポート", - "home.how.step4.desc": "販売先へ、準備のできた商品データを配信", - "home.how.step4.f1": "チャネル別の商品フィードを生成", - "home.how.step4.f2": "エクスポートするフィールドを完全にコントロール", - "home.how.step4.f3": "サプライヤーデータが変わっても最新を維持", - "home.benefits.title": "よりきれいな商品データに必要なすべて", - "home.benefits.lead": "フィード取り込みからチャネル対応の掲載まで — ファイルを手作業で作り直す必要はありません。", - "home.benefits.shield.title": "不完全な掲載を早期に検出", - "home.benefits.shield.desc": "カテゴリルールに照らして商品データを確認し、不足属性や薄い文言を公開前に修正します。", - "home.benefits.chart.title": "より明確な掲載、より強いコンバージョン", - "home.benefits.chart.desc": "購入者が重視するメリット・仕様・検索語句を強調するタイトルと説明文で、カタログに合わせた訴求ができます。", - "home.benefits.database.title": "一貫した商品構造", - "home.benefits.database.desc": "エクスポートとチャネル全体で同じカテゴリツリーと属性形状を保ち、どこでも同じ探しやすさを実現します。", - "home.benefits.search.title": "検索に強い商品コンテンツ", - "home.benefits.search.desc": "購入者と検索エンジンの双方が理解しやすいタイトル、説明文、メタスニペットを作成します。", - "home.benefits.cost.title": "手作業のデータ入力を削減", - "home.benefits.cost.desc": "マッピング、属性補完、掲載文を自動化し、チームはスプレッドシート整理ではなくマーチャンダイジングに時間を使えます。", - "home.benefits.scale.title": "あらゆる販売チャネルに対応", - "home.benefits.scale.desc": "各チャネルが求める形式に合わせてエクスポートフィードとWooCommerce同期を整え、カタログを手作業で作り直す必要はありません。", - "home.cta.titleLead": "商品を市場へ ", - "home.cta.titleHighlight": "より速く", - "home.cta.description": "サプライヤーファイルごとに商品データを作り直すのはやめましょう。一度マッピングし、ルールでエンリッチし、販売できる掲載を公開します。", - "home.cta.f1": "パーソナライズドデモ", - "home.cta.f2": "専門家によるコンサルティング", - "home.cta.f3": "明確な次のステップ", - "home.cta.apply": "アクセスを申請", - "home.cta.imageAlt": "Descrybeの商品ページ", - "home.product.eyebrow": "Descrybeのできること", - "home.product.title": "サプライヤーフィードを入れて、準備済みの掲載を出す — エクスポート、WooCommerce、またはAPI。", - "home.product.description": "DescrybeはECチームがサプライヤーのCSV・XMLフィードをきれいな商品カタログに変えるのを支援します。カテゴリへフィールドをマッピングし、属性と掲載文を充実させ、エクスポートフィード、WooCommerce同期、または公開APIでデータを届けます。", - "home.product.pipelineAria": "商品パイプライン", - "home.product.p1.label": "フィード入力", - "home.product.p1.detail": "サプライヤーURLからのCSV / XML", - "home.product.p2.label": "マップ", - "home.product.p2.detail": "列をフィールドに対応付け", - "home.product.p3.label": "エンリッチ", - "home.product.p3.detail": "カテゴリ、属性、タイトル", - "home.product.p4.label": "配信", - "home.product.p4.detail": "Export · Woo · API", - "pricing.section.badge": "SKU容量 + AIクレジット", - "pricing.section.title": "無料で始め、カタログの成長に合わせてスケール。", - "pricing.section.lead": "Freeにはフィードマッピング、基本的な商品クリーンアップ、最大100 SKUまでのEUエネルギラベル(EPREL)が含まれます(AIクレジットなし)。有料プランではAIタイトルと説明文、より大きな容量、エクスポートオプションが追加されます — Starter、Growth、Business、またはEnterpriseはセールスまでご相談ください。", - "pricing.section.billingPeriod": "請求期間", - "pricing.section.monthly": "月額", - "pricing.section.yearly": "年額", - "pricing.section.savePercent": "20%お得", - "pricing.section.publicBefore": "公開プラン:Free、Starter、Growth、Business、Enterprise。Freeアカウントを作成し、その後", - "pricing.section.publicOr": "または", - "pricing.section.publicAfter": "でStripe Checkout経由でアップグレード。Enterpriseはセールス主導のままです。", - "pricing.section.plansLink": "プラン", - "pricing.section.billingLink": "請求", - "pricing.section.capabilitiesTitle": "各プランが想定する用途", - "pricing.section.capabilitiesLead": "フィードを取り込み、カタログをエンリッチし、エクスポートまたはWooCommerceへ同期", - "pricing.section.faqTitle": "よくある質問", - "pricing.section.readyTitle": "最初のフィードをマッピングする準備はできましたか?", - "pricing.section.readyLead": "Freeアカウントを作成 — カード不要。すでにアカウントがある場合は、アプリを開くかプランを比較してください。", - "pricing.section.contactSales": "セールスに連絡", - "pricing.cap.feeds": "フィードからカタログへ", - "pricing.cap.feeds.f1": "CSV / XML / URLのサプライヤーフィード", - "pricing.cap.feeds.f2": "フィールドマッピングと検証", - "pricing.cap.feeds.f3": "複数サプライヤーのマージ", - "pricing.cap.feeds.f4": "スケジュール同期", - "pricing.cap.feeds.f5": "カテゴリ対応の変換", - "pricing.cap.processing": "処理とAI", - "pricing.cap.processing.f1": "データクリーンアップと属性補完(全プラン)", - "pricing.cap.processing.f2": "AIタイトルと説明文(有料)", - "pricing.cap.processing.f3": "EUエネルギラベル / EPREL(全プラン)", - "pricing.cap.processing.f4": "数式、ブランドボイス、変数", - "pricing.cap.processing.f5": "マネージドクレジットまたは独自のAIキー", - "pricing.cap.export": "エクスポートとチャネル", - "pricing.cap.export.f1": "XML / CSVエクスポートフィード", - "pricing.cap.export.f2": "WooCommerce / Shopify同期", - "pricing.cap.export.f3": "フルAPI", - "pricing.cap.export.f4": "チャネル固有フォーマット", - "pricing.cap.export.f5": "一括更新", - "pricing.cap.limits": "上限とコントロール", - "pricing.cap.limits.f1": "SKU(商品)上限", - "pricing.cap.limits.f2": "月次AIクレジットパック", - "pricing.cap.limits.f3": "チームの役割と招待", - "pricing.cap.limits.f4": "EnterpriseのSLAオプション", - "pricing.faq.credits.q": "AIクレジットとは何ですか?", - "pricing.faq.credits.a": "AIクレジットは、タイトルや説明文の生成などのステップに使われます。FreeにはAIクレジットが0含まれます — フィードのマッピングと商品データのクリーンアップは可能です。有料の月次パック:Starter 150、Plus 500、Growth 1,200、Business 4,000、Scale 8,000。Enterpriseには大規模なマネージドパック(および独自のAIキー)が含まれます。Growth以上では、マネージドクレジットの代わりに独自キーでAIを実行することもできます。", + "home.image.previewAlt": "Descrybeプラットフォームのプレビュー — フィードから商品ページへ", + "home.how.title": "Descrybeが商品投入にかかる時間を短縮する仕組み", + "home.how.lead": "乱雑なサプライヤーデータを一度取り込めば、Descrybeが分類、属性補完、掲載文の作成、チャネルへの配信を支援します。", + "home.how.apply": "アクセスを申請", + "home.how.step1.title": "タクソノミーをインポート", + "home.how.step1.desc": "ストアですでに使っているカテゴリと属性を設定します", + "home.how.step1.f1": "カテゴリごとに必須属性を定義", + "home.how.step1.f2": "カテゴリごとのタイトル式を設定", + "home.how.step1.f3": "商品説明と検索スニペットのテンプレートを設定", + "home.how.step2.title": "サプライヤーデータをインポート", + "home.how.step2.desc": "フィードURLを接続するか、商品ファイルをアップロード", + "home.how.step2.f1": "CSV・XML・APIソースからインポート", + "home.how.step2.f2": "サプライヤーからの自動インポートをスケジュール", + "home.how.step2.f3": "シンプルなドラッグ&ドロップでソースフィールドをマッピング", + "home.how.step3.title": "変換とエンリッチ", + "home.how.step3.desc": "処理する商品を選び、Descrybeに任せます:", + "home.how.step3.f1": "適切なカテゴリを割り当て", + "home.how.step3.f2": "必須の商品属性を入力", + "home.how.step3.f3": "明確で検索に強いタイトルと説明文を作成", + "home.how.step4.title": "チャネルへエクスポート", + "home.how.step4.desc": "販売先へ、準備のできた商品データを配信", + "home.how.step4.f1": "チャネル別の商品フィードを生成", + "home.how.step4.f2": "エクスポートするフィールドを完全にコントロール", + "home.how.step4.f3": "サプライヤーデータが変わっても最新を維持", + "home.benefits.title": "よりきれいな商品データに必要なすべて", + "home.benefits.lead": "フィード取り込みからチャネル対応の掲載まで — ファイルを手作業で作り直す必要はありません。", + "home.benefits.shield.title": "不完全な掲載を早期に検出", + "home.benefits.shield.desc": "カテゴリルールに照らして商品データを確認し、不足属性や薄い文言を公開前に修正します。", + "home.benefits.chart.title": "より明確な掲載、より強いコンバージョン", + "home.benefits.chart.desc": "購入者が重視するメリット・仕様・検索語句を強調するタイトルと説明文で、カタログに合わせた訴求ができます。", + "home.benefits.database.title": "一貫した商品構造", + "home.benefits.database.desc": "エクスポートとチャネル全体で同じカテゴリツリーと属性形状を保ち、どこでも同じ探しやすさを実現します。", + "home.benefits.search.title": "検索に強い商品コンテンツ", + "home.benefits.search.desc": "購入者と検索エンジンの双方が理解しやすいタイトル、説明文、メタスニペットを作成します。", + "home.benefits.cost.title": "手作業のデータ入力を削減", + "home.benefits.cost.desc": "マッピング、属性補完、掲載文を自動化し、チームはスプレッドシート整理ではなくマーチャンダイジングに時間を使えます。", + "home.benefits.scale.title": "あらゆる販売チャネルに対応", + "home.benefits.scale.desc": "各チャネルが求める形式に合わせてエクスポートフィードとWooCommerce同期を整え、カタログを手作業で作り直す必要はありません。", + "home.cta.titleLead": "商品を市場へ ", + "home.cta.titleHighlight": "より速く", + "home.cta.description": "サプライヤーファイルごとに商品データを作り直すのはやめましょう。一度マッピングし、ルールでエンリッチし、販売できる掲載を公開します。", + "home.cta.f1": "パーソナライズドデモ", + "home.cta.f2": "専門家によるコンサルティング", + "home.cta.f3": "明確な次のステップ", + "home.cta.apply": "アクセスを申請", + "home.cta.imageAlt": "Descrybeの商品ページ", + "home.product.eyebrow": "Descrybeのできること", + "home.product.title": "サプライヤーフィードを入れて、準備済みの掲載を出す — エクスポート、WooCommerce、またはAPI。", + "home.product.description": "DescrybeはECチームがサプライヤーのCSV・XMLフィードをきれいな商品カタログに変えるのを支援します。カテゴリへフィールドをマッピングし、属性と掲載文を充実させ、エクスポートフィード、WooCommerce同期、または公開APIでデータを届けます。", + "home.product.pipelineAria": "商品パイプライン", + "home.product.p1.label": "フィード入力", + "home.product.p1.detail": "サプライヤーURLからのCSV / XML", + "home.product.p2.label": "マップ", + "home.product.p2.detail": "列をフィールドに対応付け", + "home.product.p3.label": "エンリッチ", + "home.product.p3.detail": "カテゴリ、属性、タイトル", + "home.product.p4.label": "配信", + "home.product.p4.detail": "Export · Woo · API", + "pricing.section.badge": "SKU容量 + AIクレジット", + "pricing.section.title": "無料で始め、カタログの成長に合わせてスケール。", + "pricing.section.lead": "Freeにはフィードマッピング、基本的な商品クリーンアップ、最大100 SKUまでのEUエネルギラベル(EPREL)が含まれます(AIクレジットなし)。有料プランではAIタイトルと説明文、より大きな容量、エクスポートオプションが追加されます — Starter、Growth、Business、またはEnterpriseはセールスまでご相談ください。", + "pricing.section.billingPeriod": "請求期間", + "pricing.section.monthly": "月額", + "pricing.section.yearly": "年額", + "pricing.section.savePercent": "20%お得", + "pricing.section.publicBefore": "公開プラン:Free、Starter、Growth、Business、Enterprise。Freeアカウントを作成し、その後", + "pricing.section.publicOr": "または", + "pricing.section.publicAfter": "でStripe Checkout経由でアップグレード。Enterpriseはセールス主導のままです。", + "pricing.section.plansLink": "プラン", + "pricing.section.billingLink": "請求", + "pricing.section.capabilitiesTitle": "各プランが想定する用途", + "pricing.section.capabilitiesLead": "フィードを取り込み、カタログをエンリッチし、エクスポートまたはWooCommerceへ同期", + "pricing.section.faqTitle": "よくある質問", + "pricing.section.readyTitle": "最初のフィードをマッピングする準備はできましたか?", + "pricing.section.readyLead": "Freeアカウントを作成 — カード不要。すでにアカウントがある場合は、アプリを開くかプランを比較してください。", + "pricing.section.contactSales": "セールスに連絡", + "pricing.cap.feeds": "フィードからカタログへ", + "pricing.cap.feeds.f1": "CSV / XML / URLのサプライヤーフィード", + "pricing.cap.feeds.f2": "フィールドマッピングと検証", + "pricing.cap.feeds.f3": "複数サプライヤーのマージ", + "pricing.cap.feeds.f4": "スケジュール同期", + "pricing.cap.feeds.f5": "カテゴリ対応の変換", + "pricing.cap.processing": "処理とAI", + "pricing.cap.processing.f1": "データクリーンアップと属性補完(全プラン)", + "pricing.cap.processing.f2": "AIタイトルと説明文(有料)", + "pricing.cap.processing.f3": "EUエネルギラベル / EPREL(全プラン)", + "pricing.cap.processing.f4": "数式、ブランドボイス、変数", + "pricing.cap.processing.f5": "マネージドクレジットまたは独自のAIキー", + "pricing.cap.export": "エクスポートとチャネル", + "pricing.cap.export.f1": "XML / CSVエクスポートフィード", + "pricing.cap.export.f2": "WooCommerce / Shopify同期", + "pricing.cap.export.f3": "フルAPI", + "pricing.cap.export.f4": "チャネル固有フォーマット", + "pricing.cap.export.f5": "一括更新", + "pricing.cap.limits": "上限とコントロール", + "pricing.cap.limits.f1": "SKU(商品)上限", + "pricing.cap.limits.f2": "月次AIクレジットパック", + "pricing.cap.limits.f3": "チームの役割と招待", + "pricing.cap.limits.f4": "EnterpriseのSLAオプション", + "pricing.faq.credits.q": "AIクレジットとは何ですか?", + "pricing.faq.credits.a": "AIクレジットは、タイトルや説明文の生成などのステップに使われます。FreeにはAIクレジットが0含まれます — フィードのマッピングと商品データのクリーンアップは可能です。有料の月次パック:Starter 150、Plus 500、Growth 1,200、Business 4,000、Scale 8,000。Enterpriseには大規模なマネージドパック(および独自のAIキー)が含まれます。Growth以上では、マネージドクレジットの代わりに独自キーでAIを実行することもできます。", "pricing.faq.packs.q": "Can I buy extra AI credits?", "pricing.faq.packs.a": "Yes. One-time packs: Starter $19 / 500 credits, Growth $59 / 2,000, Catalog $199 / 10,000, Scale $599 / 40,000. Buy from Billing after you have a paid plan (or Free with leftover trial credits). Packs do not change your SKU or feed limits.", - "pricing.faq.limits.q": "商品またはクレジット上限に達するとどうなりますか?", - "pricing.faq.limits.a": "近づくと警告します。商品上限に達する、またはAIクレジットが尽きると、その容量が必要なジョブは、空きを確保する、次の請求サイクルを待つ、またはアップグレードするまで一時停止します。", - "pricing.faq.change.q": "アップグレードやダウングレードはできますか?", - "pricing.faq.change.a": "はい。Freeから始め、プランまたは請求(Stripe Checkout)からStarter、Plus、Growth、Business、Scaleへアップグレードできます。Enterpriseは常にセールス主導です。", - "pricing.faq.free.q": "Freeには何が含まれますか?", - "pricing.faq.free.a": "ずっとFree:50商品、1フィード、データクリーンアップと属性補完、EUエネルギラベル(EPREL — 公開データ、クレジット不要)、手動エクスポート1件 — AIクレジットは0。クレジットカード不要。AIタイトル・説明文やより大きな容量が必要になったらアップグレードしてください。", - "pricing.faq.why.q": "コンテンツ専用ツールのように商品単位課金ではないのはなぜですか?", - "pricing.faq.why.a": "Descrybeはサプライヤーフィードからカタログ、WooCommerceまたはエクスポートまでの一連の流れ向けに作られており、AIコピーだけではありません。お支払いはプラットフォーム容量(商品とフィード)に対するもので、AIはその上の利用レイヤーです。", - "pricing.faq.annual.q": "年額請求はどう機能しますか?", - "pricing.faq.annual.a": "年額請求は月額定価より約20%お得です。無料で始め、アップグレード時にCheckoutで年額を選ぶか、セールスにお問い合わせください。", + "pricing.faq.limits.q": "商品またはクレジット上限に達するとどうなりますか?", + "pricing.faq.limits.a": "近づくと警告します。商品上限に達する、またはAIクレジットが尽きると、その容量が必要なジョブは、空きを確保する、次の請求サイクルを待つ、またはアップグレードするまで一時停止します。", + "pricing.faq.change.q": "アップグレードやダウングレードはできますか?", + "pricing.faq.change.a": "はい。Freeから始め、プランまたは請求(Stripe Checkout)からStarter、Plus、Growth、Business、Scaleへアップグレードできます。Enterpriseは常にセールス主導です。", + "pricing.faq.free.q": "Freeには何が含まれますか?", + "pricing.faq.free.a": "ずっとFree:50商品、1フィード、データクリーンアップと属性補完、EUエネルギラベル(EPREL — 公開データ、クレジット不要)、手動エクスポート1ä»¶ — AIクレジットは0。クレジットカード不要。AIタイトル・説明文やより大きな容量が必要になったらアップグレードしてください。", + "pricing.faq.why.q": "コンテンツ専用ツールのように商品単位課金ではないのはなぜですか?", + "pricing.faq.why.a": "Descrybeはサプライヤーフィードからカタログ、WooCommerceまたはエクスポートまでの一連の流れ向けに作られており、AIコピーだけではありません。お支払いはプラットフォーム容量(商品とフィード)に対するもので、AIはその上の利用レイヤーです。", + "pricing.faq.annual.q": "年額請求はどう機能しますか?", + "pricing.faq.annual.a": "年額請求は月額定価より約20%お得です。無料で始め、アップグレード時にCheckoutで年額を選ぶか、セールスにお問い合わせください。", "pricing.calc.badge": "Plan calculator", "pricing.calc.title": "Find the right plan", "pricing.calc.lead": "Enter feeds, catalog size, and how many products you want to enhance with AI (count each language pass).", @@ -5265,12 +5266,12 @@ export const ja: MessageDict = { "pricing.calc.skus": "Catalog products (SKUs)", "pricing.calc.skusHint": "Total products you will store and process", "pricing.calc.aiVolume": "AI process volume", - "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", + "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", "pricing.calc.recommendedLabel": "Recommended", "pricing.calc.budgetLabel": "Budget option", "pricing.calc.coversCredits": "Needs about {count} AI credits / month", "pricing.calc.aiIncluded": "Included monthly credits cover this AI volume", - "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", + "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", "pricing.calc.orYearly": "or ~{amount}/mo yearly", "pricing.calc.budgetNote": "Lower list price with yearly discount and/or credit packs when that still fits.", "pricing.calc.noBudget": "The recommended plan is already the leanest fit for these inputs.", @@ -5278,30 +5279,30 @@ export const ja: MessageDict = { "pricing.calc.enterpriseBody": "Your feeds or catalog size exceed self-serve caps. Talk to sales for unlimited capacity and a managed AI grant or BYOK.", "pricing.calc.ctaPlan": "Choose {name}", "pricing.calc.disclaimer": "Estimates use list prices and ~2 credits per AI product enhance. Checkout prices come from Stripe. A1 and other client deals stay admin-only.", - "pricing.card.mostPopular": "一番人気", - "pricing.card.custom": "カスタム", - "pricing.card.forever": "ずっと", - "pricing.card.perMonth": "月", - "pricing.card.perYear": "年", - "pricing.card.savePerMonth": "${amount}/月 お得", + "pricing.card.mostPopular": "一番人気", + "pricing.card.custom": "カスタム", + "pricing.card.forever": "ずっと", + "pricing.card.perMonth": "月", + "pricing.card.perYear": "å¹´", + "pricing.card.savePerMonth": "${amount}/月 お得", "pricing.card.discountBadge": "-20%", - "pricing.card.unlimitedSkus": "SKU無制限", - "pricing.card.oneMSkus": "100万以上のSKU", - "pricing.card.upToSkus": "最大 {count} SKU", - "pricing.card.unlimitedAi": "AIクレジット無制限", - "pricing.card.zeroCredits": "AIクレジット 0 / 月", - "pricing.card.creditsPerMonth": "AIクレジット {count} / 月", - "pricing.card.showLess": "表示を減らす", - "pricing.card.showMoreFeature": "あと {count} 件の機能を表示", - "pricing.card.showMoreFeatures": "あと {count} 件の機能を表示", - "pricing.card.upgradeTo": "{name} にアップグレード", - "pricing.plan.free.description": "サンプルフィードをマッピングし、商品データをクリーンアップ — カード不要", - "pricing.plan.starter.description": "AIタイトルと説明文が必要な小規模カタログ向け", - "pricing.plan.plus.description": "成長中のカタログ向けに、より多くの商品・フィード・AI", - "pricing.plan.growth.description": "複数サプライヤーフィードをストアやショッピングエクスポートへ", - "pricing.plan.business.description": "BYOK対応のミッドマーケットカタログ", - "pricing.plan.scale.description": "優先サポート付きのディストリビューター規模カタログ", - "pricing.plan.enterprise.description": "無制限の容量、SLA、専任アカウントチーム", + "pricing.card.unlimitedSkus": "SKU無制限", + "pricing.card.oneMSkus": "100万以上のSKU", + "pricing.card.upToSkus": "最大 {count} SKU", + "pricing.card.unlimitedAi": "AIクレジット無制限", + "pricing.card.zeroCredits": "AIクレジット 0 / 月", + "pricing.card.creditsPerMonth": "AIクレジット {count} / 月", + "pricing.card.showLess": "表示を減らす", + "pricing.card.showMoreFeature": "あと {count} 件の機能を表示", + "pricing.card.showMoreFeatures": "あと {count} 件の機能を表示", + "pricing.card.upgradeTo": "{name} にアップグレード", + "pricing.plan.free.description": "サンプルフィードをマッピングし、商品データをクリーンアップ — カード不要", + "pricing.plan.starter.description": "AIタイトルと説明文が必要な小規模カタログ向け", + "pricing.plan.plus.description": "成長中のカタログ向けに、より多くの商品・フィード・AI", + "pricing.plan.growth.description": "複数サプライヤーフィードをストアやショッピングエクスポートへ", + "pricing.plan.business.description": "BYOK対応のミッドマーケットカタログ", + "pricing.plan.scale.description": "優先サポート付きのディストリビューター規模カタログ", + "pricing.plan.enterprise.description": "無制限の容量、SLA、専任アカウントチーム", "pricing.feature.credits100": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits100starter": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits400": "400 AI credits / month (~50% catalog cover)", @@ -5316,32 +5317,32 @@ export const ja: MessageDict = { "pricing.feature.upTo15kSkus": "Up to 15,000 SKUs", "pricing.feature.credits15000": "15,000 AI credits / month (~75% catalog cover)", "pricing.feature.credits60000": "60,000 AI credits / month (~75% catalog cover)", - "pricing.feature.upTo50Skus": "最大 50 SKU", + "pricing.feature.upTo50Skus": "最大 50 SKU", "pricing.feature.upTo100Skus": "Up to 100 SKUs", "pricing.feature.upTo400Skus": "Up to 400 SKUs", "pricing.feature.upTo1200Skus": "Up to 1,200 SKUs", "pricing.feature.upTo4kSkus": "Up to 4,000 SKUs", "pricing.feature.upTo12kSkus": "Up to 12,000 SKUs", - "pricing.feature.oneFeedSource": "フィードソース 1", + "pricing.feature.oneFeedSource": "フィードソース 1", "pricing.feature.twoFeedSources": "2 feed sources", - "pricing.feature.threeFeedSources": "フィードソース 3", + "pricing.feature.threeFeedSources": "フィードソース 3", "pricing.feature.fourFeedSources": "4 feed sources", "pricing.feature.sixFeedSources": "6 feed sources", "pricing.feature.twelveFeedSources": "12 feed sources", "pricing.feature.twentyFiveFeedSources": "25 feed sources", - "pricing.feature.cleanData": "データクリーンアップ、仕様解析、フィールド入力", - "pricing.feature.eprel": "EUエネルギラベル(EPREL)", - "pricing.feature.zeroCredits": "AIクレジット 0 / 月", - "pricing.feature.oneManualExport": "手動エクスポートフィード 1", + "pricing.feature.cleanData": "データクリーンアップ、仕様解析、フィールド入力", + "pricing.feature.eprel": "EUエネルギラベル(EPREL)", + "pricing.feature.zeroCredits": "AIクレジット 0 / 月", + "pricing.feature.oneManualExport": "手動エクスポートフィード 1", "pricing.feature.twoExports": "2 export feeds", "pricing.feature.fourExports": "4 export feeds", - "pricing.feature.wooTestOnly": "WooCommerce接続テストのみ", - "pricing.feature.upTo2Seats": "最大 2 シート", - "pricing.feature.aiTitles": "AIタイトルと説明文", - "pricing.feature.liveStoreSync": "ライブストア同期", - "pricing.feature.apiAccess": "APIアクセス", - "pricing.feature.byok": "独自のAIキーを利用", - "pricing.feature.upTo500Skus": "最大 500 SKU", + "pricing.feature.wooTestOnly": "WooCommerce接続テストのみ", + "pricing.feature.upTo2Seats": "最大 2 シート", + "pricing.feature.aiTitles": "AIタイトルと説明文", + "pricing.feature.liveStoreSync": "ライブストア同期", + "pricing.feature.apiAccess": "APIアクセス", + "pricing.feature.byok": "独自のAIキーを利用", + "pricing.feature.upTo500Skus": "最大 500 SKU", "pricing.feature.upTo1000Skus": "Up to 1,000 SKUs", "pricing.feature.fiveFeedSources": "5 feed sources", "pricing.feature.fiveExports": "5 export feeds", @@ -5355,69 +5356,69 @@ export const ja: MessageDict = { "pricing.feature.credits12500": "12,500 AI credits / month (~25% catalog cover)", "pricing.feature.credits30000": "30,000 AI credits / month (~20% catalog cover)", "pricing.feature.upTo75kSkus": "Up to 75,000 SKUs", - "pricing.feature.threeExports": "エクスポートフィード 3", + "pricing.feature.threeExports": "エクスポートフィード 3", "pricing.feature.sixExports": "6 export feeds", "pricing.feature.tenExports": "10 export feeds", - "pricing.feature.fullWooSync": "完全なWooCommerce同期", - "pricing.feature.readApi": "読み取りAPIアクセス", - "pricing.feature.emailSupport": "メールサポート", + "pricing.feature.fullWooSync": "完全なWooCommerce同期", + "pricing.feature.readApi": "読み取りAPIアクセス", + "pricing.feature.emailSupport": "メールサポート", "pricing.feature.creditPacks": "Buy extra AI credit packs", - "pricing.feature.upTo2500Skus": "最大 2,500 SKU", + "pricing.feature.upTo2500Skus": "最大 2,500 SKU", "pricing.feature.upTo1500Skus": "Up to 1,500 SKUs", "pricing.feature.upTo3500Skus": "Up to 3,500 SKUs", "pricing.feature.upTo9500Skus": "Up to 9,500 SKUs", "pricing.feature.upTo18kSkus": "Up to 18,000 SKUs", "pricing.feature.upTo55kSkus": "Up to 55,000 SKUs", "pricing.feature.upTo5000Skus": "Up to 5,000 SKUs", - "pricing.feature.eightFeedSources": "フィードソース 8", - "pricing.feature.credits500": "AIクレジット 500 / 月", + "pricing.feature.eightFeedSources": "フィードソース 8", + "pricing.feature.credits500": "AIクレジット 500 / 月", "pricing.feature.credits1250": "1,250 AI credits / month (~25% catalog cover)", "pricing.feature.credits5000": "5,000 AI credits / month (~25% catalog cover)", - "pricing.feature.eightExports": "エクスポートフィード 8", + "pricing.feature.eightExports": "エクスポートフィード 8", "pricing.feature.fifteenExports": "15 export feeds", - "pricing.feature.wooShopifySync": "完全なWooCommerce + Shopify同期", - "pricing.feature.upTo10kSkus": "最大 10,000 SKU", + "pricing.feature.wooShopifySync": "完全なWooCommerce + Shopify同期", + "pricing.feature.upTo10kSkus": "最大 10,000 SKU", "pricing.feature.upTo25kSkus": "Up to 25,000 SKUs", - "pricing.feature.fifteenFeedSources": "フィードソース 15", + "pricing.feature.fifteenFeedSources": "フィードソース 15", "pricing.feature.tenFeedSources": "10 feed sources", "pricing.feature.twentyFeedSources": "20 feed sources", "pricing.feature.thirtyFeedSources": "30 feed sources", - "pricing.feature.credits1200": "AIクレジット 1,200 / 月", + "pricing.feature.credits1200": "AIクレジット 1,200 / 月", "pricing.feature.credits10000": "10,000 AI credits / month (~50% catalog cover)", "pricing.feature.credits25000": "25,000 AI credits / month (~50% catalog cover)", - "pricing.feature.twentyExports": "エクスポートフィード 20", + "pricing.feature.twentyExports": "エクスポートフィード 20", "pricing.feature.fortyExports": "40 export feeds", - "pricing.feature.fullFormulas": "完全な数式と変数", - "pricing.feature.fullApi": "フルAPIアクセス", - "pricing.feature.byokAddon": "bring-your-own-keyアドオン", - "pricing.feature.emailSupport24h": "メールサポート(24時間)", - "pricing.feature.upTo40kSkus": "最大 40,000 SKU", + "pricing.feature.fullFormulas": "完全な数式と変数", + "pricing.feature.fullApi": "フルAPIアクセス", + "pricing.feature.byokAddon": "bring-your-own-keyアドオン", + "pricing.feature.emailSupport24h": "メールサポート(24時間)", + "pricing.feature.upTo40kSkus": "最大 40,000 SKU", "pricing.feature.upTo50kSkus": "Up to 50,000 SKUs", - "pricing.feature.fortyFeedSources": "フィードソース 40", + "pricing.feature.fortyFeedSources": "フィードソース 40", "pricing.feature.fiftyFeedSources": "50 feed sources", - "pricing.feature.credits4000": "AIクレジット 4,000 / 月", + "pricing.feature.credits4000": "AIクレジット 4,000 / 月", "pricing.feature.credits40000": "40,000 AI credits / month (~50% catalog cover)", "pricing.feature.credits50000half": "50,000 AI credits / month (~50% catalog cover)", - "pricing.feature.unlimitedExports": "エクスポートフィード無制限", - "pricing.feature.fullApiWebhooks": "フルAPI", - "pricing.feature.byokIncluded": "独自AIキー込み", - "pricing.feature.priorityEmail": "優先メールサポート", - "pricing.feature.upTo100kSkus": "最大 100,000 SKU", + "pricing.feature.unlimitedExports": "エクスポートフィード無制限", + "pricing.feature.fullApiWebhooks": "フルAPI", + "pricing.feature.byokIncluded": "独自AIキー込み", + "pricing.feature.priorityEmail": "優先メールサポート", + "pricing.feature.upTo100kSkus": "最大 100,000 SKU", "pricing.feature.upTo150kSkus": "Up to 150,000 SKUs", - "pricing.feature.hundredFeedSources": "フィードソース 100", + "pricing.feature.hundredFeedSources": "フィードソース 100", "pricing.feature.hundredFiftyFeedSources": "150 feed sources", - "pricing.feature.credits8000": "AIクレジット 8,000 / 月", + "pricing.feature.credits8000": "AIクレジット 8,000 / 月", "pricing.feature.credits50000": "50,000 AI credits / month (~25% catalog cover)", "pricing.feature.credits120000": "120,000 AI credits / month (~40% catalog cover)", - "pricing.feature.prioritySlack": "優先サポート + Slack", - "pricing.feature.unlimitedSkus": "SKU無制限", - "pricing.feature.unlimitedFeeds": "フィードソース無制限", - "pricing.feature.unlimitedAiOwnKey": "AIクレジット無制限 / 独自キー", - "pricing.feature.ssoWebhooksAm": "SSO、専任アカウントマネージャー", - "pricing.feature.customIntegrations": "カスタム連携", - "pricing.feature.slaPriority": "SLAと優先サポート", + "pricing.feature.prioritySlack": "優先サポート + Slack", + "pricing.feature.unlimitedSkus": "SKU無制限", + "pricing.feature.unlimitedFeeds": "フィードソース無制限", + "pricing.feature.unlimitedAiOwnKey": "AIクレジット無制限 / 独自キー", + "pricing.feature.ssoWebhooksAm": "SSO、専任アカウントマネージャー", + "pricing.feature.customIntegrations": "カスタム連携", + "pricing.feature.slaPriority": "SLAと優先サポート", "pricing.pack.tiny.name": "Nano pack", - "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", + "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", "pricing.pack.small.name": "Starter pack", "pricing.pack.small.desc": "Extra AI for fixes and tests (~250 products)", "pricing.pack.medium.name": "Growth pack", @@ -5427,114 +5428,114 @@ export const ja: MessageDict = { "pricing.pack.xl.name": "Scale pack", "pricing.pack.xl.desc": "Heavy usage / agency bursts (~20,000 products)", "pricing.pack.xxl.name": "Business pack", - "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", + "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", "pricing.pack.mega.name": "Scale pack", - "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", - "pricing.section.faqDescription": "プラン、クレジット、Freeに含まれる内容についての明確な回答。", + "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", + "pricing.section.faqDescription": "プラン、クレジット、Freeに含まれる内容についての明確な回答。", "billing.buyCreditPacks": "Buy AI credit packs", - "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", - "billing.packCredits": "{credits} クレジット", + "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", + "billing.packCredits": "{credits} クレジット", "billing.packApproxProducts": "~{count} AI products", "billing.buyPack": "Buy", - "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", + "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", "billing.packCheckoutFailed": "Could not start credit pack checkout.", - "empty.default.noItems": "項目が見つかりません。", + "empty.default.noItems": "項目が見つかりません。", "settings.tabLockedHint": "Not on your plan", "stores.connectorLocked": "Not on your plan", "stores.connectorUpgrade": "Upgrade to unlock", - "plan.upgrade.title": "この機能はご契約プランに含まれていません", - "plan.upgrade.message": "アップグレードして Descrybe のこの部分を解除してください。", - "plan.upgrade.defaultMessage": "現在のプランには Descrybe のこの部分が含まれていません。アップグレードして解除するか、請求を変更できない場合は会社管理者に依頼してください。", - "plan.upgrade.sectionOff.title": "この機能は一時的に利用できません", - "plan.upgrade.sectionOff.message": "Descrybe のこの部分は現在プラットフォームでオフになっています。アップグレードの問題ではありません。後でもう一度試すか、サポートに連絡してください。", - "plan.upgrade.sectionOff.cta": "ダッシュボードに戻る", - "plan.upgrade.stores.message": "WooCommerce と Shopify のコネクタには Stores を含むプランが必要です。アップグレードして接続するか、現在のプランでフィードと API の利用を続けてください。", - "plan.upgrade.stillWorks.title": "プランで引き続き使えるもの", - "plan.upgrade.stillWorks.feeds.label": "入力フィード", - "plan.upgrade.stillWorks.feeds.description": "ストアコネクタなしでカタログを同期するため、CSV / XML URL とファイルアップロードを追加します。", - "plan.upgrade.stillWorks.export.label": "エクスポートフィード", - "plan.upgrade.stillWorks.export.description": "ショッピングチャネルやパートナー向けの送信フィードを生成します。", - "plan.upgrade.stillWorks.processing.label": "バックグラウンドタスク", - "plan.upgrade.stillWorks.processing.description": "処理で AI とカタログのジョブを監視します。ストアコネクタがなくてもプランで利用できます。", - "plan.upgrade.stillWorks.api.label": "API キー", - "plan.upgrade.stillWorks.api.description": "設定でキーを作成して /api/v1 を使います。シークレットは一度だけ表示されます。", - "plan.upgrade.stillWorks.docs.label": "API ドキュメント", - "plan.upgrade.stillWorks.docs.description": "API 概要を読み、WooCommerce や Shopify なしで統合します。", - "plan.upgrade.feature.settings.api_keys": "API キーには有料プランが必要です", - "plan.upgrade.feature.catalog.products.process_ai_titles": "AI タイトルは有料機能です", - "plan.upgrade.feature.catalog.products.process_ai_descriptions": "AI 説明文は有料機能です", - "plan.upgrade.feature.marketing.campaigns.generate_ai": "キャンペーン AI には有料プランが必要です", - "plan.upgrade.feature.marketing.campaigns.send": "ライブのキャンペーン送信には有料プランが必要です", - "plan.upgrade.feature.marketing.brand_ai_apply": "AI のブランドボイスには有料プランが必要です", - "plan.upgrade.feature.marketing.seo.ai_rewrite": "SEO AI 書き換えには有料プランが必要です", - "plan.upgrade.feature.integrations.ai.byok": "独自 AI キーの持ち込みは Growth から", - "plan.upgrade.feature.capability.byok": "独自 AI キーの持ち込みは Growth から", - "plan.upgrade.feature.marketing.campaigns": "キャンペーンはプランに含まれていません", - "plan.upgrade.feature.marketing.content_calendar": "コンテンツカレンダーはプランに含まれていません", - "plan.upgrade.feature.marketing.seo": "SEO ツールはプランに含まれていません", - "plan.upgrade.feature.marketing.brand_kit": "ブランドキットはプランに含まれていません", - "plan.upgrade.feature.marketing.reviews": "レビューはプランに含まれていません", - "plan.upgrade.feature.integrations.ai": "AI 連携はプランに含まれていません", - "plan.upgrade.feature.integrations.email": "メール送信はプランに含まれていません", - "plan.upgrade.feature.processing.monitor": "処理はプランに含まれていません", - "plan.upgrade.feature.stores.hub": "ストアコネクタはプランに含まれていません", - "plan.upgrade.feature.stores.woocommerce": "WooCommerce はプランに含まれていません", - "plan.upgrade.feature.stores.shopify": "Shopify はプランに含まれていません", - "plan.upgrade.feature.support.center": "サポートセンターはプランに含まれていません", - "plan.upgrade.feature.support.ticket_create": "サポートチケットの作成はプランに含まれていません", - "plan.upgrade.feature.support.ticket_thread": "サポートチケットのスレッドはプランに含まれていません", - "plan.upgrade.feature.catalog.structured_descriptions": "構造化説明はプランに含まれていません", - "plan.upgrade.feature.catalog.vector_categories": "ベクトルカテゴリはプランに含まれていません", - "plan.checkingAccess": "プランアクセスを確認中…", - "upgradeBanner.comparePlans": "プランを比較", - "upgradeBanner.talkToSales": "営業に相談", - "commandPalette.closeAria": "検索を閉じる", - "commandPalette.ariaLabel": "ページを検索", - "commandPalette.placeholder": "ページを検索…", - "commandPalette.searchAria": "ページを検索", - "commandPalette.destinationsAria": "ページ", - "commandPalette.noMatches": "一致するページがありません", - "commandPalette.announceIdleOne": "検索。{count} ページ。", - "commandPalette.announceIdleMany": "検索。{count} ページ。", - "commandPalette.announceNone": "一致するページがありません。", - "commandPalette.announceMatchOne": "一致するページが {count} 件。", - "commandPalette.announceMatchMany": "一致するページが {count} 件。", - "vector.title": "ベクトルカテゴリのテスト", - "vector.description": "Pinecone が設定されているときにベクトルカテゴリ索引を検索します。インデックス作成と初期化は v2 ではまだ利用できません。", - "vector.probing": "ベクトルカテゴリ API を確認中…", - "vector.unavailable": "このバックエンドにはまだベクトルカテゴリがありません。/api/vector-categories/* が接続されるまで実行できる操作はありません。", - "vector.browseCategories": "カテゴリを閲覧", - "vector.initHeading": "ベクトルデータベースを初期化", - "vector.initComingSoon": "インデックス作成とベクトル DB の初期化は v2 ではまだ利用できません(近日対応)。Pinecone が設定されていれば検索は引き続き利用できます。", - "vector.createIndex": "インデックスを作成", - "vector.initDb": "ベクトル DB を初期化", - "vector.searchHeading": "カテゴリを検索", - "vector.searchPlaceholder": "商品説明を入力…", - "vector.results": "結果:", - "vector.categoryLabel": "カテゴリ:", + "plan.upgrade.title": "この機能はご契約プランに含まれていません", + "plan.upgrade.message": "アップグレードして Descrybe のこの部分を解除してください。", + "plan.upgrade.defaultMessage": "現在のプランには Descrybe のこの部分が含まれていません。アップグレードして解除するか、請求を変更できない場合は会社管理者に依頼してください。", + "plan.upgrade.sectionOff.title": "この機能は一時的に利用できません", + "plan.upgrade.sectionOff.message": "Descrybe のこの部分は現在プラットフォームでオフになっています。アップグレードの問題ではありません。後でもう一度試すか、サポートに連絡してください。", + "plan.upgrade.sectionOff.cta": "ダッシュボードに戻る", + "plan.upgrade.stores.message": "WooCommerce と Shopify のコネクタには Stores を含むプランが必要です。アップグレードして接続するか、現在のプランでフィードと API の利用を続けてください。", + "plan.upgrade.stillWorks.title": "プランで引き続き使えるもの", + "plan.upgrade.stillWorks.feeds.label": "入力フィード", + "plan.upgrade.stillWorks.feeds.description": "ストアコネクタなしでカタログを同期するため、CSV / XML URL とファイルアップロードを追加します。", + "plan.upgrade.stillWorks.export.label": "エクスポートフィード", + "plan.upgrade.stillWorks.export.description": "ショッピングチャネルやパートナー向けの送信フィードを生成します。", + "plan.upgrade.stillWorks.processing.label": "バックグラウンドタスク", + "plan.upgrade.stillWorks.processing.description": "処理で AI とカタログのジョブを監視します。ストアコネクタがなくてもプランで利用できます。", + "plan.upgrade.stillWorks.api.label": "API キー", + "plan.upgrade.stillWorks.api.description": "設定でキーを作成して /api/v1 を使います。シークレットは一度だけ表示されます。", + "plan.upgrade.stillWorks.docs.label": "API ドキュメント", + "plan.upgrade.stillWorks.docs.description": "API 概要を読み、WooCommerce ã‚„ Shopify なしで統合します。", + "plan.upgrade.feature.settings.api_keys": "API キーには有料プランが必要です", + "plan.upgrade.feature.catalog.products.process_ai_titles": "AI タイトルは有料機能です", + "plan.upgrade.feature.catalog.products.process_ai_descriptions": "AI 説明文は有料機能です", + "plan.upgrade.feature.marketing.campaigns.generate_ai": "キャンペーン AI には有料プランが必要です", + "plan.upgrade.feature.marketing.campaigns.send": "ライブのキャンペーン送信には有料プランが必要です", + "plan.upgrade.feature.marketing.brand_ai_apply": "AI のブランドボイスには有料プランが必要です", + "plan.upgrade.feature.marketing.seo.ai_rewrite": "SEO AI 書き換えには有料プランが必要です", + "plan.upgrade.feature.integrations.ai.byok": "独自 AI キーの持ち込みは Growth から", + "plan.upgrade.feature.capability.byok": "独自 AI キーの持ち込みは Growth から", + "plan.upgrade.feature.marketing.campaigns": "キャンペーンはプランに含まれていません", + "plan.upgrade.feature.marketing.content_calendar": "コンテンツカレンダーはプランに含まれていません", + "plan.upgrade.feature.marketing.seo": "SEO ツールはプランに含まれていません", + "plan.upgrade.feature.marketing.brand_kit": "ブランドキットはプランに含まれていません", + "plan.upgrade.feature.marketing.reviews": "レビューはプランに含まれていません", + "plan.upgrade.feature.integrations.ai": "AI 連携はプランに含まれていません", + "plan.upgrade.feature.integrations.email": "メール送信はプランに含まれていません", + "plan.upgrade.feature.processing.monitor": "処理はプランに含まれていません", + "plan.upgrade.feature.stores.hub": "ストアコネクタはプランに含まれていません", + "plan.upgrade.feature.stores.woocommerce": "WooCommerce はプランに含まれていません", + "plan.upgrade.feature.stores.shopify": "Shopify はプランに含まれていません", + "plan.upgrade.feature.support.center": "サポートセンターはプランに含まれていません", + "plan.upgrade.feature.support.ticket_create": "サポートチケットの作成はプランに含まれていません", + "plan.upgrade.feature.support.ticket_thread": "サポートチケットのスレッドはプランに含まれていません", + "plan.upgrade.feature.catalog.structured_descriptions": "構造化説明はプランに含まれていません", + "plan.upgrade.feature.catalog.vector_categories": "ベクトルカテゴリはプランに含まれていません", + "plan.checkingAccess": "プランアクセスを確認中…", + "upgradeBanner.comparePlans": "プランを比較", + "upgradeBanner.talkToSales": "営業に相談", + "commandPalette.closeAria": "検索を閉じる", + "commandPalette.ariaLabel": "ページを検索", + "commandPalette.placeholder": "ページを検索…", + "commandPalette.searchAria": "ページを検索", + "commandPalette.destinationsAria": "ページ", + "commandPalette.noMatches": "一致するページがありません", + "commandPalette.announceIdleOne": "検索。{count} ページ。", + "commandPalette.announceIdleMany": "検索。{count} ページ。", + "commandPalette.announceNone": "一致するページがありません。", + "commandPalette.announceMatchOne": "一致するページが {count} 件。", + "commandPalette.announceMatchMany": "一致するページが {count} 件。", + "vector.title": "ベクトルカテゴリのテスト", + "vector.description": "Pinecone が設定されているときにベクトルカテゴリ索引を検索します。インデックス作成と初期化は v2 ではまだ利用できません。", + "vector.probing": "ベクトルカテゴリ API を確認中…", + "vector.unavailable": "このバックエンドにはまだベクトルカテゴリがありません。/api/vector-categories/* が接続されるまで実行できる操作はありません。", + "vector.browseCategories": "カテゴリを閲覧", + "vector.initHeading": "ベクトルデータベースを初期化", + "vector.initComingSoon": "インデックス作成とベクトル DB の初期化は v2 ではまだ利用できません(近日対応)。Pinecone が設定されていれば検索は引き続き利用できます。", + "vector.createIndex": "インデックスを作成", + "vector.initDb": "ベクトル DB を初期化", + "vector.searchHeading": "カテゴリを検索", + "vector.searchPlaceholder": "商品説明を入力…", + "vector.results": "結果:", + "vector.categoryLabel": "カテゴリ:", "vector.idLabel": "ID:", - "vector.scoreLabel": "スコア:", - "switcher.switching": "切替中…", - "switcher.returnTo": "{email} に戻る", - "switcher.switchUser": "ユーザー切替", - "switcher.loadingUsers": "ユーザーを読み込み中…", - "switcher.empty": "切替可能なユーザーが見つかりません。", - "switcher.noCompany": "会社なし", - "switcher.unknownCompany": "不明な会社", - "companySwitcher.select": "会社を選択", - "companySwitcher.switchAria": "会社を切替: {label}", - "companySwitcher.companies": "会社", - "companySwitcher.returnTo": "{name} に戻る", - "companySwitcher.returnHome": "ホーム会社に戻る", - "storeReconnect.primaryLabel": "ストアを再接続", - "storeReconnect.titlePlural": "移行後にストアを再接続", - "storeReconnect.titleChannel": "移行後に {channel} を再接続", - "storeReconnect.titleSingular": "移行後にストアを再接続", - "storeReconnect.messageWithItems": "プラットフォーム移行後、ストア API 資格情報は引き継がれていない(または使用できません)。壊れた同期ではなく、各ストアを再接続し、同期をキューに入れる前に接続テストを行ってください。", - "storeReconnect.messageSingle": "プラットフォーム移行後、{channel} API 資格情報は引き継がれていない(または使用できません)。壊れた同期ではなく、新しい資格情報を貼り付け、保存してから、同期をキューに入れる前に接続テストを行ってください。", - "storeReconnect.channelFallback": "ストア", - "storeReconnect.askAdmin": "会社の管理者に再接続を依頼してください — ストア資格情報を保存できるのは管理者のみです。", - "storeReconnect.reconnectItem": "{label} を再接続", + "vector.scoreLabel": "スコア:", + "switcher.switching": "切替中…", + "switcher.returnTo": "{email} に戻る", + "switcher.switchUser": "ユーザー切替", + "switcher.loadingUsers": "ユーザーを読み込み中…", + "switcher.empty": "切替可能なユーザーが見つかりません。", + "switcher.noCompany": "会社なし", + "switcher.unknownCompany": "不明な会社", + "companySwitcher.select": "会社を選択", + "companySwitcher.switchAria": "会社を切替: {label}", + "companySwitcher.companies": "会社", + "companySwitcher.returnTo": "{name} に戻る", + "companySwitcher.returnHome": "ホーム会社に戻る", + "storeReconnect.primaryLabel": "ストアを再接続", + "storeReconnect.titlePlural": "移行後にストアを再接続", + "storeReconnect.titleChannel": "移行後に {channel} を再接続", + "storeReconnect.titleSingular": "移行後にストアを再接続", + "storeReconnect.messageWithItems": "プラットフォーム移行後、ストア API 資格情報は引き継がれていない(または使用できません)。壊れた同期ではなく、各ストアを再接続し、同期をキューに入れる前に接続テストを行ってください。", + "storeReconnect.messageSingle": "プラットフォーム移行後、{channel} API 資格情報は引き継がれていない(または使用できません)。壊れた同期ではなく、新しい資格情報を貼り付け、保存してから、同期をキューに入れる前に接続テストを行ってください。", + "storeReconnect.channelFallback": "ストア", + "storeReconnect.askAdmin": "会社の管理者に再接続を依頼してください — ストア資格情報を保存できるのは管理者のみです。", + "storeReconnect.reconnectItem": "{label} を再接続", "admin.storeReconnect.channel.other": "Other", "admin.storeReconnect.channel.woocommerce": "WooCommerce", "admin.storeReconnect.channel.shopify": "Shopify", @@ -5556,7 +5557,7 @@ export const ja: MessageDict = { "admin.storeReconnect.listTitle": "Connected but invalid", "admin.storeReconnect.metric.showing": "Rows shown", "admin.storeReconnect.metric.total": "Gaps total", - "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", + "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", "admin.storeReconnect.loadFailed": "Could not load store reconnect inventory.", "admin.storeReconnect.refresh": "Refresh", "admin.storeReconnect.description": "Companies with a connected store identity but missing or unusable API credentials (cutover credential gaps).", @@ -5564,38 +5565,38 @@ export const ja: MessageDict = { "admin.nav.storeReconnect": "Store reconnect", "storeReconnect.wizardHint": "Prefer a step-by-step flow? Open Guided setup (/stores/wizard), or reconnect the channel below and Test Connection before syncing.", "storeReconnect.wizardLabel": "Guided setup", - "storeReconnect.reviewsHint": "移行後に認証情報を再接続するまでレビューインポートは実行できません。接続タブで保存してから接続をテストしてください。", - "storeReconnect.ordersHint": "移行後に認証情報を再接続するまで注文インポートは実行できません。接続タブで保存してから接続をテストしてください。", - "productSync.directionTitle": "商品: Descrybe → ストア", - "productSync.outbound": "Descrybe → {channel}", - "productSync.outboundBody": "— 処理済みの Descrybe 商品をストアに送信します(一致するリモート商品の作成または更新)。ストアカタログを Descrybe に取り込みません。", - "productSync.firstSync": "初回同期", - "productSync.firstSyncBody": "— 未一致の商品は {channel} に作成されます。以降の同期は、ID または一致戦略で既にリンクされた商品を更新します。", - "productSync.reSync": "再同期", - "productSync.reSyncBody": "— 一致するリモート商品は Descrybe の内容で上書きされることがあります(現在 {count} 件リンク済み)。", - "productSync.queued": "商品同期をキューに追加済み", - "productSync.live.queued": "キュー待ち — ワーカー待機中", - "productSync.live.running": "同期中", - "productSync.live.watching": "同期ステータスを監視中…完了後に件数が表示されます。", - "productSync.live.success": "同期完了: 合計 {total} · 作成 {created} · 更新 {updated} · 失敗 {failed} · スキップ {skipped}", - "productSync.live.partial": "一部失敗で同期完了: 合計 {total} · 作成 {created} · 更新 {updated} · 失敗 {failed} · スキップ {skipped}", - "productSync.live.failed": "同期に失敗しました{detail}。", - "productSync.live.timedOut": "まだ実行中です — 後で更新して最終ステータスと件数を確認してください。", - "productSync.live.ordersSuccess": "注文同期が完了しました({status})。", - "productSync.live.reviewsSuccess": "レビュー同期が完了しました({status})。", - "productSync.retry": "同期を再試行", - "productSync.lastStatus": "前回: {status}", - "productSync.dryRun": "ドライラン", - "productSync.lastSyncAt": "前回の商品同期: {date}", - "productSync.noneYet": "商品同期はまだ完了していません。", - "productSync.lastRun": "前回の実行: 合計 {total} · 作成 {created} · 更新 {updated} · 失敗 {failed} · スキップ {skipped}", - "productSync.needsReconnect": "移行後に認証情報を再接続するまで商品同期は実行できません。接続タブで保存してから接続をテストしてください。", - "productSync.scheduleTitle": "自動商品同期スケジュール", - "productSync.scheduleHelp": "フィードの同期間隔と同様:ストアへの商品プッシュ頻度を設定するか、スケジュールを一時停止します。一時停止中も手動キューは利用できます。 ストアWebhookは使いません(ポーリング/キューのみ)。", - "productSync.scheduleInterval": "同期間隔(時間)", - "productSync.scheduleIntervalHint": "1~168時間。サーバー未設定時の既定は6時間です。", - "productSync.schedulePause": "自動同期を一時停止", - "productSync.schedulePauseHint": "スケジュール済みのプッシュのみ停止します。手動の商品同期キューは引き続き利用できます。", + "storeReconnect.reviewsHint": "移行後に認証情報を再接続するまでレビューインポートは実行できません。接続タブで保存してから接続をテストしてください。", + "storeReconnect.ordersHint": "移行後に認証情報を再接続するまで注文インポートは実行できません。接続タブで保存してから接続をテストしてください。", + "productSync.directionTitle": "商品: Descrybe → ストア", + "productSync.outbound": "Descrybe → {channel}", + "productSync.outboundBody": "— 処理済みの Descrybe 商品をストアに送信します(一致するリモート商品の作成または更新)。ストアカタログを Descrybe に取り込みません。", + "productSync.firstSync": "初回同期", + "productSync.firstSyncBody": "— 未一致の商品は {channel} に作成されます。以降の同期は、ID または一致戦略で既にリンクされた商品を更新します。", + "productSync.reSync": "再同期", + "productSync.reSyncBody": "— 一致するリモート商品は Descrybe の内容で上書きされることがあります(現在 {count} 件リンク済み)。", + "productSync.queued": "商品同期をキューに追加済み", + "productSync.live.queued": "キュー待ち — ワーカー待機中", + "productSync.live.running": "同期中", + "productSync.live.watching": "同期ステータスを監視中…完了後に件数が表示されます。", + "productSync.live.success": "同期完了: 合計 {total} · 作成 {created} · æ›´æ–° {updated} · 失敗 {failed} · スキップ {skipped}", + "productSync.live.partial": "一部失敗で同期完了: 合計 {total} · 作成 {created} · æ›´æ–° {updated} · 失敗 {failed} · スキップ {skipped}", + "productSync.live.failed": "同期に失敗しました{detail}。", + "productSync.live.timedOut": "まだ実行中です — 後で更新して最終ステータスと件数を確認してください。", + "productSync.live.ordersSuccess": "注文同期が完了しました({status})。", + "productSync.live.reviewsSuccess": "レビュー同期が完了しました({status})。", + "productSync.retry": "同期を再試行", + "productSync.lastStatus": "前回: {status}", + "productSync.dryRun": "ドライラン", + "productSync.lastSyncAt": "前回の商品同期: {date}", + "productSync.noneYet": "商品同期はまだ完了していません。", + "productSync.lastRun": "前回の実行: 合計 {total} · 作成 {created} · æ›´æ–° {updated} · 失敗 {failed} · スキップ {skipped}", + "productSync.needsReconnect": "移行後に認証情報を再接続するまで商品同期は実行できません。接続タブで保存してから接続をテストしてください。", + "productSync.scheduleTitle": "自動商品同期スケジュール", + "productSync.scheduleHelp": "フィードの同期間隔と同様:ストアへの商品プッシュ頻度を設定するか、スケジュールを一時停止します。一時停止中も手動キューは利用できます。 ストアWebhookは使いません(ポーリング/キューのみ)。", + "productSync.scheduleInterval": "同期間隔(時間)", + "productSync.scheduleIntervalHint": "1~168時間。サーバー未設定時の既定は6時間です。", + "productSync.schedulePause": "自動同期を一時停止", + "productSync.schedulePauseHint": "スケジュール済みのプッシュのみ停止します。手動の商品同期キューは引き続き利用できます。", "productSync.scheduleSave": "Save schedule", "productSync.scheduleSaved": "Product sync schedule saved.", "productSync.schedulePausedSaved": "Automatic product sync paused.", @@ -5604,15 +5605,15 @@ export const ja: MessageDict = { "productSync.scheduleActiveBadge": "Schedule active", "productSync.scheduleNeedsConfig": "Save store connection first", "productSync.scheduleAdminOnly": "Company admin required", - "productSync.delivery.title": "更新はポーリング。ストアWebhookは未対応", - "productSync.delivery.body": "Descrybe は Shopify / WooCommerce の Webhook を受信しません。商品プッシュはキュー実行または自動スケジュールで動きます。このページは接続ステータスをポーリングして進捗を表示します(ライブのストア push ではありません)。", - "productSync.delivery.inboundNote": "注文・レビューもキューによる取得(スケジュールまたは手動)で、ライブ Webhook ではありません。", - "productSync.delivery.hubNote": "ストア連携はスケジュールまたはジョブキューで同期します。ライブのストア Webhook ではありません。", - "productSync.delivery.badge.manual": "手動キュー", - "productSync.delivery.badge.scheduled": "{hours}時間ごとにスケジュール", - "productSync.delivery.badge.scheduledDefault": "スケジュール(サーバー既定)", - "productSync.delivery.badge.paused": "スケジュール一時停止中", - "productSync.delivery.badge.webhooksOff": "ストアWebhook: 未対応", + "productSync.delivery.title": "更新はポーリング。ストアWebhookは未対応", + "productSync.delivery.body": "Descrybe は Shopify / WooCommerce の Webhook を受信しません。商品プッシュはキュー実行または自動スケジュールで動きます。このページは接続ステータスをポーリングして進捗を表示します(ライブのストア push ではありません)。", + "productSync.delivery.inboundNote": "注文・レビューもキューによる取得(スケジュールまたは手動)で、ライブ Webhook ではありません。", + "productSync.delivery.hubNote": "ストア連携はスケジュールまたはジョブキューで同期します。ライブのストア Webhook ではありません。", + "productSync.delivery.badge.manual": "手動キュー", + "productSync.delivery.badge.scheduled": "{hours}時間ごとにスケジュール", + "productSync.delivery.badge.scheduledDefault": "スケジュール(サーバー既定)", + "productSync.delivery.badge.paused": "スケジュール一時停止中", + "productSync.delivery.badge.webhooksOff": "ストアWebhook: 未対応", "productSync.scope.title": "What to sync", "productSync.scope.hint": "Optional filters for this push only. Leave blank to sync the latest processed products up to the limit.", "productSync.scope.status": "Status", @@ -5627,21 +5628,21 @@ export const ja: MessageDict = { "productSync.scope.products": "Specific products", "productSync.scope.productsHint": "Optional. Search and select processed products to push only those.", "productSync.scope.productsOverrideHint": "Selected products override status, category, and max-products filters for this sync.", - "productSync.scope.productsSearch": "Search products…", - "productSync.scope.productsLoading": "Loading products…", + "productSync.scope.productsSearch": "Search products…", + "productSync.scope.productsLoading": "Loading products…", "productSync.scope.productsEmpty": "No processed products found.", "productSync.scope.productsSelected": "{count} selected", "productSync.scope.productsSelectedList": "Selected products", "productSync.scope.productsClear": "Clear selection", "productSync.scope.productsMax": "Maximum {max} products", - "store.syncingLive": "同期中…", - "files.recentUploads": "最近のアップロード", - "files.colFileName": "ファイル名", - "files.colKind": "種類", - "files.colUploaded": "アップロード日時", - "files.colRows": "行数", - "files.loading": "アップロードを読み込み中…", - "files.empty": "まだアップロードはありません。", - "products.filters.sortProducts": "商品を並べ替え", - "products.table.options": "オプション", + "store.syncingLive": "同期中…", + "files.recentUploads": "最近のアップロード", + "files.colFileName": "ファイル名", + "files.colKind": "種類", + "files.colUploaded": "アップロード日時", + "files.colRows": "行数", + "files.loading": "アップロードを読み込み中…", + "files.empty": "まだアップロードはありません。", + "products.filters.sortProducts": "商品を並べ替え", + "products.table.options": "オプション", }; diff --git a/apps/web/src/lib/i18n/messages/nl.ts b/apps/web/src/lib/i18n/messages/nl.ts index 07040c6..27ceb42 100644 --- a/apps/web/src/lib/i18n/messages/nl.ts +++ b/apps/web/src/lib/i18n/messages/nl.ts @@ -1,6 +1,6 @@ -import type { MessageDict } from "./types"; +import type { MessageDict } from "./types"; -/** Dutch (nl) UI pack — keys must stay in sync with en.ts. */ +/** Dutch (nl) UI pack — keys must stay in sync with en.ts. */ export const nl: MessageDict = { "app.name": "Descrybe", "app.home": "Descrybe-startpagina", @@ -21,15 +21,15 @@ export const nl: MessageDict = { "common.name": "Uw naam", "common.viewPricing": "Prijzen bekijken", "common.backToSignIn": "Terug naar inloggen", - "common.signingOut": "Bezig met uitloggen…", + "common.signingOut": "Bezig met uitloggen…", "common.signOutAndContinue": "Uitloggen en doorgaan", "common.staySignedIn": "Ingelogd blijven", "a11y.skipToContent": "Ga naar inhoud", "theme.switchToDark": "Overschakelen naar donker thema", "theme.switchToLight": "Overschakelen naar licht thema", "header.signOut": "Uitloggen", - "header.signingOut": "Bezig met uitloggen…", - "status.emDash": "—", + "header.signingOut": "Bezig met uitloggen…", + "status.emDash": "—", "status.pending": "In behandeling", "status.processing": "Verwerken", "status.completed": "Voltooid", @@ -46,7 +46,7 @@ export const nl: MessageDict = { "nav.section.platform": "Platform", "nav.dashboard": "Controlepaneel", "nav.products": "Producten", - "nav.categories": "Categorieën", + "nav.categories": "Categorieën", "nav.attributes": "Attributen", "nav.fields": "Velden", "nav.feeds": "Feeds", @@ -74,14 +74,14 @@ export const nl: MessageDict = { "auth.login.title": "Inloggen", "auth.login.description": "Gebruik uw Descrybe e-mailadres en wachtwoord.", "auth.login.submit": "Inloggen", - "auth.login.submitting": "Bezig met inloggen…", + "auth.login.submitting": "Bezig met inloggen…", "auth.login.failed": "Inloggen mislukt", "auth.login.passwordNotSet": "Dit account heeft nog een wachtwoord nodig. Open uw uitnodigingslink of vraag een beheerder om een nieuwe.", "auth.login.setPasswordFirstTitle": "Stel eerst een wachtwoord in:", "auth.login.setPasswordFirstBody": "gebruik de uitnodigingslink uit uw e-mail. Als de link naar een oud adres ging (e-maildrift), vraag dan een bedrijfsbeheerder om een nieuwe set-wachtwoorduitnodiging naar {email} te sturen.", "auth.login.yourEmail": "uw e-mail", "auth.login.platformAdminsReissue": "Platformbeheerders kunnen opnieuw uitgeven via", - "auth.login.adminUsersLink": "Admin → Gebruikers", + "auth.login.adminUsersLink": "Admin → Gebruikers", "auth.login.haveToken": "Heeft u een token? Open uitnodiging accepteren", "auth.login.noAccount": "Geen account?", "auth.login.createCompany": "Bedrijf aanmaken", @@ -92,15 +92,15 @@ export const nl: MessageDict = { "auth.forgot.title": "Wachtwoord vergeten", "auth.forgot.description": "Voer het e-mailadres van je account in. Als het bij een actief account hoort, sturen we een resetlink.", "auth.forgot.submit": "Resetlink versturen", - "auth.forgot.submitting": "Versturen…", + "auth.forgot.submitting": "Versturen…", "auth.forgot.failed": "Kon geen reset aanvragen", "auth.forgot.sentTitle": "Controleer je e-mail", - "auth.forgot.sentBody": "Als er een account bestaat voor dat adres, is er een resetlink onderweg. De link verloopt over één uur.", + "auth.forgot.sentBody": "Als er een account bestaat voor dat adres, is er een resetlink onderweg. De link verloopt over één uur.", "auth.forgot.backToSignIn": "Terug naar inloggen", "auth.reset.title": "Wachtwoord resetten", "auth.reset.description": "Kies een nieuw wachtwoord voor je Descrybe-account (minstens 8 tekens).", "auth.reset.submit": "Nieuw wachtwoord opslaan", - "auth.reset.submitting": "Opslaan…", + "auth.reset.submitting": "Opslaan…", "auth.reset.failed": "Kon wachtwoord niet resetten", "auth.reset.doneTitle": "Wachtwoord bijgewerkt", "auth.reset.doneDescription": "Log in met je e-mail en nieuwe wachtwoord.", @@ -112,14 +112,14 @@ export const nl: MessageDict = { "auth.reset.requestNewLink": "Nieuwe resetlink aanvragen", "auth.reset.tokenMissing": "Er is geen resetlink opgegeven. Gebruik de link uit je e-mail, of vraag een nieuwe aan.", "auth.reset.tokenInvalid": "Deze resetlink is ongeldig of verlopen. Vraag een nieuwe aan via de pagina wachtwoord vergeten.", - "auth.reset.linkRecognized": "Resetlink herkend. Voer hieronder een nieuw wachtwoord in — het geheim wordt op deze pagina niet getoond.", + "auth.reset.linkRecognized": "Resetlink herkend. Voer hieronder een nieuw wachtwoord in — het geheim wordt op deze pagina niet getoond.", "auth.reset.tokenLabel": "Resettoken", "auth.reset.passwordHint": "Minstens 8 tekens. Geen andere complexiteitsregels.", "auth.register.title": "Bedrijf aanmaken", "auth.register.description": "Registreert een bedrijf en de bijbehorende beheerdersgebruiker.", "auth.register.companyName": "Bedrijfsnaam", "auth.register.submit": "Account aanmaken", - "auth.register.submitting": "Bezig met aanmaken…", + "auth.register.submitting": "Bezig met aanmaken…", "auth.register.failed": "Registratie mislukt", "auth.register.haveAccount": "Heeft u al een account?", "auth.register.signIn": "Inloggen", @@ -127,18 +127,18 @@ export const nl: MessageDict = { "auth.invite.setPasswordTitle": "Wachtwoord instellen", "auth.invite.description": "Stel uw wachtwoord in om toe te treden tot het bedrijf. Uw beheerder heeft Lid (dagelijks werk) of Admin (team en facturering) toegewezen.", "auth.invite.setPasswordDescription": "Kies een wachtwoord voor uw gemigreerde Descrybe-account (minimaal 8 tekens).", - "auth.invite.checking": "Uitnodiging controleren…", + "auth.invite.checking": "Uitnodiging controleren…", "auth.invite.forEmail": "Uitnodiging voor {email}.", - "auth.invite.linkRecognized": "Uitnodigingslink herkend. Voer hieronder een wachtwoord in om door te gaan — het geheim wordt op deze pagina niet getoond.", - "auth.invite.resetLinkRecognized": "Resetlink herkend. Voer hieronder een wachtwoord in om door te gaan — het geheim wordt op deze pagina niet getoond.", + "auth.invite.linkRecognized": "Uitnodigingslink herkend. Voer hieronder een wachtwoord in om door te gaan — het geheim wordt op deze pagina niet getoond.", + "auth.invite.resetLinkRecognized": "Resetlink herkend. Voer hieronder een wachtwoord in om door te gaan — het geheim wordt op deze pagina niet getoond.", "auth.invite.tokenLabel": "Uitnodigingstoken", "auth.invite.resetTokenLabel": "Resettoken", "auth.invite.tokenHelp": "Plak het token uit uw uitnodigingsmail. Het wordt in dit veld gemaskeerd.", "auth.invite.passwordHint": "Minimaal 8 tekens. Geen andere complexiteitsregels.", "auth.invite.submit": "Uitnodiging accepteren", "auth.invite.setPasswordSubmit": "Wachtwoord instellen", - "auth.invite.accepting": "Bezig met accepteren…", - "auth.invite.saving": "Bezig met opslaan…", + "auth.invite.accepting": "Bezig met accepteren…", + "auth.invite.saving": "Bezig met opslaan…", "auth.invite.verifyFailed": "Uitnodiging kon niet worden geverifieerd", "auth.invite.verifySetPasswordFailed": "Set-wachtwoordlink kon niet worden geverifieerd", "auth.invite.acceptFailed": "Uitnodiging kon niet worden geaccepteerd", @@ -146,8 +146,8 @@ export const nl: MessageDict = { "auth.invite.expired": "Deze uitnodiging is ongeldig of verlopen. Vraag uw bedrijfsbeheerder om een nieuwe uitnodiging te sturen en open de nieuwe link (of plak het nieuwe token hieronder).", "auth.invite.setPasswordExpired": "Deze set-wachtwoordlink is ongeldig of verlopen. Vraag een bedrijfs- of platformbeheerder om hem opnieuw uit te geven en open de nieuwe link (of plak het nieuwe token hieronder).", "auth.invite.emailMismatchDefault": "U bent ingelogd met een ander e-mailadres dan deze uitnodiging.", - "auth.invite.expiredFooter": "Verlopen link? Vraag een beheerder om opnieuw uit te geven — er is geen self-service-API voor opnieuw verzenden. Platformbeheerders:", - "auth.invite.adminUsersLink": "Admin → Gebruikers", + "auth.invite.expiredFooter": "Verlopen link? Vraag een beheerder om opnieuw uit te geven — er is geen self-service-API voor opnieuw verzenden. Platformbeheerders:", + "auth.invite.adminUsersLink": "Admin → Gebruikers", "auth.invite.doneTitle": "U bent in het team", "auth.invite.doneSetPasswordTitle": "Wachtwoord opgeslagen", "auth.invite.doneDescription": "Uw account is klaar. Open vervolgens het dashboard om met feeds en producten te werken, of bekijk de bedrijfsinstellingen.", @@ -155,7 +155,7 @@ export const nl: MessageDict = { "auth.invite.openDashboard": "Dashboard openen", "auth.invite.companySettings": "Bedrijfsinstellingen", "auth.invite.goToSignIn": "Naar inloggen", - "auth.invite.afterSignInNote": "Na het inloggen komt u in uw werkruimte — de greenfield-instellingstour wordt overgeslagen.", + "auth.invite.afterSignInNote": "Na het inloggen komt u in uw werkruimte — de greenfield-instellingstour wordt overgeslagen.", "auth.invite.mismatchTitle": "Verkeerd account voor deze uitnodiging", "auth.invite.mismatchDescription": "Deze link is voor een ander e-mailadres dan waarmee u bent ingelogd. Log uit om door te gaan als de uitgenodigde gebruiker, of blijf ingelogd en vraag een beheerder om de uitnodiging opnieuw uit te geven.", "auth.invite.mismatchDetail": "Ingelogd als {session}, maar deze uitnodiging is voor {invite}.", @@ -163,7 +163,7 @@ export const nl: MessageDict = { "auth.invite.switchAccountTitle": "Account wisselen:", "auth.invite.switchAccountBody": "log uit en voltooi dit formulier met het uitgenodigde e-mailadres{emailSuffix}.", "auth.invite.reissueTitle": "Pad voor opnieuw uitgeven:", - "auth.invite.reissueBody": "als uw echte login-e-mail is gewijzigd (e-maildrift), vraag dan een bedrijfsbeheerder om deze uitnodiging in te trekken en een nieuwe te sturen naar het e-mailadres waarmee u inlogt. Platformbeheerders kunnen ook set-wachtwoordlinks opnieuw uitgeven via Admin → Gebruikers.", + "auth.invite.reissueBody": "als uw echte login-e-mail is gewijzigd (e-maildrift), vraag dan een bedrijfsbeheerder om deze uitnodiging in te trekken en een nieuwe te sturen naar het e-mailadres waarmee u inlogt. Platformbeheerders kunnen ook set-wachtwoordlinks opnieuw uitgeven via Admin → Gebruikers.", "locale.switcher": "Interfacetaal", "locale.menu": "Kies interfacetaal", "locale.label": "Dashboardtaal", @@ -197,7 +197,7 @@ export const nl: MessageDict = { "settings.shareAcceptLink": "Acceptatielink delen", "settings.shareAcceptLinkHelp": "Uitgaande e-mail is niet geconfigureerd. Kopieer deze eenmalige link en stuur hem naar de genodigde. Die stelt een wachtwoord in (minimaal 8 tekens) en treedt toe met de rol die u koos.", "settings.acceptLinkLabel": "Eenmalige acceptatie-uitnodigingslink", - "settings.copyLink": "Link kopiëren", + "settings.copyLink": "Link kopiëren", "settings.linkCopied": "Acceptatielink gekopieerd.", "settings.table.email": "E-mail", "settings.table.role": "Rol", @@ -213,11 +213,11 @@ export const nl: MessageDict = { "settings.makeMember": "Lid maken", "settings.removeMember": "Verwijderen", "settings.revokeInvite": "Uitnodiging intrekken", - "settings.needOneAdmin": "Bedrijven hebben minstens één beheerder nodig", + "settings.needOneAdmin": "Bedrijven hebben minstens één beheerder nodig", "settings.expires": "Verloopt op {date}", "settings.invalidEmail": "Voer een geldig e-mailadres in.", - "settings.inviteCreatedNoMail": "Uitnodiging aangemaakt voor {email} als {role}. Kopieer de acceptatielink hieronder en deel hem — uitgaande e-mail is niet geconfigureerd.", - "settings.inviteSent": "Uitnodiging verzonden naar {email} als {role}. Die moet de e-mail openen en accepteren vóór de vervaldatum.", + "settings.inviteCreatedNoMail": "Uitnodiging aangemaakt voor {email} als {role}. Kopieer de acceptatielink hieronder en deel hem — uitgaande e-mail is niet geconfigureerd.", + "settings.inviteSent": "Uitnodiging verzonden naar {email} als {role}. Die moet de e-mail openen en accepteren vóór de vervaldatum.", "settings.inviteFailed": "Uitnodiging kon niet worden verzonden", "settings.revokeConfirm": "Deze uitnodiging intrekken?", "settings.revoked": "Uitnodiging ingetrokken.", @@ -259,8 +259,8 @@ export const nl: MessageDict = { "settings.createApiKeyTitle": "API-sleutel maken", "settings.apiKeyLabel": "API-sleutel", "settings.keyName": "Sleutelnaam", - "settings.storeKeySafe": "Bewaar hem op een veilige plek — u kunt het volledige geheim daarna niet meer bekijken.", - "settings.apiKeysIntro": "Maak een bedrijfs-API-sleutel om de openbare /api/v1-endpoints aan te roepen. Het volledige geheim wordt slechts één keer bij aanmaken getoond — kopieer het meteen.", + "settings.storeKeySafe": "Bewaar hem op een veilige plek — u kunt het volledige geheim daarna niet meer bekijken.", + "settings.apiKeysIntro": "Maak een bedrijfs-API-sleutel om de openbare /api/v1-endpoints aan te roepen. Het volledige geheim wordt slechts één keer bij aanmaken getoond — kopieer het meteen.", "settings.apiKeysUseWhere": "Stuur hem als Authorization: Bearer (voorkeur) of X-API-Key.", "settings.apiKeysDocsLink": "API-authenticatiedocs", "settings.apiKeyOnceWarning": "Dit is de enige keer dat het volledige geheim wordt getoond. Kopieer het nu voordat u dit dialoogvenster sluit.", @@ -269,7 +269,7 @@ export const nl: MessageDict = { "settings.table.lastUsed": "Laatst gebruikt", "dashboard.demoSandbox": "Demo-sandbox", "dashboard.demoEmptyTitle": "Demo-sandbox is leeg", - "dashboard.demoEmptyHint": "Demo-sandbox is leeg — schakel over naar A1 of koppel een feed om echte catalogusstatistieken te zien.", + "dashboard.demoEmptyHint": "Demo-sandbox is leeg — schakel over naar A1 of koppel een feed om echte catalogusstatistieken te zien.", "dashboard.overviewTitle": "Overzicht", "dashboard.quickLinks": "Snelle links", "dashboard.whatsNew": "Wat is nieuw", @@ -285,7 +285,7 @@ export const nl: MessageDict = { "dashboard.trialBadge": "Proef", "dashboard.actions": "Dashboardacties", "dashboard.emptyPaygHint": "Descrybe haalt een catalogus binnen, verrijkt en verwerkt hem, en exporteert of pusht daarna naar winkels. Gebruik Aan de slag hieronder.", - "dashboard.emptyCreditsHint": "Descrybe haalt een catalogus binnen, verrijkt en verwerkt hem, en exporteert of pusht daarna naar winkels. U heeft {credits} — begin met Aan de slag hieronder.", + "dashboard.emptyCreditsHint": "Descrybe haalt een catalogus binnen, verrijkt en verwerkt hem, en exporteert of pusht daarna naar winkels. U heeft {credits} — begin met Aan de slag hieronder.", "dashboard.workflowTitle": "Catalogusworkflow", "dashboard.recentActivity": "Recente activiteit", "dashboard.loadFailed": "Dashboard laden mislukt", @@ -310,11 +310,11 @@ export const nl: MessageDict = { "dashboard.workflow.export": "Exporteren", "dashboard.workflow.exportReady": "Sjablonen & download", "dashboard.workflow.exportMap": "Mappen en exporteren", - "dashboard.workflowHint": "Catalogus in → verrijken / verwerken → exporteren of pushen naar winkels. Ga naar de volgende stap voor {name}.", + "dashboard.workflowHint": "Catalogus in → verrijken / verwerken → exporteren of pushen naar winkels. Ga naar de volgende stap voor {name}.", "dashboard.overviewHint": "Live totalen voor {name}", "dashboard.demoEmptyMessage": "Schakel in de header over naar A1 (of een ander geseeded bedrijf), of koppel hier een feed om deze sandbox te vullen.", "dashboard.emptyTitle": "Haal een catalogus binnen", - "dashboard.emptyMessage": "Catalogus in → verrijken / verwerken → exporteren of pushen naar winkels. Begin met Aan de slag hieronder (of koppel een feed / upload een CSV).", + "dashboard.emptyMessage": "Catalogus in → verrijken / verwerken → exporteren of pushen naar winkels. Begin met Aan de slag hieronder (of koppel een feed / upload een CSV).", "dashboard.connectFeedAnyway": "Feed toch koppelen", "dashboard.connectFeedShort": "Feed koppelen", "dashboard.uploadCsv": "CSV uploaden", @@ -329,13 +329,13 @@ export const nl: MessageDict = { "dashboard.productLimitMessageFull": "De productlimiet van uw {plan}-plan is bereikt. Upgrade om meer te verwerken.", "dashboard.comparePlans": "Plannen vergelijken", "dashboard.viewPlans": "Plannen bekijken", - "dashboard.trialTitle": "Proef · {plan}", + "dashboard.trialTitle": "Proef · {plan}", "dashboard.trialMessageDated": "Proef eindigt op {date}. {credits} credits resterend.", "dashboard.trialMessage": "{credits} credits resterend op uw proef.", "dashboard.lowCreditsTitle": "Credits raken op", "dashboard.lowCreditsMessage": "{remaining} van {total} credits over. Vul aan of upgrade voordat jobs stilvallen.", "dashboard.latestJobs": "Laatste verwerkingsjobs", - "dashboard.noJobsEmpty": "Nog geen jobs — importeer eerst producten.", + "dashboard.noJobsEmpty": "Nog geen jobs — importeer eerst producten.", "dashboard.noJobsReady": "Geen recente jobs. Start er een vanuit Producten wanneer u klaar bent.", "dashboard.startJob": "Job starten vanuit Producten", "dashboard.quickLinksHint": "Feeds, producten, jobs en export.", @@ -344,8 +344,8 @@ export const nl: MessageDict = { "dashboard.jobsMonitor": "Taken monitoren", "dashboard.exportsTemplates": "Sjablonen & download", "activation.title": "Aan de slag", - "activation.description": "Descrybe haalt een catalogus binnen, verrijkt en verwerkt hem, en exporteert of pusht daarna naar winkels. Rond de huidige stap af en ga verder — de demotour legt schermen uit zonder de checklistvoortgang te wijzigen.", - "activation.descriptionShort": "Begin met de gemarkeerde stap hieronder — één actie tegelijk. Winkel koppelen is optioneel.", + "activation.description": "Descrybe haalt een catalogus binnen, verrijkt en verwerkt hem, en exporteert of pusht daarna naar winkels. Rond de huidige stap af en ga verder — de demotour legt schermen uit zonder de checklistvoortgang te wijzigen.", + "activation.descriptionShort": "Begin met de gemarkeerde stap hieronder — één actie tegelijk. Winkel koppelen is optioneel.", "activation.nextCta": "Deze stap doen", "activation.valueProp": "Descrybe haalt een catalogus binnen, verrijkt en verwerkt hem, en exporteert of pusht daarna naar uw winkels.", "activation.alreadyDone": "Al gedaan", @@ -353,11 +353,11 @@ export const nl: MessageDict = { "activation.showAllSteps": "Alle {total} stappen tonen", "activation.showFewerSteps": "Minder stappen tonen", "activation.corePathLabel": "In het kort", - "activation.corePath": "Catalogus in → Verrijken / verwerken → Exporteren of pushen naar winkels", - "activation.storeWizardHint": "Niet nodig voor feeds of exports — sla over tenzij je producten naar een live winkel wilt pushen.", + "activation.corePath": "Catalogus in → Verrijken / verwerken → Exporteren of pushen naar winkels", + "activation.storeWizardHint": "Niet nodig voor feeds of exports — sla over tenzij je producten naar een live winkel wilt pushen.", "activation.storeWizardCta": "Begeleide setup starten", "activation.focus.map": "Volgende: open Map op een feed, koppel kolommen en sla op. Voeg eerst een feed toe als de lijst leeg is.", - "activation.focus.sync": "Volgende: synchroniseer een steekproef na het opslaan van de mapping. Gebruik Sync op een gemapte feed — vermijd ongemapte bronnen.", + "activation.focus.sync": "Volgende: synchroniseer een steekproef na het opslaan van de mapping. Gebruik Sync op een gemapte feed — vermijd ongemapte bronnen.", "activation.focus.dismiss": "Hint sluiten", "activation.dismiss": "Checklist verbergen", "hypercare.report.title": "Cutover-hypercare", @@ -367,22 +367,22 @@ export const nl: MessageDict = { "hypercare.report.adminTriage": "Hypercare-wachtrij openen", "etl.gaps.title": "What did not migrate", - "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", + "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", "etl.gaps.dismiss": "Dismiss", "etl.gaps.apiKeys.title": "API keys", - "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", + "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", "etl.gaps.apiKeys.cta": "Open API keys", "etl.gaps.blobs.title": "File contents (blobs)", - "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", + "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", "etl.gaps.blobs.countHint": "{count} file records are metadata-only (bytes were not migrated).", "etl.gaps.blobs.cta": "Open Files", "etl.gaps.jobs.title": "Processing history", "etl.gaps.jobs.body": "Legacy job and task history was not backfilled for cutover. New jobs you start here will appear normally.", - "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", + "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", "etl.gaps.jobs.migratedHint": "{count} jobs were tagged migrated from an optional backfill.", "etl.gaps.jobs.cta": "Open Processing", "etl.gaps.woo.title": "Store credentials", - "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", + "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", "etl.gaps.woo.cta": "Open Stores", "etl.gaps.settings.title": "Company settings", "etl.gaps.settings.body": "Only language and merge-products settings were imported. Re-check other company preferences in Settings.", @@ -390,7 +390,7 @@ export const nl: MessageDict = { "activation.progress": "{done} van {total} voltooid", "activation.stepsLabel": "Activeringsstappen", "activation.pausedTitle": "Aan de slag is gepauzeerd", - "activation.pausedBody": "Hervat wanneer u wilt — van productvelden tot export. Winkel koppelen blijft optioneel.", + "activation.pausedBody": "Hervat wanneer u wilt — van productvelden tot export. Winkel koppelen blijft optioneel.", "activation.resume": "Checklist hervatten", "activation.step.enable-fields.title": "Productvelden inschakelen", "activation.step.enable-fields.body": "Kies welke standaard productkolommen Descrybe moet mappen en opschonen.", @@ -399,27 +399,27 @@ export const nl: MessageDict = { "activation.step.map.title": "Feedkolommen mappen", "activation.step.map.body": "Open op Feeds Map bij je feed, koppel leverancierskolommen aan Descrybe-velden en sla op.", "activation.step.sync-sample.title": "Een steekproef synchroniseren", - "activation.step.sync-sample.body": "Synchroniseer op Feeds een kleine steekproef van een gemapte feed om de mapping vóór de volledige run te controleren.", + "activation.step.sync-sample.body": "Synchroniseer op Feeds een kleine steekproef van een gemapte feed om de mapping vóór de volledige run te controleren.", "activation.step.process.title": "Producten verwerken", "activation.step.process.body": "Open onverwerkte producten en start verwerking om schone catalogusinhoud te genereren.", "activation.step.store-connect.title": "Koppel een winkel", "activation.step.store-connect.body": "Optioneel. Koppel WooCommerce of Shopify om producten naar je winkel te pushen. Sla over als je alleen feeds en exports gebruikt.", "activation.step.export.title": "Export maken", "activation.step.export.body": "Maak een exportfeed om schone producten als XML of CSV te downloaden of te publiceren.", - "stats.products": "Geïmporteerde producten", - "stats.categories": "Categorieën", + "stats.products": "Geïmporteerde producten", + "stats.categories": "Categorieën", "stats.attributes": "Attributen", "stats.feeds": "Feeds", "stats.credits": "Credits", "stats.openCatalog": "Catalogus openen", - "stats.productsHint": "Catalogus {processed} · wachtrij {unprocessed} (aparte tellingen)", + "stats.productsHint": "Catalogus {processed} · wachtrij {unprocessed} (aparte tellingen)", "stats.catalogTree": "Catalogusboom", "stats.attributeLibrary": "Kenmerkenbibliotheek", "stats.importSources": "Importbronnen", "stats.payAsYouGo": "Pay as you go", - "stats.walletBilling": "Wallet · Facturering", - "stats.enterpriseBilling": "Enterprise · Facturering", - "stats.usedBilling": "{used} gebruikt · Facturering", + "stats.walletBilling": "Wallet · Facturering", + "stats.enterpriseBilling": "Enterprise · Facturering", + "stats.usedBilling": "{used} gebruikt · Facturering", "processing.jobStatus.processing": "Verwerken", "processing.jobStatus.completed": "Voltooid", "processing.jobStatus.failed": "Mislukt", @@ -449,9 +449,9 @@ export const nl: MessageDict = { "errors.readOnly": "Het systeem staat in alleen-lezenmodus. Wijzigingen zijn tijdelijk uitgeschakeld.", "errors.companyAdminDenied": "Alleen bedrijfsbeheerders kunnen {action}. Vraag een beheerder om hulp.", "errors.companyAdminDenied.actionDefault": "dit doen", - "docs.tryIt.memberCannotCreate": "Alleen bedrijfsadmins kunnen API-sleutels maken. Legacy-sleutels zijn niet gemigreerd — plak hieronder een sleutel of vraag een admin om een nieuwe.", - "docs.tryIt.noKeysLegacyAdmin": "Legacy API-sleutels zijn niet gemigreerd. Maak een nieuwe via Use my API key of Instellingen → API-sleutels — het geheim wordt slechts één keer getoond.", - "docs.tryIt.noKeysLegacyMember": "Geen API-sleutels vermeld. Legacy-sleutels niet gemigreerd — vraag een admin er een aan te maken, of plak een dk_-sleutel.", + "docs.tryIt.memberCannotCreate": "Alleen bedrijfsadmins kunnen API-sleutels maken. Legacy-sleutels zijn niet gemigreerd — plak hieronder een sleutel of vraag een admin om een nieuwe.", + "docs.tryIt.noKeysLegacyAdmin": "Legacy API-sleutels zijn niet gemigreerd. Maak een nieuwe via Use my API key of Instellingen → API-sleutels — het geheim wordt slechts één keer getoond.", + "docs.tryIt.noKeysLegacyMember": "Geen API-sleutels vermeld. Legacy-sleutels niet gemigreerd — vraag een admin er een aan te maken, of plak een dk_-sleutel.", "errors.couldNotUpdateLanguage": "Taal kon niet worden bijgewerkt", "toast.support.replyTitle": "Supportantwoord", "toast.support.replyBody": "Medewerkers hebben gereageerd op uw supportticket.", @@ -474,13 +474,13 @@ export const nl: MessageDict = { "tutorial.resumeLastStep": "Laatste stap hervatten", "tutorial.startFromBeginning": "Vanaf het begin starten", "tutorial.stepOf": "Stap {current} van {total}", - "tutorial.jumpTo": "Ga naar…", + "tutorial.jumpTo": "Ga naar…", "tutorial.jumpToSectionAria": "Ga naar sectie", "tutorial.back": "Terug", "tutorial.pause": "Pauzeren", "tutorial.continue": "Doorgaan", "tutorial.finishTour": "Tour afronden", - "tutorial.missingTargetHint": "Die bediening staat nog niet op dit scherm. U kunt toch Doorgaan — de tour vereist nooit opslaan of synchroniseren.", + "tutorial.missingTargetHint": "Die bediening staat nog niet op dit scherm. U kunt toch Doorgaan — de tour vereist nooit opslaan of synchroniseren.", "tutorial.section.welcome": "Welcome", "tutorial.section.catalog": "Catalog setup", "tutorial.section.sources": "Feeds", @@ -490,66 +490,66 @@ export const nl: MessageDict = { "tutorial.section.grow": "Grow", "tutorial.section.done": "Done", "tutorial.step.welcome.title": "Welkom bij Descrybe", - "tutorial.step.welcome.body": "Descrybes kernlus is Feeds → Process → Export / Stores. Deze begeleide demo markeert die schermen op uw echte dashboard — zonder opslaan, synchroniseren, velden inschakelen of feeds maken. Pauzeer wanneer u wilt; hervat via de header. Spring naar een sectie als u alleen bij één onderwerp hulp nodig hebt.", - "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", + "tutorial.step.welcome.body": "Descrybes kernlus is Feeds → Process → Export / Stores. Deze begeleide demo markeert die schermen op uw echte dashboard — zonder opslaan, synchroniseren, velden inschakelen of feeds maken. Pauzeer wanneer u wilt; hervat via de header. Spring naar een sectie als u alleen bij één onderwerp hulp nodig hebt.", + "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", "tutorial.step.welcome.nextLabel": "Start tour", - "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", + "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", "tutorial.step.dashboard-overview.title": "Uw commandocentrum", - "tutorial.step.dashboard-overview.body": "De catalogus-workflowstrook toont het dagelijkse pad: Feeds → Map → Sync → Process. Getting started volgt echte workspace-voortgang (los van deze demo). Wanneer u klaar bent, gebruikt u Manage feeds of Start processing — daarna exporteren of een winkel koppelen.", - "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", + "tutorial.step.dashboard-overview.body": "De catalogus-workflowstrook toont het dagelijkse pad: Feeds → Map → Sync → Process. Getting started volgt echte workspace-voortgang (los van deze demo). Wanneer u klaar bent, gebruikt u Manage feeds of Start processing — daarna exporteren of een winkel koppelen.", + "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", "tutorial.step.dashboard-overview.missingHint": "The workflow strip and checklist appear after the dashboard loads.", "tutorial.step.enable-fields.title": "Standaardvelden", - "tutorial.step.enable-fields.body": "Standard Fields zijn de productkolommen die Descrybe mapt, verwerkt en exporteert — titel, beschrijving, GTIN, afbeeldingen en meer. Enable recommended zet een verstandige standaardset aan voor de meeste catalogi. U kunt de lijst later verfijnen zonder bestaande mappings te breken.", - "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", + "tutorial.step.enable-fields.body": "Standard Fields zijn de productkolommen die Descrybe mapt, verwerkt en exporteert — titel, beschrijving, GTIN, afbeeldingen en meer. Enable recommended zet een verstandige standaardset aan voor de meeste catalogi. U kunt de lijst later verfijnen zonder bestaande mappings te breken.", + "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", "tutorial.step.enable-fields.warning": "Enabling or disabling fields affects mapping and processing for this company. Prefer Enable recommended once, then tweak carefully.", "tutorial.step.enable-fields.missingHint": "Wait for the Fields page to load, or open Fields from the Catalog section in the sidebar.", - "tutorial.step.catalog-depth.title": "Categorieën & attributen", + "tutorial.step.catalog-depth.title": "Categorieën & attributen", "tutorial.step.catalog-depth.body": "In de Catalog-sectie van de zijbalk vindt u ook Categories en Attributes. Categories organiseren de catalogus; attributen voeden filters en gestructureerde beschrijvingen. U hoeft ze niet te configureren om deze tour af te ronden.", - "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", + "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", "tutorial.step.catalog-depth.missingHint": "Expand Catalog in the sidebar to open Categories or Attributes after the tour.", "tutorial.step.connect-source.title": "Een productbron toevoegen", - "tutorial.step.connect-source.body": "Feeds brengen leverancierscatalogi in Descrybe — CSV-, XML- of URL-bestanden. Add Feed maakt een nieuwe bron; elke rij toont de status (klaar voor mapping, gemapt, actief). Map opent het veldkoppelingsscherm voor die feed.", - "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", + "tutorial.step.connect-source.body": "Feeds brengen leverancierscatalogi in Descrybe — CSV-, XML- of URL-bestanden. Add Feed maakt een nieuwe bron; elke rij toont de status (klaar voor mapping, gemapt, actief). Map opent het veldkoppelingsscherm voor die feed.", + "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", "tutorial.step.connect-source.warning": "Avoid deleting live feeds unless you intend to remove that source and its sync history.", - "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", + "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", "tutorial.step.map.title": "Bronvelden mappen", "tutorial.step.map.body": "Op het Map-scherm van een feed koppelt u leverancierskolommen aan Descrybe-standard fields. Auto-map stelt matches voor op basis van kolomnamen; bevestig vage matches en corrigeer wat fout is. Save Mappings slaat de map op zodat sync en verwerking elke rij kunnen lezen.", - "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", - "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", + "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", + "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", "tutorial.step.map.missingHint": "Add a feed and click Map to see the mapping UI; or Continue to keep learning.", "tutorial.step.sync-sample.title": "Een steekproef synchroniseren (wanneer klaar)", - "tutorial.step.sync-sample.body": "Na opgeslagen mappings haalt Sync + Process sample een kleine batch op en start verwerking zodat u titels, afbeeldingen en attributen kunt controleren vóór een volledige run. Full Sync now op de feedlijst is voor grotere imports zodra de steekproef goed lijkt.", - "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", + "tutorial.step.sync-sample.body": "Na opgeslagen mappings haalt Sync + Process sample een kleine batch op en start verwerking zodat u titels, afbeeldingen en attributen kunt controleren vóór een volledige run. Full Sync now op de feedlijst is voor grotere imports zodra de steekproef goed lijkt.", + "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", "tutorial.step.sync-sample.warning": "Syncing writes products into this company. Prefer a sample first; avoid Sync now on unmapped feeds.", "tutorial.step.sync-sample.missingHint": "Sync controls appear on feed rows and on the mapping screen footer.", "tutorial.step.process.title": "Producten bekijken", - "tutorial.step.process.body": "Products toont gesynchroniseerde en verwerkte catalogusitems. Filter op status, open een rij voor details en gebruik EPREL-badges wanneer energielabelgegevens bestaan. Hier spot u mappingfouten vóór export of winkelsync.", - "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", + "tutorial.step.process.body": "Products toont gesynchroniseerde en verwerkte catalogusitems. Filter op status, open een rij voor details en gebruik EPREL-badges wanneer energielabelgegevens bestaan. Hier spot u mappingfouten vóór export of winkelsync.", + "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", "tutorial.step.process.missingHint": "Wait for the products table, or Continue if the catalog is still empty.", "tutorial.step.processing-hub.title": "Achtergrondverwerking", "tutorial.step.processing-hub.body": "Jobs onder Processing tonen AI- en pipelinevoortgang: voltooide runs en fouten. Start jobs vanaf dashboard of producten wanneer u bewust credits aan een batch wilt besteden.", - "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", + "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", "tutorial.step.processing-hub.missingHint": "Open Jobs from the Processing section in the sidebar if the page is empty.", "tutorial.step.stores-hub.title": "Winkels & platforms", - "tutorial.step.stores-hub.body": "Na verwerking verbindt Stores WooCommerce of Shopify om schone catalogusdata naar uw winkel te pushen. Gebruik dit wanneer marketplace/CMS de bestemming is — of ga naar Export feeds als partners alleen bestand/URL nodig hebben.", - "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", + "tutorial.step.stores-hub.body": "Na verwerking verbindt Stores WooCommerce of Shopify om schone catalogusdata naar uw winkel te pushen. Gebruik dit wanneer marketplace/CMS de bestemming is — of ga naar Export feeds als partners alleen bestand/URL nodig hebben.", + "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", "tutorial.step.stores-hub.missingHint": "Open Stores from the sidebar to see connection cards.", "tutorial.step.export.title": "Schone producten exporteren", - "tutorial.step.export.body": "Export feeds publiceren schone producten als XML of CSV voor kanalen, partners of uw winkel. Maak een export, kies formaat en filters, deel daarna de feed-URL of download. Exports lezen verwerkte catalogusgegevens — map en verwerk eerst voor de beste resultaten.", - "tutorial.step.export.tip": "You don’t need to create an export during the demo.", - "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", + "tutorial.step.export.body": "Export feeds publiceren schone producten als XML of CSV voor kanalen, partners of uw winkel. Maak een export, kies formaat en filters, deel daarna de feed-URL of download. Exports lezen verwerkte catalogusgegevens — map en verwerk eerst voor de beste resultaten.", + "tutorial.step.export.tip": "You don’t need to create an export during the demo.", + "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", "tutorial.step.export.missingHint": "Wait for Export feeds to load, or open Exports from the Feeds section in the sidebar.", "tutorial.step.billing-hub.title": "Credits & facturering", - "tutorial.step.billing-hub.body": "Billing toont uw plan, wallet en resterende credits. Verwerking en sommige AI-functies putten uit dit saldo. Houd het gebruik in de gaten vóór grote catalogusruns.", - "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", + "tutorial.step.billing-hub.body": "Billing toont uw plan, wallet en resterende credits. Verwerking en sommige AI-functies putten uit dit saldo. Houd het gebruik in de gaten vóór grote catalogusruns.", + "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", "tutorial.step.billing-hub.missingHint": "Open Billing from the Account section in the sidebar.", "tutorial.step.grow-hub.title": "Campagnes, SEO & reviews", - "tutorial.step.grow-hub.body": "Onder Marketing: Campaigns genereert content, Content calendar plant posts, SEO controleert listings en Reviews koppelt aan WooCommerce. Ze bouwen op een gezond gemapte catalogus — rond Feeds → Process → Export / Stores af voordat u erop leunt.", - "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", + "tutorial.step.grow-hub.body": "Onder Marketing: Campaigns genereert content, Content calendar plant posts, SEO controleert listings en Reviews koppelt aan WooCommerce. Ze bouwen op een gezond gemapte catalogus — rond Feeds → Process → Export / Stores af voordat u erop leunt.", + "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", "tutorial.step.grow-hub.missingHint": "Open Campaigns from Marketing in the sidebar, or Continue.", "tutorial.step.tour-done.title": "Klaar om te verkennen", - "tutorial.step.tour-done.body": "Dat is de productkaart: Feeds → Map → Sync → Process → Export / Stores. Gebruik Getting started op het dashboard voor echte setup. Hervat of herstart deze tour via de header, of Jump to… een sectie. Skip tour beëindigt de demo zonder checklistwijziging.", - "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", + "tutorial.step.tour-done.body": "Dat is de productkaart: Feeds → Map → Sync → Process → Export / Stores. Gebruik Getting started op het dashboard voor echte setup. Hervat of herstart deze tour via de header, of Jump to… een sectie. Skip tour beëindigt de demo zonder checklistwijziging.", + "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", "tutorial.step.tour-done.nextLabel": "Finish tour", "tutorial.step.tour-done.missingHint": "Return to the dashboard to finish.", "news.uxImprovements.title": "Verbeteringen in gebruikerservaring", @@ -595,7 +595,7 @@ export const nl: MessageDict = { "admin.sales.description": "Inbound Contact sales messages and custom payment quotes.", "admin.sales.listTitle": "Leads", "admin.sales.listDesc": "{total} matching leads", - "admin.sales.searchPlaceholder": "Search name, email, company…", + "admin.sales.searchPlaceholder": "Search name, email, company…", "admin.sales.statusAll": "All statuses", "admin.sales.status.new": "New", "admin.sales.status.contacted": "Contacted", @@ -643,7 +643,7 @@ export const nl: MessageDict = { "admin.sales.col.status": "Status", "admin.sales.col.created": "Created", "sales.contact.title": "Contact sales", - "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", + "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", "sales.contact.formTitle": "Send a message", "sales.contact.formLead": "Enterprise and custom deals are prepared by our team, then paid via Stripe Checkout.", "sales.contact.name": "Name", @@ -653,25 +653,25 @@ export const nl: MessageDict = { "sales.contact.estimatedSkus": "Estimated SKUs (optional)", "sales.contact.message": "How can we help?", "sales.contact.submit": "Send message", - "sales.contact.submitting": "Sending…", + "sales.contact.submitting": "Sending…", "sales.contact.error": "Could not send your message. Please try again.", - "sales.contact.toast.success": "Message sent — we will follow up soon.", - "sales.contact.thanksTitle": "Thanks — we got your message", + "sales.contact.toast.success": "Message sent — we will follow up soon.", + "sales.contact.thanksTitle": "Thanks — we got your message", "sales.contact.thanksBody": "A platform admin will review your request and can send a Checkout link for a custom plan.", "sales.contact.bookDemo": "Book a live demo", "sales.contact.orBookDemo": "Or book a Calendly demo", "sales.contact.backPricing": "Back to pricing", "admin.overview.eyebrow": "Commandocentrum", "admin.overview.title": "Platformoverzicht", - "admin.overview.description": "Live platformpuls uit analysesamenvatting — spring naar ops, inzicht en support.", + "admin.overview.description": "Live platformpuls uit analysesamenvatting — spring naar ops, inzicht en support.", "admin.overview.tokens": "Tokengebruik", - "admin.overview.tokensHint": "Altijd · periode", + "admin.overview.tokensHint": "Altijd · periode", "admin.overview.credits": "Credits", "admin.overview.creditsHint": "Over alle bedrijven", "admin.overview.jobs": "Jobs", "admin.overview.jobsHint": "Wachtrijsnapshot", "admin.overview.platform": "Platform", - "admin.overview.platformHint": "Tenants · volume", + "admin.overview.platformHint": "Tenants · volume", "admin.overview.signals": "Recente signalen", "admin.overview.shortcuts": "Ops-snelkoppelingen", "admin.overview.providers": "AI-provider-mix", @@ -695,11 +695,11 @@ export const nl: MessageDict = { "admin.overview.shortcut.stuck.desc": "Langer dan 2 uur actief", "admin.overview.signal.stuckTitle": "{count} vastgelopen taak", "admin.overview.signal.stuckTitlePlural": "{count} vastgelopen taken", - "admin.overview.signal.stuckDetail": "Langer dan 2 uur actief — controleer en reset indien nodig.", + "admin.overview.signal.stuckDetail": "Langer dan 2 uur actief — controleer en reset indien nodig.", "admin.overview.signal.stuckCta": "Vastgelopen taken openen", "admin.overview.signal.failedTitle": "{count} mislukt in de laatste {days} d", "admin.overview.signal.failedDetail": "{completed} voltooid in hetzelfde venster.", - "admin.overview.signal.failedDetailRate": "{rate}% foutpercentage · {completed} voltooid.", + "admin.overview.signal.failedDetailRate": "{rate}% foutpercentage · {completed} voltooid.", "admin.overview.signal.failedCta": "Diagnostiek openen", "admin.overview.signal.runningTitle": "{count} taak actief", "admin.overview.signal.runningTitlePlural": "{count} taken actief", @@ -718,21 +718,21 @@ export const nl: MessageDict = { "admin.overview.badge.clear": "Wissen", "admin.overview.summaryLoadFailed": "Livesamenvatting laden mislukt. Snelkoppelingen hieronder werken nog.", "admin.overview.keyMetrics": "Kernstatistieken", - "admin.overview.summaryWindow": "Laatste {days} d · samenvatting-endpoint", + "admin.overview.summaryWindow": "Laatste {days} d · samenvatting-endpoint", "admin.overview.tokensPeriod": "{count} in de laatste {days} d", "admin.overview.creditsFoot": "{remaining} resterend van {allocated} toegewezen", - "admin.overview.jobsFoot": "{failed} mislukt · {running} actief · {stuck} vastgelopen", - "admin.overview.platformFoot": "{users} gebruikers · {processed} verwerkt · {feeds} inputfeeds", + "admin.overview.jobsFoot": "{failed} mislukt · {running} actief · {stuck} vastgelopen", + "admin.overview.platformFoot": "{users} gebruikers · {processed} verwerkt · {feeds} inputfeeds", "admin.overview.fullDiagnostics": "Volledige diagnostiek", "admin.overview.also": "Ook:", "admin.overview.linkSupport": "Support-desk", "admin.overview.charts": "Grafieken", - "admin.overview.providerFoot": "{jobs} jobs · {products} producten", + "admin.overview.providerFoot": "{jobs} jobs · {products} producten", "admin.analytics.eyebrow": "Inzicht", "admin.analytics.title": "Analytics en rapportage", "admin.analytics.description": "Live KPI's en trends van het platform uit tokens, taken, aanmeldingen, feeds, tickets en facturering.", "admin.analytics.period": "Periode", - "admin.analytics.refreshing": "Vernieuwen…", + "admin.analytics.refreshing": "Vernieuwen…", "admin.analytics.llmTokens": "LLM-tokens", "admin.analytics.credits": "Credits", "admin.analytics.jobs": "Jobs", @@ -744,7 +744,7 @@ export const nl: MessageDict = { "admin.analytics.internalAi": "Interne AI", "admin.analytics.internalAiHint": "Platform-OpenAI (admin-instellingen)", "admin.analytics.popularKeys": "Populaire sleutels", - "admin.analytics.popularKeysHint": "Tenant-OpenAI / Groq / …", + "admin.analytics.popularKeysHint": "Tenant-OpenAI / Groq / …", "admin.analytics.customUrl": "Aangepaste URL/model", "admin.analytics.customUrlHint": "Tenant-basis-URL + model + sleutel", "admin.analytics.tokensByDay": "Tokens per dag", @@ -802,20 +802,20 @@ export const nl: MessageDict = { "admin.users.colCredits": "Credits", "admin.users.colLanguage": "Taal", "admin.users.assignPlan": "Plan toewijzen", - "admin.users.cloneCatalog": "Kopiëren naar mijn bedrijf", - "admin.users.cloneCatalogAria": "Catalogus van {name} naar je sandboxbedrijf kopiëren", - "admin.users.cloneCatalogTitle": "Bedrijfscatalogus kopiëren", + "admin.users.cloneCatalog": "Kopiëren naar mijn bedrijf", + "admin.users.cloneCatalogAria": "Catalogus van {name} naar je sandboxbedrijf kopiëren", + "admin.users.cloneCatalogTitle": "Bedrijfscatalogus kopiëren", "admin.users.cloneCatalogDesc": "Je blijft op je admin-account. Brongegevens worden niet gewijzigd.", "admin.users.cloneCatalogFrom": "Bron: {name}", "admin.users.cloneCatalogInto": "Bestemming: {name}", - "admin.users.cloneCatalogWarning": "Vervangt categorieën, feeds, producten, attributen, mappings en merk op de bestemming. Plan, facturatie, leden, API-sleutels en store-connectors worden niet gekopieerd.", + "admin.users.cloneCatalogWarning": "Vervangt categorieën, feeds, producten, attributen, mappings en merk op de bestemming. Plan, facturatie, leden, API-sleutels en store-connectors worden niet gekopieerd.", "admin.users.cloneCatalogCancel": "Annuleren", - "admin.users.cloneCatalogConfirm": "Catalogus kopiëren", + "admin.users.cloneCatalogConfirm": "Catalogus kopiëren", "admin.users.cloneDestFallback": "je sandboxbedrijf", "admin.users.fixA1": "A1-catalogus repareren", - "admin.users.fixA1Aria": "AI-prompts, categorieën en enhance-hashes voor {name} repareren", + "admin.users.fixA1Aria": "AI-prompts, categorieën en enhance-hashes voor {name} repareren", "admin.users.fixA1Title": "Bedrijfscatalogus repareren", - "admin.users.fixA1Desc": "Past gecorrigeerde AI-prompts opnieuw toe, wist zwakke enhance-hashes en vult categorieën bij vanuit mapped_data.", + "admin.users.fixA1Desc": "Past gecorrigeerde AI-prompts opnieuw toe, wist zwakke enhance-hashes en vult categorieën bij vanuit mapped_data.", "admin.users.fixA1Company": "Bedrijf: {name}", "admin.users.fixA1Warning": "Geef voorkeur aan Platform Demo of een expliciet bedrijf. Verwijdert geen feeds, mappings of ruwe producten. Beschermt A1-cohort-overschrijfregels.", "admin.users.fixA1Cancel": "Annuleren", @@ -842,7 +842,7 @@ export const nl: MessageDict = { "admin.settings.mailCardDesc": "Uitnodigingen voor wachtwoord instellen en uitgaande platformmail", "admin.settings.integrationsCardDesc": "OAuth, EPREL, Pinecone, Stripe, feeds", "admin.settings.tenantVsPlatform": "Tenant vs platform", - "admin.settings.hostSecrets": "Serverdatabase-, sessie- en ondertekeningsgeheimen — alleen op de host configureren", + "admin.settings.hostSecrets": "Serverdatabase-, sessie- en ondertekeningsgeheimen — alleen op de host configureren", "admin.settings.linkAi": "AI", "admin.settings.linkEmail": "E-mailadres", "admin.settings.linkBilling": "Facturering", @@ -879,7 +879,7 @@ export const nl: MessageDict = { "admin.settings.priceScaleMo": "Scale monthly price ID", "admin.settings.priceScaleYr": "Scale yearly price ID", "admin.settings.creditPackPrices": "AI credit pack price IDs (one-time)", - "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", + "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", "admin.settings.syncCreditPacks": "Sync Stripe packs", "admin.settings.syncCreditPacksOk": "Synced {count} credit pack price(s) ({mode} mode).", "admin.settings.syncCreditPacksModeHint": "Stripe mode for this sync: {mode}. Switch the secret key (sk_test_ vs sk_live_) to sync the other environment.", @@ -888,7 +888,7 @@ export const nl: MessageDict = { "admin.settings.pricePackMedium": "Growth pack (2,000 credits) price ID", "admin.settings.pricePackLarge": "Catalog pack (10,000 credits) price ID", "admin.settings.pricePackXL": "Scale pack (40,000 credits) price ID", - "admin.settings.feedAllowlist": "Allowlist voor privé-feed-URL's", + "admin.settings.feedAllowlist": "Allowlist voor privé-feed-URL's", "admin.settings.allowlist": "Allowlist", "admin.settings.platformAdmins": "Platformbeheerders", "admin.settings.colUserId": "Gebruikers-ID", @@ -901,7 +901,7 @@ export const nl: MessageDict = { "admin.settings.adminStatusCheck": "Admin-statuscontrole", "admin.settings.bootstrapPage": "bootstrap-pagina", "admin.readiness.title": "Cutover-gereedheid", - "admin.readiness.detail": "Hypercare-tellingen die nog aandacht nodig hebben vóór de DNS-switch.", + "admin.readiness.detail": "Hypercare-tellingen die nog aandacht nodig hebben vóór de DNS-switch.", "admin.readiness.mustSetPassword": "{count} gebruikers moeten een wachtwoord instellen", "admin.readiness.withoutAdmin": "{count} bedrijven zonder admin", "admin.readiness.withoutPlan": "{count} bedrijven zonder actief abonnement", @@ -917,7 +917,7 @@ export const nl: MessageDict = { "admin.diagnostics.filterAria": "Taakstatusfilter", "admin.diagnostics.queue": "Wachtrij", "admin.diagnostics.noJobsInQueue": "Geen taken in de wachtrij.", - "admin.diagnostics.sanitizedErrors": "Geschoonde fouten · max 25", + "admin.diagnostics.sanitizedErrors": "Geschoonde fouten · max 25", "admin.diagnostics.colId": "ID", "admin.diagnostics.colCompany": "Bedrijf", "admin.diagnostics.colStatus": "Statuslabel", @@ -932,11 +932,11 @@ export const nl: MessageDict = { "admin.stuck.noJobs": "Geen taken gevonden.", "admin.stuck.filterAria": "Taken filteren op status", "admin.orphan.title": "Orphan processed", - "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", + "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", "admin.orphan.cutoverHint": "Safe by default: refresh and dry-run never delete. Confirm delete sends confirm=true only after you approve the dialog.", "admin.orphan.refreshReport": "Refresh report", "admin.orphan.dryRunBtn": "Dry-run cleanup", - "admin.orphan.deleteBtn": "Confirm delete…", + "admin.orphan.deleteBtn": "Confirm delete…", "admin.orphan.loadFailed": "Could not load orphan report", "admin.orphan.dryRunFailed": "Dry-run cleanup failed", "admin.orphan.deleteFailed": "Confirmed orphan cleanup failed", @@ -947,7 +947,7 @@ export const nl: MessageDict = { "admin.orphan.samplesDesc": "Up to 25 most recently updated orphan catalog rows", "admin.orphan.cleanBadge": "Clean", "admin.orphan.needsCleanupBadge": "Needs cleanup", - "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", + "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", "admin.orphan.noSamples": "No sample rows in this report.", "admin.orphan.colProcessed": "Processed ID", "admin.orphan.colCompany": "Company", @@ -970,15 +970,15 @@ export const nl: MessageDict = { "admin.billing.assignPlanDesc": "Koppel een factureringsplan aan een bedrijf. Optionele proefcredits zetten het bedrijfssaldo voor de proefperiode terug.", "admin.billing.creditsTitle": "Credits toevoegen / aanpassen", "admin.billing.creditsDesc": "Het saldo van een bedrijf crediteren of debiteren.", - "admin.billing.searchCompany": "Bedrijf zoeken…", + "admin.billing.searchCompany": "Bedrijf zoeken…", "admin.knowledge.draft": "Concept", "admin.knowledge.badge.draft": "Concept", "admin.knowledge.newArticle": "Nieuw artikel", "admin.knowledge.editArticle": "Artikel bewerken", "admin.knowledge.noMatchingArticles": "Geen passende artikelen", "admin.knowledge.noArticles": "Geen kennisartikelen", - "admin.knowledge.emptyCategoryMsg": "Categorie “{category}” is klaar — voeg een artikelshell toe die een contentagent vult.", - "admin.knowledge.emptyArticlesMsg": "Voeg FAQ-achtige shells toe met categorieën en trefwoorden. Laat placeholders in de body voor contentagents.", + "admin.knowledge.emptyCategoryMsg": "Categorie “{category}” is klaar — voeg een artikelshell toe die een contentagent vult.", + "admin.knowledge.emptyArticlesMsg": "Voeg FAQ-achtige shells toe met categorieën en trefwoorden. Laat placeholders in de body voor contentagents.", "admin.knowledge.col.title": "Titel", "admin.knowledge.col.name": "Naam", "admin.knowledge.edit": "Bewerken", @@ -988,7 +988,7 @@ export const nl: MessageDict = { "admin.settings.enablePlatformSmtp": "Platform-SMTP inschakelen", "admin.plans.title": "Abonnementsplannen", "admin.plans.description": "Openenbaar ladder, A1 / Legacy, Platform Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Verborgen.", - "admin.plans.searchPlaceholder": "Zoek naam of beschrijving…", + "admin.plans.searchPlaceholder": "Zoek naam of beschrijving…", "admin.plans.searchAria": "Plannen zoeken", "admin.plans.filterAria": "Filter plannen op zichtbaarheid", "admin.plans.filter.catalog": "Catalogus", @@ -1015,9 +1015,9 @@ export const nl: MessageDict = { "admin.plans.permissionsAria": "Bewerken planrechten for {name}", "admin.plans.showing": "{filtered} van {total} abonnementen weergegeven", "admin.plans.unlimited": "Onbeperkt", - "admin.plans.optionLabel": "{name} ({credits} credits) · {kind}", + "admin.plans.optionLabel": "{name} ({credits} credits) · {kind}", "admin.permissions.noteStrong": "Alleen abonnementsrechten.", - "admin.permissions.noteBody": "These toggles set what this package may include. Platform-wide on/uit masters are on the {global} tab — a plan can enable a feature that still stays uit when the platform switch is uitgeschakeld.", + "admin.permissions.noteBody": "These toggles set what this package may include. Platform-wide on/uit masters are on the {global} tab — a plan can enable a feature that still stays uit when the platform switch is uitgeschakeld.", "admin.permissions.globalTab": "Globale schakelaars", "admin.permissions.title": "Planrechten", "admin.permissions.descCount": "{enabled}/{total} ingeschakeld", @@ -1026,7 +1026,7 @@ export const nl: MessageDict = { "admin.permissions.planDefaults": "planstandaarden", "admin.permissions.badge.legacy": "Gemigreerd legacy-pakket", "admin.permissions.badge.publicLadder": "Openenbaar ladder", - "admin.permissions.badge.ladderCustom": "Openenbaar ladder · aangepast flag", + "admin.permissions.badge.ladderCustom": "Openenbaar ladder · aangepast flag", "admin.permissions.badge.customDeal": "Aangepast deal", "admin.permissions.badge.clientDeal": "Klantafspraak", "admin.permissions.badge.customOverrides": "Aangepast overrides", @@ -1034,9 +1034,9 @@ export const nl: MessageDict = { "admin.permissions.badge.customFlag": "Aangepast flag", "admin.permissions.package": "Pakket", "admin.permissions.noPlans": "Geen plannen", - "admin.permissions.suffix.legacy": "· legacy", - "admin.permissions.suffix.default": " · standaard", - "admin.permissions.suffix.custom": " · aangepast", + "admin.permissions.suffix.legacy": "· legacy", + "admin.permissions.suffix.default": " · standaard", + "admin.permissions.suffix.custom": " · aangepast", "admin.permissions.section": "Sectie", "admin.permissions.allSections": "Alle secties", "admin.permissions.state": "Status", @@ -1074,9 +1074,9 @@ export const nl: MessageDict = { "admin.profile.legacy.label": "Legacy", "admin.profile.legacy.description": "Migrated legacy navigation: catalog, feeds, facturering, and instellingen; no Terugground Tasks, winkels, or marketing.", "admin.profile.free.label": "Gratis", - "admin.profile.free.description": "Openenbaar Free ladder — AI, API-sleutels, live email, and own-key AI uit.", + "admin.profile.free.description": "Openenbaar Free ladder — AI, API-sleutels, live email, and own-key AI uit.", "admin.profile.starter.label": "Starter", - "admin.profile.starter.description": "Openenbaar Starter — AI on; own-key AI uit.", + "admin.profile.starter.description": "Openenbaar Starter — AI on; own-key AI uit.", "admin.profile.growth.label": "Growth", "admin.profile.growth.description": "Alle catalogusfuncties aan.", "admin.profile.business.label": "Business", @@ -1101,7 +1101,7 @@ export const nl: MessageDict = { "admin.gates.noMatch": "Geen functies komen overeen met de huidige filters.", "admin.gates.featureAria": "{label} globaal", "admin.gates.sectionsTitle": "Globale sectieschakelaars", - "admin.gates.sectionsDesc": "Turn an entire product area on or uit for all packages. “Sectie + features” also updates every feature master in that section.", + "admin.gates.sectionsDesc": "Turn an entire product area on or uit for all packages. “Sectie + features” also updates every feature master in that section.", "admin.gates.sectionAria": "Globale sectie {label}", "admin.gates.enableSectionFeatures": "Sectie + functies inschakelen", "admin.gates.disableSectionFeatures": "Sectie + functies uitschakelen", @@ -1116,7 +1116,7 @@ export const nl: MessageDict = { "admin.billing.createPlan": "Plan maken", "admin.billing.assignPlanBtn": "Plan toewijzen", "admin.billing.stat.plans": "Plannen", - "admin.billing.stat.catalogHidden": "{catalog} catalogus · {hidden} verborgen", + "admin.billing.stat.catalogHidden": "{catalog} catalogus · {hidden} verborgen", "admin.billing.stat.creditsAllocated": "Toegewezen credits", "admin.billing.stat.acrossCompanies": "Across bedrijven on this page (first 50)", "admin.billing.stat.creditsUsed": "Gebruikte credits", @@ -1131,7 +1131,7 @@ export const nl: MessageDict = { "admin.billing.cyclesDesc": "Process due renewals for bedrijven on scheduled factureringscycli.", "admin.billing.runCycles": "Run due factureringscycli", "admin.billing.companiesTitle": "Bedrijven", - "admin.billing.companiesDesc": "Creditsaldi en abonnementsstatus — wijs abonnementen toe of pas credits aan.", + "admin.billing.companiesDesc": "Creditsaldi en abonnementsstatus — wijs abonnementen toe of pas credits aan.", "admin.billing.searchCompaniesAria": "Zoeken bedrijven", "admin.billing.planStatusAria": "Planstatus", "admin.billing.filter.all": "Alles bedrijven", @@ -1164,11 +1164,11 @@ export const nl: MessageDict = { "admin.billing.term.monthly": "Maandelijks", "admin.billing.term.yearly": "Jaarlijks", "admin.billing.customPackage": "Aangepast package", - "admin.billing.customPackageHint": "Verborgen from public pricing. Use for client deals; leave uit for Free–Business.", + "admin.billing.customPackageHint": "Verborgen from public pricing. Use for client deals; leave uit for Free–Business.", "admin.billing.previewBadge": "Voorbeeldbadge: {preview}.", "admin.billing.company": "Bedrijf", "admin.billing.selectCompany": "Selecteren bedrijf", - "admin.billing.noPlanSuffix": "· no plan", + "admin.billing.noPlanSuffix": "· no plan", "admin.billing.plan": "Abonnement", "admin.billing.selectPlan": "Plan selecteren", "admin.billing.trialAssignment": "Proeftoewijzing", @@ -1194,7 +1194,7 @@ export const nl: MessageDict = { "admin.knowledge.allStatuses": "Alles statuses", "admin.knowledge.published": "Gepubliceerd", "admin.knowledge.createArticle": "Aanmaken article", - "admin.knowledge.col.categories": "Categorieën", + "admin.knowledge.col.categories": "Categorieën", "admin.knowledge.col.status": "Statuslabel", "admin.knowledge.col.keywords": "Trefwoorden", "admin.knowledge.badge.published": "Gepubliceerd", @@ -1219,7 +1219,7 @@ export const nl: MessageDict = { "admin.knowledge.notReadyBadge": "Niet gereed", "admin.knowledge.enabled": "Ingeschakeld", "admin.knowledge.disabled": "Uitgeschakeld", - "admin.knowledge.openAiRoles": "Openen Platform instellingen → AI roles", + "admin.knowledge.openAiRoles": "Openen Platform instellingen → AI roles", "admin.knowledge.field.title": "Titel", "admin.knowledge.field.slug": "Slug", "admin.knowledge.field.body": "Body (markdown)", @@ -1228,16 +1228,16 @@ export const nl: MessageDict = { "admin.knowledge.field.intents": "Intent-sleutels", "admin.knowledge.intentsPlaceholder": "kommagescheiden", "admin.knowledge.field.categories": "Categorie slugs", - "admin.knowledge.categoriesPlaceholder": "facturering, account…", + "admin.knowledge.categoriesPlaceholder": "facturering, account…", "admin.knowledge.field.weight": "Prioriteitsgewicht", "admin.knowledge.publishedEligible": "Gepubliceerd (geschikt voor matching)", "admin.knowledge.field.name": "Naam", "admin.knowledge.field.templateBody": "Tekst", "admin.knowledge.active": "Actief", "admin.settings.card.aiRolesTitle": "Platform-AI-rollen", - "admin.settings.card.aiRolesDesc": "Verwerking, vectorization, docs/API, and ondersteuning — separate keys/models", + "admin.settings.card.aiRolesDesc": "Verwerking, vectorization, docs/API, and ondersteuning — separate keys/models", "admin.settings.roleOff": " (uit)", - "admin.settings.roleNotSet": "· not set", + "admin.settings.roleNotSet": "· not set", "admin.settings.someRolesUnavailable": "Some AI roles are not beschikbaar on this deployment yet. Verwerking still uses the platform OpenenAI instellingen until all roles are ondersteuninged.", "admin.settings.configure": "Configureren", "admin.settings.card.smtpTitle": "Platform-SMTP", @@ -1246,7 +1246,7 @@ export const nl: MessageDict = { "admin.settings.source": "bron: {source}", "admin.settings.smtpEnabled": "SMTP ingeschakeld", "admin.settings.smtpDisabled": "SMTP uitgeschakeld", - "admin.settings.passwordSet": "· password set", + "admin.settings.passwordSet": "· password set", "admin.settings.card.otherTitle": "Overige integraties", "admin.settings.oauthSet": "Google OAuth ingesteld", "admin.settings.oauthOff": "Google OAuth uit", @@ -1257,9 +1257,9 @@ export const nl: MessageDict = { "admin.settings.stripeSet": "Stripe ingesteld", "admin.settings.stripeOff": "Stripe uit", "admin.settings.password": "Wachtwoord", - "admin.settings.passwordSavedHint": "(opgeslagen — leave blank to keep)", + "admin.settings.passwordSavedHint": "(opgeslagen — leave blank to keep)", "admin.settings.secretKey": "Geheime sleutel", - "admin.settings.secretConfiguredHint": "(geconfigureerd — leeg laten om te behouden)", + "admin.settings.secretConfiguredHint": "(geconfigureerd — leeg laten om te behouden)", "admin.settings.passwordConfigured": "Wachtwoord configured", "admin.settings.noSmtpPassword": "Geen SMTP-wachtwoord", "admin.settings.enabled": "Ingeschakeld", @@ -1273,7 +1273,7 @@ export const nl: MessageDict = { "admin.settings.testAccepted": "Testbericht geaccepteerd door SMTP", "admin.stuck.cleanupBtn": "Vastgelopen jobs opruimen (>2 u bezig)", "admin.stuck.jobsTitle": "Verwerkingsjobs", - "admin.stuck.jobsDesc": "Laatste 100 jobs · {running} momenteel bezig", + "admin.stuck.jobsDesc": "Laatste 100 jobs · {running} momenteel bezig", "admin.stuck.filterAll": "Alles", "admin.stuck.filterRunning": "Actief", "admin.stuck.filterFailed": "Mislukt", @@ -1289,8 +1289,8 @@ export const nl: MessageDict = { "admin.stuck.cleanupFailed": "Opruimen mislukt", "admin.support.knowledgeLink": "Kennis & auto-antwoord", "admin.support.queueTitle": "Ticketwachtrij", - "admin.support.queueMeta": "{total} · bereik {scope}", - "admin.support.queueMetaStatus": "· status {status}", + "admin.support.queueMeta": "{total} · bereik {scope}", + "admin.support.queueMetaStatus": "· status {status}", "admin.support.ticketCountOne": "{count} ticket", "admin.support.ticketCountMany": "{count} tickets", "admin.support.statusAll": "Alles statuses", @@ -1318,7 +1318,7 @@ export const nl: MessageDict = { "admin.support.loadQueueFailed": "Supportwachtrij laden mislukt", "admin.support.claimFailed": "Ticket claimen mislukt", "admin.support.ticketFallbackTitle": "Ondersteuning ticket", - "admin.support.ticketMeta": "{company} · {requester}", + "admin.support.ticketMeta": "{company} · {requester}", "admin.support.ticketMetaFallback": "Staff-beoordelingsthread", "admin.support.companyFallback": "Bedrijf", "admin.support.requesterFallback": "aanvrager", @@ -1338,13 +1338,13 @@ export const nl: MessageDict = { "admin.support.reenableAuto": "Auto opnieuw inschakelen", "admin.support.disableAuto": "Auto uitschakelen voor dit ticket", "admin.support.aiDraftTitle": "AI-concept (goedkeuren of bewerken)", - "admin.support.aiDraftDesc": "Alleen-conceptmodus heeft een interne notitie achtergelaten. Bewerk indien nodig en stuur naar de klant — of verwerp en neem handmatig over.", + "admin.support.aiDraftDesc": "Alleen-conceptmodus heeft een interne notitie achtergelaten. Bewerk indien nodig en stuur naar de klant — of verwerp en neem handmatig over.", "admin.support.confidence": "Vertrouwen {value}", "admin.support.statusAfterSend": "Status na verzenden", "admin.support.approveSend": "Goedkeuren & verzenden", "admin.support.discardDraft": "Concept verwerpen", "admin.support.threadTitle": "Thread", - "admin.support.threadMeta": "{count} · laatste activiteit {when}", + "admin.support.threadMeta": "{count} · laatste activiteit {when}", "admin.support.messageCountOne": "{count} bericht", "admin.support.messageCountMany": "{count} berichten", "admin.support.replyTitle": "Antwoorden", @@ -1378,21 +1378,21 @@ export const nl: MessageDict = { "admin.support.approveFailed": "AI-concept goedkeuren mislukt", "admin.support.discardFailed": "AI-concept verwerpen mislukt", "admin.settings.sourceResolved": "Opgelost uit {sources}", - "admin.settings.sourceUpdated": " · bijgewerkt {when}", + "admin.settings.sourceUpdated": " · bijgewerkt {when}", "admin.settings.updatedAt": "Bijgewerkt {when}", "admin.settings.tenantDesc": "Bedrijfs-AI-sleutels en marketing-e-mail blijven onder Integraties. Sessie- en versleutelingsgeheimen blijven in de serveromgeving en worden hier niet bewerkt.", - "admin.settings.perCompanyAiEmail": "AI/e-mail per bedrijf —", - "admin.settings.plansCredits": "Plannen en credits —", + "admin.settings.perCompanyAiEmail": "AI/e-mail per bedrijf —", + "admin.settings.plansCredits": "Plannen en credits —", "admin.settings.fromDatabase": "Uit de database", "admin.settings.fromEnvironment": "Uit de omgeving", "admin.settings.sourceBadge": "Bron: {source}", "admin.settings.storedKey": "Opgeslagen sleutel: {masked}", "admin.settings.enableRole": "Deze rol inschakelen", "admin.settings.clearApiKey": "Opgeslagen API-sleutel wissen", - "admin.settings.apiKeyKeepPlaceholder": "•••• leeg laten om te behouden", - "admin.settings.apiKeyNewPlaceholder": "sk-… of lokaal", + "admin.settings.apiKeyKeepPlaceholder": "•••• leeg laten om te behouden", + "admin.settings.apiKeyNewPlaceholder": "sk-… of lokaal", "admin.settings.smtpCardTitle": "Platform-SMTP", - "admin.settings.smtpCardDesc": "Gebruikt voor set-password-uitnodigingen en uitgaande platform-e-mail. Marketing Resend/SMTP blijft per bedrijf onder Integraties → E-mail.", + "admin.settings.smtpCardDesc": "Gebruikt voor set-password-uitnodigingen en uitgaande platform-e-mail. Marketing Resend/SMTP blijft per bedrijf onder Integraties → E-mail.", "admin.settings.smtpBadgeOn": "SMTP ingeschakeld", "admin.settings.smtpBadgeOff": "SMTP uitgeschakeld", "admin.settings.enableSmtp": "Platform-SMTP inschakelen", @@ -1404,11 +1404,11 @@ export const nl: MessageDict = { "admin.settings.leaveBlankKeep": "(leeg laten om te behouden)", "admin.settings.storedSecret": "Opgeslagen geheim: {masked}", "admin.settings.clearClientSecret": "Opgeslagen clientgeheim wissen", - "admin.settings.eprelDesc": "Gratis openbare EU-energieetiketgegevens tijdens verwerking. Standaard aan voor alle plannen — geen activatie of betaalde upgrade. Gebruik de bediening alleen om uit te schakelen of af te stemmen.", + "admin.settings.eprelDesc": "Gratis openbare EU-energieetiketgegevens tijdens verwerking. Standaard aan voor alle plannen — geen activatie of betaalde upgrade. Gebruik de bediening alleen om uit te schakelen of af te stemmen.", "admin.settings.optionalKeySaved": "Optionele API-sleutel opgeslagen", "admin.settings.noApiKeyNeeded": "Geen API-sleutel nodig", "admin.settings.optionalApiKey": "Optionele API-sleutel", - "admin.settings.optionalApiKeySavedHint": "(opgeslagen — leave blank to keep)", + "admin.settings.optionalApiKeySavedHint": "(opgeslagen — leave blank to keep)", "admin.settings.optionalApiKeyPublicHint": "(publieke API werkt zonder)", "admin.settings.clearEprelKey": "Opgeslagen EPREL-API-sleutel wissen", "admin.settings.pineconeDesc": "Optionele vectorcategorie-suggesties tijdens verwerking. Hostomgevingswaarden worden gebruikt als deze velden leeg blijven.", @@ -1417,11 +1417,11 @@ export const nl: MessageDict = { "admin.settings.apiKeyLabel": "API-sleutel", "admin.settings.clearPineconeKey": "Opgeslagen Pinecone-API-sleutel wissen", "admin.settings.stripeDesc": "Optionele overrides van de server-Stripe-configuratie. Gebruik bij voorkeur wachtwoordvelden; waarden worden na opslaan niet opnieuw getoond.", - "admin.settings.stripeMock": "Stripe-mockmodus forceren (alleen non-productie — schakelt echte kosten uit)", + "admin.settings.stripeMock": "Stripe-mockmodus forceren (alleen non-productie — schakelt echte kosten uit)", "admin.settings.webhookSecret": "Webhookgeheim", "admin.settings.clearStripeSecret": "Stripe-geheime sleutel wissen", "admin.settings.clearStripeWebhook": "Stripe-webhookgeheim wissen", - "admin.settings.feedAllowlistDesc": "Kommagescheiden hosts/CIDR’s toegestaan voor privé-feed-URL’s.", + "admin.settings.feedAllowlistDesc": "Kommagescheiden hosts/CIDR’s toegestaan voor privé-feed-URL’s.", "admin.settings.adminsDesc": "Platformbeheerders momenteel op deze deployment", "admin.settings.onboardingTitle": "Admin-onboardingshulp", "admin.settings.onboardingDesc": "Gebruik set-password-uitnodigingsmails om geschikte gebruikers zonder wachtwoord te onboarden.", @@ -1431,14 +1431,14 @@ export const nl: MessageDict = { "admin.settings.loadUsersFailed": "Admingebruikers laden mislukt", "admin.settings.sendFailed": "Verzenden mislukt", "admin.settings.saveMailFailed": "Mailinstellingen opslaan mislukt", - "admin.settings.smtpNotConfigured": "SMTP is niet geconfigureerd — schakel in en sla eerst de mailinstellingen op.", + "admin.settings.smtpNotConfigured": "SMTP is niet geconfigureerd — schakel in en sla eerst de mailinstellingen op.", "admin.settings.smtpTestFailed": "SMTP-test mislukt", "admin.settings.testEmailFailed": "Test-e-mail verzenden mislukt", "admin.settings.saveIntegrationFailed": "Integratie-instellingen opslaan mislukt", "admin.settings.aiSaved": "{label}-AI-instellingen opgeslagen. API-sleutels worden nooit meer getoond.", "admin.settings.aiSaveFailed": "{label}-AI-instellingen opslaan mislukt", "admin.settings.aiTestOk": "{label}: verbinding OK", - "admin.settings.aiTestSkipped": "{label}: overgeslagen — sla referenties op (en schakel de rol in) om te testen.", + "admin.settings.aiTestSkipped": "{label}: overgeslagen — sla referenties op (en schakel de rol in) om te testen.", "admin.settings.aiTestFailed": "{label}: verbinding mislukt", "admin.settings.aiTestError": "{label}-verbinding testen mislukt", "admin.settings.aiRole.processing.label": "Verwerking", @@ -1446,16 +1446,16 @@ export const nl: MessageDict = { "admin.settings.aiRole.vectorization.label": "Vectorisatie", "admin.settings.aiRole.vectorization.desc": "Embeddings voor zoeken / Pinecone-indexering (indexdimensies afstemmen).", "admin.settings.aiRole.docs_api.label": "Docs / API", - "admin.settings.aiRole.docs_api.desc": "Toekomstige docs/API-assistent-slot — /docs Ask blijft regelgebaseerd en mag deze rol nooit aanroepen.", + "admin.settings.aiRole.docs_api.desc": "Toekomstige docs/API-assistent-slot — /docs Ask blijft regelgebaseerd en mag deze rol nooit aanroepen.", "admin.settings.aiRole.support.label": "Ondersteuning", - "admin.settings.aiRole.support.desc": "AI-fallback voor ticket-auto-antwoord — configureer provider/sleutel/model hier; schakel verzenden in onder Supportkennis → Auto-antwoord.", + "admin.settings.aiRole.support.desc": "AI-fallback voor ticket-auto-antwoord — configureer provider/sleutel/model hier; schakel verzenden in onder Supportkennis → Auto-antwoord.", "admin.settings.providerOption.openai": "OpenAI", "admin.settings.providerOption.openrouter": "OpenRouter", "admin.settings.providerOption.azure": "Azure OpenAI", "admin.settings.providerOption.ollama": "Ollama", "admin.settings.providerOption.custom": "Aangepast / overig", "admin.support.title": "Supportcentrum", - "admin.support.description": "Medewerkersinbox — claim uit de wachtrij, filter op bereik, open threads en los op", + "admin.support.description": "Medewerkersinbox — claim uit de wachtrij, filter op bereik, open threads en los op", "admin.support.unavailable": "Supportwachtrij is niet beschikbaar. Neem contact op met uw platformbeheerder als dit aanhoudt.", "admin.support.noTickets": "Geen tickets in deze wachtrij.", "admin.support.ticketNotFound": "Ticket niet gevonden.", @@ -1469,16 +1469,16 @@ export const nl: MessageDict = { "admin.support.searchAria": "Tickets zoeken", "admin.support.assignStaffAria": "Toewijzen aan medewerkers", "admin.support.aiDraftAria": "AI-concept", - "admin.support.replyPlaceholder": "Schrijf een antwoord…", + "admin.support.replyPlaceholder": "Schrijf een antwoord…", "admin.support.replyAria": "Antwoordtekst", "admin.knowledge.eyebrow": "Platformbeheerder", "admin.knowledge.title": "Supportkennis", - "admin.knowledge.description": "Structureer helpartikelen voor FAQ-auto-match. Contentagents vullen teksten — houd feiten juist.", + "admin.knowledge.description": "Structureer helpartikelen voor FAQ-auto-match. Contentagents vullen teksten — houd feiten juist.", "admin.knowledge.notReady": "Supportkennis is niet klaar", "admin.knowledge.noTemplates": "Geen antwoordsjablonen", - "admin.knowledge.articleDesc": "Markdown-tekst ondersteunt afbeeldingen via veilige upload. Verzin geen productfeiten — laat plaatsaanduidingen voor contentagents.", + "admin.knowledge.articleDesc": "Markdown-tekst ondersteunt afbeeldingen via veilige upload. Verzin geen productfeiten — laat plaatsaanduidingen voor contentagents.", "admin.knowledge.templateDesc": "Toegestane plaatsaanduidingen: subject, category.", - "admin.knowledge.searchPlaceholder": "Zoek titel, slug, trefwoorden…", + "admin.knowledge.searchPlaceholder": "Zoek titel, slug, trefwoorden…", "admin.knowledge.searchAria": "Artikelen zoeken", "admin.knowledge.publishFilterAria": "Publicatiestatusfilter", "admin.knowledge.deleteArticleAria": "Artikel verwijderen", @@ -1494,22 +1494,22 @@ export const nl: MessageDict = { "admin.support.autoSource.template": "Sjabloon", "admin.support.autoSource.ai": "AI-ondersteund", "admin.support.autoSource.automated": "Geautomatiseerd", - "admin.knowledge.categoriesHeading": "Categorieën", + "admin.knowledge.categoriesHeading": "Categorieën", "admin.knowledge.categoriesHint": "Lege buckets voor contentagents.", "admin.knowledge.showingArticles": "{shown} artikelen getoond (body laadt bij bewerken).", "admin.knowledge.showingArticlesOf": "{shown} van {total} artikelen getoond (body laadt bij bewerken).", "admin.knowledge.templatesHint": "Kant-en-klare antwoorden met optionele placeholders {{subject}} / {{category}}.", "admin.knowledge.faqAutoMatchTitle": "FAQ auto-match", - "admin.knowledge.faqAutoMatchDesc": "Trefwoordmatch bij ticketaanmaak. Standaarddrempel 0,78 (bereik 0,50–0,95).", + "admin.knowledge.faqAutoMatchDesc": "Trefwoordmatch bij ticketaanmaak. Standaarddrempel 0,78 (bereik 0,50–0,95).", "admin.knowledge.aiFallbackTitle": "AI-fallback", "admin.knowledge.aiFallbackDesc": "Gebruikt wanneer FAQ-match onder de drempel ligt. Antwoorden gebruiken het platform-AI-rol {role}.", "admin.knowledge.noModel": "geen model", - "admin.knowledge.keyLast4": "sleutel …{last4}", + "admin.knowledge.keyLast4": "sleutel …{last4}", "admin.knowledge.sourceLabel": "bron {source}", "admin.knowledge.apiKeyNote": "De API-sleutel komt altijd van deze rol; overrides hierboven wijzigen alleen provider / model / basis-URL.", "admin.knowledge.saveAutoSettings": "Auto-antwoordinstellingen opslaan", "admin.knowledge.insertImage": "Afbeelding invoegen", - "admin.knowledge.uploading": "Uploaden…", + "admin.knowledge.uploading": "Uploaden…", "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, max 2 MiB. Opgeslagen onder UPLOAD_DIR/support-kb (HMAC openbare URL).", "admin.knowledge.unavailableMsg": "Supportkennis is niet beschikbaar op deze deployment. Neem contact op met je platformbeheerder.", "admin.knowledge.loadFailed": "Supportkennis laden mislukt", @@ -1541,7 +1541,7 @@ export const nl: MessageDict = { "admin.translations.filterTranslated": "Alleen vertaald", "admin.translations.filterAll": "Alle sleutels", "admin.translations.search": "Zoeken", - "admin.translations.searchPlaceholder": "Sleutel of tekst…", + "admin.translations.searchPlaceholder": "Sleutel of tekst…", "admin.translations.noKeysMatch": "Geen sleutels komen overeen", "admin.translations.badgeMissing": "Ontbrekend", "admin.translations.badgeUnsaved": "Niet opgeslagen", @@ -1564,12 +1564,12 @@ export const nl: MessageDict = { "admin.migrate.hint": "Als u dit via een oude bladwijzer opende, ga verder met Gebruikers & organisaties, Platformfacturering of Vastgelopen producten.", "admin.migrate.adminHome": "Admin-start", "admin.migrate.users": "Gebruikers", - "admin.redirect.diagnostics": "Doorverwijzen naar Diagnostiek…", - "admin.redirect.stuck": "Doorverwijzen naar Vastgelopen producten…", + "admin.redirect.diagnostics": "Doorverwijzen naar Diagnostiek…", + "admin.redirect.stuck": "Doorverwijzen naar Vastgelopen producten…", "common.refresh": "Vernieuwen", "common.delete": "Verwijderen", "common.clearSearch": "Zoekopdracht wissen", - "common.loading": "Laden…", + "common.loading": "Laden…", "common.never": "Nooit", "common.back": "Terug", "common.startOver": "Opnieuw beginnen", @@ -1581,8 +1581,8 @@ export const nl: MessageDict = { "common.products": "Producten", "common.more": "+{count} meer", "feeds.title": "Uw feeds", - "feeds.loadingDesc": "Uw leveranciersfeeds laden…", - "feeds.desc": "{page} op deze pagina · {total} feeds totaal — leveranciers-CSV/XML-URL's en uploads. Verbind via Stores voor begeleide opties.", + "feeds.loadingDesc": "Uw leveranciersfeeds laden…", + "feeds.desc": "{page} op deze pagina · {total} feeds totaal — leveranciers-CSV/XML-URL's en uploads. Verbind via Stores voor begeleide opties.", "feeds.storesHub": "Winkelshub", "feeds.addFeed": "Feed toevoegen", "feeds.searchPlaceholder": "Feeds zoeken...", @@ -1595,17 +1595,17 @@ export const nl: MessageDict = { "feeds.col.source": "Bron", "feeds.col.mapping": "Mapping", "feeds.col.lastData": "Laatste sync", - "feeds.copyUrl": "URL kopiëren", + "feeds.copyUrl": "URL kopiëren", "feeds.fieldsMapped": "{count} velden", "feeds.fieldsMappedTitle": "{count} veld gemapt", "feeds.fieldsMappedTitlePlural": "{count} velden gemapt", "feeds.mappingsSaved": "Veldmappings opgeslagen", "feeds.mapped": "Gemapt", "feeds.notMapped": "Niet gemapt", - "feeds.notMappedTitle": "Nog geen veldmappings — open Mappen om te configureren", + "feeds.notMappedTitle": "Nog geen veldmappings — open Mappen om te configureren", "feeds.productsFromFeed": "{count} producten uit deze feed", - "feeds.noProductsYet": "Nog geen producten uit deze feed geïmporteerd", - "feeds.syncing": "Synchroniseren…", + "feeds.noProductsYet": "Nog geen producten uit deze feed geïmporteerd", + "feeds.syncing": "Synchroniseren…", "feeds.syncingShort": "Synchroniseren", "feeds.syncingHint": "Kan enkele minuten duren bij grote feeds", "feeds.liveSync": "Feed-sync", @@ -1623,25 +1623,25 @@ export const nl: MessageDict = { "feeds.tab.url": "Feed-URL", "feeds.tab.file": "CSV-bestand", "feeds.field.url": "Feed-URL", - "feeds.field.urlPlaceholder": "https://…", + "feeds.field.urlPlaceholder": "https://…", "feeds.field.type": "Type", "feeds.field.file": "CSV-bestand", - "feeds.fileHint": "Max 5 MiB. Na aanmaken kolommen mappen en daarna synchroniseren — dezelfde flow als URL-feeds.", + "feeds.fileHint": "Max 5 MiB. Na aanmaken kolommen mappen en daarna synchroniseren — dezelfde flow als URL-feeds.", "feeds.field.interval": "Auto-sync-interval (minuten)", - "feeds.field.intervalHint": "Hoe vaak Descrybe deze feed automatisch moet ophalen zolang die actief is. Sync in de feedlijst doet een eenmalige pull — dat wijzigt dit schema niet.", + "feeds.field.intervalHint": "Hoe vaak Descrybe deze feed automatisch moet ophalen zolang die actief is. Sync in de feedlijst doet een eenmalige pull — dat wijzigt dit schema niet.", "feeds.createFeed": "Feed maken", "feeds.editTitle": "Feed bewerken", "feeds.editDesc": "Werk naam, type, auto-sync-schema of bron-URL bij. Sync in de feedlijst voert een eenmalige pull uit.", "feeds.csvSource": "CSV-bron", - "feeds.uploadedCsv": "Geüploade CSV", + "feeds.uploadedCsv": "Geüploade CSV", "feeds.replaceFileHint": "Om het bestand te vervangen, maak een nieuwe feed. Sync leest de opgeslagen upload opnieuw.", - "feeds.csvTypeLocked": "Geüploade CSV-feeds blijven type CSV.", + "feeds.csvTypeLocked": "Geüploade CSV-feeds blijven type CSV.", "feeds.saveChanges": "Wijzigingen opslaan", "feeds.historyTitle": "Syncgeschiedenis", - "feeds.historyDesc": "Recente sync-taken voor “{name}”.", + "feeds.historyDesc": "Recente sync-taken voor “{name}”.", "feeds.historyLastSynced": "Laatste geslaagde sync {relative} ({absolute}).", "feeds.historyNeverSynced": "Nog geen geslaagde sync.", - "feeds.historyLoading": "Syncgeschiedenis laden…", + "feeds.historyLoading": "Syncgeschiedenis laden…", "feeds.historyEmpty": "Nog geen sync-taken.", "feeds.history.started": "Gestart", "feeds.history.completed": "Voltooid", @@ -1656,7 +1656,7 @@ export const nl: MessageDict = { "feeds.processing": "Verwerking", "feeds.syncFailed": "Synchronisatie mislukt", "feeds.statusUpdateFailed": "Status bijwerken mislukt", - "feeds.deleteConfirm": "Feed “{name}” verwijderen? Dit kan niet ongedaan worden gemaakt.", + "feeds.deleteConfirm": "Feed “{name}” verwijderen? Dit kan niet ongedaan worden gemaakt.", "feeds.deleted": "Feed verwijderd.", "feeds.deleteFailed": "Feed verwijderen mislukt", "feeds.historyLoadFailed": "Syncgeschiedenis laden mislukt", @@ -1679,40 +1679,40 @@ export const nl: MessageDict = { "feeds.actions.editFeed": "Feed bewerken", "feeds.actions.editMapping": "Mapping bewerken", "feeds.actions.syncNow": "Nu synchroniseren", - "feeds.actions.syncInProgress": "Sync bezig…", + "feeds.actions.syncInProgress": "Sync bezig…", "feeds.actions.activateToSync": "Feed activeren om te synchroniseren", "feeds.actions.viewHistory": "Syncgeschiedenis bekijken", "feeds.actions.deactivate": "Feed deactiveren", "feeds.actions.activate": "Feed activeren", "feeds.actions.delete": "Feed verwijderen", "feeds.stats.totalFeeds": "Totaal feeds", - "feeds.stats.activeMapped": "{active} actief · {mapped} gemapt", + "feeds.stats.activeMapped": "{active} actief · {mapped} gemapt", "feeds.stats.activeOnly": "{active} actief", - "feeds.stats.totalProducts": "Geïmporteerde producten", + "feeds.stats.totalProducts": "Geïmporteerde producten", "feeds.stats.acrossFeeds": "Ruwe rijen (niet catalogus + wachtrij)", "feeds.stats.processed": "In catalogus", - "feeds.stats.readyCatalog": "Catalogusrijen — geen deel van geïmporteerd", + "feeds.stats.readyCatalog": "Catalogusrijen — geen deel van geïmporteerd", "feeds.stats.unprocessed": "Wacht op verwerking", - "feeds.stats.waiting": "Ruwe wachtrij — geen deel van geïmporteerd", + "feeds.stats.waiting": "Ruwe wachtrij — geen deel van geïmporteerd", "feeds.format.howTo": "Hoe u uw feed structureert", "feeds.format.required": "Vereist:", "feeds.preview.title": "Voorbeeld van feedbron", "feeds.preview.truncated": "Afgekapt", "feeds.preview.refresh": "Voorbeeld vernieuwen", - "feeds.preview.copy": "Voorbeeld kopiëren", - "feeds.preview.loading": "Voorbeeld laden…", + "feeds.preview.copy": "Voorbeeld kopiëren", + "feeds.preview.loading": "Voorbeeld laden…", "feeds.preview.empty": "Haal schema op om de feedbron te bekijken.", - "feeds.schema.search": "Velden zoeken…", + "feeds.schema.search": "Velden zoeken…", "feeds.schema.fieldName": "Veldnaam", "feeds.schema.sourcePath": "Bronpad", "feeds.schema.confirm": "Bevestigen", "feeds.schema.apply": "Toepassen", - "feeds.preflight.missingItemPath": "Selecteer een productelementpad vóór synchronisatie.", - "feeds.preflight.emptyMappings": "Map minstens één bronveld vóór synchronisatie.", - "feeds.preflight.missingRequired": "Map verplichte velden vóór synchronisatie: {fields}.", - "feeds.preflight.unknownSource": "Sommige gemapte bronnen ontbreken in het geëxtraheerde schema: {fields}{more}. Extraheer opnieuw of herstel paden voordat u steekproefwaarden vertrouwt.", - "feeds.preflight.emptySample": "Verplichte velden hebben lege steekproefwaarden: {fields}. Controleer bronkolommen vóór een volledige sync.", - "feeds.preflight.fix": "Herstel veldmappings vóór synchronisatie.", + "feeds.preflight.missingItemPath": "Selecteer een productelementpad vóór synchronisatie.", + "feeds.preflight.emptyMappings": "Map minstens één bronveld vóór synchronisatie.", + "feeds.preflight.missingRequired": "Map verplichte velden vóór synchronisatie: {fields}.", + "feeds.preflight.unknownSource": "Sommige gemapte bronnen ontbreken in het geëxtraheerde schema: {fields}{more}. Extraheer opnieuw of herstel paden voordat u steekproefwaarden vertrouwt.", + "feeds.preflight.emptySample": "Verplichte velden hebben lege steekproefwaarden: {fields}. Controleer bronkolommen vóór een volledige sync.", + "feeds.preflight.fix": "Herstel veldmappings vóór synchronisatie.", "mapping.title": "Feed-mapping", "mapping.titleNamed": "Mappen: {name}", "mapping.description": "Selecteer het herhalende productelement, extraheer bronvelden en map ze vervolgens naar Descrybe-productvelden.", @@ -1724,7 +1724,7 @@ export const nl: MessageDict = { "mapping.ftpUploadCta": "Naar Uploads", "mapping.ftpHttpsCta": "HTTPS-feed toevoegen", "mapping.ftpCsvCta": "CSV-feed uploaden", - "mapping.loading": "Feedgegevens laden…", + "mapping.loading": "Feedgegevens laden…", "mapping.step1": "Productelement selecteren", "mapping.step2": "Velden mappen", "mapping.step1Heading": "Stap 1: Productelement selecteren", @@ -1732,15 +1732,15 @@ export const nl: MessageDict = { "mapping.howToSelect": "Hoe selecteert u het productelement:", "mapping.howToHint": "Optionele gids", "mapping.howTo.1": "Extraheer het schema of klik op een herhalende tag in de voorbeeldweergave", - "mapping.howTo.2": "Elk element moet de gegevens van één product bevatten", + "mapping.howTo.2": "Elk element moet de gegevens van één product bevatten", "mapping.howTo.3": "Bevestig het pad (bijvoorbeeld", "mapping.howTo.4": "Ga verder om bronvelden te mappen naar productvelden", "mapping.productElementPath": "Pad van productelement", "mapping.pathPlaceholder": "bijv. rss/channel/item of products/product", - "mapping.continue": "Doorgaan →", - "mapping.continueFields": "Doorgaan naar veldmapping →", + "mapping.continue": "Doorgaan →", + "mapping.continueFields": "Doorgaan naar veldmapping →", "mapping.discovered": "{fields} bronvelden gevonden uit {rows} steekproefrij(en).", - "mapping.suggestionsCount": "· {count} autosuggestie(s) voor mapping", + "mapping.suggestionsCount": "· {count} autosuggestie(s) voor mapping", "mapping.step2Heading": "Stap 2: Velden mappen", "mapping.requiredFieldsBadge": "{count} verplichte velden", "mapping.unmappedRequired": "{count} verplicht niet gemapt", @@ -1748,8 +1748,8 @@ export const nl: MessageDict = { "mapping.suggestedBadge": "{count} voorgesteld", "mapping.step2Help": "Map bronkolommen of XPath-knooppunten naar uw productvelden. Verplichte velden zijn gemarkeerd met *. Beweeg over het hulpicoon voor een korte woordenlijsttip.", "mapping.requiredFields": "Verplichte velden", - "mapping.requiredMapped": "· {mapped}/{total} gemapt", - "mapping.requiredProgressDone": "Alle verplichte velden zijn gekoppeld — klaar voor de volgende stap.", + "mapping.requiredMapped": "· {mapped}/{total} gemapt", + "mapping.requiredProgressDone": "Alle verplichte velden zijn gekoppeld — klaar voor de volgende stap.", "mapping.requiredProgressHint": "Velden met * moeten gekoppeld zijn voordat deze feed producten kan synchroniseren.", "mapping.requiredProgressAria": "Voortgang verplichte velden: {mapped} van {total} gekoppeld", "mapping.nextAfterSaveReady": "Mappings saved. Next, sync a small sample to check products look right.", @@ -1758,9 +1758,9 @@ export const nl: MessageDict = { "mapping.nextCtaFinishRequired": "Show missing required fields", "mapping.highConfidence": "{count} mapping met hoge betrouwbaarheid klaar", "mapping.highConfidencePlural": "{count} mappings met hoge betrouwbaarheid klaar", - "mapping.highConfidenceHelp": "Exacte en aliasovereenkomsten (bijvoorbeeld EAN → GTIN). Pas alles toe, of accepteer per rij chips in de tabel.", + "mapping.highConfidenceHelp": "Exacte en aliasovereenkomsten (bijvoorbeeld EAN → GTIN). Pas alles toe, of accepteer per rij chips in de tabel.", "mapping.reviewMappings": "Mappings controleren", - "mapping.needItemPath": "Voer een productelementpad in vóór het mappen van velden.", + "mapping.needItemPath": "Voer een productelementpad in vóór het mappen van velden.", "mapping.removeMapping": "Mapping verwijderen", "mapping.sourcePlaceholder": "kolomnaam of xpath", "mapping.processAfterSync": "Producten om na synchronisatie te verwerken", @@ -1776,27 +1776,27 @@ export const nl: MessageDict = { "mapping.fuzzyNeedConfirmPlural": "{count} fuzzy matches moeten worden bevestigd", "mapping.fuzzyHelp": "Naammatches met lage betrouwbaarheid worden niet automatisch toegepast. Bevestig hier of accepteer per rij in de tabel.", "mapping.missingRequiredTitle": "Verplichte velden hebben nog een bronmapping nodig:", - "mapping.applyTip": "Tip: pas de suggesties hierboven toe — veel verplichte velden komen overeen met gangbare bronnamen.", + "mapping.applyTip": "Tip: pas de suggesties hierboven toe — veel verplichte velden komen overeen met gangbare bronnamen.", "mapping.formatLabel": "Formaat:", "mapping.itemPathLabel": "Itempad:", "mapping.reExtract": "Opnieuw extraheren", "mapping.manualRows": "Handmatige rijen", "mapping.schemaTable": "Schematabel", "mapping.addField": "Veld toevoegen", - "mapping.noSchemaYet": "Nog geen geëxtraheerd schema.", + "mapping.noSchemaYet": "Nog geen geëxtraheerd schema.", "mapping.orManualRows": "of gebruik handmatige rijen hieronder.", "mapping.sourceField": "Bronveld", - "mapping.selectSource": "Bron selecteren…", + "mapping.selectSource": "Bron selecteren…", "mapping.mapsTo": "Mapt naar", "mapping.none": "Geen", - "mapping.backToItem": "← Terug naar itemselectie", + "mapping.backToItem": "← Terug naar itemselectie", "mapping.unsaved": "Niet-opgeslagen wijzigingen", "mapping.requiredFieldsColon": "Verplichte velden:", "mapping.sampleOptions": "Steekproefopties", "mapping.sampleSize": "Steekproefgrootte", "mapping.noExactAlias": "Geen exacte/alias-suggesties om toe te passen. Controleer de fuzzy matches hieronder.", - "mapping.noSuggestionsExtract": "Geen suggesties — extraheer eerst het schema.", - "mapping.schemaExtracted": "Schema geëxtraheerd: {fields} velden uit {rows} steekproefrij(en).", + "mapping.noSuggestionsExtract": "Geen suggesties — extraheer eerst het schema.", + "mapping.schemaExtracted": "Schema geëxtraheerd: {fields} velden uit {rows} steekproefrij(en).", "mapping.saved": "Veldmappings opgeslagen{version}.", "mapping.savedVersion": " (v{version})", "mapping.syncNoProducts": "Synchronisatie voltooid; geen producten om te verwerken.", @@ -1805,14 +1805,14 @@ export const nl: MessageDict = { "mapping.appliedNew": "{count} nieuwe {kind} mapping(s) toegepast ({total} totaal).", "mapping.kindHighConfidence": "hoge betrouwbaarheid", "mapping.kindFuzzy": "vaag", - "mapping.fuzzyConfirmFlash": "{count} fuzzy match moet worden bevestigd — gebruik Fuzzy bevestigen hieronder of chips per rij.", - "mapping.fuzzyConfirmFlashPlural": "{count} fuzzy matches moeten worden bevestigd — gebruik Fuzzy bevestigen hieronder of chips per rij.", + "mapping.fuzzyConfirmFlash": "{count} fuzzy match moet worden bevestigd — gebruik Fuzzy bevestigen hieronder of chips per rij.", + "mapping.fuzzyConfirmFlashPlural": "{count} fuzzy matches moeten worden bevestigd — gebruik Fuzzy bevestigen hieronder of chips per rij.", "mapping.formatHelp.title": "Hoe u uw feed structureert", "mapping.formatHelp.required": "Vereist:", "mapping.formatHelp.requiredBody": "{gtin} (EAN/UPC), {title} (of {name}), {brand}", "mapping.formatHelp.https": "Gebruik openbare HTTPS-URL's voor externe feeds (geen FTP of localhost). CSV-upload werkt voor lokale bestanden.", "mapping.formatHelp.specs": "Specificaties als Label: waarde-paren (bijv. {ram}). Afmetingen: {height}, {width}, {depth}, {mass}", - "mapping.formatHelp.also": "Ook ondersteund: prijzen, voorraad, afbeeldingen, categorie, garantie, EPREL-ID, HTML-beschrijvingen, extra afbeeldingen, video-URL en meer — download de volledige steekproef.", + "mapping.formatHelp.also": "Ook ondersteund: prijzen, voorraad, afbeeldingen, categorie, garantie, EPREL-ID, HTML-beschrijvingen, extra afbeeldingen, video-URL en meer — download de volledige steekproef.", "mapping.formatHelp.downloadXml": "Voorbeeld-XML downloaden", "mapping.formatHelp.downloadCsv": "Voorbeeld-CSV downloaden", "mapping.formatHelp.xmlExample": "XML-voorbeeld", @@ -1820,16 +1820,16 @@ export const nl: MessageDict = { "mapping.sourcePreview.title": "Voorbeeld van feedbron", "mapping.sourcePreview.truncated": "Afgekapt", "mapping.sourcePreview.refresh": "Voorbeeld vernieuwen", - "mapping.sourcePreview.copy": "Voorbeeld kopiëren", - "mapping.sourcePreview.loading": "Feedsteekproef laden…", + "mapping.sourcePreview.copy": "Voorbeeld kopiëren", + "mapping.sourcePreview.loading": "Feedsteekproef laden…", "mapping.sourcePreview.errorHint": "U kunt het pad van het productelement nog steeds handmatig invoeren. Extraheer het schema wanneer de feed-URL bereikbaar is.", "mapping.sourcePreview.retry": "Opnieuw", "mapping.sourcePreview.empty": "Nog geen voorbeeld", - "mapping.sourcePreview.emptyHintXml": "Klik op “Schema extraheren” om een steekproef te downloaden en velden te ontdekken, of voer handmatig een itempad in.", - "mapping.sourcePreview.emptyHintCsv": "Klik op “Schema extraheren” om een steekproef te downloaden en velden te ontdekken.", + "mapping.sourcePreview.emptyHintXml": "Klik op “Schema extraheren” om een steekproef te downloaden en velden te ontdekken, of voer handmatig een itempad in.", + "mapping.sourcePreview.emptyHintCsv": "Klik op “Schema extraheren” om een steekproef te downloaden en velden te ontdekken.", "mapping.sourcePreview.selectPath": "Pad selecteren: {path}", "mapping.sourcePreview.clickTag": "Klik op een tagregel om het pad van het productelement in te stellen.", - "mapping.table.search": "Velden zoeken…", + "mapping.table.search": "Velden zoeken…", "mapping.table.all": "Alle velden", "mapping.table.mapped": "Gemapt", "mapping.table.unmapped": "Niet gemapt", @@ -1848,50 +1848,50 @@ export const nl: MessageDict = { "mapping.table.confirmFuzzyMatch": "Fuzzy match bevestigen ({percent}%)", "mapping.preview.title": "Mappingvoorbeeld", "mapping.preview.subtitle": "Voorbeeldproductvorm op basis van uw huidige veldmappings", - "mapping.preview.usingSamples": "· met geëxtraheerde steekproeven", + "mapping.preview.usingSamples": "· met geëxtraheerde steekproeven", "mapping.preview.formatCsv": "formaat: csv", "mapping.preview.item": "item: {path}", - "mapping.preview.sourceFields": "· {count} bronvelden", + "mapping.preview.sourceFields": "· {count} bronvelden", "mapping.preview.empty": "Nog geen velden gemapt", "mapping.preview.emptyHint": "Map bronkolommen of XPath-knooppunten naar productvelden. Hier verschijnt een voorbeeldproduct.", "mapping.preview.rawSample": "Ruw steekproeffragment", "imports.title": "Uploads", - "imports.description": "CSV-imports opgeslagen voor deze workspace — producten, categorieën en attributen.", + "imports.description": "CSV-imports opgeslagen voor deze workspace — producten, categorieën en attributen.", "imports.importProducts": "Producten importeren", "imports.emptyTitle": "Nog geen uploads", - "imports.emptyMessage": "CSV-imports van producten, categorieën en attributen verschijnen hier na upload.", + "imports.emptyMessage": "CSV-imports van producten, categorieën en attributen verschijnen hier na upload.", "imports.goProducts": "Naar producten", - "imports.categories": "Categorieën", + "imports.categories": "Categorieën", "imports.recent": "Recente uploads", "imports.fileCount": "{count} bestand", "imports.fileCountPlural": "{count} bestanden", "imports.col.fileName": "Bestandsnaam", "imports.col.kind": "Soort", - "imports.col.uploaded": "Geüpload", + "imports.col.uploaded": "Geüpload", "imports.col.size": "Grootte", "imports.actions": "Uploadacties", "imports.loadFailed": "Uploads laden mislukt", - "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", + "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", "imports.metadataOnlyBadge": "Metadata only (blob not migrated)", - "imports.deleteConfirm": "“{name}” verwijderen? Dit verwijdert het uploadrecord (en de lokale blob indien aanwezig).", + "imports.deleteConfirm": "“{name}” verwijderen? Dit verwijdert het uploadrecord (en de lokale blob indien aanwezig).", "imports.deleted": "Upload verwijderd.", "imports.deleteFailed": "Upload verwijderen mislukt", - "imports.status.uploaded": "Geüpload", - "reviews.redirectLoading": "WooCommerce-reviews openen…", + "imports.status.uploaded": "Geüpload", + "reviews.redirectLoading": "WooCommerce-reviews openen…", "reviews.tab": "Beoordelingen", - "reviews.syncTitle": "Reviewimport (winkel → Descrybe)", - "reviews.syncDesc": "Inkomende import — haal WooCommerce-productreviews naar Descrybe voor campagnes en reputatie", + "reviews.syncTitle": "Reviewimport (winkel → Descrybe)", + "reviews.syncDesc": "Inkomende import — haal WooCommerce-productreviews naar Descrybe voor campagnes en reputatie", "reviews.syncQueued": "Reviews-sync in wachtrij", "reviews.statusBadge": "Reviews: {status}", "reviews.syncedCount": "{count} gesynchroniseerd", "reviews.lastSync": "Laatste sync: {date}", "reviews.noSyncYet": "Er is nog geen reviews-sync voltooid.", "reviews.needsReconnect": "Reviews-import kan pas draaien als referenties na migratie opnieuw zijn verbonden. Op het tabblad Verbinding: Opslaan, daarna Verbinding testen.", - "reviews.queueImport": "Reviewimport in wachtrij (winkel → Descrybe)", + "reviews.queueImport": "Reviewimport in wachtrij (winkel → Descrybe)", "reviews.queueing": "In de wachtrij...", - "reviews.saveTestFirst": "Sla referenties op en test de verbinding vóór sync", + "reviews.saveTestFirst": "Sla referenties op en test de verbinding vóór sync", "reviews.refreshList": "Lijst vernieuwen", - "reviews.loading": "Reviews laden…", + "reviews.loading": "Reviews laden…", "reviews.emptyTitle": "Nog geen reviews", "reviews.emptyMessage": "Zet een reviewsync in de wachtrij na het koppelen van uw winkel. Dit tabblad blijft bruikbaar met een lege lijst.", "reviews.col.product": "Product", @@ -1901,15 +1901,15 @@ export const nl: MessageDict = { "reviews.queuedSuccess": "Reviewsync in de wachtrij. Sync start zo.", "reviews.queueFailed": "Reviewsync in de wachtrij zetten mislukt", "campaigns.title": "Campagnes", - "campaigns.description": "Maak seizoensgebonden e-mailcampagnes vanuit je catalogus — kies een seizoen, selecteer producten, stel het publiek in en genereer.", + "campaigns.description": "Maak seizoensgebonden e-mailcampagnes vanuit je catalogus — kies een seizoen, selecteer producten, stel het publiek in en genereer.", "campaigns.new": "Nieuwe campagne", - "campaigns.loading": "Laden campagnes…", + "campaigns.loading": "Laden campagnes…", "campaigns.loadFailed": "Laden mislukt campagnes", - "campaigns.deleteConfirm": "Campagne “{name}” verwijderen? Dit kan niet ongedaan worden gemaakt.", + "campaigns.deleteConfirm": "Campagne “{name}” verwijderen? Dit kan niet ongedaan worden gemaakt.", "campaigns.deleted": "Campagne verwijderd", "campaigns.deleteFailed": "Campagne verwijderen mislukt", "campaigns.partialUnavailable": "Campagnes zijn momenteel niet volledig bereikbaar. Genereren en verzenden kunnen mislukken tot de service terug is.", - "campaigns.searchPlaceholder": "Zoeken campagnes…", + "campaigns.searchPlaceholder": "Zoeken campagnes…", "campaigns.unavailableTitle": "Campagnes niet beschikbaar", "campaigns.unavailableMessage": "De campagnedienst is niet bereikbaar. U kunt de wizard openen, maar genereren en verzenden wachten tot de dienst terug is.", "campaigns.openWizard": "Aanmaakwizard openen", @@ -1917,7 +1917,7 @@ export const nl: MessageDict = { "campaigns.browseProducts": "Producten bekijken", "campaigns.emptyTitle": "Nog geen campagnes", "campaigns.noMatches": "Geen overeenkomsten", - "campaigns.emptyMessage": "Maak in een paar stappen een Black Friday-, kerst- of aangepaste campagne — seizoenspresets staan klaar om mee te starten.", + "campaigns.emptyMessage": "Maak in een paar stappen een Black Friday-, kerst- of aangepaste campagne — seizoenspresets staan klaar om mee te starten.", "campaigns.noMatchesMessage": "Probeer een andere naam, seizoen of status.", "campaigns.create": "Aanmaken campagne", "campaigns.col.season": "Seizoen", @@ -1926,8 +1926,8 @@ export const nl: MessageDict = { "campaigns.newTitle": "Nieuwe campagne", "campaigns.newDesc": "Kies een seizoen, selecteer producten en publiek, schrijf de prompt, en genereer, test en plan daarna.", "campaigns.editTitle": "Bewerken campagne", - "campaigns.editDesc": "Werk seizoen, producten en publiek bij — genereer opnieuw, stuur een test of plan in.", - "campaignWizard.loading": "Campagnewizard laden…", + "campaigns.editDesc": "Werk seizoen, producten en publiek bij — genereer opnieuw, stuur een test of plan in.", + "campaignWizard.loading": "Campagnewizard laden…", "campaignWizard.apiMissing": "Campagnes-API tijdelijk niet beschikbaar. U kunt de wizard verkennen; opslaan / genereren / verzenden vereisen bereikbare /api/campaigns.", "campaignWizard.upgradeTitle": "AI-campagnes zijn een betaalde functie", "campaignWizard.upgradeMessage": "Free-plannen kunnen seizoenen en doelgroepen voorbereiden, maar AI genereren vereist Starter of hoger. Upgrade om AI-e-mailconcepten te ontgrendelen.", @@ -1939,31 +1939,31 @@ export const nl: MessageDict = { "campaignWizard.step.preview": "Voorbeeld", "campaignWizard.step.send": "Verzenden", "campaignWizard.pickSeason": "Kies een seizoen", - "campaignWizard.pickSeasonHelp": "Begin met een sjabloon — u kunt later alles bewerken.", + "campaignWizard.pickSeasonHelp": "Begin met een sjabloon — u kunt later alles bewerken.", "campaignWizard.name": "Campagnenaam", "campaignWizard.namePlaceholder": "Black Friday 2026", - "campaignWizard.catalogTitle": "Categorieën & producten", - "campaignWizard.catalogHelp": "Selecteer wat deze e-mail moet tonen. Alleen categorieën volstaan voor een snelle start.", - "campaignWizard.categories": "Categorieën", - "campaignWizard.noCategories": "Nog geen categorieën — voeg er toe onder Catalogus.", + "campaignWizard.catalogTitle": "Categorieën & producten", + "campaignWizard.catalogHelp": "Selecteer wat deze e-mail moet tonen. Alleen categorieën volstaan voor een snelle start.", + "campaignWizard.categories": "Categorieën", + "campaignWizard.noCategories": "Nog geen categorieën — voeg er toe onder Catalogus.", "campaignWizard.categoriesSelected": "{count} categorie geselecteerd", - "campaignWizard.categoriesSelectedPlural": "{count} categorieën geselecteerd", + "campaignWizard.categoriesSelectedPlural": "{count} categorieën geselecteerd", "campaignWizard.productsOptional": "Producten (optioneel)", "campaignWizard.selectedCount": "{count} geselecteerd", - "campaignWizard.searchProducts": "Producten zoeken…", + "campaignWizard.searchProducts": "Producten zoeken…", "campaignWizard.noProducts": "Geen producten gevonden.", "campaignWizard.audienceTitle": "Wie moet dit ontvangen?", - "campaignWizard.audienceHelp": "Standaard iedereen. Verfijn met categorieën of eerdere kopers wanneer orders gesynchroniseerd zijn.", + "campaignWizard.audienceHelp": "Standaard iedereen. Verfijn met categorieën of eerdere kopers wanneer orders gesynchroniseerd zijn.", "campaignWizard.audience.all": "Alle contacten", "campaignWizard.audience.allHint": "Verstuur naar je volledige lijst (als e-mailprovider is geconfigureerd).", "campaignWizard.audience.byCategory": "Op categorieninteresse", - "campaignWizard.audience.byCategoryHint": "Personen gekoppeld aan geselecteerde categorieën.", + "campaignWizard.audience.byCategoryHint": "Personen gekoppeld aan geselecteerde categorieën.", "campaignWizard.audience.purchased": "Gekocht in categorie", - "campaignWizard.audience.purchasedHint": "Klanten die producten in de doelgroepcategorieën kochten (uit sync orders).", + "campaignWizard.audience.purchasedHint": "Klanten die producten in de doelgroepcategorieën kochten (uit sync orders).", "campaignWizard.audience.notPurchased": "Nog niet gekocht", - "campaignWizard.audience.notPurchasedHint": "Contacten die die categorieën niet kochten — ideaal voor win-back.", + "campaignWizard.audience.notPurchasedHint": "Contacten die die categorieën niet kochten — ideaal voor win-back.", "campaignWizard.ordersHint": "Gekocht-/niet-gekocht-targeting verschijnt na sync van WooCommerce-orders.", - "campaignWizard.audienceCategories": "Doelgroepcategorieën", + "campaignWizard.audienceCategories": "Doelgroepcategorieën", "campaignWizard.promptTitle": "E-mailprompt", "campaignWizard.promptHelp": "We hebben een stevige standaard voor {season} ingevuld. Bewerk vrij of behoud.", "campaignWizard.promptSeasonFallback": "dit seizoen", @@ -1974,7 +1974,7 @@ export const nl: MessageDict = { "campaignWizard.planFree": "Gratis", "campaignWizard.planPaid": "Betaald", "campaignWizard.planLine": "Abonnement:", - "campaignWizard.aiLocked": "— AI genereren is vergrendeld.", + "campaignWizard.aiLocked": "— AI genereren is vergrendeld.", "campaignWizard.generateAi": "AI genereren", "campaignWizard.templatePreview": "Sjabloonvoorbeeld", "campaignWizard.saveDraft": "Concept opslaan", @@ -1989,7 +1989,7 @@ export const nl: MessageDict = { "campaignWizard.regenerate": "Opnieuw genereren", "campaignWizard.continueSend": "Doorgaan naar verzenden", "campaignWizard.testSend": "Testverzending", - "campaignWizard.testSendHelp": "Stuur uzelf één kopie vóór het plannen.", + "campaignWizard.testSendHelp": "Stuur uzelf één kopie vóór het plannen.", "campaignWizard.testEmail": "Test-e-mail", "campaignWizard.testEmailPlaceholder": "u@bedrijf.com", "campaignWizard.sendTest": "Test verzenden", @@ -2000,8 +2000,8 @@ export const nl: MessageDict = { "campaignWizard.generateToContinue": "Genereer om door te gaan", "campaignWizard.done": "Klaar", "campaignWizard.loadFailed": "Wizard laden mislukt", - "campaignWizard.pickCatalog": "Kies minstens één categorie of product", - "campaignWizard.pickAudienceCats": "Kies doelgroepcategorieën voor dit filter", + "campaignWizard.pickCatalog": "Kies minstens één categorie of product", + "campaignWizard.pickAudienceCats": "Kies doelgroepcategorieën voor dit filter", "campaignWizard.completeStep": "Voltooi deze stap om door te gaan", "campaignWizard.aiDraftReady": "AI-concept gegenereerd", "campaignWizard.templateReady": "Sjabloonvoorbeeld klaar", @@ -2021,7 +2021,7 @@ export const nl: MessageDict = { "marketing.loadFailed": "Kalender laden mislukt", "marketing.prepared": "Campagne voorbereid", "marketing.alreadyReady": "Campagne is al gereed", - "marketing.exportFeedsHint": "{name} → Exportfeeds", + "marketing.exportFeedsHint": "{name} → Exportfeeds", "marketing.prepareFailed": "Campagne kon niet worden voorbereid", "marketing.requestFailed": "Verzoek mislukt", "marketing.emptyTitle": "Geen seizoenspresets", @@ -2030,14 +2030,14 @@ export const nl: MessageDict = { "marketing.window": "Venster:", "marketing.linkedExport": "Gekoppelde export:", "marketing.openPrepared": "Voorbereide feed openen", - "marketing.preparing": "Voorbereiden…", + "marketing.preparing": "Voorbereiden…", "marketing.prepareNamed": "Campagne {name} voorbereiden", - "marketing.footer": "E-mailcampagnes blijven op {link} — deze pagina bereidt alleen catalogus-exportfeeds voor.", + "marketing.footer": "E-mailcampagnes blijven op {link} — deze pagina bereidt alleen catalogus-exportfeeds voor.", "common.done": "Klaar", "common.copied": "Gekopieerd naar klembord.", - "common.copyFailed": "Kopiëren mislukt. Selecteer de tekst en kopieer handmatig.", - "common.submitting": "Bezig met verzenden…", - "common.sending": "Verzenden…", + "common.copyFailed": "Kopiëren mislukt. Selecteer de tekst en kopieer handmatig.", + "common.submitting": "Bezig met verzenden…", + "common.sending": "Verzenden…", "settings.companyAdminOnlyView": "Alleen bedrijfsadmins kunnen bedrijfsinstellingen wijzigen. U kunt de huidige workspacedetails bekijken.", "settings.activeCompanyHelp": "Workspace voor catalogus, feeds, facturering en API-sleutels. Wissel hier of in de header op elk moment.", "settings.noCompanySelected": "Geen bedrijf geselecteerd", @@ -2048,7 +2048,7 @@ export const nl: MessageDict = { "settings.openBilling": "Gebruik en facturering openen", "settings.companyNameHelp": "Deze naam verschijnt in uitnodigingen en organisatie-instellingen", "settings.contentSettingsHelp": "Configureer taal en productmatching voor gegenereerde content", - "settings.mergeProductsHelp": "Indien ingeschakeld combineren CSV-imports rijen met hetzelfde GTIN tot één product. Schakel uit om elke rij apart te houden.", + "settings.mergeProductsHelp": "Indien ingeschakeld combineren CSV-imports rijen met hetzelfde GTIN tot één product. Schakel uit om elke rij apart te houden.", "settings.emailIntegrationHelp": "Stel Resend of SMTP in voor uitnodigingen, campagnes en transactionele mail.", "settings.configureEmail": "E-mail configureren", "settings.aiIntegrationsHelp": "Platformcredits of uw eigen sleutel, plus bewerkbare prompts voor titels, beschrijvingen, SEO en campagnes. Sleutels versleuteld in rust.", @@ -2061,33 +2061,33 @@ export const nl: MessageDict = { "settings.mergeUpdateFailed": "Samenvoeginstelling bijwerken mislukt", "settings.inAppToastsHelp": "Alleen in deze browser. Mislukkingen staan standaard aan; voltooiingen zijn gedempt om ruis te verminderen. Formfeedback en Ongedaan maken worden nooit gedempt.", "settings.emailAlertsHelp": "E-mailwaarschuwingsvoorkeuren komen binnenkort. Foutmeldingen standaard aan (zoals in-app); voltooiingsmails blijven uit tenzij u zich aanmeldt.", - "settings.emailAlertsBody": "Configureer voorlopig transactionele mail onder Bedrijf → E-mailintegratie. In-app-alerts hierboven blijven gelden.", - "settings.apiKeysLegacyNotice": "Legacy API-sleutels zijn niet gemigreerd. Maak een nieuwe aan — het geheim wordt slechts één keer getoond.", + "settings.emailAlertsBody": "Configureer voorlopig transactionele mail onder Bedrijf → E-mailintegratie. In-app-alerts hierboven blijven gelden.", + "settings.apiKeysLegacyNotice": "Legacy API-sleutels zijn niet gemigreerd. Maak een nieuwe aan — het geheim wordt slechts één keer getoond.", "settings.apiKeysAdminOnly": "Alleen bedrijfsbeheerders kunnen API-sleutels aanmaken of intrekken. U kunt bestaande voorvoegsels bekijken.", - "settings.apiKeysCopyUnavailableNotice": "Kopiëren niet beschikbaar voor bestaande sleutels — alleen voorvoegsel opgeslagen. Maak een nieuwe aan om het geheim één keer te kopiëren en trek de oude in indien nodig.", + "settings.apiKeysCopyUnavailableNotice": "Kopiëren niet beschikbaar voor bestaande sleutels — alleen voorvoegsel opgeslagen. Maak een nieuwe aan om het geheim één keer te kopiëren en trek de oude in indien nodig.", "settings.apiKeysForbidden": "U mag geen API-sleutels bekijken. Vraag een bedrijfsbeheerder om hulp.", "settings.noApiKeys": "Nog geen API-sleutels", - "settings.noApiKeysHelpAdmin": "Legacy API-sleutels zijn niet gemigreerd. Maak een nieuwe voor Descrybe API-verzoeken (X-API-Key). Het volledige geheim wordt slechts één keer getoond.", - "settings.noApiKeysHelpMember": "Nog geen API-sleutels voor dit bedrijf. Legacy-sleutels niet gemigreerd — vraag een beheerder er een aan te maken.", + "settings.noApiKeysHelpAdmin": "Legacy API-sleutels zijn niet gemigreerd. Maak een nieuwe voor Descrybe API-verzoeken (X-API-Key). Het volledige geheim wordt slechts één keer getoond.", + "settings.noApiKeysHelpMember": "Nog geen API-sleutels voor dit bedrijf. Legacy-sleutels niet gemigreerd — vraag een beheerder er een aan te maken.", "settings.unnamedKey": "Naamloze sleutel", "settings.neverUsed": "Nooit gebruikt", "settings.apiKeyActions": "API-sleutelacties", - "settings.copyUnavailable": "Kopiëren niet beschikbaar", - "settings.copyUnavailableTitle": "Volledig geheim wordt slechts één keer getoond bij aanmaken", + "settings.copyUnavailable": "Kopiëren niet beschikbaar", + "settings.copyUnavailableTitle": "Volledig geheim wordt slechts één keer getoond bij aanmaken", "settings.revoke": "Intrekken", "settings.apiKeyNameRequired": "Voer een naam in voor deze API-sleutel.", - "settings.apiKeyCreatedOnce": "API-sleutel aangemaakt. Kopieer nu — wordt niet opnieuw getoond.", + "settings.apiKeyCreatedOnce": "API-sleutel aangemaakt. Kopieer nu — wordt niet opnieuw getoond.", "settings.apiKeyCreated": "API-sleutel aangemaakt.", "settings.apiKeyCreateFailed": "API-sleutel kon niet worden aangemaakt", "settings.apiKeyRevokeConfirm": "Deze API-sleutel intrekken? Verzoeken die hem gebruiken stoppen met werken.", "settings.apiKeyRevoked": "API-sleutel ingetrokken.", "settings.apiKeyRevokeFailed": "API-sleutel kon niet worden ingetrokken", "settings.apiKeyCopied": "API-sleutel gekopieerd.", - "settings.createApiKeyOnceHelp": "Kopieer deze sleutel nu — hij wordt niet opnieuw getoond. Gebruik als Authorization: Bearer of X-API-Key op /api/v1.", + "settings.createApiKeyOnceHelp": "Kopieer deze sleutel nu — hij wordt niet opnieuw getoond. Gebruik als Authorization: Bearer of X-API-Key op /api/v1.", "settings.createApiKeyNameHelp": "Geef de sleutel een naam om hem later te herkennen. Na aanmaken versturen als Authorization: Bearer (voorkeur) of X-API-Key.", "settings.keyNamePlaceholder": "bijv. Production", - "settings.newApiKeyAria": "Nieuwe API-sleutel één keer getoond", - "settings.copyApiKeyAria": "API-sleutel kopiëren", + "settings.newApiKeyAria": "Nieuwe API-sleutel één keer getoond", + "settings.copyApiKeyAria": "API-sleutel kopiëren", "settings.alert.sync_fail.title": "Syncfouten", "settings.alert.sync_fail.description": "Wanneer een feedsync een time-out heeft of de API een fout teruggeeft.", "settings.alert.sync_done.title": "Sync voltooid", @@ -2116,17 +2116,17 @@ export const nl: MessageDict = { "confirm.defaultTitle": "Verwijderen bevestigen", "confirm.defaultDescription": "Weet u het zeker?", "confirm.defaultConfirm": "Bevestigen", - "confirm.deleteFeed": "Feed “{name}” verwijderen? Dit kan niet ongedaan worden gemaakt.", - "confirm.deleteCampaign": "Campagne “{name}” verwijderen? Dit kan niet ongedaan worden gemaakt.", + "confirm.deleteFeed": "Feed “{name}” verwijderen? Dit kan niet ongedaan worden gemaakt.", + "confirm.deleteCampaign": "Campagne “{name}” verwijderen? Dit kan niet ongedaan worden gemaakt.", "confirm.deleteExportFeed": "Weet u zeker dat u deze exportfeed wilt verwijderen?", "confirm.rotateExportToken": "Feed-URL-token roteren? De oude openbare URL werkt meteen niet meer.", - "confirm.deleteUpload": "“{name}” verwijderen? Dit verwijdert het uploadrecord (en de lokale blob indien aanwezig).", + "confirm.deleteUpload": "“{name}” verwijderen? Dit verwijdert het uploadrecord (en de lokale blob indien aanwezig).", "confirm.revokeApiKey": "Deze API-sleutel intrekken? Verzoeken die hem gebruiken stoppen met werken.", "confirm.deleteKnowledgeArticle": "Dit kennisartikel verwijderen?", "confirm.deleteReplyTemplate": "Dit antwoordsjabloon verwijderen?", "confirm.deleteStructuredField": "Weet u zeker dat u dit veld wilt verwijderen? Dit kan niet ongedaan worden gemaakt.", - "toast.campaign.pickAudience": "Kies minstens één categorie of product", - "toast.campaign.pickCategories": "Kies doelgroepcategorieën voor dit filter", + "toast.campaign.pickAudience": "Kies minstens één categorie of product", + "toast.campaign.pickCategories": "Kies doelgroepcategorieën voor dit filter", "toast.campaign.completeStep": "Voltooi deze stap om door te gaan", "toast.campaign.aiDraft": "AI-concept gegenereerd", "toast.campaign.templatePreview": "Sjabloonvoorbeeld klaar", @@ -2146,7 +2146,7 @@ export const nl: MessageDict = { "toast.feed.activateBeforeSync": "Activeer de feed voordat u synchroniseert.", "toast.feed.syncFinished": "Synchronisatie voltooid", "toast.feed.deleted": "Feed verwijderd.", - "toast.feed.mappingLoadFailed": "Veldtoewijzingen laden mislukt. Open mapping om te herstellen vóór synchronisatie.", + "toast.feed.mappingLoadFailed": "Veldtoewijzingen laden mislukt. Open mapping om te herstellen vóór synchronisatie.", "toast.feed.syncFailed": "Synchronisatie mislukt", "toast.feed.statusFailed": "Status bijwerken mislukt", "toast.feed.deleteFailed": "Feed verwijderen mislukt", @@ -2189,14 +2189,14 @@ export const nl: MessageDict = { "toast.structured.addFailed": "Veld toevoegen mislukt", "toast.structured.deleteFailed": "Veld verwijderen mislukt", "toast.brand.saved": "Merkkit opgeslagen", - "toast.brand.logoUploaded": "Logo geüpload", + "toast.brand.logoUploaded": "Logo geüpload", "toast.brand.saveFailed": "Merkkit opslaan mislukt", "toast.brand.uploadFailed": "Logo uploaden mislukt", "toast.vector.indexCreated": "Vectorindex succesvol aangemaakt", - "toast.vector.dbInitialized": "Vectordatabase succesvol geïnitialiseerd", + "toast.vector.dbInitialized": "Vectordatabase succesvol geïnitialiseerd", "toast.vector.indexFailed": "Vectorindex aanmaken mislukt", "toast.vector.initFailed": "Vectordatabase initialiseren mislukt", - "toast.vector.searchFailed": "Categorieën zoeken mislukt", + "toast.vector.searchFailed": "Categorieën zoeken mislukt", "toast.export.refreshFailed": "Feed vernieuwen mislukt", "toast.mapping.loadFailed": "Feedmapping laden mislukt", "toast.mapping.extractFailed": "Schema extraheren mislukt", @@ -2236,13 +2236,13 @@ export const nl: MessageDict = { "flash.settings.apiKeyCreatedFailed": "API-sleutel kon niet worden aangemaakt", "flash.settings.apiKeyRevoked": "API-sleutel ingetrokken.", "flash.settings.apiKeyRevokeFailed": "API-sleutel kon niet worden ingetrokken", - "flash.settings.copyFailed": "Kopiëren mislukt. Selecteer de tekst en kopieer handmatig.", - "flash.products.accepted": "{count} product(en) geaccepteerd — verplaatst naar Verwerkt.", + "flash.settings.copyFailed": "Kopiëren mislukt. Selecteer de tekst en kopieer handmatig.", + "flash.products.accepted": "{count} product(en) geaccepteerd — verplaatst naar Verwerkt.", "flash.products.updated": "Product bijgewerkt.", - "flash.products.enrichmentAccepted": "Verrijking geaccepteerd — verplaatst naar Verwerkt.", + "flash.products.enrichmentAccepted": "Verrijking geaccepteerd — verplaatst naar Verwerkt.", "flash.products.originalEmpty": "Oorspronkelijke waarde is leeg; verrijking kan niet via PATCH worden gewist.", - "flash.products.selectExport": "Selecteer minstens één product om te exporteren.", - "flash.products.exported": "{count} product(en) geëxporteerd via exportfeed.", + "flash.products.selectExport": "Selecteer minstens één product om te exporteren.", + "flash.products.exported": "{count} product(en) geëxporteerd via exportfeed.", "flash.support.missingId": "Ticket-id ontbreekt", "flash.support.notFound": "Ticket niet gevonden", "flash.support.unavailable": "Support is tijdelijk niet beschikbaar.", @@ -2251,7 +2251,7 @@ export const nl: MessageDict = { "flash.support.queueUnavailable": "De supportwachtrij is niet beschikbaar in deze deployment.", "flash.support.deploymentUnavailable": "Support is niet beschikbaar op deze deployment.", "flash.support.replyRequired": "Antwoordtekst is verplicht.", - "flash.support.draftRequired": "Concepttekst is verplicht vóór goedkeuring.", + "flash.support.draftRequired": "Concepttekst is verplicht vóór goedkeuring.", "flash.support.claimed": "Ticket geclaimd.", "flash.support.unassigned": "Ticket niet toegewezen.", "flash.support.assigneeCleared": "Toegewezene gewist.", @@ -2266,10 +2266,10 @@ export const nl: MessageDict = { "flash.export.noConfigs": "Nog geen exportfeeds. Maak er een onder Exportfeeds en kom terug om je selectie te exporteren.", "flash.export.selectFormat": "Selecteer een exportfeed.", "flash.files.deleted": "Upload verwijderd.", - "flash.mapping.noSuggestions": "Geen suggesties — controleer bronveldnamen.", + "flash.mapping.noSuggestions": "Geen suggesties — controleer bronveldnamen.", "flash.mapping.allMapped": "Alle suggesties zijn al gemapt. Bekijk de betrouwbaarheidschips in de tabel.", - "flash.mapping.extractFirst": "Geen suggesties — extraheer eerst het schema.", - "flash.mapping.pathRequired": "Voer een productelementpad in vóór het mappen van velden.", + "flash.mapping.extractFirst": "Geen suggesties — extraheer eerst het schema.", + "flash.mapping.pathRequired": "Voer een productelementpad in vóór het mappen van velden.", "flash.billing.checkoutCanceled": "Checkout is geannuleerd. Er zijn geen wijzigingen aangebracht.", "flash.billing.portalReturn": "Terug van het factureringsportaal. Beheer uw plan hier of op Plans.", "flash.billing.invalidAmount": "Voer een geldig creditaantal in.", @@ -2278,18 +2278,18 @@ export const nl: MessageDict = { "flash.unsubscribe.missingToken": "Afmeldtoken ontbreekt.", "flash.unsubscribe.loadFailed": "Afmeldstatus laden mislukt.", "flash.unsubscribe.failed": "Afmelden mislukt.", - "flash.seo.filledMeta": "Meta ingevuld voor “{label}” ({mode}).", + "flash.seo.filledMeta": "Meta ingevuld voor “{label}” ({mode}).", "flash.shopify.saved": "Shopify-instellingen opgeslagen.", "flash.woo.saved": "WooCommerce-instellingen opgeslagen.", "flash.woo.syncSaved": "Sync-instellingen opgeslagen.", - "flash.woo.autoCategories": "{count} categorieën automatisch gemapt.", + "flash.woo.autoCategories": "{count} categorieën automatisch gemapt.", "flash.woo.autoAttributes": "{count} attributen automatisch gemapt.", "flash.ai.promptsSaved": "Prompttemplates opgeslagen. Ze gelden voor de volgende AI-run.", "flash.ai.promptRestored": "Ingebouwde standaardprompt hersteld.", "flash.ai.connectionOk": "Verbinding OK ({detail}).", "flash.ai.connectionByok": ", uw eigen sleutel", "flash.email.saved": "E-mailprovider opgeslagen. Verifieer domein en stuur een test.", - "flash.email.testDryRun": "Test vastgelegd in dry-run — er is geen e-mail verzonden.", + "flash.email.testDryRun": "Test vastgelegd in dry-run — er is geen e-mail verzonden.", "flash.email.testSent": "Testmail verzonden. Het from-adres wordt als geverifieerd gemarkeerd bij geslaagde bezorging.", "flash.fields.apiUnavailable": "De standaardvelden-API is niet beschikbaar. Wijzigingen kunnen niet worden opgeslagen.", "flash.fields.updated": "Veld succesvol bijgewerkt", @@ -2303,9 +2303,10 @@ export const nl: MessageDict = { "flash.processing.retried": "\"{name}\" in de wachtrij voor opnieuw proberen.", "flash.admin.staffRoleUpdated": "Personeelsrol bijgewerkt voor {email}.", "flash.admin.staffRoleUnavailable": "Personeelsrolupdates zijn op deze server nog niet beschikbaar.", - "flash.admin.catalogCloned": "{source} gekopieerd naar {dest}: {products} producten, {categories} categorieën.", - "flash.admin.fixA1Success": "Catalogusreparatie voor {name} voltooid: {prompts} prompts bijgewerkt, {hashes} hashes gewist, {categories} categorieën aangevuld.", + "flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.", + "flash.admin.fixA1Success": "Catalog repair finished for {name}: {prompts} prompts, {hashes} hashes, {categories} processed←mapped, {mapped_backfilled} mapped←processed. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).", "flash.admin.fixA1Error": "Catalogusreparatie voor {name} mislukt.", + "flash.admin.cloneDestMissing": "No sandbox destination. Switch to Platform Demo (staff home), then clone again.", "flash.admin.planAssigned": "Plan toegewezen aan {name}.", "flash.admin.planAssignedShort": "Plan toegewezen.", "flash.admin.creditsUpdated": "Credits bijgewerkt.", @@ -2315,14 +2316,14 @@ export const nl: MessageDict = { "flash.admin.smtpOff": "uit", "flash.admin.localPasswordSet": "Lokaal wachtwoord ingesteld voor {email}.", "flash.admin.localPasswordUnavailable": "Lokale wachtwoordtools zijn in deze omgeving niet beschikbaar.", - "flash.admin.switchedUser": "Gebruiker gewisseld. Bezig met herladen…", + "flash.admin.switchedUser": "Gebruiker gewisseld. Bezig met herladen…", "flash.admin.switchUnavailable": "Gebruikerswisseling is in deze omgeving niet beschikbaar.", "flash.admin.diagnosticsRateLimit": "Diagnostieklimiet bereikt (20/min). Wacht een minuut en vernieuw.", "flash.admin.smtpSaved": "Platform-SMTP-instellingen opgeslagen. Wachtwoorden blijven verborgen.", "flash.admin.integrationSaved": "Integratie-instellingen opgeslagen. Geheime velden worden nooit opnieuw volledig getoond.", "flash.admin.aiSaved": "{label}-AI-instellingen opgeslagen. API-sleutels worden nooit meer getoond.", "flash.admin.cleanup": "Opruimen: {jobs} taken mislukt, {products} producten gereset.", - "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", + "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", "flash.admin.orphanDeleted": "Deleted {deleted} orphan row(s). Remaining: {remaining}.", "flash.admin.articleUpdated": "Artikel bijgewerkt.", "flash.admin.articleCreated": "Artikel aangemaakt.", @@ -2331,13 +2332,13 @@ export const nl: MessageDict = { "flash.admin.articleDeleted": "Artikel verwijderd.", "flash.admin.templateDeleted": "Sjabloon verwijderd.", "flash.admin.autoReplySaved": "Auto-antwoordinstellingen opgeslagen.", - "flash.admin.imageUploaded": "Afbeelding geüpload en in markdown geplaatst.", + "flash.admin.imageUploaded": "Afbeelding geüpload en in markdown geplaatst.", "flash.admin.translationsSaved": "{count} string(s) opgeslagen voor {locale}. Commit het message pack wanneer klaar.", "flash.admin.featuresUpdated": "{key} bijgewerkt.", "flash.admin.featuresAllOn": "Alle functies ingeschakeld voor dit plan.", "flash.admin.featuresAllOff": "Alle functies uitgeschakeld voor dit plan.", "flash.admin.profileApplied": "Profiel {label} toegepast op {name}.", - "flash.admin.overridesCleared": "Overrides gewist — standaardwaarden van plannaam worden gebruikt.", + "flash.admin.overridesCleared": "Overrides gewist — standaardwaarden van plannaam worden gebruikt.", "empty.plans.none": "Geen plannen gevonden.", "empty.plans.noMatch": "Geen plannen komen overeen met dit filter.", "empty.plans.selectPackage": "Selecteer een pakket om functies te bewerken.", @@ -2350,7 +2351,7 @@ export const nl: MessageDict = { "empty.products.errorMessage": "Als een taak voor een product mislukt, verschijnt het hier zodat u opnieuw kunt proberen.", "empty.products.filterTitleUnprocessed": "Geen onverwerkte overeenkomsten", "empty.products.filterTitle": "Geen producten komen overeen", - "empty.products.filterMessage": "Probeer een andere zoekopdracht, categorie of feed — of wis filters om alles te zien.", + "empty.products.filterMessage": "Probeer een andere zoekopdracht, categorie of feed — of wis filters om alles te zien.", "empty.products.unprocessedTitle": "Nog geen onverwerkte producten", "empty.products.unprocessedMessage": "Koppel een leveranciersfeed of upload een CSV om producten te importeren.", "empty.products.noneTitle": "Nog geen producten", @@ -2365,21 +2366,21 @@ export const nl: MessageDict = { "empty.products.addProduct": "Product toevoegen", "empty.products.uploadCsv": "CSV uploaden", "empty.feeds.noneTitle": "Nog geen productfeeds", - "empty.feeds.noneMessage": "Verbind een leveranciers-CSV/XML-URL of upload een bestand. Volgende: Map → Sync → Process.", + "empty.feeds.noneMessage": "Verbind een leveranciers-CSV/XML-URL of upload een bestand. Volgende: Map → Sync → Process.", "empty.feeds.noMatchTitle": "Geen overeenkomende feeds", "empty.feeds.noMatchMessage": "Probeer een andere zoekterm, of wis de zoekopdracht om alle feeds te zien.", "empty.export.loadFailedTitle": "Exportfeeds laden mislukt", "empty.export.loadFailedMessage": "Er ging iets mis bij het laden van uw exports. Probeer opnieuw of bekijk de fout hierboven voor details.", "empty.export.noneTitle": "Nog geen exportfeeds", - "empty.export.noneMessage": "Maak een Google Shopping-, Meta- of aangepaste CSV/XML-feed om te kiezen welke producten en velden eruit gaan. Genereer een openbare URL voor Merchant Center of elke partner — of exporteer een subset via Producten.", + "empty.export.noneMessage": "Maak een Google Shopping-, Meta- of aangepaste CSV/XML-feed om te kiezen welke producten en velden eruit gaan. Genereer een openbare URL voor Merchant Center of elke partner — of exporteer een subset via Producten.", "empty.export.noMatchTitle": "Geen overeenkomende feeds", "empty.export.noMatchMessage": "Probeer een andere zoekterm.", "empty.files.noneTitle": "Nog geen uploads", - "empty.files.noneMessage": "CSV-imports voor producten, categorieën en attributen verschijnen hier na upload. Na een platformmigratie zijn bestandsinhouden (blobs) niet gekopieerd — upload opnieuw als je die nodig hebt.", + "empty.files.noneMessage": "CSV-imports voor producten, categorieën en attributen verschijnen hier na upload. Na een platformmigratie zijn bestandsinhouden (blobs) niet gekopieerd — upload opnieuw als je die nodig hebt.", "empty.files.uploadCta": "CSV uploaden", "empty.export.fromProductsCta": "Exporteren vanuit Producten", "empty.dashboard.noJobsTitle": "Geen recente jobs", - "empty.dashboard.noJobsMessage": "Jobs verschijnen hier nadat u verwerking start vanuit Producten. Verrijk titels en beschrijvingen vóór export.", + "empty.dashboard.noJobsMessage": "Jobs verschijnen hier nadat u verwerking start vanuit Producten. Verrijk titels en beschrijvingen vóór export.", "empty.stores.noneTitle": "Nog geen winkel verbonden", "empty.stores.noneMessage": "Verbind WooCommerce of Shopify om catalogus en bestellingen te synchroniseren. Leveranciersbestand? Gebruik feed-URL of CSV-upload.", "empty.stores.noneTitleMember": "Nog geen store verbonden", @@ -2393,14 +2394,14 @@ export const nl: MessageDict = { "empty.calendar.noneTitle": "Geen seizoenspresets", "empty.calendar.noneMessage": "Kalenderpresets verschijnen hier wanneer de marketing-API beschikbaar is.", "empty.seo.noneTitle": "Geen catalogus om te scoren", - "empty.seo.noneMessage": "Verwerk eerst producten of voeg categorieën toe. SEO-scores verschijnen zodra er catalogusgegevens zijn.", - "empty.vector.unavailableTitle": "Vectorcategorieën niet beschikbaar", + "empty.seo.noneMessage": "Verwerk eerst producten of voeg categorieën toe. SEO-scores verschijnen zodra er catalogusgegevens zijn.", + "empty.vector.unavailableTitle": "Vectorcategorieën niet beschikbaar", "empty.vector.noMatchTitle": "Nog geen overeenkomsten", "empty.vector.noMatchMessage": "Voer een productbeschrijving in en zoek om vectorcategorie-overeenkomsten te zien.", "empty.structured.unavailableTitle": "Gestructureerde beschrijvingen niet beschikbaar", "empty.structured.unavailableMessage": "Deze API zit nog niet op deze backend. U kunt Export ID-velden hier pas beheren als /api/structured-descriptions is aangesloten.", "empty.structured.noneTitle": "Nog geen gestructureerde beschrijvingsvelden", - "empty.structured.noneMessage": "Voeg hier een veld toe of maak Export ID’s in een categoriebeschrijvingsformule — ze verschijnen voor exportfeeds.", + "empty.structured.noneMessage": "Voeg hier een veld toe of maak Export ID’s in een categoriebeschrijvingsformule — ze verschijnen voor exportfeeds.", "empty.support.unavailableTitle": "Support niet beschikbaar", "empty.support.noneTitle": "Nog geen tickets", "empty.support.unavailableMessage": "De support-API is niet bereikbaar. Probeer zo opnieuw of open een nieuw ticket als de dienst online is.", @@ -2450,26 +2451,26 @@ export const nl: MessageDict = { "empty.admin.noUsersMatch": "Geen gebruikers komen overeen met dit filter.", "empty.admin.noCompaniesMatchFilter": "Geen bedrijven komen overeen met dit filter.", "blast.title": "E-mailblast bevestigen", - "blast.dryRunDescription": "Dry-run is actief — er vertrekken geen echte e-mails uit Descrybe. Bevestig om de dry-run vast te leggen.", + "blast.dryRunDescription": "Dry-run is actief — er vertrekken geen echte e-mails uit Descrybe. Bevestig om de dry-run vast te leggen.", "blast.liveDescription": "Dit stuurt echte e-mails naar uw publiek. Typ I understand om door te gaan.", "blast.recipients": "Ontvangers in dit verzoek: {count}", - "blast.typePhrase": "Typ “I understand”", + "blast.typePhrase": "Typ “I understand”", "blast.placeholder": "I understand", "blast.runDryRun": "Dry-run uitvoeren", "blast.send": "Blast verzenden", "marketing.footerBefore": "E-mailcampagnes blijven op", - "marketing.footerAfter": "— deze pagina bereidt alleen catalogus-exportfeeds voor.", + "marketing.footerAfter": "— deze pagina bereidt alleen catalogus-exportfeeds voor.", "support.title": "Supportcentrum", "support.description": "Openen a ticket for facturering, bugs, or account help. Personeel replies show here and as in-app notifications.", "support.newTicket": "Nieuw ticket", "support.createTicket": "Ticket maken", - "support.loadingTickets": "Laden tickets…", + "support.loadingTickets": "Laden tickets…", "support.loadFailed": "Supporttickets laden mislukt", "support.unavailableBanner": "Ondersteuning is not fully beschikbaar yet. You can still prepare a ticket; submitting may wait until the service is ready.", "support.yourTickets": "Jouw tickets", "support.ticketCount": "{count} tickets", "support.ticketCountOne": "{count} ticket", - "support.statusFilterSuffix": "· status {status}", + "support.statusFilterSuffix": "· status {status}", "support.filterByStatus": "Filteren by status", "support.unavailableTitle": "Support niet beschikbaar", "support.emptyTitle": "Nog geen tickets", @@ -2498,7 +2499,7 @@ export const nl: MessageDict = { "support.new.category": "Categorie", "support.new.priority": "Prioriteit", "support.new.optional": "Optioneel details", - "support.new.optionalHint": "(SKU, tags — helpt bij routering)", + "support.new.optionalHint": "(SKU, tags — helpt bij routering)", "support.new.relatedSku": "Gerelateerde SKU", "support.new.relatedSkuPlaceholder": "bijv. ABC-123", "support.new.relatedSkuHelp": "Product- of feed-SKU als dit over een specifiek item gaat.", @@ -2511,27 +2512,27 @@ export const nl: MessageDict = { "support.new.createdTitle": "Ticket aangemaakt", "support.new.createdBody": "We antwoorden in deze thread. Let op in-app-meldingen.", "support.new.viewTicket": "Bekijken ticket", - "support.new.unavailable": "Ondersteuning is temporarily niet beschikbaar. Your message was not submitted — try again shortly.", + "support.new.unavailable": "Ondersteuning is temporarily niet beschikbaar. Your message was not submitted — try again shortly.", "support.new.unavailableTitle": "Support niet beschikbaar", "support.new.createFailed": "Ticket kon niet worden aangemaakt", "support.ticket.fallbackTitle": "Ondersteuning ticket", "support.ticket.description": "Conversation thread with Descrybe ondersteuning.", - "support.ticket.meta": "{category} · {priority} · Bijgewerkt {when}", + "support.ticket.meta": "{category} · {priority} · Bijgewerkt {when}", "support.ticket.allTickets": "Alles tickets", - "support.ticket.loading": "Laden ticket…", + "support.ticket.loading": "Laden ticket…", "support.ticket.missingId": "Ticket-id ontbreekt", "support.ticket.notFound": "Ticket niet gevonden", "support.ticket.notFoundMessage": "Dit ticket is mogelijk verwijderd of u heeft geen toegang.", "support.ticket.backCenter": "Terug to Ondersteuning Center", "support.ticket.unavailable": "Support is tijdelijk niet beschikbaar.", "support.ticket.loadFailed": "Ticket laden mislukt", - "support.ticket.openedMeta": "Openened {when} · {category} · {priority} priority", + "support.ticket.openedMeta": "Openened {when} · {category} · {priority} priority", "support.ticket.sku": "SKU {sku}", "support.ticket.messagesAria": "Ticketberichten", "support.ticket.noMessages": "Geen berichten", "support.ticket.noMessagesHelp": "Deze thread heeft nog geen berichten.", "support.ticket.yourReply": "Jouw antwoord", - "support.ticket.replyPlaceholder": "Add details or reply to ondersteuning…", + "support.ticket.replyPlaceholder": "Add details or reply to ondersteuning…", "support.ticket.sendReply": "Antwoord versturen", "support.ticket.replySent": "Antwoord verzonden", "support.ticket.reopened": "Ticket heropend voor teamreview.", @@ -2552,12 +2553,12 @@ export const nl: MessageDict = { "support.progress.resolved.title": "Gemarkeerd als opgelost", "support.progress.resolved.message": "We denken dat dit is opgelost. Antwoord om te heropenen, of laat hieronder een snelle beoordeling achter.", "support.progress.quickAnswer.title": "Snel antwoord verzonden", - "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply hier — a human will take over.", + "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply hier — a human will take over.", "support.progress.onIt.title": "We zijn ermee bezig", "support.progress.onIt.handedMessage": "A ondersteuning teammate has your ticket and will reply in this thread.", "support.progress.onIt.pendingMessage": "Ondersteuning is reviewing your message. You will see updates in this thread.", "support.progress.received.title": "Ticket ontvangen", - "support.progress.received.message": "Bedankt — we hebben je verzoek. Geautomatiseerde hulp kan zo verschijnen, of een collega antwoordt.", + "support.progress.received.message": "Bedankt — we hebben je verzoek. Geautomatiseerde hulp kan zo verschijnen, of een collega antwoordt.", "support.category.billing": "Facturering", "support.category.billing.help": "Facturen, payment methods, plan changes, and Stripe receipts.", "support.category.billing_credits": "Facturering / credits", @@ -2573,15 +2574,15 @@ export const nl: MessageDict = { "support.category.export": "Exporteren / channels", "support.category.export.help": "Exporteren feeds, channels, and sync destinations.", "support.category.migration": "Migratie / data", - "support.category.migration.help": "Ontbrekende of verkeerde data na cutover — producten, feeds, stores, facturering of team.", + "support.category.migration.help": "Ontbrekende of verkeerde data na cutover — producten, feeds, stores, facturering of team.", "support.category.other": "Overig", - "support.category.other.help": "Iets anders — we sturen het naar de juiste collega.", + "support.category.other.help": "Iets anders — we sturen het naar de juiste collega.", "support.priority.low": "Laag", - "support.priority.low.help": "Nice-to-have of niet-blokkerend — we behandelen het op volgorde.", + "support.priority.low.help": "Nice-to-have of niet-blokkerend — we behandelen het op volgorde.", "support.priority.normal": "Normaal", "support.priority.normal.help": "Standaardverzoek. De meeste tickets gebruiken dit.", "support.priority.high": "Hoog", - "support.priority.high.help": "Blokkeert werk of omzet — spaarzaam gebruiken.", + "support.priority.high.help": "Blokkeert werk of omzet — spaarzaam gebruiken.", "support.csat.thanks": "Bedankt voor uw feedback", "support.csat.unavailable": "Beoordeling is tijdelijk niet beschikbaar. Probeer het later opnieuw.", "support.csat.unavailableTitle": "Beoordeling niet beschikbaar", @@ -2591,9 +2592,9 @@ export const nl: MessageDict = { "support.csat.yourRating": "Jouw beoordeling", "support.csat.ratedOutOf": "Je beoordeelde dit ticket met {score} van 5", "support.csat.howDidWeDo": "Hoe deden we het?", - "support.csat.formHelp": "This ticket is {status}. Rate your experience (1–5). Optioneel comment helps us improve.", + "support.csat.formHelp": "This ticket is {status}. Rate your experience (1–5). Optioneel comment helps us improve.", "support.csat.rating": "Beoordeling", - "support.csat.scoreAria": "{value} — {label}", + "support.csat.scoreAria": "{value} — {label}", "support.csat.whatWentWrong": "What went wrong? (optioneel)", "support.csat.whatWentWrongPlaceholder": "Een korte notitie helpt ons bij de opvolging.", "support.csat.anythingElse": "Anything else? (optioneel)", @@ -2605,11 +2606,11 @@ export const nl: MessageDict = { "support.csat.score.4": "Tevreden", "support.csat.score.5": "Zeer tevreden", "catalog.delete": "Verwijderen", - "catalog.deleting": "Verwijderen…", - "catalog.saving": "Opslaan…", - "catalog.adding": "Bezig met toevoegen…", - "catalog.assigning": "Toewijzen…", - "catalog.uploading": "Uploaden…", + "catalog.deleting": "Verwijderen…", + "catalog.saving": "Opslaan…", + "catalog.adding": "Bezig met toevoegen…", + "catalog.assigning": "Toewijzen…", + "catalog.uploading": "Uploaden…", "catalog.create": "Maken", "catalog.createFailed": "Aanmaken mislukt", "catalog.updateFailed": "Bijwerken mislukt", @@ -2636,7 +2637,7 @@ export const nl: MessageDict = { "catalog.closePanel": "Paneel sluiten", "catalog.closeMenus": "Menu's sluiten", "catalog.openMenu": "Menu openen", - "catalog.loading": "Laden…", + "catalog.loading": "Laden…", "catalog.empty": "Leeg", "catalog.required": "Verplicht", "catalog.optional": "Optioneel", @@ -2673,7 +2674,7 @@ export const nl: MessageDict = { "products.status.unprocessed": "Onverwerkt", "products.status.pending": "In behandeling", "products.status.unknown": "Onbekend", - "products.pagination.showing": "Weergave {start}–{end} van {total}", + "products.pagination.showing": "Weergave {start}–{end} van {total}", "products.empty.processing.title": "Nog geen jobs", "products.empty.processing.messageJobs": "Er draait nu niets. Start een job vanaf Onverwerkt, of open Verwerking om de voortgang te volgen.", "products.empty.processing.messageBasic": "Producten verschijnen hier terwijl een job draait.", @@ -2683,12 +2684,12 @@ export const nl: MessageDict = { "products.empty.error.message": "Als een taak voor een product mislukt, verschijnt het hier zodat u opnieuw kunt proberen.", "products.empty.noUnprocessedMatches": "Geen onverwerkte overeenkomsten", "products.empty.noMatch": "Geen producten komen overeen", - "products.empty.filtersHint": "Probeer een andere zoekopdracht, categorie of feed — of wis filters om alles te zien.", + "products.empty.filtersHint": "Probeer een andere zoekopdracht, categorie of feed — of wis filters om alles te zien.", "products.empty.noUnprocessed.title": "Nog geen onverwerkte producten", "products.empty.noUnprocessed.message": "Koppel een leveranciersfeed of upload een CSV om producten te importeren.", "products.empty.none.title": "Nog geen producten", - "products.empty.none.messageStores": "Rond eerst Feeds → Map → Sync af, daarna Process. Importeer vanuit een feed of winkel.", - "products.empty.none.messageBasic": "Rond eerst Feeds → Map → Sync af, daarna Process. Koppel een feed of upload een CSV.", + "products.empty.none.messageStores": "Rond eerst Feeds → Map → Sync af, daarna Process. Importeer vanuit een feed of winkel.", + "products.empty.none.messageBasic": "Rond eerst Feeds → Map → Sync af, daarna Process. Koppel een feed of upload een CSV.", "products.actions.viewJobs": "Taken bekijken", "products.actions.startJob": "Een taak starten", "products.actions.viewProcessed": "Verwerkte bekijken", @@ -2704,7 +2705,7 @@ export const nl: MessageDict = { "products.export.selectFormat": "Selecteer een exportfeed.", "products.export.failed": "Kon geselecteerde producten niet exporteren", "products.upload.title": "CSV uploaden", - "products.upload.description": "Importeer producten uit een CSV (GTIN/EAN, naam, categorie, …). Download het voorbeeld voor de volledige kolomset.", + "products.upload.description": "Importeer producten uit een CSV (GTIN/EAN, naam, categorie, …). Download het voorbeeld voor de volledige kolomset.", "products.upload.submit": "Uploaden en importeren", "products.upload.chooseFirst": "Kies eerst een CSV-bestand.", "products.upload.csvOnly": "Upload een CSV-bestand.", @@ -2718,7 +2719,7 @@ export const nl: MessageDict = { "products.processing.justCancelled": "De zojuist gestarte taak is geannuleerd.", "products.processing.viewInProcessing": "Bekijken in Verwerking", "products.processing.confirm": "Verwerking bevestigen", - "products.processing.freePlanTitle": "Free-plan — verwerking zonder AI", + "products.processing.freePlanTitle": "Free-plan — verwerking zonder AI", "products.processing.freePlanBody": "Normaalize, specs, fill, and EPREL run at no credit cost. AI titles/descriptions require a paid plan or credits.", "products.enrichment.acceptTitle": "Verrijking accepteren?", "products.enrichment.acceptConfirm": "Acceptatie van verrijking bevestigen", @@ -2728,8 +2729,8 @@ export const nl: MessageDict = { "products.enrichment.rejectSelectedConfirm": "Afwijzing van selectie bevestigen", "products.enrichment.resetConfirm": "Reset naar onverwerkt bevestigen", "products.enrichment.resetSelected": "{count} geselecteerde product(en) resetten naar onverwerkt? Ze verschijnen weer als onverwerkte items.", - "products.enrichment.accepted": "Verrijking geaccepteerd — verplaatst naar Verwerkt.", - "products.enrichment.rejected": "Verrijking afgewezen — product teruggezet naar onverwerkt.", + "products.enrichment.accepted": "Verrijking geaccepteerd — verplaatst naar Verwerkt.", + "products.enrichment.rejected": "Verrijking afgewezen — product teruggezet naar onverwerkt.", "products.enrichment.acceptFailed": "Verrijking accepteren mislukt", "products.enrichment.rejectFailed": "Verrijking afwijzen mislukt", "products.enrichment.acceptUndone": "Acceptatie ongedaan gemaakt", @@ -2748,7 +2749,7 @@ export const nl: MessageDict = { "products.updateFailed": "Product bijwerken mislukt", "products.keyboardTips": "Toetsenbordsneltoetsen", "products.keyboardTipsShort": "Toetsenbordsneltoetsen (?)", - "products.option.categories": "Categorieën", + "products.option.categories": "Categorieën", "products.option.attributes": "Attributen / specificaties", "products.option.titlesAi": "Titels (AI)", "products.option.descriptionsAi": "Beschrijvingen (AI)", @@ -2764,12 +2765,12 @@ export const nl: MessageDict = { "products.enrichment.help.attributes": "Specs en attributen. Groen = AI-/verrijkte attributen; oranje = alleen uit feed; grijs = geen.", "products.enrichment.help.category": "Toegewezen categorie. Groen = categorie ingesteld; grijs = ontbreekt.", "products.enrichment.chipTitle": "{label}: {state}. {help}", - "products.enrichment.complete": "Compleet — {parts}", - "products.enrichment.missingSummary": "Ontbreekt {missing} — {parts}", + "products.enrichment.complete": "Compleet — {parts}", + "products.enrichment.missingSummary": "Ontbreekt {missing} — {parts}", "products.issue.title": "titel", "products.issue.gtin": "GTIN", "products.issue.category": "categorie", - "products.filters.allCategories": "Alle categorieën", + "products.filters.allCategories": "Alle categorieën", "products.filters.allFeeds": "Alle feeds", "products.filters.allCoverage": "Alle dekking", "products.filters.anyFeedChange": "Elke feedwijziging", @@ -2790,7 +2791,7 @@ export const nl: MessageDict = { "attributes.title": "Attributen", "attributes.description": "Definieer productvelden, lijstwaarden en categorietoewijzingen.", "attributes.loadFailed": "Attributen laden mislukt", - "attributes.loading": "Attributen laden…", + "attributes.loading": "Attributen laden…", "attributes.zero": "0 attributen", "attributes.addNew": "Nieuw attribuut toevoegen", "attributes.create": "Attribuut maken", @@ -2806,30 +2807,30 @@ export const nl: MessageDict = { "attributes.manageValues": "Waarden voor dit lijstattribuut toevoegen, bewerken of verwijderen.", "attributes.valueTypeHint": "Kies hoe waarden voor dit attribuut worden ingevoerd.", "attributes.createDescription": "Maak een nieuwe attribuutdefinitie. U kunt deze tijdens het aanmaken aan een categorie toewijzen.", - "attributes.assignToCategories": "Attributen aan categorieën toewijzen", + "attributes.assignToCategories": "Attributen aan categorieën toewijzen", "attributes.assignFailed": "Kon attribuut niet toewijzen aan de geselecteerde categorie.", "attributes.bulkAssignFailed": "Bulksgewijs toewijzen mislukt", "attributes.filterByCategory": "Filteren op categorie", "attributes.saveValueFailed": "Kon waarde niet opslaan", "attributes.deleteValueFailed": "Kon waarde niet verwijderen", - "attributes.csvNeedHeader": "CSV moet een koptekst en minstens één rij bevatten", + "attributes.csvNeedHeader": "CSV moet een koptekst en minstens één rij bevatten", "attributes.csvNeedColumns": "CSV moet de kolommen \"category_id\" en \"attribute_key\" bevatten", "attributes.type.string": "Tekst", - "attributes.type.stringHint": "Vrije tekst — namen, modellen, korte notities", + "attributes.type.stringHint": "Vrije tekst — namen, modellen, korte notities", "attributes.type.number": "Nummer", "attributes.type.numberHint": "Numerieke waarde; voeg een eenheid toe indien nuttig (cm, kg, W)", "attributes.type.boolean": "Ja / Nee", - "attributes.type.booleanHint": "Waar of onwaar — bijv. heeft GPS, draadloos laden", + "attributes.type.booleanHint": "Waar of onwaar — bijv. heeft GPS, draadloos laden", "attributes.type.date": "Datum", - "attributes.type.dateHint": "Een kalenderdatum (release, einde garantie, …)", + "attributes.type.dateHint": "Een kalenderdatum (release, einde garantie, …)", "attributes.type.list": "Dropdown", - "attributes.type.listHint": "Kies precies één optie uit een gedefinieerde lijst", + "attributes.type.listHint": "Kies precies één optie uit een gedefinieerde lijst", "attributes.type.multiselect": "Meervoudige selectie", "attributes.type.multiselectHint": "Kies een of meer opties uit een lijst", "attributes.color": "Kleur", - "categories.title": "Categorieën", - "categories.description": "Organiseer uw catalogushiërarchie. Bewerk een categorie voor titel-/beschrijvingsformules en AI-prompts.", - "categories.loadFailed": "Categorieën laden mislukt", + "categories.title": "Categorieën", + "categories.description": "Organiseer uw catalogushiërarchie. Bewerk een categorie voor titel-/beschrijvingsformules en AI-prompts.", + "categories.loadFailed": "Categorieën laden mislukt", "categories.add": "Categorie toevoegen", "categories.edit": "Categorie bewerken", "categories.delete": "Categorie verwijderen", @@ -2844,19 +2845,19 @@ export const nl: MessageDict = { "categories.deleted": "De categorie is succesvol verwijderd.", "categories.notFound": "Categorie niet gevonden.", "categories.loadCategoryFailed": "Categorie laden mislukt", - "categories.noCategoriesYet": "Nog geen categorieën", - "categories.noMatch": "Geen categorieën komen overeen met “{query}”. Wis de zoekopdracht of probeer een andere term.", + "categories.noCategoriesYet": "Nog geen categorieën", + "categories.noMatch": "Geen categorieën komen overeen met “{query}”. Wis de zoekopdracht of probeer een andere term.", "categories.emptyHint": "Voeg een categorie toe of importeer een CSV om uw boom te bouwen.", - "categories.promptCountOne": "{count} categorie heeft een AI-generatieprompt. Open het menu ⋮ → AI-prompt bewerken, of bewerk een categorie en kies AI-prompt bewerken.", - "categories.promptCountMany": "{count} categorieën hebben een AI-generatieprompt. Open het menu ⋮ → AI-prompt bewerken, of bewerk een categorie en kies AI-prompt bewerken.", + "categories.promptCountOne": "{count} categorie heeft een AI-generatieprompt. Open het menu â‹® → AI-prompt bewerken, of bewerk een categorie en kies AI-prompt bewerken.", + "categories.promptCountMany": "{count} categorieën hebben een AI-generatieprompt. Open het menu â‹® → AI-prompt bewerken, of bewerk een categorie en kies AI-prompt bewerken.", "categories.actions": "Categorie-acties", "categories.chooseCsv": "CSV kiezen", - "categories.createSingleOrImport": "Maak één categorie of importeer er veel via CSV.", - "categories.createSingle": "Eén categorie maken.", + "categories.createSingleOrImport": "Maak één categorie of importeer er veel via CSV.", + "categories.createSingle": "Eén categorie maken.", "categories.missingNameColumn": "Verplichte kolom 'name' ontbreekt", "categories.missingUniqueIdColumn": "Verplichte kolom 'unique_id' ontbreekt", "categories.nameAndIdRequired": "Naam en unieke ID zijn verplicht.", - "categories.csvNeedRows": "Het bestand moet een kopregel en minstens één gegevensregel bevatten", + "categories.csvNeedRows": "Het bestand moet een kopregel en minstens één gegevensregel bevatten", "categories.titleFormula": "Titelformule", "categories.descriptionFormula": "Beschrijvingsformule", "categories.setTitleFormula": "Titelformule instellen", @@ -2874,36 +2875,36 @@ export const nl: MessageDict = { "categories.aiPromptSaveFailed": "Prompt opslaan mislukt", "categories.aiPromptAssignFailed": "Prompt toewijzen mislukt", "categories.assignAiPrompt": "AI-prompt toewijzen", - "categories.assignAiPromptHelp": "Kopieer deze AI-generatieprompt naar andere categorieën.", - "categories.loadingPrompt": "Prompt laden…", + "categories.assignAiPromptHelp": "Kopieer deze AI-generatieprompt naar andere categorieën.", + "categories.loadingPrompt": "Prompt laden…", "categories.brandVoice": "Merkstem", "categories.productName": "Productnaam", "categories.gtin": "GTIN", - "categories.backToCategories": "Terug naar categorieën", - "categories.cancelReturn": "Annuleren en terug naar categorieën", + "categories.backToCategories": "Terug naar categorieën", + "categories.cancelReturn": "Annuleren en terug naar categorieën", "categories.assignFormula": "Formule toewijzen", - "categories.assignFormulaOther": "Formule aan andere categorieën toewijzen", + "categories.assignFormulaOther": "Formule aan andere categorieën toewijzen", "categories.assignTitleFormula": "Titelformule toewijzen", "categories.assignDescriptionFormula": "Beschrijvingsformule toewijzen", - "categories.assignSelectHelp": "Selecteer de categorieën voor dit sjabloon.", - "categories.assignTitleHelp": "Selecteer de categorieën voor dit titelformule-sjabloon.", - "categories.assignDescriptionHelp": "Selecteer de categorieën voor dit beschrijvingsformule-sjabloon.", - "categories.searchCategories": "Categorieën zoeken…", + "categories.assignSelectHelp": "Selecteer de categorieën voor dit sjabloon.", + "categories.assignTitleHelp": "Selecteer de categorieën voor dit titelformule-sjabloon.", + "categories.assignDescriptionHelp": "Selecteer de categorieën voor dit beschrijvingsformule-sjabloon.", + "categories.searchCategories": "Categorieën zoeken…", "categories.matching": " overeenkomende", "categories.titleFormulaHelp": "Bouw producttitels uit variabelen en statische tekst voor deze categorie.", "categories.descriptionFormulaHelp": "Definieer SEO-metatekst en bodysecties die de AI voor deze categorie moet genereren.", - "categories.loadingFormula": "Formule laden…", + "categories.loadingFormula": "Formule laden…", "categories.titleFormulaSaved": "Titelformule succesvol opgeslagen", "categories.titleFormulaRemoved": "Titelformule succesvol verwijderd", "categories.titleFormulaSaveFailed": "Titelformule opslaan mislukt", "categories.titleFormulaAssignFailed": "Titelformule toewijzen mislukt", "categories.descriptionFormulaRemoved": "Beschrijvingsformule succesvol verwijderd", "categories.descriptionFormulaSaved": "Beschrijvingsformule succesvol opgeslagen", - "categories.descriptionFormulaSavedWithExports": "Beschrijvingsformule succesvol opgeslagen en {count} export-ID’s gesynchroniseerd", + "categories.descriptionFormulaSavedWithExports": "Beschrijvingsformule succesvol opgeslagen en {count} export-ID’s gesynchroniseerd", "categories.descriptionFormulaSaveFailed": "Beschrijvingsformule opslaan mislukt", "categories.descriptionFormulaAssignFailed": "Beschrijvingsformule toewijzen mislukt", - "categories.seoTitlePlaceholder": "Vertel de AI hoe de SEO-titel geschreven moet worden…", - "categories.seoDescriptionPlaceholder": "Vertel de AI hoe de SEO-beschrijving geschreven moet worden…", + "categories.seoTitlePlaceholder": "Vertel de AI hoe de SEO-titel geschreven moet worden…", + "categories.seoDescriptionPlaceholder": "Vertel de AI hoe de SEO-beschrijving geschreven moet worden…", "categories.sectionPromptPlaceholder": "Wat moet de AI in dit gedeelte schrijven?", "categories.sectionKeyPlaceholder": "bijv. short_description (letters, cijfers, _)", "categories.formulaElementTypes": "Formule-elementtypen", @@ -2916,7 +2917,7 @@ export const nl: MessageDict = { "categories.customVariableHelp": "Definieer een herbruikbare variabele voor titelformules.", "categories.manageVariables": "Variabelen beheren", "categories.manageVariablesHelp": "Bekijk, bewerk en voeg variabelen toe voor uw titelformules.", - "categories.searchVariables": "Variabelen zoeken…", + "categories.searchVariables": "Variabelen zoeken…", "categories.variableAdded": "Variabele succesvol toegevoegd", "categories.variableUpdated": "Variabele succesvol bijgewerkt", "categories.variableDeleted": "Variabele succesvol verwijderd", @@ -2924,7 +2925,7 @@ export const nl: MessageDict = { "categories.variableNameRequired": "Variabelenaam is verplicht", "categories.displayNameRequired": "Weergavenaam is verplicht", "categories.variableNamePattern": "De naam mag alleen letters, cijfers en underscores bevatten", - "categories.deleteVariableConfirm": "Weet u zeker dat u deze variabele wilt verwijderen? Dit kan formules beïnvloeden die haar gebruiken.", + "categories.deleteVariableConfirm": "Weet u zeker dat u deze variabele wilt verwijderen? Dit kan formules beïnvloeden die haar gebruiken.", "categories.removeElementConfirm": "Weet u zeker dat u dit element uit uw formule wilt verwijderen?", "categories.addTextElement": "Tekstelement toevoegen", "categories.addTextElementHelp": "Voeg een statisch tekstelement toe aan uw formule.", @@ -2936,7 +2937,7 @@ export const nl: MessageDict = { "categories.exampleWidget": "Acme Widget Pro (voorbeeld)", "fields.title": "Standaardvelden", "fields.description": "Definieer standaard productvelden en organiseer ze in groepen", - "fields.loading": "Standaardvelden laden…", + "fields.loading": "Standaardvelden laden…", "fields.loadFailed": "Velden laden mislukt", "fields.loadGroupsFailed": "Veldgroepen laden mislukt", "fields.addField": "Nieuw veld toevoegen", @@ -2978,7 +2979,7 @@ export const nl: MessageDict = { "fields.deleteFieldConfirm": "Deze actie kan niet ongedaan worden gemaakt. Het veld wordt permanent verwijderd en uit alle sjablonen gehaald die het gebruiken.", "fields.deleteGroupConfirm": "Deze actie kan niet ongedaan worden gemaakt. De groep wordt permanent verwijderd. Velden in deze groep moeten opnieuw worden toegewezen.", "fields.type.string": "Tekst", - "fields.type.stringHint": "Vrije tekst — namen, codes, korte notities", + "fields.type.stringHint": "Vrije tekst — namen, codes, korte notities", "fields.type.number": "Nummer", "fields.type.numberHint": "Numerieke waarde; voeg een eenheid toe indien nuttig (EUR, pcs)", "fields.type.boolean": "Ja / Nee", @@ -3005,25 +3006,25 @@ export const nl: MessageDict = { "flash.attrs.updated": "Attribuut bijgewerkt.", "flash.attrs.deleted": "Attribuut verwijderd.", "flash.attrs.valueDeleted": "Waarde verwijderd.", - "flash.attrs.assignedLinks": "{count} categorie–attribuutkoppeling(en) toegewezen.", + "flash.attrs.assignedLinks": "{count} categorie–attribuutkoppeling(en) toegewezen.", "flash.brand.saved": "Merkkit opgeslagen.", "flash.brand.logoType": "Logo moet PNG, JPEG of WebP zijn", "flash.brand.logoSize": "Logo overschrijdt de limiet van 2 MiB", - "flash.brand.logoUploaded": "Logo geüpload.", + "flash.brand.logoUploaded": "Logo geüpload.", "flash.categories.updated": "De categorie is succesvol bijgewerkt.", "flash.categories.deleted": "De categorie is succesvol verwijderd.", "flash.categories.csvImported": "CSV-import voltooid.", "flash.products.csvImported": "Product CSV import finished.", - "flash.categories.descFormulaAssigned": "Beschrijvingsformule toegewezen aan {count} categorieën", + "flash.categories.descFormulaAssigned": "Beschrijvingsformule toegewezen aan {count} categorieën", "flash.categories.promptAssigned": "Prompt toegewezen aan {count} {noun}.", "flash.categories.promptNounOne": "categorie", - "flash.categories.promptNounMany": "categorieën", + "flash.categories.promptNounMany": "categorieën", "flash.categories.titleFormulaAssigned": "Titelformule toegewezen aan {count} {noun}", "flash.categories.variableDeleted": "Variabele succesvol verwijderd", "flash.export.updated": "Exportfeed bijgewerkt.", "flash.export.created": "Exportfeed aangemaakt.", "flash.export.urlCopied": "Openbare {format}-feed-URL gekopieerd. Plak deze in elk systeem dat productfeeds ophaalt.", - "flash.export.copyFailed": "URL kopiëren naar klembord mislukt", + "flash.export.copyFailed": "URL kopiëren naar klembord mislukt", "flash.export.refreshed": "Feed vernieuwd.", "flash.export.refreshedWithCount": "Feed vernieuwd ({count} producten).", "flash.export.deleted": "Exportfeed succesvol verwijderd.", @@ -3031,10 +3032,10 @@ export const nl: MessageDict = { "common.edit": "Bewerken", "common.previous": "Vorige", "common.next": "Volgende", - "common.saving": "Opslaan…", - "common.deleting": "Verwijderen…", - "common.adding": "Bezig met toevoegen…", - "common.processing": "Bezig met verwerken…", + "common.saving": "Opslaan…", + "common.deleting": "Verwijderen…", + "common.adding": "Bezig met toevoegen…", + "common.processing": "Bezig met verwerken…", "common.upload": "Uploaden", "common.expand": "Uitvouwen", "common.collapse": "Invouwen", @@ -3051,15 +3052,15 @@ export const nl: MessageDict = { "common.areYouSure": "Weet u het zeker?", "common.selectGroup": "Selecteer een groep", "attributes.addAttribute": "Attribuut toevoegen", - "attributes.searchPlaceholder": "Attributen zoeken…", + "attributes.searchPlaceholder": "Attributen zoeken…", "attributes.searchAria": "Attributen zoeken (druk op Enter om te zoeken)", "attributes.filterCategoryAria": "Filteren op categorie", - "attributes.allCategories": "Alle categorieën", + "attributes.allCategories": "Alle categorieën", "attributes.col.name": "Naam", "attributes.col.key": "Attribuutsleutel", "attributes.col.type": "Type", "attributes.col.unit": "Eenheid", - "attributes.col.categories": "Categorieën", + "attributes.col.categories": "Categorieën", "attributes.col.updated": "Laatst bijgewerkt", "attributes.col.actions": "Acties", "attributes.emptyTitle": "Geen attributen gevonden", @@ -3071,7 +3072,7 @@ export const nl: MessageDict = { "attributes.loadingValues": "Waarden laden...", "attributes.noValuesYetHint": "Nog geen waarden toegevoegd. Gebruik \"Manage Values\" om waarden toe te voegen.", "attributes.pageZero": "0 attributen", - "attributes.pageShowing": "{from}–{to} van {total} attributen weergegeven", + "attributes.pageShowing": "{from}–{to} van {total} attributen weergegeven", "attributes.linkCategoryFailed": "Kon attribuut niet toewijzen aan de geselecteerde categorie.", "attributes.createdLinkFailed": "Attribuut aangemaakt, maar categorietoewijzing mislukt.", "attributes.createFailed": "Aanmaken mislukt", @@ -3084,11 +3085,11 @@ export const nl: MessageDict = { "attributes.valueSaveFailed": "Kon waarde niet opslaan", "attributes.valueDeleted": "Waarde verwijderd.", "attributes.valueDeleteFailed": "Kon waarde niet verwijderen", - "attributes.csvNeedRows": "CSV moet een koptekst en minstens één rij bevatten", + "attributes.csvNeedRows": "CSV moet een koptekst en minstens één rij bevatten", "attributes.rowUnknown": "Rij {row}: onbekende categorie of attribuut", "attributes.rowLinkFailed": "Rij {row}: {detail}", "attributes.linkFailedShort": "koppeling mislukt", - "attributes.assignedLinks": "{count} categorie–attribuutkoppeling(en) toegewezen.", + "attributes.assignedLinks": "{count} categorie–attribuutkoppeling(en) toegewezen.", "attributes.rowsFailed": "{count} rij(en) mislukt.", "attributes.addTitle": "Nieuw attribuut toevoegen", "attributes.addDesc": "Maak een nieuwe attribuutdefinitie. U kunt deze tijdens het aanmaken aan een categorie toewijzen.", @@ -3101,7 +3102,7 @@ export const nl: MessageDict = { "attributes.field.type": "Type", "attributes.field.typeDefaultHint": "Kies hoe waarden voor dit attribuut worden ingevoerd.", "attributes.field.category": "Categorie", - "attributes.field.categoryPlaceholder": "Selecteer een categorie…", + "attributes.field.categoryPlaceholder": "Selecteer een categorie…", "attributes.field.categoryHint": "Selecteer de categorie waartoe dit attribuut behoort. Attributen moeten aan een categorie worden toegewezen.", "attributes.field.unitOptional": "Eenheid (optioneel)", "attributes.field.unitPlaceholder": "bijv. cm, kg, enz.", @@ -3135,34 +3136,34 @@ export const nl: MessageDict = { "attributes.displayValueHint": "De weergavenaam die voor deze waarde wordt getoond", "attributes.updateValue": "Waarde bijwerken", "attributes.noValuesYet": "Nog geen waarden.", - "attributes.assignTitle": "Attributen aan categorieën toewijzen", + "attributes.assignTitle": "Attributen aan categorieën toewijzen", "attributes.assignDesc": "Upload een CSV die unieke categorie-ID's koppelt aan attributsleutels.", "attributes.downloadTemplate": "Sjabloon downloaden", "attributes.csvFile": "CSV-bestand", "attributes.assignSuccess": "Toewijzingen succesvol toegepast.", - "attributes.assigning": "Toewijzen…", + "attributes.assigning": "Toewijzen…", "attributes.uploadAndAssign": "Uploaden en toewijzen", "attributes.type.string.label": "Tekst", - "attributes.type.string.hint": "Vrije tekst — namen, modellen, korte notities", + "attributes.type.string.hint": "Vrije tekst — namen, modellen, korte notities", "attributes.type.number.label": "Nummer", "attributes.type.number.hint": "Numerieke waarde; voeg een eenheid toe indien nuttig (cm, kg, W)", "attributes.type.boolean.label": "Ja / Nee", - "attributes.type.boolean.hint": "Waar of onwaar — bijv. heeft GPS, draadloos laden", + "attributes.type.boolean.hint": "Waar of onwaar — bijv. heeft GPS, draadloos laden", "attributes.type.date.label": "Datum", - "attributes.type.date.hint": "Een kalenderdatum (release, einde garantie, …)", + "attributes.type.date.hint": "Een kalenderdatum (release, einde garantie, …)", "attributes.type.list.label": "Dropdown", - "attributes.type.list.hint": "Kies precies één optie uit een gedefinieerde lijst", + "attributes.type.list.hint": "Kies precies één optie uit een gedefinieerde lijst", "attributes.type.multiselect.label": "Meervoudige selectie", "attributes.type.multiselect.hint": "Kies een of meer opties uit een lijst", "standardFields.title": "Standaardvelden", "standardFields.description": "Definieer standaard productvelden en organiseer ze in groepen", "standardFields.apiUnavailable": "De standaardvelden-API is niet beschikbaar. Wijzigingen kunnen niet worden opgeslagen.", "standardFields.apiUnreachable": "De standaardvelden-API is nu niet bereikbaar. Maken/bewerken blijft uitgeschakeld tot /api/standard-fields en /api/field-groups reageren.", - "standardFields.loading": "Standaardvelden laden…", + "standardFields.loading": "Standaardvelden laden…", "standardFields.tab.fields": "Velden", "standardFields.tab.groups": "Groepen", "standardFields.heading": "Standaardvelden", - "standardFields.headingHint": "Schakel velden in voor mapping en verwerking — één schakelaar per rij.", + "standardFields.headingHint": "Schakel velden in voor mapping en verwerking — één schakelaar per rij.", "standardFields.enableRecommended": "Aanbevolen inschakelen", "standardFields.enableSelected": "Selectie inschakelen ({count})", "standardFields.disableSelected": "Selectie uitschakelen", @@ -3179,7 +3180,7 @@ export const nl: MessageDict = { "standardFields.emptyHint": "Geen velden gevonden. Klik op \"Veld toevoegen\" om er een te maken.", "standardFields.selectFieldAria": "{name} selecteren", "standardFields.enableFieldAria": "{name} inschakelen", - "standardFields.systemFieldTitle": "Systeemveld — kan niet worden verwijderd", + "standardFields.systemFieldTitle": "Systeemveld — kan niet worden verwijderd", "standardFields.groupsHeading": "Veldgroepen", "standardFields.addGroup": "Groep toevoegen", "standardFields.searchGroups": "Groepen zoeken...", @@ -3229,7 +3230,7 @@ export const nl: MessageDict = { "standardFields.field.required": "Verplicht veld", "standardFields.field.requiredHint": "Verplichte velden moeten op elke feed gekoppeld zijn voordat producten kunnen synchroniseren.", "standardFields.field.unit": "Eenheid", - "standardFields.field.unitPlaceholder": "kg, EUR, cm…", + "standardFields.field.unitPlaceholder": "kg, EUR, cm…", "standardFields.field.unitHint": "Optionele eenheid bij dit veld", "standardFields.field.description": "Beschrijving", "standardFields.field.descriptionPlaceholder": "Voer een beschrijving in voor dit veld", @@ -3256,7 +3257,7 @@ export const nl: MessageDict = { "standardFields.deleteFieldDesc": "Deze actie kan niet ongedaan worden gemaakt. Het veld wordt permanent verwijderd en uit alle sjablonen gehaald die het gebruiken.", "standardFields.deleteGroupDesc": "Deze actie kan niet ongedaan worden gemaakt. De groep wordt permanent verwijderd. Velden in deze groep moeten opnieuw worden toegewezen.", "standardFields.type.string.label": "Tekst", - "standardFields.type.string.hint": "Vrije tekst — namen, codes, korte notities", + "standardFields.type.string.hint": "Vrije tekst — namen, codes, korte notities", "standardFields.type.number.label": "Nummer", "standardFields.type.number.hint": "Numerieke waarde; voeg een eenheid toe indien nuttig (EUR, pcs)", "standardFields.type.boolean.label": "Ja / Nee", @@ -3288,7 +3289,7 @@ export const nl: MessageDict = { "standardFields.fallback.main_image": "Hoofdafbeelding", "standardFields.fallback.additional_image_urls": "Extra afbeeldingen", "standardFields.fallback.product_url": "Product-URL", - "standardFields.fallback.official_link": "Officiële link", + "standardFields.fallback.official_link": "Officiële link", "standardFields.fallback.sku": "SKU", "standardFields.fallback.mpn": "MPN", "standardFields.fallback.category": "Categorie", @@ -3308,7 +3309,7 @@ export const nl: MessageDict = { "standardFields.fallback.eprel_id": "EPREL-ID", "standardFields.fallback.specs": "Specificaties", "standardFields.fallback.specifications": "Specificaties (legacy)", - "standardFields.tip.gtin": "Global Trade Item Number — barcode/EAN/UPC die het product identificeert.", + "standardFields.tip.gtin": "Global Trade Item Number — barcode/EAN/UPC die het product identificeert.", "standardFields.tip.title": "Klantgerichte productnaam in catalogi en kanalen.", "standardFields.tip.brand": "Naam van de fabrikant of het merk (niet de retailer).", "standardFields.tip.description": "Langere producttekst; voor verrijking en kanaalvermeldingen.", @@ -3322,8 +3323,8 @@ export const nl: MessageDict = { "standardFields.tip.additional_image_urls": "Extra afbeeldings-URL's (kommagescheiden of herhaalde nodes).", "standardFields.tip.product_url": "Openbare productpagina-URL in uw winkel of op uw site.", "standardFields.tip.official_link": "URL van de productpagina van de fabrikant of het merk.", - "standardFields.tip.sku": "Stock Keeping Unit — uw interne artikelcode.", - "standardFields.tip.mpn": "Manufacturer Part Number — onderdeelcode van de leverancier.", + "standardFields.tip.sku": "Stock Keeping Unit — uw interne artikelcode.", + "standardFields.tip.mpn": "Manufacturer Part Number — onderdeelcode van de leverancier.", "standardFields.tip.category": "Productcategorie of taxonomiepad.", "standardFields.tip.availability": "Status zoals op voorraad / niet op voorraad / pre-order.", "standardFields.tip.stock": "Numerieke voorraadhoeveelheid.", @@ -3337,9 +3338,9 @@ export const nl: MessageDict = { "standardFields.tip.specs": "Gestructureerde technische specificaties.", "standardFields.tip.specifications": "Legacy specs-veld; geef de voorkeur aan specs als beide bestaan.", "export.dialog.title": "Geselecteerde producten exporteren", - "export.dialog.description": "Exporteer {count} geselecteerde product(en). Kies de exportfeed die formaat en velden bepaalt — zoals kiezen wat te synchroniseren, maar voor een download of partnerfeed.", + "export.dialog.description": "Exporteer {count} geselecteerde product(en). Kies de exportfeed die formaat en velden bepaalt — zoals kiezen wat te synchroniseren, maar voor een download of partnerfeed.", "export.dialog.loadFailed": "Exportfeedopties laden mislukt. Probeer het opnieuw.", - "export.dialog.selectPlaceholder": "Selecteer een exportfeed…", + "export.dialog.selectPlaceholder": "Selecteer een exportfeed…", "export.dialog.help": "Je selectie kiest de producten; de feed kiest kanaalformaat en gemapte velden.", "export.dialog.emptyTitle": "Nog geen exportfeeds", "export.dialog.emptyMessage": "Maak een exportfeed om formaat en velden te kiezen, en kom daarna terug om deze selectie te exporteren.", @@ -3356,7 +3357,7 @@ export const nl: MessageDict = { "billing.comparePlans": "Plannen vergelijken", "billing.managePayment": "Betaling beheren", "billing.addCredits": "Credits toevoegen", - "billing.addingCredits": "Bezig met toevoegen…", + "billing.addingCredits": "Bezig met toevoegen…", "billing.addCreditsTitle": "Credits toevoegen", "billing.addCreditsDescription": "Alleen platformbeheerder. Credits zijn meteen beschikbaar voor AI-titels, beschrijvingen en andere betaalde stappen.", "billing.creditAmount": "Creditbedrag", @@ -3374,7 +3375,7 @@ export const nl: MessageDict = { "billing.header.noPlan": "Nog geen plan toegewezen. Kies een plan of vraag een bedrijfsbeheerder.", "billing.header.free": "Map feeds en ruim productgegevens op zonder AI-credits.", "billing.header.enterprise": "Onbeperkte producten en AI-capaciteit.", - "billing.header.payg": "Pay as you go — credits komen uit de bedrijfswallet.", + "billing.header.payg": "Pay as you go — credits komen uit de bedrijfswallet.", "billing.header.remaining": "{remaining} AI-credits resterend in deze periode.", "billing.na": "n.v.t.", "billing.range.7d": "laatste 7 dagen", @@ -3392,14 +3393,14 @@ export const nl: MessageDict = { "billing.outOfCreditsMessage": "AI-titels en -beschrijvingen zijn gepauzeerd tot er credits worden toegevoegd of u upgradet.", "billing.productLimitMessage": "Upgrade voor meer productcapaciteit.", "billing.lowCreditsTitle": "Credits raken op", - "billing.lowCreditsMessage": "Nog slechts {remaining} credits over op {plan}. Upgrade vóór uw volgende grote batch.", + "billing.lowCreditsMessage": "Nog slechts {remaining} credits over op {plan}. Upgrade vóór uw volgende grote batch.", "billing.currentPlan": "Huidig plan", "billing.periodEnds": "Factureringsperiode eindigt op {date}", "billing.openEndedContract": "Open contract", "billing.creditWallet": "Creditportemonnee", "billing.creditsRemaining": "Resterende credits", "billing.enterpriseCapacity": "Enterprise-beheerde capaciteit", - "billing.paygUsed": "{used} gebruikt · geen maandelijkse toewijzing", + "billing.paygUsed": "{used} gebruikt · geen maandelijkse toewijzing", "billing.trialLeftover": "Proef- / restcredits", "billing.aiLockedFree": "AI vergrendeld op Free", "billing.usedOf": "{used} gebruikt van {total}", @@ -3412,38 +3413,38 @@ export const nl: MessageDict = { "billing.upgradeToGrowth": "Upgraden naar Growth", "billing.askAdminPlan": "Vraag een bedrijfsbeheerder om het plan te wijzigen.", "billing.usage": "Gebruik", - "billing.productsProcessed": "{count} producten verwerkt · {range}", - "billing.updating": "Bijwerken…", + "billing.productsProcessed": "{count} producten verwerkt · {range}", + "billing.updating": "Bijwerken…", "billing.productsByDay": "Producten per dag", "billing.chartAmber": "Amber = tokens. Bereik: {range}.", "billing.chartRange": "Bereik: {range}.", "billing.nothingToChartTitle": "Nog niets om te tonen", - "billing.nothingToChartBody": "Voeg producten toe of koppel een feed — gebruik verschijnt hier.", + "billing.nothingToChartBody": "Voeg producten toe of koppel een feed — gebruik verschijnt hier.", "billing.dailyChartsHint": "Dagelijkse grafieken zijn beschikbaar voor de laatste 7 dagen, 30 dagen of de huidige factureringscyclus.", "billing.noNewProducts": "Geen nieuwe producten in {range}", "billing.catalogOverall": "Catalogus heeft in totaal {count} producten.", "billing.chartProducts": "Producten", "billing.chartTokens": "Tokengebruik", "billing.chartEmpty": "Geen producten in deze periode.", - "billing.adminStats": "{tokens} tokens · {jobs} taken · {input} input- / {export} exportfeeds", + "billing.adminStats": "{tokens} tokens · {jobs} taken · {input} input- / {export} exportfeeds", "billing.whatUsesCredits": "Wat credits verbruikt", "billing.burnsCredits": "Verbruikt credits", "billing.noCreditCost": "Geen creditkosten", "billing.publicPricing": "Openbare prijzen", "billing.managePlanOnPlans": "Plan beheren op Plannen", "billing.recovery.pastDueTitle": "Betaling achterstallig", - "billing.recovery.pastDueAdmin": "Uw abonnementsbetaling is mislukt. Werk de betaling bij in het Customer Portal — toegang blijft open tijdens deze respijtperiode.", + "billing.recovery.pastDueAdmin": "Uw abonnementsbetaling is mislukt. Werk de betaling bij in het Customer Portal — toegang blijft open tijdens deze respijtperiode.", "billing.recovery.pastDueMember": "Facturering vereist aandacht. Vraag een bedrijfsbeheerder om de betaling bij te werken in het Customer Portal. Toegang blijft open tijdens deze respijtperiode.", "billing.recovery.openPortal": "Customer Portal openen", "billing.recovery.contactAdmin": "Neem contact op met een beheerder", "billing.recovery.goToBilling": "Naar facturering", "billing.recovery.missingPlanTitle": "Geen plan toegewezen", - "billing.recovery.missingPlanMessage": "Dit bedrijf heeft geen actief plan (vaak na een overgeslagen migratie). Wijs een plan toe via Checkout of vraag support — ga niet uit van Unlimited-capaciteit.", + "billing.recovery.missingPlanMessage": "Dit bedrijf heeft geen actief plan (vaak na een overgeslagen migratie). Wijs een plan toe via Checkout of vraag support — ga niet uit van Unlimited-capaciteit.", "billing.recovery.choosePlan": "Kies een plan", "billing.upgrade": "Upgraden", "billing.askCompanyAdmin": "Vraag een bedrijfsbeheerder", "billing.memberHint": "Alleen bedrijfsbeheerders kunnen plannen wijzigen of Checkout openen.", - "billing.unlimitedPlanWallet": "Onbeperkt plan · wallet {wallet}", + "billing.unlimitedPlanWallet": "Onbeperkt plan · wallet {wallet}", "billing.creditsSuffix": "{label} credits", "billing.perMonth": "{amount} / maand", "billing.zeroPerMonth": "0 / maand", @@ -3464,48 +3465,48 @@ export const nl: MessageDict = { "billing.creditUsage.campaign.label": "Campagne-AI & merktoepassing", "billing.creditUsage.campaign.detail": "Betaalde AI-stappen die het beheerde model gebruiken verbruiken bedrijfscredits.", "exports.title": "Exportfeeds", - "exports.description": "Kies per kanaal wat je publiceert — welke producten en velden — en deel een openbare feed-URL (geen login).", + "exports.description": "Kies per kanaal wat je publiceert — welke producten en velden — en deel een openbare feed-URL (geen login).", "exports.descriptionFiltered": "Openbare Google Shopping-, Meta- en aangepaste feedlinks. {filtered} van {total} feeds weergegeven.", "exports.loadFailed": "Exportfeeds laden mislukt", "exports.loadFeedFailed": "Exportfeed laden mislukt", "exports.refresh": "Vernieuwen", - "exports.refreshing": "Vernieuwen…", + "exports.refreshing": "Vernieuwen…", "exports.create": "Exportfeed maken", "exports.edit": "Exportfeed bewerken", "exports.editDescription": "Werk naam, status, opgenomen producten en gemapte velden bij.", "exports.howToTitle": "Zo kies je wat je exporteert", "exports.howTo.choose": "Wat in de feed komt", - "exports.howTo.chooseBody": "— stel bronfeed en productstatussen in bij aanmaken/bewerken zodat de openbare URL alleen die producten bevat.", + "exports.howTo.chooseBody": "— stel bronfeed en productstatussen in bij aanmaken/bewerken zodat de openbare URL alleen die producten bevat.", "exports.howTo.subset": "Eenmalige subset", - "exports.howTo.subsetBody": "— op", + "exports.howTo.subsetBody": "— op", "exports.howTo.productsLink": "Producten", "exports.howTo.subsetTail": ", selecteer rijen en Exporteer om alleen die producten te downloaden met formaat en velden van de feed.", "exports.howTo.google": "Google Shopping", - "exports.howTo.googleBody": "— maak een CSV- of XML-preset, Generate, kopieer de openbare URL naar Merchant Center → Products → Feeds → scheduled fetch.", + "exports.howTo.googleBody": "— maak een CSV- of XML-preset, Generate, kopieer de openbare URL naar Merchant Center → Products → Feeds → scheduled fetch.", "exports.howTo.meta": "Meta-catalogus", - "exports.howTo.metaBody": "— CSV-preset voor Commerce Manager-gegevensbronnen.", + "exports.howTo.metaBody": "— CSV-preset voor Commerce Manager-gegevensbronnen.", "exports.howTo.custom": "Aangepaste CSV/XML", - "exports.howTo.customBody": "— elke partner; dezelfde openbare URL werkt voor cron-/webhook-pollers.", + "exports.howTo.customBody": "— elke partner; dezelfde openbare URL werkt voor cron-/webhook-pollers.", "exports.howTo.rest": "REST", - "exports.howTo.restBody": "— API-sleutels onder", - "exports.howTo.settingsApiKeys": "Instellingen → API-sleutels", + "exports.howTo.restBody": "— API-sleutels onder", + "exports.howTo.settingsApiKeys": "Instellingen → API-sleutels", "exports.howTo.restTail": "(legacy-sleutels niet gemigreerd) pull", "exports.howTo.openapi": "OpenAPI", "exports.feedStatus": "Feedstatus", - "exports.generating": "Export genereren — dit kan even duren bij grote catalogi.", + "exports.generating": "Export genereren — dit kan even duren bij grote catalogi.", "exports.generationFailed": "Genereren mislukt. Zie de fout hierboven en probeer Refresh Feed opnieuw.", - "exports.exportedProducts": "{count} producten geëxporteerd", + "exports.exportedProducts": "{count} producten geëxporteerd", "exports.lastGenerated": "Laatst gegenereerd: {time}", "exports.neverGenerated": "Nooit gegenereerd", "exports.searchPlaceholder": "Feeds zoeken...", "exports.searchAria": "Feeds zoeken", "exports.clearSearch": "Zoekopdracht wissen", - "exports.loading": "Feeds laden…", + "exports.loading": "Feeds laden…", "exports.loadErrorTitle": "Kon exportfeeds niet laden", "exports.loadErrorBody": "Er ging iets mis bij het laden van uw exports. Probeer opnieuw of bekijk de fout hierboven voor details.", "exports.tryAgain": "Opnieuw proberen", "exports.emptyTitle": "Nog geen exportfeeds", - "exports.emptyBody": "Maak een Google Shopping-, Meta- of aangepaste CSV/XML-feed om te kiezen welke producten en velden eruit gaan. Genereer een openbare URL voor Merchant Center of elke partner — of exporteer een subset via Producten.", + "exports.emptyBody": "Maak een Google Shopping-, Meta- of aangepaste CSV/XML-feed om te kiezen welke producten en velden eruit gaan. Genereer een openbare URL voor Merchant Center of elke partner — of exporteer een subset via Producten.", "exports.emptyCta": "Google Shopping-feed maken", "exports.noMatchTitle": "Geen overeenkomende feeds", "exports.noMatchBody": "Probeer een andere zoekterm.", @@ -3516,8 +3517,8 @@ export const nl: MessageDict = { "exports.col.status": "Statuslabel", "exports.col.actions": "Acties", "exports.working": "Bezig.", - "exports.generatingShort": "Genereren…", - "exports.copyUrl": "URL kopiëren", + "exports.generatingShort": "Genereren…", + "exports.copyUrl": "URL kopiëren", "exports.openMenu": "Menu openen", "exports.preview": "Voorbeeld", "exports.download": "Downloaden", @@ -3526,12 +3527,12 @@ export const nl: MessageDict = { "exports.delete": "Verwijderen", "exports.rotateToken": "URL-token roteren", "exports.rotateFailed": "Roteren van feed-URL-token mislukt", - "exports.deleting": "Verwijderen…", + "exports.deleting": "Verwijderen…", "exports.channelPreset": "Kanaalvoorinstelling", "exports.name": "Naam", "exports.format": "Formaat", "exports.sourceFeed": "Bronfeed (optioneel)", - "exports.sourceFeedHelp": "Beperk deze feed tot producten van één invoerfeed, of laat Alle producten — zo kies je wat de openbare URL bevat.", + "exports.sourceFeedHelp": "Beperk deze feed tot producten van één invoerfeed, of laat Alle producten — zo kies je wat de openbare URL bevat.", "exports.allProducts": "Alle producten", "exports.rootElement": "Rootelement", "exports.itemElement": "Item-element", @@ -3546,15 +3547,15 @@ export const nl: MessageDict = { "exports.source": "Bron", "exports.customSource": "Aangepast (attr.* / spec.*)", "exports.removeField": "Veld verwijderen", - "exports.fieldHelp": "Exports lezen verwerkte producten (met ruwe mapped_data als fallback). Gebruik eprel_* / energy_* voor EPREL-velden, spec.* voor één specificatie, of specifications.* om alle specs als XML-knooppunten uit te vouwen.", - "exports.saving": "Opslaan…", + "exports.fieldHelp": "Exports lezen verwerkte producten (met ruwe mapped_data als fallback). Gebruik eprel_* / energy_* voor EPREL-velden, spec.* voor één specificatie, of specifications.* om alle specs als XML-knooppunten uit te vouwen.", + "exports.saving": "Opslaan…", "exports.saveChanges": "Wijzigingen opslaan", "exports.createFeed": "Feed maken", "exports.updated": "Exportfeed bijgewerkt.", "exports.created": "Exportfeed aangemaakt.", "exports.saveFailed": "Opslaan mislukt", "exports.urlCopied": "Openbare {format}-feed-URL gekopieerd. Plak deze in elk systeem dat productfeeds ophaalt.", - "exports.copyFailed": "URL kopiëren naar klembord mislukt", + "exports.copyFailed": "URL kopiëren naar klembord mislukt", "exports.refreshed": "Feed vernieuwd", "exports.refreshedWithCount": "Feed vernieuwd ({count} producten).", "exports.refreshFailed": "Feed vernieuwen mislukt", @@ -3573,18 +3574,18 @@ export const nl: MessageDict = { "exports.dialog.export": "Exporteren", "exports.preset.google_shopping_csv.label": "Google Shopping (CSV)", "exports.preset.google_shopping_csv.shortLabel": "Google Shopping CSV", - "exports.preset.google_shopping_csv.description": "Merchant Center-productfeed met de standaard Google-kolommen (id, title, price, gtin, …).", - "exports.preset.google_shopping_csv.hint": "Nadat u de feed hebt vernieuwd, kopieert u de openbare CSV-URL naar Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.", + "exports.preset.google_shopping_csv.description": "Merchant Center-productfeed met de standaard Google-kolommen (id, title, price, gtin, …).", + "exports.preset.google_shopping_csv.hint": "Nadat u de feed hebt vernieuwd, kopieert u de openbare CSV-URL naar Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.", "exports.preset.google_shopping_csv.defaultName": "Google Shopping CSV", "exports.preset.google_shopping_xml.label": "Google Shopping (XML)", "exports.preset.google_shopping_xml.shortLabel": "Google Shopping XML", - "exports.preset.google_shopping_xml.description": "Dezelfde Google-kolommen als XML-elementen (g:id, g:title, …) voor Merchant Center-XML-feeds.", + "exports.preset.google_shopping_xml.description": "Dezelfde Google-kolommen als XML-elementen (g:id, g:title, …) voor Merchant Center-XML-feeds.", "exports.preset.google_shopping_xml.hint": "Plak de openbare XML-URL in Merchant Center als scheduled fetch. Map ontbrekende winkelvelden (link, price) onder Field mappings indien nodig.", "exports.preset.google_shopping_xml.defaultName": "Google Shopping XML", "exports.preset.meta_csv.label": "Meta-catalogus (CSV)", "exports.preset.meta_csv.shortLabel": "Meta CSV", - "exports.preset.meta_csv.description": "Kolommen van de Facebook-/Instagram Commerce-catalogus (id, title, availability, price, image_link, …).", - "exports.preset.meta_csv.hint": "In Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed plakt u de openbare CSV-URL.", + "exports.preset.meta_csv.description": "Kolommen van de Facebook-/Instagram Commerce-catalogus (id, title, availability, price, image_link, …).", + "exports.preset.meta_csv.hint": "In Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed plakt u de openbare CSV-URL.", "exports.preset.meta_csv.defaultName": "Meta-catalogus CSV", "exports.preset.custom_csv.label": "Aangepaste CSV", "exports.preset.custom_csv.shortLabel": "Aangepaste CSV", @@ -3600,7 +3601,7 @@ export const nl: MessageDict = { "processing.description": "Live pipelinevoortgang voor productverwerkingstaken. Vernieuwt automatisch terwijl dit tabblad zichtbaar is. Voltooide taken linken naar Needs Review voor accepteren / bewerken / afwijzen.", "processing.refresh": "Vernieuwen", "processing.loadFailed": "Verwerkingstaken laden mislukt", - "processing.tooManyRequests": "Te veel verzoeken — wacht even en probeer het opnieuw.", + "processing.tooManyRequests": "Te veel verzoeken — wacht even en probeer het opnieuw.", "processing.serverError": "{fallback} (serverfout {status}). Probeer het zo opnieuw.", "processing.httpError": "{fallback} (HTTP {status})", "processing.cancelFailed": "Kon deze taak niet annuleren", @@ -3609,12 +3610,12 @@ export const nl: MessageDict = { "processing.queuedRetry": "\"{name}\" in de wachtrij voor opnieuw proberen.", "processing.jobFallback": "Taak {id}", "processing.tasks": "Taken", - "processing.pipelineHint": "Pipeline: normalize → specs → fill → EPREL → AI. Grote starts kunnen splitsen in sibling-taken.", + "processing.pipelineHint": "Pipeline: normalize → specs → fill → EPREL → AI. Grote starts kunnen splitsen in sibling-taken.", "processing.emptyTitle": "Nog geen achtergrondtaken", "processing.emptyBody": "Nog geen achtergrondtaken. Start een nieuwe taak vanuit Products wanneer je klaar bent.", "processing.startJob": "Een taak starten", "processing.connectFeed": "Feed koppelen", - "processing.splitBatch": "Batch gesplitst · {jobs} taken · {products} producten", + "processing.splitBatch": "Batch gesplitst · {jobs} taken · {products} producten", "processing.col.task": "Taak", "processing.col.status": "Statuslabel", "processing.col.steps": "Stappen", @@ -3622,36 +3623,36 @@ export const nl: MessageDict = { "processing.col.started": "Gestart", "processing.col.completed": "Voltooid", "processing.col.actions": "Acties", - "processing.partOfBatch": "· deel van batch", + "processing.partOfBatch": "· deel van batch", "processing.nowStep": "Nu: {step}", "processing.skip": "(overslaan)", "processing.reviewResults": "Resultaten beoordelen", "processing.reviewTitle": "Open Needs Review om verrijking te accepteren, bewerken of afwijzen", "processing.cancel": "Annuleren", - "processing.cancelling": "Annuleren…", + "processing.cancelling": "Annuleren…", "processing.cancelTitle": "Deze wachtende of lopende taak annuleren", "processing.retry": "Opnieuw", - "processing.retrying": "Opnieuw proberen…", + "processing.retrying": "Opnieuw proberen…", "processing.actions.onPage": "{count} op deze pagina", "processing.actions.clearSelection": "Selectie wissen", "processing.actions.processSelected": "Selectie verwerken", "processing.actions.processAria": "Geselecteerde producten verwerken", "processing.actions.processAriaCount": "{count} geselecteerde product{plural} op deze pagina verwerken", "processing.actions.whatToProcess": "Wat verwerken", - "processing.actions.freeNoAiTitle": "Free-plan — geen AI-credits", + "processing.actions.freeNoAiTitle": "Free-plan — geen AI-credits", "processing.actions.freeNoAiBody": "Normalize, specs, fill en EPREL draaien nog steeds. AI-titels/-beschrijvingen vereisen een betaald plan of credits.", "processing.actions.comparePlans": "Plannen vergelijken", "processing.actions.selectAll": "Alles selecteren", "processing.actions.selectAllAria": "Alle verwerkingsmodi selecteren", "processing.actions.upgradeRequired": "{label} (upgrade vereist)", - "processing.actions.upgradeSuffix": " · upgraden", + "processing.actions.upgradeSuffix": " · upgraden", "processing.actions.credits": "{credits} credits", "processing.actions.free": "gratis", "processing.actions.autoCategorizeTitle": "Categorisatie automatisch toevoegen", "processing.actions.autoCategorizeBody": "{count} product(en) hebben categorisatie nodig voor {types}-verwerking", "processing.actions.aiLocked": "AI-opties zijn vergrendeld op Free. Upgrade om titels/beschrijvingen te verwerken.", "processing.actions.totalCredits": "Totale credits ({count} op deze pagina):", - "processing.actions.starting": "Starten…", + "processing.actions.starting": "Starten…", "processing.actions.processCount": "{count} op deze pagina verwerken", "processing.actions.close": "Sluiten", "processing.actions.accept": "Accepteren", @@ -3664,13 +3665,13 @@ export const nl: MessageDict = { "processing.actions.confirmTitle": "Verwerking bevestigen", "processing.actions.confirmBody": "{count} product(en) op deze pagina verwerken voor {credits} credits. Credits worden verbruikt wanneer de taak start en kunnen niet via deze actie ongedaan worden gemaakt.", "processing.actions.confirmStart": "Verwerking starten", - "processing.option.category": "Categorieën", + "processing.option.category": "Categorieën", "processing.option.attributes": "Attributen / specs", "processing.option.title": "Titels (AI)", "processing.option.description": "Beschrijvingen (AI)", "processing.receipt.view": "Bekijken in Verwerking", "processing.receipt.undo": "Ongedaan maken", - "processing.receipt.format": "{succeeded} geslaagd · {skipped} overgeslagen · {failed} mislukt", + "processing.receipt.format": "{succeeded} geslaagd · {skipped} overgeslagen · {failed} mislukt", "processing.receipt.cancelledOne": "Verwerking geannuleerd", "processing.receipt.cancelledMany": "Verwerkingstaken geannuleerd", "processing.receipt.cancelledDesc": "De zojuist gestarte taak is geannuleerd.", @@ -3683,10 +3684,10 @@ export const nl: MessageDict = { "unsubscribe.confirmPrompt": "Bevestig hieronder om u uit te schrijven voor marketingmails.", "unsubscribe.done": "U bent uitgeschreven.", "stores.title": "Stores en bronnen", - "stores.description": "Koppel elke winkel of leverancier op één plek — Woo, Shopify, feed-URL of CSV. Live winkels: producten Descrybe → winkel; orders/reviews winkel → Descrybe. Exporteer wanneer de catalogus klaar is.", + "stores.description": "Koppel elke winkel of leverancier op één plek — Woo, Shopify, feed-URL of CSV. Live winkels: producten Descrybe → winkel; orders/reviews winkel → Descrybe. Exporteer wanneer de catalogus klaar is.", "stores.allInputFeeds": "Alle invoerfeeds", "stores.exportFeeds": "Exportfeeds", - "stores.migrationNote": "Na een Descrybe-platformmigratie moeten WooCommerce- en Shopify-gegevens mogelijk opnieuw worden ingevoerd — dat is herverbinden, geen kapotte sync.", + "stores.migrationNote": "Na een Descrybe-platformmigratie moeten WooCommerce- en Shopify-gegevens mogelijk opnieuw worden ingevoerd — dat is herverbinden, geen kapotte sync.", "stores.docsPrefix": "Docs:", "stores.docsApiOverview": "API-overzicht", "stores.docsSuffix": "voor openbare producttoegang; gebruik hieronder WooCommerce of Shopify voor live winkelsync.", @@ -3694,7 +3695,7 @@ export const nl: MessageDict = { "stores.statusAria": "Status: {label}", "stores.ctaAria": "{cta}: {title}", "stores.startTitle": "Waar moet ik beginnen?", - "stores.startBody": "Woo-winkel → WooCommerce. Shopify of een ander platform → Feed-URL of CSV-upload. Klaar voor Merchant Center of partners → Exportfeeds (Google Shopping-preset of eigen velden). Na een migratie Woo/Shopify opnieuw verbinden voordat u sync verwacht.", + "stores.startBody": "Woo-winkel → WooCommerce. Shopify of een ander platform → Feed-URL of CSV-upload. Klaar voor Merchant Center of partners → Exportfeeds (Google Shopping-preset of eigen velden). Na een migratie Woo/Shopify opnieuw verbinden voordat u sync verwacht.", "stores.startBodyMember": "Vraag een bedrijfsadmin om WooCommerce of Shopify te verbinden. Je kunt verbonden stores nog openen om te syncen en te browsen, en Feed-URL, CSV of exportfeeds gebruiken als je plan dat toelaat.", "stores.wizard.title": "Begeleide store-setup", "stores.wizard.description": "Koppel een store, test de verbinding, zet de eerste productsync in de wachtrij en klaar.", @@ -3702,7 +3703,7 @@ export const nl: MessageDict = { "stores.wizard.guidedSetupAria": "Begeleide store-setup starten", "stores.wizard.adminOnly": "Alleen bedrijfsadmins kunnen de begeleide store-setup uitvoeren (credentials opslaan en eerste sync). Je kunt verbonden stores nog openen.", "stores.wizard.pickChannel": "Kies een store-connector", - "stores.wizard.pickChannelBody": "Kies WooCommerce of Shopify. Voltooi verbinden → testen → eerste sync op de connectorpagina en keer hier terug.", + "stores.wizard.pickChannelBody": "Kies WooCommerce of Shopify. Voltooi verbinden → testen → eerste sync op de connectorpagina en keer hier terug.", "stores.wizard.channel.shopify": "Shopify", "stores.wizard.channel.woocommerce": "WooCommerce", "stores.wizard.channelLabel": "Bezig met: {channel}", @@ -3722,18 +3723,18 @@ export const nl: MessageDict = { "stores.wizard.viewProducts": "Producten bekijken", "stores.wizard.backToHub": "Terug naar stores", "stores.wizard.banner.generic": "Begeleide setup: rond deze stap af en ga terug naar de wizard.", - "stores.wizard.banner.test": "Begeleide setup — test de verbinding en ga terug naar de wizard.", - "stores.wizard.banner.sync": "Begeleide setup — zet de eerste productsync in de wachtrij en ga terug naar de wizard.", + "stores.wizard.banner.test": "Begeleide setup — test de verbinding en ga terug naar de wizard.", + "stores.wizard.banner.sync": "Begeleide setup — zet de eerste productsync in de wachtrij en ga terug naar de wizard.", "stores.wizard.banner.return": "Terug naar wizard", "stores.wizard.banner.dismiss": "Sluiten", "stores.woo.title": "WooCommerce", - "stores.woo.description": "Push producten Descrybe → WooCommerce. Haal orders en reviews WooCommerce → Descrybe.", + "stores.woo.description": "Push producten Descrybe → WooCommerce. Haal orders en reviews WooCommerce → Descrybe.", "stores.woo.ctaReconnect": "Woo opnieuw verbinden", "stores.woo.ctaOpen": "Woo openen", "stores.woo.ctaConnect": "Woo verbinden", "stores.woo.ctaView": "Woo bekijken", "stores.shopify.title": "Shopify", - "stores.shopify.description": "Push producten Descrybe → Shopify. Pull orders Shopify → Descrybe. Reviews zijn niet beschikbaar via de Shopify Admin API.", + "stores.shopify.description": "Push producten Descrybe → Shopify. Pull orders Shopify → Descrybe. Reviews zijn niet beschikbaar via de Shopify Admin API.", "stores.shopify.ctaReconnect": "Shopify opnieuw verbinden", "stores.shopify.ctaOpen": "Shopify openen", "stores.shopify.ctaConnect": "Shopify verbinden", @@ -3748,8 +3749,8 @@ export const nl: MessageDict = { "stores.export.description": "Publiceer Google Shopping of aangepaste CSV/XML met een openbare URL. Of haal producten op via API-sleutel (/api/v1).", "stores.export.cta": "Exports openen", "stores.apiKeys.title": "API-sleutels", - "stores.apiKeys.description": "Oude API-sleutels zijn niet gemigreerd. Maak in Instellingen een nieuwe sleutel om /api/v1-toegang te herstellen — het geheim wordt slechts één keer getoond.", - "stores.apiKeys.descriptionMember": "Bedrijfs-API-sleutels voor /api/v1. Legacy-sleutels zijn niet gemigreerd — alleen admins kunnen maken of intrekken; prefixes zie je in Instellingen.", + "stores.apiKeys.description": "Oude API-sleutels zijn niet gemigreerd. Maak in Instellingen een nieuwe sleutel om /api/v1-toegang te herstellen — het geheim wordt slechts één keer getoond.", + "stores.apiKeys.descriptionMember": "Bedrijfs-API-sleutels voor /api/v1. Legacy-sleutels zijn niet gemigreerd — alleen admins kunnen maken of intrekken; prefixes zie je in Instellingen.", "stores.apiKeys.cta": "API-sleutels beheren", "stores.apiKeys.ctaView": "API-sleutels bekijken", "stores.status.needsReconnect": "Opnieuw verbinden nodig", @@ -3761,7 +3762,7 @@ export const nl: MessageDict = { "store.tab.connection": "Verbinding", "store.tab.orders": "Bestellingen", "store.tab.settings": "Instellingen", - "store.tab.categories": "Categorieën", + "store.tab.categories": "Categorieën", "store.tab.attributes": "Attributen", "store.tab.reviews": "Beoordelingen", "store.badge.credentialsOnFile": "Referenties opgeslagen", @@ -3784,12 +3785,12 @@ export const nl: MessageDict = { "store.testing": "Testen...", "store.testConnection": "Verbinding testen", "store.queueing": "In de wachtrij...", - "store.queueProductPush": "Productpush in wachtrij (Descrybe → winkel)", - "store.queueFirstProductSync": "Eerste productpush in wachtrij (Descrybe → winkel)", - "store.queueOrdersImport": "Orderimport in wachtrij (winkel → Descrybe)", + "store.queueProductPush": "Productpush in wachtrij (Descrybe → winkel)", + "store.queueFirstProductSync": "Eerste productpush in wachtrij (Descrybe → winkel)", + "store.queueOrdersImport": "Orderimport in wachtrij (winkel → Descrybe)", "store.refreshList": "Lijst vernieuwen", - "store.saveBeforeTest": "Sla referenties op vóór het testen", - "store.saveTestBeforeQueue": "Sla referenties op en test de verbinding vóór sync", + "store.saveBeforeTest": "Sla referenties op vóór het testen", + "store.saveTestBeforeQueue": "Sla referenties op en test de verbinding vóór sync", "store.connectionOk": "Verbinding OK", "store.connectionSuccessful": "Verbinding geslaagd", "store.connectionSuccessfulDot": "Verbinding geslaagd.", @@ -3803,7 +3804,7 @@ export const nl: MessageDict = { "store.col.status": "Statuslabel", "store.col.total": "Totaal", "store.col.date": "Datum", - "store.loadingOrders": "Bestellingen laden…", + "store.loadingOrders": "Bestellingen laden…", "store.loadingOrdersDot": "Bestellingen laden.", "flash.store.saveFailed": "Instellingen opslaan mislukt", "flash.store.queueSyncFailed": "Sync in de wachtrij zetten mislukt", @@ -3822,14 +3823,14 @@ export const nl: MessageDict = { "flash.woo.categoryAutoMapFailed": "Categorie-automap mislukt", "flash.woo.attributeAutoMapFailed": "Attribuut-automap mislukt", "shopify.title": "Shopify-integratie", - "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", + "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", "shopify.adminOnly": "Only bedrijf admins can change Shopify connection instellingen. Synchroniseren and browse stay beschikbaar.", "shopify.lockedTitle": "Shopify-verbinding vergrendeld", "shopify.noCredentialsMember": "Er staan nog geen Shopify-gegevens. Vraag een bedrijfsbeheerder de winkel te verbinden. Sync en bestellingen bekijken blijven beschikbaar nadat zij opslaan en de verbinding testen.", "shopify.enterToken": "Referenties invoeren", - "shopify.noCredentials": "Geen Shopify-gegevens. Voer je *.myshopify.com-domein en Dev Dashboard Client ID + secret in (of een legacy Admin API-token), daarna Opslaan en Verbinding testen. Na een platformmigratie worden oude secrets niet overgenomen — verbind opnieuw met een verse token.", + "shopify.noCredentials": "Geen Shopify-gegevens. Voer je *.myshopify.com-domein en Dev Dashboard Client ID + secret in (of een legacy Admin API-token), daarna Opslaan en Verbinding testen. Na een platformmigratie worden oude secrets niet overgenomen — verbind opnieuw met een verse token.", "shopify.allConnectors": "Alle winkelconnectors", - "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", + "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", "shopify.setup.oauthNote": "Still manual: create/install the app in Shopify and paste Client ID + secret here. Descrybe does not host a one-click App Store install. Legacy permanent shpat_ tokens from older Admin custom apps still work.", "shopify.setup.scopesTitle": "Vereiste Admin API-scopes", "shopify.setup.scopesIntro": "Add these scopes on the app version in the Dev Dashboard before you release and install:", @@ -3841,53 +3842,53 @@ export const nl: MessageDict = { "shopify.setup.step5.clientId": "Client ID", "shopify.setup.step5.and": "and", "shopify.setup.step5.clientSecret": "Client secret", - "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", + "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", "shopify.setup.step5.save": "Save", - "shopify.setup.step5.arrow": "→", + "shopify.setup.step5.arrow": "→", "shopify.setup.step5.test": "Test Connection", "shopify.setup.step5.after": ". Descrybe stores secrets encrypted and refreshes the short-lived access token automatically.", "shopify.setup.step6.products": "Products", - "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", + "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", "shopify.setup.step6.orders": "Orders", - "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", + "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", "shopify.setup.step7.before": "No live shop yet? Enable", "shopify.setup.step7.dryRun": "Dry run", "shopify.setup.step7.after": "(or use the special dry-run access token) to walk through the flow without calling Shopify.", "shopify.setup.openDevDashboard": "Open Dev Dashboard", "shopify.setup.openDevelopApps": "Open shop Develop apps", "shopify.setup.openDevelopAppsNeedDomain": "Enter your shop domain below to unlock a direct Admin link for this store.", - "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", + "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", "shopify.setup.copyScopes": "Copy required scopes", "shopify.setup.scopesCopied": "Scopes copied", "shopify.setup.docsCreate": "Create app docs", "shopify.setup.docsTokens": "Access token docs", - "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", + "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", "shopify.setup.hideLegacyToken": "Hide legacy token field", - "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", + "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", "shopify.field.clientId": "Client ID", "shopify.field.clientSecret": "Client secret", - "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", + "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", "shopify.field.accessTokenHelp": "Only for custom apps created in Shopify Admin before January 2026. New apps should use Client ID + secret instead.", "shopify.placeholder.clientId": "Client ID from Dev Dashboard", - "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", + "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", "shopify.placeholder.clientSecret": "Client secret", - "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", + "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", "shopify.setup.scope.write_products": "write_products", "shopify.setup.scope.write_productsWhy": "Producten in Shopify aanmaken en bijwerken (uitgaande push)", "shopify.setup.scope.read_products": "read_products", - "shopify.setup.scope.read_productsWhy": "Bestaande producten op SKU vinden vóór bijwerken", + "shopify.setup.scope.read_productsWhy": "Bestaande producten op SKU vinden vóór bijwerken", "shopify.setup.scope.read_orders": "read_orders", "shopify.setup.scope.read_ordersWhy": "Bestellingen importeren in Descrybe (inkomend)", - "shopify.setup.step1": "Als je Shopify vóór een platformmigratie hebt verbonden: maak een nieuwe Dev Dashboard-app (of verbind opnieuw met een verse legacy-token) — oude opgeslagen secrets worden niet overgenomen.", + "shopify.setup.step1": "Als je Shopify vóór een platformmigratie hebt verbonden: maak een nieuwe Dev Dashboard-app (of verbind opnieuw met een verse legacy-token) — oude opgeslagen secrets worden niet overgenomen.", "shopify.setup.step2.before": "Open the", "shopify.setup.step2.path": "Shopify Dev Dashboard", - "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", + "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", "shopify.setup.step3.before": "Create a version: set App URL (default home is fine for API-only), add scopes", "shopify.setup.step3.after": ".", "shopify.setup.step4.before": "From the app Home tab,", "shopify.setup.step4.after": "on your store (merchant must approve scopes).", - "shopify.testSectionTitle": "Verbinding verifiëren", - "shopify.testHint": "Sla eerst je shopdomein en token op, en voer daarna Verbinding testen uit. Een geslaagde test bevestigt token en scopes vóór je sync in de wachtrij zet.", + "shopify.testSectionTitle": "Verbinding verifiëren", + "shopify.testHint": "Sla eerst je shopdomein en token op, en voer daarna Verbinding testen uit. Een geslaagde test bevestigt token en scopes vóór je sync in de wachtrij zet.", "shopify.overwriteTitle": "Shopify-producten overschrijven?", "shopify.overwriteBodyCount": "Dit zet een uitgaande productpush in de wachtrij. {count} eerder gekoppelde Shopify-product(en) kunnen worden bijgewerkt met Descrybe-inhoud.", "shopify.overwriteBody": "Dit zet een uitgaande productpush in de wachtrij. Overeenkomende Shopify-producten kunnen worden bijgewerkt met Descrybe-inhoud.", @@ -3899,55 +3900,55 @@ export const nl: MessageDict = { "shopify.field.accessToken": "Admin-API-toegangstoken", "shopify.field.apiVersion": "API-versie", "shopify.placeholder.tokenKeep": "******** (leeg laten om te behouden)", - "shopify.enableSync": "Productpush inschakelen (Descrybe → Shopify)", + "shopify.enableSync": "Productpush inschakelen (Descrybe → Shopify)", "shopify.dryRunLabel": "Dry run (geen live Shopify-aanroepen)", - "shopify.ordersTitle": "Orderimport (Shopify → Descrybe)", - "shopify.ordersDesc": "Shopify → Descrybe — haal orders en regels naar Descrybe (schrijft niet terug naar Shopify).", + "shopify.ordersTitle": "Orderimport (Shopify → Descrybe)", + "shopify.ordersDesc": "Shopify → Descrybe — haal orders en regels naar Descrybe (schrijft niet terug naar Shopify).", "shopify.ordersNeedsReconnect": "Bestellingenimport kan pas draaien als referenties na migratie opnieuw zijn verbonden. Op het tabblad Verbinding: Opslaan, daarna Verbinding testen.", "shopify.notesTitle": "Notities", "shopify.notesDesc": "Shopify-connectormogelijkheden", - "shopify.notes.productsLabel": "Producten (Descrybe → Shopify)", - "shopify.notes.productsBody": "— verwerkte Descrybe-producten worden in Shopify aangemaakt of bijgewerkt (SKU-match via GraphQL als er geen gecachte Shopify-product-id is). Re-sync kan overeenkomende remote velden overschrijven.", - "shopify.notes.ordersLabel": "Orders (Shopify → Descrybe)", - "shopify.notes.ordersBody": "— opgehaald voor rapportage en toekomstige audience-workflows.", + "shopify.notes.productsLabel": "Producten (Descrybe → Shopify)", + "shopify.notes.productsBody": "— verwerkte Descrybe-producten worden in Shopify aangemaakt of bijgewerkt (SKU-match via GraphQL als er geen gecachte Shopify-product-id is). Re-sync kan overeenkomende remote velden overschrijven.", + "shopify.notes.ordersLabel": "Orders (Shopify → Descrybe)", + "shopify.notes.ordersBody": "— opgehaald voor rapportage en toekomstige audience-workflows.", "shopify.notes.reviewsLabel": "Beoordelingen", "shopify.notes.reviewsBody": "-- not ondersteuninged. Shopify has no first-party product reviews Admin API (third-party review apps are out of scope here).", "shopify.notes.encryption.before": "Tokens worden versleuteld in rust met", "woo.title": "WooCommerce-integratie", - "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", + "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", "woo.allStores": "Alle stores", "woo.adminOnly": "Alleen bedrijfsadmins kunnen de WooCommerce-verbinding en mapping wijzigen. Synchroniseren en bladeren blijven beschikbaar.", "woo.enterCredentials": "Referenties invoeren", - "woo.noCredentials": "Geen WooCommerce-gegevens. Voer de winkel-URL in, maak in WordPress een Read/Write REST API-sleutel, plak Consumer Key en Secret, daarna Opslaan en Verbinding testen. Na een platformmigratie worden oude secrets niet overgenomen — verbind opnieuw met een verse sleutel.", + "woo.noCredentials": "Geen WooCommerce-gegevens. Voer de winkel-URL in, maak in WordPress een Read/Write REST API-sleutel, plak Consumer Key en Secret, daarna Opslaan en Verbinding testen. Na een platformmigratie worden oude secrets niet overgenomen — verbind opnieuw met een verse sleutel.", "woo.lockedTitle": "WooCommerce-verbinding vergrendeld", "woo.noCredentialsMember": "Er staan nog geen WooCommerce-gegevens. Vraag een bedrijfsbeheerder de winkel te verbinden. Sync, bestellingen en reviews blijven beschikbaar nadat zij opslaan en de verbinding testen.", "woo.setupDesc": "Follow these steps to create a WooCommerce REST API key in WordPress and connect it here. Descrybe never creates keys on your store for you.", - "woo.setup.step1": "Als je WooCommerce vóór een platformmigratie hebt verbonden: maak een nieuwe REST API-sleutel — oude opgeslagen gegevens zijn niet bruikbaar.", + "woo.setup.step1": "Als je WooCommerce vóór een platformmigratie hebt verbonden: maak een nieuwe REST API-sleutel — oude opgeslagen gegevens zijn niet bruikbaar.", "woo.setup.step2.before": "Enter your store", "woo.setup.step2.path": "HTTPS URL", "woo.setup.step2.after": "in the form below (example: https://yourstore.com).", "woo.setup.step3.before": "In WordPress admin, open", - "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", + "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", "woo.setup.step3.after": "(or use the deep link once your store URL is filled in).", "woo.setup.step4.before": "Click", "woo.setup.step4.addKey": "Add key", "woo.setup.step4.mid": ", set permissions to", "woo.setup.step4.permissions": "Read/Write", - "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", + "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", "woo.setup.step5.before": "Paste the key and secret below, enable sync if ready, then", "woo.setup.step5.save": "Save", - "woo.setup.step5.arrow": "→", + "woo.setup.step5.arrow": "→", "woo.setup.step5.test": "Test Connection", "woo.setup.step5.after": ".", "woo.setup.step6.products": "Products", - "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", + "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", "woo.setup.step6.orders": "Orders", "woo.setup.step6.and": "and", "woo.setup.step6.reviews": "reviews", - "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", + "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", "woo.setup.openKeys": "REST API-sleutels openen", "woo.setup.addKey": "Sleutel toevoegen", - "woo.setup.openKeysHint": "Opent WordPress-beheer → WooCommerce → Instellingen → Geavanceerd → REST API.", + "woo.setup.openKeysHint": "Opent WordPress-beheer → WooCommerce → Instellingen → Geavanceerd → REST API.", "woo.setup.openKeysNeedUrl": "Sla eerst een geldige winkel-URL op om beheerlinks te openen.", "woo.setup.docsLink": "WooCommerce REST API-documentatie", "woo.overwriteTitle": "WooCommerce-producten overschrijven?", @@ -3955,7 +3956,7 @@ export const nl: MessageDict = { "woo.overwriteBody": "Dit zet een uitgaande productpush in de wachtrij. Overeenkomende WooCommerce-producten kunnen worden bijgewerkt met Descrybe-inhoud.", "woo.connectionTitle": "Store connection", "woo.connectionDesc": "Paste your store URL and a Read/Write REST API key pair. Save, then Test Connection before queuing syncs.", - "woo.enableSync": "Productpush inschakelen (Descrybe → WooCommerce)", + "woo.enableSync": "Productpush inschakelen (Descrybe → WooCommerce)", "woo.field.storeUrl": "Winkel-URL", "woo.field.storeUrlHelp": "Openbare site-URL met https. Voor de WooCommerce REST API en deeplinks naar WordPress-beheer.", "woo.field.consumerKey": "Consumer Key", @@ -3965,25 +3966,25 @@ export const nl: MessageDict = { "woo.keepCredentialsHint": "Laat sleutel/geheim leeg bij opslaan om bestaande referenties te behouden.", "woo.saveConfiguration": "Configuratie opslaan", "woo.categoryMappingTitle": "Categoriemapping", - "woo.categoryMappingDesc": "Wijs uw interne categorieën toe aan WooCommerce-categorieën", - "woo.autoMapCategories": "Categorieën automatisch mappen", + "woo.categoryMappingDesc": "Wijs uw interne categorieën toe aan WooCommerce-categorieën", + "woo.autoMapCategories": "Categorieën automatisch mappen", "woo.autoMapping": "Automatisch mappen...", - "woo.refreshCategories": "Categorieën vernieuwen", - "woo.availableCategories": "Beschikbare WooCommerce-categorieën", - "woo.categoriesEmptyHint": "Test de verbinding en vernieuw daarna om WooCommerce-categorieën te laden.", + "woo.refreshCategories": "Categorieën vernieuwen", + "woo.availableCategories": "Beschikbare WooCommerce-categorieën", + "woo.categoriesEmptyHint": "Test de verbinding en vernieuw daarna om WooCommerce-categorieën te laden.", "woo.attributeMappingTitle": "Attribuutmapping", "woo.attributeMappingDesc": "Wijs uw interne attributen toe aan WooCommerce-attributen", "woo.autoMapAttributes": "Attributen automatisch mappen", "woo.refreshAttributes": "Attributen vernieuwen", "woo.availableAttributes": "Beschikbare WooCommerce-attributen", "woo.attributesEmptyHint": "Test de verbinding en vernieuw daarna om WooCommerce-attributen te laden.", - "woo.ordersTitle": "Orderimport (WooCommerce → Descrybe)", - "woo.ordersDesc": "WooCommerce → Descrybe — haal orders en regels naar Descrybe (schrijft niet terug naar de winkel).", + "woo.ordersTitle": "Orderimport (WooCommerce → Descrybe)", + "woo.ordersDesc": "WooCommerce → Descrybe — haal orders en regels naar Descrybe (schrijft niet terug naar de winkel).", "woo.ordersNeedsReconnect": "Bestellingenimport kan pas draaien als referenties na migratie opnieuw zijn verbonden. Op het tabblad Verbinding: Opslaan, daarna Verbinding testen.", "woo.syncSettingsTitle": "Sync-instellingen", - "woo.syncSettingsDesc": "Configureer hoe producten Descrybe → WooCommerce worden gepusht", + "woo.syncSettingsDesc": "Configureer hoe producten Descrybe → WooCommerce worden gepusht", "woo.matchStrategy": "Productmatchingstrategie", - "woo.matchStrategyHelp": "Productpush (Descrybe → WooCommerce) matcht remote producten op SKU of EAN/GTIN. Zet syncs in de wachtrij via het tabblad Verbinding (handmatig).", + "woo.matchStrategyHelp": "Productpush (Descrybe → WooCommerce) matcht remote producten op SKU of EAN/GTIN. Zet syncs in de wachtrij via het tabblad Verbinding (handmatig).", "woo.lastSyncLabel": "Laatste sync", "woo.saveSyncSettings": "Sync-instellingen opslaan", "woo.match.sku": "SKU", @@ -4023,14 +4024,14 @@ export const nl: MessageDict = { "plan.feature.catalog.products.tab_error": "Producten - tabblad Fout", "plan.feature.catalog.products.tab_processing": "Producten - tabblad Verwerken", "plan.feature.catalog.products.tab_unprocessed": "Producten - tabblad Onverwerkt", - "plan.feature.catalog.products.process_categories": "Categorieën verwerken", + "plan.feature.catalog.products.process_categories": "Categorieën verwerken", "plan.feature.catalog.products.process_attributes": "Attributen / specs verwerken", "plan.feature.catalog.products.process_ai_titles": "AI-titels verwerken", "plan.feature.catalog.products.process_ai_descriptions": "AI-beschrijvingen verwerken", "plan.feature.catalog.products.enrichment_review": "Paneel verrijkingscontrole", "plan.feature.catalog.products.export_selection": "Geselecteerde producten exporteren", "plan.feature.catalog.products.upgrade_prompt": "Product-upgradeprompts", - "plan.feature.catalog.categories": "Categorieën", + "plan.feature.catalog.categories": "Categorieën", "plan.feature.catalog.categories.title_formula": "Categorietitelformule", "plan.feature.catalog.categories.description_formula": "Categoriebeschrijvingsformule", "plan.feature.catalog.attributes": "Attributen", @@ -4038,7 +4039,7 @@ export const nl: MessageDict = { "plan.feature.catalog.standard_fields": "Standaardvelden", "plan.feature.catalog.standard_fields.groups": "Standaardveldgroepen", "plan.feature.catalog.structured_descriptions": "Gestructureerde beschrijvingsvelden", - "plan.feature.catalog.vector_categories": "Vectorcategorieën", + "plan.feature.catalog.vector_categories": "Vectorcategorieën", "plan.feature.feeds.list": "Importfeeds", "plan.feature.feeds.add_url": "Feed-URL toevoegen", "plan.feature.feeds.add_csv": "Feed toevoegen via CSV-upload", @@ -4053,7 +4054,7 @@ export const nl: MessageDict = { "plan.feature.stores.hub": "Winkelshub", "plan.feature.stores.woocommerce": "WooCommerce-integratie", "plan.feature.stores.woocommerce.connection": "WooCommerce-verbinding", - "plan.feature.stores.woocommerce.categories": "WooCommerce-categorieën sync", + "plan.feature.stores.woocommerce.categories": "WooCommerce-categorieën sync", "plan.feature.stores.woocommerce.attributes": "WooCommerce-attributen sync", "plan.feature.stores.woocommerce.orders": "WooCommerce-bestellingen", "plan.feature.stores.woocommerce.reviews": "WooCommerce-beoordelingen", @@ -4109,7 +4110,7 @@ export const nl: MessageDict = { "plan.feature.capability.byok": "Eigen AI-sleutel gebruiken", "billing.plan.free": "Gratis", "products.actions.selectAll": "Alles selecteren", - "products.actions.upgradeSuffix": " · upgraden", + "products.actions.upgradeSuffix": " · upgraden", "products.actions.upgradeRequired": "{label} (upgrade vereist)", "products.actions.free": "gratis", "products.actions.credits": "{credits} credits", @@ -4121,9 +4122,9 @@ export const nl: MessageDict = { "products.actions.resetUnprocessed": "Resetten naar onverwerkt", "products.actions.export": "Exporteren", "products.upload.dropHint": "Sleep een CSV hierheen of klik om te bladeren", - "products.upload.supportsHint": "Ondersteunt .csv-productimports (ean, name, category…)", + "products.upload.supportsHint": "Ondersteunt .csv-productimports (ean, name, category…)", "products.export.chooseConfig": "Exporteer {count} geselecteerde product(en). Kies de exportfeed die formaat en velden bepaalt.", - "products.export.selectPlaceholder": "Selecteer een exportfeed…", + "products.export.selectPlaceholder": "Selecteer een exportfeed…", "fields.typeLabel": "Type", "fields.groupLabel": "Groep", "fields.selectGroup": "Selecteer een groep", @@ -4132,8 +4133,8 @@ export const nl: MessageDict = { "fields.enableRecommended": "Aanbevolen inschakelen", "feeds.activated": "Feed geactiveerd.", "feeds.deactivated": "Feed gedeactiveerd.", - "feeds.syncTimeout": "Synchroniseren timed out waiting for the server. The job may still finish — open Synchroniseren History to check status.", - "feeds.createdMapHint": "Feed aangemaakt. Map velden vóór synchronisatie.", + "feeds.syncTimeout": "Synchroniseren timed out waiting for the server. The job may still finish — open Synchroniseren History to check status.", + "feeds.createdMapHint": "Feed aangemaakt. Map velden vóór synchronisatie.", "feeds.createdPlain": "Feed aangemaakt.", "feeds.createdMapDesc": "Map bronkolommen naar productvelden en synchroniseer daarna.", "feeds.lastLiveSync": "Laatste geslaagde feed-sync: {when}", @@ -4157,25 +4158,25 @@ export const nl: MessageDict = { "products.filters.sortNameAsc": "Naam (A-Z)", "products.filters.sortNameDesc": "Naam (Z-A)", "products.filters.searchPlaceholder": "Producten zoeken...", - "products.filters.searchCategories": "Categorieën zoeken...", + "products.filters.searchCategories": "Categorieën zoeken...", "products.filters.selectFeed": "Feed selecteren", - "products.filters.loadingFeeds": "Feeds laden…", + "products.filters.loadingFeeds": "Feeds laden…", "products.table.loading": "Producten laden", "products.table.uncategorized": "Zonder categorie", "products.table.assignCategory": "Categorie toewijzen", "products.table.changeCategory": "Categorie wijzigen voor {name}", - "products.table.selectCategory": "Selecteer categorie…", + "products.table.selectCategory": "Selecteer categorie…", "products.table.saveCategory": "Categorie opslaan", "products.table.cancelCategory": "Categoriebewerking annuleren", "products.table.categoryRequired": "Kies een categorie", - "products.table.noCategoriesAvailable": "Nog geen categorieën — maak er een aan onder Catalogus", + "products.table.noCategoriesAvailable": "Nog geen categorieën — maak er een aan onder Catalogus", "products.table.qualityUnavailable": "Kwaliteit niet beschikbaar", "products.table.full": "Vol", "products.table.empty": "Leeg", "products.table.saveName": "Naam opslaan", "products.table.cancelRename": "Hernoemen annuleren", "products.table.noSyncYet": "Nog geen sync", - "products.feedSync.feedAndWhen": "{feed} · {when}", + "products.feedSync.feedAndWhen": "{feed} · {when}", "products.feedSync.syncedWhen": "Gesynchroniseerd {when}", "products.table.productOptions": "Productopties", "products.edit.details": "Productdetails", @@ -4183,15 +4184,15 @@ export const nl: MessageDict = { "products.edit.specsPresent": "Technische specificaties zijn aanwezig op dit product.", "products.edit.noEnrichedName": "Geen verrijkte naam", "products.edit.resetName": "Verrijkte naam resetten naar het origineel", - "products.edit.cannotClearName": "Origineel is leeg — verrijkte naam kan niet via PATCH worden gewist", + "products.edit.cannotClearName": "Origineel is leeg — verrijkte naam kan niet via PATCH worden gewist", "products.edit.showPreview": "Voorbeeld tonen", "products.edit.editHtml": "HTML bewerken", "products.edit.noEnrichedDescription": "Geen verrijkte beschrijving", "products.edit.resetDescription": "Verrijkte beschrijving resetten naar het origineel", - "products.edit.cannotClearDescription": "Origineel is leeg — verrijkte beschrijving kan niet via PATCH worden gewist", + "products.edit.cannotClearDescription": "Origineel is leeg — verrijkte beschrijving kan niet via PATCH worden gewist", "products.edit.unknownFeed": "Onbekende feed", "products.edit.noProcessedName": "Geen verwerkte naam beschikbaar", - "products.edit.feedNamed": "Feed · {name}", + "products.edit.feedNamed": "Feed · {name}", "products.edit.noAiDescription": "Geen AI-beschrijving", "products.edit.sourceLabel": "Bronlabel", "products.edit.coverageTitle": "Hoeveel van Naam, Beschrijving, Attributen en Categorie aanwezig zijn (feed of verwerkt).", @@ -4199,8 +4200,8 @@ export const nl: MessageDict = { "products.edit.eprelPresentTitle": "Het European Product Registry for Energy Labelling (EPREL)-id is aanwezig op dit product.", "products.edit.noEprelBadge": "Geen EPREL", "products.edit.specsBadge": "Specs", - "products.edit.reviewBannerTitle": "Beoordeel verrijkte velden vóór accepteren", - "products.edit.reviewBannerHelp": "Gebruik het tabblad Review om originelen vs AI te vergelijken. Sneltoetsen: A accepteren · R afwijzen · Alt+1/2 veld · ⌘/Ctrl+Enter alles accepteren.", + "products.edit.reviewBannerTitle": "Beoordeel verrijkte velden vóór accepteren", + "products.edit.reviewBannerHelp": "Gebruik het tabblad Review om originelen vs AI te vergelijken. Sneltoetsen: A accepteren · R afwijzen · Alt+1/2 veld · ⌘/Ctrl+Enter alles accepteren.", "products.edit.tab.review": "Controleren", "products.edit.tab.details": "Details", "products.edit.tab.content": "Inhoud", @@ -4216,9 +4217,9 @@ export const nl: MessageDict = { "products.edit.acceptDescription": "Beschrijving accepteren", "products.edit.noCategory": "No Categorie", "products.edit.whatsFilledIn": "Wat is ingevuld", - "products.edit.coverageLegend": "Grijs = ontbreekt · Oranje = uit feed · Groen = verwerkt", + "products.edit.coverageLegend": "Grijs = ontbreekt · Oranje = uit feed · Groen = verwerkt", "products.edit.feedSource": "Feedbron", - "products.edit.updatedRelative": "· bijgewerkt {when}", + "products.edit.updatedRelative": "· bijgewerkt {when}", "products.edit.viewAllFeedFields": "Bekijken all feed fields ({filled}/{total})", "products.edit.productIdentity": "Productidentiteit", "products.edit.aiProcessedName": "AI-verwerkte naam", @@ -4226,9 +4227,9 @@ export const nl: MessageDict = { "products.edit.productIdSku": "Product-ID / SKU", "products.edit.rowUpdated": "Productrij bijgewerkt {when}", "products.edit.noRawUpdateTime": "Geen raw product-updatetijd", - "products.edit.feedSyncLabel": "· feed-sync {when}", + "products.edit.feedSyncLabel": "· feed-sync {when}", "products.edit.neverRecorded": "nooit vastgelegd", - "products.edit.feedFilledCount": "{filled} ingevuld · {total} velden", + "products.edit.feedFilledCount": "{filled} ingevuld · {total} velden", "products.edit.noMappedFeedFields": "Geen gemapte feedvelden op dit product.", "products.edit.fieldCol": "Veld", "products.edit.valueFromFeed": "Waarde from feed", @@ -4258,7 +4259,7 @@ export const nl: MessageDict = { "taskIndicator.collapse": "Takenlijst inklappen", "taskIndicator.progressAria": "Jobvoortgang {pct} procent", "taskIndicator.progressCounts": "{done} van {total} producten", - "attributes.assignBulk": "Toewijzen aan categorieën", + "attributes.assignBulk": "Toewijzen aan categorieën", "products.filters.search": "Zoeken", "products.filters.sortAria": "Sortering: {label}", "products.filters.sortLabel": "Sortering: {label}", @@ -4270,7 +4271,7 @@ export const nl: MessageDict = { "products.table.colStatus": "Statuslabel", "products.table.colUpdated": "Laatst bijgewerkt", "products.table.colActions": "Acties", - "products.table.loadingDots": "Producten laden…", + "products.table.loadingDots": "Producten laden…", "products.table.noneFound": "Geen producten gevonden.", "products.table.selectProduct": "Product {name} selecteren", "products.table.rename": "{name} hernoemen", @@ -4285,8 +4286,8 @@ export const nl: MessageDict = { "categories.variablesReplacedHelp": "Variabelen worden vervangen door productgegevens wanneer beschikbaar. Ontbrekende waarden worden overgeslagen.", "categories.variableTypeHelp": "Dynamisch veld uit productgegevens (voorbeeld: merk).", "categories.textTypeHelp": "Statische tekst die altijd verschijnt zoals geschreven.", - "categories.assignTitleCopyHelp": "Gebruik Toewijzen om deze formule te kopiëren naar andere categorieën die hetzelfde titelpatroon moeten delen.", - "categories.titleFormulaInvalid": "Deze titelformulepagina heeft een geldige categorie nodig. Ga terug naar categorieën en open Titelformule bewerken opnieuw.", + "categories.assignTitleCopyHelp": "Gebruik Toewijzen om deze formule te kopiëren naar andere categorieën die hetzelfde titelpatroon moeten delen.", + "categories.titleFormulaInvalid": "Deze titelformulepagina heeft een geldige categorie nodig. Ga terug naar categorieën en open Titelformule bewerken opnieuw.", "categories.preview.title": "Titelvoorbeeld", "categories.preview.description": "Zo worden uw producttitels gestructureerd", "categories.preview.exampleTab": "Voorbeeldweergave", @@ -4327,7 +4328,7 @@ export const nl: MessageDict = { "categories.noVariablesFound": "Geen variabelen gevonden", "categories.availableVariables": "Beschikbare variabelen", "categories.manage": "Beheren", - "categories.noVariablesMatch": "Geen variabelen komen overeen met “{query}”.", + "categories.noVariablesMatch": "Geen variabelen komen overeen met “{query}”.", "categories.noUnusedVariables": "Geen ongebruikte variabelen meer. Voeg een aangepaste variabele toe of verwijder een element om er een vrij te maken.", "categories.exampleColon": "Voorbeeld: {value}", "categories.editVariableAria": "{label} bewerken", @@ -4341,9 +4342,9 @@ export const nl: MessageDict = { "categories.metaInformation": "Meta-informatie", "categories.metaInformationHelp": "Instructies die de AI gebruikt voor SEO-titel- en metabeschrijvingstags.", "categories.metaTitleFormula": "Metatitelformule", - "categories.metaTitleHint": "Getoond in zoekresultaten en browsertabbladen (ongeveer 50–60 tekens).", + "categories.metaTitleHint": "Getoond in zoekresultaten en browsertabbladen (ongeveer 50–60 tekens).", "categories.metaDescriptionFormula": "Metabeschrijvingsformule", - "categories.metaDescriptionHint": "Getoond onder de titel in zoekresultaten (ongeveer 120–155 tekens).", + "categories.metaDescriptionHint": "Getoond onder de titel in zoekresultaten (ongeveer 120–155 tekens).", "categories.resetToDefault": "Terugzetten naar standaard", "categories.descriptionSections": "Beschrijvingssecties", "categories.descriptionSectionsHelp": "Sleep secties om de volgorde van de gegenereerde beschrijving in te stellen.", @@ -4356,18 +4357,18 @@ export const nl: MessageDict = { "categories.aboutDescriptionFormulas": "Over beschrijvingsformules", "categories.aboutDescriptionFormulasHelp": "Deze instructies vertellen de AI hoe beschrijvingen voor producten in deze categorie te schrijven.", "categories.sectionTypesHeading": "Sectietypen", - "categories.sectionTypeHeadings": "Koppen (H1–H4):", + "categories.sectionTypeHeadings": "Koppen (H1–H4):", "categories.sectionTypeHeadingsHelp": "Titels en ondertitels", - "categories.sectionTypeParagraphs": "Alinea’s:", + "categories.sectionTypeParagraphs": "Alinea’s:", "categories.sectionTypeParagraphsHelp": "Hoofdinhoudsblokken", "categories.sectionTypeLists": "Opsommingen:", "categories.sectionTypeListsHelp": "Functies en specs", "categories.aiInstructionsHeading": "AI-instructies", - "categories.aiInstructionsBody": "Schrijf per sectie één duidelijke taak (wat te dekken, toon, lengte). Vage prompts geven vage tekst.", - "categories.exportIdsHeading": "Export-ID’s", - "categories.exportIdsBody": "Optionele ID’s mappen een sectie naar exportfeeds (bijvoorbeeld short_description).", - "categories.assignDescCopyHelp": "Gebruik Toewijzen om dit sjabloon te kopiëren naar andere categorieën met dezelfde structuur.", - "categories.descriptionFormulaInvalid": "Deze beschrijvingsformulepagina heeft een geldige categorie nodig. Ga terug naar categorieën en open Beschrijvingsformule bewerken opnieuw.", + "categories.aiInstructionsBody": "Schrijf per sectie één duidelijke taak (wat te dekken, toon, lengte). Vage prompts geven vage tekst.", + "categories.exportIdsHeading": "Export-ID’s", + "categories.exportIdsBody": "Optionele ID’s mappen een sectie naar exportfeeds (bijvoorbeeld short_description).", + "categories.assignDescCopyHelp": "Gebruik Toewijzen om dit sjabloon te kopiëren naar andere categorieën met dezelfde structuur.", + "categories.descriptionFormulaInvalid": "Deze beschrijvingsformulepagina heeft een geldige categorie nodig. Ga terug naar categorieën en open Beschrijvingsformule bewerken opnieuw.", "categories.sectionType.h1": "Kop 1", "categories.sectionType.h2": "Kop 2", "categories.sectionType.h3": "Kop 3", @@ -4377,19 +4378,19 @@ export const nl: MessageDict = { "categories.aiGenerationPrompt": "AI-generatieprompt", "categories.aiPromptOverrides": "Overschrijft de bedrijfs-prompt voor productverbetering voor {name}", "categories.promptTemplate": "Prompt-sjabloon", - "categories.promptTemplateHelp": "Gebruik plaatsaanduidingen zoals {{name}} en {{description}}. Laat leeg om de bedrijfsstandaard uit Integraties → AI te gebruiken.", + "categories.promptTemplateHelp": "Gebruik plaatsaanduidingen zoals {{name}} en {{description}}. Laat leeg om de bedrijfsstandaard uit Integraties → AI te gebruiken.", "categories.clear": "Wissen", "categories.promptLabel": "Prompt", "categories.charactersCount": "{count} tekens", - "categories.activeOverride": "· actieve overschrijving voor deze categorie", - "categories.usingCompanyDefault": "· bedrijfs-/ingebouwde standaard wordt gebruikt", - "categories.usingCompanyDefaultForLang": "· leeg voor deze taal — bedrijfs-/ingebouwde standaard geldt", + "categories.activeOverride": "· actieve overschrijving voor deze categorie", + "categories.usingCompanyDefault": "· bedrijfs-/ingebouwde standaard wordt gebruikt", + "categories.usingCompanyDefaultForLang": "· leeg voor deze taal — bedrijfs-/ingebouwde standaard geldt", "categories.aiPromptSavedLang": "AI-prompt opgeslagen voor {lang}.", "categories.aiPromptClearedLang": "AI-prompt gewist voor {lang} (bedrijfsstandaard geldt).", "contentLang.switcherLabel": "Contenttaal", "contentLang.primary": "primair", "contentLang.hasOverride": "aangepast", - "contentLang.addLanguage": "Taal toevoegen…", + "contentLang.addLanguage": "Taal toevoegen…", "contentLang.add": "Toevoegen", "contentLang.removeLanguage": "{lang} verwijderen", "contentLang.resultsHint": "Wissel van taal om AI-titels en -beschrijvingen per contenttaal te bekijken.", @@ -4412,7 +4413,7 @@ export const nl: MessageDict = { "news.subtitle": "Nieuwste functies en verbeteringen", "news.keyFeatures": "Belangrijkste functies:", "news.badge.new": "Nieuw", - "news.footer": "Dat is alles voor nu — kom terug na de volgende release.", + "news.footer": "Dat is alles voor nu — kom terug na de volgende release.", "news.category.enhancement": "Verbetering", "news.category.feature": "Functie", "news.category.integration": "Integratie", @@ -4422,12 +4423,12 @@ export const nl: MessageDict = { "news.uxImprovements.f1": "Rondleiding overslaan/verbergen", "news.uxImprovements.f2": "API-betrouwbaarheidsverbeteringen", "news.uxImprovements.f3": "Verbeterde UI-navigatie", - "news.uxImprovements.f4": "Betere workflow-efficiëntie", + "news.uxImprovements.f4": "Betere workflow-efficiëntie", "news.multiselect.title": "Ondersteuning voor multiselect-attributen", "news.multiselect.description": "Producten kunnen meerdere waarden hebben voor lijstattributen.", "news.multiselect.f1": "Multiselect-attribuuttype", "news.multiselect.f2": "Meervoudige selectie bij productbewerking", - "news.multiselect.f3": "Meerdere waarden op één attribuut", + "news.multiselect.f3": "Meerdere waarden op één attribuut", "news.multiselect.f4": "Verbeterde extractie voor multiselect-velden", "news.multiselect.f5": "Betere compatibiliteit van exportfeeds", "news.csvEan.title": "CSV-EAN-upload", @@ -4444,9 +4445,9 @@ export const nl: MessageDict = { "news.brick.f3": "BRICK-code-integratie in XML-feeds", "news.brick.f4": "Compatibiliteitsverbeteringen voor exportfeeds", "news.apiV1.title": "API v1-release", - "news.apiV1.description": "Nieuwe API v1-endpoints voor categorieën, attributen, feeds, producten en exports.", + "news.apiV1.description": "Nieuwe API v1-endpoints voor categorieën, attributen, feeds, producten en exports.", "news.apiV1.f1": "RESTful API v1-endpoints", - "news.apiV1.f2": "Beheer van categorieën en attributen", + "news.apiV1.f2": "Beheer van categorieën en attributen", "news.apiV1.f3": "Feedcreatie en -beheer", "news.apiV1.f4": "Productverwerking via API", "news.apiV1.f5": "Programmatische toegang tot exportfeeds", @@ -4465,23 +4466,23 @@ export const nl: MessageDict = { "news.exportFeeds.f3": "Exportvoorbeeld", "news.exportFeeds.f4": "Jobgebaseerde productexport", "news.exportFeeds.f5": "EPREL-gegevensintegratie", - "news.exportFeeds.f6": "Openbare exportfeed-URL’s", + "news.exportFeeds.f6": "Openbare exportfeed-URL’s", "news.woocommerce.title": "WooCommerce-integratie", - "news.woocommerce.description": "Synchroniseer producten, categorieën en attributen met WooCommerce-winkels.", + "news.woocommerce.description": "Synchroniseer producten, categorieën en attributen met WooCommerce-winkels.", "news.woocommerce.f1": "Winkelgegevens configureren", "news.woocommerce.f2": "Categorie- en attribuutmapping", "news.woocommerce.f3": "Bidirectionele productsynchronisatie", "news.woocommerce.f4": "Matchstrategie-opties", "news.eprel.title": "EPREL-energieetiketintegratie", - "news.eprel.description": "Koppeling met het Europese energie-etiketteringsregister voor efficiëntiegegevens.", + "news.eprel.description": "Koppeling met het Europese energie-etiketteringsregister voor efficiëntiegegevens.", "news.eprel.f1": "Automatische EPREL-ID-verwerking", "news.eprel.f2": "Ophalen van energieetiketafbeeldingen", "news.eprel.f3": "Downloads van productenergiefiches", "news.eprel.f4": "Extractie van energieklasse", "news.eprel.f5": "Meertalige ondersteuning", "news.aiCategorization.title": "Verbeterde productcategorisatie", - "news.aiCategorization.description": "AI-categorisatiesysteem met betere nauwkeurigheid en hiërarchische ondersteuning.", - "news.aiCategorization.f1": "Hiërarchische categorienavigatie", + "news.aiCategorization.description": "AI-categorisatiesysteem met betere nauwkeurigheid en hiërarchische ondersteuning.", + "news.aiCategorization.f1": "Hiërarchische categorienavigatie", "news.aiCategorization.f2": "Betrouwbaarheidsscore", "news.aiCategorization.f3": "Meertalige ondersteuning", "news.aiCategorization.f4": "Automatische fallback-afhandeling", @@ -4502,16 +4503,16 @@ export const nl: MessageDict = { "products.pageTitle": "Productbeheer", "products.pageDescriptionStoresBefore": "Beheer, verwerk en optimaliseer uw catalogus. Verbind een winkel of importeer CSV via", "products.pageDescriptionBasic": "Beheer, verwerk en optimaliseer uw catalogus. Importeer via Feeds of upload een CSV.", - "products.keyboard.esc": "— sluit het bewerkingspaneel of dialogen", - "products.keyboard.toggle": "— deze tip tonen/verbergen", + "products.keyboard.esc": "— sluit het bewerkingspaneel of dialogen", + "products.keyboard.toggle": "— deze tip tonen/verbergen", "products.keyboard.reviewPrefix": "In het Needs Review-paneel:", "products.keyboard.acceptAll": "alles accepteren", "products.keyboard.rejectShort": "afwijzen", "products.keyboard.acceptFields": "naam / beschrijving accepteren", "products.connectStore": "Winkel verbinden", - "products.updating": "Bijwerken…", + "products.updating": "Bijwerken…", "products.needLinkedRaw": "Geselecteerde producten hebben een gekoppeld raw-product nodig om te verwerken.", - "products.selectToProcess": "Selecteer minstens één product om te verwerken.", + "products.selectToProcess": "Selecteer minstens één product om te verwerken.", "products.undoResetHint": "Ongedaan maken zet het product via reset terug naar onverwerkt.", "products.field.accepted": "{label} geaccepteerd in product.", "products.field.acceptFailed": "Kon {field} niet accepteren", @@ -4523,18 +4524,18 @@ export const nl: MessageDict = { "products.enrichment.rejectSelectedTitle": "Geselecteerde producten afwijzen?", "products.enrichment.resetTitle": "Terugzetten naar onverwerkt?", "products.selectedOnPage": "{count} op deze pagina geselecteerd", - "products.selectionPageOnly": "{shown} van {total} — selectie alleen deze pagina", + "products.selectionPageOnly": "{shown} van {total} — selectie alleen deze pagina", "products.edit.coverageHint": "Hoeveel van Naam, Beschrijving, Attributen en Categorie aanwezig zijn (feed of verwerkt).", "products.edit.noEprelShort": "Geen EPREL", "products.edit.specs": "Specs", - "products.edit.reviewBannerBody": "Gebruik het tabblad Review om originelen vs AI te vergelijken. Sneltoetsen: A accepteren · R afwijzen · Alt+1/2 veld · ⌘/Ctrl+Enter alles accepteren.", + "products.edit.reviewBannerBody": "Gebruik het tabblad Review om originelen vs AI te vergelijken. Sneltoetsen: A accepteren · R afwijzen · Alt+1/2 veld · ⌘/Ctrl+Enter alles accepteren.", "products.edit.whatsFilled": "Wat is ingevuld", - "products.edit.legend": "Grijs = ontbreekt · Oranje = uit feed · Groen = verwerkt", - "products.edit.updatedAgo": "· bijgewerkt {relative}", + "products.edit.legend": "Grijs = ontbreekt · Oranje = uit feed · Groen = verwerkt", + "products.edit.updatedAgo": "· bijgewerkt {relative}", "products.edit.status": "Statuslabel", "products.edit.noRawUpdate": "Geen updatetijd voor ruw product", - "products.edit.feedSyncPart": "· feed-sync", - "products.edit.filledFields": "{filled} ingevuld · {total} velden", + "products.edit.feedSyncPart": "· feed-sync", + "products.edit.filledFields": "{filled} ingevuld · {total} velden", "products.edit.noMappedFields": "Geen gemapte feedvelden op dit product.", "products.edit.emptyBadge": "Leeg", "products.edit.coreBadge": "Kern", @@ -4568,20 +4569,20 @@ export const nl: MessageDict = { "admin.analytics.lastNDaysAria": "Laatste {days} dagen", "admin.analytics.overview": "Overzicht", "admin.analytics.overviewHint": "Platformtotalen met periodecontext voor de laatste {days} dagen.", - "admin.analytics.tokensInPeriod": "{tokens} in periode · van verwerkte producten", + "admin.analytics.tokensInPeriod": "{tokens} in periode · van verwerkte producten", "admin.analytics.creditsRemainingOf": "{remaining} resterend van {allocated} toegewezen", "admin.analytics.noJobsYet": "Nog geen jobs", - "admin.analytics.feedsVolume": "{input} input · {export} exportfeeds", - "admin.analytics.usersCompaniesRaw": "{users} gebruikers · {companies} bedrijven · {raw} raw", + "admin.analytics.feedsVolume": "{input} input · {export} exportfeeds", + "admin.analytics.usersCompaniesRaw": "{users} gebruikers · {companies} bedrijven · {raw} raw", "admin.analytics.operations": "Operaties", "admin.analytics.operationsHint": "Betrouwbaarheidssignalen, sleutels en groei voor de geselecteerde periode.", - "admin.analytics.failedCompleted": "{failed} mislukt · {completed} voltooid", - "admin.analytics.runningOver2h": "Actief > 2 u ·", + "admin.analytics.failedCompleted": "{failed} mislukt · {completed} voltooid", + "admin.analytics.runningOver2h": "Actief > 2 u ·", "admin.analytics.apiKeysTotal": "{total} totaal (ingetrokken inbegrepen)", - "admin.analytics.signupsDetail": "gebruikers · {companies} bedrijven · {tickets} open/wachtende tickets", + "admin.analytics.signupsDetail": "gebruikers · {companies} bedrijven · {tickets} open/wachtende tickets", "admin.analytics.providerMix": "Provider-mix", "admin.analytics.providerMixHint": "Tokenverbruik naar hoe AI-credentials zijn geconfigureerd.", - "admin.analytics.productsJobs": "{products} producten · {jobs} jobs", + "admin.analytics.productsJobs": "{products} producten · {jobs} jobs", "admin.analytics.trends": "Trends", "admin.analytics.trendsHint": "Dagreeksen voor tokens, providers, jobs en aanmeldingen.", "admin.analytics.tokensByDayHint": "Tokens van voltooide productverwerking (secundair = producten die dag)", @@ -4590,7 +4591,7 @@ export const nl: MessageDict = { "admin.analytics.emptyTokens": "Geen verwerkte producten met tokens in deze periode.", "admin.analytics.tokensByProviderHint": "Dagelijkse split: intern / populair / aangepast (per providertype)", "admin.analytics.emptyProviderTokens": "Nog geen provider-getagde tokens in deze periode.", - "admin.analytics.providerDayTip": "{date}: Intern {internal} · Populair {popular} · Aangepast {custom}", + "admin.analytics.providerDayTip": "{date}: Intern {internal} · Populair {popular} · Aangepast {custom}", "admin.analytics.seriesCreated": "Aangemaakt", "admin.analytics.seriesFailed": "Mislukt", "admin.analytics.emptyJobsSeries": "Geen verwerkingsjobs aangemaakt in deze periode.", @@ -4622,29 +4623,29 @@ export const nl: MessageDict = { "admin.diagnostics.systemStatus": "Systeemstatus", "admin.diagnostics.snapshot": "Snapshot {when}", "admin.diagnostics.queueTotal": "{total} totaal", - "admin.diagnostics.queueStuck": "processing_jobs · vastgelopen actief (>2 u):", + "admin.diagnostics.queueStuck": "processing_jobs · vastgelopen actief (>2 u):", "admin.diagnostics.driver": "Driver: {driver}", "admin.diagnostics.openStuck": "Vastgelopen producten openen", "admin.diagnostics.configPresence": "Configaanwezigheid", - "admin.diagnostics.configHint": "Alleen booleans · env {env} · RPM {rpm} · batch {batch} · retries {retries}", + "admin.diagnostics.configHint": "Alleen booleans · env {env} · RPM {rpm} · batch {batch} · retries {retries}", "admin.diagnostics.cutoverTitle": "Cutover-gereedheid", - "admin.diagnostics.cutoverHint": "Alleen aanwezigheidsflags — goose-versiehints, worker-leeftijd, ontbrekende plannen. Geen live Stripe/SMTP.", + "admin.diagnostics.cutoverHint": "Alleen aanwezigheidsflags — goose-versiehints, worker-leeftijd, ontbrekende plannen. Geen live Stripe/SMTP.", "admin.diagnostics.cutoverGoose": "Goose", - "admin.diagnostics.cutoverGooseVersion": "version_max {max} · verwacht ≥ {min}", + "admin.diagnostics.cutoverGooseVersion": "version_max {max} · verwacht ≥ {min}", "admin.diagnostics.cutoverGooseRequired": "Vereiste migraties", "admin.diagnostics.cutoverWorker": "Worker", - "admin.diagnostics.cutoverWorkerAge": "laatst gezien {age}s geleden · verouderd na {stale}s", - "admin.diagnostics.cutoverWorkerAgeUnknown": "leeftijd niet beschikbaar · verouderd na {stale}s", + "admin.diagnostics.cutoverWorkerAge": "laatst gezien {age}s geleden · verouderd na {stale}s", + "admin.diagnostics.cutoverWorkerAgeUnknown": "leeftijd niet beschikbaar · verouderd na {stale}s", "admin.diagnostics.cutoverPlansMissing": "Bedrijven zonder plan", "admin.diagnostics.cutoverPlansUnavailable": "Plancounting niet beschikbaar", "admin.diagnostics.cutoverApiKeysMissing": "Companies without API keys", "admin.diagnostics.cutoverApiKeysUnavailable": "API key inventory unavailable", - "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", + "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", "admin.diagnostics.cutoverApiKeysLink": "List companies needing reissue", "admin.diagnostics.cutoverApplied": "toegepast", "admin.diagnostics.cutoverPending": "wachtend", "admin.diagnostics.etlInventoryTitle": "ETL gap inventory", - "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", + "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", "admin.diagnostics.etlInventoryFiles": "Files metadata-only", "admin.diagnostics.etlInventoryFilesDetail": "metadata-only / total file rows", "admin.diagnostics.etlInventoryJobs": "Jobs migrated tag", @@ -4654,12 +4655,12 @@ export const nl: MessageDict = { "admin.diagnostics.etlInventoryTasksDetail": "legacy task history present in Postgres", "admin.diagnostics.recentJobs": "Recente taken", "admin.diagnostics.recentAiFailures": "Recente AI-supportfouten", - "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", + "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", "admin.diagnostics.relatedTools": "Gerelateerde ops-tools", "admin.diagnostics.toolStuckTitle": "Vastgelopen producten", "admin.diagnostics.toolStuckDesc": "Jobs opschonen die langer dan 2 uur actief zijn.", "admin.diagnostics.toolOrphanTitle": "Orphan processed", - "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", + "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", "admin.diagnostics.toolAnalyticsTitle": "Analytics", "admin.diagnostics.toolAnalyticsDesc": "Trends en platformgebruiksgrafieken.", "admin.diagnostics.toolBootstrapTitle": "Bootstrap", @@ -4687,8 +4688,8 @@ export const nl: MessageDict = { "admin.diagnostics.config.credentials_encryption_key_set": "Versleutelingssleutel voor credentials gezet", "categories.selectAll": "Alles selecteren", "categories.selectedCount": "{count} geselecteerd", - "categories.noMatchingCategories": "Geen overeenkomende categorieën", - "categories.assigningProgress": "Toewijzen… {progress}%", + "categories.noMatchingCategories": "Geen overeenkomende categorieën", + "categories.assigningProgress": "Toewijzen… {progress}%", "categories.assignToCount": "Toewijzen aan {count}", "categories.aiPromptSavedForCategory": "Er is een AI-generatieprompt opgeslagen voor deze categorie.", "categories.titleAndDescriptionFormulasSaved": "Titel- en beschrijvingsformules zijn opgeslagen voor deze categorie.", @@ -4703,25 +4704,25 @@ export const nl: MessageDict = { "site.nav.home": "Home", "site.nav.pricing": "Prijzen", "site.nav.apiDocs": "API-docs", - "seo.home.title": "Descrybe — Zet leveranciersfeeds om in kant-en-klare productpagina's", - "seo.home.description": "Koppel CSV- of XML-leveranciersfeeds, wijs ze toe aan uw categorieën en attributen, genereer titels en beschrijvingen volgens uw regels en exporteer of synchroniseer met WooCommerce.", - "seo.pricing.title": "Prijzen — Free, Starter, Growth, Business | Descrybe", - "seo.pricing.description": "Begin gratis met 100 producten en feed-mapping. Betaalde abonnementen voegen AI-titels en -beschrijvingen toe, meer SKU's, exportfeeds en WooCommerce-sync — vanaf 49 $/maand. Enterprise voor onbeperkte catalogi.", + "seo.home.title": "Descrybe — Zet leveranciersfeeds om in kant-en-klare productpagina's", + "seo.home.description": "Koppel CSV- of XML-leveranciersfeeds, wijs ze toe aan uw categorieën en attributen, genereer titels en beschrijvingen volgens uw regels en exporteer of synchroniseer met WooCommerce.", + "seo.pricing.title": "Prijzen — Free, Starter, Growth, Business | Descrybe", + "seo.pricing.description": "Begin gratis met 100 producten en feed-mapping. Betaalde abonnementen voegen AI-titels en -beschrijvingen toe, meer SKU's, exportfeeds en WooCommerce-sync — vanaf 49 $/maand. Enterprise voor onbeperkte catalogi.", "seo.privacy.title": "Privacybeleid | Descrybe", "seo.privacy.description": "Hoe Descrybe accountgegevens, productcatalogi en leveranciersfeeds verzamelt, gebruikt en beschermt wanneer u ons productgegevensplatform gebruikt.", "seo.terms.title": "Servicevoorwaarden | Descrybe", "seo.terms.description": "Gebruiksvoorwaarden van Descrybe: feed-import, catalogusverrijking, AI-ondersteunde content, exporten en synchronisatie met WooCommerce voor uw bedrijf.", - "seo.features.title": "Functies — Feeds, verrijking en export | Descrybe", + "seo.features.title": "Functies — Feeds, verrijking en export | Descrybe", "seo.features.description": "Ontdek hoe Descrybe leveranciersfeeds importeert, velden toewijst aan uw taxonomie, productgegevens verrijkt en catalogi levert via exportfeeds, WooCommerce of API.", "pricing.page.eyebrow": "Prijzen", "pricing.page.title": "Eenvoudige plannen voor groeiende catalogi", - "pricing.page.lead": "Begin gratis met feed-mapping en basisopschoning. Upgrade wanneer je AI-titels en -beschrijvingen, meer producten, exportfeeds of WooCommerce-sync nodig hebt — van Starter tot Enterprise.", + "pricing.page.lead": "Begin gratis met feed-mapping en basisopschoning. Upgrade wanneer je AI-titels en -beschrijvingen, meer producten, exportfeeds of WooCommerce-sync nodig hebt — van Starter tot Enterprise.", "pricing.page.subscribedBefore": "Al geabonneerd? Beheer gebruik onder", "pricing.page.subscribedMid": "of vergelijk plannen in", "pricing.page.plansLink": "Plannen", "pricing.page.subscribedAfter": ".", "legal.lastUpdated": "Laatst bijgewerkt: {date}", - "legal.backHome": "← Terug naar home", + "legal.backHome": "← Terug naar home", "legal.emailLabel": "E-mail:", "legal.postalLabel": "Postadres:", "legal.privacy.title": "Privacybeleid", @@ -4736,8 +4737,8 @@ export const nl: MessageDict = { "legal.privacy.collect.userData.p": "Om onze Diensten te leveren, verzamelen en verwerken wij productgegevens, leveranciersfeeds, productbeschrijvingen en andere content die u uploadt, invoert of anderszins naar ons platform stuurt. Dit kan productattributen, taxonomiestructuren, sjablonen en andere gegevens omvatten die nodig zijn voor de werking van onze Diensten.", "legal.privacy.collect.usage.h": "Gebruiksgegevens", "legal.privacy.collect.usage.p": "Wij verzamelen automatisch bepaalde gegevens over uw apparaat en over hoe u met onze Diensten omgaat, waaronder het IP-adres, het apparaattype, het browsertype, het besturingssysteem, toegangstijden, bekeken pagina's, gebruikte functies en andere systeemactiviteit. Wij gebruiken deze gegevens om onze Diensten en de gebruikerservaring te verbeteren.", - "legal.privacy.collect.cookies.h": "Cookies en trackingtechnologieën", - "legal.privacy.collect.cookies.p": "Wij gebruiken cookies, web beacons en vergelijkbare trackingtechnologieën om gegevens te verzamelen over uw browse-activiteiten op onze website. U kunt cookies beheren via de instellingen van uw browser en andere hulpmiddelen. Als u echter bepaalde cookies blokkeert, kunt u mogelijk niet alle functies van onze Diensten gebruiken.", + "legal.privacy.collect.cookies.h": "Cookies en trackingtechnologieën", + "legal.privacy.collect.cookies.p": "Wij gebruiken cookies, web beacons en vergelijkbare trackingtechnologieën om gegevens te verzamelen over uw browse-activiteiten op onze website. U kunt cookies beheren via de instellingen van uw browser en andere hulpmiddelen. Als u echter bepaalde cookies blokkeert, kunt u mogelijk niet alle functies van onze Diensten gebruiken.", "legal.privacy.use.h": "Hoe wij uw gegevens gebruiken", "legal.privacy.use.lead": "Wij gebruiken de gegevens die wij verzamelen voor verschillende doeleinden, waaronder:", "legal.privacy.use.li1": "Het leveren, onderhouden en verbeteren van onze Diensten", @@ -4764,7 +4765,7 @@ export const nl: MessageDict = { "legal.privacy.share.consent.h": "Met uw toestemming", "legal.privacy.share.consent.p": "Wij kunnen uw gegevens met derden delen wanneer u ons daarvoor toestemming heeft gegeven.", "legal.privacy.security.h": "Gegevensbeveiliging", - "legal.privacy.security.p1": "Wij hebben passende technische en organisatorische maatregelen geïmplementeerd die zijn ontworpen om uw persoonsgegevens te beschermen tegen onopzettelijk verlies en tegen ongeautoriseerde toegang, gebruik, wijziging en openbaarmaking. Alle informatie die u aan ons verstrekt, wordt opgeslagen op beveiligde servers achter firewalls.", + "legal.privacy.security.p1": "Wij hebben passende technische en organisatorische maatregelen geïmplementeerd die zijn ontworpen om uw persoonsgegevens te beschermen tegen onopzettelijk verlies en tegen ongeautoriseerde toegang, gebruik, wijziging en openbaarmaking. Alle informatie die u aan ons verstrekt, wordt opgeslagen op beveiligde servers achter firewalls.", "legal.privacy.security.p2": "De beveiliging van uw gegevens hangt ook van u af. Wanneer wij u een wachtwoord hebben verstrekt (of u er een heeft gekozen) om toegang te krijgen tot bepaalde delen van onze Diensten, bent u verantwoordelijk voor het geheim houden van dat wachtwoord. Wij verzoeken u uw wachtwoord met niemand te delen.", "legal.privacy.security.p3": "Helaas is de overdracht van gegevens via internet niet volledig veilig. Hoewel wij al het mogelijke doen om uw persoonsgegevens te beschermen, kunnen wij de beveiliging van persoonsgegevens die naar onze Diensten worden verzonden niet garanderen. Elke overdracht van persoonsgegevens geschiedt op uw eigen risico.", "legal.privacy.rights.h": "Uw rechten en keuzes", @@ -4776,7 +4777,7 @@ export const nl: MessageDict = { "legal.privacy.rights.li5": "Intrekking van de toestemming (waar van toepassing)", "legal.privacy.rights.footer": "Om uw rechten uit te oefenen, kunt u contact met ons opnemen via de contactgegevens onderaan dit Privacybeleid. Houd er rekening mee dat sommige van deze rechten beperkt of niet van toepassing kunnen zijn, afhankelijk van uw locatie en de specifieke omstandigheden.", "legal.privacy.retention.h": "Bewaring van gegevens", - "legal.privacy.retention.p1": "Wij bewaren uw persoonsgegevens zolang als nodig is om de doeleinden te vervullen die in dit Privacybeleid worden beschreven, tenzij de wet een langere bewaartermijn vereist of toestaat. Bij het bepalen hoe lang wij uw gegevens bewaren, houden wij rekening met de hoeveelheid, aard en gevoeligheid van de gegevens, het potentiële risico op schade door ongeautoriseerd gebruik of openbaarmaking, de verwerkingsdoeleinden en de toepasselijke wettelijke vereisten.", + "legal.privacy.retention.p1": "Wij bewaren uw persoonsgegevens zolang als nodig is om de doeleinden te vervullen die in dit Privacybeleid worden beschreven, tenzij de wet een langere bewaartermijn vereist of toestaat. Bij het bepalen hoe lang wij uw gegevens bewaren, houden wij rekening met de hoeveelheid, aard en gevoeligheid van de gegevens, het potentiële risico op schade door ongeautoriseerd gebruik of openbaarmaking, de verwerkingsdoeleinden en de toepasselijke wettelijke vereisten.", "legal.privacy.retention.p2": "Wij kunnen bepaalde gegevens bewaren nadat u uw account heeft gesloten, onder meer om te voldoen aan onze wettelijke verplichtingen, geschillen op te lossen en onze overeenkomsten te handhaven.", "legal.privacy.intl.h": "Internationale gegevensoverdrachten", "legal.privacy.intl.p1": "Uw persoonsgegevens kunnen worden overgedragen naar en verwerkt in landen anders dan het land waar u woont. Dergelijke landen kunnen andere wetten inzake gegevensbescherming hebben dan die van uw land.", @@ -4794,12 +4795,12 @@ export const nl: MessageDict = { "legal.terms.s2.h": "2. Gebruikslicentie", "legal.terms.s2.p1": "Onder voorbehoud van naleving van deze Servicevoorwaarden verleent Descrybe u een beperkte, niet-exclusieve, niet-overdraagbare en herroepelijke licentie om toegang te krijgen tot en gebruik te maken van de Diensten voor bedrijfsdoeleinden.", "legal.terms.s2.lead": "Deze licentie omvat niet:", - "legal.terms.s2.li1": "Het wijzigen of kopiëren van de Diensten of enige content daarvan", + "legal.terms.s2.li1": "Het wijzigen of kopiëren van de Diensten of enige content daarvan", "legal.terms.s2.li2": "Het gebruik van de Diensten voor enig commercieel doel anders dan het geautoriseerde bedrijfsgebruik", "legal.terms.s2.li3": "Pogingen tot decompilatie of reverse engineering van enige software in de Diensten", "legal.terms.s2.li4": "Het verwijderen van enig auteursrecht- of eigendomsvermelding van de materialen", "legal.terms.s2.li5": "Het overdragen van de materialen aan een ander persoon of het \"spiegelen\" van de materialen op enige andere server", - "legal.terms.s2.p2": "Deze licentie eindigt automatisch als u een van deze beperkingen schendt en kan te allen tijde door Descrybe worden beëindigd.", + "legal.terms.s2.p2": "Deze licentie eindigt automatisch als u een van deze beperkingen schendt en kan te allen tijde door Descrybe worden beëindigd.", "legal.terms.s3.h": "3. Abonnement en betaling", "legal.terms.s3.p1": "Toegang tot de Diensten kan een betaald abonnement vereisen. De betalingsvoorwaarden worden gespecificeerd tijdens het abonnementsproces. Alle betalingen zijn niet-restitueerbaar, tenzij Descrybe dit schriftelijk anders bepaalt.", "legal.terms.s3.p2": "Descrybe behoudt zich het recht voor om abonnementstarieven te wijzigen met een redelijke kennisgeving. Voortgezet gebruik van de Diensten na een tariefwijziging vormt aanvaarding van de nieuwe tarieven.", @@ -4818,30 +4819,30 @@ export const nl: MessageDict = { "legal.terms.s7.p1": "De Diensten worden geleverd \"zoals ze zijn\" en \"zoals beschikbaar\". Descrybe doet geen garanties, uitdrukkelijk of stilzwijgend, en doet hierbij afstand van alle garanties, met inbegrip van, zonder beperking, de stilzwijgende garanties van verkoopbaarheid, geschiktheid voor een bepaald doel, niet-inbreuk of handelsgebruik.", "legal.terms.s7.p2": "Descrybe garandeert niet dat de Diensten ononderbroken, veilig of beschikbaar zullen functioneren op een bepaald moment of op een bepaalde plaats, noch dat fouten of gebreken zullen worden gecorrigeerd.", "legal.terms.s8.h": "8. Beperking van aansprakelijkheid", - "legal.terms.s8.lead": "In geen geval is Descrybe aansprakelijk voor indirecte, incidentele, speciale, gevolg- of punitieve schade, met inbegrip van, zonder beperking, verlies van winst, gegevens, gebruik, goodwill of andere immateriële verliezen, voortvloeiend uit:", + "legal.terms.s8.lead": "In geen geval is Descrybe aansprakelijk voor indirecte, incidentele, speciale, gevolg- of punitieve schade, met inbegrip van, zonder beperking, verlies van winst, gegevens, gebruik, goodwill of andere immateriële verliezen, voortvloeiend uit:", "legal.terms.s8.li1": "Uw toegang tot of gebruik van, of het onvermogen tot toegang tot of gebruik van, de Diensten", "legal.terms.s8.li2": "Enig gedrag of enige content van derden op de Diensten", "legal.terms.s8.li3": "Enige content verkregen van de Diensten", "legal.terms.s8.li4": "Ongeautoriseerde toegang tot, gebruik of wijziging van uw transmissies of content", - "legal.terms.s9.h": "9. Beëindiging", - "legal.terms.s9.p1": "Descrybe kan uw toegang tot de Diensten onmiddellijk beëindigen of opschorten, zonder voorafgaande kennisgeving of aansprakelijkheid, om welke reden dan ook, met inbegrip van, zonder beperking, als u deze Servicevoorwaarden schendt.", - "legal.terms.s9.p2": "Na beëindiging eindigt uw recht om de Diensten te gebruiken onmiddellijk. Als u uw account wilt beëindigen, kunt u eenvoudigweg stoppen met het gebruik van de Diensten of contact met ons opnemen om verwijdering van het account te verzoeken.", + "legal.terms.s9.h": "9. Beëindiging", + "legal.terms.s9.p1": "Descrybe kan uw toegang tot de Diensten onmiddellijk beëindigen of opschorten, zonder voorafgaande kennisgeving of aansprakelijkheid, om welke reden dan ook, met inbegrip van, zonder beperking, als u deze Servicevoorwaarden schendt.", + "legal.terms.s9.p2": "Na beëindiging eindigt uw recht om de Diensten te gebruiken onmiddellijk. Als u uw account wilt beëindigen, kunt u eenvoudigweg stoppen met het gebruik van de Diensten of contact met ons opnemen om verwijdering van het account te verzoeken.", "legal.terms.s10.h": "10. Toepasselijk recht", - "legal.terms.s10.p": "Deze Voorwaarden worden beheerst door en geïnterpreteerd in overeenstemming met de wetten van Slovenië, zonder rekening te houden met de beginselen inzake conflicterende wetten.", + "legal.terms.s10.p": "Deze Voorwaarden worden beheerst door en geïnterpreteerd in overeenstemming met de wetten van Slovenië, zonder rekening te houden met de beginselen inzake conflicterende wetten.", "legal.terms.s11.h": "11. Wijzigingen in de voorwaarden", "legal.terms.s11.p": "Descrybe behoudt zich het recht voor om deze Servicevoorwaarden te allen tijde te wijzigen of te vervangen. Het is uw verantwoordelijkheid om deze Voorwaarden periodiek te controleren op wijzigingen. Voortgezet gebruik van de Diensten na publicatie van enige wijziging vormt aanvaarding van die wijzigingen.", "legal.terms.s12.h": "12. Contact", "legal.terms.s12.lead": "Als u vragen heeft over deze Servicevoorwaarden, kunt u contact met ons opnemen via:", "plans.loadFailed": "Abonnementen konden niet worden geladen", - "plans.loading": "Abonnementen laden…", + "plans.loading": "Abonnementen laden…", "plans.apiUnavailable": "De abonnementen-API is nog niet beschikbaar op deze backend. De openbare prijsvergelijking wordt weergegeven.", "plans.title": "Kies uw abonnement", "plans.sub.onPrefix": "U bent op", - "plans.sub.enterpriseSuffix": "— onbeperkte producten en AI. Een zelfbedieningsupgrade is niet nodig.", - "plans.sub.paygSuffix": "— betalen naar gebruik. Vergelijk de openbare abonnementen hieronder of neem contact op met sales voor Enterprise.", + "plans.sub.enterpriseSuffix": "— onbeperkte producten en AI. Een zelfbedieningsupgrade is niet nodig.", + "plans.sub.paygSuffix": "— betalen naar gebruik. Vergelijk de openbare abonnementen hieronder of neem contact op met sales voor Enterprise.", "plans.sub.creditsMid": "met {remaining} AI-credits resterend.", - "plans.sub.creditsSuffix": "Upgrade Starter → Growth → Business via Checkout, of neem contact op met sales voor Enterprise.", - "plans.sub.none": "Er is nog geen abonnement toegewezen (bijvoorbeeld na een overgeslagen migratie). Kies hieronder een abonnement — de capaciteit is niet Onbeperkt totdat Checkout of een beheerder er een toewijst.", + "plans.sub.creditsSuffix": "Upgrade Starter → Growth → Business via Checkout, of neem contact op met sales voor Enterprise.", + "plans.sub.none": "Er is nog geen abonnement toegewezen (bijvoorbeeld na een overgeslagen migratie). Kies hieronder een abonnement — de capaciteit is niet Onbeperkt totdat Checkout of een beheerder er een toewijst.", "plans.stripeHint": "Zelfbedieningsupgrades gebruiken Stripe Checkout.", "plans.checkoutUnavailable": "Self-service-checkout is niet beschikbaar totdat Stripe is geconfigureerd. Neem contact op met sales voor een abonnement.", "plans.fallbackName": "Abonnement", @@ -4861,19 +4862,19 @@ export const nl: MessageDict = { "plans.cta.contactSales": "Contact sales", "plans.cta.switchInBilling": "Wisselen in facturering", "plans.cta.upgradeTo": "Upgraden naar {name}", - "plans.cta.startingCheckout": "Checkout starten…", + "plans.cta.startingCheckout": "Checkout starten…", "plans.planApplied": "Abonnement {plan} toegepast. Uw credits zijn klaar.", "plans.faq.title": "Veelgestelde vragen", "plans.faq.limit.q": "Wat gebeurt er als ik een limiet bereik?", "plans.faq.limit.a": "U ziet eerst zachte waarschuwingen. Wanneer u geen AI-credits meer heeft of de SKU-limiet bereikt, worden taken die die capaciteit nodig hebben geblokkeerd totdat u ruimte vrijmaakt, wacht op de volgende cyclus of het abonnement upgradet.", "plans.faq.selfServe.q": "Kan ik zelf upgraden?", - "plans.faq.selfServe.a": "Bedrijfsbeheerders kunnen Starter, Growth en Business zelf afsluiten via Checkout op de abonnementskaart. Leden moeten een beheerder vragen — Checkout vereist de beheerdersrol. Enterprise gaat altijd via sales. Platformbeheerders kunnen nog steeds abonnementen toewijzen in Billing Admin.", + "plans.faq.selfServe.a": "Bedrijfsbeheerders kunnen Starter, Growth en Business zelf afsluiten via Checkout op de abonnementskaart. Leden moeten een beheerder vragen — Checkout vereist de beheerdersrol. Enterprise gaat altijd via sales. Platformbeheerders kunnen nog steeds abonnementen toewijzen in Billing Admin.", "plans.faq.enterprise.q": "Enterprise en miljoenen SKU's", - "plans.faq.enterprise.a": "Maatwerkcapaciteit, eigen AI-sleutel (BYOK), SLA en accountbeheer gaan via sales. Reserveer tijd via Calendly — Enterprise is geen zelfbediening op schaal van miljoenen SKU's. De app toont Onbeperkt voor SKU- en AI-capaciteit.", + "plans.faq.enterprise.a": "Maatwerkcapaciteit, eigen AI-sleutel (BYOK), SLA en accountbeheer gaan via sales. Reserveer tijd via Calendly — Enterprise is geen zelfbediening op schaal van miljoenen SKU's. De app toont Onbeperkt voor SKU- en AI-capaciteit.", "plans.faq.pricing.q": "Waar staat de openbare prijs?", "plans.faq.pricing.aBefore": "Bekijk de marketingvergelijking op de", "plans.faq.pricing.pricingPage": "Prijzenpagina", - "plans.faq.pricing.aMid": "— de CTA's zijn Beginnen (registratie) of Contact sales. Beheer het gebruik op elk moment in", + "plans.faq.pricing.aMid": "— de CTA's zijn Beginnen (registratie) of Contact sales. Beheer het gebruik op elk moment in", "plans.faq.pricing.aAfter": ".", "plans.custom.title": "Heeft u een abonnement op maat nodig?", "plans.custom.body": "Enterprise-capaciteit, eigen AI-sleutel en SLA's worden met ons team geregeld.", @@ -4891,8 +4892,8 @@ export const nl: MessageDict = { "ai.providerMode.desc": "Het platform gebruikt Descrybe-credits en onze sleutel. Populair of Aangepast gebruikt je OpenAI-compatibele sleutel (de provider-aanroep zelf verbruikt geen platformcredits; creditregels voor functies gelden nog steeds).", "ai.whoPays": "Wie betaalt het model?", "ai.mode.internal": "Platform (Descrybe-credits / sleutel)", - "ai.mode.popular": "Je sleutel — populaire provider", - "ai.mode.custom": "Je sleutel — aangepast endpoint", + "ai.mode.popular": "Je sleutel — populaire provider", + "ai.mode.custom": "Je sleutel — aangepast endpoint", "ai.useCompanyKey": "Gebruik deze bedrijfssleutel voor verwerking, SEO-AI en campagne-AI", "ai.popular.title": "Populaire provider", "ai.popular.desc": "OpenAI-compatibele endpoints. Anthropic via OpenRouter.", @@ -4904,21 +4905,21 @@ export const nl: MessageDict = { "ai.custom.desc": "Voer de HTTPS-basis-URL van je AI-provider in.", "ai.field.baseUrl": "Basis-URL", "ai.apiKey.title": "API-sleutel", - "ai.apiKey.desc": "Laat leeg om de bestaande sleutel te behouden. Ruwe geheimen worden nooit teruggegeven — alleen een gemaskeerd last4.", + "ai.apiKey.desc": "Laat leeg om de bestaande sleutel te behouden. Ruwe geheimen worden nooit teruggegeven — alleen een gemaskeerd last4.", "ai.storedKey": "Opgeslagen sleutel: {masked}", "ai.field.apiKey": "API-sleutel", - "ai.placeholder.keepKey": "•••• laat leeg om te behouden", + "ai.placeholder.keepKey": "•••• laat leeg om te behouden", "ai.clearStoredKey": "Opgeslagen API-sleutel wissen", "ai.saveProvider": "Provider opslaan", "ai.testConnection": "Verbinding testen", "ai.prompts.title": "Promptsjablonen", "ai.prompts.descBefore": "Pas systeem- en gebruikersprompts aan voor productteksten, SEO-meta en campagne-e-mails. Voeg variabelen in zoals", - "ai.prompts.descMid": "— ze worden tijdens runtime ingevuld. De stem van de brand kit is beschikbaar als", + "ai.prompts.descMid": "— ze worden tijdens runtime ingevuld. De stem van de brand kit is beschikbaar als", "ai.prompts.descAfter": ".", "ai.field.feature": "Functie", "ai.badge.custom": "Aangepast", "ai.badge.builtin": "Ingebouwde standaard", - "ai.badge.disabledDefault": "Uitgeschakeld → standaard wordt gebruikt", + "ai.badge.disabledDefault": "Uitgeschakeld → standaard wordt gebruikt", "ai.useCustomPrompt": "Deze aangepaste prompt gebruiken (uit = ingebouwde standaard)", "ai.insertVariableInto": "Variabele invoegen in", "ai.insert.system": "Systeem", @@ -4960,31 +4961,31 @@ export const nl: MessageDict = { "email.field.from": "Van", "email.field.fromName": "Afzendernaam", "email.field.replyTo": "Reply-To", - "email.resendKeySaved": "Resend API-sleutel (opgeslagen — laat leeg om te behouden)", + "email.resendKeySaved": "Resend API-sleutel (opgeslagen — laat leeg om te behouden)", "email.resendKey": "Resend API-sleutel", "email.field.smtpHost": "SMTP-host", "email.field.port": "Poort", "email.field.username": "Gebruikersnaam", "email.field.passwordSaved": "Wachtwoord (opgeslagen)", "email.field.password": "Wachtwoord", - "email.verifyDomain": "Domein verifiëren", + "email.verifyDomain": "Domein verifiëren", "email.testGate.title": "Test & verzendcontrole", - "email.testGate.desc": "Testmails verifiëren het afzenderadres. Echte bulkmails vereisen dat je “I understand” typt.", + "email.testGate.desc": "Testmails verifiëren het afzenderadres. Echte bulkmails vereisen dat je “I understand” typt.", "email.field.recipient": "Ontvanger", "email.sendTest": "Test versturen", - "email.confirmBlast": "Bulkmail bevestigen…", + "email.confirmBlast": "Bulkmail bevestigen…", "email.flash.loadFailed": "E-mailinstellingen laden mislukt", "email.flash.saveFailed": "Opslaan mislukt", "email.flash.verifyUpdated": "Verificatie bijgewerkt.", "email.flash.verifyFailed": "Verificatie mislukt", "email.flash.testFailed": "Testverzending mislukt", - "email.flash.blastDryRun": "Bezorgingscontrole geregistreerd in dry-run-modus — er is geen e-mail verzonden.", + "email.flash.blastDryRun": "Bezorgingscontrole geregistreerd in dry-run-modus — er is geen e-mail verzonden.", "email.flash.blastDone": "Bezorgingscontrole voltooid: {sent} verzonden, {failed} mislukt.", "email.flash.blastFailed": "Bulkmail mislukt", "email.blast.subject": "Descrybe e-mailbezorgingscontrole", - "email.blast.body": "Dit is een bezorgingscontrole naar één adres van Descrybe om te bevestigen dat je e-mailintegratie kan verzenden. Ontvanger: {recipient}", + "email.blast.body": "Dit is een bezorgingscontrole naar één adres van Descrybe om te bevestigen dat je e-mailintegratie kan verzenden. Ontvanger: {recipient}", "email.action.changeSettings": "e-mailproviderinstellingen wijzigen", - "email.action.verifyDomain": "het e-maildomein verifiëren", + "email.action.verifyDomain": "het e-maildomein verifiëren", "email.action.sendTest": "test-e-mail versturen", "email.action.sendBlasts": "e-mailbulkmails versturen", "seo.title": "SEO-aanbevelingen", @@ -4997,27 +4998,27 @@ export const nl: MessageDict = { "seo.overallScoreHint": "Gemiddelde over checklistitems", "seo.productsScanned": "Producten gescand", "seo.productsScannedHint": "Verwerkte producten in het bedrijf", - "seo.categoriesScanned": "Categorieën gescand", + "seo.categoriesScanned": "Categorieën gescand", "seo.categoriesScannedHint": "Inclusief meta-formulecontroles", "seo.aiRewrite": "AI-herschrijving", "seo.available": "Beschikbaar", "seo.gated": "Beperkt", "seo.templateFree": "Sjablooninvulling blijft gratis op alle abonnementen", "seo.checklist": "Checklist", - "seo.affectedFindings": "{affected} getroffen · {count} bevindingen", + "seo.affectedFindings": "{affected} getroffen · {count} bevindingen", "seo.fixable": "Herstelbaar", "seo.clearFilter": "Filter wissen", "seo.findings": "Bevindingen", - "seo.noFindings": "Geen bevindingen voor dit filter — goed gedaan.", + "seo.noFindings": "Geen bevindingen voor dit filter — goed gedaan.", "seo.col.issue": "Probleem", "seo.col.entity": "Entiteit", "seo.col.severity": "Ernst", "seo.col.actions": "Acties", - "seo.filling": "Invullen…", + "seo.filling": "Invullen…", "seo.templateFill": "Sjablooninvulling", "seo.aiTitleAllowed": "Herschrijven met AI (gebruikt credits)", "seo.aiTitleGated": "Vereist betaald abonnement of credits", - "seo.rewriting": "Herschrijven…", + "seo.rewriting": "Herschrijven…", "seo.aiRewriteBtn": "AI-herschrijving", "seo.viewProduct": "Product bekijken", "seo.flash.loadFailed": "SEO-aanbevelingen laden mislukt", @@ -5025,21 +5026,21 @@ export const nl: MessageDict = { "seo.flash.applyFailed": "Herstel toepassen mislukt", "brand.title": "Merkkit", "brand.description": "Definieer stem, richtlijnen en kleuren zodat producttitels en -beschrijvingen on-brand blijven.", - "brand.loading": "Brand kit laden…", + "brand.loading": "Brand kit laden…", "brand.adminOnly": "Alleen bedrijfsbeheerders kunnen de brand kit bewerken. Je kunt de huidige stem, kleuren en logo bekijken.", "brand.aiApplyFreeAdmin": "Je kunt je brand kit bewerken op Free. AI-toepassing (merkstem injecteren in enhance-prompts) wordt ontgrendeld vanaf Starter.", "brand.aiApplyGated": "AI-toepassing (merkstem injecteren in enhance-prompts) wordt ontgrendeld vanaf Starter.", "brand.aiEnhanceUses": "AI-enhance gebruikt deze merkstem bij het verwerken van producten.", "brand.comparePlans": "Abonnementen vergelijken", "brand.voice.title": "Stem & richtlijnen", - "brand.voice.desc": "Toon, do/don’t-regels en voorkeursformuleringen", + "brand.voice.desc": "Toon, do/don’t-regels en voorkeursformuleringen", "brand.field.voiceTone": "Stem / toon", "brand.placeholder.voiceTone": "bijv. Zelfverzekerd, beknopt, technisch maar toegankelijk", - "brand.field.dos": "Do (één per regel)", + "brand.field.dos": "Do (één per regel)", "brand.placeholder.dos": "Begin met het hoofdvoordeel\nHoud titels onder de 80 tekens", - "brand.field.donts": "Don’t (één per regel)", + "brand.field.donts": "Don’t (één per regel)", "brand.placeholder.donts": "Geen HOOFDLETTERS\nVermijd superlatieven zonder bewijs", - "brand.field.preferredTerms": "Voorkeurstermen (één per regel of kommagescheiden)", + "brand.field.preferredTerms": "Voorkeurstermen (één per regel of kommagescheiden)", "brand.placeholder.preferredTerms": "draadloos, premium, energieklasse", "brand.visual.title": "Visuele identiteit", "brand.visual.desc": "Kleuren en logo gebruikt in merkbewuste tips en campagnes", @@ -5047,24 +5048,24 @@ export const nl: MessageDict = { "brand.field.secondaryColor": "Secundaire kleur", "brand.field.logoImage": "Logo-afbeelding", "brand.logoHint": "PNG, JPEG of WebP tot 2 MiB. Opgeslagen onder de uploads van je bedrijf.", - "brand.uploading": "Uploaden…", + "brand.uploading": "Uploaden…", "brand.uploadLogo": "Logo uploaden", "brand.clear": "Wissen", "brand.field.logoUrl": "Logo-URL", - "brand.placeholder.logoUrl": "https://… of geüpload /api/brand/logo/files/…", + "brand.placeholder.logoUrl": "https://… of geüpload /api/brand/logo/files/…", "brand.logoAlt": "Voorbeeld van merklogo", "brand.tipsTitle": "Formule- / voorbeeldtips", - "brand.saving": "Opslaan…", + "brand.saving": "Opslaan…", "brand.save": "Brand kit opslaan", "brand.flash.loadFailed": "Brand kit laden mislukt", "structured.title": "Gestructureerde beschrijvingsvelden", - "structured.loading": "Gestructureerde beschrijvingsvelden laden…", + "structured.loading": "Gestructureerde beschrijvingsvelden laden…", "structured.backDashboard": "Terug naar dashboard", "structured.categoryFormulas": "Categorieformules", "structured.exportFeeds": "Exportfeeds", "structured.intro": "Deze velden worden automatisch aangemaakt wanneer je Export IDs toevoegt aan de secties van je beschrijvingsformule. Ze kunnen in je exportfeeds worden gebruikt om specifieke delen van je productbeschrijvingen op te nemen.", "structured.addField": "Veld toevoegen", - "structured.openCategories": "Categorieën openen", + "structured.openCategories": "Categorieën openen", "structured.tableCaption": "Deze velden structureren delen van productbeschrijvingen voor export.", "structured.col.fieldKey": "Veldcode", "structured.col.type": "Type", @@ -5087,7 +5088,7 @@ export const nl: MessageDict = { "assistant.resetTitle": "Resetten", "assistant.closeAria": "Assistent sluiten", "assistant.messageLabel": "Bericht", - "assistant.placeholder": "bijv. feed-URL toevoegen, API-sleutels, attributen, verwerking…", + "assistant.placeholder": "bijv. feed-URL toevoegen, API-sleutels, attributen, verwerking…", "assistant.sendAria": "Versturen", "site.bookDemo": "Demo boeken", "site.demoShort": "Demo", @@ -5112,44 +5113,44 @@ export const nl: MessageDict = { "seo.cookies.description": "Hoe Descrybe noodzakelijke, analytics- en marketingcookies gebruikt, inclusief GTM en GA4, en hoe u toestemming wijzigt.", "legal.cookies.title": "Cookiebeleid", "legal.cookies.intro.h": "Overzicht", - "legal.cookies.intro.p1": "Dit Cookiebeleid legt uit hoe Descrybe cookies en vergelijkbare technologieën gebruikt op website en applicatie. Lees het samen met ons Privacybeleid.", + "legal.cookies.intro.p1": "Dit Cookiebeleid legt uit hoe Descrybe cookies en vergelijkbare technologieën gebruikt op website en applicatie. Lees het samen met ons Privacybeleid.", "legal.cookies.intro.p2": "Waar vereist vragen we toestemming voordat analytics- of marketingcookies worden ingeschakeld. Noodzakelijke cookies leveren de dienst veilig en vereisen geen toestemming.", - "legal.cookies.types.h": "Cookiecategorieën", + "legal.cookies.types.h": "Cookiecategorieën", "legal.cookies.necessary.h": "Noodzakelijk", "legal.cookies.necessary.p": "Houden u ingelogd, beschermen formulieren met CSRF, slaan thema en taal op en onthouden uw cookiekeuze. Zonder hen werkt het product niet correct.", "legal.cookies.analytics.h": "Analytics", - "legal.cookies.analytics.p": "Als u analytics toestaat, laden we GTM-tags die GA4-cookies kunnen zetten om pagina’s en events te meten. Events blijven geblokkeerd tot analytics_storage is verleend.", + "legal.cookies.analytics.p": "Als u analytics toestaat, laden we GTM-tags die GA4-cookies kunnen zetten om pagina’s en events te meten. Events blijven geblokkeerd tot analytics_storage is verleend.", "legal.cookies.marketing.h": "Marketing", "legal.cookies.marketing.p": "Als u marketing toestaat, kunnen advertentietags in GTM ad-opslag en gerelateerde signalen gebruiken voor meting en personalisatie.", "legal.cookies.gtm.h": "Google Tag Manager en GA4", - "legal.cookies.gtm.p": "Indien geconfigureerd laadt Descrybe een GTM-container. GA4 wordt daarin geconfigureerd. Consent Mode v2 weigert standaard analytics- en ads-opslag tot u de categorieën accepteert.", + "legal.cookies.gtm.p": "Indien geconfigureerd laadt Descrybe een GTM-container. GA4 wordt daarin geconfigureerd. Consent Mode v2 weigert standaard analytics- en ads-opslag tot u de categorieën accepteert.", "legal.cookies.third.h": "Derden", - "legal.cookies.third.p": "Google (Tag Manager / Analytics) kan bij toestemming technische gegevens verwerken zoals URL’s, apparaat/browser en eventnamen. We sturen bewust geen wachtwoorden, API-sleutels of contactgegevens in analytics-events.", + "legal.cookies.third.p": "Google (Tag Manager / Analytics) kan bij toestemming technische gegevens verwerken zoals URL’s, apparaat/browser en eventnamen. We sturen bewust geen wachtwoorden, API-sleutels of contactgegevens in analytics-events.", "legal.cookies.manage.h": "Toestemming wijzigen", "legal.cookies.manage.p": "Gebruik Cookie-instellingen in de footer (of de knop hieronder) om de banner opnieuw te openen. U kunt ook sitegegevens in de browser wissen.", "site.privacyPolicy": "Privacybeleid", "site.termsOfService": "Servicevoorwaarden", "site.legalNav": "Juridisch", "site.footer.aria": "Site", - "site.footer.description": "Descrybe zet leveranciersfeeds om in schone, kanaalklare productcatalogi — map velden, verrijk attributen en listingteksten, exporteer of synchroniseer daarna met WooCommerce.", - "site.footer.rightsLine": "© {year} {name}. Alle rechten voorbehouden.", + "site.footer.description": "Descrybe zet leveranciersfeeds om in schone, kanaalklare productcatalogi — map velden, verrijk attributen en listingteksten, exporteer of synchroniseer daarna met WooCommerce.", + "site.footer.rightsLine": "© {year} {name}. Alle rechten voorbehouden.", "site.footer.navTitle": "Navigatie", "site.footer.platform": "Platform", "site.footer.solutions": "Oplossingen", "site.footer.contact": "Contact", "home.hero.tagline": "Productdata voor ecommerce-teams", "home.hero.title": "Van leveranciersfeeds naar productpagina's", - "home.hero.lead": "Koppel leveranciersfeeds, map ze naar je categorieën, vul verplichte attributen in en schrijf titels en beschrijvingen volgens jouw regels — exporteer of synchroniseer daarna met je winkel.", + "home.hero.lead": "Koppel leveranciersfeeds, map ze naar je categorieën, vul verplichte attributen in en schrijf titels en beschrijvingen volgens jouw regels — exporteer of synchroniseer daarna met je winkel.", "home.hero.learnMore": "Meer informatie", "home.hero.apply": "Toegang aanvragen", "home.hero.supportedBy": "Ondersteund door", "home.hero.msAlt": "Microsoft for Startups", "home.image.previewAlt": "Descrybe-platformvoorbeeld: van feed naar productpagina", "home.how.title": "Zo bespaart Descrybe tijd bij het op de markt brengen van producten", - "home.how.lead": "Importeer rommelige leveranciersdata één keer. Descrybe helpt je categoriseren, attributen invullen, listingteksten schrijven en kant-en-klare producten naar je kanalen sturen.", + "home.how.lead": "Importeer rommelige leveranciersdata één keer. Descrybe helpt je categoriseren, attributen invullen, listingteksten schrijven en kant-en-klare producten naar je kanalen sturen.", "home.how.apply": "Toegang aanvragen", "home.how.step1.title": "Importeer je taxonomie", - "home.how.step1.desc": "Stel de categorieën en attributen in die je winkel al gebruikt", + "home.how.step1.desc": "Stel de categorieën en attributen in die je winkel al gebruikt", "home.how.step1.f1": "Definieer verplichte attributen per categorie", "home.how.step1.f2": "Stel titelformules per categorie in", "home.how.step1.f3": "Stel sjablonen in voor beschrijving en zoeksnippet", @@ -5160,7 +5161,7 @@ export const nl: MessageDict = { "home.how.step2.f3": "Map bronvelden met een eenvoudige drag-and-drop-interface", "home.how.step3.title": "Transformeer & verrijk", "home.how.step3.desc": "Kies de producten om te verwerken en laat Descrybe:", - "home.how.step3.f1": "De juiste categorieën toewijzen", + "home.how.step3.f1": "De juiste categorieën toewijzen", "home.how.step3.f2": "Verplichte productattributen invullen", "home.how.step3.f3": "Duidelijke, zoekvriendelijke titels en beschrijvingen maken", "home.how.step4.title": "Exporteer naar kanalen", @@ -5169,42 +5170,42 @@ export const nl: MessageDict = { "home.how.step4.f2": "Houd volledige controle over welke velden je exporteert", "home.how.step4.f3": "Blijf up-to-date wanneer leveranciersdata wijzigt", "home.benefits.title": "Alles voor schonere productdata", - "home.benefits.lead": "Van feed-import tot kanaalklare listings — zonder elk bestand handmatig opnieuw op te bouwen.", + "home.benefits.lead": "Van feed-import tot kanaalklare listings — zonder elk bestand handmatig opnieuw op te bouwen.", "home.benefits.shield.title": "Onvolledige listings vroeg opsporen", "home.benefits.shield.desc": "Controleer productdata tegen je categorieregels zodat ontbrekende attributen en dunne teksten worden hersteld voordat ze live gaan.", "home.benefits.chart.title": "Duidelijkere listings, sterkere conversie", - "home.benefits.chart.desc": "Titels en beschrijvingen die benadrukken wat shoppers belangrijk vinden — voordelen, specificaties en zoektermen die bij je catalogus passen.", - "home.benefits.database.title": "Eén consistente productstructuur", + "home.benefits.chart.desc": "Titels en beschrijvingen die benadrukken wat shoppers belangrijk vinden — voordelen, specificaties en zoektermen die bij je catalogus passen.", + "home.benefits.database.title": "Eén consistente productstructuur", "home.benefits.database.desc": "Houd dezelfde categorizatiestructuur en attribuutvorm aan over exports en kanalen, zodat klanten producten overal op dezelfde manier vinden.", "home.benefits.search.title": "Zoekvriendelijke productcontent", "home.benefits.search.desc": "Schrijf titels, beschrijvingen en meta-snippets die voor shoppers en zoekmachines makkelijker te begrijpen zijn.", "home.benefits.cost.title": "Minder handmatige data-invoer", - "home.benefits.cost.desc": "Automatiseer mapping, attribuutvulling en listingteksten zodat je team tijd besteedt aan merchandising — niet aan spreadsheetopschoning.", + "home.benefits.cost.desc": "Automatiseer mapping, attribuutvulling en listingteksten zodat je team tijd besteedt aan merchandising — niet aan spreadsheetopschoning.", "home.benefits.scale.title": "Klaar voor elk verkoopkanaal", "home.benefits.scale.desc": "Vorm exportfeeds en WooCommerce-sync naar de formaten die elk kanaal verwacht, zonder de catalogus handmatig opnieuw op te bouwen.", "home.cta.titleLead": "Breng producten sneller ", "home.cta.titleHighlight": "op de markt", - "home.cta.description": "Stop met productdata opnieuw opbouwen uit elk leveranciersbestand. Map één keer, verrijk met jouw regels en publiceer listings die klaar zijn om te verkopen.", + "home.cta.description": "Stop met productdata opnieuw opbouwen uit elk leveranciersbestand. Map één keer, verrijk met jouw regels en publiceer listings die klaar zijn om te verkopen.", "home.cta.f1": "Persoonlijke demo", "home.cta.f2": "Expertconsult", "home.cta.f3": "Duidelijke vervolgstappen", "home.cta.apply": "Toegang aanvragen", "home.cta.imageAlt": "Descrybe-productpagina's", "home.product.eyebrow": "Wat Descrybe doet", - "home.product.title": "Leveranciersfeeds in. Kant-en-klare listings uit — export, WooCommerce of API.", - "home.product.description": "Descrybe helpt ecommerce-teams leveranciers-CSV- en XML-feeds om te zetten in schone productcatalogi. Map velden naar je categorieën, verrijk attributen en listingteksten, en lever data via exportfeeds, WooCommerce-sync of de publieke API.", + "home.product.title": "Leveranciersfeeds in. Kant-en-klare listings uit — export, WooCommerce of API.", + "home.product.description": "Descrybe helpt ecommerce-teams leveranciers-CSV- en XML-feeds om te zetten in schone productcatalogi. Map velden naar je categorieën, verrijk attributen en listingteksten, en lever data via exportfeeds, WooCommerce-sync of de publieke API.", "home.product.pipelineAria": "Productpipeline", "home.product.p1.label": "Feeds in", "home.product.p1.detail": "CSV / XML vanaf leveranciers-URL's", "home.product.p2.label": "Mappen", "home.product.p2.detail": "Koppel kolommen aan je velden", "home.product.p3.label": "Verrijken", - "home.product.p3.detail": "Categorieën, attributen, titels", + "home.product.p3.detail": "Categorieën, attributen, titels", "home.product.p4.label": "Verzenden", - "home.product.p4.detail": "Export · Woo · API", + "home.product.p4.detail": "Export · Woo · API", "pricing.section.badge": "SKU-capaciteit + AI-credits", "pricing.section.title": "Begin gratis. Schaal mee als je catalogus groeit.", - "pricing.section.lead": "Free omvat feedmapping, basisproductopschoning en EU-energielabels (EPREL) voor tot 100 SKU's (geen AI-credits). Betaalde plannen voegen AI-titels en -beschrijvingen, meer capaciteit en exportopties toe — Starter, Growth, Business, of neem contact op met sales voor Enterprise.", + "pricing.section.lead": "Free omvat feedmapping, basisproductopschoning en EU-energielabels (EPREL) voor tot 100 SKU's (geen AI-credits). Betaalde plannen voegen AI-titels en -beschrijvingen, meer capaciteit en exportopties toe — Starter, Growth, Business, of neem contact op met sales voor Enterprise.", "pricing.section.billingPeriod": "Factureringsperiode", "pricing.section.monthly": "Maandelijks", "pricing.section.yearly": "Jaarlijks", @@ -5218,7 +5219,7 @@ export const nl: MessageDict = { "pricing.section.capabilitiesLead": "Importeer feeds, verrijk je catalogus en exporteer of synchroniseer daarna met WooCommerce", "pricing.section.faqTitle": "Veelgestelde vragen", "pricing.section.readyTitle": "Klaar om je eerste feed te mappen?", - "pricing.section.readyLead": "Maak een Free-account aan — geen kaart vereist. Heb je er al een? Open de app of vergelijk plannen.", + "pricing.section.readyLead": "Maak een Free-account aan — geen kaart vereist. Heb je er al een? Open de app of vergelijk plannen.", "pricing.section.contactSales": "Contact sales", "pricing.cap.feeds": "Van feeds naar catalogus", "pricing.cap.feeds.f1": "CSV- / XML- / URL-leveranciersfeeds", @@ -5244,7 +5245,7 @@ export const nl: MessageDict = { "pricing.cap.limits.f3": "Teamrollen & uitnodigingen", "pricing.cap.limits.f4": "Enterprise-SLA-opties", "pricing.faq.credits.q": "Wat zijn AI-credits?", - "pricing.faq.credits.a": "AI-credits betalen stappen zoals het genereren van titels en beschrijvingen. Free bevat 0 AI-credits — je kunt nog steeds feeds mappen en productdata opschonen. Betaalde maandpakketten: Starter 150, Plus 500, Growth 1.200, Business 4.000, Scale 8.000. Enterprise bevat een groot beheerd pakket (en je eigen AI-sleutel). Vanaf Growth kun je optioneel AI op je eigen sleutel draaien in plaats van beheerde credits.", + "pricing.faq.credits.a": "AI-credits betalen stappen zoals het genereren van titels en beschrijvingen. Free bevat 0 AI-credits — je kunt nog steeds feeds mappen en productdata opschonen. Betaalde maandpakketten: Starter 150, Plus 500, Growth 1.200, Business 4.000, Scale 8.000. Enterprise bevat een groot beheerd pakket (en je eigen AI-sleutel). Vanaf Growth kun je optioneel AI op je eigen sleutel draaien in plaats van beheerde credits.", "pricing.faq.packs.q": "Can I buy extra AI credits?", "pricing.faq.packs.a": "Yes. One-time packs: Starter $19 / 500 credits, Growth $59 / 2,000, Catalog $199 / 10,000, Scale $599 / 40,000. Buy from Billing after you have a paid plan (or Free with leftover trial credits). Packs do not change your SKU or feed limits.", "pricing.faq.limits.q": "Wat gebeurt er als ik mijn product- of creditlimiet bereik?", @@ -5252,9 +5253,9 @@ export const nl: MessageDict = { "pricing.faq.change.q": "Kan ik upgraden of downgraden?", "pricing.faq.change.a": "Ja. Begin op Free en upgrade daarna naar Starter, Plus, Growth, Business of Scale via Plannen of Facturering (Stripe Checkout). Enterprise is altijd sales-gestuurd.", "pricing.faq.free.q": "Wat zit er in Free?", - "pricing.faq.free.a": "Voor altijd Free: 50 producten, één feed, dataopschoning en attribuutvulling, EU-energielabels (EPREL — openbare data, geen credits), plus één handmatige export — met 0 AI-credits. Geen creditcard. Upgrade wanneer je AI-titels, -beschrijvingen of meer capaciteit nodig hebt.", + "pricing.faq.free.a": "Voor altijd Free: 50 producten, één feed, dataopschoning en attribuutvulling, EU-energielabels (EPREL — openbare data, geen credits), plus één handmatige export — met 0 AI-credits. Geen creditcard. Upgrade wanneer je AI-titels, -beschrijvingen of meer capaciteit nodig hebt.", "pricing.faq.why.q": "Waarom niet per product betalen zoals content-only tools?", - "pricing.faq.why.a": "Descrybe is gebouwd voor het volledige pad van leveranciersfeed via catalogus naar WooCommerce of export — niet alleen AI-teksten. Je betaalt voor platformcapaciteit (producten en feeds); AI is een gebruikslaag daarbovenop.", + "pricing.faq.why.a": "Descrybe is gebouwd voor het volledige pad van leveranciersfeed via catalogus naar WooCommerce of export — niet alleen AI-teksten. Je betaalt voor platformcapaciteit (producten en feeds); AI is een gebruikslaag daarbovenop.", "pricing.faq.annual.q": "Hoe werkt jaarlijkse facturering?", "pricing.faq.annual.a": "Jaarlijkse facturering is ongeveer 20% goedkoper dan de maandelijkse prijs. Begin gratis en kies jaarlijks in Checkout bij upgrade (of neem contact op met sales).", "pricing.calc.badge": "Plan calculator", @@ -5265,12 +5266,12 @@ export const nl: MessageDict = { "pricing.calc.skus": "Catalog products (SKUs)", "pricing.calc.skusHint": "Total products you will store and process", "pricing.calc.aiVolume": "AI process volume", - "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", + "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", "pricing.calc.recommendedLabel": "Recommended", "pricing.calc.budgetLabel": "Budget option", "pricing.calc.coversCredits": "Needs about {count} AI credits / month", "pricing.calc.aiIncluded": "Included monthly credits cover this AI volume", - "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", + "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", "pricing.calc.orYearly": "or ~{amount}/mo yearly", "pricing.calc.budgetNote": "Lower list price with yearly discount and/or credit packs when that still fits.", "pricing.calc.noBudget": "The recommended plan is already the leanest fit for these inputs.", @@ -5295,7 +5296,7 @@ export const nl: MessageDict = { "pricing.card.showMoreFeature": "Toon {count} extra functie", "pricing.card.showMoreFeatures": "Toon {count} extra functies", "pricing.card.upgradeTo": "Upgrade naar {name}", - "pricing.plan.free.description": "Map een voorbeeldfed en ruim productdata op — geen kaart vereist", + "pricing.plan.free.description": "Map een voorbeeldfed en ruim productdata op — geen kaart vereist", "pricing.plan.starter.description": "Kleine catalogi die AI-titels en -beschrijvingen nodig hebben", "pricing.plan.plus.description": "Meer producten, feeds en AI voor groeiende catalogi", "pricing.plan.growth.description": "Multi-leveranciersfeeds naar winkels en shopping-exports", @@ -5417,7 +5418,7 @@ export const nl: MessageDict = { "pricing.feature.customIntegrations": "Maatwerkintegraties", "pricing.feature.slaPriority": "SLA & prioriteitsondersteuning", "pricing.pack.tiny.name": "Nano pack", - "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", + "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", "pricing.pack.small.name": "Starter pack", "pricing.pack.small.desc": "Extra AI for fixes and tests (~250 products)", "pricing.pack.medium.name": "Growth pack", @@ -5427,16 +5428,16 @@ export const nl: MessageDict = { "pricing.pack.xl.name": "Scale pack", "pricing.pack.xl.desc": "Heavy usage / agency bursts (~20,000 products)", "pricing.pack.xxl.name": "Business pack", - "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", + "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", "pricing.pack.mega.name": "Scale pack", - "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", + "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", "pricing.section.faqDescription": "Duidelijke antwoorden over plannen, credits en wat Free omvat.", "billing.buyCreditPacks": "Buy AI credit packs", - "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", + "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", "billing.packCredits": "{credits} credits", "billing.packApproxProducts": "~{count} AI products", "billing.buyPack": "Buy", - "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", + "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", "billing.packCheckoutFailed": "Could not start credit pack checkout.", "empty.default.noItems": "Geen items gevonden.", "settings.tabLockedHint": "Not on your plan", @@ -5446,18 +5447,18 @@ export const nl: MessageDict = { "plan.upgrade.message": "Upgrade om dit deel van Descrybe te ontgrendelen.", "plan.upgrade.defaultMessage": "Je huidige plan bevat dit deel van Descrybe niet. Upgrade om het te ontgrendelen, of vraag een bedrijfsadmin als je de facturatie niet kunt wijzigen.", "plan.upgrade.sectionOff.title": "Deze functie is tijdelijk niet beschikbaar", - "plan.upgrade.sectionOff.message": "Dit deel van Descrybe staat momenteel uit op het platform. Dit is geen upgradeprobleem — probeer later opnieuw of neem contact op met support.", + "plan.upgrade.sectionOff.message": "Dit deel van Descrybe staat momenteel uit op het platform. Dit is geen upgradeprobleem — probeer later opnieuw of neem contact op met support.", "plan.upgrade.sectionOff.cta": "Terug naar dashboard", - "plan.upgrade.stores.message": "WooCommerce- en Shopify-connectors vereisen een plan met Stores. Upgrade om die winkels te koppelen — of blijf werken met feeds en de API op je huidige plan.", + "plan.upgrade.stores.message": "WooCommerce- en Shopify-connectors vereisen een plan met Stores. Upgrade om die winkels te koppelen — of blijf werken met feeds en de API op je huidige plan.", "plan.upgrade.stillWorks.title": "Wat nog werkt op je plan", "plan.upgrade.stillWorks.feeds.label": "Invoerfeeds", - "plan.upgrade.stillWorks.feeds.description": "Voeg CSV- of XML-URL’s en bestandsuploads toe om catalogi te synchroniseren zonder winkelconnectors.", + "plan.upgrade.stillWorks.feeds.description": "Voeg CSV- of XML-URL’s en bestandsuploads toe om catalogi te synchroniseren zonder winkelconnectors.", "plan.upgrade.stillWorks.export.label": "Exportfeeds", "plan.upgrade.stillWorks.export.description": "Genereer uitgaande feeds voor shoppingkanalen en partners.", "plan.upgrade.stillWorks.processing.label": "Achtergrondtaken", - "plan.upgrade.stillWorks.processing.description": "Monitor AI- en catalogusjobs in Verwerking — beschikbaar op je plan, ook zonder winkelconnectors.", + "plan.upgrade.stillWorks.processing.description": "Monitor AI- en catalogusjobs in Verwerking — beschikbaar op je plan, ook zonder winkelconnectors.", "plan.upgrade.stillWorks.api.label": "API-sleutels", - "plan.upgrade.stillWorks.api.description": "Maak in Instellingen een sleutel voor /api/v1 — het geheim wordt slechts één keer getoond.", + "plan.upgrade.stillWorks.api.description": "Maak in Instellingen een sleutel voor /api/v1 — het geheim wordt slechts één keer getoond.", "plan.upgrade.stillWorks.docs.label": "API-docs", "plan.upgrade.stillWorks.docs.description": "Lees het API-overzicht en integreer zonder WooCommerce of Shopify.", "plan.upgrade.feature.settings.api_keys": "API-sleutels vereisen een betaald plan", @@ -5484,13 +5485,13 @@ export const nl: MessageDict = { "plan.upgrade.feature.support.ticket_create": "Supporttickets aanmaken zit niet in je plan", "plan.upgrade.feature.support.ticket_thread": "Supportticketthreads zitten niet in je plan", "plan.upgrade.feature.catalog.structured_descriptions": "Gestructureerde beschrijvingen zitten niet in je plan", - "plan.upgrade.feature.catalog.vector_categories": "Vectorcategorieën zitten niet in je plan", - "plan.checkingAccess": "Plan toegang controleren…", + "plan.upgrade.feature.catalog.vector_categories": "Vectorcategorieën zitten niet in je plan", + "plan.checkingAccess": "Plan toegang controleren…", "upgradeBanner.comparePlans": "Plannen vergelijken", "upgradeBanner.talkToSales": "Neem contact op met sales", "commandPalette.closeAria": "Zoeken sluiten", "commandPalette.ariaLabel": "Pagina's zoeken", - "commandPalette.placeholder": "Pagina's zoeken…", + "commandPalette.placeholder": "Pagina's zoeken…", "commandPalette.searchAria": "Pagina's zoeken", "commandPalette.destinationsAria": "Pagina's", "commandPalette.noMatches": "Geen overeenkomende pagina's", @@ -5499,25 +5500,25 @@ export const nl: MessageDict = { "commandPalette.announceNone": "Geen overeenkomende pagina's.", "commandPalette.announceMatchOne": "{count} overeenkomende pagina.", "commandPalette.announceMatchMany": "{count} overeenkomende pagina's.", - "vector.title": "Vectorcategorieën-test", + "vector.title": "Vectorcategorieën-test", "vector.description": "Doorzoek de vectorcategorie-index wanneer Pinecone is geconfigureerd. Index maken en initialiseren zijn in v2 nog niet beschikbaar.", - "vector.probing": "Vectorcategorieën-API controleren…", - "vector.unavailable": "Vectorcategorieën zitten nog niet op deze backend. Hier is niets te doen tot /api/vector-categories/* is aangesloten.", - "vector.browseCategories": "Categorieën bekijken", + "vector.probing": "Vectorcategorieën-API controleren…", + "vector.unavailable": "Vectorcategorieën zitten nog niet op deze backend. Hier is niets te doen tot /api/vector-categories/* is aangesloten.", + "vector.browseCategories": "Categorieën bekijken", "vector.initHeading": "Vectordatabase initialiseren", "vector.initComingSoon": "Index maken en Vector-DB initialiseren zijn in v2 nog niet beschikbaar (binnenkort). Zoeken werkt nog steeds wanneer Pinecone is geconfigureerd.", "vector.createIndex": "Index maken", "vector.initDb": "Vector-DB initialiseren", - "vector.searchHeading": "Categorieën zoeken", - "vector.searchPlaceholder": "Voer productbeschrijving in…", + "vector.searchHeading": "Categorieën zoeken", + "vector.searchPlaceholder": "Voer productbeschrijving in…", "vector.results": "Resultaten:", "vector.categoryLabel": "Categorie:", "vector.idLabel": "ID:", "vector.scoreLabel": "Score:", - "switcher.switching": "Wisselen…", + "switcher.switching": "Wisselen…", "switcher.returnTo": "Terug naar {email}", "switcher.switchUser": "Gebruiker wisselen", - "switcher.loadingUsers": "Gebruikers laden…", + "switcher.loadingUsers": "Gebruikers laden…", "switcher.empty": "Geen wisselbare gebruikers gevonden.", "switcher.noCompany": "Geen bedrijf", "switcher.unknownCompany": "Onbekend bedrijf", @@ -5530,10 +5531,10 @@ export const nl: MessageDict = { "storeReconnect.titlePlural": "Winkels opnieuw verbinden na migratie", "storeReconnect.titleChannel": "{channel} opnieuw verbinden na migratie", "storeReconnect.titleSingular": "Winkel opnieuw verbinden na migratie", - "storeReconnect.messageWithItems": "Winkel-API-referenties zijn niet overgenomen (of niet bruikbaar) na de platformmigratie. Dit is geen kapotte sync — verbind elke winkel opnieuw en Test verbinding voordat je een sync in de wachtrij zet.", - "storeReconnect.messageSingle": "{channel}-API-referenties zijn niet overgenomen (of niet bruikbaar) na de platformmigratie. Dit is geen kapotte sync — plak nieuwe referenties, Opslaan, en Test verbinding voordat je een sync in de wachtrij zet.", + "storeReconnect.messageWithItems": "Winkel-API-referenties zijn niet overgenomen (of niet bruikbaar) na de platformmigratie. Dit is geen kapotte sync — verbind elke winkel opnieuw en Test verbinding voordat je een sync in de wachtrij zet.", + "storeReconnect.messageSingle": "{channel}-API-referenties zijn niet overgenomen (of niet bruikbaar) na de platformmigratie. Dit is geen kapotte sync — plak nieuwe referenties, Opslaan, en Test verbinding voordat je een sync in de wachtrij zet.", "storeReconnect.channelFallback": "Winkel", - "storeReconnect.askAdmin": "Vraag een bedrijfsbeheerder om opnieuw te verbinden — alleen beheerders kunnen winkelreferenties opslaan.", + "storeReconnect.askAdmin": "Vraag een bedrijfsbeheerder om opnieuw te verbinden — alleen beheerders kunnen winkelreferenties opslaan.", "storeReconnect.reconnectItem": "{label} opnieuw verbinden", "admin.storeReconnect.channel.other": "Other", "admin.storeReconnect.channel.woocommerce": "WooCommerce", @@ -5556,7 +5557,7 @@ export const nl: MessageDict = { "admin.storeReconnect.listTitle": "Connected but invalid", "admin.storeReconnect.metric.showing": "Rows shown", "admin.storeReconnect.metric.total": "Gaps total", - "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", + "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", "admin.storeReconnect.loadFailed": "Could not load store reconnect inventory.", "admin.storeReconnect.refresh": "Refresh", "admin.storeReconnect.description": "Companies with a connected store identity but missing or unusable API credentials (cutover credential gaps).", @@ -5566,21 +5567,21 @@ export const nl: MessageDict = { "storeReconnect.wizardLabel": "Guided setup", "storeReconnect.reviewsHint": "Reviews-import kan pas draaien als referenties na migratie opnieuw zijn verbonden. Op het tabblad Verbinding: Opslaan, daarna Verbinding testen.", "storeReconnect.ordersHint": "Bestellingenimport kan pas draaien als referenties na migratie opnieuw zijn verbonden. Op het tabblad Verbinding: Opslaan, daarna Verbinding testen.", - "productSync.directionTitle": "Producten: Descrybe → winkel", - "productSync.outbound": "Descrybe → {channel}", - "productSync.outboundBody": "— stuurt verwerkte Descrybe-producten naar de winkel (maakt of werkt overeenkomende remote producten bij). Importeert de winkelcatalogus niet naar Descrybe.", + "productSync.directionTitle": "Producten: Descrybe → winkel", + "productSync.outbound": "Descrybe → {channel}", + "productSync.outboundBody": "— stuurt verwerkte Descrybe-producten naar de winkel (maakt of werkt overeenkomende remote producten bij). Importeert de winkelcatalogus niet naar Descrybe.", "productSync.firstSync": "Eerste sync", - "productSync.firstSyncBody": "— niet-overeenkomende producten worden in {channel} aangemaakt. Latere syncs werken producten bij die al gekoppeld zijn via id of matchstrategie.", + "productSync.firstSyncBody": "— niet-overeenkomende producten worden in {channel} aangemaakt. Latere syncs werken producten bij die al gekoppeld zijn via id of matchstrategie.", "productSync.reSync": "Opnieuw synchroniseren", - "productSync.reSyncBody": "— overeenkomende remote producten kunnen worden overschreven met Descrybe-inhoud ({count} tot nu toe gekoppeld).", + "productSync.reSyncBody": "— overeenkomende remote producten kunnen worden overschreven met Descrybe-inhoud ({count} tot nu toe gekoppeld).", "productSync.queued": "Productsync in wachtrij", - "productSync.live.queued": "In wachtrij — wachten op worker", + "productSync.live.queued": "In wachtrij — wachten op worker", "productSync.live.running": "Sync bezig", - "productSync.live.watching": "Status volgen… tellingen verschijnen als de run klaar is.", - "productSync.live.success": "Sync klaar: {total} totaal · {created} aangemaakt · {updated} bijgewerkt · {failed} mislukt · {skipped} overgeslagen", - "productSync.live.partial": "Sync met fouten: {total} totaal · {created} aangemaakt · {updated} bijgewerkt · {failed} mislukt · {skipped} overgeslagen", + "productSync.live.watching": "Status volgen… tellingen verschijnen als de run klaar is.", + "productSync.live.success": "Sync klaar: {total} totaal · {created} aangemaakt · {updated} bijgewerkt · {failed} mislukt · {skipped} overgeslagen", + "productSync.live.partial": "Sync met fouten: {total} totaal · {created} aangemaakt · {updated} bijgewerkt · {failed} mislukt · {skipped} overgeslagen", "productSync.live.failed": "Sync mislukt{detail}.", - "productSync.live.timedOut": "Nog bezig — vernieuw later voor eindstatus en tellingen.", + "productSync.live.timedOut": "Nog bezig — vernieuw later voor eindstatus en tellingen.", "productSync.live.ordersSuccess": "Ordersync klaar ({status}).", "productSync.live.reviewsSuccess": "Reviewsync klaar ({status}).", "productSync.retry": "Sync opnieuw proberen", @@ -5588,12 +5589,12 @@ export const nl: MessageDict = { "productSync.dryRun": "Proefrun", "productSync.lastSyncAt": "Laatste productsync: {date}", "productSync.noneYet": "Er is nog geen productsync voltooid.", - "productSync.lastRun": "Laatste run: {total} totaal · {created} aangemaakt · {updated} bijgewerkt · {failed} mislukt · {skipped} overgeslagen", + "productSync.lastRun": "Laatste run: {total} totaal · {created} aangemaakt · {updated} bijgewerkt · {failed} mislukt · {skipped} overgeslagen", "productSync.needsReconnect": "Productsync kan pas draaien als referenties na migratie opnieuw zijn verbonden. Op het tabblad Verbinding: Opslaan, daarna Verbinding testen.", "productSync.scheduleTitle": "Automatic product sync schedule", - "productSync.scheduleHelp": "Net als feed-intervallen: stel in hoe vaak Descrybe producten naar de winkel pusht, of pauzeer het schema. Handmatige wachtrij blijft werken tijdens pauze. Store-webhooks worden niet gebruikt — alleen polling/wachtrij.", + "productSync.scheduleHelp": "Net als feed-intervallen: stel in hoe vaak Descrybe producten naar de winkel pusht, of pauzeer het schema. Handmatige wachtrij blijft werken tijdens pauze. Store-webhooks worden niet gebruikt — alleen polling/wachtrij.", "productSync.scheduleInterval": "Sync-interval (uren)", - "productSync.scheduleIntervalHint": "1–168 uur. Standaard is 6 uur als dit niet op de server is gezet.", + "productSync.scheduleIntervalHint": "1–168 uur. Standaard is 6 uur als dit niet op de server is gezet.", "productSync.schedulePause": "Automatische sync pauzeren", "productSync.schedulePauseHint": "Stopt alleen geplande pushes. Je kunt nog steeds handmatig een productsync in de wachtrij zetten.", "productSync.scheduleSave": "Save schedule", @@ -5605,9 +5606,9 @@ export const nl: MessageDict = { "productSync.scheduleNeedsConfig": "Save store connection first", "productSync.scheduleAdminOnly": "Company admin required", "productSync.delivery.title": "Updates via polling, niet via store-webhooks", - "productSync.delivery.body": "Descrybe ontvangt geen Shopify- of WooCommerce-webhooks. Product-pushes draaien wanneer je ze in de wachtrij zet of volgens het automatische schema. Deze pagina volgt voortgang door de verbindingsstatus te pollen — niet via live store push-events.", + "productSync.delivery.body": "Descrybe ontvangt geen Shopify- of WooCommerce-webhooks. Product-pushes draaien wanneer je ze in de wachtrij zet of volgens het automatische schema. Deze pagina volgt voortgang door de verbindingsstatus te pollen — niet via live store push-events.", "productSync.delivery.inboundNote": "Bestellingen en reviews gebruiken ook wachtrij-pulls (gepland of handmatig), geen live webhooks.", - "productSync.delivery.hubNote": "Store-connectors synchroniseren op schema of wanneer je een job in de wachtrij zet — niet via live store-webhooks.", + "productSync.delivery.hubNote": "Store-connectors synchroniseren op schema of wanneer je een job in de wachtrij zet — niet via live store-webhooks.", "productSync.delivery.badge.manual": "Handmatige wachtrij", "productSync.delivery.badge.scheduled": "Gepland elke {hours} u", "productSync.delivery.badge.scheduledDefault": "Gepland (serverstandaard)", @@ -5627,20 +5628,20 @@ export const nl: MessageDict = { "productSync.scope.products": "Specific products", "productSync.scope.productsHint": "Optional. Search and select processed products to push only those.", "productSync.scope.productsOverrideHint": "Selected products override status, category, and max-products filters for this sync.", - "productSync.scope.productsSearch": "Search products…", - "productSync.scope.productsLoading": "Loading products…", + "productSync.scope.productsSearch": "Search products…", + "productSync.scope.productsLoading": "Loading products…", "productSync.scope.productsEmpty": "No processed products found.", "productSync.scope.productsSelected": "{count} selected", "productSync.scope.productsSelectedList": "Selected products", "productSync.scope.productsClear": "Clear selection", "productSync.scope.productsMax": "Maximum {max} products", - "store.syncingLive": "Bezig met sync…", + "store.syncingLive": "Bezig met sync…", "files.recentUploads": "Recente uploads", "files.colFileName": "Bestandsnaam", "files.colKind": "Soort", - "files.colUploaded": "Geüpload", + "files.colUploaded": "Geüpload", "files.colRows": "Rijen", - "files.loading": "Uploads laden…", + "files.loading": "Uploads laden…", "files.empty": "Nog geen uploads.", "products.filters.sortProducts": "Producten sorteren", "products.table.options": "Opties", diff --git a/apps/web/src/lib/i18n/messages/pl.ts b/apps/web/src/lib/i18n/messages/pl.ts index 02bb369..ca4e7f0 100644 --- a/apps/web/src/lib/i18n/messages/pl.ts +++ b/apps/web/src/lib/i18n/messages/pl.ts @@ -1,41 +1,41 @@ -import type { MessageDict } from "./types"; +import type { MessageDict } from "./types"; -/** Polish (pl) UI pack — keys must stay in sync with en.ts. */ +/** Polish (pl) UI pack — keys must stay in sync with en.ts. */ export const pl: MessageDict = { "app.name": "Descrybe", - "app.home": "Strona główna Descrybe", + "app.home": "Strona główna Descrybe", "common.cancel": "Anuluj", "common.save": "Zapisz zmiany", "common.saveShort": "Zapisz", "common.continue": "Kontynuuj", - "common.open": "Otwórz", - "common.markDone": "Oznacz jako ukończone", + "common.open": "Otwórz", + "common.markDone": "Oznacz jako ukoÅ„czone", "common.viewAll": "Zobacz wszystko", "common.close": "Zamknij", "common.askAdmin": "Zapytaj administratora firmy", "common.you": "Ty", "common.active": "Aktywny", - "common.pending": "Oczekujące", + "common.pending": "OczekujÄ…ce", "common.email": "E-mail", - "common.password": "Hasło", - "common.name": "Twoje imię i nazwisko", + "common.password": "HasÅ‚o", + "common.name": "Twoje imiÄ™ i nazwisko", "common.viewPricing": "Zobacz cennik", - "common.backToSignIn": "Powrót do logowania", - "common.signingOut": "Wylogowywanie…", - "common.signOutAndContinue": "Wyloguj się i kontynuuj", - "common.staySignedIn": "Pozostań zalogowany", - "a11y.skipToContent": "Przejdź do treści", - "theme.switchToDark": "Przełącz na ciemny motyw", - "theme.switchToLight": "Przełącz na jasny motyw", - "header.signOut": "Wyloguj się", - "header.signingOut": "Wylogowywanie…", - "status.emDash": "—", - "status.pending": "Oczekujące", + "common.backToSignIn": "Powrót do logowania", + "common.signingOut": "Wylogowywanie…", + "common.signOutAndContinue": "Wyloguj siÄ™ i kontynuuj", + "common.staySignedIn": "PozostaÅ„ zalogowany", + "a11y.skipToContent": "Przejdź do treÅ›ci", + "theme.switchToDark": "Przełącz na ciemny motyw", + "theme.switchToLight": "Przełącz na jasny motyw", + "header.signOut": "Wyloguj siÄ™", + "header.signingOut": "Wylogowywanie…", + "status.emDash": "—", + "status.pending": "OczekujÄ…ce", "status.processing": "Przetwarzanie", - "status.completed": "Ukończono", + "status.completed": "UkoÅ„czono", "status.failed": "Niepowodzenie", "status.cancelled": "Anulowano", - "nav.section.overview": "Przegląd", + "nav.section.overview": "PrzeglÄ…d", "nav.section.catalog": "Katalog", "nav.section.feeds": "Feedy", "nav.section.stores": "Sklepy", @@ -64,189 +64,189 @@ export const pl: MessageDict = { "nav.settings": "Ustawienia", "nav.support": "Wsparcie", "nav.admin": "Admin", - "nav.main": "Główna nawigacja", + "nav.main": "Główna nawigacja", "nav.sidebar": "Pasek boczny aplikacji", - "nav.close": "Zamknij nawigację", + "nav.close": "Zamknij nawigacjÄ™", "nav.closeMenu": "Zamknij menu", - "nav.open": "Otwórz nawigację", + "nav.open": "Otwórz nawigacjÄ™", "nav.commandPalette": "Szukaj stron", "nav.commandPaletteLabel": "Szukaj", - "auth.login.title": "Zaloguj się", - "auth.login.description": "Użyj adresu e-mail i hasła Descrybe.", - "auth.login.submit": "Zaloguj się", - "auth.login.submitting": "Logowanie…", - "auth.login.failed": "Logowanie nie powiodło się", - "auth.login.passwordNotSet": "To konto nadal wymaga hasła. Otwórz link zaproszenia lub poproś administratora o wystawienie nowego.", - "auth.login.setPasswordFirstTitle": "Najpierw ustaw hasło:", - "auth.login.setPasswordFirstBody": "użyj linku zaproszenia z e-maila. Jeśli link poszedł na stary adres (dryf e-mail), poproś administratora firmy o ponowne wystawienie zaproszenia do ustawienia hasła na {email}.", - "auth.login.yourEmail": "twój e-mail", - "auth.login.platformAdminsReissue": "Administratorzy platformy mogą ponownie wystawić z", - "auth.login.adminUsersLink": "Admin → Użytkownicy", - "auth.login.haveToken": "Masz token? Otwórz akceptację zaproszenia", + "auth.login.title": "Zaloguj siÄ™", + "auth.login.description": "Użyj adresu e-mail i hasÅ‚a Descrybe.", + "auth.login.submit": "Zaloguj siÄ™", + "auth.login.submitting": "Logowanie…", + "auth.login.failed": "Logowanie nie powiodÅ‚o siÄ™", + "auth.login.passwordNotSet": "To konto nadal wymaga hasÅ‚a. Otwórz link zaproszenia lub poproÅ› administratora o wystawienie nowego.", + "auth.login.setPasswordFirstTitle": "Najpierw ustaw hasÅ‚o:", + "auth.login.setPasswordFirstBody": "użyj linku zaproszenia z e-maila. JeÅ›li link poszedÅ‚ na stary adres (dryf e-mail), poproÅ› administratora firmy o ponowne wystawienie zaproszenia do ustawienia hasÅ‚a na {email}.", + "auth.login.yourEmail": "twój e-mail", + "auth.login.platformAdminsReissue": "Administratorzy platformy mogÄ… ponownie wystawić z", + "auth.login.adminUsersLink": "Admin → Użytkownicy", + "auth.login.haveToken": "Masz token? Otwórz akceptacjÄ™ zaproszenia", "auth.login.noAccount": "Brak konta?", - "auth.login.createCompany": "Utwórz firmę", - "auth.login.haveInvite": "Masz zaproszenie lub link do ustawienia hasła?", + "auth.login.createCompany": "Utwórz firmÄ™", + "auth.login.haveInvite": "Masz zaproszenie lub link do ustawienia hasÅ‚a?", "auth.login.acceptInvite": "Zaakceptuj zaproszenie", - "auth.login.forgotPassword": "Nie pamiętasz hasła?", - "auth.login.forgotPasswordHelp": "Podaj e-mail na stronie resetu. Jeśli nigdy nie ustawiłeś hasła, użyj linku zaproszenia / ustawienia hasła.", - "auth.forgot.title": "Nie pamiętam hasła", - "auth.forgot.description": "Podaj e-mail konta. Jeśli pasuje do aktywnego konta, wyślemy link resetujący.", - "auth.forgot.submit": "Wyślij link resetujący", - "auth.forgot.submitting": "Wysyłanie…", - "auth.forgot.failed": "Nie udało się poprosić o reset", - "auth.forgot.sentTitle": "Sprawdź e-mail", - "auth.forgot.sentBody": "Jeśli konto dla tego adresu istnieje, link resetujący jest w drodze. Link wygasa po godzinie.", - "auth.forgot.backToSignIn": "Wróć do logowania", - "auth.reset.title": "Zresetuj hasło", - "auth.reset.description": "Wybierz nowe hasło do konta Descrybe (co najmniej 8 znaków).", - "auth.reset.submit": "Zapisz nowe hasło", - "auth.reset.submitting": "Zapisywanie…", - "auth.reset.failed": "Nie udało się zresetować hasła", - "auth.reset.doneTitle": "Hasło zaktualizowane", - "auth.reset.doneDescription": "Zaloguj się e-mailem i nowym hasłem.", - "auth.reset.goToSignIn": "Przejdź do logowania", - "auth.reset.passwordConfirm": "Potwierdź hasło", - "auth.reset.passwordMismatch": "Hasła nie są zgodne", + "auth.login.forgotPassword": "Nie pamiÄ™tasz hasÅ‚a?", + "auth.login.forgotPasswordHelp": "Podaj e-mail na stronie resetu. JeÅ›li nigdy nie ustawiÅ‚eÅ› hasÅ‚a, użyj linku zaproszenia / ustawienia hasÅ‚a.", + "auth.forgot.title": "Nie pamiÄ™tam hasÅ‚a", + "auth.forgot.description": "Podaj e-mail konta. JeÅ›li pasuje do aktywnego konta, wyÅ›lemy link resetujÄ…cy.", + "auth.forgot.submit": "WyÅ›lij link resetujÄ…cy", + "auth.forgot.submitting": "WysyÅ‚anie…", + "auth.forgot.failed": "Nie udaÅ‚o siÄ™ poprosić o reset", + "auth.forgot.sentTitle": "Sprawdź e-mail", + "auth.forgot.sentBody": "JeÅ›li konto dla tego adresu istnieje, link resetujÄ…cy jest w drodze. Link wygasa po godzinie.", + "auth.forgot.backToSignIn": "Wróć do logowania", + "auth.reset.title": "Zresetuj hasÅ‚o", + "auth.reset.description": "Wybierz nowe hasÅ‚o do konta Descrybe (co najmniej 8 znaków).", + "auth.reset.submit": "Zapisz nowe hasÅ‚o", + "auth.reset.submitting": "Zapisywanie…", + "auth.reset.failed": "Nie udaÅ‚o siÄ™ zresetować hasÅ‚a", + "auth.reset.doneTitle": "HasÅ‚o zaktualizowane", + "auth.reset.doneDescription": "Zaloguj siÄ™ e-mailem i nowym hasÅ‚em.", + "auth.reset.goToSignIn": "Przejdź do logowania", + "auth.reset.passwordConfirm": "Potwierdź hasÅ‚o", + "auth.reset.passwordMismatch": "HasÅ‚a nie sÄ… zgodne", "auth.reset.missingTitle": "Brak linku resetu", - "auth.reset.missingDescription": "Otwórz link z e-maila, aby wybrać nowe hasło.", - "auth.reset.requestNewLink": "Poproś o nowy link resetu", - "auth.reset.tokenMissing": "Nie podano linku resetu. Użyj linku z e-maila albo poproś o nowy.", - "auth.reset.tokenInvalid": "Ten link resetu jest nieprawidłowy lub wygasł. Poproś o nowy na stronie nie pamiętam hasła.", - "auth.reset.linkRecognized": "Rozpoznano link resetowania. Wprowadź nowe hasło poniżej — sekret nie jest wyświetlany na tej stronie.", + "auth.reset.missingDescription": "Otwórz link z e-maila, aby wybrać nowe hasÅ‚o.", + "auth.reset.requestNewLink": "PoproÅ› o nowy link resetu", + "auth.reset.tokenMissing": "Nie podano linku resetu. Użyj linku z e-maila albo poproÅ› o nowy.", + "auth.reset.tokenInvalid": "Ten link resetu jest nieprawidÅ‚owy lub wygasÅ‚. PoproÅ› o nowy na stronie nie pamiÄ™tam hasÅ‚a.", + "auth.reset.linkRecognized": "Rozpoznano link resetowania. Wprowadź nowe hasÅ‚o poniżej — sekret nie jest wyÅ›wietlany na tej stronie.", "auth.reset.tokenLabel": "Token resetu", - "auth.reset.passwordHint": "Co najmniej 8 znaków. Bez innych reguł złożoności.", - "auth.register.title": "Utwórz firmę", - "auth.register.description": "Rejestruje firmę i jej użytkownika administratora.", + "auth.reset.passwordHint": "Co najmniej 8 znaków. Bez innych reguÅ‚ zÅ‚ożonoÅ›ci.", + "auth.register.title": "Utwórz firmÄ™", + "auth.register.description": "Rejestruje firmÄ™ i jej użytkownika administratora.", "auth.register.companyName": "Nazwa firmy", - "auth.register.submit": "Utwórz konto", - "auth.register.submitting": "Tworzenie…", - "auth.register.failed": "Rejestracja nie powiodła się", - "auth.register.haveAccount": "Masz już konto?", - "auth.register.signIn": "Zaloguj się", + "auth.register.submit": "Utwórz konto", + "auth.register.submitting": "Tworzenie…", + "auth.register.failed": "Rejestracja nie powiodÅ‚a siÄ™", + "auth.register.haveAccount": "Masz już konto?", + "auth.register.signIn": "Zaloguj siÄ™", "auth.invite.title": "Zaakceptuj zaproszenie", - "auth.invite.setPasswordTitle": "Ustaw hasło", - "auth.invite.description": "Ustaw hasło, aby dołączyć do firmy. Administrator przypisał rolę Członek (codzienna praca) lub Admin (zespół i rozliczenia).", - "auth.invite.setPasswordDescription": "Wybierz hasło do zmigrowanego konta Descrybe (co najmniej 8 znaków).", - "auth.invite.checking": "Sprawdzanie zaproszenia…", + "auth.invite.setPasswordTitle": "Ustaw hasÅ‚o", + "auth.invite.description": "Ustaw hasÅ‚o, aby dołączyć do firmy. Administrator przypisaÅ‚ rolÄ™ CzÅ‚onek (codzienna praca) lub Admin (zespół i rozliczenia).", + "auth.invite.setPasswordDescription": "Wybierz hasÅ‚o do zmigrowanego konta Descrybe (co najmniej 8 znaków).", + "auth.invite.checking": "Sprawdzanie zaproszenia…", "auth.invite.forEmail": "Zaproszenie dla {email}.", - "auth.invite.linkRecognized": "Rozpoznano link zaproszenia. Wprowadź hasło poniżej, aby kontynuować — sekret nie jest wyświetlany na tej stronie.", - "auth.invite.resetLinkRecognized": "Rozpoznano link resetowania. Wprowadź hasło poniżej, aby kontynuować — sekret nie jest wyświetlany na tej stronie.", + "auth.invite.linkRecognized": "Rozpoznano link zaproszenia. Wprowadź hasÅ‚o poniżej, aby kontynuować — sekret nie jest wyÅ›wietlany na tej stronie.", + "auth.invite.resetLinkRecognized": "Rozpoznano link resetowania. Wprowadź hasÅ‚o poniżej, aby kontynuować — sekret nie jest wyÅ›wietlany na tej stronie.", "auth.invite.tokenLabel": "Token zaproszenia", "auth.invite.resetTokenLabel": "Token resetowania", "auth.invite.tokenHelp": "Wklej token z e-maila z zaproszeniem. Jest maskowany w tym polu.", - "auth.invite.passwordHint": "Co najmniej 8 znaków. Brak innych reguł złożoności.", + "auth.invite.passwordHint": "Co najmniej 8 znaków. Brak innych reguÅ‚ zÅ‚ożonoÅ›ci.", "auth.invite.submit": "Zaakceptuj zaproszenie", - "auth.invite.setPasswordSubmit": "Ustaw hasło", - "auth.invite.accepting": "Akceptowanie…", - "auth.invite.saving": "Zapisywanie…", - "auth.invite.verifyFailed": "Nie można zweryfikować zaproszenia", - "auth.invite.verifySetPasswordFailed": "Nie można zweryfikować linku ustawienia hasła", - "auth.invite.acceptFailed": "Nie można zaakceptować zaproszenia", - "auth.invite.setPasswordFailed": "Nie można ustawić hasła", - "auth.invite.expired": "To zaproszenie jest nieprawidłowe lub wygasło. Poproś administratora firmy o nowe zaproszenie, a następnie otwórz nowy link (lub wklej nowy token poniżej).", - "auth.invite.setPasswordExpired": "Ten link do ustawienia hasła jest nieprawidłowy lub wygasł. Poproś administratora firmy lub platformy o ponowne wystawienie, a następnie otwórz nowy link (lub wklej nowy token poniżej).", - "auth.invite.emailMismatchDefault": "Jesteś zalogowany na inny e-mail niż w tym zaproszeniu.", - "auth.invite.expiredFooter": "Wygasły link? Poproś administratora o ponowne wystawienie — nie ma API samodzielnego ponownego wysyłania. Administratorzy platformy:", - "auth.invite.adminUsersLink": "Admin → Użytkownicy", - "auth.invite.doneTitle": "Jesteś w zespole", - "auth.invite.doneSetPasswordTitle": "Hasło zapisane", - "auth.invite.doneDescription": "Twoje konto jest gotowe. Następnie otwórz panel, aby pracować z feedami i produktami, lub przejrzyj ustawienia firmy.", - "auth.invite.doneSetPasswordDescription": "Zaloguj się e-mailem i nowym hasłem, aby otworzyć przestrzeń roboczą.", - "auth.invite.openDashboard": "Otwórz panel", + "auth.invite.setPasswordSubmit": "Ustaw hasÅ‚o", + "auth.invite.accepting": "Akceptowanie…", + "auth.invite.saving": "Zapisywanie…", + "auth.invite.verifyFailed": "Nie można zweryfikować zaproszenia", + "auth.invite.verifySetPasswordFailed": "Nie można zweryfikować linku ustawienia hasÅ‚a", + "auth.invite.acceptFailed": "Nie można zaakceptować zaproszenia", + "auth.invite.setPasswordFailed": "Nie można ustawić hasÅ‚a", + "auth.invite.expired": "To zaproszenie jest nieprawidÅ‚owe lub wygasÅ‚o. PoproÅ› administratora firmy o nowe zaproszenie, a nastÄ™pnie otwórz nowy link (lub wklej nowy token poniżej).", + "auth.invite.setPasswordExpired": "Ten link do ustawienia hasÅ‚a jest nieprawidÅ‚owy lub wygasÅ‚. PoproÅ› administratora firmy lub platformy o ponowne wystawienie, a nastÄ™pnie otwórz nowy link (lub wklej nowy token poniżej).", + "auth.invite.emailMismatchDefault": "JesteÅ› zalogowany na inny e-mail niż w tym zaproszeniu.", + "auth.invite.expiredFooter": "WygasÅ‚y link? PoproÅ› administratora o ponowne wystawienie — nie ma API samodzielnego ponownego wysyÅ‚ania. Administratorzy platformy:", + "auth.invite.adminUsersLink": "Admin → Użytkownicy", + "auth.invite.doneTitle": "JesteÅ› w zespole", + "auth.invite.doneSetPasswordTitle": "HasÅ‚o zapisane", + "auth.invite.doneDescription": "Twoje konto jest gotowe. NastÄ™pnie otwórz panel, aby pracować z feedami i produktami, lub przejrzyj ustawienia firmy.", + "auth.invite.doneSetPasswordDescription": "Zaloguj siÄ™ e-mailem i nowym hasÅ‚em, aby otworzyć przestrzeÅ„ roboczÄ….", + "auth.invite.openDashboard": "Otwórz panel", "auth.invite.companySettings": "Ustawienia firmy", - "auth.invite.goToSignIn": "Przejdź do logowania", - "auth.invite.afterSignInNote": "Po zalogowaniu trafiasz do przestrzeni roboczej — pomijana jest wycieczka po konfiguracji początkowej.", - "auth.invite.mismatchTitle": "Złe konto dla tego zaproszenia", - "auth.invite.mismatchDescription": "Ten link jest dla innego e-maila niż ten, na który jesteś zalogowany. Wyloguj się, aby kontynuować jako zaproszony użytkownik, albo pozostań zalogowany i poproś administratora o ponowne wystawienie zaproszenia.", + "auth.invite.goToSignIn": "Przejdź do logowania", + "auth.invite.afterSignInNote": "Po zalogowaniu trafiasz do przestrzeni roboczej — pomijana jest wycieczka po konfiguracji poczÄ…tkowej.", + "auth.invite.mismatchTitle": "ZÅ‚e konto dla tego zaproszenia", + "auth.invite.mismatchDescription": "Ten link jest dla innego e-maila niż ten, na który jesteÅ› zalogowany. Wyloguj siÄ™, aby kontynuować jako zaproszony użytkownik, albo pozostaÅ„ zalogowany i poproÅ› administratora o ponowne wystawienie zaproszenia.", "auth.invite.mismatchDetail": "Zalogowano jako {session}, ale to zaproszenie jest dla {invite}.", "auth.invite.mismatchFallback": "E-mail sesji nie pasuje do tego zaproszenia.", - "auth.invite.switchAccountTitle": "Zmień konto:", - "auth.invite.switchAccountBody": "wyloguj się, a następnie dokończ ten formularz zaproszonym e-mailem{emailSuffix}.", - "auth.invite.reissueTitle": "Ścieżka ponownego wystawienia:", - "auth.invite.reissueBody": "jeśli zmienił się Twój prawdziwy e-mail logowania (dryf e-mail), poproś administratora firmy o unieważnienie tego zaproszenia i wysłanie nowego na e-mail używany do logowania. Administratorzy platformy mogą też ponownie wystawiać linki ustawienia hasła w Admin → Użytkownicy.", - "locale.switcher": "Język interfejsu", - "locale.menu": "Wybierz język interfejsu", - "locale.label": "Język panelu", - "locale.help": "Zmienia etykiety w nawigacji i ustawieniach. Język generowanych treści ustawia się osobno w Firmie.", - "settings.contentLanguage": "Język treści", - "settings.contentLanguageHelp": "Język używany do tytułów, opisów i innych generowanych treści", + "auth.invite.switchAccountTitle": "ZmieÅ„ konto:", + "auth.invite.switchAccountBody": "wyloguj siÄ™, a nastÄ™pnie dokoÅ„cz ten formularz zaproszonym e-mailem{emailSuffix}.", + "auth.invite.reissueTitle": "Åšcieżka ponownego wystawienia:", + "auth.invite.reissueBody": "jeÅ›li zmieniÅ‚ siÄ™ Twój prawdziwy e-mail logowania (dryf e-mail), poproÅ› administratora firmy o unieważnienie tego zaproszenia i wysÅ‚anie nowego na e-mail używany do logowania. Administratorzy platformy mogÄ… też ponownie wystawiać linki ustawienia hasÅ‚a w Admin → Użytkownicy.", + "locale.switcher": "JÄ™zyk interfejsu", + "locale.menu": "Wybierz jÄ™zyk interfejsu", + "locale.label": "JÄ™zyk panelu", + "locale.help": "Zmienia etykiety w nawigacji i ustawieniach. JÄ™zyk generowanych treÅ›ci ustawia siÄ™ osobno w Firmie.", + "settings.contentLanguage": "JÄ™zyk treÅ›ci", + "settings.contentLanguageHelp": "JÄ™zyk używany do tytułów, opisów i innych generowanych treÅ›ci", "settings.tab.profile": "Profil", "settings.tab.company": "Firma", "settings.tab.alerts": "Alerty", "settings.tab.apiKeys": "Klucze API", - "settings.tab.team": "Zespół", + "settings.tab.team": "Zespół", "settings.title": "Ustawienia", - "settings.description": "Konto, firma, klucze API i zespół.", - "settings.accessDenied": "Nie masz uprawnień do otwarcia ustawień firmy. Poproś administratora firmy o pomoc.", - "settings.loadFailed": "Nie udało się wczytać ustawień", + "settings.description": "Konto, firma, klucze API i zespół.", + "settings.accessDenied": "Nie masz uprawnieÅ„ do otwarcia ustawieÅ„ firmy. PoproÅ› administratora firmy o pomoc.", + "settings.loadFailed": "Nie udaÅ‚o siÄ™ wczytać ustawieÅ„", "settings.profileHeading": "Profil", "settings.personalInfo": "Dane osobowe", "settings.personalInfoHelp": "Zaktualizuj swoje dane osobowe", - "settings.firstName": "Imię", - "settings.firstNamePlaceholder": "Twoje imię", + "settings.firstName": "ImiÄ™", + "settings.firstNamePlaceholder": "Twoje imiÄ™", "settings.lastName": "Nazwisko", "settings.lastNamePlaceholder": "Twoje nazwisko", "settings.email": "E-mail", "settings.profileUpdated": "Profil zaktualizowany.", - "settings.profileUpdateFailed": "Nie można zaktualizować profilu", - "settings.role.member": "Członek", + "settings.profileUpdateFailed": "Nie można zaktualizować profilu", + "settings.role.member": "CzÅ‚onek", "settings.role.admin": "Admin", - "settings.teamHeading": "Członkowie zespołu", - "settings.inviteUser": "Zaproś użytkownika", - "settings.teamAdminOnly": "Tylko administratorzy firmy mogą zapraszać, awansować, degradować lub usuwać członków zespołu.", - "settings.shareAcceptLink": "Udostępnij link akceptacji", - "settings.shareAcceptLinkHelp": "Wychodzący e-mail nie jest skonfigurowany. Skopiuj ten jednorazowy link i wyślij go zaproszonemu. Ustawi hasło (co najmniej 8 znaków) i dołączy z wybraną przez Ciebie rolą.", + "settings.teamHeading": "CzÅ‚onkowie zespoÅ‚u", + "settings.inviteUser": "ZaproÅ› użytkownika", + "settings.teamAdminOnly": "Tylko administratorzy firmy mogÄ… zapraszać, awansować, degradować lub usuwać czÅ‚onków zespoÅ‚u.", + "settings.shareAcceptLink": "UdostÄ™pnij link akceptacji", + "settings.shareAcceptLinkHelp": "WychodzÄ…cy e-mail nie jest skonfigurowany. Skopiuj ten jednorazowy link i wyÅ›lij go zaproszonemu. Ustawi hasÅ‚o (co najmniej 8 znaków) i dołączy z wybranÄ… przez Ciebie rolÄ….", "settings.acceptLinkLabel": "Jednorazowy link akceptacji zaproszenia", "settings.copyLink": "Kopiuj link", "settings.linkCopied": "Skopiowano link akceptacji.", "settings.table.email": "E-mail", "settings.table.role": "Rola", "settings.table.status": "Stan", - "settings.table.joined": "Dołączył / wygasa", + "settings.table.joined": "DołączyÅ‚ / wygasa", "settings.table.actions": "Akcje", - "settings.teamForbidden": "Nie masz uprawnień do przeglądania listy zespołu. Poproś administratora firmy o pomoc.", - "settings.noTeammates": "Brak jeszcze członków zespołu", - "settings.noTeammatesHelp": "Zapraszaj współpracowników jako Członek (produkty i feedy) lub Admin (zespół i ustawienia firmy). Oczekujące zaproszenia są tu widoczne do akceptacji.", - "settings.noTeammatesMemberHelp": "Brak jeszcze członków zespołu na liście. Poproś administratora firmy o wysłanie zaproszeń.", - "settings.memberActions": "Akcje członka", - "settings.makeAdmin": "Uczyń adminem", - "settings.makeMember": "Uczyń członkiem", - "settings.removeMember": "Usuń", - "settings.revokeInvite": "Unieważnij zaproszenie", - "settings.needOneAdmin": "Firmy potrzebują co najmniej jednego administratora", + "settings.teamForbidden": "Nie masz uprawnieÅ„ do przeglÄ…dania listy zespoÅ‚u. PoproÅ› administratora firmy o pomoc.", + "settings.noTeammates": "Brak jeszcze czÅ‚onków zespoÅ‚u", + "settings.noTeammatesHelp": "Zapraszaj współpracowników jako CzÅ‚onek (produkty i feedy) lub Admin (zespół i ustawienia firmy). OczekujÄ…ce zaproszenia sÄ… tu widoczne do akceptacji.", + "settings.noTeammatesMemberHelp": "Brak jeszcze czÅ‚onków zespoÅ‚u na liÅ›cie. PoproÅ› administratora firmy o wysÅ‚anie zaproszeÅ„.", + "settings.memberActions": "Akcje czÅ‚onka", + "settings.makeAdmin": "UczyÅ„ adminem", + "settings.makeMember": "UczyÅ„ czÅ‚onkiem", + "settings.removeMember": "UsuÅ„", + "settings.revokeInvite": "Unieważnij zaproszenie", + "settings.needOneAdmin": "Firmy potrzebujÄ… co najmniej jednego administratora", "settings.expires": "Wygasa {date}", - "settings.invalidEmail": "Wprowadź prawidłowy adres e-mail.", - "settings.inviteCreatedNoMail": "Utworzono zaproszenie dla {email} jako {role}. Skopiuj link akceptacji poniżej i udostępnij go — wychodzący e-mail nie jest skonfigurowany.", - "settings.inviteSent": "Wysłano zaproszenie do {email} jako {role}. Osoba powinna otworzyć e-mail i zaakceptować przed wygaśnięciem.", - "settings.inviteFailed": "Nie można wysłać zaproszenia", - "settings.revokeConfirm": "Unieważnić to zaproszenie?", - "settings.revoked": "Zaproszenie unieważnione.", - "settings.revokeFailed": "Nie można unieważnić zaproszenia", - "settings.removeConfirm": "Usunąć {email} z tej firmy?", - "settings.memberRemoved": "Usunięto {email}.", - "settings.removeFailed": "Nie można usunąć użytkownika", + "settings.invalidEmail": "Wprowadź prawidÅ‚owy adres e-mail.", + "settings.inviteCreatedNoMail": "Utworzono zaproszenie dla {email} jako {role}. Skopiuj link akceptacji poniżej i udostÄ™pnij go — wychodzÄ…cy e-mail nie jest skonfigurowany.", + "settings.inviteSent": "WysÅ‚ano zaproszenie do {email} jako {role}. Osoba powinna otworzyć e-mail i zaakceptować przed wygaÅ›niÄ™ciem.", + "settings.inviteFailed": "Nie można wysÅ‚ać zaproszenia", + "settings.revokeConfirm": "Unieważnić to zaproszenie?", + "settings.revoked": "Zaproszenie unieważnione.", + "settings.revokeFailed": "Nie można unieważnić zaproszenia", + "settings.removeConfirm": "Usunąć {email} z tej firmy?", + "settings.memberRemoved": "UsuniÄ™to {email}.", + "settings.removeFailed": "Nie można usunąć użytkownika", "settings.roleChangeConfirm": "{action} {email} do {role}?", "settings.roleChanged": "{email} jest teraz {role}.", - "settings.roleChangeFailed": "Nie można zaktualizować roli", + "settings.roleChangeFailed": "Nie można zaktualizować roli", "settings.promote": "Awansuj", "settings.demote": "Degraduj", - "settings.inviteTitle": "Zaproś członka zespołu", - "settings.inviteDescription": "Otrzymają link do ustawienia hasła (co najmniej 8 znaków) i dołączenia do tej firmy.", + "settings.inviteTitle": "ZaproÅ› czÅ‚onka zespoÅ‚u", + "settings.inviteDescription": "OtrzymajÄ… link do ustawienia hasÅ‚a (co najmniej 8 znaków) i dołączenia do tej firmy.", "settings.inviteEmail": "E-mail", "settings.inviteEmailPlaceholder": "kolega@przyklad.com", "settings.inviteRole": "Rola", - "settings.inviteRoleHint": "Członkowie zarządzają produktami i feedami. Administratorzy mogą też zapraszać współpracowników i zmieniać ustawienia firmy.", - "settings.sendInvite": "Wyślij zaproszenie", + "settings.inviteRoleHint": "CzÅ‚onkowie zarzÄ…dzajÄ… produktami i feedami. Administratorzy mogÄ… też zapraszać współpracowników i zmieniać ustawienia firmy.", + "settings.sendInvite": "WyÅ›lij zaproszenie", "settings.companyHeading": "Ustawienia firmy", "settings.activeCompany": "Aktywna firma", - "settings.creditsOverview": "Przegląd kredytów", + "settings.creditsOverview": "PrzeglÄ…d kredytów", "settings.plan": "Plan taryfowy", - "settings.used": "Użyte", + "settings.used": "Użyte", "settings.companyInfo": "Informacje o firmie", "settings.companyInfoHelp": "Zaktualizuj dane firmy", "settings.companyName": "Nazwa firmy", "settings.companyNamePlaceholder": "Nazwa Twojej firmy", - "settings.contentSettings": "Ustawienia treści", + "settings.contentSettings": "Ustawienia treÅ›ci", "settings.mergeProducts": "Scal produkty z tym samym GTIN", "settings.emailIntegration": "Integracja e-mail", "settings.aiIntegrations": "Integracje AI", @@ -254,233 +254,233 @@ export const pl: MessageDict = { "settings.inAppToasts": "Powiadomienia w aplikacji", "settings.emailAlerts": "Alerty e-mail", "settings.apiKeysHeading": "Klucze API", - "settings.createApiKey": "Utwórz klucz API", - "settings.createApiKeyShort": "Utwórz klucz API", - "settings.createApiKeyTitle": "Utwórz klucz API", + "settings.createApiKey": "Utwórz klucz API", + "settings.createApiKeyShort": "Utwórz klucz API", + "settings.createApiKeyTitle": "Utwórz klucz API", "settings.apiKeyLabel": "Klucz API", "settings.keyName": "Nazwa klucza", - "settings.storeKeySafe": "Przechowuj go w bezpiecznym miejscu — nie zobaczysz już pełnego sekretu.", - "settings.apiKeysIntro": "Utwórz firmowy klucz API, aby wywoływać publiczne endpointy /api/v1. Pełny sekret jest pokazywany tylko raz przy tworzeniu — skopiuj go od razu.", - "settings.apiKeysUseWhere": "Wysyłaj go jako Authorization: Bearer (zalecane) lub X-API-Key.", + "settings.storeKeySafe": "Przechowuj go w bezpiecznym miejscu — nie zobaczysz już peÅ‚nego sekretu.", + "settings.apiKeysIntro": "Utwórz firmowy klucz API, aby wywoÅ‚ywać publiczne endpointy /api/v1. PeÅ‚ny sekret jest pokazywany tylko raz przy tworzeniu — skopiuj go od razu.", + "settings.apiKeysUseWhere": "WysyÅ‚aj go jako Authorization: Bearer (zalecane) lub X-API-Key.", "settings.apiKeysDocsLink": "Dokumentacja uwierzytelniania API", - "settings.apiKeyOnceWarning": "To jedyna chwila, gdy pełny sekret jest widoczny. Skopiuj go teraz, zanim zamkniesz to okno.", + "settings.apiKeyOnceWarning": "To jedyna chwila, gdy peÅ‚ny sekret jest widoczny. Skopiuj go teraz, zanim zamkniesz to okno.", "settings.table.name": "Nazwa", "settings.table.key": "Klucz", - "settings.table.lastUsed": "Ostatnio użyty", + "settings.table.lastUsed": "Ostatnio użyty", "dashboard.demoSandbox": "Piaskownica demo", "dashboard.demoEmptyTitle": "Piaskownica demo jest pusta", - "dashboard.demoEmptyHint": "Piaskownica demo jest pusta — przełącz na A1 lub podłącz feed, aby zobaczyć realne statystyki katalogu.", - "dashboard.overviewTitle": "Przegląd", + "dashboard.demoEmptyHint": "Piaskownica demo jest pusta — przełącz na A1 lub podłącz feed, aby zobaczyć realne statystyki katalogu.", + "dashboard.overviewTitle": "PrzeglÄ…d", "dashboard.quickLinks": "Szybkie linki", "dashboard.whatsNew": "Co nowego", "dashboard.startTutorial": "Uruchom samouczek", - "dashboard.resumeTutorial": "Wznów samouczek", + "dashboard.resumeTutorial": "Wznów samouczek", "dashboard.restartTutorial": "Uruchom ponownie samouczek", "dashboard.tourTopics": "Tematy wycieczki", - "dashboard.browseTutorialSections": "Przeglądaj sekcje samouczka", - "dashboard.connectFeed": "Podłącz feed", + "dashboard.browseTutorialSections": "PrzeglÄ…daj sekcje samouczka", + "dashboard.connectFeed": "Podłącz feed", "dashboard.processProducts": "Przetwarzaj produkty", - "dashboard.openProducts": "Otwórz produkty", + "dashboard.openProducts": "Otwórz produkty", "dashboard.welcomeTo": "Witamy w {name}", - "dashboard.trialBadge": "Okres próbny", + "dashboard.trialBadge": "Okres próbny", "dashboard.actions": "Akcje panelu", - "dashboard.emptyPaygHint": "Descrybe wciąga katalog, wzbogaca i przetwarza, a potem eksportuje lub wypycha do sklepów. Użyj Pierwsze kroki poniżej.", - "dashboard.emptyCreditsHint": "Descrybe wciąga katalog, wzbogaca i przetwarza, a potem eksportuje lub wypycha do sklepów. Masz {credits} — zacznij od Pierwsze kroki poniżej.", - "dashboard.workflowTitle": "Przepływ katalogu", - "dashboard.recentActivity": "Ostatnia aktywność", - "dashboard.loadFailed": "Nie udało się wczytać panelu", - "dashboard.workspaceFallback": "Ta przestrzeń robocza", + "dashboard.emptyPaygHint": "Descrybe wciÄ…ga katalog, wzbogaca i przetwarza, a potem eksportuje lub wypycha do sklepów. Użyj Pierwsze kroki poniżej.", + "dashboard.emptyCreditsHint": "Descrybe wciÄ…ga katalog, wzbogaca i przetwarza, a potem eksportuje lub wypycha do sklepów. Masz {credits} — zacznij od Pierwsze kroki poniżej.", + "dashboard.workflowTitle": "PrzepÅ‚yw katalogu", + "dashboard.recentActivity": "Ostatnia aktywność", + "dashboard.loadFailed": "Nie udaÅ‚o siÄ™ wczytać panelu", + "dashboard.workspaceFallback": "Ta przestrzeÅ„ robocza", "dashboard.jobFallback": "Zadanie {id}", - "dashboard.workflow.feeds.connect": "Podłącz źródło", - "dashboard.workflow.feeds.sources": "{count} źródło", - "dashboard.workflow.feeds.sourcesPlural": "{count} źródeł", + "dashboard.workflow.feeds.connect": "Podłącz źródÅ‚o", + "dashboard.workflow.feeds.sources": "{count} źródÅ‚o", + "dashboard.workflow.feeds.sourcesPlural": "{count} źródeÅ‚", "dashboard.workflow.products.build": "Zbuduj katalog", "dashboard.workflow.products.count": "{count} w katalogu", "dashboard.workflow.map": "Map", "dashboard.workflow.map.detail": "Dopasuj kolumny po dodaniu feedu", - "dashboard.workflow.map.ready": "Otwórz Map na feedzie", + "dashboard.workflow.map.ready": "Otwórz Map na feedzie", "dashboard.workflow.sync": "Sync", - "dashboard.workflow.sync.detail": "Pobierz próbkę po mapowaniu", - "dashboard.workflow.sync.ready": "Zsynchronizuj próbkę do produktów", - "dashboard.workflow.process": "Przetwórz", + "dashboard.workflow.sync.detail": "Pobierz próbkÄ™ po mapowaniu", + "dashboard.workflow.sync.ready": "Zsynchronizuj próbkÄ™ do produktów", + "dashboard.workflow.process": "Przetwórz", "dashboard.workflow.processActive": "{count} aktywnych", - "dashboard.workflow.processWaiting": "{count} oczekujących", - "dashboard.workflow.processDone": "{count} ukończonych", + "dashboard.workflow.processWaiting": "{count} oczekujÄ…cych", + "dashboard.workflow.processDone": "{count} ukoÅ„czonych", "dashboard.workflow.processRun": "Uruchom zadania AI", "dashboard.workflow.export": "Eksportuj", "dashboard.workflow.exportReady": "Szablony i pobieranie", "dashboard.workflow.exportMap": "Mapuj, potem eksportuj", - "dashboard.workflowHint": "Katalog wejściowy → wzbogacenie / przetwarzanie → eksport lub wypchnięcie do sklepów. Przejdź do następnego kroku dla {name}.", - "dashboard.overviewHint": "Bieżące sumy dla {name}", - "dashboard.demoEmptyMessage": "Przełącz na A1 (lub inną firmę z danymi) w nagłówku albo podłącz tu feed, aby wypełnić tę piaskownicę.", - "dashboard.emptyTitle": "Wciągnij katalog", - "dashboard.emptyMessage": "Katalog wejściowy → wzbogacenie / przetwarzanie → eksport lub wypchnięcie do sklepów. Zacznij od Pierwsze kroki poniżej (lub podłącz feed / prześlij CSV).", - "dashboard.connectFeedAnyway": "Podłącz feed mimo to", - "dashboard.connectFeedShort": "Podłącz feed", - "dashboard.uploadCsv": "Prześlij CSV", - "dashboard.goToBilling": "Przejdź do rozliczeń", + "dashboard.workflowHint": "Katalog wejÅ›ciowy → wzbogacenie / przetwarzanie → eksport lub wypchniÄ™cie do sklepów. Przejdź do nastÄ™pnego kroku dla {name}.", + "dashboard.overviewHint": "Bieżące sumy dla {name}", + "dashboard.demoEmptyMessage": "Przełącz na A1 (lub innÄ… firmÄ™ z danymi) w nagłówku albo podłącz tu feed, aby wypeÅ‚nić tÄ™ piaskownicÄ™.", + "dashboard.emptyTitle": "WciÄ…gnij katalog", + "dashboard.emptyMessage": "Katalog wejÅ›ciowy → wzbogacenie / przetwarzanie → eksport lub wypchniÄ™cie do sklepów. Zacznij od Pierwsze kroki poniżej (lub podłącz feed / przeÅ›lij CSV).", + "dashboard.connectFeedAnyway": "Podłącz feed mimo to", + "dashboard.connectFeedShort": "Podłącz feed", + "dashboard.uploadCsv": "PrzeÅ›lij CSV", + "dashboard.goToBilling": "Przejdź do rozliczeÅ„", "dashboard.freePlanTitle": "Korzystasz z planu Free", - "dashboard.freePlanMessageWithLimit": "Użyto {used} z {max} produktów. Mapowanie feedów, podstawowe czyszczenie i etykiety energetyczne UE (EPREL) są wliczone; ulepsz plan o tytuły i opisy AI oraz większą pojemność.", - "dashboard.freePlanMessage": "Mapowanie feedów, podstawowe czyszczenie i etykiety energetyczne UE (EPREL) są wliczone; ulepsz plan o tytuły i opisy AI oraz większą pojemność.", - "dashboard.outOfCreditsTitle": "Skończyły Ci się kredyty AI", - "dashboard.outOfCreditsMessage": "Kup więcej kredytów lub ulepsz plan, aby kontynuować przetwarzanie.", - "dashboard.productLimitTitle": "Osiągnięto limit produktów", - "dashboard.productLimitMessage": "Twój plan {plan} pozwala na {max} produktów ({count} w katalogu). Ulepsz, aby przetwarzać więcej.", - "dashboard.productLimitMessageFull": "Osiągnięto limit produktów planu {plan}. Ulepsz, aby przetwarzać więcej.", - "dashboard.comparePlans": "Porównaj plany", + "dashboard.freePlanMessageWithLimit": "Użyto {used} z {max} produktów. Mapowanie feedów, podstawowe czyszczenie i etykiety energetyczne UE (EPREL) sÄ… wliczone; ulepsz plan o tytuÅ‚y i opisy AI oraz wiÄ™kszÄ… pojemność.", + "dashboard.freePlanMessage": "Mapowanie feedów, podstawowe czyszczenie i etykiety energetyczne UE (EPREL) sÄ… wliczone; ulepsz plan o tytuÅ‚y i opisy AI oraz wiÄ™kszÄ… pojemność.", + "dashboard.outOfCreditsTitle": "SkoÅ„czyÅ‚y Ci siÄ™ kredyty AI", + "dashboard.outOfCreditsMessage": "Kup wiÄ™cej kredytów lub ulepsz plan, aby kontynuować przetwarzanie.", + "dashboard.productLimitTitle": "OsiÄ…gniÄ™to limit produktów", + "dashboard.productLimitMessage": "Twój plan {plan} pozwala na {max} produktów ({count} w katalogu). Ulepsz, aby przetwarzać wiÄ™cej.", + "dashboard.productLimitMessageFull": "OsiÄ…gniÄ™to limit produktów planu {plan}. Ulepsz, aby przetwarzać wiÄ™cej.", + "dashboard.comparePlans": "Porównaj plany", "dashboard.viewPlans": "Zobacz plany", - "dashboard.trialTitle": "Okres próbny · {plan}", - "dashboard.trialMessageDated": "Okres próbny kończy się {date}. Pozostało {credits} kredytów.", - "dashboard.trialMessage": "Pozostało {credits} kredytów w okresie próbnym.", - "dashboard.lowCreditsTitle": "Kończą się kredyty", - "dashboard.lowCreditsMessage": "Pozostało {remaining} z {total} kredytów. Doładuj lub ulepsz, zanim zadania się zatrzymają.", + "dashboard.trialTitle": "Okres próbny · {plan}", + "dashboard.trialMessageDated": "Okres próbny koÅ„czy siÄ™ {date}. PozostaÅ‚o {credits} kredytów.", + "dashboard.trialMessage": "PozostaÅ‚o {credits} kredytów w okresie próbnym.", + "dashboard.lowCreditsTitle": "KoÅ„czÄ… siÄ™ kredyty", + "dashboard.lowCreditsMessage": "PozostaÅ‚o {remaining} z {total} kredytów. DoÅ‚aduj lub ulepsz, zanim zadania siÄ™ zatrzymajÄ….", "dashboard.latestJobs": "Najnowsze zadania przetwarzania", - "dashboard.noJobsEmpty": "Brak jeszcze zadań — najpierw zaimportuj produkty.", - "dashboard.noJobsReady": "Brak ostatnich zadań. Uruchom jedno w Produktach, gdy będziesz gotowy.", - "dashboard.startJob": "Uruchom zadanie z Produktów", + "dashboard.noJobsEmpty": "Brak jeszcze zadaÅ„ — najpierw zaimportuj produkty.", + "dashboard.noJobsReady": "Brak ostatnich zadaÅ„. Uruchom jedno w Produktach, gdy bÄ™dziesz gotowy.", + "dashboard.startJob": "Uruchom zadanie z Produktów", "dashboard.quickLinksHint": "Feedy, produkty, zadania i eksport.", "dashboard.feedsImportMap": "Importuj i mapuj", - "dashboard.productsBrowse": "Przeglądaj i przetwarzaj", + "dashboard.productsBrowse": "PrzeglÄ…daj i przetwarzaj", "dashboard.jobsMonitor": "Monitoruj zadania", "dashboard.exportsTemplates": "Szablony i pobieranie", "activation.title": "Pierwsze kroki", - "activation.description": "Descrybe wciąga katalog, wzbogaca i przetwarza, a potem eksportuje lub wypycha do sklepów. Dokończ bieżący krok i kontynuuj — tour demo wyjaśnia ekrany bez zmiany postępu listy.", - "activation.descriptionShort": "Zacznij od podświetlonego kroku poniżej — jedna akcja naraz. Połączenie sklepu jest opcjonalne.", + "activation.description": "Descrybe wciÄ…ga katalog, wzbogaca i przetwarza, a potem eksportuje lub wypycha do sklepów. DokoÅ„cz bieżący krok i kontynuuj — tour demo wyjaÅ›nia ekrany bez zmiany postÄ™pu listy.", + "activation.descriptionShort": "Zacznij od podÅ›wietlonego kroku poniżej — jedna akcja naraz. Połączenie sklepu jest opcjonalne.", "activation.nextCta": "Wykonaj ten krok", - "activation.valueProp": "Descrybe wciąga katalog, wzbogaca i przetwarza, a potem eksportuje lub wypycha do Twoich sklepów.", - "activation.alreadyDone": "Już zrobione", - "activation.skipForNow": "Pomiń na razie", - "activation.showAllSteps": "Pokaż wszystkie {total} kroki", - "activation.showFewerSteps": "Pokaż mniej kroków", - "activation.corePathLabel": "W skrócie", - "activation.corePath": "Katalog wejściowy → Wzbogacenie / przetwarzanie → Eksport lub wypchnięcie do sklepów", - "activation.storeWizardHint": "Nie jest wymagane do feedów ani eksportów — pomiń, chyba że chcesz wysyłać produkty do żywego sklepu.", - "activation.storeWizardCta": "Uruchom konfigurację przewodnią", - "activation.focus.map": "Dalej: otwórz Map na feedzie, dopasuj kolumny i zapisz. Najpierw dodaj feed, jeśli lista jest pusta.", - "activation.focus.sync": "Dalej: zsynchronizuj próbkę po zapisaniu mapowania. Użyj Sync na zmapowanym feedzie — unikaj niezmapowanych źródeł.", - "activation.focus.dismiss": "Zamknij podpowiedź", - "activation.dismiss": "Ukryj listę", + "activation.valueProp": "Descrybe wciÄ…ga katalog, wzbogaca i przetwarza, a potem eksportuje lub wypycha do Twoich sklepów.", + "activation.alreadyDone": "Już zrobione", + "activation.skipForNow": "PomiÅ„ na razie", + "activation.showAllSteps": "Pokaż wszystkie {total} kroki", + "activation.showFewerSteps": "Pokaż mniej kroków", + "activation.corePathLabel": "W skrócie", + "activation.corePath": "Katalog wejÅ›ciowy → Wzbogacenie / przetwarzanie → Eksport lub wypchniÄ™cie do sklepów", + "activation.storeWizardHint": "Nie jest wymagane do feedów ani eksportów — pomiÅ„, chyba że chcesz wysyÅ‚ać produkty do żywego sklepu.", + "activation.storeWizardCta": "Uruchom konfiguracjÄ™ przewodniÄ…", + "activation.focus.map": "Dalej: otwórz Map na feedzie, dopasuj kolumny i zapisz. Najpierw dodaj feed, jeÅ›li lista jest pusta.", + "activation.focus.sync": "Dalej: zsynchronizuj próbkÄ™ po zapisaniu mapowania. Użyj Sync na zmapowanym feedzie — unikaj niezmapowanych źródeÅ‚.", + "activation.focus.dismiss": "Zamknij podpowiedź", + "activation.dismiss": "Ukryj listÄ™", "hypercare.report.title": "Hypercare cutover", - "hypercare.report.message": "Brakujące lub błędne dane po migracji? Zgłoś to, abyśmy mogli naprawić Twój workspace.", - "hypercare.report.cta": "Zgłoś brakujące lub błędne dane", - "hypercare.report.dismiss": "Odrzuć", - "hypercare.report.adminTriage": "Otwórz kolejkę hypercare", + "hypercare.report.message": "BrakujÄ…ce lub błędne dane po migracji? ZgÅ‚oÅ› to, abyÅ›my mogli naprawić Twój workspace.", + "hypercare.report.cta": "ZgÅ‚oÅ› brakujÄ…ce lub błędne dane", + "hypercare.report.dismiss": "Odrzuć", + "hypercare.report.adminTriage": "Otwórz kolejkÄ™ hypercare", "etl.gaps.title": "What did not migrate", - "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", + "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", "etl.gaps.dismiss": "Dismiss", "etl.gaps.apiKeys.title": "API keys", - "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", + "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", "etl.gaps.apiKeys.cta": "Open API keys", "etl.gaps.blobs.title": "File contents (blobs)", - "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", + "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", "etl.gaps.blobs.countHint": "{count} file records are metadata-only (bytes were not migrated).", "etl.gaps.blobs.cta": "Open Files", "etl.gaps.jobs.title": "Processing history", "etl.gaps.jobs.body": "Legacy job and task history was not backfilled for cutover. New jobs you start here will appear normally.", - "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", + "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", "etl.gaps.jobs.migratedHint": "{count} jobs were tagged migrated from an optional backfill.", "etl.gaps.jobs.cta": "Open Processing", "etl.gaps.woo.title": "Store credentials", - "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", + "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", "etl.gaps.woo.cta": "Open Stores", "etl.gaps.settings.title": "Company settings", "etl.gaps.settings.body": "Only language and merge-products settings were imported. Re-check other company preferences in Settings.", "etl.gaps.settings.cta": "Open company settings", - "activation.progress": "{done} z {total} ukończonych", + "activation.progress": "{done} z {total} ukoÅ„czonych", "activation.stepsLabel": "Kroki aktywacji", "activation.pausedTitle": "Pierwsze kroki wstrzymane", - "activation.pausedBody": "Wznów w dowolnym momencie — od pól produktu do eksportu. Połączenie sklepu pozostaje opcjonalne.", - "activation.resume": "Wznów listę", - "activation.step.enable-fields.title": "Włącz pola produktów", - "activation.step.enable-fields.body": "Wybierz, które standardowe kolumny produktów Descrybe ma mapować i czyścić.", - "activation.step.connect-source.title": "Dodaj feed produktów", - "activation.step.connect-source.body": "Dodaj katalogowy feed CSV lub XML, aby produkty trafiały do Descrybe. Podłączenie żywego sklepu to późniejszy opcjonalny krok.", + "activation.pausedBody": "Wznów w dowolnym momencie — od pól produktu do eksportu. Połączenie sklepu pozostaje opcjonalne.", + "activation.resume": "Wznów listÄ™", + "activation.step.enable-fields.title": "Włącz pola produktów", + "activation.step.enable-fields.body": "Wybierz, które standardowe kolumny produktów Descrybe ma mapować i czyÅ›cić.", + "activation.step.connect-source.title": "Dodaj feed produktów", + "activation.step.connect-source.body": "Dodaj katalogowy feed CSV lub XML, aby produkty trafiaÅ‚y do Descrybe. Podłączenie żywego sklepu to późniejszy opcjonalny krok.", "activation.step.map.title": "Mapuj kolumny feedu", - "activation.step.map.body": "W Feeds otwórz Map na swoim feedzie, dopasuj kolumny dostawcy do pól Descrybe i zapisz.", - "activation.step.sync-sample.title": "Synchronizuj próbkę", - "activation.step.sync-sample.body": "W Feeds zsynchronizuj małą próbkę z zmapowanego feedu, aby sprawdzić mapowanie przed pełnym uruchomieniem.", + "activation.step.map.body": "W Feeds otwórz Map na swoim feedzie, dopasuj kolumny dostawcy do pól Descrybe i zapisz.", + "activation.step.sync-sample.title": "Synchronizuj próbkÄ™", + "activation.step.sync-sample.body": "W Feeds zsynchronizuj małą próbkÄ™ z zmapowanego feedu, aby sprawdzić mapowanie przed peÅ‚nym uruchomieniem.", "activation.step.process.title": "Przetwarzaj produkty", - "activation.step.process.body": "Otwórz nieprzetworzone produkty i uruchom przetwarzanie, aby wygenerować oczyszczoną treść katalogu.", - "activation.step.store-connect.title": "Połącz sklep", - "activation.step.store-connect.body": "Opcjonalne. Połącz WooCommerce lub Shopify, aby wysyłać produkty do sklepu. Pomiń, jeśli używasz tylko feedów i eksportów.", - "activation.step.export.title": "Utwórz eksport", - "activation.step.export.body": "Utwórz feed eksportu, aby pobierać lub publikować oczyszczone produkty jako XML lub CSV.", + "activation.step.process.body": "Otwórz nieprzetworzone produkty i uruchom przetwarzanie, aby wygenerować oczyszczonÄ… treść katalogu.", + "activation.step.store-connect.title": "Połącz sklep", + "activation.step.store-connect.body": "Opcjonalne. Połącz WooCommerce lub Shopify, aby wysyÅ‚ać produkty do sklepu. PomiÅ„, jeÅ›li używasz tylko feedów i eksportów.", + "activation.step.export.title": "Utwórz eksport", + "activation.step.export.body": "Utwórz feed eksportu, aby pobierać lub publikować oczyszczone produkty jako XML lub CSV.", "stats.products": "Zaimportowane produkty", "stats.categories": "Kategorie", "stats.attributes": "Atrybuty", "stats.feeds": "Feedy", "stats.credits": "Kredyty", - "stats.openCatalog": "Otwórz katalog", - "stats.productsHint": "Katalog {processed} · kolejka {unprocessed} (osobne liczniki)", + "stats.openCatalog": "Otwórz katalog", + "stats.productsHint": "Katalog {processed} · kolejka {unprocessed} (osobne liczniki)", "stats.catalogTree": "Drzewo katalogu", - "stats.attributeLibrary": "Biblioteka atrybutów", - "stats.importSources": "Źródła importu", + "stats.attributeLibrary": "Biblioteka atrybutów", + "stats.importSources": "ŹródÅ‚a importu", "stats.payAsYouGo": "Pay as you go", - "stats.walletBilling": "Portfel · Rozliczenia", - "stats.enterpriseBilling": "Enterprise · Rozliczenia", - "stats.usedBilling": "{used} użytych · Rozliczenia", + "stats.walletBilling": "Portfel · Rozliczenia", + "stats.enterpriseBilling": "Enterprise · Rozliczenia", + "stats.usedBilling": "{used} użytych · Rozliczenia", "processing.jobStatus.processing": "Przetwarzanie", - "processing.jobStatus.completed": "Ukończono", + "processing.jobStatus.completed": "UkoÅ„czono", "processing.jobStatus.failed": "Niepowodzenie", "processing.jobStatus.cancelled": "Anulowano", - "processing.jobStatus.pending": "Oczekujące", + "processing.jobStatus.pending": "OczekujÄ…ce", "processing.jobStatus.queued": "W kolejce", - "processing.jobStatus.skipped": "Pominięto", + "processing.jobStatus.skipped": "PominiÄ™to", "processing.jobStatus.unknown": "Nieznane", - "processing.job.error.all_failed": "Wszystkie {count} produktów nie powiodło się.", - "processing.job.error.partial_failed": "{count} produktów nie powiodło się.", + "processing.job.error.all_failed": "Wszystkie {count} produktów nie powiodÅ‚o siÄ™.", + "processing.job.error.partial_failed": "{count} produktów nie powiodÅ‚o siÄ™.", "processing.step.normalize": "Normalizuj", "processing.step.parse_specs": "Parsuj specs", - "processing.step.fill_fields": "Wypełnij pola", + "processing.step.fill_fields": "WypeÅ‚nij pola", "processing.step.eprel": "EPREL", "processing.step.ai_enhance": "Ulepszenie AI", - "processing.type.full": "Pełne przetwarzanie", + "processing.type.full": "PeÅ‚ne przetwarzanie", "processing.type.enhance_only": "Tylko ulepsz", - "processing.type.title": "Tylko tytuł", + "processing.type.title": "Tylko tytuÅ‚", "processing.type.description": "Tylko opis", "processing.type.attributes": "Atrybuty", "processing.type.category": "Kategoria", "processing.type.eprel": "EPREL", "processing.type.seo": "SEO", "processing.type.normalize": "Normalizuj", - "errors.requestFailed": "Żądanie nie powiodło się", - "errors.maintenance": "System jest w konserwacji. Spróbuj ponownie później.", - "errors.readOnly": "System jest w trybie tylko do odczytu. Zmiany są tymczasowo wyłączone.", - "errors.companyAdminDenied": "Tylko administratorzy firmy mogą {action}. Poproś administratora o pomoc.", - "errors.companyAdminDenied.actionDefault": "to zrobić", - "docs.tryIt.memberCannotCreate": "Tylko admini firmy mogą tworzyć klucze API. Starsze nie zostały zmigrowane — wklej klucz poniżej lub poproś admina o nowy.", - "docs.tryIt.noKeysLegacyAdmin": "Starsze klucze API nie zostały zmigrowane. Utwórz nowy przez Use my API key lub Ustawienia → Klucze API — sekret pokazywany jest tylko raz.", - "docs.tryIt.noKeysLegacyMember": "Brak kluczy API. Starsze nie zostały zmigrowane — poproś admina o utworzenie lub wklej klucz dk_.", - "errors.couldNotUpdateLanguage": "Nie można zaktualizować języka", - "toast.support.replyTitle": "Odpowiedź wsparcia", - "toast.support.replyBody": "Zespół odpowiedział na Twoje zgłoszenie wsparcia.", + "errors.requestFailed": "Żądanie nie powiodÅ‚o siÄ™", + "errors.maintenance": "System jest w konserwacji. Spróbuj ponownie później.", + "errors.readOnly": "System jest w trybie tylko do odczytu. Zmiany sÄ… tymczasowo wyłączone.", + "errors.companyAdminDenied": "Tylko administratorzy firmy mogÄ… {action}. PoproÅ› administratora o pomoc.", + "errors.companyAdminDenied.actionDefault": "to zrobić", + "docs.tryIt.memberCannotCreate": "Tylko admini firmy mogÄ… tworzyć klucze API. Starsze nie zostaÅ‚y zmigrowane — wklej klucz poniżej lub poproÅ› admina o nowy.", + "docs.tryIt.noKeysLegacyAdmin": "Starsze klucze API nie zostaÅ‚y zmigrowane. Utwórz nowy przez Use my API key lub Ustawienia → Klucze API — sekret pokazywany jest tylko raz.", + "docs.tryIt.noKeysLegacyMember": "Brak kluczy API. Starsze nie zostaÅ‚y zmigrowane — poproÅ› admina o utworzenie lub wklej klucz dk_.", + "errors.couldNotUpdateLanguage": "Nie można zaktualizować jÄ™zyka", + "toast.support.replyTitle": "Odpowiedź wsparcia", + "toast.support.replyBody": "Zespół odpowiedziaÅ‚ na Twoje zgÅ‚oszenie wsparcia.", "toast.support.replyRe": "Re: {subject}", - "toast.support.statusTitle": "Zaktualizowano status zgłoszenia", - "toast.support.statusBody": "Status Twojego zgłoszenia wsparcia się zmienił.", + "toast.support.statusTitle": "Zaktualizowano status zgÅ‚oszenia", + "toast.support.statusBody": "Status Twojego zgÅ‚oszenia wsparcia siÄ™ zmieniÅ‚.", "toast.support.updateTitle": "Aktualizacja wsparcia", "assistant.label": "Asystent", - "assistant.open": "Otwórz asystenta systemu", + "assistant.open": "Otwórz asystenta systemu", "assistant.close": "Zamknij asystenta systemu", "tutorial.demoTour": "Wycieczka demo", - "tutorial.jumpToTopic": "Przejdź do tematu", + "tutorial.jumpToTopic": "Przejdź do tematu", "tutorial.whereNeedHelp": "W czym potrzebujesz pomocy?", - "tutorial.skipTour": "Pomiń wycieczkę", - "tutorial.skipAria": "Pomiń samouczek", - "tutorial.pickerBody": "Wybierz sekcję, aby ponownie otworzyć tę część demo. Przeglądanie wycieczki nie zmienia danych konta.", + "tutorial.skipTour": "PomiÅ„ wycieczkÄ™", + "tutorial.skipAria": "PomiÅ„ samouczek", + "tutorial.pickerBody": "Wybierz sekcjÄ™, aby ponownie otworzyć tÄ™ część demo. PrzeglÄ…danie wycieczki nie zmienia danych konta.", "tutorial.sectionsAria": "Sekcje samouczka", - "tutorial.open": "Otwórz", + "tutorial.open": "Otwórz", "tutorial.close": "Zamknij", - "tutorial.resumeLastStep": "Wznów ostatni krok", - "tutorial.startFromBeginning": "Zacznij od początku", + "tutorial.resumeLastStep": "Wznów ostatni krok", + "tutorial.startFromBeginning": "Zacznij od poczÄ…tku", "tutorial.stepOf": "Krok {current} z {total}", - "tutorial.jumpTo": "Przejdź do…", - "tutorial.jumpToSectionAria": "Przejdź do sekcji", + "tutorial.jumpTo": "Przejdź do…", + "tutorial.jumpToSectionAria": "Przejdź do sekcji", "tutorial.back": "Wstecz", "tutorial.pause": "Wstrzymaj", "tutorial.continue": "Kontynuuj", - "tutorial.finishTour": "Zakończ wycieczkę", - "tutorial.missingTargetHint": "Ten element sterujący nie jest jeszcze na tym ekranie. Możesz mimo to Kontynuować — wycieczka nigdy nie wymaga zapisu ani synchronizacji.", + "tutorial.finishTour": "ZakoÅ„cz wycieczkÄ™", + "tutorial.missingTargetHint": "Ten element sterujÄ…cy nie jest jeszcze na tym ekranie. Możesz mimo to Kontynuować — wycieczka nigdy nie wymaga zapisu ani synchronizacji.", "tutorial.section.welcome": "Welcome", "tutorial.section.catalog": "Catalog setup", "tutorial.section.sources": "Feeds", @@ -490,90 +490,90 @@ export const pl: MessageDict = { "tutorial.section.grow": "Grow", "tutorial.section.done": "Done", "tutorial.step.welcome.title": "Witamy w Descrybe", - "tutorial.step.welcome.body": "Główna pętla Descrybe to Feeds → Process → Export / Stores. Ta prowadzona demo podświetla te ekrany na prawdziwym panelu — bez zapisywania, synchronizacji, włączania pól ani tworzenia feedów. Wstrzymaj w dowolnym momencie; wznów z nagłówka. Przejdź do sekcji, gdy potrzebujesz pomocy tylko w jednym temacie.", - "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", + "tutorial.step.welcome.body": "Główna pÄ™tla Descrybe to Feeds → Process → Export / Stores. Ta prowadzona demo podÅ›wietla te ekrany na prawdziwym panelu — bez zapisywania, synchronizacji, włączania pól ani tworzenia feedów. Wstrzymaj w dowolnym momencie; wznów z nagłówka. Przejdź do sekcji, gdy potrzebujesz pomocy tylko w jednym temacie.", + "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", "tutorial.step.welcome.nextLabel": "Start tour", - "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", + "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", "tutorial.step.dashboard-overview.title": "Twoje centrum dowodzenia", - "tutorial.step.dashboard-overview.body": "Pas workflow katalogu pokazuje codzienną ścieżkę: Feeds → Map → Sync → Process. Getting started śledzi prawdziwy postęp workspace (osobno od tej demo). Gdy jesteś gotowy, użyj Manage feeds lub Start processing — potem eksportuj lub podłącz sklep.", - "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", + "tutorial.step.dashboard-overview.body": "Pas workflow katalogu pokazuje codziennÄ… Å›cieżkÄ™: Feeds → Map → Sync → Process. Getting started Å›ledzi prawdziwy postÄ™p workspace (osobno od tej demo). Gdy jesteÅ› gotowy, użyj Manage feeds lub Start processing — potem eksportuj lub podłącz sklep.", + "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", "tutorial.step.dashboard-overview.missingHint": "The workflow strip and checklist appear after the dashboard loads.", "tutorial.step.enable-fields.title": "Pola standardowe", - "tutorial.step.enable-fields.body": "Standard Fields to kolumny produktów, które Descrybe mapuje, przetwarza i eksportuje — tytuł, opis, GTIN, obrazy i więcej. Enable recommended włącza rozsądny zestaw domyślny dla większości katalogów. Listę możesz później dopracować bez psucia istniejących mapowań.", - "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", + "tutorial.step.enable-fields.body": "Standard Fields to kolumny produktów, które Descrybe mapuje, przetwarza i eksportuje — tytuÅ‚, opis, GTIN, obrazy i wiÄ™cej. Enable recommended włącza rozsÄ…dny zestaw domyÅ›lny dla wiÄ™kszoÅ›ci katalogów. ListÄ™ możesz później dopracować bez psucia istniejÄ…cych mapowaÅ„.", + "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", "tutorial.step.enable-fields.warning": "Enabling or disabling fields affects mapping and processing for this company. Prefer Enable recommended once, then tweak carefully.", "tutorial.step.enable-fields.missingHint": "Wait for the Fields page to load, or open Fields from the Catalog section in the sidebar.", "tutorial.step.catalog-depth.title": "Kategorie i atrybuty", - "tutorial.step.catalog-depth.body": "W sekcji Catalog paska bocznego znajdziesz też Categories i Attributes. Categories organizują katalog; atrybuty napędzają filtry i strukturalne opisy. Nie musisz ich konfigurować, by dokończyć ten tour.", - "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", + "tutorial.step.catalog-depth.body": "W sekcji Catalog paska bocznego znajdziesz też Categories i Attributes. Categories organizujÄ… katalog; atrybuty napÄ™dzajÄ… filtry i strukturalne opisy. Nie musisz ich konfigurować, by dokoÅ„czyć ten tour.", + "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", "tutorial.step.catalog-depth.missingHint": "Expand Catalog in the sidebar to open Categories or Attributes after the tour.", - "tutorial.step.connect-source.title": "Dodaj źródło produktów", - "tutorial.step.connect-source.body": "Feedy to sposób, w jaki katalogi dostawców trafiają do Descrybe — pliki CSV, XML lub URL. Add Feed tworzy nowe źródło; każdy wiersz pokazuje status (gotowy do mapowania, zmapowany, aktywny). Map otwiera ekran dopasowania pól dla tego feedu.", - "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", + "tutorial.step.connect-source.title": "Dodaj źródÅ‚o produktów", + "tutorial.step.connect-source.body": "Feedy to sposób, w jaki katalogi dostawców trafiajÄ… do Descrybe — pliki CSV, XML lub URL. Add Feed tworzy nowe źródÅ‚o; każdy wiersz pokazuje status (gotowy do mapowania, zmapowany, aktywny). Map otwiera ekran dopasowania pól dla tego feedu.", + "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", "tutorial.step.connect-source.warning": "Avoid deleting live feeds unless you intend to remove that source and its sync history.", - "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", - "tutorial.step.map.title": "Mapuj pola źródła", - "tutorial.step.map.body": "Na ekranie Map feedu dopasowujesz kolumny dostawcy do standard fields Descrybe. Auto-map sugeruje dopasowania z nazw kolumn; potwierdź rozmyte, potem popraw resztę. Save Mappings zapisuje mapę, by sync i przetwarzanie wiedziały, jak czytać każdy wiersz.", - "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", - "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", + "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", + "tutorial.step.map.title": "Mapuj pola źródÅ‚a", + "tutorial.step.map.body": "Na ekranie Map feedu dopasowujesz kolumny dostawcy do standard fields Descrybe. Auto-map sugeruje dopasowania z nazw kolumn; potwierdź rozmyte, potem popraw resztÄ™. Save Mappings zapisuje mapÄ™, by sync i przetwarzanie wiedziaÅ‚y, jak czytać każdy wiersz.", + "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", + "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", "tutorial.step.map.missingHint": "Add a feed and click Map to see the mapping UI; or Continue to keep learning.", - "tutorial.step.sync-sample.title": "Zsynchronizuj próbkę (gdy gotowe)", - "tutorial.step.sync-sample.body": "Po zapisaniu mapowań Sync + Process sample pobiera małą partię i uruchamia przetwarzanie, by sprawdzić tytuły, obrazy i atrybuty przed pełnym uruchomieniem. Full Sync now na liście feedów służy większym importom, gdy próbka wygląda dobrze.", - "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", + "tutorial.step.sync-sample.title": "Zsynchronizuj próbkÄ™ (gdy gotowe)", + "tutorial.step.sync-sample.body": "Po zapisaniu mapowaÅ„ Sync + Process sample pobiera małą partiÄ™ i uruchamia przetwarzanie, by sprawdzić tytuÅ‚y, obrazy i atrybuty przed peÅ‚nym uruchomieniem. Full Sync now na liÅ›cie feedów sÅ‚uży wiÄ™kszym importom, gdy próbka wyglÄ…da dobrze.", + "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", "tutorial.step.sync-sample.warning": "Syncing writes products into this company. Prefer a sample first; avoid Sync now on unmapped feeds.", "tutorial.step.sync-sample.missingHint": "Sync controls appear on feed rows and on the mapping screen footer.", - "tutorial.step.process.title": "Przeglądaj produkty", - "tutorial.step.process.body": "Products listuje zsynchronizowane i przetworzone pozycje. Filtruj według statusu, otwórz wiersz po szczegóły i używaj odznak EPREL, gdy są dane etykiety energetycznej. Tu wychwytujesz błędy mapowania przed eksportem lub sync sklepu.", - "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", + "tutorial.step.process.title": "PrzeglÄ…daj produkty", + "tutorial.step.process.body": "Products listuje zsynchronizowane i przetworzone pozycje. Filtruj wedÅ‚ug statusu, otwórz wiersz po szczegóły i używaj odznak EPREL, gdy sÄ… dane etykiety energetycznej. Tu wychwytujesz błędy mapowania przed eksportem lub sync sklepu.", + "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", "tutorial.step.process.missingHint": "Wait for the products table, or Continue if the catalog is still empty.", "tutorial.step.processing-hub.title": "Przetwarzanie w tle", - "tutorial.step.processing-hub.body": "Joby w Processing pokazują postęp AI i pipeline: ukończone uruchomienia i błędy. Uruchamiaj joby z panelu lub produktów, gdy świadomie chcesz wydać kredyty na partię.", - "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", + "tutorial.step.processing-hub.body": "Joby w Processing pokazujÄ… postÄ™p AI i pipeline: ukoÅ„czone uruchomienia i błędy. Uruchamiaj joby z panelu lub produktów, gdy Å›wiadomie chcesz wydać kredyty na partiÄ™.", + "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", "tutorial.step.processing-hub.missingHint": "Open Jobs from the Processing section in the sidebar if the page is empty.", "tutorial.step.stores-hub.title": "Sklepy i platformy", - "tutorial.step.stores-hub.body": "Po przetworzeniu Stores łączy WooCommerce lub Shopify, by wypchnąć oczyszczony katalog do sklepu. Używaj, gdy marketplace/CMS jest celem — albo przejdź do Export feeds, gdy partnerzy potrzebują tylko pliku/URL.", - "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", + "tutorial.step.stores-hub.body": "Po przetworzeniu Stores łączy WooCommerce lub Shopify, by wypchnąć oczyszczony katalog do sklepu. Używaj, gdy marketplace/CMS jest celem — albo przejdź do Export feeds, gdy partnerzy potrzebujÄ… tylko pliku/URL.", + "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", "tutorial.step.stores-hub.missingHint": "Open Stores from the sidebar to see connection cards.", "tutorial.step.export.title": "Eksportuj oczyszczone produkty", - "tutorial.step.export.body": "Export feeds publikują oczyszczone produkty jako XML lub CSV dla kanałów, partnerów lub sklepu. Utwórz eksport, wybierz format i filtry, potem udostępnij URL feedu lub pobierz. Eksporty czytają przetworzone dane katalogu — najpierw mapuj i przetwarzaj dla najlepszych wyników.", - "tutorial.step.export.tip": "You don’t need to create an export during the demo.", - "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", + "tutorial.step.export.body": "Export feeds publikujÄ… oczyszczone produkty jako XML lub CSV dla kanałów, partnerów lub sklepu. Utwórz eksport, wybierz format i filtry, potem udostÄ™pnij URL feedu lub pobierz. Eksporty czytajÄ… przetworzone dane katalogu — najpierw mapuj i przetwarzaj dla najlepszych wyników.", + "tutorial.step.export.tip": "You don’t need to create an export during the demo.", + "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", "tutorial.step.export.missingHint": "Wait for Export feeds to load, or open Exports from the Feeds section in the sidebar.", "tutorial.step.billing-hub.title": "Kredyty i rozliczenia", - "tutorial.step.billing-hub.body": "Billing pokazuje plan, portfel i pozostałe kredyty. Przetwarzanie i niektóre funkcje AI czerpią z tego salda. Pilnuj użycia przed dużymi uruchomieniami katalogu.", - "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", + "tutorial.step.billing-hub.body": "Billing pokazuje plan, portfel i pozostaÅ‚e kredyty. Przetwarzanie i niektóre funkcje AI czerpiÄ… z tego salda. Pilnuj użycia przed dużymi uruchomieniami katalogu.", + "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", "tutorial.step.billing-hub.missingHint": "Open Billing from the Account section in the sidebar.", "tutorial.step.grow-hub.title": "Kampanie, SEO i recenzje", - "tutorial.step.grow-hub.body": "W Marketing: Campaigns generuje treści, Content calendar planuje posty, SEO sprawdza listingi, a Reviews łączy się z WooCommerce. Opierają się na zdrowym zmapowanym katalogu — dokończ Feeds → Process → Export / Stores, zanim na nich polegasz.", - "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", + "tutorial.step.grow-hub.body": "W Marketing: Campaigns generuje treÅ›ci, Content calendar planuje posty, SEO sprawdza listingi, a Reviews łączy siÄ™ z WooCommerce. OpierajÄ… siÄ™ na zdrowym zmapowanym katalogu — dokoÅ„cz Feeds → Process → Export / Stores, zanim na nich polegasz.", + "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", "tutorial.step.grow-hub.missingHint": "Open Campaigns from Marketing in the sidebar, or Continue.", "tutorial.step.tour-done.title": "Gotowy do eksploracji", - "tutorial.step.tour-done.body": "To mapa produktu: Feeds → Map → Sync → Process → Export / Stores. Użyj Getting started na panelu do prawdziwej konfiguracji. Wznów lub uruchom ponownie tour z nagłówka, albo Jump to… sekcję. Skip tour kończy demo bez zmiany checklisty.", - "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", + "tutorial.step.tour-done.body": "To mapa produktu: Feeds → Map → Sync → Process → Export / Stores. Użyj Getting started na panelu do prawdziwej konfiguracji. Wznów lub uruchom ponownie tour z nagłówka, albo Jump to… sekcjÄ™. Skip tour koÅ„czy demo bez zmiany checklisty.", + "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", "tutorial.step.tour-done.nextLabel": "Finish tour", "tutorial.step.tour-done.missingHint": "Return to the dashboard to finish.", - "news.uxImprovements.title": "Ulepszenia doświadczenia użytkownika", - "flash.contentLanguageUpdated": "Zaktualizowano język treści.", + "news.uxImprovements.title": "Ulepszenia doÅ›wiadczenia użytkownika", + "flash.contentLanguageUpdated": "Zaktualizowano jÄ™zyk treÅ›ci.", "theme.darkMode": "Tryb ciemny", "theme.lightMode": "Tryb jasny", - "forbidden.title.accessRestricted": "Dostęp ograniczony", - "forbidden.title.permissionDenied": "Odmowa uprawnień", - "forbidden.message.support": "Ten obszar jest dostępny tylko dla wsparcia i administratorów platformy.", - "forbidden.message.platform": "Ten obszar jest dostępny tylko dla administratorów platformy.", - "forbidden.message.company": "Nie masz uprawnień. Poproś administratora firmy o pomoc.", - "forbidden.backToDashboard": "Powrót do panelu", + "forbidden.title.accessRestricted": "DostÄ™p ograniczony", + "forbidden.title.permissionDenied": "Odmowa uprawnieÅ„", + "forbidden.message.support": "Ten obszar jest dostÄ™pny tylko dla wsparcia i administratorów platformy.", + "forbidden.message.platform": "Ten obszar jest dostÄ™pny tylko dla administratorów platformy.", + "forbidden.message.company": "Nie masz uprawnieÅ„. PoproÅ› administratora firmy o pomoc.", + "forbidden.backToDashboard": "Powrót do panelu", "admin.chrome.platformOps": "Ops platformy", "admin.chrome.sidebar": "Pasek boczny ops platformy", "admin.chrome.nav": "Ops platformy", "admin.chrome.mobileMenu": "Menu mobilne ops platformy", "admin.chrome.opsBadge": "Ops", - "admin.chrome.backToApp": "Powrót do aplikacji", - "admin.chrome.uiLanguage": "Język UI", + "admin.chrome.backToApp": "Powrót do aplikacji", + "admin.chrome.uiLanguage": "JÄ™zyk UI", "admin.chrome.staff.supportDesk": "Biurko wsparcia", "admin.chrome.staff.platformAdmin": "Admin platformy", "admin.chrome.staff.staff": "Personel", "admin.chrome.staff.admin": "Admin", - "admin.nav.section.overview": "Przegląd", + "admin.nav.section.overview": "PrzeglÄ…d", "admin.nav.section.directory": "Katalog", "admin.nav.section.support": "Wsparcie", "admin.nav.section.ops": "Operacje", @@ -581,21 +581,21 @@ export const pl: MessageDict = { "admin.nav.section.system": "Warstwa systemu", "admin.nav.commandCenter": "Centrum dowodzenia", "admin.nav.analytics": "Analityka", - "admin.nav.usersOrgs": "Użytkownicy i org", - "admin.nav.tickets": "Zgłoszenia", + "admin.nav.usersOrgs": "Użytkownicy i org", + "admin.nav.tickets": "ZgÅ‚oszenia", "admin.nav.knowledge": "Wiedza", "admin.nav.diagnostics": "Diagnostyka", "admin.nav.stuckProducts": "Zablokowane produkty", "admin.nav.orphanProcessed": "Orphan processed", "admin.nav.billing": "Rozliczenia", "admin.nav.sales": "Sales", - "admin.nav.translations": "Tłumaczenia", + "admin.nav.translations": "TÅ‚umaczenia", "admin.nav.settings": "Ustawienia", "admin.sales.title": "Sales leads", "admin.sales.description": "Inbound Contact sales messages and custom payment quotes.", "admin.sales.listTitle": "Leads", "admin.sales.listDesc": "{total} matching leads", - "admin.sales.searchPlaceholder": "Search name, email, company…", + "admin.sales.searchPlaceholder": "Search name, email, company…", "admin.sales.statusAll": "All statuses", "admin.sales.status.new": "New", "admin.sales.status.contacted": "Contacted", @@ -643,7 +643,7 @@ export const pl: MessageDict = { "admin.sales.col.status": "Status", "admin.sales.col.created": "Created", "sales.contact.title": "Contact sales", - "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", + "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", "sales.contact.formTitle": "Send a message", "sales.contact.formLead": "Enterprise and custom deals are prepared by our team, then paid via Stripe Checkout.", "sales.contact.name": "Name", @@ -653,29 +653,29 @@ export const pl: MessageDict = { "sales.contact.estimatedSkus": "Estimated SKUs (optional)", "sales.contact.message": "How can we help?", "sales.contact.submit": "Send message", - "sales.contact.submitting": "Sending…", + "sales.contact.submitting": "Sending…", "sales.contact.error": "Could not send your message. Please try again.", - "sales.contact.toast.success": "Message sent — we will follow up soon.", - "sales.contact.thanksTitle": "Thanks — we got your message", + "sales.contact.toast.success": "Message sent — we will follow up soon.", + "sales.contact.thanksTitle": "Thanks — we got your message", "sales.contact.thanksBody": "A platform admin will review your request and can send a Checkout link for a custom plan.", "sales.contact.bookDemo": "Book a live demo", "sales.contact.orBookDemo": "Or book a Calendly demo", "sales.contact.backPricing": "Back to pricing", "admin.overview.eyebrow": "Centrum dowodzenia", - "admin.overview.title": "Przegląd platformy", - "admin.overview.description": "Na żywo impuls platformy z podsumowania analityki — skocz do ops, insight i wsparcia.", + "admin.overview.title": "PrzeglÄ…d platformy", + "admin.overview.description": "Na żywo impuls platformy z podsumowania analityki — skocz do ops, insight i wsparcia.", "admin.overview.tokens": "Tokeny", - "admin.overview.tokensHint": "Cały okres · okres", + "admin.overview.tokensHint": "CaÅ‚y okres · okres", "admin.overview.credits": "Kredyty", "admin.overview.creditsHint": "We wszystkich firmach", "admin.overview.jobs": "Zadania", "admin.overview.jobsHint": "Migawka kolejki", "admin.overview.platform": "Platforma", - "admin.overview.platformHint": "Najemcy · wolumen", - "admin.overview.signals": "Ostatnie sygnały", - "admin.overview.shortcuts": "Skróty ops", - "admin.overview.providers": "Mix dostawców AI", - "admin.overview.internalAi": "Wewnętrzne AI", + "admin.overview.platformHint": "Najemcy · wolumen", + "admin.overview.signals": "Ostatnie sygnaÅ‚y", + "admin.overview.shortcuts": "Skróty ops", + "admin.overview.providers": "Mix dostawców AI", + "admin.overview.internalAi": "WewnÄ™trzne AI", "admin.overview.internalAiHint": "Ustawienia platformy", "admin.overview.popularKeys": "Popularne klucze", "admin.overview.popularKeysHint": "Popularni dostawcy najemcy", @@ -684,105 +684,105 @@ export const pl: MessageDict = { "admin.overview.linkBilling": "Rozliczenia", "admin.overview.linkSettings": "Ustawienia", "admin.overview.shortcut.diagnostics.title": "Diagnostyka", - "admin.overview.shortcut.diagnostics.desc": "Kontrole zdrowia, kolejka, niedawne błędy", + "admin.overview.shortcut.diagnostics.desc": "Kontrole zdrowia, kolejka, niedawne błędy", "admin.overview.shortcut.analytics.title": "Analityka", "admin.overview.shortcut.analytics.desc": "Tokeny, zadania, rejestracje, dostawcy", "admin.overview.shortcut.knowledge.title": "Wiedza", - "admin.overview.shortcut.knowledge.desc": "Artykuły, szablony, auto-odpowiedź", - "admin.overview.shortcut.users.title": "Użytkownicy i org", + "admin.overview.shortcut.knowledge.desc": "ArtykuÅ‚y, szablony, auto-odpowiedź", + "admin.overview.shortcut.users.title": "Użytkownicy i org", "admin.overview.shortcut.users.desc": "Konta, firmy, zaproszenia", "admin.overview.shortcut.stuck.title": "Zablokowane produkty", - "admin.overview.shortcut.stuck.desc": "Działa dłużej niż 2 godziny", + "admin.overview.shortcut.stuck.desc": "DziaÅ‚a dÅ‚użej niż 2 godziny", "admin.overview.signal.stuckTitle": "{count} zablokowane zadanie", "admin.overview.signal.stuckTitlePlural": "{count} zablokowane zadania", - "admin.overview.signal.stuckDetail": "Działa dłużej niż 2 godziny — sprawdź i zresetuj w razie potrzeby.", - "admin.overview.signal.stuckCta": "Otwórz zablokowane zadania", + "admin.overview.signal.stuckDetail": "DziaÅ‚a dÅ‚użej niż 2 godziny — sprawdź i zresetuj w razie potrzeby.", + "admin.overview.signal.stuckCta": "Otwórz zablokowane zadania", "admin.overview.signal.failedTitle": "{count} nieudanych w ostatnich {days} d", - "admin.overview.signal.failedDetail": "{completed} ukończonych w tym samym oknie.", - "admin.overview.signal.failedDetailRate": "{rate}% wskaźnik błędów · {completed} ukończonych.", - "admin.overview.signal.failedCta": "Otwórz diagnostykę", + "admin.overview.signal.failedDetail": "{completed} ukoÅ„czonych w tym samym oknie.", + "admin.overview.signal.failedDetailRate": "{rate}% wskaźnik błędów · {completed} ukoÅ„czonych.", + "admin.overview.signal.failedCta": "Otwórz diagnostykÄ™", "admin.overview.signal.runningTitle": "{count} zadanie w toku", - "admin.overview.signal.runningTitlePlural": "{count} zadań w toku", + "admin.overview.signal.runningTitlePlural": "{count} zadaÅ„ w toku", "admin.overview.signal.runningDetail": "Aktywne zadania przetwarzania w tej chwili.", - "admin.overview.signal.runningCta": "Zobacz kolejkę", - "admin.overview.signal.ticketsTitle": "{count} otwarte zgłoszenie wsparcia", - "admin.overview.signal.ticketsTitlePlural": "{count} otwarte zgłoszenia wsparcia", - "admin.overview.signal.ticketsDetail": "Otwarte lub oczekujące zgłoszenia w biurku wsparcia.", - "admin.overview.signal.ticketsCta": "Otwórz wsparcie", - "admin.overview.signal.clearTitle": "Brak podwyższonych sygnałów", - "admin.overview.signal.clearDetail": "Brak zablokowanych zadań, błędów okresu ani otwartych zgłoszeń w podsumowaniu na żywo (ostatnie {days} d).", - "admin.overview.signal.clearCta": "Potwierdź w diagnostyce", + "admin.overview.signal.runningCta": "Zobacz kolejkÄ™", + "admin.overview.signal.ticketsTitle": "{count} otwarte zgÅ‚oszenie wsparcia", + "admin.overview.signal.ticketsTitlePlural": "{count} otwarte zgÅ‚oszenia wsparcia", + "admin.overview.signal.ticketsDetail": "Otwarte lub oczekujÄ…ce zgÅ‚oszenia w biurku wsparcia.", + "admin.overview.signal.ticketsCta": "Otwórz wsparcie", + "admin.overview.signal.clearTitle": "Brak podwyższonych sygnałów", + "admin.overview.signal.clearDetail": "Brak zablokowanych zadaÅ„, błędów okresu ani otwartych zgÅ‚oszeÅ„ w podsumowaniu na żywo (ostatnie {days} d).", + "admin.overview.signal.clearCta": "Potwierdź w diagnostyce", "admin.overview.badge.action": "Akcja", "admin.overview.badge.watch": "Obserwuj", - "admin.overview.badge.live": "Na żywo", - "admin.overview.badge.clear": "Wyczyść", - "admin.overview.summaryLoadFailed": "Nie udało się wczytać podsumowania na żywo. Skróty poniżej nadal działają.", + "admin.overview.badge.live": "Na żywo", + "admin.overview.badge.clear": "Wyczyść", + "admin.overview.summaryLoadFailed": "Nie udaÅ‚o siÄ™ wczytać podsumowania na żywo. Skróty poniżej nadal dziaÅ‚ajÄ….", "admin.overview.keyMetrics": "Kluczowe metryki", - "admin.overview.summaryWindow": "Ostatnie {days} d · endpoint podsumowania", + "admin.overview.summaryWindow": "Ostatnie {days} d · endpoint podsumowania", "admin.overview.tokensPeriod": "{count} w ostatnich {days} d", - "admin.overview.creditsFoot": "{remaining} pozostało z {allocated} przydzielonych", - "admin.overview.jobsFoot": "{failed} nieudanych · {running} działających · {stuck} zablokowanych", - "admin.overview.platformFoot": "{users} użytkowników · {processed} przetworzonych · {feeds} feedów wejściowych", - "admin.overview.fullDiagnostics": "Pełna diagnostyka", - "admin.overview.also": "Także:", + "admin.overview.creditsFoot": "{remaining} pozostaÅ‚o z {allocated} przydzielonych", + "admin.overview.jobsFoot": "{failed} nieudanych · {running} dziaÅ‚ajÄ…cych · {stuck} zablokowanych", + "admin.overview.platformFoot": "{users} użytkowników · {processed} przetworzonych · {feeds} feedów wejÅ›ciowych", + "admin.overview.fullDiagnostics": "PeÅ‚na diagnostyka", + "admin.overview.also": "Także:", "admin.overview.linkSupport": "Biurko wsparcia", "admin.overview.charts": "Wykresy", - "admin.overview.providerFoot": "{jobs} zadań · {products} produktów", - "admin.analytics.eyebrow": "Wgląd", + "admin.overview.providerFoot": "{jobs} zadaÅ„ · {products} produktów", + "admin.analytics.eyebrow": "WglÄ…d", "admin.analytics.title": "Analityka i raporty", - "admin.analytics.description": "KPI i trendy platformy na żywo z tokenów, zadań, rejestracji, feedów, zgłoszeń i rozliczeń.", + "admin.analytics.description": "KPI i trendy platformy na żywo z tokenów, zadaÅ„, rejestracji, feedów, zgÅ‚oszeÅ„ i rozliczeÅ„.", "admin.analytics.period": "Okres", - "admin.analytics.refreshing": "Odświeżanie…", + "admin.analytics.refreshing": "OdÅ›wieżanie…", "admin.analytics.llmTokens": "Tokeny LLM", "admin.analytics.credits": "Kredyty", "admin.analytics.jobs": "Zadania", "admin.analytics.volume": "Wolumen", - "admin.analytics.failureRate": "Wskaźnik błędów", + "admin.analytics.failureRate": "Wskaźnik błędów", "admin.analytics.stuckJobs": "Zablokowane zadania", "admin.analytics.apiKeys": "Klucze API", "admin.analytics.signups": "Rejestracje", - "admin.analytics.internalAi": "Wewnętrzne AI", + "admin.analytics.internalAi": "WewnÄ™trzne AI", "admin.analytics.internalAiHint": "OpenAI platformy (ustawienia admina)", "admin.analytics.popularKeys": "Popularne klucze", - "admin.analytics.popularKeysHint": "OpenAI / Groq / … najemcy", + "admin.analytics.popularKeysHint": "OpenAI / Groq / … najemcy", "admin.analytics.customUrl": "Niestandardowy URL/model", "admin.analytics.customUrlHint": "Bazowy URL najemcy + model + klucz", "admin.analytics.tokensByDay": "Tokeny wg dnia", - "admin.analytics.tokensByProvider": "Tokeny według klasy dostawcy", - "admin.analytics.tokensByProviderAria": "Tokeny według klasy dostawcy", - "admin.analytics.internalCount": "Wewnętrzne {count}", + "admin.analytics.tokensByProvider": "Tokeny wedÅ‚ug klasy dostawcy", + "admin.analytics.tokensByProviderAria": "Tokeny wedÅ‚ug klasy dostawcy", + "admin.analytics.internalCount": "WewnÄ™trzne {count}", "admin.analytics.popularCount": "Popularne {count}", "admin.analytics.customCount": "Niestandardowe {count}", "admin.analytics.jobsByDay": "Zadania wg dnia", - "admin.analytics.jobsByDayHint": "Utworzone zadania (drugorzędne = nieudane).", + "admin.analytics.jobsByDayHint": "Utworzone zadania (drugorzÄ™dne = nieudane).", "admin.analytics.signupsByDay": "Rejestracje wg dnia", - "admin.analytics.signupsByDayHint": "Nowi użytkownicy (główne) i firmy (drugorzędne)", - "admin.analytics.processingJobsStatus": "processing_jobs według statusu", - "admin.analytics.feedSyncStatus": "feed_sync_jobs według statusu", - "admin.analytics.ticketsStatus": "support_tickets według statusu", - "admin.analytics.providerDetail": "Szczegóły dostawcy", - "admin.analytics.providerDetailHint": "Główne tryby dostawców (ograniczone ze względu na rozmiar payloadu).", + "admin.analytics.signupsByDayHint": "Nowi użytkownicy (główne) i firmy (drugorzÄ™dne)", + "admin.analytics.processingJobsStatus": "processing_jobs wedÅ‚ug statusu", + "admin.analytics.feedSyncStatus": "feed_sync_jobs wedÅ‚ug statusu", + "admin.analytics.ticketsStatus": "support_tickets wedÅ‚ug statusu", + "admin.analytics.providerDetail": "Szczegóły dostawcy", + "admin.analytics.providerDetailHint": "Główne tryby dostawców (ograniczone ze wzglÄ™du na rozmiar payloadu).", "admin.analytics.noProviderRows": "Brak wierszy dostawcy", "admin.analytics.provider": "Dostawca", "admin.analytics.class": "Klasa", "admin.analytics.tokensCol": "Tokeny", "admin.analytics.productsCol": "Produkty", - "admin.analytics.companiesHint": "Najważniejsze firmy wg tokenów z podziałem dostawców", + "admin.analytics.companiesHint": "Najważniejsze firmy wg tokenów z podziaÅ‚em dostawców", "admin.analytics.noCompanies": "Brak firm", "admin.analytics.noCompaniesMsg": "Lista firm jest pusta.", "admin.analytics.company": "Firma", - "admin.analytics.internal": "Wewnętrzne", + "admin.analytics.internal": "WewnÄ™trzne", "admin.analytics.popular": "Popularne", "admin.analytics.custom": "Niestandardowe", "admin.analytics.noBillingCycles": "Brak cykli rozliczeniowych", "admin.analytics.linkDiagnostics": "Diagnostyka", "admin.analytics.linkStuck": "Zablokowane produkty", "admin.users.eyebrow": "Admin platformy", - "admin.users.title": "Użytkownicy i organizacje", - "admin.users.description": "Katalog użytkowników platformy, role personelu i przypisania planów firm.", - "admin.users.staffRoleUnavailable": "Aktualizacje ról personelu nie są jeszcze dostępne w tym wdrożeniu. Skontaktuj się z administratorem platformy, jeśli ich potrzebujesz.", + "admin.users.title": "Użytkownicy i organizacje", + "admin.users.description": "Katalog użytkowników platformy, role personelu i przypisania planów firm.", + "admin.users.staffRoleUnavailable": "Aktualizacje ról personelu nie sÄ… jeszcze dostÄ™pne w tym wdrożeniu. Skontaktuj siÄ™ z administratorem platformy, jeÅ›li ich potrzebujesz.", "admin.users.search": "Szukaj", - "admin.users.tabUsers": "Użytkownicy", + "admin.users.tabUsers": "Użytkownicy", "admin.users.tabCompanies": "Firmy", "admin.users.filterWithoutPlan": "Without plan", "admin.users.filterWithoutApiKeys": "Keys needing reissue", @@ -792,57 +792,57 @@ export const pl: MessageDict = { "admin.users.colStatus": "Stan", "admin.users.colCreated": "Utworzono", "admin.users.colActions": "Akcje", - "admin.users.mustSetPassword": "Trzeba ustawić hasło", + "admin.users.mustSetPassword": "Trzeba ustawić hasÅ‚o", "admin.users.inactive": "Nieaktywny", "admin.users.reissueInvite": "Wystaw zaproszenie ponownie", - "admin.users.setLocalPassword": "Ustaw lokalne hasło", - "admin.users.switchToUser": "Przełącz na użytkownika", + "admin.users.setLocalPassword": "Ustaw lokalne hasÅ‚o", + "admin.users.switchToUser": "Przełącz na użytkownika", "admin.users.colCompany": "Firma", "admin.users.colPlan": "Plan taryfowy", "admin.users.colCredits": "Kredyty", - "admin.users.colLanguage": "Język", + "admin.users.colLanguage": "JÄ™zyk", "admin.users.assignPlan": "Przypisz plan", "admin.users.cloneCatalog": "Kopiuj do mojej firmy", "admin.users.cloneCatalogAria": "Skopiuj katalog {name} do firmy sandbox", "admin.users.cloneCatalogTitle": "Kopiuj katalog firmy", - "admin.users.cloneCatalogDesc": "Pozostajesz na koncie admina. Dane źródłowe nie są zmieniane.", - "admin.users.cloneCatalogFrom": "Źródło: {name}", + "admin.users.cloneCatalogDesc": "Pozostajesz na koncie admina. Dane źródÅ‚owe nie sÄ… zmieniane.", + "admin.users.cloneCatalogFrom": "ŹródÅ‚o: {name}", "admin.users.cloneCatalogInto": "Cel: {name}", - "admin.users.cloneCatalogWarning": "Zastępuje kategorie, feedy, produkty, atrybuty, mapowania i branding w celu. Plan, rozliczenia, członkowie, klucze API i konektory sklepu nie są kopiowane.", + "admin.users.cloneCatalogWarning": "ZastÄ™puje kategorie, feedy, produkty, atrybuty, mapowania i branding w celu. Plan, rozliczenia, czÅ‚onkowie, klucze API i konektory sklepu nie sÄ… kopiowane.", "admin.users.cloneCatalogCancel": "Anuluj", "admin.users.cloneCatalogConfirm": "Kopiuj katalog", "admin.users.cloneDestFallback": "twoja firma sandbox", "admin.users.fixA1": "Napraw katalog A1", "admin.users.fixA1Aria": "Napraw prompty AI, kategorie i hashe enhance dla {name}", "admin.users.fixA1Title": "Napraw katalog firmy", - "admin.users.fixA1Desc": "Ponownie stosuje poprawione prompty AI, czyści słabe hashe enhance i uzupełnia kategorie z mapped_data.", + "admin.users.fixA1Desc": "Ponownie stosuje poprawione prompty AI, czyÅ›ci sÅ‚abe hashe enhance i uzupeÅ‚nia kategorie z mapped_data.", "admin.users.fixA1Company": "Firma: {name}", - "admin.users.fixA1Warning": "Preferuj Platform Demo lub wskazaną firmę. Nie usuwa feedów, mapowań ani surowych produktów. Chroni reguły nadpisywania kohorty A1.", + "admin.users.fixA1Warning": "Preferuj Platform Demo lub wskazanÄ… firmÄ™. Nie usuwa feedów, mapowaÅ„ ani surowych produktów. Chroni reguÅ‚y nadpisywania kohorty A1.", "admin.users.fixA1Cancel": "Anuluj", "admin.users.fixA1Confirm": "Napraw katalog", - "admin.users.noUsers": "Żaden użytkownik nie pasuje do tego filtra.", - "admin.users.noCompanies": "Żadna firma nie pasuje do tego filtra.", - "admin.users.assignRoleTitle": "Przypisz rolę personelu", - "admin.users.assignRoleDesc": "Role platformy sterują panelem admina (Admin i Developer) oraz biurkiem wsparcia (personel wsparcia).", + "admin.users.noUsers": "Å»aden użytkownik nie pasuje do tego filtra.", + "admin.users.noCompanies": "Å»adna firma nie pasuje do tego filtra.", + "admin.users.assignRoleTitle": "Przypisz rolÄ™ personelu", + "admin.users.assignRoleDesc": "Role platformy sterujÄ… panelem admina (Admin i Developer) oraz biurkiem wsparcia (personel wsparcia).", "admin.users.staffRole": "Rola personelu", - "admin.users.saveRole": "Zapisz rolę", + "admin.users.saveRole": "Zapisz rolÄ™", "admin.users.assignPlanTitle": "Przypisz plan", - "admin.users.assignPlanDesc": "Dołącz publiczny, legacy lub niestandardowy plan do tej firmy.", + "admin.users.assignPlanDesc": "Dołącz publiczny, legacy lub niestandardowy plan do tej firmy.", "admin.users.selectPlan": "Wybierz plan", "admin.users.assign": "Przypisz", "admin.settings.title": "Ustawienia platformy", - "admin.settings.description": "Poświadczenia platformy, role AI, poczta i integracje dla tego wdrożenia", - "admin.settings.intro": "Skonfiguruj tu role AI platformy, SMTP, OAuth, EPREL, Pinecone i Stripe. Puste pola sekretów zachowują zapisaną wartość. Klucze firm pozostają w Integracjach najemcy.", - "admin.settings.aiRolesUnavailable": "Pełne role AI nie są jeszcze dostępne w tym wdrożeniu. Przetwarzanie nadal zapisuje się przez ustawienia OpenAI platformy; inne role będą utrwalane po wsparciu.", - "admin.settings.tab.integrations": "Przegląd", + "admin.settings.description": "PoÅ›wiadczenia platformy, role AI, poczta i integracje dla tego wdrożenia", + "admin.settings.intro": "Skonfiguruj tu role AI platformy, SMTP, OAuth, EPREL, Pinecone i Stripe. Puste pola sekretów zachowujÄ… zapisanÄ… wartość. Klucze firm pozostajÄ… w Integracjach najemcy.", + "admin.settings.aiRolesUnavailable": "PeÅ‚ne role AI nie sÄ… jeszcze dostÄ™pne w tym wdrożeniu. Przetwarzanie nadal zapisuje siÄ™ przez ustawienia OpenAI platformy; inne role bÄ™dÄ… utrwalane po wsparciu.", + "admin.settings.tab.integrations": "PrzeglÄ…d", "admin.settings.tab.ai": "Role AI", "admin.settings.tab.mail": "Poczta", "admin.settings.tab.other": "Inne", - "admin.settings.tab.admins": "Użytkownicy admin", - "admin.settings.mailCardDesc": "Zaproszenia do ustawienia hasła i wychodzącą pocztę platformy", + "admin.settings.tab.admins": "Użytkownicy admin", + "admin.settings.mailCardDesc": "Zaproszenia do ustawienia hasÅ‚a i wychodzÄ…cÄ… pocztÄ™ platformy", "admin.settings.integrationsCardDesc": "OAuth, EPREL, Pinecone, Stripe, feedy", "admin.settings.tenantVsPlatform": "Najemca vs platforma", - "admin.settings.hostSecrets": "Sekrety bazy, sesji i podpisu serwera — konfiguruj tylko na hoście", + "admin.settings.hostSecrets": "Sekrety bazy, sesji i podpisu serwera — konfiguruj tylko na hoÅ›cie", "admin.settings.linkAi": "AI", "admin.settings.linkEmail": "Adres e-mail", "admin.settings.linkBilling": "Rozliczenia", @@ -853,33 +853,33 @@ export const pl: MessageDict = { "admin.settings.embeddingDims": "Wymiary embeddingu (opcjonalne)", "admin.settings.smtpHost": "Host SMTP", "admin.settings.port": "Port", - "admin.settings.username": "Nazwa użytkownika", + "admin.settings.username": "Nazwa użytkownika", "admin.settings.fromAddress": "Adres nadawcy", "admin.settings.testRecipient": "Odbiorca testowy (opcjonalnie)", - "admin.settings.testRecipientPlaceholder": "Domyślnie Twój e-mail admina", + "admin.settings.testRecipientPlaceholder": "DomyÅ›lnie Twój e-mail admina", "admin.settings.googleOauth": "Google OAuth", - "admin.settings.googleOauthDesc": "Opcjonalne poświadczenia klienta Google OAuth platformy.", + "admin.settings.googleOauthDesc": "Opcjonalne poÅ›wiadczenia klienta Google OAuth platformy.", "admin.settings.clientId": "Client ID", "admin.settings.eprel": "EPREL", "admin.settings.timeout": "Limit czasu", - "admin.settings.ficheLanguage": "Język karty", + "admin.settings.ficheLanguage": "JÄ™zyk karty", "admin.settings.pinecone": "Pinecone", "admin.settings.host": "Host", "admin.settings.namespace": "Namespace", "admin.settings.namespacePlaceholder": "opcjonalne", "admin.settings.stripe": "Stripe", - "admin.settings.priceStarterMo": "ID ceny miesięcznej Starter", + "admin.settings.priceStarterMo": "ID ceny miesiÄ™cznej Starter", "admin.settings.priceStarterYr": "ID ceny rocznej Starter", "admin.settings.pricePlusMo": "Plus monthly price ID", "admin.settings.pricePlusYr": "Plus yearly price ID", - "admin.settings.priceGrowthMo": "ID ceny miesięcznej Growth", + "admin.settings.priceGrowthMo": "ID ceny miesiÄ™cznej Growth", "admin.settings.priceGrowthYr": "ID ceny rocznej Growth", - "admin.settings.priceBusinessMo": "ID ceny miesięcznej Business", + "admin.settings.priceBusinessMo": "ID ceny miesiÄ™cznej Business", "admin.settings.priceBusinessYr": "ID ceny rocznej Business", "admin.settings.priceScaleMo": "Scale monthly price ID", "admin.settings.priceScaleYr": "Scale yearly price ID", "admin.settings.creditPackPrices": "AI credit pack price IDs (one-time)", - "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", + "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", "admin.settings.syncCreditPacks": "Sync Stripe packs", "admin.settings.syncCreditPacksOk": "Synced {count} credit pack price(s) ({mode} mode).", "admin.settings.syncCreditPacksModeHint": "Stripe mode for this sync: {mode}. Switch the secret key (sk_test_ vs sk_live_) to sync the other environment.", @@ -888,55 +888,55 @@ export const pl: MessageDict = { "admin.settings.pricePackMedium": "Growth pack (2,000 credits) price ID", "admin.settings.pricePackLarge": "Catalog pack (10,000 credits) price ID", "admin.settings.pricePackXL": "Scale pack (40,000 credits) price ID", - "admin.settings.feedAllowlist": "Allowlista prywatnych URL feedów", + "admin.settings.feedAllowlist": "Allowlista prywatnych URL feedów", "admin.settings.allowlist": "Allowlista", "admin.settings.platformAdmins": "Administratorzy platformy", - "admin.settings.colUserId": "ID użytkownika", + "admin.settings.colUserId": "ID użytkownika", "admin.settings.colEmail": "Adres e-mail", "admin.settings.colName": "Nazwa", "admin.settings.colAddedOn": "Dodano", "admin.settings.colRole": "Rola", "admin.settings.platformAdminBadge": "Admin platformy", - "admin.settings.noAdmins": "Nie znaleziono użytkowników admin", + "admin.settings.noAdmins": "Nie znaleziono użytkowników admin", "admin.settings.adminStatusCheck": "Sprawdzenie statusu admina", "admin.settings.bootstrapPage": "strona bootstrap", - "admin.readiness.title": "Gotowość cutover", - "admin.readiness.detail": "Liczniki hypercare, które wciąż wymagają uwagi przed przełączeniem DNS.", - "admin.readiness.mustSetPassword": "{count} użytkowników musi ustawić hasło", + "admin.readiness.title": "Gotowość cutover", + "admin.readiness.detail": "Liczniki hypercare, które wciąż wymagajÄ… uwagi przed przełączeniem DNS.", + "admin.readiness.mustSetPassword": "{count} użytkowników musi ustawić hasÅ‚o", "admin.readiness.withoutAdmin": "{count} firm bez admina", "admin.readiness.withoutPlan": "{count} firm bez aktywnego planu", "admin.readiness.withoutApiKeys": "{count} companies needing API key reissue", - "admin.readiness.linksAria": "Deep linki gotowości", - "admin.readiness.linkUsers": "Użytkownicy", + "admin.readiness.linksAria": "Deep linki gotowoÅ›ci", + "admin.readiness.linkUsers": "Użytkownicy", "admin.readiness.linkBilling": "Rozliczenia", "admin.readiness.linkSettings": "Ustawienia", "admin.readiness.linkApiKeys": "Keys needing reissue", "admin.diagnostics.eyebrow": "Platforma", "admin.diagnostics.title": "Diagnostyka", - "admin.diagnostics.description": "Konsola ops zdrowia aplikacji, głębokości kolejki, niedawnych zadań i flag konfiguracji. Sekrety i DSN nigdy nie są pokazywane; błędy zadań są oczyszczane.", + "admin.diagnostics.description": "Konsola ops zdrowia aplikacji, głębokoÅ›ci kolejki, niedawnych zadaÅ„ i flag konfiguracji. Sekrety i DSN nigdy nie sÄ… pokazywane; błędy zadaÅ„ sÄ… oczyszczane.", "admin.diagnostics.filterAria": "Filtr statusu zadania", "admin.diagnostics.queue": "Kolejka", - "admin.diagnostics.noJobsInQueue": "Brak zadań w kolejce.", - "admin.diagnostics.sanitizedErrors": "Oczyszczone błędy · maks. 25", + "admin.diagnostics.noJobsInQueue": "Brak zadaÅ„ w kolejce.", + "admin.diagnostics.sanitizedErrors": "Oczyszczone błędy · maks. 25", "admin.diagnostics.colId": "ID", "admin.diagnostics.colCompany": "Firma", "admin.diagnostics.colStatus": "Stan", - "admin.diagnostics.colProgress": "Postęp", + "admin.diagnostics.colProgress": "PostÄ™p", "admin.diagnostics.colUpdated": "Zaktualizowano", - "admin.diagnostics.colError": "Błąd", - "admin.diagnostics.colTicket": "Zgłoszenie", + "admin.diagnostics.colError": "Błąd", + "admin.diagnostics.colTicket": "ZgÅ‚oszenie", "admin.diagnostics.colWhen": "Kiedy", - "admin.diagnostics.noJobsFilter": "Brak zadań dla tego filtra.", + "admin.diagnostics.noJobsFilter": "Brak zadaÅ„ dla tego filtra.", "admin.stuck.title": "Zablokowane produkty", - "admin.stuck.description": "Przejrzyj niedawne zadania przetwarzania i zresetuj zablokowane dłużej niż 2 godziny", - "admin.stuck.noJobs": "Nie znaleziono zadań.", - "admin.stuck.filterAria": "Filtruj zadania według statusu", + "admin.stuck.description": "Przejrzyj niedawne zadania przetwarzania i zresetuj zablokowane dÅ‚użej niż 2 godziny", + "admin.stuck.noJobs": "Nie znaleziono zadaÅ„.", + "admin.stuck.filterAria": "Filtruj zadania wedÅ‚ug statusu", "admin.orphan.title": "Orphan processed", - "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", + "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", "admin.orphan.cutoverHint": "Safe by default: refresh and dry-run never delete. Confirm delete sends confirm=true only after you approve the dialog.", "admin.orphan.refreshReport": "Refresh report", "admin.orphan.dryRunBtn": "Dry-run cleanup", - "admin.orphan.deleteBtn": "Confirm delete…", + "admin.orphan.deleteBtn": "Confirm delete…", "admin.orphan.loadFailed": "Could not load orphan report", "admin.orphan.dryRunFailed": "Dry-run cleanup failed", "admin.orphan.deleteFailed": "Confirmed orphan cleanup failed", @@ -947,7 +947,7 @@ export const pl: MessageDict = { "admin.orphan.samplesDesc": "Up to 25 most recently updated orphan catalog rows", "admin.orphan.cleanBadge": "Clean", "admin.orphan.needsCleanupBadge": "Needs cleanup", - "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", + "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", "admin.orphan.noSamples": "No sample rows in this report.", "admin.orphan.colProcessed": "Processed ID", "admin.orphan.colCompany": "Company", @@ -962,35 +962,35 @@ export const pl: MessageDict = { "admin.orphan.confirmTitle": "Delete orphan processed rows?", "admin.orphan.confirmDesc": "This permanently deletes {total} processed_products row(s) whose raw is missing or unprocessed. Job product links use ON DELETE SET NULL.", "admin.orphan.confirmDelete": "Delete orphans", - "admin.billing.title": "Admin rozliczeń", - "admin.billing.description": "Zarządzaj planami, kredytami, uprawnieniami funkcji w pakietach i przełącznikami funkcji całej platformy.", + "admin.billing.title": "Admin rozliczeÅ„", + "admin.billing.description": "ZarzÄ…dzaj planami, kredytami, uprawnieniami funkcji w pakietach i przełącznikami funkcji caÅ‚ej platformy.", "admin.billing.noCompanies": "Nie znaleziono firm.", - "admin.billing.noCompaniesFilter": "Żadna firma nie pasuje do tego filtra.", + "admin.billing.noCompaniesFilter": "Å»adna firma nie pasuje do tego filtra.", "admin.billing.assignPlanTitle": "Przypisz plan", - "admin.billing.assignPlanDesc": "Dołącz plan rozliczeniowy do firmy. Opcjonalne kredyty próbne resetują saldo firmy na okres próbny.", + "admin.billing.assignPlanDesc": "Dołącz plan rozliczeniowy do firmy. Opcjonalne kredyty próbne resetujÄ… saldo firmy na okres próbny.", "admin.billing.creditsTitle": "Dodaj / dostosuj kredyty", - "admin.billing.creditsDesc": "Uznaj lub obciąż saldo firmy.", - "admin.billing.searchCompany": "Szukaj firmy…", + "admin.billing.creditsDesc": "Uznaj lub obciąż saldo firmy.", + "admin.billing.searchCompany": "Szukaj firmy…", "admin.knowledge.draft": "Szkic", "admin.knowledge.badge.draft": "Szkic", - "admin.knowledge.newArticle": "Nowy artykuł", - "admin.knowledge.editArticle": "Edytuj artykuł", - "admin.knowledge.noMatchingArticles": "Brak pasujących artykułów", - "admin.knowledge.noArticles": "Brak artykułów wiedzy", - "admin.knowledge.emptyCategoryMsg": "Kategoria „{category}” jest gotowa — dodaj szkielet artykułu do uzupełnienia przez agenta treści.", - "admin.knowledge.emptyArticlesMsg": "Dodaj szkielety FAQ z kategoriami i słowami kluczowymi. Zostaw placeholdery w treści dla agentów.", - "admin.knowledge.col.title": "Tytuł", + "admin.knowledge.newArticle": "Nowy artykuÅ‚", + "admin.knowledge.editArticle": "Edytuj artykuÅ‚", + "admin.knowledge.noMatchingArticles": "Brak pasujÄ…cych artykułów", + "admin.knowledge.noArticles": "Brak artykułów wiedzy", + "admin.knowledge.emptyCategoryMsg": "Kategoria „{category}” jest gotowa — dodaj szkielet artykuÅ‚u do uzupeÅ‚nienia przez agenta treÅ›ci.", + "admin.knowledge.emptyArticlesMsg": "Dodaj szkielety FAQ z kategoriami i sÅ‚owami kluczowymi. Zostaw placeholdery w treÅ›ci dla agentów.", + "admin.knowledge.col.title": "TytuÅ‚", "admin.knowledge.col.name": "Nazwa", "admin.knowledge.edit": "Edytuj", "admin.knowledge.newTemplate": "Nowy szablon", "admin.knowledge.editTemplate": "Edytuj szablon", "admin.knowledge.allCategories": "Wszystko", - "admin.settings.enablePlatformSmtp": "Włącz SMTP platformy", + "admin.settings.enablePlatformSmtp": "Włącz SMTP platformy", "admin.plans.title": "Plany subskrypcji", "admin.plans.description": "Publiczny ladder, A1 / Legacy, Platforma Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Ukryty.", - "admin.plans.searchPlaceholder": "Szukaj nazwy lub opisu…", - "admin.plans.searchAria": "Szukaj planów", - "admin.plans.filterAria": "Filtruj plany według widoczności", + "admin.plans.searchPlaceholder": "Szukaj nazwy lub opisu…", + "admin.plans.searchAria": "Szukaj planów", + "admin.plans.filterAria": "Filtruj plany wedÅ‚ug widocznoÅ›ci", "admin.plans.filter.catalog": "Katalog", "admin.plans.filter.public": "Publiczny", "admin.plans.filter.legacy": "Legacy", @@ -998,9 +998,9 @@ export const pl: MessageDict = { "admin.plans.filter.hidden": "Ukryte", "admin.plans.filter.all": "Wszystko", "admin.plans.col.plan": "Plan taryfowy", - "admin.plans.col.visibility": "Widoczność", - "admin.plans.col.monthlyCredits": "Miesięczne kredyty", - "admin.plans.col.maxProducts": "Maks. produktów", + "admin.plans.col.visibility": "Widoczność", + "admin.plans.col.monthlyCredits": "MiesiÄ™czne kredyty", + "admin.plans.col.maxProducts": "Maks. produktów", "admin.plans.col.term": "Okres", "admin.plans.customPackageFlag": "Flaga pakietu niestandardowego", "admin.plans.visibility.public": "Publiczny", @@ -1013,110 +1013,110 @@ export const pl: MessageDict = { "admin.plans.assignAria": "Przypisz {name}", "admin.plans.permissions": "Uprawnienia planu", "admin.plans.permissionsAria": "Edytuj uprawnienia planu for {name}", - "admin.plans.showing": "Wyświetlanie {filtered} z {total} planów", + "admin.plans.showing": "WyÅ›wietlanie {filtered} z {total} planów", "admin.plans.unlimited": "Bez limitu", - "admin.plans.optionLabel": "{name} ({credits} kredytów) · {kind}", + "admin.plans.optionLabel": "{name} ({credits} kredytów) · {kind}", "admin.permissions.noteStrong": "Tylko uprawnienia planu.", - "admin.permissions.noteBody": "These toggles set what this package may include. Platforma-wide on/wył. masters are on the {global} tab — a plan can enable a feature that still stays wył. when the platform switch is wyłączone.", - "admin.permissions.globalTab": "Przełączniki globalne", + "admin.permissions.noteBody": "These toggles set what this package may include. Platforma-wide on/wyÅ‚. masters are on the {global} tab — a plan can enable a feature that still stays wyÅ‚. when the platform switch is wyłączone.", + "admin.permissions.globalTab": "Przełączniki globalne", "admin.permissions.title": "Uprawnienia planu", - "admin.permissions.descCount": "{enabled}/{total} włączonych", + "admin.permissions.descCount": "{enabled}/{total} włączonych", "admin.permissions.matchesProfile": "pasuje do {profile}", "admin.permissions.customizedOverrides": "niestandardowe nadpisania", - "admin.permissions.planDefaults": "domyślne planu", + "admin.permissions.planDefaults": "domyÅ›lne planu", "admin.permissions.badge.legacy": "Zmigrowany pakiet legacy", "admin.permissions.badge.publicLadder": "Publiczny ladder", - "admin.permissions.badge.ladderCustom": "Publiczny ladder · niestandardowe flag", + "admin.permissions.badge.ladderCustom": "Publiczny ladder · niestandardowe flag", "admin.permissions.badge.customDeal": "Niestandardowe deal", "admin.permissions.badge.clientDeal": "Umowa z klientem", "admin.permissions.badge.customOverrides": "Niestandardowe overrides", - "admin.permissions.badge.defaults": "Domyślne", + "admin.permissions.badge.defaults": "DomyÅ›lne", "admin.permissions.badge.customFlag": "Niestandardowe flag", "admin.permissions.package": "Pakiet", - "admin.permissions.noPlans": "Brak planów", - "admin.permissions.suffix.legacy": "· legacy", - "admin.permissions.suffix.default": " · domyślne", - "admin.permissions.suffix.custom": " · niestandardowe", + "admin.permissions.noPlans": "Brak planów", + "admin.permissions.suffix.legacy": "· legacy", + "admin.permissions.suffix.default": " · domyÅ›lne", + "admin.permissions.suffix.custom": " · niestandardowe", "admin.permissions.section": "Sekcja", "admin.permissions.allSections": "Wszystkie sekcje", "admin.permissions.state": "Stan", "admin.permissions.stateAll": "Wszystko", - "admin.permissions.stateOn": "Włączone", - "admin.permissions.stateOff": "Wyłączone", - "admin.permissions.stateDiffers": "Różni się from default", + "admin.permissions.stateOn": "Włączone", + "admin.permissions.stateOff": "Wyłączone", + "admin.permissions.stateDiffers": "Różni siÄ™ from default", "admin.permissions.search": "Szukaj", - "admin.permissions.searchPlaceholder": "Filtruj według klucza lub etykiety", + "admin.permissions.searchPlaceholder": "Filtruj wedÅ‚ug klucza lub etykiety", "admin.permissions.profilesAria": "Profile funkcji planu", "admin.permissions.applyProfile": "Zastosuj profil", "admin.permissions.applyLegacy": "Zastosuj profil legacy", "admin.permissions.profilesHint": "One-click matrices for public ladder packages and migrated legacy navigation. Zapiszs overrides for the wybrane package only.", "admin.permissions.applyNamed": "Zastosuj {label}", "admin.permissions.applyGeneric": "Zastosuj profil", - "admin.permissions.enableAll": "Włącz wszystko", - "admin.permissions.disableAll": "Wyłącz wszystko", - "admin.permissions.clearOverrides": "Wyczyść nadpisania", - "admin.permissions.globallyOff": "Globally wył.", - "admin.permissions.enableSection": "Włącz sekcję", - "admin.permissions.disableSection": "Wyłącz sekcję", - "admin.permissions.noMatch": "Żadne funkcje nie pasują do bieżących filtrów.", - "admin.permissions.differs": "Różni się", - "admin.permissions.platformOffHint": "Wył. w całej platformie even if this plan enables it.", + "admin.permissions.enableAll": "Włącz wszystko", + "admin.permissions.disableAll": "Wyłącz wszystko", + "admin.permissions.clearOverrides": "Wyczyść nadpisania", + "admin.permissions.globallyOff": "Globally wyÅ‚.", + "admin.permissions.enableSection": "Włącz sekcjÄ™", + "admin.permissions.disableSection": "Wyłącz sekcjÄ™", + "admin.permissions.noMatch": "Å»adne funkcje nie pasujÄ… do bieżących filtrów.", + "admin.permissions.differs": "Różni siÄ™", + "admin.permissions.platformOffHint": "WyÅ‚. w caÅ‚ej platformie even if this plan enables it.", "admin.permissions.sectionToggled": "{label} {state} dla tego planu.", - "admin.permissions.state.enabled": "włączone", - "admin.permissions.state.disabled": "wyłączone", - "admin.permissions.loadFailed": "Nie udało się załadować uprawnienia planu", - "admin.permissions.saveFailed": "Nie udało się zapisać feature", - "admin.permissions.enableAllFailed": "Włącz wszystko nie powiodło się", - "admin.permissions.disableAllFailed": "Wyłącz wszystko nie powiodło się", - "admin.permissions.profileFailed": "Nie udało się apply profile", - "admin.permissions.resetFailed": "Nie udało się reset defaults", - "admin.permissions.sectionFailed": "Sekcja update nie powiodło się", + "admin.permissions.state.enabled": "włączone", + "admin.permissions.state.disabled": "wyłączone", + "admin.permissions.loadFailed": "Nie udaÅ‚o siÄ™ zaÅ‚adować uprawnienia planu", + "admin.permissions.saveFailed": "Nie udaÅ‚o siÄ™ zapisać feature", + "admin.permissions.enableAllFailed": "Włącz wszystko nie powiodÅ‚o siÄ™", + "admin.permissions.disableAllFailed": "Wyłącz wszystko nie powiodÅ‚o siÄ™", + "admin.permissions.profileFailed": "Nie udaÅ‚o siÄ™ apply profile", + "admin.permissions.resetFailed": "Nie udaÅ‚o siÄ™ reset defaults", + "admin.permissions.sectionFailed": "Sekcja update nie powiodÅ‚o siÄ™", "admin.profile.legacy.label": "Legacy", "admin.profile.legacy.description": "Migrated legacy navigation: catalog, feedy, rozliczenia, and ustawienia; no Wsteczground Tasks, sklepy, or marketing.", - "admin.profile.free.label": "Bezpłatny", - "admin.profile.free.description": "Publiczny Free ladder — AI, klucz APIs, live email, and own-key AI wył..", + "admin.profile.free.label": "BezpÅ‚atny", + "admin.profile.free.description": "Publiczny Free ladder — AI, klucz APIs, live email, and own-key AI wyÅ‚..", "admin.profile.starter.label": "Starter", - "admin.profile.starter.description": "Publiczny Starter — AI on; own-key AI wył..", + "admin.profile.starter.description": "Publiczny Starter — AI on; own-key AI wyÅ‚..", "admin.profile.growth.label": "Growth", - "admin.profile.growth.description": "Wszystkie funkcje katalogu włączone.", + "admin.profile.growth.description": "Wszystkie funkcje katalogu włączone.", "admin.profile.business.label": "Business", - "admin.profile.business.description": "Wszystkie funkcje katalogu włączone.", - "admin.profile.enterprise.label": "Enterprise / wszystko włączone", + "admin.profile.business.description": "Wszystkie funkcje katalogu włączone.", + "admin.profile.enterprise.label": "Enterprise / wszystko włączone", "admin.profile.enterprise.description": "Full macierz funkcji (custom and Enterprise default).", "admin.gates.noteStrong": "Platforma-wide masters.", - "admin.gates.noteBody": "Te przełączniki dotyczą każdego pakietu. Efektywny dostęp to {combo}. Uprawnienia per pakiet pozostają na karcie {permissions}.", + "admin.gates.noteBody": "Te przełączniki dotyczÄ… każdego pakietu. Efektywny dostÄ™p to {combo}. Uprawnienia per pakiet pozostajÄ… na karcie {permissions}.", "admin.gates.combo": "uprawnienie planu ORAZ sekcja globalna ORAZ funkcja globalna", "admin.gates.permissionsTab": "Uprawnienia planu", - "admin.gates.sectionsOff": "{count} section wył.", - "admin.gates.sectionsOffPlural": "{count} sections wył.", - "admin.gates.featuresOff": "{count} feature master wył.", - "admin.gates.featuresOffPlural": "{count} feature masters wył.", + "admin.gates.sectionsOff": "{count} section wyÅ‚.", + "admin.gates.sectionsOffPlural": "{count} sections wyÅ‚.", + "admin.gates.featuresOff": "{count} feature master wyÅ‚.", + "admin.gates.featuresOffPlural": "{count} feature masters wyÅ‚.", "admin.gates.title": "Globalne mastery funkcji", - "admin.gates.description": "Disable a feature here to turn it wył. for every package, even when a plan enables it.", + "admin.gates.description": "Disable a feature here to turn it wyÅ‚. for every package, even when a plan enables it.", "admin.gates.section": "Sekcja", "admin.gates.allSections": "Wszystkie sekcje", "admin.gates.search": "Szukaj", - "admin.gates.searchPlaceholder": "Filtruj według klucza lub etykiety", - "admin.gates.sectionOff": "Sekcja wył.", - "admin.gates.noMatch": "Żadne funkcje nie pasują do bieżących filtrów.", + "admin.gates.searchPlaceholder": "Filtruj wedÅ‚ug klucza lub etykiety", + "admin.gates.sectionOff": "Sekcja wyÅ‚.", + "admin.gates.noMatch": "Å»adne funkcje nie pasujÄ… do bieżących filtrów.", "admin.gates.featureAria": "{label} globalne", - "admin.gates.sectionsTitle": "Globalne przełączniki sekcji", - "admin.gates.sectionsDesc": "Turn an entire produkt area on or wył. for all packages. “Sekcja + features” also updates every feature master in that section.", + "admin.gates.sectionsTitle": "Globalne przełączniki sekcji", + "admin.gates.sectionsDesc": "Turn an entire produkt area on or wyÅ‚. for all packages. “Sekcja + features” also updates every feature master in that section.", "admin.gates.sectionAria": "Globalna sekcja {label}", - "admin.gates.enableSectionFeatures": "Włącz sekcję + funkcje", - "admin.gates.disableSectionFeatures": "Wyłącz sekcję + funkcje", - "admin.gates.sectionSuccess": "{label} {state} dla wszystkich pakietów.", - "admin.gates.sectionSuccessWithFeatures": "{label} {state} dla wszystkich pakietów (mastery sekcji i funkcji).", + "admin.gates.enableSectionFeatures": "Włącz sekcjÄ™ + funkcje", + "admin.gates.disableSectionFeatures": "Wyłącz sekcjÄ™ + funkcje", + "admin.gates.sectionSuccess": "{label} {state} dla wszystkich pakietów.", + "admin.gates.sectionSuccessWithFeatures": "{label} {state} dla wszystkich pakietów (mastery sekcji i funkcji).", "admin.gates.featureSuccess": "{key} {state} globalnie.", - "admin.gates.state.enabled": "włączone", - "admin.gates.state.disabled": "wyłączone", - "admin.gates.loadFailed": "Nie udało się załadować global feature switches", - "admin.gates.sectionFailed": "Nie udało się update global section", - "admin.gates.saveFailed": "Nie udało się zapisać global feature", - "admin.billing.createPlan": "Utwórz plan", + "admin.gates.state.enabled": "włączone", + "admin.gates.state.disabled": "wyłączone", + "admin.gates.loadFailed": "Nie udaÅ‚o siÄ™ zaÅ‚adować global feature switches", + "admin.gates.sectionFailed": "Nie udaÅ‚o siÄ™ update global section", + "admin.gates.saveFailed": "Nie udaÅ‚o siÄ™ zapisać global feature", + "admin.billing.createPlan": "Utwórz plan", "admin.billing.assignPlanBtn": "Przypisz plan", "admin.billing.stat.plans": "Plany", - "admin.billing.stat.catalogHidden": "{catalog} katalog · {hidden} ukryte", + "admin.billing.stat.catalogHidden": "{catalog} katalog · {hidden} ukryte", "admin.billing.stat.creditsAllocated": "Kredyty allocated", "admin.billing.stat.acrossCompanies": "Across firmy on this page (first 50)", "admin.billing.stat.creditsUsed": "Kredyty used", @@ -1125,13 +1125,13 @@ export const pl: MessageDict = { "admin.billing.stat.noActivePlanHint": "Firmy with no active subscription (this page)", "admin.billing.tab.plans": "Plany", "admin.billing.tab.permissions": "Uprawnienia planu", - "admin.billing.tab.global": "Przełączniki globalne", + "admin.billing.tab.global": "Przełączniki globalne", "admin.billing.tab.companies": "Firmy", "admin.billing.cyclesTitle": "Rozliczenia cycles", "admin.billing.cyclesDesc": "Process due renewals for firmy on scheduled cykle rozliczeniowe.", "admin.billing.runCycles": "Run due cykle rozliczeniowe", "admin.billing.companiesTitle": "Firmy", - "admin.billing.companiesDesc": "Salda kredytów i status planu — przypisz plany lub dostosuj kredyty.", + "admin.billing.companiesDesc": "Salda kredytów i status planu — przypisz plany lub dostosuj kredyty.", "admin.billing.searchCompaniesAria": "Szukaj firmy", "admin.billing.planStatusAria": "Status planu", "admin.billing.filter.all": "Wszystko firmy", @@ -1139,36 +1139,36 @@ export const pl: MessageDict = { "admin.billing.filter.withoutPlan": "Brak aktywnego planu", "admin.billing.col.company": "Firma", "admin.billing.col.planStatus": "Status planu", - "admin.billing.col.creditsRemaining": "Pozostałe kredyty", + "admin.billing.col.creditsRemaining": "PozostaÅ‚e kredyty", "admin.billing.col.total": "Razem", - "admin.billing.col.used": "Użyte", - "admin.billing.col.usagePct": "% użycia", + "admin.billing.col.used": "Użyte", + "admin.billing.col.usagePct": "% użycia", "admin.billing.badge.noPlan": "Brak planu", "admin.billing.badge.active": "Aktywny", "admin.billing.assignPlanAria": "Przypisz plan do {name}", "admin.billing.addCredits": "Dodaj kredyty", "admin.billing.addCreditsAria": "Dodaj credits for {name}", - "admin.billing.showingCompanies": "Wyświetlanie {filtered} z {total} firm", + "admin.billing.showingCompanies": "WyÅ›wietlanie {filtered} z {total} firm", "admin.billing.editPlanTitle": "Edytuj plan", - "admin.billing.createPlanTitle": "Utwórz plan", + "admin.billing.createPlanTitle": "Utwórz plan", "admin.billing.editPlanDesc": "Update credits, produkt caps, and whether this plan is marked custom.", - "admin.billing.createPlanDesc": "Utwórz a package. Niestandardowe plans stay hidden from public pricing.", + "admin.billing.createPlanDesc": "Utwórz a package. Niestandardowe plans stay hidden from public pricing.", "admin.billing.field.name": "Nazwa", "admin.billing.field.description": "Opis", "admin.billing.field.descriptionPlaceholder": "Opcjonalne short summary for admins", - "admin.billing.field.monthlyCredits": "Miesięczne kredyty", + "admin.billing.field.monthlyCredits": "MiesiÄ™czne kredyty", "admin.billing.field.yearlyCredits": "Roczne kredyty", - "admin.billing.field.maxProducts": "Maks. produktów", + "admin.billing.field.maxProducts": "Maks. produktów", "admin.billing.field.maxProductsPlaceholder": "Puste = bez limitu", "admin.billing.field.term": "Okres", - "admin.billing.term.monthly": "Miesięcznie", + "admin.billing.term.monthly": "MiesiÄ™cznie", "admin.billing.term.yearly": "Rocznie", "admin.billing.customPackage": "Niestandardowe package", - "admin.billing.customPackageHint": "Ukryty from public pricing. Use for client deals; leave wył. for Free–Business.", - "admin.billing.previewBadge": "Odznaka podglądu: {preview}.", + "admin.billing.customPackageHint": "Ukryty from public pricing. Use for client deals; leave wyÅ‚. for Free–Business.", + "admin.billing.previewBadge": "Odznaka podglÄ…du: {preview}.", "admin.billing.company": "Firma", "admin.billing.selectCompany": "Wybierz firma", - "admin.billing.noPlanSuffix": "· no plan", + "admin.billing.noPlanSuffix": "· no plan", "admin.billing.plan": "Plan taryfowy", "admin.billing.selectPlan": "Wybierz plan", "admin.billing.trialAssignment": "Przypisanie trial", @@ -1176,40 +1176,40 @@ export const pl: MessageDict = { "admin.billing.trialCredits": "Kredyty trial", "admin.billing.assign": "Przypisz", "admin.billing.amount": "Kwota", - "admin.billing.amountHint": "Użyj wartości ujemnej, aby obciążyć.", + "admin.billing.amountHint": "Użyj wartoÅ›ci ujemnej, aby obciążyć.", "admin.billing.apply": "Zastosuj", "admin.billing.planUpdated": "Zaktualizowano: Plan.", "admin.billing.planCreated": "Utworzono: Plan.", - "admin.billing.loadFailed": "Nie udało się załadować rozliczenia data", - "admin.billing.updateFailed": "Update plan nie powiodło się", - "admin.billing.createFailed": "Utwórz plan nie powiodło się", - "admin.billing.assignFailed": "Assign nie powiodło się", - "admin.billing.creditsFailed": "Add credits nie powiodło się", - "admin.billing.cyclesFailed": "Run cycles nie powiodło się", + "admin.billing.loadFailed": "Nie udaÅ‚o siÄ™ zaÅ‚adować rozliczenia data", + "admin.billing.updateFailed": "Update plan nie powiodÅ‚o siÄ™", + "admin.billing.createFailed": "Utwórz plan nie powiodÅ‚o siÄ™", + "admin.billing.assignFailed": "Assign nie powiodÅ‚o siÄ™", + "admin.billing.creditsFailed": "Add credits nie powiodÅ‚o siÄ™", + "admin.billing.cyclesFailed": "Run cycles nie powiodÅ‚o siÄ™", "admin.knowledge.supportInbox": "Wsparcie inbox", "admin.knowledge.aiRoles": "Role AI", - "admin.knowledge.tab.articles": "Artykuły", + "admin.knowledge.tab.articles": "ArtykuÅ‚y", "admin.knowledge.tab.templates": "Szablony", "admin.knowledge.tab.settings": "Autoresponder", "admin.knowledge.allStatuses": "Wszystko statuses", "admin.knowledge.published": "Opublikowano", - "admin.knowledge.createArticle": "Utwórz article", + "admin.knowledge.createArticle": "Utwórz article", "admin.knowledge.col.categories": "Kategorie", "admin.knowledge.col.status": "Stan", - "admin.knowledge.col.keywords": "Słowa kluczowe", + "admin.knowledge.col.keywords": "SÅ‚owa kluczowe", "admin.knowledge.badge.published": "Opublikowano", - "admin.knowledge.createTemplate": "Utwórz template", + "admin.knowledge.createTemplate": "Utwórz template", "admin.knowledge.badge.active": "Aktywny", "admin.knowledge.badge.inactive": "Nieaktywny", - "admin.knowledge.autoFirstResponses": "Włącz automatyczne pierwsze odpowiedzi", + "admin.knowledge.autoFirstResponses": "Włącz automatyczne pierwsze odpowiedzi", "admin.knowledge.faqMatching": "Dopasowanie FAQ / szablonu", - "admin.knowledge.retryOnReply": "Ponów on first customer reply (if no prior auto)", - "admin.knowledge.matchThreshold": "Próg pewności dopasowania", - "admin.knowledge.enableAiFallback": "Włącz zapas AI", + "admin.knowledge.retryOnReply": "Ponów on first customer reply (if no prior auto)", + "admin.knowledge.matchThreshold": "Próg pewnoÅ›ci dopasowania", + "admin.knowledge.enableAiFallback": "Włącz zapas AI", "admin.knowledge.deliveryMode": "Tryb dostawy", - "admin.knowledge.delivery.draft": "Tylko szkic (notatka wewnętrzna)", - "admin.knowledge.delivery.autoSend": "Automatyczne wysyłanie do klienta", - "admin.knowledge.aiThreshold": "Próg pewności AI", + "admin.knowledge.delivery.draft": "Tylko szkic (notatka wewnÄ™trzna)", + "admin.knowledge.delivery.autoSend": "Automatyczne wysyÅ‚anie do klienta", + "admin.knowledge.aiThreshold": "Próg pewnoÅ›ci AI", "admin.knowledge.usePlatformRole": "Use platform wsparcie AI role (recommended)", "admin.knowledge.modelOverride": "Nadpisanie modelu", "admin.knowledge.providerOverride": "Dostawca override", @@ -1217,89 +1217,89 @@ export const pl: MessageDict = { "admin.knowledge.supportAiRoleTitle": "Wsparcie AI role (fallback provider)", "admin.knowledge.configured": "Skonfigurowane", "admin.knowledge.notReadyBadge": "Niegotowe", - "admin.knowledge.enabled": "Włączone", - "admin.knowledge.disabled": "Wyłączone", - "admin.knowledge.openAiRoles": "Otwórz Platforma ustawienia → AI roles", - "admin.knowledge.field.title": "Tytuł", + "admin.knowledge.enabled": "Włączone", + "admin.knowledge.disabled": "Wyłączone", + "admin.knowledge.openAiRoles": "Otwórz Platforma ustawienia → AI roles", + "admin.knowledge.field.title": "TytuÅ‚", "admin.knowledge.field.slug": "Slug", - "admin.knowledge.field.body": "Treść (markdown)", - "admin.knowledge.field.keywords": "Słowa kluczowe", + "admin.knowledge.field.body": "Treść (markdown)", + "admin.knowledge.field.keywords": "SÅ‚owa kluczowe", "admin.knowledge.keywordsPlaceholder": "rozdzielone przecinkami", "admin.knowledge.field.intents": "Klucze intencji", "admin.knowledge.intentsPlaceholder": "rozdzielone przecinkami", "admin.knowledge.field.categories": "Kategoria slugs", - "admin.knowledge.categoriesPlaceholder": "rozliczenia, account…", + "admin.knowledge.categoriesPlaceholder": "rozliczenia, account…", "admin.knowledge.field.weight": "Waga priorytetu", - "admin.knowledge.publishedEligible": "Opublikowano (kwalifikuje się do dopasowania)", + "admin.knowledge.publishedEligible": "Opublikowano (kwalifikuje siÄ™ do dopasowania)", "admin.knowledge.field.name": "Nazwa", - "admin.knowledge.field.templateBody": "Treść", + "admin.knowledge.field.templateBody": "Treść", "admin.knowledge.active": "Aktywny", "admin.settings.card.aiRolesTitle": "Platforma AI roles", - "admin.settings.card.aiRolesDesc": "Przetwarzanie, vectorization, docs/API, and wsparcie — separate keys/models", - "admin.settings.roleOff": " (wył.)", - "admin.settings.roleNotSet": "· not set", - "admin.settings.someRolesUnavailable": "Some AI roles are not dostępne on this deployment yet. Przetwarzanie still uses the platform OtwórzAI ustawienia until all roles are wsparcieed.", + "admin.settings.card.aiRolesDesc": "Przetwarzanie, vectorization, docs/API, and wsparcie — separate keys/models", + "admin.settings.roleOff": " (wyÅ‚.)", + "admin.settings.roleNotSet": "· not set", + "admin.settings.someRolesUnavailable": "Some AI roles are not dostÄ™pne on this deployment yet. Przetwarzanie still uses the platform OtwórzAI ustawienia until all roles are wsparcieed.", "admin.settings.configure": "Konfiguruj", "admin.settings.card.smtpTitle": "Platforma SMTP", "admin.settings.configured": "Skonfigurowane", "admin.settings.notConfigured": "Nieskonfigurowane", - "admin.settings.source": "źródło: {source}", - "admin.settings.smtpEnabled": "SMTP włączone", - "admin.settings.smtpDisabled": "SMTP wyłączone", - "admin.settings.passwordSet": "· password set", + "admin.settings.source": "źródÅ‚o: {source}", + "admin.settings.smtpEnabled": "SMTP włączone", + "admin.settings.smtpDisabled": "SMTP wyłączone", + "admin.settings.passwordSet": "· password set", "admin.settings.card.otherTitle": "Inne integracje", "admin.settings.oauthSet": "Google OAuth ustawione", - "admin.settings.oauthOff": "Google OAuth wył.", - "admin.settings.eprelOn": "EPREL włączone", - "admin.settings.eprelOff": "EPREL wył.", + "admin.settings.oauthOff": "Google OAuth wyÅ‚.", + "admin.settings.eprelOn": "EPREL włączone", + "admin.settings.eprelOff": "EPREL wyÅ‚.", "admin.settings.pineconeSet": "Pinecone ustawione", - "admin.settings.pineconeOff": "Pinecone wył.", + "admin.settings.pineconeOff": "Pinecone wyÅ‚.", "admin.settings.stripeSet": "Stripe ustawione", - "admin.settings.stripeOff": "Stripe wył.", - "admin.settings.password": "Hasło", - "admin.settings.passwordSavedHint": "(zapisano — leave blank to keep)", + "admin.settings.stripeOff": "Stripe wyÅ‚.", + "admin.settings.password": "HasÅ‚o", + "admin.settings.passwordSavedHint": "(zapisano — leave blank to keep)", "admin.settings.secretKey": "Klucz tajny", - "admin.settings.secretConfiguredHint": "(skonfigurowane — zostaw puste, aby zachować)", - "admin.settings.passwordConfigured": "Hasło configured", - "admin.settings.noSmtpPassword": "Brak hasła SMTP", - "admin.settings.enabled": "Włączone", - "admin.settings.disabled": "Wyłączone", + "admin.settings.secretConfiguredHint": "(skonfigurowane — zostaw puste, aby zachować)", + "admin.settings.passwordConfigured": "HasÅ‚o configured", + "admin.settings.noSmtpPassword": "Brak hasÅ‚a SMTP", + "admin.settings.enabled": "Włączone", + "admin.settings.disabled": "Wyłączone", "admin.settings.saveRole": "Zapisz {label}", - "admin.settings.testConnection": "Testuj połączenie", + "admin.settings.testConnection": "Testuj połączenie", "admin.settings.saveMail": "Zapisz mail ustawienia", "admin.settings.saveIntegrations": "Zapisz integrations", - "admin.settings.eprelEnabled": "EPREL enrichment włączone", - "admin.settings.loadFailed": "Platforma ustawienia could not be loaded. Saving is wyłączone until reload succeeds.", - "admin.settings.testAccepted": "Wiadomość testowa przyjęta przez SMTP", - "admin.stuck.cleanupBtn": "Czyszczenie zablokowanych zadań (>2 godz. działania)", + "admin.settings.eprelEnabled": "EPREL enrichment włączone", + "admin.settings.loadFailed": "Platforma ustawienia could not be loaded. Saving is wyłączone until reload succeeds.", + "admin.settings.testAccepted": "Wiadomość testowa przyjÄ™ta przez SMTP", + "admin.stuck.cleanupBtn": "Czyszczenie zablokowanych zadaÅ„ (>2 godz. dziaÅ‚ania)", "admin.stuck.jobsTitle": "Zadania przetwarzania", - "admin.stuck.jobsDesc": "Ostatnie 100 zadań · {running} obecnie działa", + "admin.stuck.jobsDesc": "Ostatnie 100 zadaÅ„ · {running} obecnie dziaÅ‚a", "admin.stuck.filterAll": "Wszystko", "admin.stuck.filterRunning": "Uruchomione", "admin.stuck.filterFailed": "Niepowodzenie", - "admin.stuck.filterPending": "Oczekujące", - "admin.stuck.filterCompleted": "Ukończone", + "admin.stuck.filterPending": "OczekujÄ…ce", + "admin.stuck.filterCompleted": "UkoÅ„czone", "admin.stuck.colId": "ID", "admin.stuck.colCompany": "Firma", "admin.stuck.colStatus": "Stan", - "admin.stuck.colProgress": "Postęp", + "admin.stuck.colProgress": "PostÄ™p", "admin.stuck.colUpdated": "Zaktualizowano", - "admin.stuck.colError": "Błąd", - "admin.stuck.loadFailed": "Nie udało się wczytać zadań", - "admin.stuck.cleanupFailed": "Czyszczenie nie powiodło się", - "admin.support.knowledgeLink": "Baza wiedzy i auto-odpowiedź", - "admin.support.queueTitle": "Kolejka zgłoszeń", - "admin.support.queueMeta": "{total} · zakres {scope}", - "admin.support.queueMetaStatus": "· status {status}", - "admin.support.ticketCountOne": "{count} zgłoszenie", - "admin.support.ticketCountMany": "{count} zgłoszenia", + "admin.stuck.colError": "Błąd", + "admin.stuck.loadFailed": "Nie udaÅ‚o siÄ™ wczytać zadaÅ„", + "admin.stuck.cleanupFailed": "Czyszczenie nie powiodÅ‚o siÄ™", + "admin.support.knowledgeLink": "Baza wiedzy i auto-odpowiedź", + "admin.support.queueTitle": "Kolejka zgÅ‚oszeÅ„", + "admin.support.queueMeta": "{total} · zakres {scope}", + "admin.support.queueMetaStatus": "· status {status}", + "admin.support.ticketCountOne": "{count} zgÅ‚oszenie", + "admin.support.ticketCountMany": "{count} zgÅ‚oszenia", "admin.support.statusAll": "Wszystko statuses", - "admin.support.scopeAll": "Wszystko zgłoszenia", + "admin.support.scopeAll": "Wszystko zgÅ‚oszenia", "admin.support.scopeInbox": "Skrzynka", "admin.support.scopeMine": "Moje", "admin.support.scopeUnassigned": "Nieprzypisane", "admin.support.flagAny": "Dowolny stan auto", - "admin.support.flagNeedsHuman": "Potrzebny człowiek", + "admin.support.flagNeedsHuman": "Potrzebny czÅ‚owiek", "admin.support.flagAiDraft": "Szkic IA", "admin.support.colSubject": "Temat", "admin.support.colStatus": "Stan", @@ -1309,1262 +1309,1263 @@ export const pl: MessageDict = { "admin.support.colCompany": "Firma", "admin.support.colUpdated": "Zaktualizowano", "admin.support.colActions": "Akcje", - "admin.support.autoOff": "Auto wyłączone", + "admin.support.autoOff": "Auto wyłączone", "admin.support.claim": "Przejmij", - "admin.support.claimAria": "Przejmij zgłoszenie {subject}", + "admin.support.claimAria": "Przejmij zgÅ‚oszenie {subject}", "admin.support.unassigned": "Nieprzypisane", "admin.support.you": "Ty", "admin.support.assigned": "Przypisano", - "admin.support.loadQueueFailed": "Nie udało się wczytać kolejki wsparcia", - "admin.support.claimFailed": "Nie udało się przejąć zgłoszenia", - "admin.support.ticketFallbackTitle": "Wsparcie zgłoszenie", - "admin.support.ticketMeta": "{company} · {requester}", - "admin.support.ticketMetaFallback": "Wątek przeglądu personelu", + "admin.support.loadQueueFailed": "Nie udaÅ‚o siÄ™ wczytać kolejki wsparcia", + "admin.support.claimFailed": "Nie udaÅ‚o siÄ™ przejąć zgÅ‚oszenia", + "admin.support.ticketFallbackTitle": "Wsparcie zgÅ‚oszenie", + "admin.support.ticketMeta": "{company} · {requester}", + "admin.support.ticketMetaFallback": "WÄ…tek przeglÄ…du personelu", "admin.support.companyFallback": "Firma", - "admin.support.requesterFallback": "zgłaszający", + "admin.support.requesterFallback": "zgÅ‚aszajÄ…cy", "admin.support.backQueue": "Kolejka", - "admin.support.resolve": "Rozwiąż", - "admin.support.markPending": "Oznacz jako oczekujące", - "admin.support.reopen": "Otwórz ponownie", + "admin.support.resolve": "Rozwiąż", + "admin.support.markPending": "Oznacz jako oczekujÄ…ce", + "admin.support.reopen": "Otwórz ponownie", "admin.support.assigneeLabel": "Przypisany:", "admin.support.unassign": "Cofnij przypisanie", "admin.support.assignToStaff": "Przypisz do personelu", "admin.support.apply": "Zastosuj", "admin.support.autoPanelTitle": "Auto-match / asysta IA", - "admin.support.autoPanelDesc": "Wynik tylko dla personelu: dopasowanie FAQ i szkic/wysyłka IA. Klienci nigdy nie widzą szkiców.", - "admin.support.autoDisabledBadge": "Auto wyłączone", + "admin.support.autoPanelDesc": "Wynik tylko dla personelu: dopasowanie FAQ i szkic/wysyÅ‚ka IA. Klienci nigdy nie widzÄ… szkiców.", + "admin.support.autoDisabledBadge": "Auto wyłączone", "admin.support.autoStatusLabel": "Stan:", - "admin.support.lastAttempt": "Ostatnia próba:", - "admin.support.reenableAuto": "Włącz ponownie auto", - "admin.support.disableAuto": "Wyłącz auto dla tego zgłoszenia", - "admin.support.aiDraftTitle": "Szkic IA (zatwierdź lub edytuj)", - "admin.support.aiDraftDesc": "Tryb tylko-szkic zostawił notatkę wewnętrzną. Edytuj w razie potrzeby, wyślij do klienta — albo odrzuć i przejmij ręcznie.", - "admin.support.confidence": "Pewność {value}", - "admin.support.statusAfterSend": "Status po wysłaniu", - "admin.support.approveSend": "Zatwierdź i wyślij", - "admin.support.discardDraft": "Odrzuć szkic", - "admin.support.threadTitle": "Wątek", - "admin.support.threadMeta": "{count} · ostatnia aktywność {when}", - "admin.support.messageCountOne": "{count} wiadomość", - "admin.support.messageCountMany": "{count} wiadomości", + "admin.support.lastAttempt": "Ostatnia próba:", + "admin.support.reenableAuto": "Włącz ponownie auto", + "admin.support.disableAuto": "Wyłącz auto dla tego zgÅ‚oszenia", + "admin.support.aiDraftTitle": "Szkic IA (zatwierdź lub edytuj)", + "admin.support.aiDraftDesc": "Tryb tylko-szkic zostawiÅ‚ notatkÄ™ wewnÄ™trznÄ…. Edytuj w razie potrzeby, wyÅ›lij do klienta — albo odrzuć i przejmij rÄ™cznie.", + "admin.support.confidence": "Pewność {value}", + "admin.support.statusAfterSend": "Status po wysÅ‚aniu", + "admin.support.approveSend": "Zatwierdź i wyÅ›lij", + "admin.support.discardDraft": "Odrzuć szkic", + "admin.support.threadTitle": "WÄ…tek", + "admin.support.threadMeta": "{count} · ostatnia aktywność {when}", + "admin.support.messageCountOne": "{count} wiadomość", + "admin.support.messageCountMany": "{count} wiadomoÅ›ci", "admin.support.replyTitle": "Odpowiedz", - "admin.support.replyDesc": "Publiczne odpowiedzi powiadamiają klienta. Notatki wewnętrzne zostają tylko dla personelu. Domyślny status po publicznej odpowiedzi to oczekujące.", - "admin.support.internalNote": "Notatka wewnętrzna (niewidoczna dla klienta)", + "admin.support.replyDesc": "Publiczne odpowiedzi powiadamiajÄ… klienta. Notatki wewnÄ™trzne zostajÄ… tylko dla personelu. DomyÅ›lny status po publicznej odpowiedzi to oczekujÄ…ce.", + "admin.support.internalNote": "Notatka wewnÄ™trzna (niewidoczna dla klienta)", "admin.support.setStatus": "Ustaw status", - "admin.support.statusDefault": "Domyślny", - "admin.support.saveNote": "Zapisz notatkę", - "admin.support.sendReply": "Wyślij odpowiedź", - "admin.support.replyAndResolve": "Odpowiedz i rozwiąż", - "admin.support.closedBanner": "To zgłoszenie jest zamknięte. Otwórz je ponownie, aby kontynuować.", + "admin.support.statusDefault": "DomyÅ›lny", + "admin.support.saveNote": "Zapisz notatkÄ™", + "admin.support.sendReply": "WyÅ›lij odpowiedź", + "admin.support.replyAndResolve": "Odpowiedz i rozwiąż", + "admin.support.closedBanner": "To zgÅ‚oszenie jest zamkniÄ™te. Otwórz je ponownie, aby kontynuować.", "admin.support.priorityMeta": "priorytet {priority}", "admin.support.authorAiDraft": "Szkic IA (tylko personel)", - "admin.support.authorInternal": "Notatka wewnętrzna", + "admin.support.authorInternal": "Notatka wewnÄ™trzna", "admin.support.authorStaff": "Personel", "admin.support.authorCustomer": "Klient", - "admin.support.flash.noteSaved": "Notatka wewnętrzna zapisana.", - "admin.support.flash.replySent": "Odpowiedź wysłana.", - "admin.support.flash.resolved": "Zgłoszenie oznaczone jako rozwiązane.", - "admin.support.flash.pending": "Zgłoszenie oznaczone jako oczekujące (oczekuje na klienta).", - "admin.support.flash.reopened": "Zgłoszenie otwarte ponownie.", - "admin.support.flash.statusSet": "Status zgłoszenia ustawiony na {status}.", - "admin.support.flash.autoDisabled": "Automatyczne odpowiedzi wyłączone dla tego zgłoszenia.", - "admin.support.flash.autoEnabled": "Automatyczne odpowiedzi ponownie włączone dla tego zgłoszenia.", - "admin.support.loadTicketFailed": "Nie udało się wczytać zgłoszenia", - "admin.support.replyFailed": "Nie udało się wysłać odpowiedzi", - "admin.support.statusFailed": "Nie udało się zaktualizować statusu", - "admin.support.unassignFailed": "Nie udało się cofnąć przypisania", - "admin.support.assignFailed": "Nie udało się przypisać zgłoszenia", - "admin.support.autoFailed": "Nie udało się zaktualizować auto-odpowiedzi", - "admin.support.approveFailed": "Nie udało się zatwierdzić szkicu IA", - "admin.support.discardFailed": "Nie udało się odrzucić szkicu IA", - "admin.settings.sourceResolved": "Rozwiązane z {sources}", - "admin.settings.sourceUpdated": " · zaktualizowano {when}", + "admin.support.flash.noteSaved": "Notatka wewnÄ™trzna zapisana.", + "admin.support.flash.replySent": "Odpowiedź wysÅ‚ana.", + "admin.support.flash.resolved": "ZgÅ‚oszenie oznaczone jako rozwiÄ…zane.", + "admin.support.flash.pending": "ZgÅ‚oszenie oznaczone jako oczekujÄ…ce (oczekuje na klienta).", + "admin.support.flash.reopened": "ZgÅ‚oszenie otwarte ponownie.", + "admin.support.flash.statusSet": "Status zgÅ‚oszenia ustawiony na {status}.", + "admin.support.flash.autoDisabled": "Automatyczne odpowiedzi wyłączone dla tego zgÅ‚oszenia.", + "admin.support.flash.autoEnabled": "Automatyczne odpowiedzi ponownie włączone dla tego zgÅ‚oszenia.", + "admin.support.loadTicketFailed": "Nie udaÅ‚o siÄ™ wczytać zgÅ‚oszenia", + "admin.support.replyFailed": "Nie udaÅ‚o siÄ™ wysÅ‚ać odpowiedzi", + "admin.support.statusFailed": "Nie udaÅ‚o siÄ™ zaktualizować statusu", + "admin.support.unassignFailed": "Nie udaÅ‚o siÄ™ cofnąć przypisania", + "admin.support.assignFailed": "Nie udaÅ‚o siÄ™ przypisać zgÅ‚oszenia", + "admin.support.autoFailed": "Nie udaÅ‚o siÄ™ zaktualizować auto-odpowiedzi", + "admin.support.approveFailed": "Nie udaÅ‚o siÄ™ zatwierdzić szkicu IA", + "admin.support.discardFailed": "Nie udaÅ‚o siÄ™ odrzucić szkicu IA", + "admin.settings.sourceResolved": "RozwiÄ…zane z {sources}", + "admin.settings.sourceUpdated": " · zaktualizowano {when}", "admin.settings.updatedAt": "Zaktualizowano {when}", - "admin.settings.tenantDesc": "Klucze IA i e-mail marketingowy firmy pozostają w Integracjach. Sekrety sesji i szyfrowania zostają w środowisku serwera i nie są tu edytowane.", - "admin.settings.perCompanyAiEmail": "IA/e-mail per firmę —", - "admin.settings.plansCredits": "Plany i kredyty —", + "admin.settings.tenantDesc": "Klucze IA i e-mail marketingowy firmy pozostajÄ… w Integracjach. Sekrety sesji i szyfrowania zostajÄ… w Å›rodowisku serwera i nie sÄ… tu edytowane.", + "admin.settings.perCompanyAiEmail": "IA/e-mail per firmÄ™ —", + "admin.settings.plansCredits": "Plany i kredyty —", "admin.settings.fromDatabase": "Z bazy danych", - "admin.settings.fromEnvironment": "Ze środowiska", - "admin.settings.sourceBadge": "Źródło: {source}", + "admin.settings.fromEnvironment": "Ze Å›rodowiska", + "admin.settings.sourceBadge": "ŹródÅ‚o: {source}", "admin.settings.storedKey": "Zapisany klucz: {masked}", - "admin.settings.enableRole": "Włącz tę rolę", - "admin.settings.clearApiKey": "Wyczyść zapisany klucz API", - "admin.settings.apiKeyKeepPlaceholder": "•••• zostaw puste, by zachować", - "admin.settings.apiKeyNewPlaceholder": "sk-… lub lokalny", + "admin.settings.enableRole": "Włącz tÄ™ rolÄ™", + "admin.settings.clearApiKey": "Wyczyść zapisany klucz API", + "admin.settings.apiKeyKeepPlaceholder": "•••• zostaw puste, by zachować", + "admin.settings.apiKeyNewPlaceholder": "sk-… lub lokalny", "admin.settings.smtpCardTitle": "Platforma SMTP", - "admin.settings.smtpCardDesc": "Używane do zaproszeń set-password i wychodzącej poczty platformy. Marketing Resend/SMTP pozostaje per firmę w Integracje → E-mail.", - "admin.settings.smtpBadgeOn": "SMTP włączone", - "admin.settings.smtpBadgeOff": "SMTP wyłączone", - "admin.settings.enableSmtp": "Włącz SMTP platformy", - "admin.settings.storedPassword": "Zapisane hasło: {masked}", - "admin.settings.clearSmtpPassword": "Wyczyść zapisane hasło SMTP", - "admin.settings.sendTestEmail": "Wyślij e-mail testowy", - "admin.settings.enableGoogle": "Włącz Google OAuth", + "admin.settings.smtpCardDesc": "Używane do zaproszeÅ„ set-password i wychodzÄ…cej poczty platformy. Marketing Resend/SMTP pozostaje per firmÄ™ w Integracje → E-mail.", + "admin.settings.smtpBadgeOn": "SMTP włączone", + "admin.settings.smtpBadgeOff": "SMTP wyłączone", + "admin.settings.enableSmtp": "Włącz SMTP platformy", + "admin.settings.storedPassword": "Zapisane hasÅ‚o: {masked}", + "admin.settings.clearSmtpPassword": "Wyczyść zapisane hasÅ‚o SMTP", + "admin.settings.sendTestEmail": "WyÅ›lij e-mail testowy", + "admin.settings.enableGoogle": "Włącz Google OAuth", "admin.settings.clientSecret": "Sekret klienta", - "admin.settings.leaveBlankKeep": "(zostaw puste, by zachować)", + "admin.settings.leaveBlankKeep": "(zostaw puste, by zachować)", "admin.settings.storedSecret": "Zapisany sekret: {masked}", - "admin.settings.clearClientSecret": "Wyczyść zapisany sekret klienta", - "admin.settings.eprelDesc": "Bezpłatne publiczne dane etykiet energetycznych UE podczas przetwarzania. Domyślnie włączone dla wszystkich planów — bez aktywacji ani płatnego upgrade’u. Użyj kontrolek tylko do wyłączenia lub dostrojenia klienta.", + "admin.settings.clearClientSecret": "Wyczyść zapisany sekret klienta", + "admin.settings.eprelDesc": "BezpÅ‚atne publiczne dane etykiet energetycznych UE podczas przetwarzania. DomyÅ›lnie włączone dla wszystkich planów — bez aktywacji ani pÅ‚atnego upgrade’u. Użyj kontrolek tylko do wyłączenia lub dostrojenia klienta.", "admin.settings.optionalKeySaved": "Opcjonalny klucz API zapisany", "admin.settings.noApiKeyNeeded": "Klucz API nie jest wymagany", "admin.settings.optionalApiKey": "Opcjonalny klucz API", - "admin.settings.optionalApiKeySavedHint": "(zapisano — leave blank to keep)", - "admin.settings.optionalApiKeyPublicHint": "(publiczne API działa bez niej)", - "admin.settings.clearEprelKey": "Wyczyść zapisany klucz API EPREL", - "admin.settings.pineconeDesc": "Opcjonalne sugestie kategorii wektorowych podczas przetwarzania. Wartości środowiska hosta są używane, gdy te pola pozostaną puste.", + "admin.settings.optionalApiKeySavedHint": "(zapisano — leave blank to keep)", + "admin.settings.optionalApiKeyPublicHint": "(publiczne API dziaÅ‚a bez niej)", + "admin.settings.clearEprelKey": "Wyczyść zapisany klucz API EPREL", + "admin.settings.pineconeDesc": "Opcjonalne sugestie kategorii wektorowych podczas przetwarzania. WartoÅ›ci Å›rodowiska hosta sÄ… używane, gdy te pola pozostanÄ… puste.", "admin.settings.apiKeyConfigured": "Klucz API skonfigurowany", "admin.settings.noApiKey": "Brak klucza API", "admin.settings.apiKeyLabel": "Klucz API", - "admin.settings.clearPineconeKey": "Wyczyść zapisany klucz API Pinecone", - "admin.settings.stripeDesc": "Opcjonalne nadpisania konfiguracji Stripe serwera. Preferuj pola hasła; wartości nie są ponownie pokazywane po zapisie.", - "admin.settings.stripeMock": "Wymuś tryb mock Stripe (tylko poza produkcją — wyłącza prawdziwe obciążenia)", + "admin.settings.clearPineconeKey": "Wyczyść zapisany klucz API Pinecone", + "admin.settings.stripeDesc": "Opcjonalne nadpisania konfiguracji Stripe serwera. Preferuj pola hasÅ‚a; wartoÅ›ci nie sÄ… ponownie pokazywane po zapisie.", + "admin.settings.stripeMock": "WymuÅ› tryb mock Stripe (tylko poza produkcjÄ… — wyłącza prawdziwe obciążenia)", "admin.settings.webhookSecret": "Sekret webhooka", - "admin.settings.clearStripeSecret": "Wyczyść tajny klucz Stripe", - "admin.settings.clearStripeWebhook": "Wyczyść sekret webhooka Stripe", - "admin.settings.feedAllowlistDesc": "Hosty/CIDR oddzielone przecinkami dozwolone dla prywatnych URL feedów.", - "admin.settings.adminsDesc": "Administratorzy platformy w tym wdrożeniu", - "admin.settings.onboardingTitle": "Pomoc onboarding adminów", - "admin.settings.onboardingDesc": "Użyj e-maili zaproszeń set-password, by wdrożyć uprawnionych użytkowników bez hasła.", - "admin.settings.sendInvites": "Wyślij e-maile set-password", - "admin.settings.adminStatusBefore": "Adminów platformy nie można tworzyć z tego ekranu. Potwierdź dostęp na", - "admin.settings.adminStatusAfter": " albo poproś istniejącego admina/ops o awans konta.", - "admin.settings.loadUsersFailed": "Nie udało się wczytać użytkowników admin", - "admin.settings.sendFailed": "Wysyłanie nie powiodło się", - "admin.settings.saveMailFailed": "Nie udało się zapisać ustawień poczty", - "admin.settings.smtpNotConfigured": "SMTP nie jest skonfigurowany — najpierw włącz i zapisz ustawienia poczty.", - "admin.settings.smtpTestFailed": "Test SMTP nie powiódł się", - "admin.settings.testEmailFailed": "Nie udało się wysłać e-maila testowego", - "admin.settings.saveIntegrationFailed": "Nie udało się zapisać ustawień integracji", - "admin.settings.aiSaved": "Zapisano ustawienia AI {label}. Klucze API nie są już pokazywane.", - "admin.settings.aiSaveFailed": "Nie udało się zapisać ustawień IA {label}", - "admin.settings.aiTestOk": "{label}: połączenie OK", - "admin.settings.aiTestSkipped": "{label}: pominięto — zapisz dane (i włącz rolę), aby przetestować.", - "admin.settings.aiTestFailed": "{label}: połączenie nieudane", - "admin.settings.aiTestError": "Nie udało się przetestować połączenia {label}", + "admin.settings.clearStripeSecret": "Wyczyść tajny klucz Stripe", + "admin.settings.clearStripeWebhook": "Wyczyść sekret webhooka Stripe", + "admin.settings.feedAllowlistDesc": "Hosty/CIDR oddzielone przecinkami dozwolone dla prywatnych URL feedów.", + "admin.settings.adminsDesc": "Administratorzy platformy w tym wdrożeniu", + "admin.settings.onboardingTitle": "Pomoc onboarding adminów", + "admin.settings.onboardingDesc": "Użyj e-maili zaproszeÅ„ set-password, by wdrożyć uprawnionych użytkowników bez hasÅ‚a.", + "admin.settings.sendInvites": "WyÅ›lij e-maile set-password", + "admin.settings.adminStatusBefore": "Adminów platformy nie można tworzyć z tego ekranu. Potwierdź dostÄ™p na", + "admin.settings.adminStatusAfter": " albo poproÅ› istniejÄ…cego admina/ops o awans konta.", + "admin.settings.loadUsersFailed": "Nie udaÅ‚o siÄ™ wczytać użytkowników admin", + "admin.settings.sendFailed": "WysyÅ‚anie nie powiodÅ‚o siÄ™", + "admin.settings.saveMailFailed": "Nie udaÅ‚o siÄ™ zapisać ustawieÅ„ poczty", + "admin.settings.smtpNotConfigured": "SMTP nie jest skonfigurowany — najpierw włącz i zapisz ustawienia poczty.", + "admin.settings.smtpTestFailed": "Test SMTP nie powiódÅ‚ siÄ™", + "admin.settings.testEmailFailed": "Nie udaÅ‚o siÄ™ wysÅ‚ać e-maila testowego", + "admin.settings.saveIntegrationFailed": "Nie udaÅ‚o siÄ™ zapisać ustawieÅ„ integracji", + "admin.settings.aiSaved": "Zapisano ustawienia AI {label}. Klucze API nie sÄ… już pokazywane.", + "admin.settings.aiSaveFailed": "Nie udaÅ‚o siÄ™ zapisać ustawieÅ„ IA {label}", + "admin.settings.aiTestOk": "{label}: połączenie OK", + "admin.settings.aiTestSkipped": "{label}: pominiÄ™to — zapisz dane (i włącz rolÄ™), aby przetestować.", + "admin.settings.aiTestFailed": "{label}: połączenie nieudane", + "admin.settings.aiTestError": "Nie udaÅ‚o siÄ™ przetestować połączenia {label}", "admin.settings.aiRole.processing.label": "Przetwarzanie", - "admin.settings.aiRole.processing.desc": "Chat/completions pipeline produktów (tytuły, opisy, enhance).", + "admin.settings.aiRole.processing.desc": "Chat/completions pipeline produktów (tytuÅ‚y, opisy, enhance).", "admin.settings.aiRole.vectorization.label": "Wektoryzacja", "admin.settings.aiRole.vectorization.desc": "Embeddingi do wyszukiwania / indeksacji Pinecone (dopasuj wymiary indeksu).", "admin.settings.aiRole.docs_api.label": "Docs / API", - "admin.settings.aiRole.docs_api.desc": "Przyszły slot asystenta docs/API — /docs Ask pozostaje regułowy i nigdy nie powinien wywoływać tej roli.", + "admin.settings.aiRole.docs_api.desc": "PrzyszÅ‚y slot asystenta docs/API — /docs Ask pozostaje reguÅ‚owy i nigdy nie powinien wywoÅ‚ywać tej roli.", "admin.settings.aiRole.support.label": "Wsparcie", - "admin.settings.aiRole.support.desc": "IA zapasowa do auto-odpowiedzi na zgłoszenia — skonfiguruj tu dostawcę/klucz/model; włącz wysyłkę w Wiedza wsparcia → Auto-odpowiedź.", + "admin.settings.aiRole.support.desc": "IA zapasowa do auto-odpowiedzi na zgÅ‚oszenia — skonfiguruj tu dostawcÄ™/klucz/model; włącz wysyÅ‚kÄ™ w Wiedza wsparcia → Auto-odpowiedź.", "admin.settings.providerOption.openai": "OpenAI", "admin.settings.providerOption.openrouter": "OpenRouter", "admin.settings.providerOption.azure": "Azure OpenAI", "admin.settings.providerOption.ollama": "Ollama", "admin.settings.providerOption.custom": "Niestandardowy / inny", "admin.support.title": "Centrum wsparcia", - "admin.support.description": "Skrzynka personelu — przejmij z kolejki, filtruj zakres, otwieraj wątki i rozwiązuj", - "admin.support.unavailable": "Kolejka wsparcia jest niedostępna. Skontaktuj się z administratorem platformy, jeśli to trwa.", - "admin.support.noTickets": "Brak zgłoszeń w tej kolejce.", - "admin.support.ticketNotFound": "Nie znaleziono zgłoszenia.", - "admin.support.notAvailable": "Wsparcie nie jest dostępne w tym wdrożeniu.", - "admin.support.loadFailed": "Nie udało się wczytać tego zgłoszenia.", - "admin.support.noMessages": "Brak wiadomości.", + "admin.support.description": "Skrzynka personelu — przejmij z kolejki, filtruj zakres, otwieraj wÄ…tki i rozwiÄ…zuj", + "admin.support.unavailable": "Kolejka wsparcia jest niedostÄ™pna. Skontaktuj siÄ™ z administratorem platformy, jeÅ›li to trwa.", + "admin.support.noTickets": "Brak zgÅ‚oszeÅ„ w tej kolejce.", + "admin.support.ticketNotFound": "Nie znaleziono zgÅ‚oszenia.", + "admin.support.notAvailable": "Wsparcie nie jest dostÄ™pne w tym wdrożeniu.", + "admin.support.loadFailed": "Nie udaÅ‚o siÄ™ wczytać tego zgÅ‚oszenia.", + "admin.support.noMessages": "Brak wiadomoÅ›ci.", "admin.support.queueScopeAria": "Zakres kolejki", "admin.support.statusFilterAria": "Filtr statusu", "admin.support.autoAssistFilterAria": "Filtr auto-asysty", "admin.support.searchPlaceholder": "Szukaj tematu, e-maila lub firmy", - "admin.support.searchAria": "Szukaj zgłoszeń", + "admin.support.searchAria": "Szukaj zgÅ‚oszeÅ„", "admin.support.assignStaffAria": "Przypisz do personelu", "admin.support.aiDraftAria": "Szkic AI", - "admin.support.replyPlaceholder": "Napisz odpowiedź…", - "admin.support.replyAria": "Treść odpowiedzi", + "admin.support.replyPlaceholder": "Napisz odpowiedź…", + "admin.support.replyAria": "Treść odpowiedzi", "admin.knowledge.eyebrow": "Admin platformy", "admin.knowledge.title": "Baza wiedzy wsparcia", - "admin.knowledge.description": "Strukturyzuj artykuły pomocy pod auto-dopasowanie FAQ. Agenci treści wypełniają treści — dbaj o dokładność faktów.", + "admin.knowledge.description": "Strukturyzuj artykuÅ‚y pomocy pod auto-dopasowanie FAQ. Agenci treÅ›ci wypeÅ‚niajÄ… treÅ›ci — dbaj o dokÅ‚adność faktów.", "admin.knowledge.notReady": "Wiedza wsparcia nie jest gotowa", - "admin.knowledge.noTemplates": "Brak szablonów odpowiedzi", - "admin.knowledge.articleDesc": "Treść Markdown obsługuje obrazy przez bezpieczne przesyłanie. Nie wymyślaj faktów o produktach — zostaw placeholdery dla agentów treści.", + "admin.knowledge.noTemplates": "Brak szablonów odpowiedzi", + "admin.knowledge.articleDesc": "Treść Markdown obsÅ‚uguje obrazy przez bezpieczne przesyÅ‚anie. Nie wymyÅ›laj faktów o produktach — zostaw placeholdery dla agentów treÅ›ci.", "admin.knowledge.templateDesc": "Dozwolone placeholdery: subject, category.", - "admin.knowledge.searchPlaceholder": "Szukaj tytułu, sluga, słów kluczowych…", - "admin.knowledge.searchAria": "Szukaj artykułów", + "admin.knowledge.searchPlaceholder": "Szukaj tytuÅ‚u, sluga, słów kluczowych…", + "admin.knowledge.searchAria": "Szukaj artykułów", "admin.knowledge.publishFilterAria": "Filtr statusu publikacji", - "admin.knowledge.deleteArticleAria": "Usuń artykuł", - "admin.knowledge.deleteTemplateAria": "Usuń szablon", + "admin.knowledge.deleteArticleAria": "UsuÅ„ artykuÅ‚", + "admin.knowledge.deleteTemplateAria": "UsuÅ„ szablon", "admin.support.autoReplyStatus.matched": "Dopasowano FAQ", "admin.support.autoReplyStatus.aiDraft": "Szkic AI oczekuje", - "admin.support.autoReplyStatus.aiSent": "Wysłano odpowiedź AI", - "admin.support.autoReplyStatus.skipped": "Auto pominięto", - "admin.support.autoReplyStatus.failed": "Auto nie powiodło się", - "admin.support.autoReplyStatus.handedOff": "Potrzebny człowiek", - "admin.support.autoReplyStatus.none": "Brak próby auto", + "admin.support.autoReplyStatus.aiSent": "WysÅ‚ano odpowiedź AI", + "admin.support.autoReplyStatus.skipped": "Auto pominiÄ™to", + "admin.support.autoReplyStatus.failed": "Auto nie powiodÅ‚o siÄ™", + "admin.support.autoReplyStatus.handedOff": "Potrzebny czÅ‚owiek", + "admin.support.autoReplyStatus.none": "Brak próby auto", "admin.support.autoSource.kb": "Baza wiedzy", "admin.support.autoSource.template": "Szablon", "admin.support.autoSource.ai": "Wspomagane AI", "admin.support.autoSource.automated": "Automatyczne", "admin.knowledge.categoriesHeading": "Kategorie", - "admin.knowledge.categoriesHint": "Puste pojemniki dla agentów treści.", - "admin.knowledge.showingArticles": "Wyświetlanie {shown} artykułów (treść ładuje się przy edycji).", - "admin.knowledge.showingArticlesOf": "Wyświetlanie {shown} z {total} artykułów (treść ładuje się przy edycji).", + "admin.knowledge.categoriesHint": "Puste pojemniki dla agentów treÅ›ci.", + "admin.knowledge.showingArticles": "WyÅ›wietlanie {shown} artykułów (treść Å‚aduje siÄ™ przy edycji).", + "admin.knowledge.showingArticlesOf": "WyÅ›wietlanie {shown} z {total} artykułów (treść Å‚aduje siÄ™ przy edycji).", "admin.knowledge.templatesHint": "Gotowe odpowiedzi z opcjonalnymi placeholderami {{subject}} / {{category}}.", "admin.knowledge.faqAutoMatchTitle": "Automatyczne dopasowanie FAQ", - "admin.knowledge.faqAutoMatchDesc": "Dopasowanie słów kluczowych przy tworzeniu zgłoszenia. Domyślny próg 0,78 (zakres 0,50–0,95).", + "admin.knowledge.faqAutoMatchDesc": "Dopasowanie słów kluczowych przy tworzeniu zgÅ‚oszenia. DomyÅ›lny próg 0,78 (zakres 0,50–0,95).", "admin.knowledge.aiFallbackTitle": "Zapas AI", - "admin.knowledge.aiFallbackDesc": "Używane, gdy dopasowanie FAQ jest poniżej progu. Odpowiedzi używają roli AI platformy {role}.", + "admin.knowledge.aiFallbackDesc": "Używane, gdy dopasowanie FAQ jest poniżej progu. Odpowiedzi używajÄ… roli AI platformy {role}.", "admin.knowledge.noModel": "brak modelu", - "admin.knowledge.keyLast4": "klucz …{last4}", - "admin.knowledge.sourceLabel": "źródło {source}", - "admin.knowledge.apiKeyNote": "Klucz API zawsze pochodzi z tej roli; nadpisania powyżej zmieniają tylko dostawcę / model / bazowy URL.", + "admin.knowledge.keyLast4": "klucz …{last4}", + "admin.knowledge.sourceLabel": "źródÅ‚o {source}", + "admin.knowledge.apiKeyNote": "Klucz API zawsze pochodzi z tej roli; nadpisania powyżej zmieniajÄ… tylko dostawcÄ™ / model / bazowy URL.", "admin.knowledge.saveAutoSettings": "Zapisz ustawienia auto-odpowiedzi", "admin.knowledge.insertImage": "Wstaw obraz", - "admin.knowledge.uploading": "Przesyłanie…", + "admin.knowledge.uploading": "PrzesyÅ‚anie…", "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, maks. 2 MiB. Przechowywane w UPLOAD_DIR/support-kb (publiczny URL HMAC).", - "admin.knowledge.unavailableMsg": "Wiedza wsparcia nie jest dostępna w tej instalacji. Skontaktuj się z administratorem platformy.", - "admin.knowledge.loadFailed": "Nie udało się wczytać wiedzy wsparcia", - "admin.knowledge.loadArticleFailed": "Nie udało się wczytać artykułu", - "admin.knowledge.loadTemplateFailed": "Nie udało się wczytać szablonu", - "admin.knowledge.saveArticleFailed": "Nie udało się zapisać artykułu", - "admin.knowledge.saveTemplateFailed": "Nie udało się zapisać szablonu", - "admin.knowledge.deleteArticleFailed": "Nie udało się usunąć artykułu", - "admin.knowledge.deleteTemplateFailed": "Nie udało się usunąć szablonu", - "admin.knowledge.saveAutoFailed": "Nie udało się zapisać ustawień auto-odpowiedzi", - "admin.knowledge.uploadImageFailed": "Nie udało się przesłać obrazu", + "admin.knowledge.unavailableMsg": "Wiedza wsparcia nie jest dostÄ™pna w tej instalacji. Skontaktuj siÄ™ z administratorem platformy.", + "admin.knowledge.loadFailed": "Nie udaÅ‚o siÄ™ wczytać wiedzy wsparcia", + "admin.knowledge.loadArticleFailed": "Nie udaÅ‚o siÄ™ wczytać artykuÅ‚u", + "admin.knowledge.loadTemplateFailed": "Nie udaÅ‚o siÄ™ wczytać szablonu", + "admin.knowledge.saveArticleFailed": "Nie udaÅ‚o siÄ™ zapisać artykuÅ‚u", + "admin.knowledge.saveTemplateFailed": "Nie udaÅ‚o siÄ™ zapisać szablonu", + "admin.knowledge.deleteArticleFailed": "Nie udaÅ‚o siÄ™ usunąć artykuÅ‚u", + "admin.knowledge.deleteTemplateFailed": "Nie udaÅ‚o siÄ™ usunąć szablonu", + "admin.knowledge.saveAutoFailed": "Nie udaÅ‚o siÄ™ zapisać ustawieÅ„ auto-odpowiedzi", + "admin.knowledge.uploadImageFailed": "Nie udaÅ‚o siÄ™ przesÅ‚ać obrazu", "admin.translations.eyebrow": "Platforma", - "admin.translations.title": "Tłumaczenia", + "admin.translations.title": "TÅ‚umaczenia", "admin.translations.description": "Przejrzyj pokrycie UI panelu i edytuj pakiety locale oparte na plikach.", - "admin.translations.unavailable": "Tłumaczenia niedostępne", - "admin.translations.sourceOfTruth": "Źródło prawdy", - "admin.translations.sourceOfTruthLabel": "Źródło prawdy:", + "admin.translations.unavailable": "TÅ‚umaczenia niedostÄ™pne", + "admin.translations.sourceOfTruth": "ŹródÅ‚o prawdy", + "admin.translations.sourceOfTruthLabel": "ŹródÅ‚o prawdy:", "admin.translations.colLocale": "Locale", - "admin.translations.colTranslated": "Przetłumaczone", - "admin.translations.colMissing": "Brakujące", + "admin.translations.colTranslated": "PrzetÅ‚umaczone", + "admin.translations.colMissing": "BrakujÄ…ce", "admin.translations.colStatus": "Stan", "admin.translations.badgeBase": "Baza", "admin.translations.badgeComplete": "Kompletne", "admin.translations.badgeUnregistered": "Niezarejestrowane", "admin.translations.badgeGaps": "Luki", - "admin.translations.language": "Język", - "admin.translations.show": "Pokaż", - "admin.translations.filterMissing": "Tylko brakujące", - "admin.translations.filterTranslated": "Tylko przetłumaczone", + "admin.translations.language": "JÄ™zyk", + "admin.translations.show": "Pokaż", + "admin.translations.filterMissing": "Tylko brakujÄ…ce", + "admin.translations.filterTranslated": "Tylko przetÅ‚umaczone", "admin.translations.filterAll": "Wszystkie klucze", "admin.translations.search": "Szukaj", - "admin.translations.searchPlaceholder": "Klucz lub tekst…", - "admin.translations.noKeysMatch": "Brak pasujących kluczy", - "admin.translations.badgeMissing": "Brakujące", + "admin.translations.searchPlaceholder": "Klucz lub tekst…", + "admin.translations.noKeysMatch": "Brak pasujÄ…cych kluczy", + "admin.translations.badgeMissing": "BrakujÄ…ce", "admin.translations.badgeUnsaved": "Niezapisane", "admin.translations.english": "Angielski", - "admin.bootstrap.title": "Dostęp admin bootstrap", - "admin.bootstrap.description": "Potwierdź, czy Twoje konto ma już dostęp admina platformy. Nowych adminów musi nadać istniejący administrator.", + "admin.bootstrap.title": "DostÄ™p admin bootstrap", + "admin.bootstrap.description": "Potwierdź, czy Twoje konto ma już dostÄ™p admina platformy. Nowych adminów musi nadać istniejÄ…cy administrator.", "admin.bootstrap.statusTitle": "Status admina platformy", - "admin.bootstrap.statusDesc": "Dostęp admina platformy nadaje istniejący administrator. Nie ma self-serve bootstrapu dla tej roli.", - "admin.bootstrap.alreadyAdmin": "Masz już dostęp admina platformy.", - "admin.bootstrap.signedInAs": "Zalogowano jako {email}. Otwórz panel admina, aby kontynuować.", + "admin.bootstrap.statusDesc": "DostÄ™p admina platformy nadaje istniejÄ…cy administrator. Nie ma self-serve bootstrapu dla tej roli.", + "admin.bootstrap.alreadyAdmin": "Masz już dostÄ™p admina platformy.", + "admin.bootstrap.signedInAs": "Zalogowano jako {email}. Otwórz panel admina, aby kontynuować.", "admin.bootstrap.signedInAsShort": "Zalogowano jako {email}", - "admin.bootstrap.notAdminTitle": "Nie jesteś adminem platformy", - "admin.bootstrap.notAdminMsg": "Twoje konto jest zalogowane, ale nie jest oznaczone jako admin platformy. Poproś istniejącego admina o dostęp, wyloguj się i zaloguj ponownie.", - "admin.bootstrap.goToPanel": "Przejdź do panelu admina", - "admin.bootstrap.loadFailed": "Nie udało się wczytać profilu", + "admin.bootstrap.notAdminTitle": "Nie jesteÅ› adminem platformy", + "admin.bootstrap.notAdminMsg": "Twoje konto jest zalogowane, ale nie jest oznaczone jako admin platformy. PoproÅ› istniejÄ…cego admina o dostÄ™p, wyloguj siÄ™ i zaloguj ponownie.", + "admin.bootstrap.goToPanel": "Przejdź do panelu admina", + "admin.bootstrap.loadFailed": "Nie udaÅ‚o siÄ™ wczytać profilu", "admin.migrate.title": "Migracja organizacji", - "admin.migrate.description": "To narzędzie migracji jest wycofane i nie zmienia żadnych danych.", - "admin.migrate.notAvailable": "Niedostępne", - "admin.migrate.body": "Migracja organizacji z poprzedniego dostawcy tożsamości nie jest już potrzebna. Firmy i lokalne auth są zarządzane w Użytkownicy i organizacje.", - "admin.migrate.hint": "Jeśli otworzyłeś to ze starej zakładki, kontynuuj w Użytkownicy i organizacje, Rozliczenia platformy lub Zablokowane produkty.", + "admin.migrate.description": "To narzÄ™dzie migracji jest wycofane i nie zmienia żadnych danych.", + "admin.migrate.notAvailable": "NiedostÄ™pne", + "admin.migrate.body": "Migracja organizacji z poprzedniego dostawcy tożsamoÅ›ci nie jest już potrzebna. Firmy i lokalne auth sÄ… zarzÄ…dzane w Użytkownicy i organizacje.", + "admin.migrate.hint": "JeÅ›li otworzyÅ‚eÅ› to ze starej zakÅ‚adki, kontynuuj w Użytkownicy i organizacje, Rozliczenia platformy lub Zablokowane produkty.", "admin.migrate.adminHome": "Start admina", - "admin.migrate.users": "Użytkownicy", - "admin.redirect.diagnostics": "Przekierowanie do Diagnostyki…", - "admin.redirect.stuck": "Przekierowanie do Zablokowanych produktów…", - "common.refresh": "Odśwież", - "common.delete": "Usuń", - "common.clearSearch": "Wyczyść wyszukiwanie", - "common.loading": "Ładowanie…", + "admin.migrate.users": "Użytkownicy", + "admin.redirect.diagnostics": "Przekierowanie do Diagnostyki…", + "admin.redirect.stuck": "Przekierowanie do Zablokowanych produktów…", + "common.refresh": "OdÅ›wież", + "common.delete": "UsuÅ„", + "common.clearSearch": "Wyczyść wyszukiwanie", + "common.loading": "Ładowanie…", "common.never": "Nigdy", "common.back": "Wstecz", "common.startOver": "Zacznij od nowa", - "common.create": "Utwórz", + "common.create": "Utwórz", "common.required": "Wymagane", "common.actions": "Akcje", "common.status": "Stan", "common.nameCol": "Nazwa", "common.products": "Produkty", - "common.more": "+{count} więcej", + "common.more": "+{count} wiÄ™cej", "feeds.title": "Twoje feedy", - "feeds.loadingDesc": "Ładowanie feedów dostawcy…", - "feeds.desc": "{page} na tej stronie · {total} feedów łącznie — URL CSV/XML dostawcy i przesłania. Połącz ze Sklepów, aby uzyskać opcje z przewodnikiem.", - "feeds.storesHub": "Hub sklepów", + "feeds.loadingDesc": "Ładowanie feedów dostawcy…", + "feeds.desc": "{page} na tej stronie · {total} feedów łącznie — URL CSV/XML dostawcy i przesÅ‚ania. Połącz ze Sklepów, aby uzyskać opcje z przewodnikiem.", + "feeds.storesHub": "Hub sklepów", "feeds.addFeed": "Dodaj Feed", - "feeds.searchPlaceholder": "Szukaj feedów...", - "feeds.emptyTitle": "Brak feedów produktów", - "feeds.emptyMessage": "Połącz URL CSV/XML dostawcy lub prześlij plik, aby zsynchronizować produkty do katalogu.", - "feeds.connectFeed": "Podłącz feed", - "feeds.uploadCsvCta": "Prześlij CSV", - "feeds.noMatchTitle": "Brak pasujących feedów", - "feeds.noMatchMessage": "Spróbuj innej frazy wyszukiwania albo wyczyść wyszukiwanie, aby zobaczyć wszystkie feedy.", - "feeds.col.source": "Źródło", + "feeds.searchPlaceholder": "Szukaj feedów...", + "feeds.emptyTitle": "Brak feedów produktów", + "feeds.emptyMessage": "Połącz URL CSV/XML dostawcy lub przeÅ›lij plik, aby zsynchronizować produkty do katalogu.", + "feeds.connectFeed": "Podłącz feed", + "feeds.uploadCsvCta": "PrzeÅ›lij CSV", + "feeds.noMatchTitle": "Brak pasujÄ…cych feedów", + "feeds.noMatchMessage": "Spróbuj innej frazy wyszukiwania albo wyczyść wyszukiwanie, aby zobaczyć wszystkie feedy.", + "feeds.col.source": "ŹródÅ‚o", "feeds.col.mapping": "Mapowanie", "feeds.col.lastData": "Ostatnia sync", "feeds.copyUrl": "Kopiuj URL", - "feeds.fieldsMapped": "{count} pól", + "feeds.fieldsMapped": "{count} pól", "feeds.fieldsMappedTitle": "{count} pole zamapowane", - "feeds.fieldsMappedTitlePlural": "{count} pól zamapowanych", - "feeds.mappingsSaved": "Zapisano mapowania pól", + "feeds.fieldsMappedTitlePlural": "{count} pól zamapowanych", + "feeds.mappingsSaved": "Zapisano mapowania pól", "feeds.mapped": "Zmapowano", "feeds.notMapped": "Niezamapowane", - "feeds.notMappedTitle": "Brak mapowań pól — otwórz Mapuj, aby skonfigurować", - "feeds.productsFromFeed": "{count} produktów z tego feedu", - "feeds.noProductsYet": "Nie zaimportowano jeszcze produktów z tego feedu", - "feeds.syncing": "Synchronizacja…", + "feeds.notMappedTitle": "Brak mapowaÅ„ pól — otwórz Mapuj, aby skonfigurować", + "feeds.productsFromFeed": "{count} produktów z tego feedu", + "feeds.noProductsYet": "Nie zaimportowano jeszcze produktów z tego feedu", + "feeds.syncing": "Synchronizacja…", "feeds.syncingShort": "Synchronizacja", - "feeds.syncingHint": "Przy dużych feedach może potrwać kilka minut", + "feeds.syncingHint": "Przy dużych feedach może potrwać kilka minut", "feeds.liveSync": "Sync feedu", "feeds.productData": "Dane katalogu", "feeds.mapFields": "Mapuj pola", "feeds.map": "Mapuj", "feeds.sync": "Synchronizuj", "feeds.syncNow": "Synchronizuj teraz", - "feeds.syncManualTitle": "Uruchom jednorazową synchronizację teraz. Auto-sync używa interwału ustawionego przy edycji feedu.", + "feeds.syncManualTitle": "Uruchom jednorazowÄ… synchronizacjÄ™ teraz. Auto-sync używa interwaÅ‚u ustawionego przy edycji feedu.", "feeds.syncInProgress": "Sync w toku", "feeds.addTitle": "Dodaj Feed", - "feeds.addDesc": "Połącz URL feedu produktów lub prześlij CSV. Użyj próbek poniżej, aby dopasować oczekiwaną strukturę.", + "feeds.addDesc": "Połącz URL feedu produktów lub przeÅ›lij CSV. Użyj próbek poniżej, aby dopasować oczekiwanÄ… strukturÄ™.", "feeds.field.name": "Nazwa", - "feeds.field.namePlaceholder": "Mój feed produktów", + "feeds.field.namePlaceholder": "Mój feed produktów", "feeds.tab.url": "URL feedu", "feeds.tab.file": "Plik CSV", "feeds.field.url": "URL feedu", - "feeds.field.urlPlaceholder": "https://…", + "feeds.field.urlPlaceholder": "https://…", "feeds.field.type": "Typ", "feeds.field.file": "Plik CSV", - "feeds.fileHint": "Maks. 5 MiB. Po utworzeniu zmapuj kolumny, potem synchronizuj — ten sam przepływ co feedy URL.", - "feeds.field.interval": "Interwał auto-synchronizacji (minuty)", - "feeds.field.intervalHint": "Jak często Descrybe ma automatycznie pobierać ten feed, gdy jest aktywny. Sync na liście uruchamia jednorazowe pobranie — nie zmienia tego harmonogramu.", - "feeds.createFeed": "Utwórz feed", + "feeds.fileHint": "Maks. 5 MiB. Po utworzeniu zmapuj kolumny, potem synchronizuj — ten sam przepÅ‚yw co feedy URL.", + "feeds.field.interval": "InterwaÅ‚ auto-synchronizacji (minuty)", + "feeds.field.intervalHint": "Jak czÄ™sto Descrybe ma automatycznie pobierać ten feed, gdy jest aktywny. Sync na liÅ›cie uruchamia jednorazowe pobranie — nie zmienia tego harmonogramu.", + "feeds.createFeed": "Utwórz feed", "feeds.editTitle": "Edytuj Feed", - "feeds.editDesc": "Zaktualizuj nazwę, typ, harmonogram auto-sync lub URL źródła. Sync na liście feedów uruchamia jednorazowe pobranie.", - "feeds.csvSource": "Źródło CSV", - "feeds.uploadedCsv": "Przesłany CSV", - "feeds.replaceFileHint": "Aby zastąpić plik, utwórz nowy feed. Sync ponownie odczytuje zapisany upload.", - "feeds.csvTypeLocked": "Przesłane feedy CSV pozostają typu CSV.", + "feeds.editDesc": "Zaktualizuj nazwÄ™, typ, harmonogram auto-sync lub URL źródÅ‚a. Sync na liÅ›cie feedów uruchamia jednorazowe pobranie.", + "feeds.csvSource": "ŹródÅ‚o CSV", + "feeds.uploadedCsv": "PrzesÅ‚any CSV", + "feeds.replaceFileHint": "Aby zastÄ…pić plik, utwórz nowy feed. Sync ponownie odczytuje zapisany upload.", + "feeds.csvTypeLocked": "PrzesÅ‚ane feedy CSV pozostajÄ… typu CSV.", "feeds.saveChanges": "Zapisz zmiany", "feeds.historyTitle": "Historia sync", - "feeds.historyDesc": "Niedawne zadania sync dla „{name}”.", + "feeds.historyDesc": "Niedawne zadania sync dla „{name}”.", "feeds.historyLastSynced": "Ostatnia udana sync {relative} ({absolute}).", "feeds.historyNeverSynced": "Brak udanej sync.", - "feeds.historyLoading": "Ładowanie historii sync…", - "feeds.historyEmpty": "Brak zadań sync.", + "feeds.historyLoading": "Ładowanie historii sync…", + "feeds.historyEmpty": "Brak zadaÅ„ sync.", "feeds.history.started": "Uruchomiono", - "feeds.history.completed": "Ukończone", - "feeds.loadFailed": "Nie udało się wczytać feedów", - "feeds.copyFailed": "Nie można skopiować URL", + "feeds.history.completed": "UkoÅ„czone", + "feeds.loadFailed": "Nie udaÅ‚o siÄ™ wczytać feedów", + "feeds.copyFailed": "Nie można skopiować URL", "feeds.created": "Utworzono feed", "feeds.updated": "Feed zaktualizowany.", - "feeds.mapBeforeSync": "Zmapuj pola przed synchronizacją tego feedu.", - "feeds.activateBeforeSync": "Aktywuj feed przed synchronizacją.", - "feeds.syncFinished": "Synchronizacja zakończona", + "feeds.mapBeforeSync": "Zmapuj pola przed synchronizacjÄ… tego feedu.", + "feeds.activateBeforeSync": "Aktywuj feed przed synchronizacjÄ….", + "feeds.syncFinished": "Synchronizacja zakoÅ„czona", "feeds.viewProducts": "Zobacz produkty", "feeds.processing": "Przetwarzanie", - "feeds.syncFailed": "Synchronizacja nie powiodła się", - "feeds.statusUpdateFailed": "Nie udało się zaktualizować statusu", - "feeds.deleteConfirm": "Usunąć feed „{name}”? Tego nie można cofnąć.", - "feeds.deleted": "Feed usunięty.", - "feeds.deleteFailed": "Nie udało się usunąć feedu", - "feeds.historyLoadFailed": "Nie udało się wczytać historii sync", - "feeds.ftpUnsupported": "Sync FTP/FTPS nie jest obsługiwana. Poproś dostawcę o publiczny HTTPS URL feedu, prześlij tu feed CSV lub zaimportuj plik z Uploads.", - "feeds.ftpUnsupportedShort": "Sync FTP niedostępna", + "feeds.syncFailed": "Synchronizacja nie powiodÅ‚a siÄ™", + "feeds.statusUpdateFailed": "Nie udaÅ‚o siÄ™ zaktualizować statusu", + "feeds.deleteConfirm": "Usunąć feed „{name}”? Tego nie można cofnąć.", + "feeds.deleted": "Feed usuniÄ™ty.", + "feeds.deleteFailed": "Nie udaÅ‚o siÄ™ usunąć feedu", + "feeds.historyLoadFailed": "Nie udaÅ‚o siÄ™ wczytać historii sync", + "feeds.ftpUnsupported": "Sync FTP/FTPS nie jest obsÅ‚ugiwana. PoproÅ› dostawcÄ™ o publiczny HTTPS URL feedu, przeÅ›lij tu feed CSV lub zaimportuj plik z Uploads.", + "feeds.ftpUnsupportedShort": "Sync FTP niedostÄ™pna", "feeds.ftpBadge": "FTP", - "feeds.ftpMigrateBanner": "Niektóre feedy nadal używają FTP/FTPS. Descrybe nie może ich pobrać. Przełącz na publiczny HTTPS URL, dodaj feed CSV lub prześlij z Uploads.", - "feeds.ftpUploadCta": "Przejdź do Uploads", + "feeds.ftpMigrateBanner": "Niektóre feedy nadal używajÄ… FTP/FTPS. Descrybe nie może ich pobrać. Przełącz na publiczny HTTPS URL, dodaj feed CSV lub przeÅ›lij z Uploads.", + "feeds.ftpUploadCta": "Przejdź do Uploads", "feeds.ftpHttpsCta": "Dodaj feed HTTPS", - "feeds.ftpCsvCta": "Prześlij feed CSV", + "feeds.ftpCsvCta": "PrzeÅ›lij feed CSV", "feeds.status.mappingIncomplete": "Mapowanie niekompletne", "feeds.status.readyForMapping": "Gotowe do mapowania", "feeds.status.mapped": "Zmapowano", "feeds.status.active": "Aktywny", "feeds.status.inactive": "Nieaktywny", - "feeds.status.error": "Błąd", + "feeds.status.error": "Błąd", "feeds.status.unknown": "Nieznane", "feeds.actions.menu": "Akcje feedu", "feeds.actions.menuSyncing": "Akcje feedu (sync w toku)", "feeds.actions.editFeed": "Edytuj Feed", "feeds.actions.editMapping": "Edytuj mapowanie", "feeds.actions.syncNow": "Synchronizuj teraz", - "feeds.actions.syncInProgress": "Sync w toku…", + "feeds.actions.syncInProgress": "Sync w toku…", "feeds.actions.activateToSync": "Aktywuj feed do synchronizacji", - "feeds.actions.viewHistory": "Zobacz historię sync", + "feeds.actions.viewHistory": "Zobacz historiÄ™ sync", "feeds.actions.deactivate": "Dezaktywuj feed", "feeds.actions.activate": "Aktywuj feed", - "feeds.actions.delete": "Usuń feed", - "feeds.stats.totalFeeds": "Łącznie feedów", - "feeds.stats.activeMapped": "{active} aktywne · {mapped} zamapowane", + "feeds.actions.delete": "UsuÅ„ feed", + "feeds.stats.totalFeeds": "Łącznie feedów", + "feeds.stats.activeMapped": "{active} aktywne · {mapped} zamapowane", "feeds.stats.activeOnly": "{active} aktywne", "feeds.stats.totalProducts": "Zaimportowane produkty", "feeds.stats.acrossFeeds": "Surowe wiersze (nie katalog + kolejka)", "feeds.stats.processed": "W katalogu", - "feeds.stats.readyCatalog": "Wiersze katalogu — nie część zaimportowanych", + "feeds.stats.readyCatalog": "Wiersze katalogu — nie część zaimportowanych", "feeds.stats.unprocessed": "Oczekuje na przetwarzanie", - "feeds.stats.waiting": "Surowa kolejka — nie część zaimportowanych", - "feeds.format.howTo": "Jak ustrukturyzować feed", + "feeds.stats.waiting": "Surowa kolejka — nie część zaimportowanych", + "feeds.format.howTo": "Jak ustrukturyzować feed", "feeds.format.required": "Wymagane:", - "feeds.preview.title": "Podgląd źródła feedu", - "feeds.preview.truncated": "Skrócone", - "feeds.preview.refresh": "Odśwież podgląd", - "feeds.preview.copy": "Kopiuj podgląd", - "feeds.preview.loading": "Ładowanie podglądu…", - "feeds.preview.empty": "Wyodrębnij schemat, aby podejrzeć źródło feedu.", - "feeds.schema.search": "Szukaj pól…", + "feeds.preview.title": "PodglÄ…d źródÅ‚a feedu", + "feeds.preview.truncated": "Skrócone", + "feeds.preview.refresh": "OdÅ›wież podglÄ…d", + "feeds.preview.copy": "Kopiuj podglÄ…d", + "feeds.preview.loading": "Ładowanie podglÄ…du…", + "feeds.preview.empty": "WyodrÄ™bnij schemat, aby podejrzeć źródÅ‚o feedu.", + "feeds.schema.search": "Szukaj pól…", "feeds.schema.fieldName": "Nazwa pola", - "feeds.schema.sourcePath": "Ścieżka źródła", - "feeds.schema.confirm": "Potwierdź", + "feeds.schema.sourcePath": "Åšcieżka źródÅ‚a", + "feeds.schema.confirm": "Potwierdź", "feeds.schema.apply": "Zastosuj", - "feeds.preflight.missingItemPath": "Wybierz ścieżkę elementu produktu przed synchronizacją.", - "feeds.preflight.emptyMappings": "Zmapuj co najmniej jedno pole źródłowe przed synchronizacją.", - "feeds.preflight.missingRequired": "Zmapuj wymagane pola przed synchronizacją: {fields}.", - "feeds.preflight.unknownSource": "Niektóre zmapowane źródła nie znaleziono w wyodrębnionym schemacie: {fields}{more}. Wyodrębnij ponownie lub popraw ścieżki przed poleganiem na wartościach próbnych.", - "feeds.preflight.emptySample": "Wymagane pola mają puste wartości próbne: {fields}. Sprawdź kolumny źródłowe przed pełną sync.", - "feeds.preflight.fix": "Popraw mapowania pól przed synchronizacją.", + "feeds.preflight.missingItemPath": "Wybierz Å›cieżkÄ™ elementu produktu przed synchronizacjÄ….", + "feeds.preflight.emptyMappings": "Zmapuj co najmniej jedno pole źródÅ‚owe przed synchronizacjÄ….", + "feeds.preflight.missingRequired": "Zmapuj wymagane pola przed synchronizacjÄ…: {fields}.", + "feeds.preflight.unknownSource": "Niektóre zmapowane źródÅ‚a nie znaleziono w wyodrÄ™bnionym schemacie: {fields}{more}. WyodrÄ™bnij ponownie lub popraw Å›cieżki przed poleganiem na wartoÅ›ciach próbnych.", + "feeds.preflight.emptySample": "Wymagane pola majÄ… puste wartoÅ›ci próbne: {fields}. Sprawdź kolumny źródÅ‚owe przed peÅ‚nÄ… sync.", + "feeds.preflight.fix": "Popraw mapowania pól przed synchronizacjÄ….", "mapping.title": "Mapowanie feedu", "mapping.titleNamed": "Mapuj: {name}", - "mapping.description": "Wybierz powtarzający się element produktu, wyodrębnij pola źródłowe, a następnie zmapuj je na pola produktu Descrybe.", + "mapping.description": "Wybierz powtarzajÄ…cy siÄ™ element produktu, wyodrÄ™bnij pola źródÅ‚owe, a nastÄ™pnie zmapuj je na pola produktu Descrybe.", "mapping.autoMap": "Mapuj automatycznie", - "mapping.fuzzy": "{count} przybliżonych", - "mapping.extractSchema": "Wyodrębnij schemat", - "mapping.backToFeeds": "Wróć do Feedów", - "mapping.ftpStillEdit": "{message} Nadal możesz edytować mapowania. Aby odświeżyć produkty, przejdź na HTTPS lub prześlij plik.", - "mapping.ftpUploadCta": "Przejdź do Uploads", + "mapping.fuzzy": "{count} przybliżonych", + "mapping.extractSchema": "WyodrÄ™bnij schemat", + "mapping.backToFeeds": "Wróć do Feedów", + "mapping.ftpStillEdit": "{message} Nadal możesz edytować mapowania. Aby odÅ›wieżyć produkty, przejdź na HTTPS lub przeÅ›lij plik.", + "mapping.ftpUploadCta": "Przejdź do Uploads", "mapping.ftpHttpsCta": "Dodaj feed HTTPS", - "mapping.ftpCsvCta": "Prześlij feed CSV", - "mapping.loading": "Ładowanie szczegółów feedu…", + "mapping.ftpCsvCta": "PrzeÅ›lij feed CSV", + "mapping.loading": "Ładowanie szczegółów feedu…", "mapping.step1": "Wybierz element produktu", "mapping.step2": "Mapuj pola", "mapping.step1Heading": "Krok 1: Wybierz element produktu", - "mapping.csvHint": "Feedy CSV używają nagłówków kolumn jako pól źródłowych. Wyodrębnij schemat, aby wczytać kolumny, a następnie przejdź do mapowania.", - "mapping.howToSelect": "Jak wybrać element produktu:", + "mapping.csvHint": "Feedy CSV używajÄ… nagłówków kolumn jako pól źródÅ‚owych. WyodrÄ™bnij schemat, aby wczytać kolumny, a nastÄ™pnie przejdź do mapowania.", + "mapping.howToSelect": "Jak wybrać element produktu:", "mapping.howToHint": "Opcjonalny przewodnik", - "mapping.howTo.1": "Wyodrębnij schemat lub kliknij powtarzający się tag w podglądzie", - "mapping.howTo.2": "Każdy element powinien zawierać dane pojedynczego produktu", - "mapping.howTo.3": "Potwierdź ścieżkę (na przykład", - "mapping.howTo.4": "Przejdź do mapowania pól źródłowych na pola produktu", - "mapping.productElementPath": "Ścieżka elementu produktu", + "mapping.howTo.1": "WyodrÄ™bnij schemat lub kliknij powtarzajÄ…cy siÄ™ tag w podglÄ…dzie", + "mapping.howTo.2": "Każdy element powinien zawierać dane pojedynczego produktu", + "mapping.howTo.3": "Potwierdź Å›cieżkÄ™ (na przykÅ‚ad", + "mapping.howTo.4": "Przejdź do mapowania pól źródÅ‚owych na pola produktu", + "mapping.productElementPath": "Åšcieżka elementu produktu", "mapping.pathPlaceholder": "np. rss/channel/item lub products/product", - "mapping.continue": "Kontynuuj →", - "mapping.continueFields": "Przejdź do mapowania pól →", - "mapping.discovered": "Wykryto {fields} pól źródłowych z {rows} wiersza(-y) próbki.", - "mapping.suggestionsCount": "· {count} sugestia(-e) automatycznego mapowania", + "mapping.continue": "Kontynuuj →", + "mapping.continueFields": "Przejdź do mapowania pól →", + "mapping.discovered": "Wykryto {fields} pól źródÅ‚owych z {rows} wiersza(-y) próbki.", + "mapping.suggestionsCount": "· {count} sugestia(-e) automatycznego mapowania", "mapping.step2Heading": "Krok 2: Mapuj pola", - "mapping.requiredFieldsBadge": "{count} wymaganych pól", + "mapping.requiredFieldsBadge": "{count} wymaganych pól", "mapping.unmappedRequired": "{count} wymaganych niezamapowanych", - "mapping.sourceFieldsBadge": "{count} pól źródłowych", + "mapping.sourceFieldsBadge": "{count} pól źródÅ‚owych", "mapping.suggestedBadge": "{count} sugerowanych", - "mapping.step2Help": "Mapuj kolumny źródłowe lub węzły XPath na pola produktu. Wymagane pola są oznaczone *. Najedź na ikonę pomocy, aby zobaczyć krótką wskazówkę ze słownika.", + "mapping.step2Help": "Mapuj kolumny źródÅ‚owe lub wÄ™zÅ‚y XPath na pola produktu. Wymagane pola sÄ… oznaczone *. Najedź na ikonÄ™ pomocy, aby zobaczyć krótkÄ… wskazówkÄ™ ze sÅ‚ownika.", "mapping.requiredFields": "Wymagane pola", - "mapping.requiredMapped": "· {mapped}/{total} zmapowanych", - "mapping.requiredProgressDone": "Wszystkie wymagane pola zmapowane — gotowe do następnego kroku.", - "mapping.requiredProgressHint": "Pola oznaczone * muszą być zmapowane, zanim ten feed będzie mógł synchronizować produkty.", - "mapping.requiredProgressAria": "Postęp wymaganych pól: {mapped} z {total} zmapowanych", + "mapping.requiredMapped": "· {mapped}/{total} zmapowanych", + "mapping.requiredProgressDone": "Wszystkie wymagane pola zmapowane — gotowe do nastÄ™pnego kroku.", + "mapping.requiredProgressHint": "Pola oznaczone * muszÄ… być zmapowane, zanim ten feed bÄ™dzie mógÅ‚ synchronizować produkty.", + "mapping.requiredProgressAria": "PostÄ™p wymaganych pól: {mapped} z {total} zmapowanych", "mapping.nextAfterSaveReady": "Mappings saved. Next, sync a small sample to check products look right.", "mapping.nextAfterSaveIncomplete": "Mappings saved. Finish the remaining required fields, then sync a sample.", "mapping.nextCtaSyncSample": "Sync + process sample", "mapping.nextCtaFinishRequired": "Show missing required fields", - "mapping.highConfidence": "{count} mapowanie o wysokiej pewności gotowe", - "mapping.highConfidencePlural": "{count} mapowania o wysokiej pewności gotowe", - "mapping.highConfidenceHelp": "Dokładne dopasowania i aliasy (na przykład EAN → GTIN). Zastosuj wszystkie albo akceptuj chipy w wierszach tabeli.", + "mapping.highConfidence": "{count} mapowanie o wysokiej pewnoÅ›ci gotowe", + "mapping.highConfidencePlural": "{count} mapowania o wysokiej pewnoÅ›ci gotowe", + "mapping.highConfidenceHelp": "DokÅ‚adne dopasowania i aliasy (na przykÅ‚ad EAN → GTIN). Zastosuj wszystkie albo akceptuj chipy w wierszach tabeli.", "mapping.reviewMappings": "Przejrzyj mapowania", - "mapping.needItemPath": "Wprowadź ścieżkę elementu produktu przed mapowaniem pól.", - "mapping.removeMapping": "Usuń mapowanie", + "mapping.needItemPath": "Wprowadź Å›cieżkÄ™ elementu produktu przed mapowaniem pól.", + "mapping.removeMapping": "UsuÅ„ mapowanie", "mapping.sourcePlaceholder": "nazwa kolumny lub xpath", "mapping.processAfterSync": "Produkty do przetworzenia po synchronizacji", - "mapping.noFuzzyLeft": "Brak przybliżonych dopasowań do potwierdzenia.", - "mapping.syncedQueued": "Zsynchronizowano feed i dodano {queued} produkt(ów) do kolejki przetwarzania{jobId}.", + "mapping.noFuzzyLeft": "Brak przybliżonych dopasowaÅ„ do potwierdzenia.", + "mapping.syncedQueued": "Zsynchronizowano feed i dodano {queued} produkt(ów) do kolejki przetwarzania{jobId}.", "mapping.saveMappings": "Zapisz mapowania", - "mapping.syncProcessSample": "Synchronizuj + przetwórz próbkę", + "mapping.syncProcessSample": "Synchronizuj + przetwórz próbkÄ™", "mapping.badgeCsv": "CSV", - "mapping.requiredAria": "Pomoc dotycząca wymaganych pól", + "mapping.requiredAria": "Pomoc dotyczÄ…ca wymaganych pól", "mapping.applySuggestions": "Zastosuj sugestie ({count})", - "mapping.confirmFuzzy": "Potwierdź przybliżone ({count})", - "mapping.fuzzyNeedConfirm": "{count} przybliżone dopasowanie wymaga potwierdzenia", - "mapping.fuzzyNeedConfirmPlural": "{count} przybliżonych dopasowań wymaga potwierdzenia", - "mapping.fuzzyHelp": "Dopasowania nazw o niskiej pewności nie są stosowane automatycznie. Potwierdź tutaj lub zaakceptuj w wierszach tabeli.", - "mapping.missingRequiredTitle": "Wymagane pola nadal potrzebują mapowania źródła:", - "mapping.applyTip": "Wskazówka: zastosuj sugestie powyżej — wiele wymaganych pól odpowiada typowym nazwom źródeł.", + "mapping.confirmFuzzy": "Potwierdź przybliżone ({count})", + "mapping.fuzzyNeedConfirm": "{count} przybliżone dopasowanie wymaga potwierdzenia", + "mapping.fuzzyNeedConfirmPlural": "{count} przybliżonych dopasowaÅ„ wymaga potwierdzenia", + "mapping.fuzzyHelp": "Dopasowania nazw o niskiej pewnoÅ›ci nie sÄ… stosowane automatycznie. Potwierdź tutaj lub zaakceptuj w wierszach tabeli.", + "mapping.missingRequiredTitle": "Wymagane pola nadal potrzebujÄ… mapowania źródÅ‚a:", + "mapping.applyTip": "Wskazówka: zastosuj sugestie powyżej — wiele wymaganych pól odpowiada typowym nazwom źródeÅ‚.", "mapping.formatLabel": "Format:", - "mapping.itemPathLabel": "Ścieżka elementu:", - "mapping.reExtract": "Wyodrębnij ponownie", - "mapping.manualRows": "Wiersze ręczne", + "mapping.itemPathLabel": "Åšcieżka elementu:", + "mapping.reExtract": "WyodrÄ™bnij ponownie", + "mapping.manualRows": "Wiersze rÄ™czne", "mapping.schemaTable": "Tabela schematu", "mapping.addField": "Dodaj pole", - "mapping.noSchemaYet": "Brak wyodrębnionego schematu.", - "mapping.orManualRows": "lub użyj wierszy ręcznych poniżej.", - "mapping.sourceField": "Pole źródłowe", - "mapping.selectSource": "Wybierz źródło…", + "mapping.noSchemaYet": "Brak wyodrÄ™bnionego schematu.", + "mapping.orManualRows": "lub użyj wierszy rÄ™cznych poniżej.", + "mapping.sourceField": "Pole źródÅ‚owe", + "mapping.selectSource": "Wybierz źródÅ‚o…", "mapping.mapsTo": "Mapuje na", "mapping.none": "Brak", - "mapping.backToItem": "← Wróć do wyboru elementu", + "mapping.backToItem": "← Wróć do wyboru elementu", "mapping.unsaved": "Niezapisane zmiany", "mapping.requiredFieldsColon": "Wymagane pola:", - "mapping.sampleOptions": "Opcje próbki", - "mapping.sampleSize": "Rozmiar próbki", - "mapping.noExactAlias": "Brak dokładnych sugestii/aliasów do zastosowania. Przejrzyj przybliżone dopasowania poniżej.", - "mapping.noSuggestionsExtract": "Brak sugestii — najpierw wyodrębnij schemat.", - "mapping.schemaExtracted": "Wyodrębniono schemat: {fields} pól z {rows} wiersza(-y) próbki.", - "mapping.saved": "Zapisano mapowania pól{version}.", + "mapping.sampleOptions": "Opcje próbki", + "mapping.sampleSize": "Rozmiar próbki", + "mapping.noExactAlias": "Brak dokÅ‚adnych sugestii/aliasów do zastosowania. Przejrzyj przybliżone dopasowania poniżej.", + "mapping.noSuggestionsExtract": "Brak sugestii — najpierw wyodrÄ™bnij schemat.", + "mapping.schemaExtracted": "WyodrÄ™bniono schemat: {fields} pól z {rows} wiersza(-y) próbki.", + "mapping.saved": "Zapisano mapowania pól{version}.", "mapping.savedVersion": " (v{version})", - "mapping.syncNoProducts": "Synchronizacja zakończona; brak produktów do przetworzenia.", + "mapping.syncNoProducts": "Synchronizacja zakoÅ„czona; brak produktów do przetworzenia.", "mapping.jobSuffix": " (zadanie {jobId})", - "mapping.appliedReplace": "Zastosowano {count} mapowań {kind}.", - "mapping.appliedNew": "Zastosowano {count} nowych mapowań {kind} (łącznie {total}).", - "mapping.kindHighConfidence": "o wysokiej pewności", - "mapping.kindFuzzy": "przybliżonych", - "mapping.fuzzyConfirmFlash": "{count} przybliżone dopasowanie wymaga potwierdzenia — użyj Potwierdź przybliżone poniżej lub chipów w wierszach.", - "mapping.fuzzyConfirmFlashPlural": "{count} przybliżonych dopasowań wymaga potwierdzenia — użyj Potwierdź przybliżone poniżej lub chipów w wierszach.", - "mapping.formatHelp.title": "Jak ustrukturyzować feed", + "mapping.appliedReplace": "Zastosowano {count} mapowaÅ„ {kind}.", + "mapping.appliedNew": "Zastosowano {count} nowych mapowaÅ„ {kind} (łącznie {total}).", + "mapping.kindHighConfidence": "o wysokiej pewnoÅ›ci", + "mapping.kindFuzzy": "przybliżonych", + "mapping.fuzzyConfirmFlash": "{count} przybliżone dopasowanie wymaga potwierdzenia — użyj Potwierdź przybliżone poniżej lub chipów w wierszach.", + "mapping.fuzzyConfirmFlashPlural": "{count} przybliżonych dopasowaÅ„ wymaga potwierdzenia — użyj Potwierdź przybliżone poniżej lub chipów w wierszach.", + "mapping.formatHelp.title": "Jak ustrukturyzować feed", "mapping.formatHelp.required": "Wymagane:", "mapping.formatHelp.requiredBody": "{gtin} (EAN/UPC), {title} (lub {name}), {brand}", - "mapping.formatHelp.https": "Używaj publicznych adresów URL HTTPS dla zdalnych feedów (nie FTP ani localhost). Przesyłanie CSV działa dla plików lokalnych.", - "mapping.formatHelp.specs": "Specyfikacje jako pary Etykieta: wartość (np. {ram}). Wymiary: {height}, {width}, {depth}, {mass}", - "mapping.formatHelp.also": "Obsługiwane także: ceny, stany magazynowe, obrazy, kategoria, gwarancja, ID EPREL, opisy HTML, dodatkowe obrazy, URL wideo i więcej — pobierz pełną próbkę.", - "mapping.formatHelp.downloadXml": "Pobierz przykładowy XML", - "mapping.formatHelp.downloadCsv": "Pobierz przykładowy CSV", - "mapping.formatHelp.xmlExample": "Przykład XML", - "mapping.formatHelp.csvExample": "Przykład CSV (nagłówek + wiersze)", - "mapping.sourcePreview.title": "Podgląd źródła feedu", - "mapping.sourcePreview.truncated": "Skrócone", - "mapping.sourcePreview.refresh": "Odśwież podgląd", - "mapping.sourcePreview.copy": "Kopiuj podgląd", - "mapping.sourcePreview.loading": "Ładowanie próbki feedu…", - "mapping.sourcePreview.errorHint": "Nadal możesz ręcznie wprowadzić ścieżkę elementu produktu. Wyodrębnij schemat, gdy URL feedu będzie dostępny.", - "mapping.sourcePreview.retry": "Ponów", - "mapping.sourcePreview.empty": "Brak podglądu", - "mapping.sourcePreview.emptyHintXml": "Kliknij „Wyodrębnij schemat”, aby pobrać próbkę i wykryć pola, albo wprowadź ścieżkę elementu ręcznie.", - "mapping.sourcePreview.emptyHintCsv": "Kliknij „Wyodrębnij schemat”, aby pobrać próbkę i wykryć pola.", - "mapping.sourcePreview.selectPath": "Wybierz ścieżkę: {path}", - "mapping.sourcePreview.clickTag": "Kliknij wiersz tagu, aby ustawić ścieżkę elementu produktu.", - "mapping.table.search": "Szukaj pól…", + "mapping.formatHelp.https": "Używaj publicznych adresów URL HTTPS dla zdalnych feedów (nie FTP ani localhost). PrzesyÅ‚anie CSV dziaÅ‚a dla plików lokalnych.", + "mapping.formatHelp.specs": "Specyfikacje jako pary Etykieta: wartość (np. {ram}). Wymiary: {height}, {width}, {depth}, {mass}", + "mapping.formatHelp.also": "ObsÅ‚ugiwane także: ceny, stany magazynowe, obrazy, kategoria, gwarancja, ID EPREL, opisy HTML, dodatkowe obrazy, URL wideo i wiÄ™cej — pobierz peÅ‚nÄ… próbkÄ™.", + "mapping.formatHelp.downloadXml": "Pobierz przykÅ‚adowy XML", + "mapping.formatHelp.downloadCsv": "Pobierz przykÅ‚adowy CSV", + "mapping.formatHelp.xmlExample": "PrzykÅ‚ad XML", + "mapping.formatHelp.csvExample": "PrzykÅ‚ad CSV (nagłówek + wiersze)", + "mapping.sourcePreview.title": "PodglÄ…d źródÅ‚a feedu", + "mapping.sourcePreview.truncated": "Skrócone", + "mapping.sourcePreview.refresh": "OdÅ›wież podglÄ…d", + "mapping.sourcePreview.copy": "Kopiuj podglÄ…d", + "mapping.sourcePreview.loading": "Ładowanie próbki feedu…", + "mapping.sourcePreview.errorHint": "Nadal możesz rÄ™cznie wprowadzić Å›cieżkÄ™ elementu produktu. WyodrÄ™bnij schemat, gdy URL feedu bÄ™dzie dostÄ™pny.", + "mapping.sourcePreview.retry": "Ponów", + "mapping.sourcePreview.empty": "Brak podglÄ…du", + "mapping.sourcePreview.emptyHintXml": "Kliknij „WyodrÄ™bnij schemat”, aby pobrać próbkÄ™ i wykryć pola, albo wprowadź Å›cieżkÄ™ elementu rÄ™cznie.", + "mapping.sourcePreview.emptyHintCsv": "Kliknij „WyodrÄ™bnij schemat”, aby pobrać próbkÄ™ i wykryć pola.", + "mapping.sourcePreview.selectPath": "Wybierz Å›cieżkÄ™: {path}", + "mapping.sourcePreview.clickTag": "Kliknij wiersz tagu, aby ustawić Å›cieżkÄ™ elementu produktu.", + "mapping.table.search": "Szukaj pól…", "mapping.table.all": "Wszystkie pola", "mapping.table.mapped": "Zmapowano", "mapping.table.unmapped": "Niezamapowane", "mapping.table.fieldName": "Nazwa pola", - "mapping.table.sourcePath": "Ścieżka źródła", - "mapping.table.sampleValues": "Przykładowe wartości", + "mapping.table.sourcePath": "Åšcieżka źródÅ‚a", + "mapping.table.sampleValues": "PrzykÅ‚adowe wartoÅ›ci", "mapping.table.type": "Typ", "mapping.table.mapTo": "Mapuj na", - "mapping.table.emptySchema": "Wyodrębnij schemat feedu, aby wypełnić pola źródłowe, albo dodaj mapowania ręcznie.", - "mapping.table.noMatch": "Żadne pola nie pasują do kryteriów.", + "mapping.table.emptySchema": "WyodrÄ™bnij schemat feedu, aby wypeÅ‚nić pola źródÅ‚owe, albo dodaj mapowania rÄ™cznie.", + "mapping.table.noMatch": "Å»adne pola nie pasujÄ… do kryteriów.", "mapping.table.unique": "{count} unikalnych", - "mapping.table.nested": "zagnieżdżone", + "mapping.table.nested": "zagnieżdżone", "mapping.table.apply": "Zastosuj", - "mapping.table.confirm": "Potwierdź", + "mapping.table.confirm": "Potwierdź", "mapping.table.suggestedMatch": "Sugerowane dopasowanie {confidence}", - "mapping.table.confirmFuzzyMatch": "Potwierdź przybliżone dopasowanie ({percent}%)", - "mapping.preview.title": "Podgląd mapowania", - "mapping.preview.subtitle": "Przykładowy kształt produktu na podstawie bieżących mapowań pól", - "mapping.preview.usingSamples": "· przy użyciu wyodrębnionych próbek", + "mapping.table.confirmFuzzyMatch": "Potwierdź przybliżone dopasowanie ({percent}%)", + "mapping.preview.title": "PodglÄ…d mapowania", + "mapping.preview.subtitle": "PrzykÅ‚adowy ksztaÅ‚t produktu na podstawie bieżących mapowaÅ„ pól", + "mapping.preview.usingSamples": "· przy użyciu wyodrÄ™bnionych próbek", "mapping.preview.formatCsv": "format: csv", "mapping.preview.item": "element: {path}", - "mapping.preview.sourceFields": "· {count} pól źródłowych", - "mapping.preview.empty": "Brak zmapowanych pól", - "mapping.preview.emptyHint": "Mapuj kolumny źródłowe lub węzły XPath na pola produktu. Tutaj pojawi się podgląd przykładowego produktu.", - "mapping.preview.rawSample": "Surowy fragment próbki", - "imports.title": "Przesyłania", - "imports.description": "Importy CSV zapisane dla tego obszaru roboczego — produkty, kategorie i atrybuty.", + "mapping.preview.sourceFields": "· {count} pól źródÅ‚owych", + "mapping.preview.empty": "Brak zmapowanych pól", + "mapping.preview.emptyHint": "Mapuj kolumny źródÅ‚owe lub wÄ™zÅ‚y XPath na pola produktu. Tutaj pojawi siÄ™ podglÄ…d przykÅ‚adowego produktu.", + "mapping.preview.rawSample": "Surowy fragment próbki", + "imports.title": "PrzesyÅ‚ania", + "imports.description": "Importy CSV zapisane dla tego obszaru roboczego — produkty, kategorie i atrybuty.", "imports.importProducts": "Importuj produkty", - "imports.emptyTitle": "Brak jeszcze przesłań", - "imports.emptyMessage": "Importy CSV produktów, kategorii i atrybutów pojawią się tutaj po przesłaniu.", - "imports.goProducts": "Przejdź do produktów", + "imports.emptyTitle": "Brak jeszcze przesÅ‚aÅ„", + "imports.emptyMessage": "Importy CSV produktów, kategorii i atrybutów pojawiÄ… siÄ™ tutaj po przesÅ‚aniu.", + "imports.goProducts": "Przejdź do produktów", "imports.categories": "Kategorie", - "imports.recent": "Ostatnie przesyłania", + "imports.recent": "Ostatnie przesyÅ‚ania", "imports.fileCount": "{count} plik", - "imports.fileCountPlural": "{count} plików", + "imports.fileCountPlural": "{count} plików", "imports.col.fileName": "Nazwa pliku", "imports.col.kind": "Rodzaj", - "imports.col.uploaded": "Przesłano", + "imports.col.uploaded": "PrzesÅ‚ano", "imports.col.size": "Rozmiar", - "imports.actions": "Akcje przesyłania", - "imports.loadFailed": "Nie udało się wczytać przesłań", - "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", + "imports.actions": "Akcje przesyÅ‚ania", + "imports.loadFailed": "Nie udaÅ‚o siÄ™ wczytać przesÅ‚aÅ„", + "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", "imports.metadataOnlyBadge": "Metadata only (blob not migrated)", - "imports.deleteConfirm": "Usunąć „{name}”? Usuwa rekord przesłania (oraz lokalny blob, jeśli istnieje).", - "imports.deleted": "Usunięto przesłanie.", - "imports.deleteFailed": "Nie udało się usunąć przesłania", - "imports.status.uploaded": "Przesłano", - "reviews.redirectLoading": "Otwieranie recenzji WooCommerce…", + "imports.deleteConfirm": "Usunąć „{name}”? Usuwa rekord przesÅ‚ania (oraz lokalny blob, jeÅ›li istnieje).", + "imports.deleted": "UsuniÄ™to przesÅ‚anie.", + "imports.deleteFailed": "Nie udaÅ‚o siÄ™ usunąć przesÅ‚ania", + "imports.status.uploaded": "PrzesÅ‚ano", + "reviews.redirectLoading": "Otwieranie recenzji WooCommerce…", "reviews.tab": "Recenzje", - "reviews.syncTitle": "Import opinii (sklep → Descrybe)", - "reviews.syncDesc": "Import przychodzący — pobierz recenzje produktów WooCommerce do Descrybe na potrzeby kampanii i reputacji", + "reviews.syncTitle": "Import opinii (sklep → Descrybe)", + "reviews.syncDesc": "Import przychodzÄ…cy — pobierz recenzje produktów WooCommerce do Descrybe na potrzeby kampanii i reputacji", "reviews.syncQueued": "Sync recenzji w kolejce", "reviews.statusBadge": "Recenzje: {status}", "reviews.syncedCount": "Zsynchronizowano {count}", "reviews.lastSync": "Ostatnia sync: {date}", - "reviews.noSyncYet": "Żadna sync recenzji nie została jeszcze ukończona.", - "reviews.needsReconnect": "Import recenzji nie może działać, dopóki dane logowania nie zostaną ponownie połączone po migracji. W zakładce Połączenie: Zapisz, potem Przetestuj połączenie.", - "reviews.queueImport": "Dodaj import opinii do kolejki (sklep → Descrybe)", + "reviews.noSyncYet": "Å»adna sync recenzji nie zostaÅ‚a jeszcze ukoÅ„czona.", + "reviews.needsReconnect": "Import recenzji nie może dziaÅ‚ać, dopóki dane logowania nie zostanÄ… ponownie połączone po migracji. W zakÅ‚adce Połączenie: Zapisz, potem Przetestuj połączenie.", + "reviews.queueImport": "Dodaj import opinii do kolejki (sklep → Descrybe)", "reviews.queueing": "Kolejkowanie...", - "reviews.saveTestFirst": "Zapisz dane logowania i przetestuj połączenie przed sync", - "reviews.refreshList": "Odśwież listę", - "reviews.loading": "Ładowanie recenzji…", + "reviews.saveTestFirst": "Zapisz dane logowania i przetestuj połączenie przed sync", + "reviews.refreshList": "OdÅ›wież listÄ™", + "reviews.loading": "Ładowanie recenzji…", "reviews.emptyTitle": "Brak jeszcze recenzji", - "reviews.emptyMessage": "Dodaj synchronizację recenzji do kolejki po połączeniu sklepu. Ta karta działa także z pustą listą.", + "reviews.emptyMessage": "Dodaj synchronizacjÄ™ recenzji do kolejki po połączeniu sklepu. Ta karta dziaÅ‚a także z pustÄ… listÄ….", "reviews.col.product": "Produkt", "reviews.col.reviewer": "Recenzent", "reviews.col.rating": "Ocena", "reviews.col.review": "Przejrzyj", - "reviews.queuedSuccess": "Synchronizacja recenzji w kolejce. Uruchomi się wkrótce.", - "reviews.queueFailed": "Nie można dodać synchronizacji recenzji do kolejki", + "reviews.queuedSuccess": "Synchronizacja recenzji w kolejce. Uruchomi siÄ™ wkrótce.", + "reviews.queueFailed": "Nie można dodać synchronizacji recenzji do kolejki", "campaigns.title": "Kampanie", - "campaigns.description": "Twórz sezonowe kampanie e-mail z katalogu — wybierz sezon, produkty, odbiorców i wygeneruj treść.", + "campaigns.description": "Twórz sezonowe kampanie e-mail z katalogu — wybierz sezon, produkty, odbiorców i wygeneruj treść.", "campaigns.new": "Nowa kampania", - "campaigns.loading": "Ładowanie kampanie…", - "campaigns.loadFailed": "Nie udało się załadować kampanie", - "campaigns.deleteConfirm": "Usunąć kampanię „{name}”? Tej operacji nie można cofnąć.", - "campaigns.deleted": "Kampania usunięta", - "campaigns.deleteFailed": "Nie udało się usunąć kampanii", - "campaigns.partialUnavailable": "Kampanie nie są teraz w pełni dostępne. Generowanie i wysyłka mogą się nie udać, dopóki usługa nie wróci.", - "campaigns.searchPlaceholder": "Szukaj kampanie…", - "campaigns.unavailableTitle": "Kampanie niedostępne", - "campaigns.unavailableMessage": "Usługa kampanii jest niedostępna. Możesz otworzyć kreator, ale generowanie i wysyłka poczekają na powrót usługi.", - "campaigns.openWizard": "Otwórz kreator tworzenia", - "campaigns.backDashboard": "Powrót do panelu", - "campaigns.browseProducts": "Przeglądaj produkty", + "campaigns.loading": "Ładowanie kampanie…", + "campaigns.loadFailed": "Nie udaÅ‚o siÄ™ zaÅ‚adować kampanie", + "campaigns.deleteConfirm": "Usunąć kampaniÄ™ „{name}”? Tej operacji nie można cofnąć.", + "campaigns.deleted": "Kampania usuniÄ™ta", + "campaigns.deleteFailed": "Nie udaÅ‚o siÄ™ usunąć kampanii", + "campaigns.partialUnavailable": "Kampanie nie sÄ… teraz w peÅ‚ni dostÄ™pne. Generowanie i wysyÅ‚ka mogÄ… siÄ™ nie udać, dopóki usÅ‚uga nie wróci.", + "campaigns.searchPlaceholder": "Szukaj kampanie…", + "campaigns.unavailableTitle": "Kampanie niedostÄ™pne", + "campaigns.unavailableMessage": "UsÅ‚uga kampanii jest niedostÄ™pna. Możesz otworzyć kreator, ale generowanie i wysyÅ‚ka poczekajÄ… na powrót usÅ‚ugi.", + "campaigns.openWizard": "Otwórz kreator tworzenia", + "campaigns.backDashboard": "Powrót do panelu", + "campaigns.browseProducts": "PrzeglÄ…daj produkty", "campaigns.emptyTitle": "Brak kampanie", - "campaigns.noMatches": "Brak dopasowań", - "campaigns.emptyMessage": "Utwórz kampanię Black Friday, świąteczną lub własną w kilku krokach — sezonowe ustawienia domyślne są gotowe na start.", - "campaigns.noMatchesMessage": "Spróbuj innej nazwy, sezonu lub statusu.", - "campaigns.create": "Utwórz kampania", + "campaigns.noMatches": "Brak dopasowaÅ„", + "campaigns.emptyMessage": "Utwórz kampaniÄ™ Black Friday, Å›wiÄ…tecznÄ… lub wÅ‚asnÄ… w kilku krokach — sezonowe ustawienia domyÅ›lne sÄ… gotowe na start.", + "campaigns.noMatchesMessage": "Spróbuj innej nazwy, sezonu lub statusu.", + "campaigns.create": "Utwórz kampania", "campaigns.col.season": "Sezon", "campaigns.col.updated": "Zaktualizowano", "campaigns.scheduled": "Zaplanowano {date}", "campaigns.newTitle": "Nowa kampania", - "campaigns.newDesc": "Wybierz sezon, produkty i odbiorców, napisz prompt, a następnie wygeneruj, przetestuj i zaplanuj.", + "campaigns.newDesc": "Wybierz sezon, produkty i odbiorców, napisz prompt, a nastÄ™pnie wygeneruj, przetestuj i zaplanuj.", "campaigns.editTitle": "Edytuj kampania", - "campaigns.editDesc": "Zaktualizuj sezon, produkty i odbiorców — potem wygeneruj ponownie, wyślij test lub zaplanuj.", - "campaignWizard.loading": "Ładowanie kreatora kampanii…", - "campaignWizard.apiMissing": "API kampanii jest tymczasowo niedostępne. Możesz przeglądać kreator; zapis / generowanie / wysyłka wymagają dostępnego /api/campaigns.", - "campaignWizard.upgradeTitle": "Kampanie AI to funkcja płatna", - "campaignWizard.upgradeMessage": "Plany Free mogą przygotować sezony i odbiorców, ale Generuj AI wymaga Starter lub wyżej. Ulepsz, aby odblokować szkice e-mail AI.", - "campaignWizard.comparePlans": "Porównaj plany", + "campaigns.editDesc": "Zaktualizuj sezon, produkty i odbiorców — potem wygeneruj ponownie, wyÅ›lij test lub zaplanuj.", + "campaignWizard.loading": "Ładowanie kreatora kampanii…", + "campaignWizard.apiMissing": "API kampanii jest tymczasowo niedostÄ™pne. Możesz przeglÄ…dać kreator; zapis / generowanie / wysyÅ‚ka wymagajÄ… dostÄ™pnego /api/campaigns.", + "campaignWizard.upgradeTitle": "Kampanie AI to funkcja pÅ‚atna", + "campaignWizard.upgradeMessage": "Plany Free mogÄ… przygotować sezony i odbiorców, ale Generuj AI wymaga Starter lub wyżej. Ulepsz, aby odblokować szkice e-mail AI.", + "campaignWizard.comparePlans": "Porównaj plany", "campaignWizard.step.season": "Sezon", "campaignWizard.step.catalog": "Produkty", "campaignWizard.step.audience": "Odbiorcy", "campaignWizard.step.prompt": "Prompt", - "campaignWizard.step.preview": "Podgląd", - "campaignWizard.step.send": "Wyślij", + "campaignWizard.step.preview": "PodglÄ…d", + "campaignWizard.step.send": "WyÅ›lij", "campaignWizard.pickSeason": "Wybierz sezon", - "campaignWizard.pickSeasonHelp": "Zacznij od szablonu — wszystko edytujesz później.", + "campaignWizard.pickSeasonHelp": "Zacznij od szablonu — wszystko edytujesz później.", "campaignWizard.name": "Nazwa kampanii", "campaignWizard.namePlaceholder": "Black Friday 2026", "campaignWizard.catalogTitle": "Kategorie i produkty", - "campaignWizard.catalogHelp": "Wybierz, co ma wyróżnić ten e-mail. Same kategorie wystarczą na szybki start.", + "campaignWizard.catalogHelp": "Wybierz, co ma wyróżnić ten e-mail. Same kategorie wystarczÄ… na szybki start.", "campaignWizard.categories": "Kategorie", - "campaignWizard.noCategories": "Brak kategorii — dodaj je w Katalogu.", + "campaignWizard.noCategories": "Brak kategorii — dodaj je w Katalogu.", "campaignWizard.categoriesSelected": "{count} kategoria wybrana", "campaignWizard.categoriesSelectedPlural": "{count} kategorie wybrane", "campaignWizard.productsOptional": "Produkty (opcjonalnie)", "campaignWizard.selectedCount": "{count} wybrano", - "campaignWizard.searchProducts": "Szukaj produktów…", + "campaignWizard.searchProducts": "Szukaj produktów…", "campaignWizard.noProducts": "Nie znaleziono: produkty.", - "campaignWizard.audienceTitle": "Kto powinien to otrzymać?", - "campaignWizard.audienceHelp": "Domyślnie wszyscy. Zawęż kategoriami lub dawnymi nabywcami, gdy zamówienia są sync.", + "campaignWizard.audienceTitle": "Kto powinien to otrzymać?", + "campaignWizard.audienceHelp": "DomyÅ›lnie wszyscy. Zawęż kategoriami lub dawnymi nabywcami, gdy zamówienia sÄ… sync.", "campaignWizard.audience.all": "Wszystkie kontakty", - "campaignWizard.audience.allHint": "Wyślij do całej listy (gdy skonfigurowano dostawcę e-mail).", - "campaignWizard.audience.byCategory": "Według zainteresowania kategorią", - "campaignWizard.audience.byCategoryHint": "Osoby powiązane z wybranymi kategoriami.", + "campaignWizard.audience.allHint": "WyÅ›lij do caÅ‚ej listy (gdy skonfigurowano dostawcÄ™ e-mail).", + "campaignWizard.audience.byCategory": "WedÅ‚ug zainteresowania kategoriÄ…", + "campaignWizard.audience.byCategoryHint": "Osoby powiÄ…zane z wybranymi kategoriami.", "campaignWizard.audience.purchased": "Zakupiono w kategorii", - "campaignWizard.audience.purchasedHint": "Klienci, którzy kupili produkty w kategoriach odbiorców (z zamówień sync).", + "campaignWizard.audience.purchasedHint": "Klienci, którzy kupili produkty w kategoriach odbiorców (z zamówieÅ„ sync).", "campaignWizard.audience.notPurchased": "Jeszcze nie zakupiono", - "campaignWizard.audience.notPurchasedHint": "Kontakty, które nie kupiły tych kategorii — świetne do win-back.", - "campaignWizard.ordersHint": "Targeting kupione / niekupione pojawia się po sync zamówień WooCommerce.", - "campaignWizard.audienceCategories": "Kategorie odbiorców", + "campaignWizard.audience.notPurchasedHint": "Kontakty, które nie kupiÅ‚y tych kategorii — Å›wietne do win-back.", + "campaignWizard.ordersHint": "Targeting kupione / niekupione pojawia siÄ™ po sync zamówieÅ„ WooCommerce.", + "campaignWizard.audienceCategories": "Kategorie odbiorców", "campaignWizard.promptTitle": "Prompt e-mail", - "campaignWizard.promptHelp": "Wypełniliśmy solidne domyślne dla {season}. Edytuj swobodnie lub zostaw.", + "campaignWizard.promptHelp": "WypeÅ‚niliÅ›my solidne domyÅ›lne dla {season}. Edytuj swobodnie lub zostaw.", "campaignWizard.promptSeasonFallback": "ten sezon", - "campaignWizard.useDefaultPrompt": "Użyj domyślnego promptu sezonowego", + "campaignWizard.useDefaultPrompt": "Użyj domyÅ›lnego promptu sezonowego", "campaignWizard.promptLabel": "Prompt", "campaignWizard.advanced": "Opcje zaawansowane", - "campaignWizard.advancedHelp": "Generowanie AI używa zestawu marki (jeśli ustawiony) i wybranych produktów. Podgląd tylko szablonu pomija AI i działa jako szkielet layoutu.", - "campaignWizard.planFree": "Bezpłatny", - "campaignWizard.planPaid": "Płatne", + "campaignWizard.advancedHelp": "Generowanie AI używa zestawu marki (jeÅ›li ustawiony) i wybranych produktów. PodglÄ…d tylko szablonu pomija AI i dziaÅ‚a jako szkielet layoutu.", + "campaignWizard.planFree": "BezpÅ‚atny", + "campaignWizard.planPaid": "PÅ‚atne", "campaignWizard.planLine": "Plan:", - "campaignWizard.aiLocked": "— Generuj AI jest zablokowane.", + "campaignWizard.aiLocked": "— Generuj AI jest zablokowane.", "campaignWizard.generateAi": "Generuj AI", - "campaignWizard.templatePreview": "Podgląd szablonu", + "campaignWizard.templatePreview": "PodglÄ…d szablonu", "campaignWizard.saveDraft": "Zapisz szkic", - "campaignWizard.previewTitle": "Podgląd", + "campaignWizard.previewTitle": "PodglÄ…d", "campaignWizard.status": "Stan:", - "campaignWizard.generateToSee": "Wygeneruj szkic, aby zobaczyć treść e-maila.", - "campaignWizard.noPreview": "Brak podglądu. Wróć do Prompt i uruchom Generuj AI lub Podgląd szablonu.", - "campaignWizard.backToPrompt": "Wróć do promptu", + "campaignWizard.generateToSee": "Wygeneruj szkic, aby zobaczyć treść e-maila.", + "campaignWizard.noPreview": "Brak podglÄ…du. Wróć do Prompt i uruchom Generuj AI lub PodglÄ…d szablonu.", + "campaignWizard.backToPrompt": "Wróć do promptu", "campaignWizard.subject": "Temat", - "campaignWizard.emailPreview": "Podgląd e-maila", + "campaignWizard.emailPreview": "PodglÄ…d e-maila", "campaignWizard.regenerateAi": "Wygeneruj ponownie z AI", "campaignWizard.regenerate": "Wygeneruj ponownie", - "campaignWizard.continueSend": "Kontynuuj do wysyłki", - "campaignWizard.testSend": "Wysyłka testowa", - "campaignWizard.testSendHelp": "Wyślij sobie kopię przed zaplanowaniem.", + "campaignWizard.continueSend": "Kontynuuj do wysyÅ‚ki", + "campaignWizard.testSend": "WysyÅ‚ka testowa", + "campaignWizard.testSendHelp": "WyÅ›lij sobie kopiÄ™ przed zaplanowaniem.", "campaignWizard.testEmail": "E-mail testowy", "campaignWizard.testEmailPlaceholder": "ty@firma.com", - "campaignWizard.sendTest": "Wyślij test", + "campaignWizard.sendTest": "WyÅ›lij test", "campaignWizard.scheduleTitle": "Zaplanuj", - "campaignWizard.scheduleHelp": "Wybierz, kiedy ta kampania ma wyjść.", - "campaignWizard.sendAt": "Wyślij o", - "campaignWizard.schedule": "Zaplanuj kampanię", - "campaignWizard.generateToContinue": "Wygeneruj, aby kontynuować", + "campaignWizard.scheduleHelp": "Wybierz, kiedy ta kampania ma wyjść.", + "campaignWizard.sendAt": "WyÅ›lij o", + "campaignWizard.schedule": "Zaplanuj kampaniÄ™", + "campaignWizard.generateToContinue": "Wygeneruj, aby kontynuować", "campaignWizard.done": "Gotowe", - "campaignWizard.loadFailed": "Nie udało się wczytać kreatora", - "campaignWizard.pickCatalog": "Wybierz co najmniej jedną kategorię lub produkt", - "campaignWizard.pickAudienceCats": "Wybierz kategorie odbiorców dla tego filtra", - "campaignWizard.completeStep": "Ukończ ten krok, aby kontynuować", + "campaignWizard.loadFailed": "Nie udaÅ‚o siÄ™ wczytać kreatora", + "campaignWizard.pickCatalog": "Wybierz co najmniej jednÄ… kategoriÄ™ lub produkt", + "campaignWizard.pickAudienceCats": "Wybierz kategorie odbiorców dla tego filtra", + "campaignWizard.completeStep": "UkoÅ„cz ten krok, aby kontynuować", "campaignWizard.aiDraftReady": "Wygenerowano szkic AI", - "campaignWizard.templateReady": "Podgląd szablonu gotowy", - "campaignWizard.unavailableSave": "Kampanie są teraz niedostępne. Szkiców nie można zapisać, dopóki funkcja nie będzie aktywna.", - "campaignWizard.generateFailed": "Generowanie nie powiodło się", - "campaignWizard.generateFirst": "Najpierw wygeneruj podgląd", - "campaignWizard.enterTestEmail": "Wprowadź testowy adres e-mail", - "campaignWizard.testFailed": "Wysłanie testowe nie powiodło się", - "campaignWizard.pickSchedule": "Wybierz datę i godzinę", + "campaignWizard.templateReady": "PodglÄ…d szablonu gotowy", + "campaignWizard.unavailableSave": "Kampanie sÄ… teraz niedostÄ™pne. Szkiców nie można zapisać, dopóki funkcja nie bÄ™dzie aktywna.", + "campaignWizard.generateFailed": "Generowanie nie powiodÅ‚o siÄ™", + "campaignWizard.generateFirst": "Najpierw wygeneruj podglÄ…d", + "campaignWizard.enterTestEmail": "Wprowadź testowy adres e-mail", + "campaignWizard.testFailed": "WysÅ‚anie testowe nie powiodÅ‚o siÄ™", + "campaignWizard.pickSchedule": "Wybierz datÄ™ i godzinÄ™", "campaignWizard.scheduled": "Kampania zaplanowana", - "campaignWizard.scheduleFailed": "Planowanie nie powiodło się", + "campaignWizard.scheduleFailed": "Planowanie nie powiodÅ‚o siÄ™", "campaignWizard.draftSaved": "Zapisano szkic", - "campaignWizard.unavailableShort": "Kampanie są teraz niedostępne.", - "campaignWizard.saveFailed": "Zapis nie powiódł się", - "marketing.calendarTitle": "Kalendarz treści", - "marketing.calendarDesc": "Połącz kampanie sezonowe z datami, potem przygotuj feed eksportu z domyślnymi shopping.", - "marketing.loadFailed": "Nie udało się wczytać kalendarza", + "campaignWizard.unavailableShort": "Kampanie sÄ… teraz niedostÄ™pne.", + "campaignWizard.saveFailed": "Zapis nie powiódÅ‚ siÄ™", + "marketing.calendarTitle": "Kalendarz treÅ›ci", + "marketing.calendarDesc": "Połącz kampanie sezonowe z datami, potem przygotuj feed eksportu z domyÅ›lnymi shopping.", + "marketing.loadFailed": "Nie udaÅ‚o siÄ™ wczytać kalendarza", "marketing.prepared": "Kampania przygotowana", - "marketing.alreadyReady": "Kampania jest już gotowa", - "marketing.exportFeedsHint": "{name} → Feedy eksportu", - "marketing.prepareFailed": "Nie można przygotować kampanii", - "marketing.requestFailed": "Żądanie nie powiodło się", - "marketing.emptyTitle": "Brak presetów sezonowych", - "marketing.emptyMessage": "Presety kalendarza pojawią się tutaj, gdy API marketingowe będzie dostępne.", - "marketing.openCampaigns": "Otwórz kampanie e-mail", + "marketing.alreadyReady": "Kampania jest już gotowa", + "marketing.exportFeedsHint": "{name} → Feedy eksportu", + "marketing.prepareFailed": "Nie można przygotować kampanii", + "marketing.requestFailed": "Żądanie nie powiodÅ‚o siÄ™", + "marketing.emptyTitle": "Brak presetów sezonowych", + "marketing.emptyMessage": "Presety kalendarza pojawiÄ… siÄ™ tutaj, gdy API marketingowe bÄ™dzie dostÄ™pne.", + "marketing.openCampaigns": "Otwórz kampanie e-mail", "marketing.window": "Okno:", - "marketing.linkedExport": "Powiązany eksport:", - "marketing.openPrepared": "Otwórz przygotowany feed", - "marketing.preparing": "Przygotowywanie…", - "marketing.prepareNamed": "Przygotuj kampanię {name}", - "marketing.footer": "Kampanie e-mail pozostają pod {link} — ta strona tylko przygotowuje feedy eksportu katalogu.", + "marketing.linkedExport": "PowiÄ…zany eksport:", + "marketing.openPrepared": "Otwórz przygotowany feed", + "marketing.preparing": "Przygotowywanie…", + "marketing.prepareNamed": "Przygotuj kampaniÄ™ {name}", + "marketing.footer": "Kampanie e-mail pozostajÄ… pod {link} — ta strona tylko przygotowuje feedy eksportu katalogu.", "common.done": "Gotowe", "common.copied": "Skopiowano do schowka.", - "common.copyFailed": "Nie można skopiować. Zaznacz tekst i skopiuj ręcznie.", - "common.submitting": "Wysyłanie…", - "common.sending": "Wysyłanie…", - "settings.companyAdminOnlyView": "Tylko admini firmy mogą zmieniać ustawienia firmy. Możesz zobaczyć szczegóły bieżącego obszaru roboczego.", - "settings.activeCompanyHelp": "Obszar roboczy katalogu, feedów, rozliczeń i kluczy API. Przełączaj w dowolnej chwili stąd lub z nagłówka.", + "common.copyFailed": "Nie można skopiować. Zaznacz tekst i skopiuj rÄ™cznie.", + "common.submitting": "WysyÅ‚anie…", + "common.sending": "WysyÅ‚anie…", + "settings.companyAdminOnlyView": "Tylko admini firmy mogÄ… zmieniać ustawienia firmy. Możesz zobaczyć szczegóły bieżącego obszaru roboczego.", + "settings.activeCompanyHelp": "Obszar roboczy katalogu, feedów, rozliczeÅ„ i kluczy API. Przełączaj w dowolnej chwili stÄ…d lub z nagłówka.", "settings.noCompanySelected": "Nie wybrano firmy", - "settings.creditsOverviewHelp": "Saldo kredytów AI aktywnej firmy. Szczegółowe użycie jest w Rozliczeniach.", + "settings.creditsOverviewHelp": "Saldo kredytów AI aktywnej firmy. Szczegółowe użycie jest w Rozliczeniach.", "settings.billingLabel": "Rozliczenia", - "settings.remainingLabel": "Pozostało", - "settings.creditsUnavailable": "Saldo kredytów nie jest jeszcze dostępne dla tego obszaru roboczego.", - "settings.openBilling": "Otwórz użycie i rozliczenia", - "settings.companyNameHelp": "Ta nazwa pojawia się w zaproszeniach i ustawieniach organizacji", - "settings.contentSettingsHelp": "Skonfiguruj język i dopasowanie produktów dla generowanych treści", - "settings.mergeProductsHelp": "Gdy włączone, importy CSV łączą wiersze z tym samym GTIN w jeden produkt. Wyłącz, aby każdy wiersz był osobny.", - "settings.emailIntegrationHelp": "Skonfiguruj Resend lub SMTP do zaproszeń, kampanii i poczty transakcyjnej.", + "settings.remainingLabel": "PozostaÅ‚o", + "settings.creditsUnavailable": "Saldo kredytów nie jest jeszcze dostÄ™pne dla tego obszaru roboczego.", + "settings.openBilling": "Otwórz użycie i rozliczenia", + "settings.companyNameHelp": "Ta nazwa pojawia siÄ™ w zaproszeniach i ustawieniach organizacji", + "settings.contentSettingsHelp": "Skonfiguruj jÄ™zyk i dopasowanie produktów dla generowanych treÅ›ci", + "settings.mergeProductsHelp": "Gdy włączone, importy CSV łączÄ… wiersze z tym samym GTIN w jeden produkt. Wyłącz, aby każdy wiersz byÅ‚ osobny.", + "settings.emailIntegrationHelp": "Skonfiguruj Resend lub SMTP do zaproszeÅ„, kampanii i poczty transakcyjnej.", "settings.configureEmail": "Skonfiguruj e-mail", - "settings.aiIntegrationsHelp": "Kredyty platformy lub własny klucz oraz edytowalne prompty do tytułów, opisów, SEO i kampanii. Klucze szyfrowane w spoczynku.", - "settings.openAiIntegrations": "Otwórz integracje AI", - "settings.companyNameRequired": "Wprowadź nazwę firmy.", + "settings.aiIntegrationsHelp": "Kredyty platformy lub wÅ‚asny klucz oraz edytowalne prompty do tytułów, opisów, SEO i kampanii. Klucze szyfrowane w spoczynku.", + "settings.openAiIntegrations": "Otwórz integracje AI", + "settings.companyNameRequired": "Wprowadź nazwÄ™ firmy.", "settings.companySaved": "Zapisano ustawienia firmy.", - "settings.companyUpdateFailed": "Nie udało się zaktualizować firmy", - "settings.mergeOn": "Produkty z tym samym GTIN zostaną scalone między feedami.", - "settings.mergeOff": "Produkty z tym samym GTIN pozostają osobne.", - "settings.mergeUpdateFailed": "Nie udało się zaktualizować ustawienia scalania", - "settings.inAppToastsHelp": "Tylko w tej przeglądarce. Błędy domyślnie włączone; ukończenia wyciszone, by zmniejszyć szum. Feedback formularzy i Cofnij nigdy nie są wyciszane.", - "settings.emailAlertsHelp": "Preferencje alertów e-mail wkrótce. Alerty błędów domyślnie włączone (jak w aplikacji); maile o ukończeniu wyłączone, chyba że się zapiszesz.", - "settings.emailAlertsBody": "Na razie skonfiguruj mail transakcyjny w Firma → Integracja e-mail. Alerty in-app powyżej nadal obowiązują.", - "settings.apiKeysLegacyNotice": "Starsze klucze API nie zostały zmigrowane. Utwórz nowy — sekret pokazywany jest tylko raz.", - "settings.apiKeysAdminOnly": "Tylko administratorzy firmy mogą tworzyć lub unieważniać klucze API. Możesz przeglądać istniejące prefiksy.", - "settings.apiKeysCopyUnavailableNotice": "Kopiowanie niedostępne dla istniejących kluczy — przechowywany jest tylko prefiks. Utwórz nowy, skopiuj sekret raz, potem unieważnij stary w razie potrzeby.", - "settings.apiKeysForbidden": "Nie masz uprawnień do przeglądania kluczy API. Poproś administratora firmy o pomoc.", + "settings.companyUpdateFailed": "Nie udaÅ‚o siÄ™ zaktualizować firmy", + "settings.mergeOn": "Produkty z tym samym GTIN zostanÄ… scalone miÄ™dzy feedami.", + "settings.mergeOff": "Produkty z tym samym GTIN pozostajÄ… osobne.", + "settings.mergeUpdateFailed": "Nie udaÅ‚o siÄ™ zaktualizować ustawienia scalania", + "settings.inAppToastsHelp": "Tylko w tej przeglÄ…darce. Błędy domyÅ›lnie włączone; ukoÅ„czenia wyciszone, by zmniejszyć szum. Feedback formularzy i Cofnij nigdy nie sÄ… wyciszane.", + "settings.emailAlertsHelp": "Preferencje alertów e-mail wkrótce. Alerty błędów domyÅ›lnie włączone (jak w aplikacji); maile o ukoÅ„czeniu wyłączone, chyba że siÄ™ zapiszesz.", + "settings.emailAlertsBody": "Na razie skonfiguruj mail transakcyjny w Firma → Integracja e-mail. Alerty in-app powyżej nadal obowiÄ…zujÄ….", + "settings.apiKeysLegacyNotice": "Starsze klucze API nie zostaÅ‚y zmigrowane. Utwórz nowy — sekret pokazywany jest tylko raz.", + "settings.apiKeysAdminOnly": "Tylko administratorzy firmy mogÄ… tworzyć lub unieważniać klucze API. Możesz przeglÄ…dać istniejÄ…ce prefiksy.", + "settings.apiKeysCopyUnavailableNotice": "Kopiowanie niedostÄ™pne dla istniejÄ…cych kluczy — przechowywany jest tylko prefiks. Utwórz nowy, skopiuj sekret raz, potem unieważnij stary w razie potrzeby.", + "settings.apiKeysForbidden": "Nie masz uprawnieÅ„ do przeglÄ…dania kluczy API. PoproÅ› administratora firmy o pomoc.", "settings.noApiKeys": "Brak kluczy API", - "settings.noApiKeysHelpAdmin": "Starsze klucze API nie zostały zmigrowane. Utwórz nowy do uwierzytelniania żądań Descrybe (X-API-Key). Pełny sekret pokazywany jest tylko raz.", - "settings.noApiKeysHelpMember": "Brak jeszcze kluczy API dla tej firmy. Starsze nie zostały zmigrowane — poproś administratora o utworzenie.", + "settings.noApiKeysHelpAdmin": "Starsze klucze API nie zostaÅ‚y zmigrowane. Utwórz nowy do uwierzytelniania żądaÅ„ Descrybe (X-API-Key). PeÅ‚ny sekret pokazywany jest tylko raz.", + "settings.noApiKeysHelpMember": "Brak jeszcze kluczy API dla tej firmy. Starsze nie zostaÅ‚y zmigrowane — poproÅ› administratora o utworzenie.", "settings.unnamedKey": "Klucz bez nazwy", - "settings.neverUsed": "Nigdy nie użyto", + "settings.neverUsed": "Nigdy nie użyto", "settings.apiKeyActions": "Akcje klucza API", - "settings.copyUnavailable": "Kopiowanie niedostępne", - "settings.copyUnavailableTitle": "Pełny sekret jest pokazywany tylko raz przy utworzeniu klucza", - "settings.revoke": "Unieważnij", - "settings.apiKeyNameRequired": "Wprowadź nazwę tego klucza API.", - "settings.apiKeyCreatedOnce": "Utworzono klucz API. Skopiuj teraz — nie będzie już pokazywany.", + "settings.copyUnavailable": "Kopiowanie niedostÄ™pne", + "settings.copyUnavailableTitle": "PeÅ‚ny sekret jest pokazywany tylko raz przy utworzeniu klucza", + "settings.revoke": "Unieważnij", + "settings.apiKeyNameRequired": "Wprowadź nazwÄ™ tego klucza API.", + "settings.apiKeyCreatedOnce": "Utworzono klucz API. Skopiuj teraz — nie bÄ™dzie już pokazywany.", "settings.apiKeyCreated": "Utworzono klucz API.", - "settings.apiKeyCreateFailed": "Nie można utworzyć klucza API", - "settings.apiKeyRevokeConfirm": "Unieważnić ten klucz API? Żądania go używające przestaną działać.", - "settings.apiKeyRevoked": "Unieważniono klucz API.", - "settings.apiKeyRevokeFailed": "Nie można unieważnić klucza API", + "settings.apiKeyCreateFailed": "Nie można utworzyć klucza API", + "settings.apiKeyRevokeConfirm": "Unieważnić ten klucz API? Żądania go używajÄ…ce przestanÄ… dziaÅ‚ać.", + "settings.apiKeyRevoked": "Unieważniono klucz API.", + "settings.apiKeyRevokeFailed": "Nie można unieważnić klucza API", "settings.apiKeyCopied": "Skopiowano klucz API.", - "settings.createApiKeyOnceHelp": "Skopiuj ten klucz teraz — nie będzie już pokazywany. Używaj jako Authorization: Bearer lub X-API-Key na /api/v1.", - "settings.createApiKeyNameHelp": "Nazwij klucz, by później go rozróżnić. Po utworzeniu wysyłaj jako Authorization: Bearer (zalecane) lub X-API-Key.", + "settings.createApiKeyOnceHelp": "Skopiuj ten klucz teraz — nie bÄ™dzie już pokazywany. Używaj jako Authorization: Bearer lub X-API-Key na /api/v1.", + "settings.createApiKeyNameHelp": "Nazwij klucz, by później go rozróżnić. Po utworzeniu wysyÅ‚aj jako Authorization: Bearer (zalecane) lub X-API-Key.", "settings.keyNamePlaceholder": "np. Production", "settings.newApiKeyAria": "Nowy klucz API pokazany raz", "settings.copyApiKeyAria": "Kopiuj klucz API", - "settings.alert.sync_fail.title": "Błędy sync", - "settings.alert.sync_fail.description": "Gdy synchronizacja feedu przekroczy czas lub API zwróci błąd.", - "settings.alert.sync_done.title": "Sync zakończona", - "settings.alert.sync_done.description": "Gdy synchronizacja feedu zakończy się pomyślnie.", - "settings.alert.ai_fail.title": "Błędy AI / przetwarzania", - "settings.alert.ai_fail.description": "Gdy uruchomienie lub przebieg zadania przetwarzania nie powiedzie się.", - "settings.alert.ai_done.title": "AI / przetwarzanie zakończone", - "settings.alert.ai_done.description": "Gdy zadanie w tle zakończy się pomyślnie. Toasty startu zawsze włączone, by Cofnij było dostępne.", - "settings.alert.export_fail.title": "Błędy eksportu", - "settings.alert.export_fail.description": "Gdy eksport produktu lub feedu eksportu nie powiedzie się.", - "settings.alert.export_done.title": "Eksport zakończony", - "settings.alert.export_done.description": "Gdy eksport zakończy się pomyślnie.", + "settings.alert.sync_fail.title": "Błędy sync", + "settings.alert.sync_fail.description": "Gdy synchronizacja feedu przekroczy czas lub API zwróci błąd.", + "settings.alert.sync_done.title": "Sync zakoÅ„czona", + "settings.alert.sync_done.description": "Gdy synchronizacja feedu zakoÅ„czy siÄ™ pomyÅ›lnie.", + "settings.alert.ai_fail.title": "Błędy AI / przetwarzania", + "settings.alert.ai_fail.description": "Gdy uruchomienie lub przebieg zadania przetwarzania nie powiedzie siÄ™.", + "settings.alert.ai_done.title": "AI / przetwarzanie zakoÅ„czone", + "settings.alert.ai_done.description": "Gdy zadanie w tle zakoÅ„czy siÄ™ pomyÅ›lnie. Toasty startu zawsze włączone, by Cofnij byÅ‚o dostÄ™pne.", + "settings.alert.export_fail.title": "Błędy eksportu", + "settings.alert.export_fail.description": "Gdy eksport produktu lub feedu eksportu nie powiedzie siÄ™.", + "settings.alert.export_done.title": "Eksport zakoÅ„czony", + "settings.alert.export_done.description": "Gdy eksport zakoÅ„czy siÄ™ pomyÅ›lnie.", "settings.alert.support_reply.title": "Odpowiedzi personelu wsparcia", - "settings.alert.support_reply.description": "Gdy agent platformy odpowie na Twoje zgłoszenie wsparcia.", + "settings.alert.support_reply.description": "Gdy agent platformy odpowie na Twoje zgÅ‚oszenie wsparcia.", "settings.alert.support_status.title": "Zmiany statusu wsparcia", - "settings.alert.support_status.description": "Gdy zgłoszenie wsparcia przejdzie do oczekujące lub rozwiązane.", - "empty.forbidden.title.company": "Odmowa uprawnień", - "empty.forbidden.title.platform": "Dostęp ograniczony", - "empty.forbidden.message.company": "Nie masz uprawnień. Poproś administratora firmy o pomoc.", - "empty.forbidden.message.platform": "Ten obszar jest dostępny tylko dla administratorów platformy.", - "empty.forbidden.message.support": "Ten obszar jest dostępny tylko dla wsparcia i administratorów platformy.", - "empty.forbidden.backDashboard": "Powrót do panelu", - "empty.forbidden.apiKeys": "Nie masz uprawnień do przeglądania kluczy API. Poproś administratora firmy o pomoc.", - "empty.forbidden.ai": "Nie masz uprawnień do ustawień dostawcy AI. Poproś administratora firmy o pomoc.", - "empty.forbidden.email": "Nie masz uprawnień do ustawień dostawcy e-mail. Poproś administratora firmy o pomoc.", - "confirm.defaultTitle": "Potwierdź usunięcie", + "settings.alert.support_status.description": "Gdy zgÅ‚oszenie wsparcia przejdzie do oczekujÄ…ce lub rozwiÄ…zane.", + "empty.forbidden.title.company": "Odmowa uprawnieÅ„", + "empty.forbidden.title.platform": "DostÄ™p ograniczony", + "empty.forbidden.message.company": "Nie masz uprawnieÅ„. PoproÅ› administratora firmy o pomoc.", + "empty.forbidden.message.platform": "Ten obszar jest dostÄ™pny tylko dla administratorów platformy.", + "empty.forbidden.message.support": "Ten obszar jest dostÄ™pny tylko dla wsparcia i administratorów platformy.", + "empty.forbidden.backDashboard": "Powrót do panelu", + "empty.forbidden.apiKeys": "Nie masz uprawnieÅ„ do przeglÄ…dania kluczy API. PoproÅ› administratora firmy o pomoc.", + "empty.forbidden.ai": "Nie masz uprawnieÅ„ do ustawieÅ„ dostawcy AI. PoproÅ› administratora firmy o pomoc.", + "empty.forbidden.email": "Nie masz uprawnieÅ„ do ustawieÅ„ dostawcy e-mail. PoproÅ› administratora firmy o pomoc.", + "confirm.defaultTitle": "Potwierdź usuniÄ™cie", "confirm.defaultDescription": "Czy na pewno?", - "confirm.defaultConfirm": "Potwierdź", - "confirm.deleteFeed": "Usunąć feed „{name}”? Tego nie można cofnąć.", - "confirm.deleteCampaign": "Usunąć kampanię „{name}”? Tej operacji nie można cofnąć.", - "confirm.deleteExportFeed": "Czy na pewno chcesz usunąć ten feed eksportu?", + "confirm.defaultConfirm": "Potwierdź", + "confirm.deleteFeed": "Usunąć feed „{name}”? Tego nie można cofnąć.", + "confirm.deleteCampaign": "Usunąć kampaniÄ™ „{name}”? Tej operacji nie można cofnąć.", + "confirm.deleteExportFeed": "Czy na pewno chcesz usunąć ten feed eksportu?", "confirm.rotateExportToken": "Obrocic token URL feedu? Stary publiczny URL przestanie dzialac natychmiast.", - "confirm.deleteUpload": "Usunąć „{name}”? Usuwa rekord przesłania (oraz lokalny blob, jeśli istnieje).", - "confirm.revokeApiKey": "Unieważnić ten klucz API? Żądania go używające przestaną działać.", - "confirm.deleteKnowledgeArticle": "Usunąć ten artykuł bazy wiedzy?", - "confirm.deleteReplyTemplate": "Usunąć ten szablon odpowiedzi?", - "confirm.deleteStructuredField": "Czy na pewno chcesz usunąć to pole? Tej operacji nie można cofnąć.", - "toast.campaign.pickAudience": "Wybierz co najmniej jedną kategorię lub produkt", - "toast.campaign.pickCategories": "Wybierz kategorie odbiorców dla tego filtra", - "toast.campaign.completeStep": "Ukończ ten krok, aby kontynuować", + "confirm.deleteUpload": "Usunąć „{name}”? Usuwa rekord przesÅ‚ania (oraz lokalny blob, jeÅ›li istnieje).", + "confirm.revokeApiKey": "Unieważnić ten klucz API? Żądania go używajÄ…ce przestanÄ… dziaÅ‚ać.", + "confirm.deleteKnowledgeArticle": "Usunąć ten artykuÅ‚ bazy wiedzy?", + "confirm.deleteReplyTemplate": "Usunąć ten szablon odpowiedzi?", + "confirm.deleteStructuredField": "Czy na pewno chcesz usunąć to pole? Tej operacji nie można cofnąć.", + "toast.campaign.pickAudience": "Wybierz co najmniej jednÄ… kategoriÄ™ lub produkt", + "toast.campaign.pickCategories": "Wybierz kategorie odbiorców dla tego filtra", + "toast.campaign.completeStep": "UkoÅ„cz ten krok, aby kontynuować", "toast.campaign.aiDraft": "Wygenerowano szkic AI", - "toast.campaign.templatePreview": "Podgląd szablonu gotowy", - "toast.campaign.generateFirst": "Najpierw wygeneruj podgląd", - "toast.campaign.testSent": "E-mail testowy wysłano na {email}", + "toast.campaign.templatePreview": "PodglÄ…d szablonu gotowy", + "toast.campaign.generateFirst": "Najpierw wygeneruj podglÄ…d", + "toast.campaign.testSent": "E-mail testowy wysÅ‚ano na {email}", "toast.campaign.scheduled": "Kampania zaplanowana", "toast.campaign.draftSaved": "Zapisano szkic", - "toast.campaign.deleted": "Kampania usunięta", + "toast.campaign.deleted": "Kampania usuniÄ™ta", "toast.campaign.prepared": "Kampania przygotowana", - "toast.campaign.alreadyReady": "Kampania jest już gotowa", - "toast.campaign.prepareFailed": "Nie można przygotować kampanii", - "toast.campaign.deleteFailed": "Nie udało się usunąć kampanii", - "toast.feed.copyFailed": "Nie można skopiować URL", + "toast.campaign.alreadyReady": "Kampania jest już gotowa", + "toast.campaign.prepareFailed": "Nie można przygotować kampanii", + "toast.campaign.deleteFailed": "Nie udaÅ‚o siÄ™ usunąć kampanii", + "toast.feed.copyFailed": "Nie można skopiować URL", "toast.feed.created": "Utworzono feed", "toast.feed.updated": "Feed zaktualizowany.", - "toast.feed.mapBeforeSync": "Zmapuj pola przed synchronizacją tego feedu.", - "toast.feed.activateBeforeSync": "Aktywuj feed przed synchronizacją.", - "toast.feed.syncFinished": "Synchronizacja zakończona", - "toast.feed.deleted": "Feed usunięty.", - "toast.feed.mappingLoadFailed": "Nie można wczytać mapowań. Otwórz mapowanie, aby naprawić przed synchronizacją.", - "toast.feed.syncFailed": "Synchronizacja nie powiodła się", - "toast.feed.statusFailed": "Nie udało się zaktualizować statusu", - "toast.feed.deleteFailed": "Nie udało się usunąć feedu", + "toast.feed.mapBeforeSync": "Zmapuj pola przed synchronizacjÄ… tego feedu.", + "toast.feed.activateBeforeSync": "Aktywuj feed przed synchronizacjÄ….", + "toast.feed.syncFinished": "Synchronizacja zakoÅ„czona", + "toast.feed.deleted": "Feed usuniÄ™ty.", + "toast.feed.mappingLoadFailed": "Nie można wczytać mapowaÅ„. Otwórz mapowanie, aby naprawić przed synchronizacjÄ….", + "toast.feed.syncFailed": "Synchronizacja nie powiodÅ‚a siÄ™", + "toast.feed.statusFailed": "Nie udaÅ‚o siÄ™ zaktualizować statusu", + "toast.feed.deleteFailed": "Nie udaÅ‚o siÄ™ usunąć feedu", "toast.feed.beforeSampling": "Przed samplingiem", - "toast.processing.jobCompleted": "Przetwarzanie zakończone", - "toast.processing.jobFailed": "Przetwarzanie nie powiodło się", - "toast.products.startFailed": "Nie udało się uruchomić przetwarzania", + "toast.processing.jobCompleted": "Przetwarzanie zakoÅ„czone", + "toast.processing.jobFailed": "Przetwarzanie nie powiodÅ‚o siÄ™", + "toast.products.startFailed": "Nie udaÅ‚o siÄ™ uruchomić przetwarzania", "toast.products.jobStarted": "Uruchomiono zadanie przetwarzania", - "toast.products.acceptUndone": "Cofnięto akceptację", - "toast.products.resetComplete": "Reset zakończony", - "toast.products.nameAcceptUndone": "Cofnięto akceptację nazwy", - "toast.products.descAcceptUndone": "Cofnięto akceptację opisu", + "toast.products.acceptUndone": "CofniÄ™to akceptacjÄ™", + "toast.products.resetComplete": "Reset zakoÅ„czony", + "toast.products.nameAcceptUndone": "CofniÄ™to akceptacjÄ™ nazwy", + "toast.products.descAcceptUndone": "CofniÄ™to akceptacjÄ™ opisu", "toast.products.cancelOne": "Przetwarzanie anulowane", "toast.products.cancelMany": "Anulowano zadania przetwarzania", - "toast.products.startJobFailed": "Nie udało się uruchomić zadania przetwarzania", - "toast.products.acceptFailed": "Nie udało się zaakceptować wzbogacenia", - "toast.products.updateFailed": "Nie udało się zaktualizować produktu", - "toast.products.undoAcceptFailed": "Nie udało się cofnąć akceptacji", - "toast.products.undoFieldAcceptFailed": "Nie udało się cofnąć akceptacji pola", - "toast.products.undoFieldDiscardFailed": "Nie udało się cofnąć odrzucenia pola", - "toast.products.rejectFailed": "Nie udało się odrzucić wzbogacenia", - "toast.products.exportFailed": "Nie można wyeksportować wybranych produktów", - "toast.products.resetFailed": "Nie udało się zresetować produktów", - "toast.products.cancelFailed": "Nie można anulować zadania przetwarzania", - "toast.support.ticketCreated": "Utworzono zgłoszenie", - "toast.support.replySent": "Odpowiedź wysłana", - "toast.support.thanksFeedback": "Dziękujemy za opinię", - "toast.support.createFailed": "Nie można utworzyć zgłoszenia", - "toast.support.unavailable": "Wsparcie niedostępne", - "toast.support.loadFailed": "Nie udało się wczytać zgłoszeń wsparcia", - "toast.support.loadTicketFailed": "Nie udało się wczytać zgłoszenia", - "toast.support.replyFailed": "Nie można wysłać odpowiedzi", - "toast.support.ratingUnavailable": "Ocena niedostępna", - "toast.support.alreadyRated": "Już oceniono", - "toast.support.ratingFailed": "Nie można przesłać oceny", + "toast.products.startJobFailed": "Nie udaÅ‚o siÄ™ uruchomić zadania przetwarzania", + "toast.products.acceptFailed": "Nie udaÅ‚o siÄ™ zaakceptować wzbogacenia", + "toast.products.updateFailed": "Nie udaÅ‚o siÄ™ zaktualizować produktu", + "toast.products.undoAcceptFailed": "Nie udaÅ‚o siÄ™ cofnąć akceptacji", + "toast.products.undoFieldAcceptFailed": "Nie udaÅ‚o siÄ™ cofnąć akceptacji pola", + "toast.products.undoFieldDiscardFailed": "Nie udaÅ‚o siÄ™ cofnąć odrzucenia pola", + "toast.products.rejectFailed": "Nie udaÅ‚o siÄ™ odrzucić wzbogacenia", + "toast.products.exportFailed": "Nie można wyeksportować wybranych produktów", + "toast.products.resetFailed": "Nie udaÅ‚o siÄ™ zresetować produktów", + "toast.products.cancelFailed": "Nie można anulować zadania przetwarzania", + "toast.support.ticketCreated": "Utworzono zgÅ‚oszenie", + "toast.support.replySent": "Odpowiedź wysÅ‚ana", + "toast.support.thanksFeedback": "DziÄ™kujemy za opiniÄ™", + "toast.support.createFailed": "Nie można utworzyć zgÅ‚oszenia", + "toast.support.unavailable": "Wsparcie niedostÄ™pne", + "toast.support.loadFailed": "Nie udaÅ‚o siÄ™ wczytać zgÅ‚oszeÅ„ wsparcia", + "toast.support.loadTicketFailed": "Nie udaÅ‚o siÄ™ wczytać zgÅ‚oszenia", + "toast.support.replyFailed": "Nie można wysÅ‚ać odpowiedzi", + "toast.support.ratingUnavailable": "Ocena niedostÄ™pna", + "toast.support.alreadyRated": "Już oceniono", + "toast.support.ratingFailed": "Nie można przesÅ‚ać oceny", "toast.structured.fieldAdded": "Dodano pole", "toast.structured.fieldAddedBody": "Dodano pole strukturalnego opisu.", - "toast.structured.fieldDeleted": "Usunięto pole", - "toast.structured.fieldDeletedBody": "Usunięto pole strukturalnego opisu.", - "toast.structured.addFailed": "Nie udało się dodać pola", - "toast.structured.deleteFailed": "Nie udało się usunąć pola", + "toast.structured.fieldDeleted": "UsuniÄ™to pole", + "toast.structured.fieldDeletedBody": "UsuniÄ™to pole strukturalnego opisu.", + "toast.structured.addFailed": "Nie udaÅ‚o siÄ™ dodać pola", + "toast.structured.deleteFailed": "Nie udaÅ‚o siÄ™ usunąć pola", "toast.brand.saved": "Zapisano zestaw marki", - "toast.brand.logoUploaded": "Przesłano logo", - "toast.brand.saveFailed": "Nie udało się zapisać zestawu marki", - "toast.brand.uploadFailed": "Nie udało się przesłać logo", + "toast.brand.logoUploaded": "PrzesÅ‚ano logo", + "toast.brand.saveFailed": "Nie udaÅ‚o siÄ™ zapisać zestawu marki", + "toast.brand.uploadFailed": "Nie udaÅ‚o siÄ™ przesÅ‚ać logo", "toast.vector.indexCreated": "Utworzono indeks wektorowy", - "toast.vector.dbInitialized": "Zainicjalizowano bazę wektorową", - "toast.vector.indexFailed": "Nie udało się utworzyć indeksu wektorowego", - "toast.vector.initFailed": "Nie udało się zainicjalizować bazy wektorowej", - "toast.vector.searchFailed": "Nie udało się wyszukać kategorii", - "toast.export.refreshFailed": "Nie udało się odświeżyć feedu", - "toast.mapping.loadFailed": "Nie udało się wczytać mapowania feedu", - "toast.mapping.extractFailed": "Nie udało się wyodrębnić schematu", - "toast.mapping.saveFailed": "Nie udało się zapisać mapowań pól", - "toast.mapping.sampleFailed": "Synchronizacja + przetwarzanie próbki nie powiodły się", - "toast.attrs.createFailed": "Tworzenie nie powiodło się", - "toast.attrs.importFailed": "Import nie powiódł się", - "toast.attrs.updateFailed": "Aktualizacja nie powiodła się", - "toast.attrs.deleteFailed": "Usuwanie nie powiodło się", - "toast.switcher.loadUsersFailed": "Nie można wczytać użytkowników do przełączenia", - "toast.switcher.switchFailed": "Nie można przełączyć użytkownika", - "toast.switcher.returnFailed": "Nie można wrócić do pierwotnego użytkownika", - "toast.switcher.companyFailed": "Nie można przełączyć firmy", - "toast.requestFailed": "Żądanie nie powiodło się", - "flash.campaign.unavailableDraft": "Kampanie są teraz niedostępne. Szkiców nie można zapisać, dopóki funkcja nie będzie aktywna.", - "flash.campaign.testEmailRequired": "Wprowadź testowy adres e-mail", - "flash.campaign.scheduleRequired": "Wybierz datę i godzinę", - "flash.campaign.unavailable": "Kampanie są teraz niedostępne.", - "flash.campaign.generateFailed": "Generowanie nie powiodło się", - "flash.campaign.testFailed": "Wysłanie testowe nie powiodło się", - "flash.campaign.scheduleFailed": "Planowanie nie powiodło się", - "flash.campaign.saveFailed": "Zapis nie powiódł się", - "flash.feed.copyFailed": "Nie można skopiować URL", + "toast.vector.dbInitialized": "Zainicjalizowano bazÄ™ wektorowÄ…", + "toast.vector.indexFailed": "Nie udaÅ‚o siÄ™ utworzyć indeksu wektorowego", + "toast.vector.initFailed": "Nie udaÅ‚o siÄ™ zainicjalizować bazy wektorowej", + "toast.vector.searchFailed": "Nie udaÅ‚o siÄ™ wyszukać kategorii", + "toast.export.refreshFailed": "Nie udaÅ‚o siÄ™ odÅ›wieżyć feedu", + "toast.mapping.loadFailed": "Nie udaÅ‚o siÄ™ wczytać mapowania feedu", + "toast.mapping.extractFailed": "Nie udaÅ‚o siÄ™ wyodrÄ™bnić schematu", + "toast.mapping.saveFailed": "Nie udaÅ‚o siÄ™ zapisać mapowaÅ„ pól", + "toast.mapping.sampleFailed": "Synchronizacja + przetwarzanie próbki nie powiodÅ‚y siÄ™", + "toast.attrs.createFailed": "Tworzenie nie powiodÅ‚o siÄ™", + "toast.attrs.importFailed": "Import nie powiódÅ‚ siÄ™", + "toast.attrs.updateFailed": "Aktualizacja nie powiodÅ‚a siÄ™", + "toast.attrs.deleteFailed": "Usuwanie nie powiodÅ‚o siÄ™", + "toast.switcher.loadUsersFailed": "Nie można wczytać użytkowników do przełączenia", + "toast.switcher.switchFailed": "Nie można przełączyć użytkownika", + "toast.switcher.returnFailed": "Nie można wrócić do pierwotnego użytkownika", + "toast.switcher.companyFailed": "Nie można przełączyć firmy", + "toast.requestFailed": "Żądanie nie powiodÅ‚o siÄ™", + "flash.campaign.unavailableDraft": "Kampanie sÄ… teraz niedostÄ™pne. Szkiców nie można zapisać, dopóki funkcja nie bÄ™dzie aktywna.", + "flash.campaign.testEmailRequired": "Wprowadź testowy adres e-mail", + "flash.campaign.scheduleRequired": "Wybierz datÄ™ i godzinÄ™", + "flash.campaign.unavailable": "Kampanie sÄ… teraz niedostÄ™pne.", + "flash.campaign.generateFailed": "Generowanie nie powiodÅ‚o siÄ™", + "flash.campaign.testFailed": "WysÅ‚anie testowe nie powiodÅ‚o siÄ™", + "flash.campaign.scheduleFailed": "Planowanie nie powiodÅ‚o siÄ™", + "flash.campaign.saveFailed": "Zapis nie powiódÅ‚ siÄ™", + "flash.feed.copyFailed": "Nie można skopiować URL", "flash.feed.csvRequired": "Wybierz plik .csv.", "flash.feed.csvFileRequired": "Wybierz plik CSV.", "flash.feed.urlRequired": "URL feedu jest wymagany.", "flash.feed.updated": "Feed zaktualizowany.", - "flash.feed.syncFinishedNamed": "Synchronizacja zakończona dla \"{name}\" ({status}: {products}).", - "flash.feed.deleted": "Feed usunięty.", - "flash.feed.createFailed": "Nie można utworzyć feedu", - "flash.feed.updateFailed": "Nie można zaktualizować feedu", - "flash.settings.companyNameRequired": "Wprowadź nazwę firmy.", + "flash.feed.syncFinishedNamed": "Synchronizacja zakoÅ„czona dla \"{name}\" ({status}: {products}).", + "flash.feed.deleted": "Feed usuniÄ™ty.", + "flash.feed.createFailed": "Nie można utworzyć feedu", + "flash.feed.updateFailed": "Nie można zaktualizować feedu", + "flash.settings.companyNameRequired": "Wprowadź nazwÄ™ firmy.", "flash.settings.companySaved": "Zapisano ustawienia firmy.", - "flash.settings.companyFailed": "Nie udało się zaktualizować firmy", - "flash.settings.mergeFailed": "Nie udało się zaktualizować ustawienia scalania", - "flash.settings.apiKeyNameRequired": "Wprowadź nazwę tego klucza API.", - "flash.settings.apiKeyCreatedFailed": "Nie można utworzyć klucza API", - "flash.settings.apiKeyRevoked": "Unieważniono klucz API.", - "flash.settings.apiKeyRevokeFailed": "Nie można unieważnić klucza API", - "flash.settings.copyFailed": "Nie można skopiować. Zaznacz tekst i skopiuj ręcznie.", - "flash.products.accepted": "Zaakceptowano {count} produkt(ów) — przeniesiono do Przetworzone.", + "flash.settings.companyFailed": "Nie udaÅ‚o siÄ™ zaktualizować firmy", + "flash.settings.mergeFailed": "Nie udaÅ‚o siÄ™ zaktualizować ustawienia scalania", + "flash.settings.apiKeyNameRequired": "Wprowadź nazwÄ™ tego klucza API.", + "flash.settings.apiKeyCreatedFailed": "Nie można utworzyć klucza API", + "flash.settings.apiKeyRevoked": "Unieważniono klucz API.", + "flash.settings.apiKeyRevokeFailed": "Nie można unieważnić klucza API", + "flash.settings.copyFailed": "Nie można skopiować. Zaznacz tekst i skopiuj rÄ™cznie.", + "flash.products.accepted": "Zaakceptowano {count} produkt(ów) — przeniesiono do Przetworzone.", "flash.products.updated": "Zaktualizowano produkt.", - "flash.products.enrichmentAccepted": "Zaakceptowano wzbogacenie — przeniesiono do Przetworzonych.", - "flash.products.originalEmpty": "Wartość oryginalna jest pusta; wzbogacenia nie można wyczyścić przez PATCH.", + "flash.products.enrichmentAccepted": "Zaakceptowano wzbogacenie — przeniesiono do Przetworzonych.", + "flash.products.originalEmpty": "Wartość oryginalna jest pusta; wzbogacenia nie można wyczyÅ›cić przez PATCH.", "flash.products.selectExport": "Wybierz co najmniej jeden produkt do eksportu.", - "flash.products.exported": "Wyeksportowano {count} produkt(ów) przez feed eksportu.", - "flash.support.missingId": "Brak identyfikatora zgłoszenia", - "flash.support.notFound": "Nie znaleziono zgłoszenia", - "flash.support.unavailable": "Wsparcie jest tymczasowo niedostępne.", - "flash.support.ratingUnavailable": "Ocena jest tymczasowo niedostępna. Spróbuj ponownie później.", - "flash.support.alreadyRated": "Już oceniłeś to zgłoszenie.", - "flash.support.queueUnavailable": "Kolejka wsparcia nie jest dostępna w tej instalacji.", - "flash.support.deploymentUnavailable": "Wsparcie nie jest dostępne w tym wdrożeniu.", - "flash.support.replyRequired": "Treść odpowiedzi jest wymagana.", - "flash.support.draftRequired": "Treść szkicu jest wymagana przed zatwierdzeniem.", - "flash.support.claimed": "Przejęto zgłoszenie.", - "flash.support.unassigned": "Cofnięto przypisanie zgłoszenia.", + "flash.products.exported": "Wyeksportowano {count} produkt(ów) przez feed eksportu.", + "flash.support.missingId": "Brak identyfikatora zgÅ‚oszenia", + "flash.support.notFound": "Nie znaleziono zgÅ‚oszenia", + "flash.support.unavailable": "Wsparcie jest tymczasowo niedostÄ™pne.", + "flash.support.ratingUnavailable": "Ocena jest tymczasowo niedostÄ™pna. Spróbuj ponownie później.", + "flash.support.alreadyRated": "Już oceniÅ‚eÅ› to zgÅ‚oszenie.", + "flash.support.queueUnavailable": "Kolejka wsparcia nie jest dostÄ™pna w tej instalacji.", + "flash.support.deploymentUnavailable": "Wsparcie nie jest dostÄ™pne w tym wdrożeniu.", + "flash.support.replyRequired": "Treść odpowiedzi jest wymagana.", + "flash.support.draftRequired": "Treść szkicu jest wymagana przed zatwierdzeniem.", + "flash.support.claimed": "PrzejÄ™to zgÅ‚oszenie.", + "flash.support.unassigned": "CofniÄ™to przypisanie zgÅ‚oszenia.", "flash.support.assigneeCleared": "Wyczyszczono przypisanego.", "flash.support.assigneeUpdated": "Zaktualizowano przypisanego.", - "flash.support.draftApproved": "Zatwierdzono szkic AI i wysłano do klienta.", - "flash.support.draftSent": "Wysłano szkic jako odpowiedź personelu.", - "flash.support.draftDiscarded": "Odrzucono szkic AI. Zgłoszenie przekazano do kolejki ludzkiej.", - "flash.support.autoReplyDisabled": "Wyłączono auto-odpowiedź (szkic jako notatka wewnętrzna).", + "flash.support.draftApproved": "Zatwierdzono szkic AI i wysÅ‚ano do klienta.", + "flash.support.draftSent": "WysÅ‚ano szkic jako odpowiedź personelu.", + "flash.support.draftDiscarded": "Odrzucono szkic AI. ZgÅ‚oszenie przekazano do kolejki ludzkiej.", + "flash.support.autoReplyDisabled": "Wyłączono auto-odpowiedź (szkic jako notatka wewnÄ™trzna).", "flash.structured.keyRequired": "Klucz pola jest wymagany", - "flash.category.nameRequired": "Nazwa i unikalne ID są wymagane.", - "flash.category.textEmpty": "Tekst nie może być pusty", - "flash.export.noConfigs": "Brak feedów eksportu. Utwórz jeden w Feedach eksportu, potem wróć, aby wyeksportować zaznaczenie.", + "flash.category.nameRequired": "Nazwa i unikalne ID sÄ… wymagane.", + "flash.category.textEmpty": "Tekst nie może być pusty", + "flash.export.noConfigs": "Brak feedów eksportu. Utwórz jeden w Feedach eksportu, potem wróć, aby wyeksportować zaznaczenie.", "flash.export.selectFormat": "Wybierz feed eksportu.", - "flash.files.deleted": "Usunięto przesłanie.", - "flash.mapping.noSuggestions": "Brak sugestii — sprawdź nazwy pól źródłowych.", - "flash.mapping.allMapped": "Wszystkie sugestie są już zmapowane. Sprawdź chipy pewności w tabeli.", - "flash.mapping.extractFirst": "Brak sugestii — najpierw wyodrębnij schemat.", - "flash.mapping.pathRequired": "Wprowadź ścieżkę elementu produktu przed mapowaniem pól.", - "flash.billing.checkoutCanceled": "Checkout został anulowany. Nie wprowadzono żadnych zmian.", - "flash.billing.portalReturn": "Powrót z portalu rozliczeń. Zarządzaj planem tutaj lub w Plans.", - "flash.billing.invalidAmount": "Wprowadź prawidłową liczbę kredytów.", + "flash.files.deleted": "UsuniÄ™to przesÅ‚anie.", + "flash.mapping.noSuggestions": "Brak sugestii — sprawdź nazwy pól źródÅ‚owych.", + "flash.mapping.allMapped": "Wszystkie sugestie sÄ… już zmapowane. Sprawdź chipy pewnoÅ›ci w tabeli.", + "flash.mapping.extractFirst": "Brak sugestii — najpierw wyodrÄ™bnij schemat.", + "flash.mapping.pathRequired": "Wprowadź Å›cieżkÄ™ elementu produktu przed mapowaniem pól.", + "flash.billing.checkoutCanceled": "Checkout zostaÅ‚ anulowany. Nie wprowadzono żadnych zmian.", + "flash.billing.portalReturn": "Powrót z portalu rozliczeÅ„. ZarzÄ…dzaj planem tutaj lub w Plans.", + "flash.billing.invalidAmount": "Wprowadź prawidÅ‚owÄ… liczbÄ™ kredytów.", "flash.billing.companyNotFound": "Nie znaleziono firmy.", - "flash.billing.creditsAdded": "Dodano {amount} kredytów.", + "flash.billing.creditsAdded": "Dodano {amount} kredytów.", "flash.unsubscribe.missingToken": "Brak tokenu wypisania.", - "flash.unsubscribe.loadFailed": "Nie można wczytać statusu wypisania.", - "flash.unsubscribe.failed": "Wypisanie nie powiodło się.", - "flash.seo.filledMeta": "Wypełniono meta dla „{label}” ({mode}).", + "flash.unsubscribe.loadFailed": "Nie można wczytać statusu wypisania.", + "flash.unsubscribe.failed": "Wypisanie nie powiodÅ‚o siÄ™.", + "flash.seo.filledMeta": "WypeÅ‚niono meta dla „{label}” ({mode}).", "flash.shopify.saved": "Zapisano ustawienia Shopify.", "flash.woo.saved": "Zapisano ustawienia WooCommerce.", "flash.woo.syncSaved": "Zapisano ustawienia synchronizacji.", "flash.woo.autoCategories": "Automatycznie zmapowano {count} kategorii.", - "flash.woo.autoAttributes": "Automatycznie zmapowano {count} atrybutów.", - "flash.ai.promptsSaved": "Zapisano szablony promptów. Obowiązują przy następnym uruchomieniu AI.", - "flash.ai.promptRestored": "Przywrócono wbudowany domyślny prompt.", - "flash.ai.connectionOk": "Połączenie OK ({detail}).", - "flash.ai.connectionByok": ", własny klucz", - "flash.email.saved": "Zapisano dostawcę e-mail. Zweryfikuj domenę, potem wyślij test.", - "flash.email.testDryRun": "Zapisano test w trybie dry-run — nie wysłano e-maila.", - "flash.email.testSent": "Wysłano e-mail testowy. Adres nadawcy jest oznaczany jako zweryfikowany po udanym doręczeniu.", - "flash.fields.apiUnavailable": "API pól standardowych jest niedostępna. Zmian nie można zapisać.", + "flash.woo.autoAttributes": "Automatycznie zmapowano {count} atrybutów.", + "flash.ai.promptsSaved": "Zapisano szablony promptów. ObowiÄ…zujÄ… przy nastÄ™pnym uruchomieniu AI.", + "flash.ai.promptRestored": "Przywrócono wbudowany domyÅ›lny prompt.", + "flash.ai.connectionOk": "Połączenie OK ({detail}).", + "flash.ai.connectionByok": ", wÅ‚asny klucz", + "flash.email.saved": "Zapisano dostawcÄ™ e-mail. Zweryfikuj domenÄ™, potem wyÅ›lij test.", + "flash.email.testDryRun": "Zapisano test w trybie dry-run — nie wysÅ‚ano e-maila.", + "flash.email.testSent": "WysÅ‚ano e-mail testowy. Adres nadawcy jest oznaczany jako zweryfikowany po udanym dorÄ™czeniu.", + "flash.fields.apiUnavailable": "API pól standardowych jest niedostÄ™pna. Zmian nie można zapisać.", "flash.fields.updated": "Zaktualizowano pole", "flash.fields.created": "Utworzono pole", - "flash.fields.enabledRecommended": "Włączono zalecane pola ecommerce", - "flash.fields.deleted": "Usunięto pole", - "flash.fields.groupUpdated": "Zaktualizowano grupę", - "flash.fields.groupCreated": "Utworzono grupę", - "flash.fields.groupDeleted": "Usunięto grupę", + "flash.fields.enabledRecommended": "Włączono zalecane pola ecommerce", + "flash.fields.deleted": "UsuniÄ™to pole", + "flash.fields.groupUpdated": "Zaktualizowano grupÄ™", + "flash.fields.groupCreated": "Utworzono grupÄ™", + "flash.fields.groupDeleted": "UsuniÄ™to grupÄ™", "flash.processing.cancelled": "Anulowano \"{name}\".", "flash.processing.retried": "\"{name}\" w kolejce do ponowienia.", - "flash.admin.staffRoleUpdated": "Zaktualizowano rolę personelu dla {email}.", - "flash.admin.staffRoleUnavailable": "Aktualizacje ról personelu nie są jeszcze dostępne na tym serwerze.", - "flash.admin.catalogCloned": "Skopiowano {source} do {dest}: {products} produktów, {categories} kategorii.", - "flash.admin.fixA1Success": "Naprawa katalogu dla {name} zakończona: zaktualizowano {prompts} promptów, wyczyszczono {hashes} hashy, uzupełniono {categories} kategorii.", - "flash.admin.fixA1Error": "Naprawa katalogu dla {name} nie powiodła się.", + "flash.admin.staffRoleUpdated": "Zaktualizowano rolÄ™ personelu dla {email}.", + "flash.admin.staffRoleUnavailable": "Aktualizacje ról personelu nie sÄ… jeszcze dostÄ™pne na tym serwerze.", + "flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.", + "flash.admin.fixA1Success": "Catalog repair finished for {name}: {prompts} prompts, {hashes} hashes, {categories} processed←mapped, {mapped_backfilled} mapped←processed. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).", + "flash.admin.fixA1Error": "Naprawa katalogu dla {name} nie powiodÅ‚a siÄ™.", + "flash.admin.cloneDestMissing": "No sandbox destination. Switch to Platform Demo (staff home), then clone again.", "flash.admin.planAssigned": "Przypisano plan do {name}.", "flash.admin.planAssignedShort": "Przypisano plan.", "flash.admin.creditsUpdated": "Zaktualizowano kredyty.", "flash.admin.cyclesProcessed": "Przetworzono cykle rozliczeniowe: {count}", - "flash.admin.invitesSummary": "Zaproszenia do ustawienia hasła: {parts}. Dostarczanie e-mail: {smtp}.", - "flash.admin.smtpOn": "wł.", - "flash.admin.smtpOff": "wył.", - "flash.admin.localPasswordSet": "Ustawiono lokalne hasło dla {email}.", - "flash.admin.localPasswordUnavailable": "Narzędzia lokalnego hasła nie są dostępne w tym środowisku.", - "flash.admin.switchedUser": "Przełączono użytkownika. Przeładowywanie…", - "flash.admin.switchUnavailable": "Przełączanie użytkownika nie jest dostępne w tym środowisku.", - "flash.admin.diagnosticsRateLimit": "Osiągnięto limit diagnostyki (20/min). Poczekaj minutę i odśwież.", - "flash.admin.smtpSaved": "Zapisano ustawienia SMTP platformy. Hasła pozostają ukryte.", - "flash.admin.integrationSaved": "Zapisano ustawienia integracji. Pola tajne nigdy nie są ponownie wyświetlane w całości.", - "flash.admin.aiSaved": "Zapisano ustawienia AI {label}. Klucze API nie są już pokazywane.", - "flash.admin.cleanup": "Czyszczenie: {jobs} zadań nieudanych, zresetowano {products} produktów.", - "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", + "flash.admin.invitesSummary": "Zaproszenia do ustawienia hasÅ‚a: {parts}. Dostarczanie e-mail: {smtp}.", + "flash.admin.smtpOn": "wÅ‚.", + "flash.admin.smtpOff": "wyÅ‚.", + "flash.admin.localPasswordSet": "Ustawiono lokalne hasÅ‚o dla {email}.", + "flash.admin.localPasswordUnavailable": "NarzÄ™dzia lokalnego hasÅ‚a nie sÄ… dostÄ™pne w tym Å›rodowisku.", + "flash.admin.switchedUser": "Przełączono użytkownika. PrzeÅ‚adowywanie…", + "flash.admin.switchUnavailable": "Przełączanie użytkownika nie jest dostÄ™pne w tym Å›rodowisku.", + "flash.admin.diagnosticsRateLimit": "OsiÄ…gniÄ™to limit diagnostyki (20/min). Poczekaj minutÄ™ i odÅ›wież.", + "flash.admin.smtpSaved": "Zapisano ustawienia SMTP platformy. HasÅ‚a pozostajÄ… ukryte.", + "flash.admin.integrationSaved": "Zapisano ustawienia integracji. Pola tajne nigdy nie sÄ… ponownie wyÅ›wietlane w caÅ‚oÅ›ci.", + "flash.admin.aiSaved": "Zapisano ustawienia AI {label}. Klucze API nie sÄ… już pokazywane.", + "flash.admin.cleanup": "Czyszczenie: {jobs} zadaÅ„ nieudanych, zresetowano {products} produktów.", + "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", "flash.admin.orphanDeleted": "Deleted {deleted} orphan row(s). Remaining: {remaining}.", - "flash.admin.articleUpdated": "Zaktualizowano artykuł.", - "flash.admin.articleCreated": "Utworzono artykuł.", + "flash.admin.articleUpdated": "Zaktualizowano artykuÅ‚.", + "flash.admin.articleCreated": "Utworzono artykuÅ‚.", "flash.admin.templateUpdated": "Zaktualizowano szablon.", "flash.admin.templateCreated": "Utworzono szablon.", - "flash.admin.articleDeleted": "Usunięto artykuł.", - "flash.admin.templateDeleted": "Usunięto szablon.", + "flash.admin.articleDeleted": "UsuniÄ™to artykuÅ‚.", + "flash.admin.templateDeleted": "UsuniÄ™to szablon.", "flash.admin.autoReplySaved": "Zapisano ustawienia auto-odpowiedzi.", - "flash.admin.imageUploaded": "Przesłano obraz i wstawiono do markdown.", - "flash.admin.translationsSaved": "Zapisano {count} ciąg(ów) dla {locale}. Zrób commit paczki, gdy będzie gotowa.", + "flash.admin.imageUploaded": "PrzesÅ‚ano obraz i wstawiono do markdown.", + "flash.admin.translationsSaved": "Zapisano {count} ciÄ…g(ów) dla {locale}. Zrób commit paczki, gdy bÄ™dzie gotowa.", "flash.admin.featuresUpdated": "Zaktualizowano {key}.", - "flash.admin.featuresAllOn": "Włączono wszystkie funkcje dla tego planu.", - "flash.admin.featuresAllOff": "Wyłączono wszystkie funkcje dla tego planu.", + "flash.admin.featuresAllOn": "Włączono wszystkie funkcje dla tego planu.", + "flash.admin.featuresAllOff": "Wyłączono wszystkie funkcje dla tego planu.", "flash.admin.profileApplied": "Zastosowano profil {label} do {name}.", - "flash.admin.overridesCleared": "Wyczyszczono nadpisania — używane są domyślne nazwy planu.", - "empty.plans.none": "Nie znaleziono planów.", - "empty.plans.noMatch": "Żaden plan nie pasuje do tego filtra.", - "empty.plans.selectPackage": "Wybierz pakiet, aby edytować funkcje.", - "empty.products.processingTitle": "Brak produktów w przetwarzaniu", - "empty.products.processingMessageCan": "Postęp na żywo jest na stronie Przetwarzanie. Otwórz tam uruchomione zadanie, by zobaczyć status kroków; ta karta wylistuje produkty w toku, gdy filtr pozycji będzie dostępny.", - "empty.products.processingMessageCannot": "Produkty w zadaniu pojawiają się tutaj po uruchomieniu przetwarzania z katalogu.", - "empty.products.reviewTitle": "Brak produktów do przeglądu", - "empty.products.reviewMessage": "Po zadaniu wzbogacone produkty trafiają tutaj. Otwórz wiersz, porównaj oryginał ze wzbogaceniem, potem Zaakceptuj, edytuj lub Odrzuć.", - "empty.products.errorTitle": "Brak produktów z błędami", - "empty.products.errorMessage": "Gdy zadanie nie powiedzie się dla produktu, pojawi się tutaj, aby można było ponowić.", - "empty.products.filterTitleUnprocessed": "Brak nieprzetworzonych dopasowań", - "empty.products.filterTitle": "Żaden produkt nie pasuje", - "empty.products.filterMessage": "Spróbuj innego wyszukiwania, kategorii lub feedu — albo wyczyść filtry, by zobaczyć wszystko.", - "empty.products.unprocessedTitle": "Brak nieprzetworzonych produktów", - "empty.products.unprocessedMessage": "Podłącz feed dostawcy lub prześlij CSV, aby zaimportować produkty.", - "empty.products.noneTitle": "Brak produktów", - "empty.products.noneMessageStores": "Zaimportuj z feedu lub sklepu, potem uruchom zadanie, by zbudować katalog.", - "empty.products.noneMessage": "Zaimportuj z feedu lub prześlij CSV, potem uruchom zadanie.", + "flash.admin.overridesCleared": "Wyczyszczono nadpisania — używane sÄ… domyÅ›lne nazwy planu.", + "empty.plans.none": "Nie znaleziono planów.", + "empty.plans.noMatch": "Å»aden plan nie pasuje do tego filtra.", + "empty.plans.selectPackage": "Wybierz pakiet, aby edytować funkcje.", + "empty.products.processingTitle": "Brak produktów w przetwarzaniu", + "empty.products.processingMessageCan": "PostÄ™p na żywo jest na stronie Przetwarzanie. Otwórz tam uruchomione zadanie, by zobaczyć status kroków; ta karta wylistuje produkty w toku, gdy filtr pozycji bÄ™dzie dostÄ™pny.", + "empty.products.processingMessageCannot": "Produkty w zadaniu pojawiajÄ… siÄ™ tutaj po uruchomieniu przetwarzania z katalogu.", + "empty.products.reviewTitle": "Brak produktów do przeglÄ…du", + "empty.products.reviewMessage": "Po zadaniu wzbogacone produkty trafiajÄ… tutaj. Otwórz wiersz, porównaj oryginaÅ‚ ze wzbogaceniem, potem Zaakceptuj, edytuj lub Odrzuć.", + "empty.products.errorTitle": "Brak produktów z błędami", + "empty.products.errorMessage": "Gdy zadanie nie powiedzie siÄ™ dla produktu, pojawi siÄ™ tutaj, aby można byÅ‚o ponowić.", + "empty.products.filterTitleUnprocessed": "Brak nieprzetworzonych dopasowaÅ„", + "empty.products.filterTitle": "Å»aden produkt nie pasuje", + "empty.products.filterMessage": "Spróbuj innego wyszukiwania, kategorii lub feedu — albo wyczyść filtry, by zobaczyć wszystko.", + "empty.products.unprocessedTitle": "Brak nieprzetworzonych produktów", + "empty.products.unprocessedMessage": "Podłącz feed dostawcy lub przeÅ›lij CSV, aby zaimportować produkty.", + "empty.products.noneTitle": "Brak produktów", + "empty.products.noneMessageStores": "Zaimportuj z feedu lub sklepu, potem uruchom zadanie, by zbudować katalog.", + "empty.products.noneMessage": "Zaimportuj z feedu lub przeÅ›lij CSV, potem uruchom zadanie.", "empty.products.viewJobs": "Zobacz zadania", "empty.products.startJob": "Uruchom zadanie", - "empty.products.clearFilters": "Wyczyść filtry", + "empty.products.clearFilters": "Wyczyść filtry", "empty.products.viewProcessed": "Zobacz przetworzone", - "empty.products.retryCatalog": "Ponów z katalogu", - "empty.products.connectFeed": "Podłącz feed", + "empty.products.retryCatalog": "Ponów z katalogu", + "empty.products.connectFeed": "Podłącz feed", "empty.products.addProduct": "Dodaj produkt", - "empty.products.uploadCsv": "Prześlij CSV", - "empty.feeds.noneTitle": "Brak feedów produktów", - "empty.feeds.noneMessage": "Połącz URL CSV/XML dostawcy lub prześlij plik. Dalej: Map → Sync → Process.", - "empty.feeds.noMatchTitle": "Brak pasujących feedów", - "empty.feeds.noMatchMessage": "Spróbuj innej frazy wyszukiwania albo wyczyść wyszukiwanie, aby zobaczyć wszystkie feedy.", - "empty.export.loadFailedTitle": "Nie można wczytać feedów eksportu", - "empty.export.loadFailedMessage": "Coś poszło nie tak podczas wczytywania eksportów. Spróbuj ponownie lub sprawdź błąd powyżej, aby uzyskać szczegóły.", - "empty.export.noneTitle": "Brak feedów eksportu", - "empty.export.noneMessage": "Utwórz feed Google Shopping, Meta lub własny CSV/XML, aby wybrać produkty i pola. Wygeneruj publiczny URL do Merchant Center lub partnera — albo wyeksportuj podzbiór z Produktów.", - "empty.export.noMatchTitle": "Brak pasujących feedów", - "empty.export.noMatchMessage": "Spróbuj innego hasła wyszukiwania.", - "empty.files.noneTitle": "Brak jeszcze przesłań", - "empty.files.noneMessage": "Importy CSV produktów, kategorii i atrybutów pojawiają się tu po przesłaniu. Po migracji platformy zawartość plików (blob) nie została skopiowana — prześlij ponownie, jeśli jej potrzebujesz.", - "empty.files.uploadCta": "Prześlij CSV", - "empty.export.fromProductsCta": "Eksportuj z Produktów", - "empty.dashboard.noJobsTitle": "Brak ostatnich zadań", - "empty.dashboard.noJobsMessage": "Zadania pojawiają się tutaj po starcie przetwarzania w Produktach. Wzbogać tytuły i opisy przed eksportem.", - "empty.stores.noneTitle": "Brak podłączonego sklepu", - "empty.stores.noneMessage": "Połącz WooCommerce lub Shopify, by synchronizować katalog i zamówienia. Plik dostawcy? Użyj URL feedu lub przesyłania CSV.", - "empty.stores.noneTitleMember": "Brak podłączonego sklepu", - "empty.stores.noneMessageMember": "Tylko admini firmy mogą podłączyć WooCommerce lub Shopify. Poproś admina o pomoc albo użyj Feed URL/CSV, jeśli Twoja rola na to pozwala.", - "empty.woo.openConnection": "Otwórz ustawienia połączenia", - "empty.shopify.openConnection": "Otwórz ustawienia połączenia", - "empty.processing.noneTitle": "Brak jeszcze zadań", - "empty.processing.noneMessage": "Uruchom zadanie z Produktów, gdy będziesz gotowy. Postęp i historia pojawią się tutaj.", - "empty.campaigns.unavailableTitle": "Kampanie niedostępne", - "empty.campaigns.unavailableMessage": "Usługa kampanii jest niedostępna. Możesz otworzyć kreator, ale generowanie i wysyłka poczekają na powrót usługi.", - "empty.calendar.noneTitle": "Brak presetów sezonowych", - "empty.calendar.noneMessage": "Presety kalendarza pojawią się tutaj, gdy API marketingowe będzie dostępne.", + "empty.products.uploadCsv": "PrzeÅ›lij CSV", + "empty.feeds.noneTitle": "Brak feedów produktów", + "empty.feeds.noneMessage": "Połącz URL CSV/XML dostawcy lub przeÅ›lij plik. Dalej: Map → Sync → Process.", + "empty.feeds.noMatchTitle": "Brak pasujÄ…cych feedów", + "empty.feeds.noMatchMessage": "Spróbuj innej frazy wyszukiwania albo wyczyść wyszukiwanie, aby zobaczyć wszystkie feedy.", + "empty.export.loadFailedTitle": "Nie można wczytać feedów eksportu", + "empty.export.loadFailedMessage": "CoÅ› poszÅ‚o nie tak podczas wczytywania eksportów. Spróbuj ponownie lub sprawdź błąd powyżej, aby uzyskać szczegóły.", + "empty.export.noneTitle": "Brak feedów eksportu", + "empty.export.noneMessage": "Utwórz feed Google Shopping, Meta lub wÅ‚asny CSV/XML, aby wybrać produkty i pola. Wygeneruj publiczny URL do Merchant Center lub partnera — albo wyeksportuj podzbiór z Produktów.", + "empty.export.noMatchTitle": "Brak pasujÄ…cych feedów", + "empty.export.noMatchMessage": "Spróbuj innego hasÅ‚a wyszukiwania.", + "empty.files.noneTitle": "Brak jeszcze przesÅ‚aÅ„", + "empty.files.noneMessage": "Importy CSV produktów, kategorii i atrybutów pojawiajÄ… siÄ™ tu po przesÅ‚aniu. Po migracji platformy zawartość plików (blob) nie zostaÅ‚a skopiowana — przeÅ›lij ponownie, jeÅ›li jej potrzebujesz.", + "empty.files.uploadCta": "PrzeÅ›lij CSV", + "empty.export.fromProductsCta": "Eksportuj z Produktów", + "empty.dashboard.noJobsTitle": "Brak ostatnich zadaÅ„", + "empty.dashboard.noJobsMessage": "Zadania pojawiajÄ… siÄ™ tutaj po starcie przetwarzania w Produktach. Wzbogać tytuÅ‚y i opisy przed eksportem.", + "empty.stores.noneTitle": "Brak podłączonego sklepu", + "empty.stores.noneMessage": "Połącz WooCommerce lub Shopify, by synchronizować katalog i zamówienia. Plik dostawcy? Użyj URL feedu lub przesyÅ‚ania CSV.", + "empty.stores.noneTitleMember": "Brak podłączonego sklepu", + "empty.stores.noneMessageMember": "Tylko admini firmy mogÄ… podłączyć WooCommerce lub Shopify. PoproÅ› admina o pomoc albo użyj Feed URL/CSV, jeÅ›li Twoja rola na to pozwala.", + "empty.woo.openConnection": "Otwórz ustawienia połączenia", + "empty.shopify.openConnection": "Otwórz ustawienia połączenia", + "empty.processing.noneTitle": "Brak jeszcze zadaÅ„", + "empty.processing.noneMessage": "Uruchom zadanie z Produktów, gdy bÄ™dziesz gotowy. PostÄ™p i historia pojawiÄ… siÄ™ tutaj.", + "empty.campaigns.unavailableTitle": "Kampanie niedostÄ™pne", + "empty.campaigns.unavailableMessage": "UsÅ‚uga kampanii jest niedostÄ™pna. Możesz otworzyć kreator, ale generowanie i wysyÅ‚ka poczekajÄ… na powrót usÅ‚ugi.", + "empty.calendar.noneTitle": "Brak presetów sezonowych", + "empty.calendar.noneMessage": "Presety kalendarza pojawiÄ… siÄ™ tutaj, gdy API marketingowe bÄ™dzie dostÄ™pne.", "empty.seo.noneTitle": "Brak katalogu do oceny", - "empty.seo.noneMessage": "Najpierw przetwórz produkty lub dodaj kategorie. Wyniki SEO pojawią się, gdy będą dane katalogu.", - "empty.vector.unavailableTitle": "Kategorie wektorowe niedostępne", - "empty.vector.noMatchTitle": "Brak jeszcze dopasowań", - "empty.vector.noMatchMessage": "Wprowadź opis produktu i wyszukaj, by zobaczyć dopasowania kategorii wektorowych.", - "empty.structured.unavailableTitle": "Opisy strukturalne niedostępne", - "empty.structured.unavailableMessage": "To API nie jest jeszcze na tym backendzie. Nie możesz zarządzać polami Export ID, dopóki /api/structured-descriptions nie będzie podłączone.", - "empty.structured.noneTitle": "Brak jeszcze pól strukturalnego opisu", - "empty.structured.noneMessage": "Dodaj pole tutaj lub utwórz Export ID w formule opisu kategorii — pojawią się do użycia w feedach eksportu.", - "empty.support.unavailableTitle": "Wsparcie niedostępne", - "empty.support.noneTitle": "Brak jeszcze zgłoszeń", - "empty.support.unavailableMessage": "API wsparcia jest niedostępne. Spróbuj wkrótce lub otwórz nowe zgłoszenie, gdy usługa wróci.", - "empty.support.filterMessage": "Żadne zgłoszenie nie pasuje do tego statusu. Spróbuj innego filtra lub utwórz nowe.", - "empty.support.noneMessage": "Opisz problem — zespół odpowie w tym wątku. Dostaniesz też powiadomienie w aplikacji, gdy personel odpowie.", - "empty.support.createTicket": "Utwórz zgłoszenie", - "empty.support.clearFilter": "Wyczyść filtr", - "empty.support.ticketNotFoundTitle": "Nie znaleziono zgłoszenia", - "empty.support.ticketNotFoundMessage": "To zgłoszenie mogło zostać usunięte albo nie masz dostępu.", - "empty.support.noMessagesTitle": "Brak wiadomości", - "empty.support.noMessagesMessage": "Ten wątek nie ma jeszcze wiadomości.", + "empty.seo.noneMessage": "Najpierw przetwórz produkty lub dodaj kategorie. Wyniki SEO pojawiÄ… siÄ™, gdy bÄ™dÄ… dane katalogu.", + "empty.vector.unavailableTitle": "Kategorie wektorowe niedostÄ™pne", + "empty.vector.noMatchTitle": "Brak jeszcze dopasowaÅ„", + "empty.vector.noMatchMessage": "Wprowadź opis produktu i wyszukaj, by zobaczyć dopasowania kategorii wektorowych.", + "empty.structured.unavailableTitle": "Opisy strukturalne niedostÄ™pne", + "empty.structured.unavailableMessage": "To API nie jest jeszcze na tym backendzie. Nie możesz zarzÄ…dzać polami Export ID, dopóki /api/structured-descriptions nie bÄ™dzie podłączone.", + "empty.structured.noneTitle": "Brak jeszcze pól strukturalnego opisu", + "empty.structured.noneMessage": "Dodaj pole tutaj lub utwórz Export ID w formule opisu kategorii — pojawiÄ… siÄ™ do użycia w feedach eksportu.", + "empty.support.unavailableTitle": "Wsparcie niedostÄ™pne", + "empty.support.noneTitle": "Brak jeszcze zgÅ‚oszeÅ„", + "empty.support.unavailableMessage": "API wsparcia jest niedostÄ™pne. Spróbuj wkrótce lub otwórz nowe zgÅ‚oszenie, gdy usÅ‚uga wróci.", + "empty.support.filterMessage": "Å»adne zgÅ‚oszenie nie pasuje do tego statusu. Spróbuj innego filtra lub utwórz nowe.", + "empty.support.noneMessage": "Opisz problem — zespół odpowie w tym wÄ…tku. Dostaniesz też powiadomienie w aplikacji, gdy personel odpowie.", + "empty.support.createTicket": "Utwórz zgÅ‚oszenie", + "empty.support.clearFilter": "Wyczyść filtr", + "empty.support.ticketNotFoundTitle": "Nie znaleziono zgÅ‚oszenia", + "empty.support.ticketNotFoundMessage": "To zgÅ‚oszenie mogÅ‚o zostać usuniÄ™te albo nie masz dostÄ™pu.", + "empty.support.noMessagesTitle": "Brak wiadomoÅ›ci", + "empty.support.noMessagesMessage": "Ten wÄ…tek nie ma jeszcze wiadomoÅ›ci.", "empty.settings.noApiKeysTitle": "Brak kluczy API", - "empty.shopify.noOrdersTitle": "Brak zamówień", - "empty.shopify.noOrdersMessage": "Zamówienia pojawiają się po połączeniu Shopify i uruchomieniu importu. Puste listy są normalne do pierwszego sync.", - "empty.woo.noOrdersTitle": "Brak zamówień", - "empty.woo.noOrdersMessage": "Zamówienia pojawiają się po połączeniu WooCommerce i uruchomieniu synchronizacji. Puste listy są normalne do pierwszego sync.", + "empty.shopify.noOrdersTitle": "Brak zamówieÅ„", + "empty.shopify.noOrdersMessage": "Zamówienia pojawiajÄ… siÄ™ po połączeniu Shopify i uruchomieniu importu. Puste listy sÄ… normalne do pierwszego sync.", + "empty.woo.noOrdersTitle": "Brak zamówieÅ„", + "empty.woo.noOrdersMessage": "Zamówienia pojawiajÄ… siÄ™ po połączeniu WooCommerce i uruchomieniu synchronizacji. Puste listy sÄ… normalne do pierwszego sync.", "empty.woo.noReviewsTitle": "Brak jeszcze recenzji", - "empty.woo.noReviewsMessage": "Opinie pojawiają się po kolejkowaniu importu z podłączonego sklepu. Ta karta działa także przy pustej liście.", + "empty.woo.noReviewsMessage": "Opinie pojawiajÄ… siÄ™ po kolejkowaniu importu z podłączonego sklepu. Ta karta dziaÅ‚a także przy pustej liÅ›cie.", "empty.admin.noProviderTitle": "Brak wierszy dostawcy", - "empty.admin.noProviderMessage": "Tokeny pojawiają się tutaj, gdy produkty zapiszą typ dostawcy.", + "empty.admin.noProviderMessage": "Tokeny pojawiajÄ… siÄ™ tutaj, gdy produkty zapiszÄ… typ dostawcy.", "empty.admin.noCompaniesTitle": "Brak firm", "empty.admin.noCompaniesMessage": "Lista firm jest pusta.", "empty.admin.noCyclesTitle": "Brak cykli rozliczeniowych", - "empty.admin.noCyclesMessage": "Cykle pojawiają się, gdy przebiegi rozliczeń utworzą historyczne wiersze.", + "empty.admin.noCyclesMessage": "Cykle pojawiajÄ… siÄ™, gdy przebiegi rozliczeÅ„ utworzÄ… historyczne wiersze.", "empty.admin.noCompaniesFound": "Nie znaleziono firm.", - "empty.admin.noCompaniesMatch": "Żadna firma nie pasuje do tego filtra.", - "empty.admin.notPlatformTitle": "Nie jesteś adminem platformy", - "empty.admin.notPlatformMessage": "Twoje konto jest zalogowane, ale nie jest oznaczone jako admin platformy. Poproś istniejącego admina o dostęp, wyloguj się i zaloguj ponownie.", - "empty.admin.noJobsFilter": "Brak zadań dla tego filtra.", - "empty.admin.noAdminUsers": "Nie znaleziono użytkowników admin", - "empty.admin.noJobs": "Nie znaleziono zadań.", - "empty.admin.queueUnavailable": "Kolejka wsparcia jest niedostępna. Skontaktuj się z administratorem platformy, jeśli to trwa.", - "empty.admin.noTicketsQueue": "Brak zgłoszeń w tej kolejce.", + "empty.admin.noCompaniesMatch": "Å»adna firma nie pasuje do tego filtra.", + "empty.admin.notPlatformTitle": "Nie jesteÅ› adminem platformy", + "empty.admin.notPlatformMessage": "Twoje konto jest zalogowane, ale nie jest oznaczone jako admin platformy. PoproÅ› istniejÄ…cego admina o dostÄ™p, wyloguj siÄ™ i zaloguj ponownie.", + "empty.admin.noJobsFilter": "Brak zadaÅ„ dla tego filtra.", + "empty.admin.noAdminUsers": "Nie znaleziono użytkowników admin", + "empty.admin.noJobs": "Nie znaleziono zadaÅ„.", + "empty.admin.queueUnavailable": "Kolejka wsparcia jest niedostÄ™pna. Skontaktuj siÄ™ z administratorem platformy, jeÅ›li to trwa.", + "empty.admin.noTicketsQueue": "Brak zgÅ‚oszeÅ„ w tej kolejce.", "empty.admin.knowledgeTitle": "Baza wiedzy wsparcia", "empty.admin.knowledgeNotReadyTitle": "Wiedza wsparcia nie jest gotowa", - "empty.admin.knowledgeNotReadyMessage": "Artykuły i auto-odpowiedź nie są jeszcze skonfigurowane w tej instalacji.", - "empty.admin.noTemplatesTitle": "Brak szablonów odpowiedzi", - "empty.admin.noTemplatesMessage": "Szablony są dopasowywane jak artykuły i publikowane jako oznaczone odpowiedzi automatyczne.", - "empty.admin.ticketNotFound": "Nie znaleziono zgłoszenia.", - "empty.admin.supportUnavailable": "Wsparcie nie jest dostępne w tym wdrożeniu.", - "empty.admin.ticketLoadFailed": "Nie udało się wczytać tego zgłoszenia.", - "empty.admin.noMessages": "Brak wiadomości.", - "empty.admin.translationsUnavailableTitle": "Tłumaczenia niedostępne", - "empty.admin.translationsUnavailableMessage": "Endpoint katalogu tłumaczeń nie jest dostępny w tym buildzie.", - "empty.admin.noKeysMatchTitle": "Brak pasujących kluczy", - "empty.admin.noKeysMatchMessage": "Spróbuj innego filtra lub wyszukiwania, albo odśwież po dodaniu nowych kluczy do angielskiego.", - "empty.admin.noUsersMatch": "Żaden użytkownik nie pasuje do tego filtra.", - "empty.admin.noCompaniesMatchFilter": "Żadna firma nie pasuje do tego filtra.", - "blast.title": "Potwierdź masową wysyłkę", - "blast.dryRunDescription": "Tryb dry-run jest aktywny — żadne prawdziwe e-maile nie opuszczą Descrybe. Potwierdź, aby zapisać wysyłkę testową.", - "blast.liveDescription": "To wyśle prawdziwe e-maile do odbiorców. Wpisz I understand, aby kontynuować.", - "blast.recipients": "Odbiorcy w tym żądaniu: {count}", - "blast.typePhrase": "Wpisz „I understand”", + "empty.admin.knowledgeNotReadyMessage": "ArtykuÅ‚y i auto-odpowiedź nie sÄ… jeszcze skonfigurowane w tej instalacji.", + "empty.admin.noTemplatesTitle": "Brak szablonów odpowiedzi", + "empty.admin.noTemplatesMessage": "Szablony sÄ… dopasowywane jak artykuÅ‚y i publikowane jako oznaczone odpowiedzi automatyczne.", + "empty.admin.ticketNotFound": "Nie znaleziono zgÅ‚oszenia.", + "empty.admin.supportUnavailable": "Wsparcie nie jest dostÄ™pne w tym wdrożeniu.", + "empty.admin.ticketLoadFailed": "Nie udaÅ‚o siÄ™ wczytać tego zgÅ‚oszenia.", + "empty.admin.noMessages": "Brak wiadomoÅ›ci.", + "empty.admin.translationsUnavailableTitle": "TÅ‚umaczenia niedostÄ™pne", + "empty.admin.translationsUnavailableMessage": "Endpoint katalogu tÅ‚umaczeÅ„ nie jest dostÄ™pny w tym buildzie.", + "empty.admin.noKeysMatchTitle": "Brak pasujÄ…cych kluczy", + "empty.admin.noKeysMatchMessage": "Spróbuj innego filtra lub wyszukiwania, albo odÅ›wież po dodaniu nowych kluczy do angielskiego.", + "empty.admin.noUsersMatch": "Å»aden użytkownik nie pasuje do tego filtra.", + "empty.admin.noCompaniesMatchFilter": "Å»adna firma nie pasuje do tego filtra.", + "blast.title": "Potwierdź masowÄ… wysyÅ‚kÄ™", + "blast.dryRunDescription": "Tryb dry-run jest aktywny — żadne prawdziwe e-maile nie opuszczÄ… Descrybe. Potwierdź, aby zapisać wysyÅ‚kÄ™ testowÄ….", + "blast.liveDescription": "To wyÅ›le prawdziwe e-maile do odbiorców. Wpisz I understand, aby kontynuować.", + "blast.recipients": "Odbiorcy w tym żądaniu: {count}", + "blast.typePhrase": "Wpisz „I understand”", "blast.placeholder": "I understand", "blast.runDryRun": "Uruchom dry-run", - "blast.send": "Wyślij blast", - "marketing.footerBefore": "Kampanie e-mail pozostają pod", - "marketing.footerAfter": "— ta strona tylko przygotowuje feedy eksportu katalogu.", + "blast.send": "WyÅ›lij blast", + "marketing.footerBefore": "Kampanie e-mail pozostajÄ… pod", + "marketing.footerAfter": "— ta strona tylko przygotowuje feedy eksportu katalogu.", "support.title": "Centrum wsparcia", - "support.description": "Otwórz a zgłoszenie for rozliczenia, bugs, or account help. Personel replies show here and as in-app notifications.", - "support.newTicket": "New zgłoszenie", - "support.createTicket": "Utwórz zgłoszenie", - "support.loadingTickets": "Ładowanie zgłoszenia…", - "support.loadFailed": "Nie udało się wczytać zgłoszeń wsparcia", - "support.unavailableBanner": "Wsparcie is not fully dostępne yet. You can still prepare a zgłoszenie; submitting may wait until the service is ready.", - "support.yourTickets": "Twoje zgłoszenia", - "support.ticketCount": "{count} zgłoszenia", - "support.ticketCountOne": "{count} zgłoszenie", - "support.statusFilterSuffix": "· status {status}", + "support.description": "Otwórz a zgÅ‚oszenie for rozliczenia, bugs, or account help. Personel replies show here and as in-app notifications.", + "support.newTicket": "New zgÅ‚oszenie", + "support.createTicket": "Utwórz zgÅ‚oszenie", + "support.loadingTickets": "Ładowanie zgÅ‚oszenia…", + "support.loadFailed": "Nie udaÅ‚o siÄ™ wczytać zgÅ‚oszeÅ„ wsparcia", + "support.unavailableBanner": "Wsparcie is not fully dostÄ™pne yet. You can still prepare a zgÅ‚oszenie; submitting may wait until the service is ready.", + "support.yourTickets": "Twoje zgÅ‚oszenia", + "support.ticketCount": "{count} zgÅ‚oszenia", + "support.ticketCountOne": "{count} zgÅ‚oszenie", + "support.statusFilterSuffix": "· status {status}", "support.filterByStatus": "Filtruj by status", - "support.unavailableTitle": "Wsparcie niedostępne", - "support.emptyTitle": "Brak jeszcze zgłoszeń", - "support.unavailableEmpty": "API wsparcia jest niedostępne. Spróbuj wkrótce lub otwórz nowe zgłoszenie, gdy usługa wróci.", - "support.emptyFiltered": "Żadne zgłoszenie nie pasuje do tego statusu. Spróbuj innego filtra lub utwórz nowe.", - "support.emptyHelp": "Opisz problem — zespół odpowie w tym wątku. Dostaniesz też powiadomienie w aplikacji, gdy personel odpowie.", - "support.clearFilter": "Wyczyść filtr", + "support.unavailableTitle": "Wsparcie niedostÄ™pne", + "support.emptyTitle": "Brak jeszcze zgÅ‚oszeÅ„", + "support.unavailableEmpty": "API wsparcia jest niedostÄ™pne. Spróbuj wkrótce lub otwórz nowe zgÅ‚oszenie, gdy usÅ‚uga wróci.", + "support.emptyFiltered": "Å»adne zgÅ‚oszenie nie pasuje do tego statusu. Spróbuj innego filtra lub utwórz nowe.", + "support.emptyHelp": "Opisz problem — zespół odpowie w tym wÄ…tku. Dostaniesz też powiadomienie w aplikacji, gdy personel odpowie.", + "support.clearFilter": "Wyczyść filtr", "support.table.subject": "Temat", "support.table.category": "Kategoria", "support.table.status": "Stan", "support.table.priority": "Priorytet", "support.table.updated": "Zaktualizowano", - "support.openTicketAria": "Otwórz zgłoszenie {subject}", + "support.openTicketAria": "Otwórz zgÅ‚oszenie {subject}", "support.status.all": "Wszystko", - "support.status.open": "Otwórz", - "support.status.pending": "Oczekujące", - "support.status.resolved": "Rozwiązane", - "support.status.closed": "Zamknięte", - "support.new.title": "Nowe zgłoszenie wsparcia", - "support.new.description": "Powiedz, z czym potrzebujesz pomocy. Dołącz kroki, komunikaty błędów lub dane faktury, jeśli pasują.", - "support.new.back": "Wstecz to zgłoszenia", - "support.new.details": "Zgłoszenie details", - "support.new.detailsHelp": "Status zaczyna się jako otwarty. Najpierw możesz dostać automatyczną odpowiedź; człowiek z zespołu może przejąć w dowolnym momencie w tym samym wątku.", + "support.status.open": "Otwórz", + "support.status.pending": "OczekujÄ…ce", + "support.status.resolved": "RozwiÄ…zane", + "support.status.closed": "ZamkniÄ™te", + "support.new.title": "Nowe zgÅ‚oszenie wsparcia", + "support.new.description": "Powiedz, z czym potrzebujesz pomocy. Dołącz kroki, komunikaty błędów lub dane faktury, jeÅ›li pasujÄ….", + "support.new.back": "Wstecz to zgÅ‚oszenia", + "support.new.details": "ZgÅ‚oszenie details", + "support.new.detailsHelp": "Status zaczyna siÄ™ jako otwarty. Najpierw możesz dostać automatycznÄ… odpowiedź; czÅ‚owiek z zespoÅ‚u może przejąć w dowolnym momencie w tym samym wÄ…tku.", "support.new.subject": "Temat", - "support.new.subjectPlaceholder": "Krótkie podsumowanie", + "support.new.subjectPlaceholder": "Krótkie podsumowanie", "support.new.category": "Kategoria", "support.new.priority": "Priorytet", "support.new.optional": "Opcjonalne details", - "support.new.optionalHint": "(SKU, tagi — pomaga w routingu)", - "support.new.relatedSku": "Powiązane SKU", + "support.new.optionalHint": "(SKU, tagi — pomaga w routingu)", + "support.new.relatedSku": "PowiÄ…zane SKU", "support.new.relatedSkuPlaceholder": "np. ABC-123", "support.new.relatedSkuHelp": "Produkt or feed SKU if this is about a specific item.", "support.new.tags": "Tagi", "support.new.tagsPlaceholder": "login, faktura (oddzielone przecinkami)", - "support.new.tagsHelp": "Do 10 krótkich etykiet. Normalizujemy spacje i interpunkcję.", - "support.new.tagsWillSend": "Zostanie wysłane: {tags}", - "support.new.message": "Wiadomość", - "support.new.messagePlaceholder": "Opisz problem, czego oczekiwałeś i co pomoże go odtworzyć.", - "support.new.createdTitle": "Utworzono zgłoszenie", - "support.new.createdBody": "Odpowiemy w tym wątku. Sprawdzaj powiadomienia in-app.", - "support.new.viewTicket": "View zgłoszenie", - "support.new.unavailable": "Wsparcie is temporarily niedostępne. Your message was not submitted — try again shortly.", - "support.new.unavailableTitle": "Wsparcie niedostępne", - "support.new.createFailed": "Nie można utworzyć zgłoszenia", - "support.ticket.fallbackTitle": "Wsparcie zgłoszenie", + "support.new.tagsHelp": "Do 10 krótkich etykiet. Normalizujemy spacje i interpunkcjÄ™.", + "support.new.tagsWillSend": "Zostanie wysÅ‚ane: {tags}", + "support.new.message": "Wiadomość", + "support.new.messagePlaceholder": "Opisz problem, czego oczekiwaÅ‚eÅ› i co pomoże go odtworzyć.", + "support.new.createdTitle": "Utworzono zgÅ‚oszenie", + "support.new.createdBody": "Odpowiemy w tym wÄ…tku. Sprawdzaj powiadomienia in-app.", + "support.new.viewTicket": "View zgÅ‚oszenie", + "support.new.unavailable": "Wsparcie is temporarily niedostÄ™pne. Your message was not submitted — try again shortly.", + "support.new.unavailableTitle": "Wsparcie niedostÄ™pne", + "support.new.createFailed": "Nie można utworzyć zgÅ‚oszenia", + "support.ticket.fallbackTitle": "Wsparcie zgÅ‚oszenie", "support.ticket.description": "Conversation thread with Descrybe wsparcie.", - "support.ticket.meta": "{category} · {priority} · Zaktualizowano {when}", - "support.ticket.allTickets": "Wszystko zgłoszenia", - "support.ticket.loading": "Ładowanie zgłoszenie…", - "support.ticket.missingId": "Brak identyfikatora zgłoszenia", - "support.ticket.notFound": "Nie znaleziono zgłoszenia", - "support.ticket.notFoundMessage": "To zgłoszenie mogło zostać usunięte albo nie masz dostępu.", + "support.ticket.meta": "{category} · {priority} · Zaktualizowano {when}", + "support.ticket.allTickets": "Wszystko zgÅ‚oszenia", + "support.ticket.loading": "Ładowanie zgÅ‚oszenie…", + "support.ticket.missingId": "Brak identyfikatora zgÅ‚oszenia", + "support.ticket.notFound": "Nie znaleziono zgÅ‚oszenia", + "support.ticket.notFoundMessage": "To zgÅ‚oszenie mogÅ‚o zostać usuniÄ™te albo nie masz dostÄ™pu.", "support.ticket.backCenter": "Wstecz to Wsparcie Center", - "support.ticket.unavailable": "Wsparcie jest tymczasowo niedostępne.", - "support.ticket.loadFailed": "Nie udało się wczytać zgłoszenia", - "support.ticket.openedMeta": "Otwórzed {when} · {category} · {priority} priority", + "support.ticket.unavailable": "Wsparcie jest tymczasowo niedostÄ™pne.", + "support.ticket.loadFailed": "Nie udaÅ‚o siÄ™ wczytać zgÅ‚oszenia", + "support.ticket.openedMeta": "Otwórzed {when} · {category} · {priority} priority", "support.ticket.sku": "SKU {sku}", - "support.ticket.messagesAria": "Zgłoszenie messages", - "support.ticket.noMessages": "Brak wiadomości", - "support.ticket.noMessagesHelp": "Ten wątek nie ma jeszcze wiadomości.", - "support.ticket.yourReply": "Twoja odpowiedź", - "support.ticket.replyPlaceholder": "Add details or reply to wsparcie…", - "support.ticket.sendReply": "Wyślij odpowiedź", - "support.ticket.replySent": "Odpowiedź wysłana", - "support.ticket.reopened": "Zgłoszenie reopened for staff review.", - "support.ticket.replyAdded": "Twoja wiadomość została dodana do wątku.", - "support.ticket.replyFailed": "Nie można wysłać odpowiedzi", - "support.ticket.reopenHint": "Replying reopens this zgłoszenie for staff.", + "support.ticket.messagesAria": "ZgÅ‚oszenie messages", + "support.ticket.noMessages": "Brak wiadomoÅ›ci", + "support.ticket.noMessagesHelp": "Ten wÄ…tek nie ma jeszcze wiadomoÅ›ci.", + "support.ticket.yourReply": "Twoja odpowiedź", + "support.ticket.replyPlaceholder": "Add details or reply to wsparcie…", + "support.ticket.sendReply": "WyÅ›lij odpowiedź", + "support.ticket.replySent": "Odpowiedź wysÅ‚ana", + "support.ticket.reopened": "ZgÅ‚oszenie reopened for staff review.", + "support.ticket.replyAdded": "Twoja wiadomość zostaÅ‚a dodana do wÄ…tku.", + "support.ticket.replyFailed": "Nie można wysÅ‚ać odpowiedzi", + "support.ticket.reopenHint": "Replying reopens this zgÅ‚oszenie for staff.", "support.ticket.humanHint": "Replying asks a human teammate to continue from tutaj.", - "support.ticket.closedBanner": "This zgłoszenie is closed. Utwórz a new zgłoszenie if you still need help.", + "support.ticket.closedBanner": "This zgÅ‚oszenie is closed. Utwórz a new zgÅ‚oszenie if you still need help.", "support.kind.you": "Ty", "support.kind.human": "Wsparcie", "support.kind.auto": "Automatyczne", "support.kind.ai": "Wspomagane AI", "support.kind.system": "Warstwa systemu", - "support.kind.autoBadge": "Automatyczna odpowiedź", + "support.kind.autoBadge": "Automatyczna odpowiedź", "support.kind.aiBadge": "Wspomagane AI", - "support.progress.closed.title": "Zgłoszenie closed", - "support.progress.closed.message": "This conversation is closed. Otwórz a new zgłoszenie if you still need help.", - "support.progress.resolved.title": "Oznaczono jako rozwiązane", - "support.progress.resolved.message": "Uważamy, że sprawa jest załatwiona. Odpowiedz, by otworzyć ponownie, albo zostaw szybką ocenę poniżej.", - "support.progress.quickAnswer.title": "Wysłano szybką odpowiedź", - "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply tutaj — a human will take over.", - "support.progress.onIt.title": "Zajmujemy się tym", - "support.progress.onIt.handedMessage": "A wsparcie teammate has your zgłoszenie and will reply in this thread.", + "support.progress.closed.title": "ZgÅ‚oszenie closed", + "support.progress.closed.message": "This conversation is closed. Otwórz a new zgÅ‚oszenie if you still need help.", + "support.progress.resolved.title": "Oznaczono jako rozwiÄ…zane", + "support.progress.resolved.message": "Uważamy, że sprawa jest zaÅ‚atwiona. Odpowiedz, by otworzyć ponownie, albo zostaw szybkÄ… ocenÄ™ poniżej.", + "support.progress.quickAnswer.title": "WysÅ‚ano szybkÄ… odpowiedź", + "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply tutaj — a human will take over.", + "support.progress.onIt.title": "Zajmujemy siÄ™ tym", + "support.progress.onIt.handedMessage": "A wsparcie teammate has your zgÅ‚oszenie and will reply in this thread.", "support.progress.onIt.pendingMessage": "Wsparcie is reviewing your message. You will see updates in this thread.", - "support.progress.received.title": "Zgłoszenie received", - "support.progress.received.message": "Dzięki — mamy Twoje zgłoszenie. Wkrótce może pojawić się automatyczna pomoc albo odpowie kolega z zespołu.", + "support.progress.received.title": "ZgÅ‚oszenie received", + "support.progress.received.message": "DziÄ™ki — mamy Twoje zgÅ‚oszenie. Wkrótce może pojawić siÄ™ automatyczna pomoc albo odpowie kolega z zespoÅ‚u.", "support.category.billing": "Rozliczenia", "support.category.billing.help": "Faktury, payment methods, plan changes, and Stripe receipts.", "support.category.billing_credits": "Rozliczenia / credits", - "support.category.billing_credits.help": "Saldo kredytów, limity użycia i doładowania.", - "support.category.bug": "Bug / błąd", - "support.category.bug.help": "Nieoczekiwane błędy, zepsute ekrany lub kroki, które zawsze zawodzą.", - "support.category.account": "Konto / dostęp", + "support.category.billing_credits.help": "Saldo kredytów, limity użycia i doÅ‚adowania.", + "support.category.bug": "Bug / błąd", + "support.category.bug.help": "Nieoczekiwane błędy, zepsute ekrany lub kroki, które zawsze zawodzÄ….", + "support.category.account": "Konto / dostÄ™p", "support.category.account.help": "Login, invites, firma membership, and permissions.", "support.category.integrations": "Integracje", "support.category.integrations.help": "WooCommerce, Shopify, publiczne API lub konfiguracja konektora.", @@ -2573,184 +2574,184 @@ export const pl: MessageDict = { "support.category.export": "Eksportuj / channels", "support.category.export.help": "Eksportuj feedy, channels, and sync destinations.", "support.category.migration": "Migracja / dane", - "support.category.migration.help": "Brakujące lub błędne dane po cutover — produkty, feedy, sklepy, rozliczenia lub zespół.", + "support.category.migration.help": "BrakujÄ…ce lub błędne dane po cutover — produkty, feedy, sklepy, rozliczenia lub zespół.", "support.category.other": "Inne", - "support.category.other.help": "Cokolwiek innego — przekierujemy do właściwej osoby.", + "support.category.other.help": "Cokolwiek innego — przekierujemy do wÅ‚aÅ›ciwej osoby.", "support.priority.low": "Niski", - "support.priority.low.help": "Mile widziane lub nieblokujące — zajmiemy się kolejno.", + "support.priority.low.help": "Mile widziane lub nieblokujÄ…ce — zajmiemy siÄ™ kolejno.", "support.priority.normal": "Normalny", - "support.priority.normal.help": "Standard request. Most zgłoszenia use this.", + "support.priority.normal.help": "Standard request. Most zgÅ‚oszenia use this.", "support.priority.high": "Wysoki", - "support.priority.high.help": "Blokuje pracę lub przychody — używaj oszczędnie.", - "support.csat.thanks": "Dziękujemy za opinię", - "support.csat.unavailable": "Ocena jest tymczasowo niedostępna. Spróbuj ponownie później.", - "support.csat.unavailableTitle": "Ocena niedostępna", - "support.csat.alreadyRated": "Już oceniłeś to zgłoszenie.", - "support.csat.alreadyRatedTitle": "Już oceniono", - "support.csat.submitFailed": "Nie można przesłać oceny", + "support.priority.high.help": "Blokuje pracÄ™ lub przychody — używaj oszczÄ™dnie.", + "support.csat.thanks": "DziÄ™kujemy za opiniÄ™", + "support.csat.unavailable": "Ocena jest tymczasowo niedostÄ™pna. Spróbuj ponownie później.", + "support.csat.unavailableTitle": "Ocena niedostÄ™pna", + "support.csat.alreadyRated": "Już oceniÅ‚eÅ› to zgÅ‚oszenie.", + "support.csat.alreadyRatedTitle": "Już oceniono", + "support.csat.submitFailed": "Nie można przesÅ‚ać oceny", "support.csat.yourRating": "Twoja ocena", - "support.csat.ratedOutOf": "You rated this zgłoszenie {score} out of 5", - "support.csat.howDidWeDo": "Jak nam poszło?", - "support.csat.formHelp": "This zgłoszenie is {status}. Rate your experience (1–5). Opcjonalne comment helps us improve.", + "support.csat.ratedOutOf": "You rated this zgÅ‚oszenie {score} out of 5", + "support.csat.howDidWeDo": "Jak nam poszÅ‚o?", + "support.csat.formHelp": "This zgÅ‚oszenie is {status}. Rate your experience (1–5). Opcjonalne comment helps us improve.", "support.csat.rating": "Ocena", - "support.csat.scoreAria": "{value} — {label}", + "support.csat.scoreAria": "{value} — {label}", "support.csat.whatWentWrong": "What went wrong? (opcjonalne)", - "support.csat.whatWentWrongPlaceholder": "Krótka notatka pomaga nam w follow-upie.", + "support.csat.whatWentWrongPlaceholder": "Krótka notatka pomaga nam w follow-upie.", "support.csat.anythingElse": "Anything else? (opcjonalne)", "support.csat.optionalFeedback": "Opcjonalne feedback", - "support.csat.submit": "Wyślij ocenę", + "support.csat.submit": "WyÅ›lij ocenÄ™", "support.csat.score.1": "Bardzo niezadowolony", "support.csat.score.2": "Niezadowolony", "support.csat.score.3": "OK", "support.csat.score.4": "Zadowolony", "support.csat.score.5": "Bardzo zadowolony", - "catalog.delete": "Usuń", - "catalog.deleting": "Usuwanie…", - "catalog.saving": "Zapisywanie…", - "catalog.adding": "Dodawanie…", - "catalog.assigning": "Przypisywanie…", - "catalog.uploading": "Przesyłanie…", - "catalog.create": "Utwórz", - "catalog.createFailed": "Tworzenie nie powiodło się", - "catalog.updateFailed": "Aktualizacja nie powiodła się", - "catalog.deleteFailed": "Usuwanie nie powiodło się", - "catalog.importFailed": "Import nie powiódł się", - "catalog.confirm": "Potwierdź", - "catalog.confirmDeletion": "Potwierdź usunięcie", + "catalog.delete": "UsuÅ„", + "catalog.deleting": "Usuwanie…", + "catalog.saving": "Zapisywanie…", + "catalog.adding": "Dodawanie…", + "catalog.assigning": "Przypisywanie…", + "catalog.uploading": "PrzesyÅ‚anie…", + "catalog.create": "Utwórz", + "catalog.createFailed": "Tworzenie nie powiodÅ‚o siÄ™", + "catalog.updateFailed": "Aktualizacja nie powiodÅ‚a siÄ™", + "catalog.deleteFailed": "Usuwanie nie powiodÅ‚o siÄ™", + "catalog.importFailed": "Import nie powiódÅ‚ siÄ™", + "catalog.confirm": "Potwierdź", + "catalog.confirmDeletion": "Potwierdź usuniÄ™cie", "catalog.areYouSure": "Czy na pewno?", "catalog.previous": "Wstecz", "catalog.next": "Dalej", - "catalog.expand": "Rozwiń", - "catalog.collapse": "Zwiń", - "catalog.clearSearch": "Wyczyść wyszukiwanie", - "catalog.clearFilters": "Wyczyść filtry", - "catalog.clearSelection": "Wyczyść zaznaczenie", + "catalog.expand": "RozwiÅ„", + "catalog.collapse": "ZwiÅ„", + "catalog.clearSearch": "Wyczyść wyszukiwanie", + "catalog.clearFilters": "Wyczyść filtry", + "catalog.clearSelection": "Wyczyść zaznaczenie", "catalog.add": "Dodaj", "catalog.update": "Aktualizuj", "catalog.edit": "Edytuj", "catalog.accept": "Zaakceptuj", - "catalog.reject": "Odrzuć", + "catalog.reject": "Odrzuć", "catalog.reset": "Resetuj", "catalog.undo": "Cofnij", "catalog.close": "Zamknij", "catalog.closePanel": "Zamknij panel", "catalog.closeMenus": "Zamknij menu", - "catalog.openMenu": "Otwórz menu", - "catalog.loading": "Ładowanie…", + "catalog.openMenu": "Otwórz menu", + "catalog.loading": "Ładowanie…", "catalog.empty": "Puste", "catalog.required": "Wymagane", "catalog.optional": "Opcjonalne", "catalog.features": "Funkcje", - "catalog.csvImportFinished": "Import CSV zakończony.", - "catalog.comparePlans": "Porównaj plany", + "catalog.csvImportFinished": "Import CSV zakoÅ„czony.", + "catalog.comparePlans": "Porównaj plany", "catalog.saveChanges": "Zapisz zmiany", - "catalog.saveFormula": "Zapisz formułę", - "catalog.saveFormulaShort": "Zapisz formułę", - "catalog.noResults": "Brak wyników", + "catalog.saveFormula": "Zapisz formułę", + "catalog.saveFormulaShort": "Zapisz formułę", + "catalog.noResults": "Brak wyników", "products.title": "Produkty", - "products.description": "Przeglądaj, sprawdzaj i przetwarzaj katalog.", - "products.loadFailed": "Nie udało się wczytać produktów", + "products.description": "PrzeglÄ…daj, sprawdzaj i przetwarzaj katalog.", + "products.loadFailed": "Nie udaÅ‚o siÄ™ wczytać produktów", "products.unnamed": "Produkt bez nazwy", - "products.tabs.navLabel": "Widoki produktów", + "products.tabs.navLabel": "Widoki produktów", "products.tab.processed": "Przetworzone", "products.tab.processedHint": "Gotowe produkty do eksportu lub synchronizacji", - "products.tab.needsReview": "Do przeglądu", + "products.tab.needsReview": "Do przeglÄ…du", "products.tab.needsReviewHint": "Wzbogacone produkty do zaakceptowania, edycji lub odrzucenia", "products.tab.needsReviewShort": "Przejrzyj", - "products.tab.error": "Błędy", - "products.tab.errorHint": "Produkty, które nie powiodły się w zadaniu", + "products.tab.error": "Błędy", + "products.tab.errorHint": "Produkty, które nie powiodÅ‚y siÄ™ w zadaniu", "products.tab.processing": "W toku", - "products.tab.processingHint": "Produkty w trwającym zadaniu", + "products.tab.processingHint": "Produkty w trwajÄ…cym zadaniu", "products.tab.busy": "W toku", "products.tab.unprocessed": "Nieprzetworzone", "products.tab.unprocessedHint": "Produkty katalogu jeszcze nieprzetworzone", "products.tab.raw": "Nieprzetworzone", "products.status.processed": "Przetworzone", - "products.status.needsReview": "Do przeglądu", + "products.status.needsReview": "Do przeglÄ…du", "products.status.processing": "Przetwarzanie", - "products.status.error": "Błąd", + "products.status.error": "Błąd", "products.status.failed": "Niepowodzenie", "products.status.unprocessed": "Nieprzetworzone", - "products.status.pending": "Oczekujące", + "products.status.pending": "OczekujÄ…ce", "products.status.unknown": "Nieznane", - "products.pagination.showing": "Pokazano {start}–{end} z {total}", - "products.empty.processing.title": "Brak jeszcze zadań", - "products.empty.processing.messageJobs": "Nic teraz nie działa. Uruchom zadanie z Nieprzetworzone albo otwórz Przetwarzanie, by śledzić postęp.", - "products.empty.processing.messageBasic": "Produkty pojawiają się tutaj, gdy zadanie jest w toku.", - "products.empty.needsReview.title": "Brak produktów do przeglądu", - "products.empty.needsReview.message": "Po zadaniu wzbogacone produkty trafiają tutaj. Otwórz wiersz, porównaj oryginał ze wzbogaceniem, potem Zaakceptuj, edytuj lub Odrzuć.", - "products.empty.error.title": "Brak produktów z błędami", - "products.empty.error.message": "Gdy zadanie nie powiedzie się dla produktu, pojawi się tutaj, aby można było ponowić.", - "products.empty.noUnprocessedMatches": "Brak nieprzetworzonych dopasowań", - "products.empty.noMatch": "Żaden produkt nie pasuje", - "products.empty.filtersHint": "Spróbuj innego wyszukiwania, kategorii lub feedu — albo wyczyść filtry, by zobaczyć wszystko.", - "products.empty.noUnprocessed.title": "Brak nieprzetworzonych produktów", - "products.empty.noUnprocessed.message": "Podłącz feed dostawcy lub prześlij CSV, aby zaimportować produkty.", - "products.empty.none.title": "Brak produktów", - "products.empty.none.messageStores": "Najpierw dokończ Feeds → Map → Sync, potem Process. Importuj z feedu lub sklepu.", - "products.empty.none.messageBasic": "Najpierw dokończ Feeds → Map → Sync, potem Process. Podłącz feed lub prześlij CSV.", + "products.pagination.showing": "Pokazano {start}–{end} z {total}", + "products.empty.processing.title": "Brak jeszcze zadaÅ„", + "products.empty.processing.messageJobs": "Nic teraz nie dziaÅ‚a. Uruchom zadanie z Nieprzetworzone albo otwórz Przetwarzanie, by Å›ledzić postÄ™p.", + "products.empty.processing.messageBasic": "Produkty pojawiajÄ… siÄ™ tutaj, gdy zadanie jest w toku.", + "products.empty.needsReview.title": "Brak produktów do przeglÄ…du", + "products.empty.needsReview.message": "Po zadaniu wzbogacone produkty trafiajÄ… tutaj. Otwórz wiersz, porównaj oryginaÅ‚ ze wzbogaceniem, potem Zaakceptuj, edytuj lub Odrzuć.", + "products.empty.error.title": "Brak produktów z błędami", + "products.empty.error.message": "Gdy zadanie nie powiedzie siÄ™ dla produktu, pojawi siÄ™ tutaj, aby można byÅ‚o ponowić.", + "products.empty.noUnprocessedMatches": "Brak nieprzetworzonych dopasowaÅ„", + "products.empty.noMatch": "Å»aden produkt nie pasuje", + "products.empty.filtersHint": "Spróbuj innego wyszukiwania, kategorii lub feedu — albo wyczyść filtry, by zobaczyć wszystko.", + "products.empty.noUnprocessed.title": "Brak nieprzetworzonych produktów", + "products.empty.noUnprocessed.message": "Podłącz feed dostawcy lub przeÅ›lij CSV, aby zaimportować produkty.", + "products.empty.none.title": "Brak produktów", + "products.empty.none.messageStores": "Najpierw dokoÅ„cz Feeds → Map → Sync, potem Process. Importuj z feedu lub sklepu.", + "products.empty.none.messageBasic": "Najpierw dokoÅ„cz Feeds → Map → Sync, potem Process. Podłącz feed lub przeÅ›lij CSV.", "products.actions.viewJobs": "Zobacz zadania", "products.actions.startJob": "Uruchom zadanie", "products.actions.viewProcessed": "Zobacz przetworzone", - "products.actions.retryFromCatalog": "Ponów z katalogu", - "products.actions.connectFeed": "Podłącz feed", + "products.actions.retryFromCatalog": "Ponów z katalogu", + "products.actions.connectFeed": "Podłącz feed", "products.actions.addProduct": "Dodaj produkt", - "products.actions.uploadCsv": "Prześlij CSV", + "products.actions.uploadCsv": "PrzeÅ›lij CSV", "products.actions.exportSelected": "Eksportuj zaznaczone", "products.export.title": "Eksportuj wybrane produkty", - "products.export.confirm": "Potwierdź eksport", - "products.export.loadFailed": "Nie udało się wczytać opcji feedu eksportu. Spróbuj ponownie.", - "products.export.noneFound": "Brak feedów eksportu. Utwórz jeden w Feedach eksportu, potem wróć, aby wyeksportować zaznaczenie.", + "products.export.confirm": "Potwierdź eksport", + "products.export.loadFailed": "Nie udaÅ‚o siÄ™ wczytać opcji feedu eksportu. Spróbuj ponownie.", + "products.export.noneFound": "Brak feedów eksportu. Utwórz jeden w Feedach eksportu, potem wróć, aby wyeksportować zaznaczenie.", "products.export.selectFormat": "Wybierz feed eksportu.", - "products.export.failed": "Nie można wyeksportować wybranych produktów", - "products.upload.title": "Prześlij CSV", - "products.upload.description": "Importuj produkty z pliku CSV (GTIN/EAN, nazwa, kategoria, …). Pobierz przykładowy plik, aby zobaczyć pełny zestaw kolumn.", - "products.upload.submit": "Prześlij i importuj", + "products.export.failed": "Nie można wyeksportować wybranych produktów", + "products.upload.title": "PrzeÅ›lij CSV", + "products.upload.description": "Importuj produkty z pliku CSV (GTIN/EAN, nazwa, kategoria, …). Pobierz przykÅ‚adowy plik, aby zobaczyć peÅ‚ny zestaw kolumn.", + "products.upload.submit": "PrzeÅ›lij i importuj", "products.upload.chooseFirst": "Najpierw wybierz plik CSV.", - "products.upload.csvOnly": "Prześlij plik CSV.", + "products.upload.csvOnly": "PrzeÅ›lij plik CSV.", "products.upload.tooLarge": "CSV must be 5 MB or smaller.", "products.processing.started": "Uruchomiono zadanie przetwarzania", - "products.processing.startFailed": "Nie udało się uruchomić przetwarzania", - "products.processing.startJobFailed": "Nie udało się uruchomić zadania przetwarzania", + "products.processing.startFailed": "Nie udaÅ‚o siÄ™ uruchomić przetwarzania", + "products.processing.startJobFailed": "Nie udaÅ‚o siÄ™ uruchomić zadania przetwarzania", "products.processing.cancelled": "Przetwarzanie anulowane", "products.processing.jobsCancelled": "Anulowano zadania przetwarzania", - "products.processing.cancelFailed": "Nie można anulować zadania przetwarzania", - "products.processing.justCancelled": "Właśnie uruchomione zadanie zostało anulowane.", + "products.processing.cancelFailed": "Nie można anulować zadania przetwarzania", + "products.processing.justCancelled": "WÅ‚aÅ›nie uruchomione zadanie zostaÅ‚o anulowane.", "products.processing.viewInProcessing": "Zobacz w Przetwarzaniu", - "products.processing.confirm": "Potwierdź przetwarzanie", - "products.processing.freePlanTitle": "Plan Free — przetwarzanie bez AI", + "products.processing.confirm": "Potwierdź przetwarzanie", + "products.processing.freePlanTitle": "Plan Free — przetwarzanie bez AI", "products.processing.freePlanBody": "Normalnyize, specs, fill, and EPREL run at no credit cost. AI titles/descriptions require a paid plan or credits.", - "products.enrichment.acceptTitle": "Zaakceptować wzbogacenie?", - "products.enrichment.acceptConfirm": "Potwierdź akceptację wzbogacenia", - "products.enrichment.acceptSelected": "Zaakceptować wzbogacenie dla {count} zaznaczonych produktów? Trafią do Przetworzonych.", - "products.enrichment.rejectConfirm": "Potwierdź odrzucenie wzbogacenia", - "products.enrichment.rejectBody": "Odrzucić wzbogacenie i przywrócić ten produkt do nieprzetworzonych? Później możesz ponownie uruchomić przetwarzanie.", - "products.enrichment.rejectSelectedConfirm": "Potwierdź odrzucenie zaznaczonych", - "products.enrichment.resetConfirm": "Potwierdź reset do nieprzetworzonych", - "products.enrichment.resetSelected": "Zresetować {count} zaznaczonych produktów do nieprzetworzonych? Pojawią się ponownie jako nieprzetworzone.", - "products.enrichment.accepted": "Zaakceptowano wzbogacenie — przeniesiono do Przetworzonych.", - "products.enrichment.rejected": "Odrzucono wzbogacenie — produkt wrócił do nieprzetworzonych.", - "products.enrichment.acceptFailed": "Nie udało się zaakceptować wzbogacenia", - "products.enrichment.rejectFailed": "Nie udało się odrzucić wzbogacenia", - "products.enrichment.acceptUndone": "Cofnięto akceptację", - "products.enrichment.undoAcceptFailed": "Nie udało się cofnąć akceptacji", - "products.enrichment.resetDone": "Produkt wrócił do nieprzetworzonych.", - "products.enrichment.resetFailed": "Nie udało się zresetować produktów", - "products.enrichment.valueReset": "Wzbogacona wartość zresetowana do oryginału.", - "products.enrichment.originalEmpty": "Wartość oryginalna jest pusta; wzbogacenia nie można wyczyścić przez PATCH.", - "products.enrichment.staysNeedsReview": "Produkt pozostaje w Needs Review, dopóki nie Zaakceptujesz wszystkiego.", - "products.field.nameAcceptUndone": "Cofnięto akceptację nazwy", - "products.field.descriptionAcceptUndone": "Cofnięto akceptację opisu", - "products.field.nameDiscardUndone": "Cofnięto odrzucenie nazwy", - "products.field.descriptionDiscardUndone": "Cofnięto odrzucenie opisu", - "products.field.undoAcceptFailed": "Nie udało się cofnąć akceptacji pola", - "products.field.undoDiscardFailed": "Nie udało się cofnąć odrzucenia pola", - "products.updateFailed": "Nie udało się zaktualizować produktu", - "products.keyboardTips": "Skróty klawiszowe", - "products.keyboardTipsShort": "Skróty klawiszowe (?)", + "products.enrichment.acceptTitle": "Zaakceptować wzbogacenie?", + "products.enrichment.acceptConfirm": "Potwierdź akceptacjÄ™ wzbogacenia", + "products.enrichment.acceptSelected": "Zaakceptować wzbogacenie dla {count} zaznaczonych produktów? TrafiÄ… do Przetworzonych.", + "products.enrichment.rejectConfirm": "Potwierdź odrzucenie wzbogacenia", + "products.enrichment.rejectBody": "Odrzucić wzbogacenie i przywrócić ten produkt do nieprzetworzonych? Później możesz ponownie uruchomić przetwarzanie.", + "products.enrichment.rejectSelectedConfirm": "Potwierdź odrzucenie zaznaczonych", + "products.enrichment.resetConfirm": "Potwierdź reset do nieprzetworzonych", + "products.enrichment.resetSelected": "Zresetować {count} zaznaczonych produktów do nieprzetworzonych? PojawiÄ… siÄ™ ponownie jako nieprzetworzone.", + "products.enrichment.accepted": "Zaakceptowano wzbogacenie — przeniesiono do Przetworzonych.", + "products.enrichment.rejected": "Odrzucono wzbogacenie — produkt wróciÅ‚ do nieprzetworzonych.", + "products.enrichment.acceptFailed": "Nie udaÅ‚o siÄ™ zaakceptować wzbogacenia", + "products.enrichment.rejectFailed": "Nie udaÅ‚o siÄ™ odrzucić wzbogacenia", + "products.enrichment.acceptUndone": "CofniÄ™to akceptacjÄ™", + "products.enrichment.undoAcceptFailed": "Nie udaÅ‚o siÄ™ cofnąć akceptacji", + "products.enrichment.resetDone": "Produkt wróciÅ‚ do nieprzetworzonych.", + "products.enrichment.resetFailed": "Nie udaÅ‚o siÄ™ zresetować produktów", + "products.enrichment.valueReset": "Wzbogacona wartość zresetowana do oryginaÅ‚u.", + "products.enrichment.originalEmpty": "Wartość oryginalna jest pusta; wzbogacenia nie można wyczyÅ›cić przez PATCH.", + "products.enrichment.staysNeedsReview": "Produkt pozostaje w Needs Review, dopóki nie Zaakceptujesz wszystkiego.", + "products.field.nameAcceptUndone": "CofniÄ™to akceptacjÄ™ nazwy", + "products.field.descriptionAcceptUndone": "CofniÄ™to akceptacjÄ™ opisu", + "products.field.nameDiscardUndone": "CofniÄ™to odrzucenie nazwy", + "products.field.descriptionDiscardUndone": "CofniÄ™to odrzucenie opisu", + "products.field.undoAcceptFailed": "Nie udaÅ‚o siÄ™ cofnąć akceptacji pola", + "products.field.undoDiscardFailed": "Nie udaÅ‚o siÄ™ cofnąć odrzucenia pola", + "products.updateFailed": "Nie udaÅ‚o siÄ™ zaktualizować produktu", + "products.keyboardTips": "Skróty klawiszowe", + "products.keyboardTipsShort": "Skróty klawiszowe (?)", "products.option.categories": "Kategorie", "products.option.attributes": "Atrybuty / specyfikacje", - "products.option.titlesAi": "Tytuły (AI)", + "products.option.titlesAi": "TytuÅ‚y (AI)", "products.option.descriptionsAi": "Opisy (AI)", "products.enrichment.piece.name": "Nazwa", "products.enrichment.piece.description": "Opis", @@ -2758,231 +2759,231 @@ export const pl: MessageDict = { "products.enrichment.piece.category": "Kategoria", "products.enrichment.state.processed": "Przetworzone", "products.enrichment.state.feed": "Z feedu", - "products.enrichment.state.missing": "Brakujące", - "products.enrichment.help.name": "Tytuł produktu. Zielony = nazwa przetworzona przez AI; pomarańczowy = tylko nazwa z feedu/oryginał; szary = brak.", - "products.enrichment.help.description": "Opis produktu. Zielony = przetworzony przez AI; pomarańczowy = tylko feed/oryginał; szary = brak.", - "products.enrichment.help.attributes": "Specyfikacje i atrybuty. Zielony = atrybuty AI/wzbogacone; pomarańczowy = tylko z feedu; szary = brak.", + "products.enrichment.state.missing": "BrakujÄ…ce", + "products.enrichment.help.name": "TytuÅ‚ produktu. Zielony = nazwa przetworzona przez AI; pomaraÅ„czowy = tylko nazwa z feedu/oryginaÅ‚; szary = brak.", + "products.enrichment.help.description": "Opis produktu. Zielony = przetworzony przez AI; pomaraÅ„czowy = tylko feed/oryginaÅ‚; szary = brak.", + "products.enrichment.help.attributes": "Specyfikacje i atrybuty. Zielony = atrybuty AI/wzbogacone; pomaraÅ„czowy = tylko z feedu; szary = brak.", "products.enrichment.help.category": "Przypisana kategoria. Zielony = kategoria ustawiona; szary = brak.", "products.enrichment.chipTitle": "{label}: {state}. {help}", - "products.enrichment.complete": "Kompletne — {parts}", - "products.enrichment.missingSummary": "Brakuje {missing} — {parts}", - "products.issue.title": "tytuł", + "products.enrichment.complete": "Kompletne — {parts}", + "products.enrichment.missingSummary": "Brakuje {missing} — {parts}", + "products.issue.title": "tytuÅ‚", "products.issue.gtin": "GTIN", "products.issue.category": "kategoria", "products.filters.allCategories": "Wszystkie kategorie", "products.filters.allFeeds": "Wszystkie feedy", - "products.filters.allCoverage": "Całe pokrycie", - "products.filters.anyFeedChange": "Każda zmiana feedu", + "products.filters.allCoverage": "CaÅ‚e pokrycie", + "products.filters.anyFeedChange": "Każda zmiana feedu", "products.filters.eprelAll": "EPREL: wszystkie", "products.filters.feedChangesAll": "Zmiany feedu: wszystkie", - "products.filters.byCategory": "Filtruj według kategorii", + "products.filters.byCategory": "Filtruj wedÅ‚ug kategorii", "products.filters.byCoverage": "Filtruj by coverage", "products.filters.byFeed": "Filtruj wg feedu", "products.filters.byEprel": "Filtruj wg EPREL", "products.filters.byFeedSync": "Filtruj by feed sync changes", - "products.filters.coverageHint": "Filtruj według kompletności Nazwa / Opis / Atrybuty / Kategoria", + "products.filters.coverageHint": "Filtruj wedÅ‚ug kompletnoÅ›ci Nazwa / Opis / Atrybuty / Kategoria", "products.filters.feedSyncHint": "Filtruj by price/stock/title changes from the latest feed sync", - "products.filters.eprelHint": "Filtruj produkty, które mają lub nie mają id rejestru EPREL etykiety energetycznej", - "products.filters.availabilityChanged": "Dostępność zmieniona", + "products.filters.eprelHint": "Filtruj produkty, które majÄ… lub nie majÄ… id rejestru EPREL etykiety energetycznej", + "products.filters.availabilityChanged": "DostÄ™pność zmieniona", "products.eprel.badgeTitle": "Id EPREL obecne przy tym produkcie (European Product Registry for Energy Labelling).", "products.eprel.help": "Id European Product Registry for Energy Labelling (EPREL) jest obecne na tym produkcie.", "products.feedData": "Dane feedu", "attributes.title": "Atrybuty", - "attributes.description": "Zdefiniuj pola produktów, wartości list i przypisania kategorii.", - "attributes.loadFailed": "Nie udało się wczytać atrybutów", - "attributes.loading": "Ładowanie atrybutów…", - "attributes.zero": "0 atrybutów", + "attributes.description": "Zdefiniuj pola produktów, wartoÅ›ci list i przypisania kategorii.", + "attributes.loadFailed": "Nie udaÅ‚o siÄ™ wczytać atrybutów", + "attributes.loading": "Ładowanie atrybutów…", + "attributes.zero": "0 atrybutów", "attributes.addNew": "Dodaj nowy atrybut", - "attributes.create": "Utwórz atrybut", + "attributes.create": "Utwórz atrybut", "attributes.edit": "Edytuj atrybut", - "attributes.delete": "Usuń atrybut", - "attributes.displayName": "Nazwa wyświetlana atrybutu", + "attributes.delete": "UsuÅ„ atrybut", + "attributes.displayName": "Nazwa wyÅ›wietlana atrybutu", "attributes.actions": "Akcje atrybutu", "attributes.created": "Utworzono atrybut.", - "attributes.createdAssignFailed": "Atrybut utworzony, ale przypisanie kategorii nie powiodło się.", + "attributes.createdAssignFailed": "Atrybut utworzony, ale przypisanie kategorii nie powiodÅ‚o siÄ™.", "attributes.updated": "Zaktualizowano atrybut.", - "attributes.deleted": "Usunięto atrybut.", - "attributes.addValue": "Dodaj wartość", - "attributes.manageValues": "Dodawaj, edytuj lub usuwaj wartości dla tego atrybutu listy.", - "attributes.valueTypeHint": "Wybierz, jak wartości są wprowadzane dla tego atrybutu.", - "attributes.createDescription": "Utwórz nową definicję atrybutu. Możesz przypisać ją do kategorii podczas tworzenia.", + "attributes.deleted": "UsuniÄ™to atrybut.", + "attributes.addValue": "Dodaj wartość", + "attributes.manageValues": "Dodawaj, edytuj lub usuwaj wartoÅ›ci dla tego atrybutu listy.", + "attributes.valueTypeHint": "Wybierz, jak wartoÅ›ci sÄ… wprowadzane dla tego atrybutu.", + "attributes.createDescription": "Utwórz nowÄ… definicjÄ™ atrybutu. Możesz przypisać jÄ… do kategorii podczas tworzenia.", "attributes.assignToCategories": "Przypisz atrybuty do kategorii", - "attributes.assignFailed": "Nie można przypisać atrybutu do wybranej kategorii.", - "attributes.bulkAssignFailed": "Masowe przypisanie nie powiodło się", - "attributes.filterByCategory": "Filtruj według kategorii", - "attributes.saveValueFailed": "Nie można zapisać wartości", - "attributes.deleteValueFailed": "Nie można usunąć wartości", - "attributes.csvNeedHeader": "CSV musi zawierać nagłówek i co najmniej jeden wiersz", - "attributes.csvNeedColumns": "CSV musi zawierać kolumny \"category_id\" i \"attribute_key\"", + "attributes.assignFailed": "Nie można przypisać atrybutu do wybranej kategorii.", + "attributes.bulkAssignFailed": "Masowe przypisanie nie powiodÅ‚o siÄ™", + "attributes.filterByCategory": "Filtruj wedÅ‚ug kategorii", + "attributes.saveValueFailed": "Nie można zapisać wartoÅ›ci", + "attributes.deleteValueFailed": "Nie można usunąć wartoÅ›ci", + "attributes.csvNeedHeader": "CSV musi zawierać nagłówek i co najmniej jeden wiersz", + "attributes.csvNeedColumns": "CSV musi zawierać kolumny \"category_id\" i \"attribute_key\"", "attributes.type.string": "Tekst", - "attributes.type.stringHint": "Tekst wolny — nazwy, modele, krótkie notatki", + "attributes.type.stringHint": "Tekst wolny — nazwy, modele, krótkie notatki", "attributes.type.number": "Liczba", - "attributes.type.numberHint": "Wartość liczbowa; dodaj jednostkę, gdy to przydatne (cm, kg, W)", + "attributes.type.numberHint": "Wartość liczbowa; dodaj jednostkÄ™, gdy to przydatne (cm, kg, W)", "attributes.type.boolean": "Tak / Nie", - "attributes.type.booleanHint": "Prawda lub fałsz — np. ma GPS, ładowanie bezprzewodowe", + "attributes.type.booleanHint": "Prawda lub faÅ‚sz — np. ma GPS, Å‚adowanie bezprzewodowe", "attributes.type.date": "Data", - "attributes.type.dateHint": "Data kalendarzowa (premiera, koniec gwarancji, …)", + "attributes.type.dateHint": "Data kalendarzowa (premiera, koniec gwarancji, …)", "attributes.type.list": "Lista rozwijana", - "attributes.type.listHint": "Wybierz dokładnie jedną opcję z zdefiniowanej listy", - "attributes.type.multiselect": "Wybór wielokrotny", - "attributes.type.multiselectHint": "Wybierz jedną lub więcej opcji z listy", + "attributes.type.listHint": "Wybierz dokÅ‚adnie jednÄ… opcjÄ™ z zdefiniowanej listy", + "attributes.type.multiselect": "Wybór wielokrotny", + "attributes.type.multiselectHint": "Wybierz jednÄ… lub wiÄ™cej opcji z listy", "attributes.color": "Kolor", "categories.title": "Kategorie", - "categories.description": "Organizuj hierarchię katalogu. Edytuj kategorię, aby otworzyć formuły tytułu/opisu i prompty AI.", - "categories.loadFailed": "Nie udało się wczytać kategorii", - "categories.add": "Dodaj kategorię", - "categories.edit": "Edytuj kategorię", - "categories.delete": "Usuń kategorię", - "categories.deleteConfirm": "Czy na pewno chcesz usunąć tę kategorię? Tej operacji nie można cofnąć.", + "categories.description": "Organizuj hierarchiÄ™ katalogu. Edytuj kategoriÄ™, aby otworzyć formuÅ‚y tytuÅ‚u/opisu i prompty AI.", + "categories.loadFailed": "Nie udaÅ‚o siÄ™ wczytać kategorii", + "categories.add": "Dodaj kategoriÄ™", + "categories.edit": "Edytuj kategoriÄ™", + "categories.delete": "UsuÅ„ kategoriÄ™", + "categories.deleteConfirm": "Czy na pewno chcesz usunąć tÄ™ kategoriÄ™? Tej operacji nie można cofnąć.", "categories.name": "Nazwa kategorii", "categories.namePlaceholder": "Nazwa kategorii", "categories.descriptionPlaceholder": "Opcjonalny opis kategorii", "categories.uniqueIdPlaceholder": "Opcjonalny unikalny identyfikator", "categories.searchPlaceholder": "Szukaj po nazwie lub ID...", "categories.created": "Utworzono {name}.", - "categories.updated": "Kategoria została pomyślnie zaktualizowana.", - "categories.deleted": "Kategoria została pomyślnie usunięta.", + "categories.updated": "Kategoria zostaÅ‚a pomyÅ›lnie zaktualizowana.", + "categories.deleted": "Kategoria zostaÅ‚a pomyÅ›lnie usuniÄ™ta.", "categories.notFound": "Nie znaleziono kategorii.", - "categories.loadCategoryFailed": "Nie udało się wczytać kategorii", + "categories.loadCategoryFailed": "Nie udaÅ‚o siÄ™ wczytać kategorii", "categories.noCategoriesYet": "Brak kategorii", - "categories.noMatch": "Żadna kategoria nie pasuje do „{query}”. Wyczyść wyszukiwanie lub spróbuj innego hasła.", - "categories.emptyHint": "Dodaj kategorię lub zaimportuj CSV, aby zbudować drzewo.", - "categories.promptCountOne": "{count} kategoria ma prompt generowania AI. Otwórz menu ⋮ → Edytuj prompt AI lub edytuj kategorię i wybierz Edytuj prompt AI.", - "categories.promptCountMany": "{count} kategorie ma prompt generowania AI. Otwórz menu ⋮ → Edytuj prompt AI lub edytuj kategorię i wybierz Edytuj prompt AI.", + "categories.noMatch": "Å»adna kategoria nie pasuje do „{query}”. Wyczyść wyszukiwanie lub spróbuj innego hasÅ‚a.", + "categories.emptyHint": "Dodaj kategoriÄ™ lub zaimportuj CSV, aby zbudować drzewo.", + "categories.promptCountOne": "{count} kategoria ma prompt generowania AI. Otwórz menu â‹® → Edytuj prompt AI lub edytuj kategoriÄ™ i wybierz Edytuj prompt AI.", + "categories.promptCountMany": "{count} kategorie ma prompt generowania AI. Otwórz menu â‹® → Edytuj prompt AI lub edytuj kategoriÄ™ i wybierz Edytuj prompt AI.", "categories.actions": "Akcje kategorii", "categories.chooseCsv": "Wybierz CSV", - "categories.createSingleOrImport": "Utwórz jedną kategorię lub zaimportuj wiele z CSV.", - "categories.createSingle": "Utwórz jedną kategorię.", + "categories.createSingleOrImport": "Utwórz jednÄ… kategoriÄ™ lub zaimportuj wiele z CSV.", + "categories.createSingle": "Utwórz jednÄ… kategoriÄ™.", "categories.missingNameColumn": "Brak wymaganej kolumny 'name'", "categories.missingUniqueIdColumn": "Brak wymaganej kolumny 'unique_id'", - "categories.nameAndIdRequired": "Nazwa i unikalne ID są wymagane.", - "categories.csvNeedRows": "Plik musi zawierać wiersz nagłówka i co najmniej jeden wiersz danych", - "categories.titleFormula": "Formuła tytułu", - "categories.descriptionFormula": "Formuła opisu", - "categories.setTitleFormula": "Ustaw formułę tytułu", - "categories.editTitleFormula": "Edytuj formułę tytułu", - "categories.setDescriptionFormula": "Ustaw formułę opisu", - "categories.editDescriptionFormula": "Edytuj formułę opisu", + "categories.nameAndIdRequired": "Nazwa i unikalne ID sÄ… wymagane.", + "categories.csvNeedRows": "Plik musi zawierać wiersz nagłówka i co najmniej jeden wiersz danych", + "categories.titleFormula": "FormuÅ‚a tytuÅ‚u", + "categories.descriptionFormula": "FormuÅ‚a opisu", + "categories.setTitleFormula": "Ustaw formułę tytuÅ‚u", + "categories.editTitleFormula": "Edytuj formułę tytuÅ‚u", + "categories.setDescriptionFormula": "Ustaw formułę opisu", + "categories.editDescriptionFormula": "Edytuj formułę opisu", "categories.setAiPrompt": "Ustaw prompt AI", "categories.editAiPrompt": "Edytuj prompt AI", "categories.editAiPromptShort": "Edytuj prompt AI", "categories.aiPromptSet": "Ustawiono prompt generowania AI", "categories.aiPromptTitle": "Prompt AI kategorii", - "categories.aiPromptDescription": "Szablon generowania per kategorię używany przy wzbogacaniu produktów w tej kategorii.", + "categories.aiPromptDescription": "Szablon generowania per kategoriÄ™ używany przy wzbogacaniu produktów w tej kategorii.", "categories.aiPromptSaved": "Prompt AI zapisany.", - "categories.aiPromptCleared": "Wyczyszczono prompt AI (zastosuje się domyślny firmy).", - "categories.aiPromptSaveFailed": "Nie udało się zapisać promptu", - "categories.aiPromptAssignFailed": "Nie udało się przypisać promptu", + "categories.aiPromptCleared": "Wyczyszczono prompt AI (zastosuje siÄ™ domyÅ›lny firmy).", + "categories.aiPromptSaveFailed": "Nie udaÅ‚o siÄ™ zapisać promptu", + "categories.aiPromptAssignFailed": "Nie udaÅ‚o siÄ™ przypisać promptu", "categories.assignAiPrompt": "Przypisz prompt AI", "categories.assignAiPromptHelp": "Skopiuj ten prompt generowania AI do innych kategorii.", - "categories.loadingPrompt": "Ładowanie promptu…", - "categories.brandVoice": "Głos marki", + "categories.loadingPrompt": "Ładowanie promptu…", + "categories.brandVoice": "GÅ‚os marki", "categories.productName": "Nazwa produktu", "categories.gtin": "GTIN", - "categories.backToCategories": "Wróć do kategorii", - "categories.cancelReturn": "Anuluj i wróć do kategorii", - "categories.assignFormula": "Przypisz formułę", - "categories.assignFormulaOther": "Przypisz formułę do innych kategorii", - "categories.assignTitleFormula": "Przypisz formułę tytułu", - "categories.assignDescriptionFormula": "Przypisz formułę opisu", - "categories.assignSelectHelp": "Wybierz kategorie, do których zastosować ten szablon.", - "categories.assignTitleHelp": "Wybierz kategorie dla tego szablonu formuły tytułu.", - "categories.assignDescriptionHelp": "Wybierz kategorie dla tego szablonu formuły opisu.", - "categories.searchCategories": "Szukaj kategorii…", - "categories.matching": " pasujące", - "categories.titleFormulaHelp": "Buduj tytuły produktów ze zmiennych i stałego tekstu dla tej kategorii.", - "categories.descriptionFormulaHelp": "Zdefiniuj tekst meta SEO i sekcje treści, które AI ma wygenerować dla tej kategorii.", - "categories.loadingFormula": "Ładowanie formuły…", - "categories.titleFormulaSaved": "Zapisano formułę tytułu", - "categories.titleFormulaRemoved": "Usunięto formułę tytułu", - "categories.titleFormulaSaveFailed": "Nie udało się zapisać formuły tytułu", - "categories.titleFormulaAssignFailed": "Nie udało się przypisać formuły tytułu", - "categories.descriptionFormulaRemoved": "Usunięto formułę opisu", - "categories.descriptionFormulaSaved": "Formuła opisu została pomyślnie zapisana", - "categories.descriptionFormulaSavedWithExports": "Formuła opisu została pomyślnie zapisana i zsynchronizowano {count} ID eksportu", - "categories.descriptionFormulaSaveFailed": "Nie udało się zapisać formuły opisu", - "categories.descriptionFormulaAssignFailed": "Nie udało się przypisać formuły opisu", - "categories.seoTitlePlaceholder": "Powiedz AI, jak napisać tytuł SEO…", - "categories.seoDescriptionPlaceholder": "Powiedz AI, jak napisać opis SEO…", - "categories.sectionPromptPlaceholder": "Co AI ma napisać w tej sekcji?", + "categories.backToCategories": "Wróć do kategorii", + "categories.cancelReturn": "Anuluj i wróć do kategorii", + "categories.assignFormula": "Przypisz formułę", + "categories.assignFormulaOther": "Przypisz formułę do innych kategorii", + "categories.assignTitleFormula": "Przypisz formułę tytuÅ‚u", + "categories.assignDescriptionFormula": "Przypisz formułę opisu", + "categories.assignSelectHelp": "Wybierz kategorie, do których zastosować ten szablon.", + "categories.assignTitleHelp": "Wybierz kategorie dla tego szablonu formuÅ‚y tytuÅ‚u.", + "categories.assignDescriptionHelp": "Wybierz kategorie dla tego szablonu formuÅ‚y opisu.", + "categories.searchCategories": "Szukaj kategorii…", + "categories.matching": " pasujÄ…ce", + "categories.titleFormulaHelp": "Buduj tytuÅ‚y produktów ze zmiennych i staÅ‚ego tekstu dla tej kategorii.", + "categories.descriptionFormulaHelp": "Zdefiniuj tekst meta SEO i sekcje treÅ›ci, które AI ma wygenerować dla tej kategorii.", + "categories.loadingFormula": "Ładowanie formuÅ‚y…", + "categories.titleFormulaSaved": "Zapisano formułę tytuÅ‚u", + "categories.titleFormulaRemoved": "UsuniÄ™to formułę tytuÅ‚u", + "categories.titleFormulaSaveFailed": "Nie udaÅ‚o siÄ™ zapisać formuÅ‚y tytuÅ‚u", + "categories.titleFormulaAssignFailed": "Nie udaÅ‚o siÄ™ przypisać formuÅ‚y tytuÅ‚u", + "categories.descriptionFormulaRemoved": "UsuniÄ™to formułę opisu", + "categories.descriptionFormulaSaved": "FormuÅ‚a opisu zostaÅ‚a pomyÅ›lnie zapisana", + "categories.descriptionFormulaSavedWithExports": "FormuÅ‚a opisu zostaÅ‚a pomyÅ›lnie zapisana i zsynchronizowano {count} ID eksportu", + "categories.descriptionFormulaSaveFailed": "Nie udaÅ‚o siÄ™ zapisać formuÅ‚y opisu", + "categories.descriptionFormulaAssignFailed": "Nie udaÅ‚o siÄ™ przypisać formuÅ‚y opisu", + "categories.seoTitlePlaceholder": "Powiedz AI, jak napisać tytuÅ‚ SEO…", + "categories.seoDescriptionPlaceholder": "Powiedz AI, jak napisać opis SEO…", + "categories.sectionPromptPlaceholder": "Co AI ma napisać w tej sekcji?", "categories.sectionKeyPlaceholder": "np. short_description (litery, cyfry, _)", - "categories.formulaElementTypes": "Typy elementów formuły", - "categories.formulaElements": "Elementy formuły", - "categories.elementSeparator": "Separator elementów", - "categories.elementSeparatorHint": "Spacja, myślnik itd.", - "categories.dragToReorder": "Przeciągnij, aby zmienić kolejność", - "categories.addCustomVariable": "Dodaj zmienną niestandardową", - "categories.editCustomVariable": "Edytuj zmienną niestandardową", - "categories.customVariableHelp": "Zdefiniuj wielokrotną zmienną do formuł tytułu.", - "categories.manageVariables": "Zarządzaj zmiennymi", - "categories.manageVariablesHelp": "Przeglądaj, edytuj i dodawaj zmienne do formuł tytułu.", - "categories.searchVariables": "Szukaj zmiennych…", - "categories.variableAdded": "Dodano zmienną", - "categories.variableUpdated": "Zaktualizowano zmienną", - "categories.variableDeleted": "Usunięto zmienną", - "categories.variableDeleteFailed": "Nie udało się usunąć zmiennej", + "categories.formulaElementTypes": "Typy elementów formuÅ‚y", + "categories.formulaElements": "Elementy formuÅ‚y", + "categories.elementSeparator": "Separator elementów", + "categories.elementSeparatorHint": "Spacja, myÅ›lnik itd.", + "categories.dragToReorder": "PrzeciÄ…gnij, aby zmienić kolejność", + "categories.addCustomVariable": "Dodaj zmiennÄ… niestandardowÄ…", + "categories.editCustomVariable": "Edytuj zmiennÄ… niestandardowÄ…", + "categories.customVariableHelp": "Zdefiniuj wielokrotnÄ… zmiennÄ… do formuÅ‚ tytuÅ‚u.", + "categories.manageVariables": "ZarzÄ…dzaj zmiennymi", + "categories.manageVariablesHelp": "PrzeglÄ…daj, edytuj i dodawaj zmienne do formuÅ‚ tytuÅ‚u.", + "categories.searchVariables": "Szukaj zmiennych…", + "categories.variableAdded": "Dodano zmiennÄ…", + "categories.variableUpdated": "Zaktualizowano zmiennÄ…", + "categories.variableDeleted": "UsuniÄ™to zmiennÄ…", + "categories.variableDeleteFailed": "Nie udaÅ‚o siÄ™ usunąć zmiennej", "categories.variableNameRequired": "Nazwa zmiennej jest wymagana", - "categories.displayNameRequired": "Nazwa wyświetlana jest wymagana", - "categories.variableNamePattern": "Nazwa może zawierać tylko litery, cyfry i podkreślenia", - "categories.deleteVariableConfirm": "Czy na pewno chcesz usunąć tę zmienną? Może to wpłynąć na formuły, które jej używają.", - "categories.removeElementConfirm": "Czy na pewno chcesz usunąć ten element z formuły?", + "categories.displayNameRequired": "Nazwa wyÅ›wietlana jest wymagana", + "categories.variableNamePattern": "Nazwa może zawierać tylko litery, cyfry i podkreÅ›lenia", + "categories.deleteVariableConfirm": "Czy na pewno chcesz usunąć tÄ™ zmiennÄ…? Może to wpÅ‚ynąć na formuÅ‚y, które jej używajÄ….", + "categories.removeElementConfirm": "Czy na pewno chcesz usunąć ten element z formuÅ‚y?", "categories.addTextElement": "Dodaj element tekstowy", - "categories.addTextElementHelp": "Dodaj statyczny element tekstowy do formuły.", + "categories.addTextElementHelp": "Dodaj statyczny element tekstowy do formuÅ‚y.", "categories.editTextElement": "Edytuj element tekstowy", "categories.editTextElementHelp": "Edytuj element tekstowy w formule.", - "categories.staticTextPlaceholder": "Wprowadź tekst stały", - "categories.textCannotBeEmpty": "Tekst nie może być pusty", + "categories.staticTextPlaceholder": "Wprowadź tekst staÅ‚y", + "categories.textCannotBeEmpty": "Tekst nie może być pusty", "categories.exampleProductName": "Nazwa produktu", - "categories.exampleWidget": "Acme Widget Pro (przykład)", + "categories.exampleWidget": "Acme Widget Pro (przykÅ‚ad)", "fields.title": "Pola standardowe", "fields.description": "Zdefiniuj standardowe pola produktu i pogrupuj je", - "fields.loading": "Ładowanie pól standardowych…", - "fields.loadFailed": "Nie udało się wczytać pól", - "fields.loadGroupsFailed": "Nie udało się wczytać grup pól", + "fields.loading": "Ładowanie pól standardowych…", + "fields.loadFailed": "Nie udaÅ‚o siÄ™ wczytać pól", + "fields.loadGroupsFailed": "Nie udaÅ‚o siÄ™ wczytać grup pól", "fields.addField": "Dodaj nowe pole", - "fields.addGroup": "Dodaj nową grupę", - "fields.createField": "Utwórz pole", - "fields.createGroup": "Utwórz grupę", + "fields.addGroup": "Dodaj nowÄ… grupÄ™", + "fields.createField": "Utwórz pole", + "fields.createGroup": "Utwórz grupÄ™", "fields.editField": "Edytuj pole", - "fields.editGroup": "Edytuj grupę", + "fields.editGroup": "Edytuj grupÄ™", "fields.basicInfo": "Informacje podstawowe", - "fields.createFieldHelp": "Utwórz nowe pole standardowe dla danych produktu", - "fields.editFieldHelp": "Zaktualizuj szczegóły tego pola standardowego", - "fields.createGroupHelp": "Utwórz nową grupę do organizacji pól standardowych", - "fields.editGroupHelp": "Zaktualizuj szczegóły tej grupy pól", + "fields.createFieldHelp": "Utwórz nowe pole standardowe dla danych produktu", + "fields.editFieldHelp": "Zaktualizuj szczegóły tego pola standardowego", + "fields.createGroupHelp": "Utwórz nowÄ… grupÄ™ do organizacji pól standardowych", + "fields.editGroupHelp": "Zaktualizuj szczegóły tej grupy pól", "fields.dataTypeHint": "Typ danych tego pola", - "fields.defaultValueOptional": "Wartość domyślna (opcjonalnie)", - "fields.fieldDescriptionPlaceholder": "Wprowadź opis tego pola", - "fields.groupDescriptionPlaceholder": "Wprowadź opis tej grupy", - "fields.keyHint": "Tylko małe litery, cyfry i podkreślenia", - "fields.exampleTitle": "Tytuł produktu", - "fields.noFields": "Nie znaleziono pól. Kliknij \"Dodaj pole\", aby utworzyć.", - "fields.noFieldsMatch": "Żadne pole nie pasuje do wyszukiwania", - "fields.noGroups": "Nie znaleziono grup. Utwórz pierwszą grupę.", - "fields.noGroupsMatch": "Żadna grupa nie pasuje do wyszukiwania", + "fields.defaultValueOptional": "Wartość domyÅ›lna (opcjonalnie)", + "fields.fieldDescriptionPlaceholder": "Wprowadź opis tego pola", + "fields.groupDescriptionPlaceholder": "Wprowadź opis tej grupy", + "fields.keyHint": "Tylko maÅ‚e litery, cyfry i podkreÅ›lenia", + "fields.exampleTitle": "TytuÅ‚ produktu", + "fields.noFields": "Nie znaleziono pól. Kliknij \"Dodaj pole\", aby utworzyć.", + "fields.noFieldsMatch": "Å»adne pole nie pasuje do wyszukiwania", + "fields.noGroups": "Nie znaleziono grup. Utwórz pierwszÄ… grupÄ™.", + "fields.noGroupsMatch": "Å»adna grupa nie pasuje do wyszukiwania", "fields.fieldCreated": "Utworzono pole", "fields.fieldUpdated": "Zaktualizowano pole", - "fields.fieldDeleted": "Usunięto pole", - "fields.groupCreated": "Utworzono grupę", - "fields.groupUpdated": "Zaktualizowano grupę", - "fields.groupDeleted": "Usunięto grupę", - "fields.saveFieldFailed": "Nie udało się zapisać pola", - "fields.saveGroupFailed": "Nie udało się zapisać grupy", - "fields.updateFieldFailed": "Nie udało się zaktualizować pola", - "fields.updateUnitFailed": "Nie udało się zaktualizować jednostki", - "fields.deleteFieldFailed": "Nie udało się usunąć pola", - "fields.deleteGroupFailed": "Nie udało się usunąć grupy", - "fields.bulkUpdateFailed": "Masowa aktualizacja nie powiodła się", - "fields.enableRecommendedFailed": "Nie udało się włączyć zalecanych pól", - "fields.enabledRecommended": "Włączono zalecane pola ecommerce", - "fields.deleteFieldConfirm": "Tej operacji nie można cofnąć. Trwale usunie pole i usunie je z wszelkich szablonów, które go używają.", - "fields.deleteGroupConfirm": "Tej operacji nie można cofnąć. Trwale usunie grupę. Pola w tej grupie będą wymagały ponownego przypisania.", + "fields.fieldDeleted": "UsuniÄ™to pole", + "fields.groupCreated": "Utworzono grupÄ™", + "fields.groupUpdated": "Zaktualizowano grupÄ™", + "fields.groupDeleted": "UsuniÄ™to grupÄ™", + "fields.saveFieldFailed": "Nie udaÅ‚o siÄ™ zapisać pola", + "fields.saveGroupFailed": "Nie udaÅ‚o siÄ™ zapisać grupy", + "fields.updateFieldFailed": "Nie udaÅ‚o siÄ™ zaktualizować pola", + "fields.updateUnitFailed": "Nie udaÅ‚o siÄ™ zaktualizować jednostki", + "fields.deleteFieldFailed": "Nie udaÅ‚o siÄ™ usunąć pola", + "fields.deleteGroupFailed": "Nie udaÅ‚o siÄ™ usunąć grupy", + "fields.bulkUpdateFailed": "Masowa aktualizacja nie powiodÅ‚a siÄ™", + "fields.enableRecommendedFailed": "Nie udaÅ‚o siÄ™ włączyć zalecanych pól", + "fields.enabledRecommended": "Włączono zalecane pola ecommerce", + "fields.deleteFieldConfirm": "Tej operacji nie można cofnąć. Trwale usunie pole i usunie je z wszelkich szablonów, które go używajÄ….", + "fields.deleteGroupConfirm": "Tej operacji nie można cofnąć. Trwale usunie grupÄ™. Pola w tej grupie bÄ™dÄ… wymagaÅ‚y ponownego przypisania.", "fields.type.string": "Tekst", - "fields.type.stringHint": "Tekst wolny — nazwy, kody, krótkie notatki", + "fields.type.stringHint": "Tekst wolny — nazwy, kody, krótkie notatki", "fields.type.number": "Liczba", - "fields.type.numberHint": "Wartość liczbowa; dodaj jednostkę, gdy to pomocne (EUR, pcs)", + "fields.type.numberHint": "Wartość liczbowa; dodaj jednostkÄ™, gdy to pomocne (EUR, pcs)", "fields.type.boolean": "Tak / Nie", - "fields.type.booleanHint": "Prawda lub fałsz", + "fields.type.booleanHint": "Prawda lub faÅ‚sz", "fields.type.date": "Data", "fields.type.dateHint": "Data kalendarzowa", "fields.type.url": "URL", @@ -2990,70 +2991,70 @@ export const pl: MessageDict = { "fields.type.image": "Obraz", "fields.type.imageHint": "URL obrazu lub obraz galerii", "fields.type.dimension": "Wymiar", - "fields.type.dimensionHint": "Pomiar długości (szerokość, wysokość, głębokość)", + "fields.type.dimensionHint": "Pomiar dÅ‚ugoÅ›ci (szerokość, wysokość, głębokość)", "fields.type.weight": "Waga", - "fields.type.weightHint": "Masa / waga wysyłkowa", + "fields.type.weightHint": "Masa / waga wysyÅ‚kowa", "fields.type.color": "Kolor", "fields.type.colorHint": "Nazwa lub kod koloru", "fields.type.custom": "Niestandardowe", "fields.type.customHint": "Pole specjalne / swobodne", "empty.admin.knowledgeHeading": "Baza wiedzy wsparcia", - "empty.admin.translationsHeading": "Tłumaczenia", - "flash.attrs.createdLinkFailed": "Atrybut utworzony, ale przypisanie kategorii nie powiodło się.", + "empty.admin.translationsHeading": "TÅ‚umaczenia", + "flash.attrs.createdLinkFailed": "Atrybut utworzony, ale przypisanie kategorii nie powiodÅ‚o siÄ™.", "flash.attrs.created": "Utworzono atrybut.", - "flash.attrs.csvImported": "Import CSV zakończony.", + "flash.attrs.csvImported": "Import CSV zakoÅ„czony.", "flash.attrs.updated": "Zaktualizowano atrybut.", - "flash.attrs.deleted": "Usunięto atrybut.", - "flash.attrs.valueDeleted": "Usunięto wartość.", - "flash.attrs.assignedLinks": "Przypisano {count} powiązań kategoria–atrybut.", + "flash.attrs.deleted": "UsuniÄ™to atrybut.", + "flash.attrs.valueDeleted": "UsuniÄ™to wartość.", + "flash.attrs.assignedLinks": "Przypisano {count} powiÄ…zaÅ„ kategoria–atrybut.", "flash.brand.saved": "Zapisano zestaw marki.", - "flash.brand.logoType": "Logo musi być PNG, JPEG lub WebP", + "flash.brand.logoType": "Logo musi być PNG, JPEG lub WebP", "flash.brand.logoSize": "Logo przekracza limit 2 MiB", - "flash.brand.logoUploaded": "Przesłano logo.", - "flash.categories.updated": "Kategoria została pomyślnie zaktualizowana.", - "flash.categories.deleted": "Kategoria została pomyślnie usunięta.", - "flash.categories.csvImported": "Import CSV zakończony.", + "flash.brand.logoUploaded": "PrzesÅ‚ano logo.", + "flash.categories.updated": "Kategoria zostaÅ‚a pomyÅ›lnie zaktualizowana.", + "flash.categories.deleted": "Kategoria zostaÅ‚a pomyÅ›lnie usuniÄ™ta.", + "flash.categories.csvImported": "Import CSV zakoÅ„czony.", "flash.products.csvImported": "Product CSV import finished.", - "flash.categories.descFormulaAssigned": "Formułę opisu przypisano do {count} kategorii", + "flash.categories.descFormulaAssigned": "Formułę opisu przypisano do {count} kategorii", "flash.categories.promptAssigned": "Przypisano prompt do {count} {noun}.", "flash.categories.promptNounOne": "kategoria", "flash.categories.promptNounMany": "kategorie", - "flash.categories.titleFormulaAssigned": "Formułę tytułu przypisano do {count} {noun}", - "flash.categories.variableDeleted": "Usunięto zmienną", + "flash.categories.titleFormulaAssigned": "Formułę tytuÅ‚u przypisano do {count} {noun}", + "flash.categories.variableDeleted": "UsuniÄ™to zmiennÄ…", "flash.export.updated": "Zaktualizowano feed eksportu.", "flash.export.created": "Utworzono feed eksportu.", - "flash.export.urlCopied": "Skopiowano publiczny URL feedu {format}. Wklej go do dowolnego systemu pobierającego feedy produktów.", - "flash.export.copyFailed": "Nie udało się skopiować URL do schowka", - "flash.export.refreshed": "Odświeżono feed.", - "flash.export.refreshedWithCount": "Feed odświeżony ({count} produktów).", - "flash.export.deleted": "Usunięto feed eksportu.", + "flash.export.urlCopied": "Skopiowano publiczny URL feedu {format}. Wklej go do dowolnego systemu pobierajÄ…cego feedy produktów.", + "flash.export.copyFailed": "Nie udaÅ‚o siÄ™ skopiować URL do schowka", + "flash.export.refreshed": "OdÅ›wieżono feed.", + "flash.export.refreshedWithCount": "Feed odÅ›wieżony ({count} produktów).", + "flash.export.deleted": "UsuniÄ™to feed eksportu.", "flash.export.tokenRotated": "Token publicznego URL feedu zostal obrocony. Zaktualizuj systemy uzywajace starego URL.", "common.edit": "Edytuj", "common.previous": "Wstecz", "common.next": "Dalej", - "common.saving": "Zapisywanie…", - "common.deleting": "Usuwanie…", - "common.adding": "Dodawanie…", - "common.processing": "Przetwarzanie…", - "common.upload": "Prześlij", - "common.expand": "Rozwiń", - "common.collapse": "Zwiń", + "common.saving": "Zapisywanie…", + "common.deleting": "Usuwanie…", + "common.adding": "Dodawanie…", + "common.processing": "Przetwarzanie…", + "common.upload": "PrzeÅ›lij", + "common.expand": "RozwiÅ„", + "common.collapse": "ZwiÅ„", "common.optional": "Opcjonalne", - "common.enabled": "Włączone", - "common.on": "Włączone", - "common.off": "Wyłączone", + "common.enabled": "Włączone", + "common.on": "Włączone", + "common.off": "Wyłączone", "common.system": "Warstwa systemu", "common.type": "Typ", "common.unit": "Jednostka", "common.group": "Grupa", "common.search": "Szukaj", - "common.openMenu": "Otwórz menu", + "common.openMenu": "Otwórz menu", "common.areYouSure": "Czy na pewno?", - "common.selectGroup": "Wybierz grupę", + "common.selectGroup": "Wybierz grupÄ™", "attributes.addAttribute": "Dodaj atrybut", - "attributes.searchPlaceholder": "Szukaj atrybutów…", - "attributes.searchAria": "Szukaj atrybutów (naciśnij Enter, aby wyszukać)", - "attributes.filterCategoryAria": "Filtruj według kategorii", + "attributes.searchPlaceholder": "Szukaj atrybutów…", + "attributes.searchAria": "Szukaj atrybutów (naciÅ›nij Enter, aby wyszukać)", + "attributes.filterCategoryAria": "Filtruj wedÅ‚ug kategorii", "attributes.allCategories": "Wszystkie kategorie", "attributes.col.name": "Nazwa", "attributes.col.key": "Klucz atrybutu", @@ -3062,205 +3063,205 @@ export const pl: MessageDict = { "attributes.col.categories": "Kategorie", "attributes.col.updated": "Ostatnia aktualizacja", "attributes.col.actions": "Akcje", - "attributes.emptyTitle": "Nie znaleziono atrybutów", - "attributes.emptyFiltered": "Spróbuj wyczyścić wyszukiwanie lub filtr kategorii.", - "attributes.emptyHint": "Dodaj atrybut lub zaimportuj CSV, aby zacząć.", - "attributes.noValues": "Brak wartości", + "attributes.emptyTitle": "Nie znaleziono atrybutów", + "attributes.emptyFiltered": "Spróbuj wyczyÅ›cić wyszukiwanie lub filtr kategorii.", + "attributes.emptyHint": "Dodaj atrybut lub zaimportuj CSV, aby zacząć.", + "attributes.noValues": "Brak wartoÅ›ci", "attributes.actionsAria": "Akcje atrybutu", - "attributes.editDetails": "Edytuj szczegóły", - "attributes.loadingValues": "Ładowanie wartości...", - "attributes.noValuesYetHint": "Nie dodano jeszcze wartości. Użyj \"Manage Values\", aby dodać wartości.", - "attributes.pageZero": "0 atrybutów", - "attributes.pageShowing": "Wyświetlanie {from}–{to} z {total} atrybutów", - "attributes.linkCategoryFailed": "Nie można przypisać atrybutu do wybranej kategorii.", - "attributes.createdLinkFailed": "Atrybut utworzony, ale przypisanie kategorii nie powiodło się.", - "attributes.createFailed": "Tworzenie nie powiodło się", - "attributes.importFinished": "Import CSV zakończony.", - "attributes.importFailed": "Import nie powiódł się", - "attributes.updateFailed": "Aktualizacja nie powiodła się", - "attributes.deleteFailed": "Usuwanie nie powiodło się", - "attributes.valueUpdated": "Zaktualizowano wartość.", - "attributes.valueAdded": "Dodano wartość.", - "attributes.valueSaveFailed": "Nie można zapisać wartości", - "attributes.valueDeleted": "Usunięto wartość.", - "attributes.valueDeleteFailed": "Nie można usunąć wartości", - "attributes.csvNeedRows": "CSV musi zawierać nagłówek i co najmniej jeden wiersz", + "attributes.editDetails": "Edytuj szczegóły", + "attributes.loadingValues": "Ładowanie wartoÅ›ci...", + "attributes.noValuesYetHint": "Nie dodano jeszcze wartoÅ›ci. Użyj \"Manage Values\", aby dodać wartoÅ›ci.", + "attributes.pageZero": "0 atrybutów", + "attributes.pageShowing": "WyÅ›wietlanie {from}–{to} z {total} atrybutów", + "attributes.linkCategoryFailed": "Nie można przypisać atrybutu do wybranej kategorii.", + "attributes.createdLinkFailed": "Atrybut utworzony, ale przypisanie kategorii nie powiodÅ‚o siÄ™.", + "attributes.createFailed": "Tworzenie nie powiodÅ‚o siÄ™", + "attributes.importFinished": "Import CSV zakoÅ„czony.", + "attributes.importFailed": "Import nie powiódÅ‚ siÄ™", + "attributes.updateFailed": "Aktualizacja nie powiodÅ‚a siÄ™", + "attributes.deleteFailed": "Usuwanie nie powiodÅ‚o siÄ™", + "attributes.valueUpdated": "Zaktualizowano wartość.", + "attributes.valueAdded": "Dodano wartość.", + "attributes.valueSaveFailed": "Nie można zapisać wartoÅ›ci", + "attributes.valueDeleted": "UsuniÄ™to wartość.", + "attributes.valueDeleteFailed": "Nie można usunąć wartoÅ›ci", + "attributes.csvNeedRows": "CSV musi zawierać nagłówek i co najmniej jeden wiersz", "attributes.rowUnknown": "Wiersz {row}: nieznana kategoria lub atrybut", "attributes.rowLinkFailed": "Wiersz {row}: {detail}", - "attributes.linkFailedShort": "błąd powiązania", - "attributes.assignedLinks": "Przypisano {count} powiązań kategoria–atrybut.", - "attributes.rowsFailed": "{count} wiersz(y) nie powiodło się.", + "attributes.linkFailedShort": "błąd powiÄ…zania", + "attributes.assignedLinks": "Przypisano {count} powiÄ…zaÅ„ kategoria–atrybut.", + "attributes.rowsFailed": "{count} wiersz(y) nie powiodÅ‚o siÄ™.", "attributes.addTitle": "Dodaj nowy atrybut", - "attributes.addDesc": "Utwórz nową definicję atrybutu. Możesz przypisać ją do kategorii podczas tworzenia.", + "attributes.addDesc": "Utwórz nowÄ… definicjÄ™ atrybutu. Możesz przypisać jÄ… do kategorii podczas tworzenia.", "attributes.tab.single": "Pojedynczy", "attributes.tab.bulk": "Import zbiorczy", "attributes.field.key": "Klucz atrybutu", "attributes.field.keyPlaceholder": "atrybut-key", - "attributes.field.displayName": "Nazwa wyświetlana", - "attributes.field.displayNamePlaceholder": "Nazwa wyświetlana atrybutu", + "attributes.field.displayName": "Nazwa wyÅ›wietlana", + "attributes.field.displayNamePlaceholder": "Nazwa wyÅ›wietlana atrybutu", "attributes.field.type": "Typ", - "attributes.field.typeDefaultHint": "Wybierz, jak wartości są wprowadzane dla tego atrybutu.", + "attributes.field.typeDefaultHint": "Wybierz, jak wartoÅ›ci sÄ… wprowadzane dla tego atrybutu.", "attributes.field.category": "Kategoria", - "attributes.field.categoryPlaceholder": "Wybierz kategorię…", - "attributes.field.categoryHint": "Wybierz kategorię, do której należy ten atrybut. Atrybuty powinny być przypisane do kategorii.", + "attributes.field.categoryPlaceholder": "Wybierz kategorię…", + "attributes.field.categoryHint": "Wybierz kategoriÄ™, do której należy ten atrybut. Atrybuty powinny być przypisane do kategorii.", "attributes.field.unitOptional": "Jednostka (opcjonalnie)", "attributes.field.unitPlaceholder": "np. cm, kg itd.", - "attributes.field.exampleOptional": "Przykład (opcjonalnie)", + "attributes.field.exampleOptional": "PrzykÅ‚ad (opcjonalnie)", "attributes.field.examplePlaceholder": "np. 100x200", - "attributes.createAttribute": "Utwórz atrybut", + "attributes.createAttribute": "Utwórz atrybut", "attributes.bulk.fileLabel": "Plik CSV lub TSV", "attributes.bulk.downloadCsv": "Pobierz szablon CSV", "attributes.bulk.downloadTsv": "Pobierz szablon TSV", - "attributes.bulk.uploadHint": "Prześlij plik CSV lub TSV z następującymi kolumnami:", + "attributes.bulk.uploadHint": "PrzeÅ›lij plik CSV lub TSV z nastÄ™pujÄ…cymi kolumnami:", "attributes.bulk.col.key": "Unikalny identyfikator (wymagany)", - "attributes.bulk.col.name": "Nazwa wyświetlana (wymagana)", + "attributes.bulk.col.name": "Nazwa wyÅ›wietlana (wymagana)", "attributes.bulk.col.valueType": "string (Tekst), number, boolean (Tak/Nie), date, list (Lista rozwijana), multiselect", "attributes.bulk.col.categoryId": "Unikalne ID kategorii", "attributes.bulk.col.unitExample": "opcjonalne", - "attributes.bulk.col.parentKey": "Klucz nadrzędny dla wartości listy", + "attributes.bulk.col.parentKey": "Klucz nadrzÄ™dny dla wartoÅ›ci listy", "attributes.editTitle": "Edytuj atrybut", - "attributes.editDesc": "Zaktualizuj szczegóły atrybutu \"{name}\"", + "attributes.editDesc": "Zaktualizuj szczegóły atrybutu \"{name}\"", "attributes.field.keyHint": "Unikalny identyfikator tego atrybutu", - "attributes.field.displayNameHint": "Nazwa, która będzie wyświetlana użytkownikom", - "attributes.deleteTitle": "Usuń atrybut", - "attributes.deleteDesc": "Czy na pewno chcesz usunąć \"{name}\"? Tej czynności nie można cofnąć.", - "attributes.deleteWarningValues": "Ostrzeżenie: spowoduje to także usunięcie wszystkich wartości powiązanych z tym atrybutem.", - "attributes.manageTitleNamed": "Zarządzaj wartościami dla {name}", - "attributes.manageTitle": "Zarządzaj wartościami", - "attributes.manageDesc": "Dodawaj, edytuj lub usuwaj wartości dla tego atrybutu listy.", - "attributes.valueKey": "Klucz wartości", - "attributes.valueKeyHint": "Unikalny identyfikator tej wartości", - "attributes.displayValue": "Wartość wyświetlana", - "attributes.displayValuePlaceholder": "Wartość do wyświetlenia", - "attributes.displayValueHint": "Nazwa wyświetlana, która będzie pokazywana dla tej wartości", - "attributes.updateValue": "Aktualizuj wartość", - "attributes.noValuesYet": "Brak wartości.", + "attributes.field.displayNameHint": "Nazwa, która bÄ™dzie wyÅ›wietlana użytkownikom", + "attributes.deleteTitle": "UsuÅ„ atrybut", + "attributes.deleteDesc": "Czy na pewno chcesz usunąć \"{name}\"? Tej czynnoÅ›ci nie można cofnąć.", + "attributes.deleteWarningValues": "Ostrzeżenie: spowoduje to także usuniÄ™cie wszystkich wartoÅ›ci powiÄ…zanych z tym atrybutem.", + "attributes.manageTitleNamed": "ZarzÄ…dzaj wartoÅ›ciami dla {name}", + "attributes.manageTitle": "ZarzÄ…dzaj wartoÅ›ciami", + "attributes.manageDesc": "Dodawaj, edytuj lub usuwaj wartoÅ›ci dla tego atrybutu listy.", + "attributes.valueKey": "Klucz wartoÅ›ci", + "attributes.valueKeyHint": "Unikalny identyfikator tej wartoÅ›ci", + "attributes.displayValue": "Wartość wyÅ›wietlana", + "attributes.displayValuePlaceholder": "Wartość do wyÅ›wietlenia", + "attributes.displayValueHint": "Nazwa wyÅ›wietlana, która bÄ™dzie pokazywana dla tej wartoÅ›ci", + "attributes.updateValue": "Aktualizuj wartość", + "attributes.noValuesYet": "Brak wartoÅ›ci.", "attributes.assignTitle": "Przypisz atrybuty do kategorii", - "attributes.assignDesc": "Prześlij CSV mapujący unikalne ID kategorii na klucze atrybutów.", + "attributes.assignDesc": "PrzeÅ›lij CSV mapujÄ…cy unikalne ID kategorii na klucze atrybutów.", "attributes.downloadTemplate": "Pobierz szablon", "attributes.csvFile": "Plik CSV", - "attributes.assignSuccess": "Przypisania zastosowano pomyślnie.", - "attributes.assigning": "Przypisywanie…", - "attributes.uploadAndAssign": "Prześlij i przypisz", + "attributes.assignSuccess": "Przypisania zastosowano pomyÅ›lnie.", + "attributes.assigning": "Przypisywanie…", + "attributes.uploadAndAssign": "PrzeÅ›lij i przypisz", "attributes.type.string.label": "Tekst", - "attributes.type.string.hint": "Tekst wolny — nazwy, modele, krótkie notatki", + "attributes.type.string.hint": "Tekst wolny — nazwy, modele, krótkie notatki", "attributes.type.number.label": "Liczba", - "attributes.type.number.hint": "Wartość liczbowa; dodaj jednostkę, gdy to przydatne (cm, kg, W)", + "attributes.type.number.hint": "Wartość liczbowa; dodaj jednostkÄ™, gdy to przydatne (cm, kg, W)", "attributes.type.boolean.label": "Tak / Nie", - "attributes.type.boolean.hint": "Prawda lub fałsz — np. ma GPS, ładowanie bezprzewodowe", + "attributes.type.boolean.hint": "Prawda lub faÅ‚sz — np. ma GPS, Å‚adowanie bezprzewodowe", "attributes.type.date.label": "Data", - "attributes.type.date.hint": "Data kalendarzowa (premiera, koniec gwarancji, …)", + "attributes.type.date.hint": "Data kalendarzowa (premiera, koniec gwarancji, …)", "attributes.type.list.label": "Lista rozwijana", - "attributes.type.list.hint": "Wybierz dokładnie jedną opcję z zdefiniowanej listy", - "attributes.type.multiselect.label": "Wybór wielokrotny", - "attributes.type.multiselect.hint": "Wybierz jedną lub więcej opcji z listy", + "attributes.type.list.hint": "Wybierz dokÅ‚adnie jednÄ… opcjÄ™ z zdefiniowanej listy", + "attributes.type.multiselect.label": "Wybór wielokrotny", + "attributes.type.multiselect.hint": "Wybierz jednÄ… lub wiÄ™cej opcji z listy", "standardFields.title": "Pola standardowe", "standardFields.description": "Zdefiniuj standardowe pola produktu i pogrupuj je", - "standardFields.apiUnavailable": "API pól standardowych jest niedostępna. Zmian nie można zapisać.", - "standardFields.apiUnreachable": "API pól standardowych jest teraz niedostępne. Tworzenie/edycja pozostaje wyłączone, dopóki /api/standard-fields i /api/field-groups nie odpowiedzą.", - "standardFields.loading": "Ładowanie pól standardowych…", + "standardFields.apiUnavailable": "API pól standardowych jest niedostÄ™pna. Zmian nie można zapisać.", + "standardFields.apiUnreachable": "API pól standardowych jest teraz niedostÄ™pne. Tworzenie/edycja pozostaje wyłączone, dopóki /api/standard-fields i /api/field-groups nie odpowiedzÄ….", + "standardFields.loading": "Ładowanie pól standardowych…", "standardFields.tab.fields": "Pola", "standardFields.tab.groups": "Grupy", "standardFields.heading": "Pola standardowe", - "standardFields.headingHint": "Włącz pola do mapowania i przetwarzania — jeden przełącznik na wiersz.", - "standardFields.enableRecommended": "Włącz zalecane", - "standardFields.enableSelected": "Włącz zaznaczone ({count})", - "standardFields.disableSelected": "Wyłącz zaznaczone", + "standardFields.headingHint": "Włącz pola do mapowania i przetwarzania — jeden przełącznik na wiersz.", + "standardFields.enableRecommended": "Włącz zalecane", + "standardFields.enableSelected": "Włącz zaznaczone ({count})", + "standardFields.disableSelected": "Wyłącz zaznaczone", "standardFields.addField": "Dodaj pole", - "standardFields.searchFields": "Szukaj pól...", - "standardFields.col.enabled": "Włączone", + "standardFields.searchFields": "Szukaj pól...", + "standardFields.col.enabled": "Włączone", "standardFields.col.name": "Nazwa", "standardFields.col.key": "Klucz", "standardFields.col.type": "Typ", "standardFields.col.unit": "Jednostka", "standardFields.col.group": "Grupa", "standardFields.col.status": "Stan", - "standardFields.emptySearch": "Żadne pole nie pasuje do wyszukiwania", - "standardFields.emptyHint": "Nie znaleziono pól. Kliknij \"Dodaj pole\", aby utworzyć.", + "standardFields.emptySearch": "Å»adne pole nie pasuje do wyszukiwania", + "standardFields.emptyHint": "Nie znaleziono pól. Kliknij \"Dodaj pole\", aby utworzyć.", "standardFields.selectFieldAria": "Wybierz {name}", - "standardFields.enableFieldAria": "Włącz {name}", - "standardFields.systemFieldTitle": "Pole systemowe — nie można usunąć", - "standardFields.groupsHeading": "Grupy pól", - "standardFields.addGroup": "Dodaj grupę", + "standardFields.enableFieldAria": "Włącz {name}", + "standardFields.systemFieldTitle": "Pole systemowe — nie można usunąć", + "standardFields.groupsHeading": "Grupy pól", + "standardFields.addGroup": "Dodaj grupÄ™", "standardFields.searchGroups": "Szukaj grup...", "standardFields.col.description": "Opis", - "standardFields.col.displayOrder": "Kolejność wyświetlania", - "standardFields.emptyGroupsSearch": "Żadna grupa nie pasuje do wyszukiwania", - "standardFields.emptyGroupsHint": "Nie znaleziono grup. Utwórz pierwszą grupę.", + "standardFields.col.displayOrder": "Kolejność wyÅ›wietlania", + "standardFields.emptyGroupsSearch": "Å»adna grupa nie pasuje do wyszukiwania", + "standardFields.emptyGroupsHint": "Nie znaleziono grup. Utwórz pierwszÄ… grupÄ™.", "standardFields.unknownGroup": "Nieznana grupa", - "standardFields.loadGroupsFailed": "Nie udało się wczytać grup pól", - "standardFields.loadFieldsFailed": "Nie udało się wczytać pól", + "standardFields.loadGroupsFailed": "Nie udaÅ‚o siÄ™ wczytać grup pól", + "standardFields.loadFieldsFailed": "Nie udaÅ‚o siÄ™ wczytać pól", "standardFields.fieldUpdated": "Zaktualizowano pole", "standardFields.fieldCreated": "Utworzono pole", - "standardFields.saveFieldFailed": "Nie udało się zapisać pola", - "standardFields.enabledNamed": "Włączono {name}", - "standardFields.disabledNamed": "Wyłączono {name}", - "standardFields.updateFieldFailed": "Nie udało się zaktualizować pola", - "standardFields.updateUnitFailed": "Nie udało się zaktualizować jednostki", - "standardFields.bulkEnabled": "Włączono {count} pole/pól", - "standardFields.bulkDisabled": "Wyłączono {count} pole/pól", - "standardFields.bulkFailed": "Masowa aktualizacja nie powiodła się", - "standardFields.recommendedEnabled": "Włączono zalecane pola ecommerce", - "standardFields.recommendedFailed": "Nie udało się włączyć zalecanych pól", - "standardFields.fieldDeleted": "Usunięto pole", - "standardFields.deleteFieldFailed": "Nie udało się usunąć pola", - "standardFields.groupUpdated": "Zaktualizowano grupę", - "standardFields.groupCreated": "Utworzono grupę", - "standardFields.saveGroupFailed": "Nie udało się zapisać grupy", - "standardFields.groupDeleted": "Usunięto grupę", - "standardFields.deleteGroupFailed": "Nie udało się usunąć grupy", + "standardFields.saveFieldFailed": "Nie udaÅ‚o siÄ™ zapisać pola", + "standardFields.enabledNamed": "Włączono {name}", + "standardFields.disabledNamed": "Wyłączono {name}", + "standardFields.updateFieldFailed": "Nie udaÅ‚o siÄ™ zaktualizować pola", + "standardFields.updateUnitFailed": "Nie udaÅ‚o siÄ™ zaktualizować jednostki", + "standardFields.bulkEnabled": "Włączono {count} pole/pól", + "standardFields.bulkDisabled": "Wyłączono {count} pole/pól", + "standardFields.bulkFailed": "Masowa aktualizacja nie powiodÅ‚a siÄ™", + "standardFields.recommendedEnabled": "Włączono zalecane pola ecommerce", + "standardFields.recommendedFailed": "Nie udaÅ‚o siÄ™ włączyć zalecanych pól", + "standardFields.fieldDeleted": "UsuniÄ™to pole", + "standardFields.deleteFieldFailed": "Nie udaÅ‚o siÄ™ usunąć pola", + "standardFields.groupUpdated": "Zaktualizowano grupÄ™", + "standardFields.groupCreated": "Utworzono grupÄ™", + "standardFields.saveGroupFailed": "Nie udaÅ‚o siÄ™ zapisać grupy", + "standardFields.groupDeleted": "UsuniÄ™to grupÄ™", + "standardFields.deleteGroupFailed": "Nie udaÅ‚o siÄ™ usunąć grupy", "standardFields.editField": "Edytuj pole", "standardFields.addNewField": "Dodaj nowe pole", - "standardFields.editFieldDesc": "Zaktualizuj szczegóły tego pola standardowego", - "standardFields.addFieldDesc": "Utwórz nowe pole standardowe dla danych produktu", + "standardFields.editFieldDesc": "Zaktualizuj szczegóły tego pola standardowego", + "standardFields.addFieldDesc": "Utwórz nowe pole standardowe dla danych produktu", "standardFields.field.name": "Nazwa", - "standardFields.field.namePlaceholder": "Tytuł produktu", - "standardFields.field.nameHint": "Nazwa wyświetlana tego pola", + "standardFields.field.namePlaceholder": "TytuÅ‚ produktu", + "standardFields.field.nameHint": "Nazwa wyÅ›wietlana tego pola", "standardFields.field.key": "Klucz", "standardFields.field.keyPlaceholder": "tytul_produktu", - "standardFields.field.keyTitle": "Tylko małe litery, cyfry i podkreślenia", - "standardFields.field.keyHint": "Unikalny identyfikator (małe litery, bez spacji)", + "standardFields.field.keyTitle": "Tylko maÅ‚e litery, cyfry i podkreÅ›lenia", + "standardFields.field.keyHint": "Unikalny identyfikator (maÅ‚e litery, bez spacji)", "standardFields.field.type": "Typ", "standardFields.field.typeDefaultHint": "Typ danych tego pola", "standardFields.field.group": "Grupa", - "standardFields.field.groupHint": "Grupa, do której należy to pole", - "standardFields.field.enabled": "Włączone", - "standardFields.field.enabledHint": "Używaj tego pola w mapowaniu i przetwarzaniu", + "standardFields.field.groupHint": "Grupa, do której należy to pole", + "standardFields.field.enabled": "Włączone", + "standardFields.field.enabledHint": "Używaj tego pola w mapowaniu i przetwarzaniu", "standardFields.field.required": "Pole wymagane", - "standardFields.field.requiredHint": "Wymagane pola muszą być zmapowane w każdym feedzie, zanim produkty będą mogły się synchronizować.", + "standardFields.field.requiredHint": "Wymagane pola muszÄ… być zmapowane w każdym feedzie, zanim produkty bÄ™dÄ… mogÅ‚y siÄ™ synchronizować.", "standardFields.field.unit": "Jednostka", - "standardFields.field.unitPlaceholder": "kg, EUR, cm…", - "standardFields.field.unitHint": "Opcjonalna jednostka wyświetlana z tym polem", + "standardFields.field.unitPlaceholder": "kg, EUR, cm…", + "standardFields.field.unitHint": "Opcjonalna jednostka wyÅ›wietlana z tym polem", "standardFields.field.description": "Opis", - "standardFields.field.descriptionPlaceholder": "Wprowadź opis tego pola", - "standardFields.field.default": "Wartość domyślna", - "standardFields.field.defaultPlaceholder": "Wartość domyślna (opcjonalnie)", - "standardFields.field.defaultHint": "Wartość domyślna, gdy nie podano wartości", - "standardFields.saveUnavailable": "Zapisz (niedostępne)", + "standardFields.field.descriptionPlaceholder": "Wprowadź opis tego pola", + "standardFields.field.default": "Wartość domyÅ›lna", + "standardFields.field.defaultPlaceholder": "Wartość domyÅ›lna (opcjonalnie)", + "standardFields.field.defaultHint": "Wartość domyÅ›lna, gdy nie podano wartoÅ›ci", + "standardFields.saveUnavailable": "Zapisz (niedostÄ™pne)", "standardFields.updateField": "Aktualizuj pole", - "standardFields.createField": "Utwórz pole", - "standardFields.editGroup": "Edytuj grupę", - "standardFields.addNewGroup": "Dodaj nową grupę", - "standardFields.editGroupDesc": "Zaktualizuj szczegóły tej grupy pól", - "standardFields.addGroupDesc": "Utwórz nową grupę do organizacji pól standardowych", + "standardFields.createField": "Utwórz pole", + "standardFields.editGroup": "Edytuj grupÄ™", + "standardFields.addNewGroup": "Dodaj nowÄ… grupÄ™", + "standardFields.editGroupDesc": "Zaktualizuj szczegóły tej grupy pól", + "standardFields.addGroupDesc": "Utwórz nowÄ… grupÄ™ do organizacji pól standardowych", "standardFields.group.name": "Nazwa", "standardFields.group.namePlaceholder": "Informacje podstawowe", - "standardFields.group.nameHint": "Nazwa wyświetlana tej grupy", + "standardFields.group.nameHint": "Nazwa wyÅ›wietlana tej grupy", "standardFields.group.description": "Opis", - "standardFields.group.descriptionPlaceholder": "Wprowadź opis tej grupy", - "standardFields.group.descriptionHint": "Opcjonalny opis wyjaśniający cel tej grupy", - "standardFields.group.order": "Kolejność wyświetlania", - "standardFields.group.orderHint": "Niższe numery pojawiają się pierwsze", - "standardFields.updateGroup": "Aktualizuj grupę", - "standardFields.createGroup": "Utwórz grupę", - "standardFields.deleteFieldDesc": "Tej operacji nie można cofnąć. Trwale usunie pole i usunie je z wszelkich szablonów, które go używają.", - "standardFields.deleteGroupDesc": "Tej operacji nie można cofnąć. Trwale usunie grupę. Pola w tej grupie będą wymagały ponownego przypisania.", + "standardFields.group.descriptionPlaceholder": "Wprowadź opis tej grupy", + "standardFields.group.descriptionHint": "Opcjonalny opis wyjaÅ›niajÄ…cy cel tej grupy", + "standardFields.group.order": "Kolejność wyÅ›wietlania", + "standardFields.group.orderHint": "Niższe numery pojawiajÄ… siÄ™ pierwsze", + "standardFields.updateGroup": "Aktualizuj grupÄ™", + "standardFields.createGroup": "Utwórz grupÄ™", + "standardFields.deleteFieldDesc": "Tej operacji nie można cofnąć. Trwale usunie pole i usunie je z wszelkich szablonów, które go używajÄ….", + "standardFields.deleteGroupDesc": "Tej operacji nie można cofnąć. Trwale usunie grupÄ™. Pola w tej grupie bÄ™dÄ… wymagaÅ‚y ponownego przypisania.", "standardFields.type.string.label": "Tekst", - "standardFields.type.string.hint": "Tekst wolny — nazwy, kody, krótkie notatki", + "standardFields.type.string.hint": "Tekst wolny — nazwy, kody, krótkie notatki", "standardFields.type.number.label": "Liczba", - "standardFields.type.number.hint": "Wartość liczbowa; dodaj jednostkę, gdy to pomocne (EUR, pcs)", + "standardFields.type.number.hint": "Wartość liczbowa; dodaj jednostkÄ™, gdy to pomocne (EUR, pcs)", "standardFields.type.boolean.label": "Tak / Nie", - "standardFields.type.boolean.hint": "Prawda lub fałsz", + "standardFields.type.boolean.hint": "Prawda lub faÅ‚sz", "standardFields.type.date.label": "Data", "standardFields.type.date.hint": "Data kalendarzowa", "standardFields.type.url.label": "URL", @@ -3268,9 +3269,9 @@ export const pl: MessageDict = { "standardFields.type.image.label": "Obraz", "standardFields.type.image.hint": "URL obrazu lub obraz galerii", "standardFields.type.dimension.label": "Wymiar", - "standardFields.type.dimension.hint": "Pomiar długości (szerokość, wysokość, głębokość)", + "standardFields.type.dimension.hint": "Pomiar dÅ‚ugoÅ›ci (szerokość, wysokość, głębokość)", "standardFields.type.weight.label": "Waga", - "standardFields.type.weight.hint": "Masa / waga wysyłkowa", + "standardFields.type.weight.hint": "Masa / waga wysyÅ‚kowa", "standardFields.type.color.label": "Kolor", "standardFields.type.color.hint": "Nazwa lub kod koloru", "standardFields.type.custom.label": "Niestandardowe", @@ -3285,230 +3286,230 @@ export const pl: MessageDict = { "standardFields.fallback.purchase_price": "Cena zakupu", "standardFields.fallback.currency": "Waluta", "standardFields.fallback.image_url": "URL obrazu", - "standardFields.fallback.main_image": "Główny obraz", + "standardFields.fallback.main_image": "Główny obraz", "standardFields.fallback.additional_image_urls": "Dodatkowe obrazy", "standardFields.fallback.product_url": "URL produktu", "standardFields.fallback.official_link": "Oficjalny link", "standardFields.fallback.sku": "SKU", "standardFields.fallback.mpn": "MPN", "standardFields.fallback.category": "Kategoria", - "standardFields.fallback.availability": "Dostępność", + "standardFields.fallback.availability": "DostÄ™pność", "standardFields.fallback.stock": "Stan magazynowy", "standardFields.fallback.color": "Kolor", "standardFields.fallback.size": "Rozmiar", - "standardFields.fallback.material": "Materiał", + "standardFields.fallback.material": "MateriaÅ‚", "standardFields.fallback.warranty": "Gwarancja", - "standardFields.fallback.service": "Usługa", + "standardFields.fallback.service": "UsÅ‚uga", "standardFields.fallback.weight": "Waga", - "standardFields.fallback.net_depth": "Głębokość netto", - "standardFields.fallback.net_height": "Wysokość netto", - "standardFields.fallback.net_width": "Szerokość netto", + "standardFields.fallback.net_depth": "Głębokość netto", + "standardFields.fallback.net_height": "Wysokość netto", + "standardFields.fallback.net_width": "Szerokość netto", "standardFields.fallback.net_mass": "Masa netto", "standardFields.fallback.video_url": "URL wideo", "standardFields.fallback.eprel_id": "ID EPREL", "standardFields.fallback.specs": "Specyfikacje", "standardFields.fallback.specifications": "Specyfikacje (legacy)", - "standardFields.tip.gtin": "Global Trade Item Number — kod kreskowy/EAN/UPC identyfikujący produkt.", - "standardFields.tip.title": "Nazwa produktu dla klienta, widoczna w katalogach i kanałach.", + "standardFields.tip.gtin": "Global Trade Item Number — kod kreskowy/EAN/UPC identyfikujÄ…cy produkt.", + "standardFields.tip.title": "Nazwa produktu dla klienta, widoczna w katalogach i kanaÅ‚ach.", "standardFields.tip.brand": "Nazwa producenta lub marki (nie sprzedawcy).", - "standardFields.tip.description": "Dłuższy tekst produktu; do wzbogacania i listingów kanałów.", + "standardFields.tip.description": "DÅ‚uższy tekst produktu; do wzbogacania i listingów kanałów.", "standardFields.tip.product_model": "Nazwa/numer modelu od producenta.", - "standardFields.tip.price": "Regularna cena sprzedaży (liczbowa; waluta mapowana osobno).", - "standardFields.tip.sale_price": "Cena obniżona lub promocyjna w trakcie wyprzedaży.", - "standardFields.tip.purchase_price": "Twój koszt / cena zakupu (wewnętrzna).", - "standardFields.tip.currency": "Kod ISO waluty dla pól ceny (np. EUR, USD).", - "standardFields.tip.image_url": "URL głównego obrazu produktu.", - "standardFields.tip.main_image": "URL głównego obrazu galerii (alias image).", - "standardFields.tip.additional_image_urls": "Dodatkowe URL obrazów (oddzielone przecinkami lub powtórzone węzły).", + "standardFields.tip.price": "Regularna cena sprzedaży (liczbowa; waluta mapowana osobno).", + "standardFields.tip.sale_price": "Cena obniżona lub promocyjna w trakcie wyprzedaży.", + "standardFields.tip.purchase_price": "Twój koszt / cena zakupu (wewnÄ™trzna).", + "standardFields.tip.currency": "Kod ISO waluty dla pól ceny (np. EUR, USD).", + "standardFields.tip.image_url": "URL głównego obrazu produktu.", + "standardFields.tip.main_image": "URL głównego obrazu galerii (alias image).", + "standardFields.tip.additional_image_urls": "Dodatkowe URL obrazów (oddzielone przecinkami lub powtórzone wÄ™zÅ‚y).", "standardFields.tip.product_url": "Publiczny URL strony produktu w sklepie lub witrynie.", "standardFields.tip.official_link": "URL strony produktu producenta lub marki.", - "standardFields.tip.sku": "Stock Keeping Unit — Twój wewnętrzny kod pozycji.", - "standardFields.tip.mpn": "Manufacturer Part Number — kod części dostawcy.", - "standardFields.tip.category": "Kategoria produktu lub ścieżka taksonomii.", - "standardFields.tip.availability": "Status typu dostępny / niedostępny / przedsprzedaż.", - "standardFields.tip.stock": "Liczbowa ilość zapasów.", - "standardFields.tip.color": "Atrybut koloru dla wariantów.", - "standardFields.tip.size": "Atrybut rozmiaru dla wariantów.", - "standardFields.tip.material": "Główny materiał lub skład.", + "standardFields.tip.sku": "Stock Keeping Unit — Twój wewnÄ™trzny kod pozycji.", + "standardFields.tip.mpn": "Manufacturer Part Number — kod części dostawcy.", + "standardFields.tip.category": "Kategoria produktu lub Å›cieżka taksonomii.", + "standardFields.tip.availability": "Status typu dostÄ™pny / niedostÄ™pny / przedsprzedaż.", + "standardFields.tip.stock": "Liczbowa ilość zapasów.", + "standardFields.tip.color": "Atrybut koloru dla wariantów.", + "standardFields.tip.size": "Atrybut rozmiaru dla wariantów.", + "standardFields.tip.material": "Główny materiaÅ‚ lub skÅ‚ad.", "standardFields.tip.warranty": "Okres lub tekst gwarancji.", "standardFields.tip.service": "Notatki serwisowe lub wsparcia.", - "standardFields.tip.weight": "Waga wysyłkowa lub netto.", + "standardFields.tip.weight": "Waga wysyÅ‚kowa lub netto.", "standardFields.tip.eprel_id": "Identyfikator produktu etykiety energetycznej UE (EPREL).", "standardFields.tip.specs": "Ustrukturyzowane specyfikacje techniczne.", - "standardFields.tip.specifications": "Dziedziczone pole specs; preferuj specs, gdy oba istnieją.", + "standardFields.tip.specifications": "Dziedziczone pole specs; preferuj specs, gdy oba istniejÄ….", "export.dialog.title": "Eksportuj wybrane produkty", - "export.dialog.description": "Eksportuj {count} zaznaczonych produktów. Wybierz feed eksportu określający format i pola — jak wybór tego, co synchronizować, ale do pobrania lub partnera.", - "export.dialog.loadFailed": "Nie udało się wczytać opcji feedu eksportu. Spróbuj ponownie.", - "export.dialog.selectPlaceholder": "Wybierz feed eksportu…", - "export.dialog.help": "Zaznaczenie wybiera produkty; feed wybiera format kanału i zmapowane pola.", - "export.dialog.emptyTitle": "Brak feedów eksportu", - "export.dialog.emptyMessage": "Utwórz feed eksportu, aby wybrać format i pola, potem wróć, aby wyeksportować to zaznaczenie.", - "export.dialog.createFeedCta": "Utwórz feed eksportu", - "export.dialog.confirmAria": "Potwierdź eksport", + "export.dialog.description": "Eksportuj {count} zaznaczonych produktów. Wybierz feed eksportu okreÅ›lajÄ…cy format i pola — jak wybór tego, co synchronizować, ale do pobrania lub partnera.", + "export.dialog.loadFailed": "Nie udaÅ‚o siÄ™ wczytać opcji feedu eksportu. Spróbuj ponownie.", + "export.dialog.selectPlaceholder": "Wybierz feed eksportu…", + "export.dialog.help": "Zaznaczenie wybiera produkty; feed wybiera format kanaÅ‚u i zmapowane pola.", + "export.dialog.emptyTitle": "Brak feedów eksportu", + "export.dialog.emptyMessage": "Utwórz feed eksportu, aby wybrać format i pola, potem wróć, aby wyeksportować to zaznaczenie.", + "export.dialog.createFeedCta": "Utwórz feed eksportu", + "export.dialog.confirmAria": "Potwierdź eksport", "export.dialog.export": "Eksportuj", - "billing.title": "Użycie i rozliczenia", - "billing.loadFailed": "Nie udało się wczytać rozliczeń", - "billing.usageLoadFailed": "Nie udało się wczytać użycia", - "billing.checkoutComplete": "Checkout zakończony. Plan i kredyty odświeżą się wkrótce.", - "billing.checkoutCompletePlan": "Plan zaktualizowany. Twoje kredyty {plan} są gotowe.", - "billing.checkoutCanceled": "Checkout został anulowany. Nie wprowadzono żadnych zmian.", - "billing.portalReturned": "Powrót z portalu rozliczeń. Zarządzaj planem tutaj lub w Plans.", - "billing.comparePlans": "Porównaj plany", - "billing.managePayment": "Zarządzaj płatnością", + "billing.title": "Użycie i rozliczenia", + "billing.loadFailed": "Nie udaÅ‚o siÄ™ wczytać rozliczeÅ„", + "billing.usageLoadFailed": "Nie udaÅ‚o siÄ™ wczytać użycia", + "billing.checkoutComplete": "Checkout zakoÅ„czony. Plan i kredyty odÅ›wieżą siÄ™ wkrótce.", + "billing.checkoutCompletePlan": "Plan zaktualizowany. Twoje kredyty {plan} sÄ… gotowe.", + "billing.checkoutCanceled": "Checkout zostaÅ‚ anulowany. Nie wprowadzono żadnych zmian.", + "billing.portalReturned": "Powrót z portalu rozliczeÅ„. ZarzÄ…dzaj planem tutaj lub w Plans.", + "billing.comparePlans": "Porównaj plany", + "billing.managePayment": "ZarzÄ…dzaj pÅ‚atnoÅ›ciÄ…", "billing.addCredits": "Dodaj kredyty", - "billing.addingCredits": "Dodawanie…", + "billing.addingCredits": "Dodawanie…", "billing.addCreditsTitle": "Dodaj kredyty", - "billing.addCreditsDescription": "Tylko administrator platformy. Kredyty są od razu dostępne na tytuły AI, opisy i inne płatne kroki.", + "billing.addCreditsDescription": "Tylko administrator platformy. Kredyty sÄ… od razu dostÄ™pne na tytuÅ‚y AI, opisy i inne pÅ‚atne kroki.", "billing.creditAmount": "Kwota kredytu", - "billing.invalidCreditAmount": "Wprowadź prawidłową liczbę kredytów.", + "billing.invalidCreditAmount": "Wprowadź prawidÅ‚owÄ… liczbÄ™ kredytów.", "billing.companyNotFound": "Nie znaleziono firmy.", - "billing.creditsAdded": "Dodano {amount} kredytów.", - "billing.addCreditsFailed": "Nie udało się dodać kredytów. Może być wymagany dostęp administratora platformy.", - "billing.planApplied": "Plan zastosowany. Twoje kredyty są gotowe.", - "billing.checkoutFailed": "Checkout nie powiódł się", - "billing.portalFailed": "Nie można otworzyć portalu rozliczeń", + "billing.creditsAdded": "Dodano {amount} kredytów.", + "billing.addCreditsFailed": "Nie udaÅ‚o siÄ™ dodać kredytów. Może być wymagany dostÄ™p administratora platformy.", + "billing.planApplied": "Plan zastosowany. Twoje kredyty sÄ… gotowe.", + "billing.checkoutFailed": "Checkout nie powiódÅ‚ siÄ™", + "billing.portalFailed": "Nie można otworzyć portalu rozliczeÅ„", "billing.noPlanAssigned": "Brak przypisanego planu", "billing.unlimited": "Bez limitu", "billing.payAsYouGo": "Pay as you go", - "billing.noMonthlyAiCredits": "Brak miesięcznych kredytów AI", - "billing.header.noPlan": "Nie przypisano jeszcze planu. Wybierz plan lub poproś administratora firmy.", - "billing.header.free": "Mapuj feedy i czyść dane produktów bez kredytów AI.", - "billing.header.enterprise": "Nieograniczone produkty i pojemność AI.", - "billing.header.payg": "Pay as you go — kredyty pochodzą z portfela firmy.", - "billing.header.remaining": "{remaining} kredytów AI pozostało w tym okresie.", + "billing.noMonthlyAiCredits": "Brak miesiÄ™cznych kredytów AI", + "billing.header.noPlan": "Nie przypisano jeszcze planu. Wybierz plan lub poproÅ› administratora firmy.", + "billing.header.free": "Mapuj feedy i czyść dane produktów bez kredytów AI.", + "billing.header.enterprise": "Nieograniczone produkty i pojemność AI.", + "billing.header.payg": "Pay as you go — kredyty pochodzÄ… z portfela firmy.", + "billing.header.remaining": "{remaining} kredytów AI pozostaÅ‚o w tym okresie.", "billing.na": "n/d", "billing.range.7d": "ostatnie 7 dni", "billing.range.30d": "ostatnie 30 dni", - "billing.range.cycle": "bieżący cykl rozliczeniowy", - "billing.range.all": "cały okres", + "billing.range.cycle": "bieżący cykl rozliczeniowy", + "billing.range.all": "caÅ‚y okres", "billing.rangeOpt.7d": "Ostatnie 7 dni", "billing.rangeOpt.30d": "Ostatnie 30 dni", - "billing.rangeOpt.cycle": "Bieżący cykl", - "billing.rangeOpt.all": "Cały okres", + "billing.rangeOpt.cycle": "Bieżący cykl", + "billing.rangeOpt.all": "CaÅ‚y okres", "billing.freeBannerTitle": "Korzystasz z planu Free", - "billing.freeBannerMessage": "Ulepsz plan, aby uzyskać tytuły i opisy AI oraz wyższe limity produktów.", - "billing.outOfCreditsTitle": "Skończyły Ci się kredyty AI", - "billing.productLimitTitle": "Osiągnięto limit produktów", - "billing.outOfCreditsMessage": "Tytuły i opisy AI są wstrzymane, dopóki nie dodasz kredytów lub nie ulepszysz planu.", - "billing.productLimitMessage": "Ulepsz plan, aby zwiększyć pojemność produktów.", - "billing.lowCreditsTitle": "Kończą się kredyty", - "billing.lowCreditsMessage": "Pozostało tylko {remaining} kredytów na {plan}. Ulepsz plan przed następną dużą partią.", - "billing.currentPlan": "Bieżący plan", - "billing.periodEnds": "Okres rozliczeniowy kończy się {date}", + "billing.freeBannerMessage": "Ulepsz plan, aby uzyskać tytuÅ‚y i opisy AI oraz wyższe limity produktów.", + "billing.outOfCreditsTitle": "SkoÅ„czyÅ‚y Ci siÄ™ kredyty AI", + "billing.productLimitTitle": "OsiÄ…gniÄ™to limit produktów", + "billing.outOfCreditsMessage": "TytuÅ‚y i opisy AI sÄ… wstrzymane, dopóki nie dodasz kredytów lub nie ulepszysz planu.", + "billing.productLimitMessage": "Ulepsz plan, aby zwiÄ™kszyć pojemność produktów.", + "billing.lowCreditsTitle": "KoÅ„czÄ… siÄ™ kredyty", + "billing.lowCreditsMessage": "PozostaÅ‚o tylko {remaining} kredytów na {plan}. Ulepsz plan przed nastÄ™pnÄ… dużą partiÄ….", + "billing.currentPlan": "Bieżący plan", + "billing.periodEnds": "Okres rozliczeniowy koÅ„czy siÄ™ {date}", "billing.openEndedContract": "Umowa otwarta", - "billing.creditWallet": "Portfel kredytów", - "billing.creditsRemaining": "Pozostałe kredyty", - "billing.enterpriseCapacity": "Pojemność zarządzana Enterprise", - "billing.paygUsed": "{used} użyto · brak miesięcznej puli", - "billing.trialLeftover": "Kredyty próbne / pozostałe", + "billing.creditWallet": "Portfel kredytów", + "billing.creditsRemaining": "PozostaÅ‚e kredyty", + "billing.enterpriseCapacity": "Pojemność zarzÄ…dzana Enterprise", + "billing.paygUsed": "{used} użyto · brak miesiÄ™cznej puli", + "billing.trialLeftover": "Kredyty próbne / pozostaÅ‚e", "billing.aiLockedFree": "AI zablokowane na Free", - "billing.usedOf": "{used} użyto z {total}", - "billing.noBalanceTitle": "Brak salda kredytów", - "billing.noBalanceBody": "Kredyty Twojego planu pojawią się tutaj, gdy rozliczenia zostaną skonfigurowane dla tej przestrzeni roboczej.", - "billing.needCapacity": "Potrzebujesz większej pojemności?", + "billing.usedOf": "{used} użyto z {total}", + "billing.noBalanceTitle": "Brak salda kredytów", + "billing.noBalanceBody": "Kredyty Twojego planu pojawiÄ… siÄ™ tutaj, gdy rozliczenia zostanÄ… skonfigurowane dla tej przestrzeni roboczej.", + "billing.needCapacity": "Potrzebujesz wiÄ™kszej pojemnoÅ›ci?", "billing.selfServeUpgrade": "Samodzielne ulepszenie do Starter, Growth lub Business", "billing.viaStripe": "przez Stripe", "billing.checkoutUnavailable": "Zakupy samoobslugowe sa niedostepne, dopoki Stripe nie zostanie skonfigurowany. Skontaktuj sie ze sprzedaza, aby uzyskac plan.", "billing.upgradeToGrowth": "Ulepsz do Growth", - "billing.askAdminPlan": "Poproś administratora firmy o zmianę planu.", - "billing.usage": "Użycie", - "billing.productsProcessed": "{count} produktów przetworzonych · {range}", - "billing.updating": "Aktualizacja…", + "billing.askAdminPlan": "PoproÅ› administratora firmy o zmianÄ™ planu.", + "billing.usage": "Użycie", + "billing.productsProcessed": "{count} produktów przetworzonych · {range}", + "billing.updating": "Aktualizacja…", "billing.productsByDay": "Produkty wg dnia", "billing.chartAmber": "Bursztyn = tokeny. Zakres: {range}.", "billing.chartRange": "Zakres: {range}.", "billing.nothingToChartTitle": "Na razie nic do wykresu", - "billing.nothingToChartBody": "Dodaj produkty lub połącz feed — użycie pojawi się tutaj.", - "billing.dailyChartsHint": "Wykresy dzienne są dostępne za ostatnie 7 dni, 30 dni lub bieżący cykl rozliczeniowy.", - "billing.noNewProducts": "Brak nowych produktów w {range}", - "billing.catalogOverall": "Katalog ma łącznie {count} produktów.", + "billing.nothingToChartBody": "Dodaj produkty lub połącz feed — użycie pojawi siÄ™ tutaj.", + "billing.dailyChartsHint": "Wykresy dzienne sÄ… dostÄ™pne za ostatnie 7 dni, 30 dni lub bieżący cykl rozliczeniowy.", + "billing.noNewProducts": "Brak nowych produktów w {range}", + "billing.catalogOverall": "Katalog ma łącznie {count} produktów.", "billing.chartProducts": "Produkty", "billing.chartTokens": "Tokeny", - "billing.chartEmpty": "Brak produktów w tym okresie.", - "billing.adminStats": "{tokens} tokenów · {jobs} zadań · {input} feedów wejściowych / {export} eksportu", - "billing.whatUsesCredits": "Co zużywa kredyty", - "billing.burnsCredits": "Zużywa kredyty", - "billing.noCreditCost": "Bez kosztów kredytów", + "billing.chartEmpty": "Brak produktów w tym okresie.", + "billing.adminStats": "{tokens} tokenów · {jobs} zadaÅ„ · {input} feedów wejÅ›ciowych / {export} eksportu", + "billing.whatUsesCredits": "Co zużywa kredyty", + "billing.burnsCredits": "Zużywa kredyty", + "billing.noCreditCost": "Bez kosztów kredytów", "billing.publicPricing": "Cennik publiczny", - "billing.managePlanOnPlans": "Zarządzaj planem w Plany", - "billing.recovery.pastDueTitle": "Płatność zaległa", - "billing.recovery.pastDueAdmin": "Płatność za subskrypcję nie powiodła się. Zaktualizuj płatność w Customer Portal — dostęp pozostaje otwarty w tym okresie karencji.", - "billing.recovery.pastDueMember": "Rozliczenia wymagają uwagi. Poproś administratora firmy o aktualizację płatności w Customer Portal. Dostęp pozostaje otwarty w tym okresie karencji.", - "billing.recovery.openPortal": "Otwórz Customer Portal", - "billing.recovery.contactAdmin": "Skontaktuj się z administratorem", - "billing.recovery.goToBilling": "Przejdź do rozliczeń", + "billing.managePlanOnPlans": "ZarzÄ…dzaj planem w Plany", + "billing.recovery.pastDueTitle": "PÅ‚atność zalegÅ‚a", + "billing.recovery.pastDueAdmin": "PÅ‚atność za subskrypcjÄ™ nie powiodÅ‚a siÄ™. Zaktualizuj pÅ‚atność w Customer Portal — dostÄ™p pozostaje otwarty w tym okresie karencji.", + "billing.recovery.pastDueMember": "Rozliczenia wymagajÄ… uwagi. PoproÅ› administratora firmy o aktualizacjÄ™ pÅ‚atnoÅ›ci w Customer Portal. DostÄ™p pozostaje otwarty w tym okresie karencji.", + "billing.recovery.openPortal": "Otwórz Customer Portal", + "billing.recovery.contactAdmin": "Skontaktuj siÄ™ z administratorem", + "billing.recovery.goToBilling": "Przejdź do rozliczeÅ„", "billing.recovery.missingPlanTitle": "Brak przypisanego planu", - "billing.recovery.missingPlanMessage": "Ta firma nie ma aktywnego planu (często po pominiętej migracji). Przypisz plan przez Checkout lub skontaktuj się z pomocą — nie zakładaj pojemności Unlimited.", + "billing.recovery.missingPlanMessage": "Ta firma nie ma aktywnego planu (czÄ™sto po pominiÄ™tej migracji). Przypisz plan przez Checkout lub skontaktuj siÄ™ z pomocÄ… — nie zakÅ‚adaj pojemnoÅ›ci Unlimited.", "billing.recovery.choosePlan": "Wybierz plan", "billing.upgrade": "Ulepsz", "billing.askCompanyAdmin": "Zapytaj administratora firmy", - "billing.memberHint": "Tylko administratorzy firmy mogą zmieniać plany lub otwierać Checkout.", - "billing.unlimitedPlanWallet": "Plan bez limitu · portfel {wallet}", - "billing.creditsSuffix": "{label} kredytów", - "billing.perMonth": "{amount} / miesiąc", - "billing.zeroPerMonth": "0 / miesiąc", + "billing.memberHint": "Tylko administratorzy firmy mogÄ… zmieniać plany lub otwierać Checkout.", + "billing.unlimitedPlanWallet": "Plan bez limitu · portfel {wallet}", + "billing.creditsSuffix": "{label} kredytów", + "billing.perMonth": "{amount} / miesiÄ…c", + "billing.zeroPerMonth": "0 / miesiÄ…c", "billing.upTo": "Do {count}", "billing.skusUnlimited": "{used} SKU (bez limitu)", "billing.skusOnly": "{used} SKU", "billing.skusOf": "{used} / {max} SKU", "billing.planKind.none": "Brak aktywnego planu", "billing.planKind.enterprise": "Enterprise / niestandardowy", - "billing.planKind.trial": "Okres próbny", + "billing.planKind.trial": "Okres próbny", "billing.planKind.standard": "Plan standardowy", - "billing.creditUsage.normalize.label": "Normalizuj, specs i uzupełnij", - "billing.creditUsage.normalize.detail": "Czyszczenie danych i uzupełnianie atrybutów działają bez zużycia kredytów AI.", - "billing.creditUsage.ai.label": "Tytuły i opisy AI", - "billing.creditUsage.ai.detail": "Opłata za produkt na podstawie funkcji AI i ilości wygenerowanego tekstu.", + "billing.creditUsage.normalize.label": "Normalizuj, specs i uzupeÅ‚nij", + "billing.creditUsage.normalize.detail": "Czyszczenie danych i uzupeÅ‚nianie atrybutów dziaÅ‚ajÄ… bez zużycia kredytów AI.", + "billing.creditUsage.ai.label": "TytuÅ‚y i opisy AI", + "billing.creditUsage.ai.detail": "OpÅ‚ata za produkt na podstawie funkcji AI i iloÅ›ci wygenerowanego tekstu.", "billing.creditUsage.eprel.label": "EPREL / etykiety energetyczne", - "billing.creditUsage.eprel.detail": "Bezpłatne publiczne dane EPREL UE na wszystkich planach (bez kredytów).", + "billing.creditUsage.eprel.detail": "BezpÅ‚atne publiczne dane EPREL UE na wszystkich planach (bez kredytów).", "billing.creditUsage.campaign.label": "AI kampanii i zastosowanie marki", - "billing.creditUsage.campaign.detail": "Płatne kroki AI korzystające z zarządzanego modelu zużywają kredyty firmy.", + "billing.creditUsage.campaign.detail": "PÅ‚atne kroki AI korzystajÄ…ce z zarzÄ…dzanego modelu zużywajÄ… kredyty firmy.", "exports.title": "Feedy eksportu", - "exports.description": "Wybierz, co publikować w każdym kanale — które produkty i pola — i udostępnij publiczny URL feedu (bez logowania).", - "exports.descriptionFiltered": "Publiczne linki Google Shopping, Meta i niestandardowych feedów. Wyświetlanie {filtered} z {total} feedów.", - "exports.loadFailed": "Nie udało się wczytać feedów eksportu", - "exports.loadFeedFailed": "Nie udało się wczytać feedu eksportu", - "exports.refresh": "Odśwież", - "exports.refreshing": "Odświeżanie…", - "exports.create": "Utwórz feed eksportu", + "exports.description": "Wybierz, co publikować w każdym kanale — które produkty i pola — i udostÄ™pnij publiczny URL feedu (bez logowania).", + "exports.descriptionFiltered": "Publiczne linki Google Shopping, Meta i niestandardowych feedów. WyÅ›wietlanie {filtered} z {total} feedów.", + "exports.loadFailed": "Nie udaÅ‚o siÄ™ wczytać feedów eksportu", + "exports.loadFeedFailed": "Nie udaÅ‚o siÄ™ wczytać feedu eksportu", + "exports.refresh": "OdÅ›wież", + "exports.refreshing": "OdÅ›wieżanie…", + "exports.create": "Utwórz feed eksportu", "exports.edit": "Edytuj feed eksportu", - "exports.editDescription": "Zaktualizuj nazwę, status, uwzględnione produkty i zmapowane pola.", - "exports.howToTitle": "Jak wybrać, co eksportować", + "exports.editDescription": "Zaktualizuj nazwÄ™, status, uwzglÄ™dnione produkty i zmapowane pola.", + "exports.howToTitle": "Jak wybrać, co eksportować", "exports.howTo.choose": "Co trafia do feedu", - "exports.howTo.chooseBody": "— ustaw feed źródłowy i statusy produktów przy tworzeniu/edycji, aby publiczny URL zawierał tylko te produkty.", - "exports.howTo.subset": "Jednorazowy podzbiór", - "exports.howTo.subsetBody": "— w", + "exports.howTo.chooseBody": "— ustaw feed źródÅ‚owy i statusy produktów przy tworzeniu/edycji, aby publiczny URL zawieraÅ‚ tylko te produkty.", + "exports.howTo.subset": "Jednorazowy podzbiór", + "exports.howTo.subsetBody": "— w", "exports.howTo.productsLink": "Produktach", - "exports.howTo.subsetTail": " zaznacz wiersze i Eksportuj, aby pobrać tylko te produkty w formacie i polach feedu.", + "exports.howTo.subsetTail": " zaznacz wiersze i Eksportuj, aby pobrać tylko te produkty w formacie i polach feedu.", "exports.howTo.google": "Google Shopping", - "exports.howTo.googleBody": "— utwórz preset CSV lub XML, Generate, skopiuj publiczny URL do Merchant Center → Products → Feeds → scheduled fetch.", + "exports.howTo.googleBody": "— utwórz preset CSV lub XML, Generate, skopiuj publiczny URL do Merchant Center → Products → Feeds → scheduled fetch.", "exports.howTo.meta": "Katalog Meta", - "exports.howTo.metaBody": "— preset CSV dla źródeł danych Commerce Manager.", + "exports.howTo.metaBody": "— preset CSV dla źródeÅ‚ danych Commerce Manager.", "exports.howTo.custom": "Niestandardowy CSV/XML", - "exports.howTo.customBody": "— dowolny partner; ten sam publiczny URL działa dla pollerów cron / webhook.", + "exports.howTo.customBody": "— dowolny partner; ten sam publiczny URL dziaÅ‚a dla pollerów cron / webhook.", "exports.howTo.rest": "REST", - "exports.howTo.restBody": "— klucze API w", - "exports.howTo.settingsApiKeys": "Ustawienia → Klucze API", - "exports.howTo.restTail": "(klucze legacy nie zostały zmigrowane) pull", + "exports.howTo.restBody": "— klucze API w", + "exports.howTo.settingsApiKeys": "Ustawienia → Klucze API", + "exports.howTo.restTail": "(klucze legacy nie zostaÅ‚y zmigrowane) pull", "exports.howTo.openapi": "OpenAPI", "exports.feedStatus": "Status feedu", - "exports.generating": "Generowanie eksportu — przy dużych katalogach może to chwilę potrwać.", - "exports.generationFailed": "Generowanie nie powiodło się. Zobacz błąd powyżej, a następnie spróbuj ponownie Refresh Feed.", - "exports.exportedProducts": "Wyeksportowano {count} produktów", + "exports.generating": "Generowanie eksportu — przy dużych katalogach może to chwilÄ™ potrwać.", + "exports.generationFailed": "Generowanie nie powiodÅ‚o siÄ™. Zobacz błąd powyżej, a nastÄ™pnie spróbuj ponownie Refresh Feed.", + "exports.exportedProducts": "Wyeksportowano {count} produktów", "exports.lastGenerated": "Ostatnio wygenerowano: {time}", "exports.neverGenerated": "Nigdy nie wygenerowano", - "exports.searchPlaceholder": "Szukaj feedów...", - "exports.searchAria": "Szukaj feedów", - "exports.clearSearch": "Wyczyść wyszukiwanie", - "exports.loading": "Ładowanie feedów…", - "exports.loadErrorTitle": "Nie można wczytać feedów eksportu", - "exports.loadErrorBody": "Coś poszło nie tak podczas wczytywania eksportów. Spróbuj ponownie lub sprawdź błąd powyżej, aby uzyskać szczegóły.", - "exports.tryAgain": "Spróbuj ponownie", - "exports.emptyTitle": "Brak feedów eksportu", - "exports.emptyBody": "Utwórz feed Google Shopping, Meta lub własny CSV/XML, aby wybrać produkty i pola. Wygeneruj publiczny URL do Merchant Center lub partnera — albo wyeksportuj podzbiór z Produktów.", - "exports.emptyCta": "Utwórz feed Google Shopping", - "exports.noMatchTitle": "Brak pasujących feedów", - "exports.noMatchBody": "Spróbuj innego hasła wyszukiwania.", + "exports.searchPlaceholder": "Szukaj feedów...", + "exports.searchAria": "Szukaj feedów", + "exports.clearSearch": "Wyczyść wyszukiwanie", + "exports.loading": "Ładowanie feedów…", + "exports.loadErrorTitle": "Nie można wczytać feedów eksportu", + "exports.loadErrorBody": "CoÅ› poszÅ‚o nie tak podczas wczytywania eksportów. Spróbuj ponownie lub sprawdź błąd powyżej, aby uzyskać szczegóły.", + "exports.tryAgain": "Spróbuj ponownie", + "exports.emptyTitle": "Brak feedów eksportu", + "exports.emptyBody": "Utwórz feed Google Shopping, Meta lub wÅ‚asny CSV/XML, aby wybrać produkty i pola. Wygeneruj publiczny URL do Merchant Center lub partnera — albo wyeksportuj podzbiór z Produktów.", + "exports.emptyCta": "Utwórz feed Google Shopping", + "exports.noMatchTitle": "Brak pasujÄ…cych feedów", + "exports.noMatchBody": "Spróbuj innego hasÅ‚a wyszukiwania.", "exports.col.name": "Nazwa", "exports.col.format": "Format", "exports.col.feedUrl": "URL feedu", @@ -3516,320 +3517,320 @@ export const pl: MessageDict = { "exports.col.status": "Stan", "exports.col.actions": "Akcje", "exports.working": "W toku.", - "exports.generatingShort": "Generowanie…", + "exports.generatingShort": "Generowanie…", "exports.copyUrl": "Kopiuj URL", - "exports.openMenu": "Otwórz menu", - "exports.preview": "Podgląd", + "exports.openMenu": "Otwórz menu", + "exports.preview": "PodglÄ…d", "exports.download": "Pobierz", - "exports.refreshFeed": "Odśwież feed", + "exports.refreshFeed": "OdÅ›wież feed", "exports.editAction": "Edytuj", - "exports.delete": "Usuń", + "exports.delete": "UsuÅ„", "exports.rotateToken": "Obroc token URL", "exports.rotateFailed": "Nie udalo sie obrocic tokenu URL feedu", - "exports.deleting": "Usuwanie…", - "exports.channelPreset": "Preset kanału", + "exports.deleting": "Usuwanie…", + "exports.channelPreset": "Preset kanaÅ‚u", "exports.name": "Nazwa", "exports.format": "Format", - "exports.sourceFeed": "Feed źródłowy (opcjonalnie)", - "exports.sourceFeedHelp": "Ogranicz ten feed do produktów z jednego feedu wejściowego albo zostaw Wszystkie produkty — tak wybierasz, co zawiera publiczny URL.", + "exports.sourceFeed": "Feed źródÅ‚owy (opcjonalnie)", + "exports.sourceFeedHelp": "Ogranicz ten feed do produktów z jednego feedu wejÅ›ciowego albo zostaw Wszystkie produkty — tak wybierasz, co zawiera publiczny URL.", "exports.allProducts": "Wszystkie produkty", - "exports.rootElement": "Element główny", + "exports.rootElement": "Element główny", "exports.itemElement": "Element pozycji", - "exports.productStatuses": "Statusy produktów (oddzielone przecinkami)", - "exports.productStatusesHelp": "Uwzględniaj tylko produkty o tych statusach (np. active). Puste = wszystkie statusy.", + "exports.productStatuses": "Statusy produktów (oddzielone przecinkami)", + "exports.productStatusesHelp": "UwzglÄ™dniaj tylko produkty o tych statusach (np. active). Puste = wszystkie statusy.", "exports.status": "Stan", "exports.active": "Aktywny", "exports.inactive": "Nieaktywny", - "exports.fieldMappings": "Mapowania pól", + "exports.fieldMappings": "Mapowania pól", "exports.addField": "Dodaj pole", - "exports.outputKey": "Klucz wyjściowy", - "exports.source": "Źródło", + "exports.outputKey": "Klucz wyjÅ›ciowy", + "exports.source": "ŹródÅ‚o", "exports.customSource": "Niestandardowe (attr.* / spec.*)", - "exports.removeField": "Usuń pole", - "exports.fieldHelp": "Eksporty odczytują przetworzone produkty (z surowym mapped_data jako zapasem). Użyj eprel_* / energy_* dla pól EPREL, spec.* dla jednej specyfikacji lub specifications.*, aby rozwinąć wszystkie specs jako węzły XML.", - "exports.saving": "Zapisywanie…", + "exports.removeField": "UsuÅ„ pole", + "exports.fieldHelp": "Eksporty odczytujÄ… przetworzone produkty (z surowym mapped_data jako zapasem). Użyj eprel_* / energy_* dla pól EPREL, spec.* dla jednej specyfikacji lub specifications.*, aby rozwinąć wszystkie specs jako wÄ™zÅ‚y XML.", + "exports.saving": "Zapisywanie…", "exports.saveChanges": "Zapisz zmiany", - "exports.createFeed": "Utwórz feed", + "exports.createFeed": "Utwórz feed", "exports.updated": "Zaktualizowano feed eksportu.", "exports.created": "Utworzono feed eksportu.", - "exports.saveFailed": "Zapis nie powiódł się", - "exports.urlCopied": "Skopiowano publiczny URL feedu {format}. Wklej go do dowolnego systemu pobierającego feedy produktów.", - "exports.copyFailed": "Nie udało się skopiować URL do schowka", - "exports.refreshed": "Feed odświeżony", - "exports.refreshedWithCount": "Feed odświeżony ({count} produktów).", - "exports.refreshFailed": "Nie udało się odświeżyć feedu", - "exports.deleteConfirm": "Czy na pewno chcesz usunąć ten feed eksportu?", - "exports.deleted": "Usunięto feed eksportu.", - "exports.deleteFailed": "Nie udało się usunąć feedu eksportu", + "exports.saveFailed": "Zapis nie powiódÅ‚ siÄ™", + "exports.urlCopied": "Skopiowano publiczny URL feedu {format}. Wklej go do dowolnego systemu pobierajÄ…cego feedy produktów.", + "exports.copyFailed": "Nie udaÅ‚o siÄ™ skopiować URL do schowka", + "exports.refreshed": "Feed odÅ›wieżony", + "exports.refreshedWithCount": "Feed odÅ›wieżony ({count} produktów).", + "exports.refreshFailed": "Nie udaÅ‚o siÄ™ odÅ›wieżyć feedu", + "exports.deleteConfirm": "Czy na pewno chcesz usunąć ten feed eksportu?", + "exports.deleted": "UsuniÄ™to feed eksportu.", + "exports.deleteFailed": "Nie udaÅ‚o siÄ™ usunąć feedu eksportu", "exports.defaultName": "Nowy feed eksportu", "exports.fallbackName": "Feed eksportu", "exports.dialog.selectTitle": "Eksportuj wybrane produkty", - "exports.dialog.selectDescription": "Wybierz konfigurację feedu eksportu dla {count} wybranych produktów.", - "exports.dialog.noneFound": "Nie znaleziono konfiguracji feedów eksportu. Utwórz jedną w sekcji Export Feeds.", - "exports.dialog.loadFailed": "Nie udało się wczytać opcji feedu eksportu. Spróbuj ponownie.", + "exports.dialog.selectDescription": "Wybierz konfiguracjÄ™ feedu eksportu dla {count} wybranych produktów.", + "exports.dialog.noneFound": "Nie znaleziono konfiguracji feedów eksportu. Utwórz jednÄ… w sekcji Export Feeds.", + "exports.dialog.loadFailed": "Nie udaÅ‚o siÄ™ wczytać opcji feedu eksportu. Spróbuj ponownie.", "exports.dialog.selectRequired": "Wybierz format feedu eksportu.", "exports.dialog.selectPlaceholder": "Wybierz format feedu eksportu...", - "exports.dialog.confirmAria": "Potwierdź eksport", + "exports.dialog.confirmAria": "Potwierdź eksport", "exports.dialog.export": "Eksportuj", "exports.preset.google_shopping_csv.label": "Google Shopping (CSV)", "exports.preset.google_shopping_csv.shortLabel": "Google Shopping CSV", - "exports.preset.google_shopping_csv.description": "Feed produktów Merchant Center ze standardowymi kolumnami Google (id, title, price, gtin, …).", - "exports.preset.google_shopping_csv.hint": "Po odświeżeniu feedu skopiuj publiczny URL CSV do Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.", + "exports.preset.google_shopping_csv.description": "Feed produktów Merchant Center ze standardowymi kolumnami Google (id, title, price, gtin, …).", + "exports.preset.google_shopping_csv.hint": "Po odÅ›wieżeniu feedu skopiuj publiczny URL CSV do Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.", "exports.preset.google_shopping_csv.defaultName": "Google Shopping CSV", "exports.preset.google_shopping_xml.label": "Google Shopping (XML)", "exports.preset.google_shopping_xml.shortLabel": "Google Shopping XML", - "exports.preset.google_shopping_xml.description": "Te same kolumny Google co elementy XML (g:id, g:title, …) dla feedów XML Merchant Center.", - "exports.preset.google_shopping_xml.hint": "Wklej publiczny URL XML do Merchant Center jako scheduled fetch. W razie potrzeby zmapuj brakujące pola sklepu (link, price) w Field mappings.", + "exports.preset.google_shopping_xml.description": "Te same kolumny Google co elementy XML (g:id, g:title, …) dla feedów XML Merchant Center.", + "exports.preset.google_shopping_xml.hint": "Wklej publiczny URL XML do Merchant Center jako scheduled fetch. W razie potrzeby zmapuj brakujÄ…ce pola sklepu (link, price) w Field mappings.", "exports.preset.google_shopping_xml.defaultName": "Google Shopping XML", "exports.preset.meta_csv.label": "Katalog Meta (CSV)", "exports.preset.meta_csv.shortLabel": "Meta CSV", - "exports.preset.meta_csv.description": "Kolumny katalogu Facebook / Instagram Commerce (id, title, availability, price, image_link, …).", - "exports.preset.meta_csv.hint": "W Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed wklej publiczny URL CSV.", + "exports.preset.meta_csv.description": "Kolumny katalogu Facebook / Instagram Commerce (id, title, availability, price, image_link, …).", + "exports.preset.meta_csv.hint": "W Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed wklej publiczny URL CSV.", "exports.preset.meta_csv.defaultName": "Katalog Meta CSV", "exports.preset.custom_csv.label": "Niestandardowy CSV", "exports.preset.custom_csv.shortLabel": "Niestandardowy CSV", - "exports.preset.custom_csv.description": "Wybierz własne kolumny i źródła produktów dla dowolnego partnera lub webhooka.", - "exports.preset.custom_csv.hint": "Dodawaj lub zmieniaj nazwy kluczy wyjściowych dowolnie. Publiczny URL nie wymaga logowania do pobrania.", + "exports.preset.custom_csv.description": "Wybierz wÅ‚asne kolumny i źródÅ‚a produktów dla dowolnego partnera lub webhooka.", + "exports.preset.custom_csv.hint": "Dodawaj lub zmieniaj nazwy kluczy wyjÅ›ciowych dowolnie. Publiczny URL nie wymaga logowania do pobrania.", "exports.preset.custom_csv.defaultName": "Niestandardowy eksport CSV", "exports.preset.custom_xml.label": "Niestandardowy XML", "exports.preset.custom_xml.shortLabel": "Niestandardowy XML", - "exports.preset.custom_xml.description": "Zbuduj niestandardowy kształt XML z własnymi nazwami root/item i mapowaniami pól.", - "exports.preset.custom_xml.hint": "Ustaw nazwy elementów root i item, a następnie zmapuj każdy klucz wyjściowy na źródło produktu.", + "exports.preset.custom_xml.description": "Zbuduj niestandardowy ksztaÅ‚t XML z wÅ‚asnymi nazwami root/item i mapowaniami pól.", + "exports.preset.custom_xml.hint": "Ustaw nazwy elementów root i item, a nastÄ™pnie zmapuj każdy klucz wyjÅ›ciowy na źródÅ‚o produktu.", "exports.preset.custom_xml.defaultName": "Niestandardowy eksport XML", "processing.title": "Przetwarzanie", - "processing.description": "Na żywo postęp pipeline dla zadań przetwarzania produktów. Automatyczne odświeżanie, gdy ta karta jest widoczna. Ukończone zadania prowadzą do Needs Review w celu akceptacji / edycji / odrzucenia.", - "processing.refresh": "Odśwież", - "processing.loadFailed": "Nie udało się wczytać zadań przetwarzania", - "processing.tooManyRequests": "Zbyt wiele żądań — poczekaj chwilę i spróbuj ponownie.", - "processing.serverError": "{fallback} (błąd serwera {status}). Spróbuj ponownie wkrótce.", + "processing.description": "Na żywo postÄ™p pipeline dla zadaÅ„ przetwarzania produktów. Automatyczne odÅ›wieżanie, gdy ta karta jest widoczna. UkoÅ„czone zadania prowadzÄ… do Needs Review w celu akceptacji / edycji / odrzucenia.", + "processing.refresh": "OdÅ›wież", + "processing.loadFailed": "Nie udaÅ‚o siÄ™ wczytać zadaÅ„ przetwarzania", + "processing.tooManyRequests": "Zbyt wiele żądaÅ„ — poczekaj chwilÄ™ i spróbuj ponownie.", + "processing.serverError": "{fallback} (błąd serwera {status}). Spróbuj ponownie wkrótce.", "processing.httpError": "{fallback} (HTTP {status})", - "processing.cancelFailed": "Nie można anulować tego zadania", - "processing.retryFailed": "Nie można ponowić tego zadania", + "processing.cancelFailed": "Nie można anulować tego zadania", + "processing.retryFailed": "Nie można ponowić tego zadania", "processing.cancelledMsg": "Anulowano \"{name}\".", "processing.queuedRetry": "\"{name}\" w kolejce do ponowienia.", "processing.jobFallback": "Zadanie {id}", "processing.tasks": "Zadania", - "processing.pipelineHint": "Pipeline: normalize → specs → fill → EPREL → AI. Duże starty mogą dzielić się na zadania równoległe.", - "processing.emptyTitle": "Brak jeszcze zadań w tle", - "processing.emptyBody": "Brak jeszcze zadań w tle. Uruchom nowe zadanie z Products, gdy będziesz gotowy.", + "processing.pipelineHint": "Pipeline: normalize → specs → fill → EPREL → AI. Duże starty mogÄ… dzielić siÄ™ na zadania równolegÅ‚e.", + "processing.emptyTitle": "Brak jeszcze zadaÅ„ w tle", + "processing.emptyBody": "Brak jeszcze zadaÅ„ w tle. Uruchom nowe zadanie z Products, gdy bÄ™dziesz gotowy.", "processing.startJob": "Uruchom zadanie", - "processing.connectFeed": "Podłącz feed", - "processing.splitBatch": "Podzielona partia · {jobs} zadań · {products} produktów", + "processing.connectFeed": "Podłącz feed", + "processing.splitBatch": "Podzielona partia · {jobs} zadaÅ„ · {products} produktów", "processing.col.task": "Zadanie", "processing.col.status": "Stan", "processing.col.steps": "Kroki", - "processing.col.progress": "Postęp", + "processing.col.progress": "PostÄ™p", "processing.col.started": "Uruchomiono", - "processing.col.completed": "Ukończone", + "processing.col.completed": "UkoÅ„czone", "processing.col.actions": "Akcje", - "processing.partOfBatch": "· część partii", + "processing.partOfBatch": "· część partii", "processing.nowStep": "Teraz: {step}", - "processing.skip": "(pomiń)", + "processing.skip": "(pomiÅ„)", "processing.reviewResults": "Przejrzyj wyniki", - "processing.reviewTitle": "Otwórz Needs Review, aby zaakceptować, edytować lub odrzucić wzbogacenie", + "processing.reviewTitle": "Otwórz Needs Review, aby zaakceptować, edytować lub odrzucić wzbogacenie", "processing.cancel": "Anuluj", - "processing.cancelling": "Anulowanie…", - "processing.cancelTitle": "Anuluj to oczekujące lub uruchomione zadanie", - "processing.retry": "Ponów", - "processing.retrying": "Ponawianie…", + "processing.cancelling": "Anulowanie…", + "processing.cancelTitle": "Anuluj to oczekujÄ…ce lub uruchomione zadanie", + "processing.retry": "Ponów", + "processing.retrying": "Ponawianie…", "processing.actions.onPage": "{count} na tej stronie", - "processing.actions.clearSelection": "Wyczyść zaznaczenie", - "processing.actions.processSelected": "Przetwórz zaznaczenie", - "processing.actions.processAria": "Przetwórz zaznaczone produkty", - "processing.actions.processAriaCount": "Przetwórz {count} wybranych produktów{plural} na tej stronie", - "processing.actions.whatToProcess": "Co przetwarzać", - "processing.actions.freeNoAiTitle": "Plan Free — brak kredytów AI", - "processing.actions.freeNoAiBody": "Normalize, specs, fill i EPREL nadal działają. Tytuły/opisy AI wymagają płatnego planu lub kredytów.", - "processing.actions.comparePlans": "Porównaj plany", + "processing.actions.clearSelection": "Wyczyść zaznaczenie", + "processing.actions.processSelected": "Przetwórz zaznaczenie", + "processing.actions.processAria": "Przetwórz zaznaczone produkty", + "processing.actions.processAriaCount": "Przetwórz {count} wybranych produktów{plural} na tej stronie", + "processing.actions.whatToProcess": "Co przetwarzać", + "processing.actions.freeNoAiTitle": "Plan Free — brak kredytów AI", + "processing.actions.freeNoAiBody": "Normalize, specs, fill i EPREL nadal dziaÅ‚ajÄ…. TytuÅ‚y/opisy AI wymagajÄ… pÅ‚atnego planu lub kredytów.", + "processing.actions.comparePlans": "Porównaj plany", "processing.actions.selectAll": "Zaznacz wszystko", "processing.actions.selectAllAria": "Zaznacz wszystkie tryby przetwarzania", "processing.actions.upgradeRequired": "{label} (wymagane ulepszenie)", - "processing.actions.upgradeSuffix": " · ulepsz", - "processing.actions.credits": "{credits} kredytów", - "processing.actions.free": "bezpłatne", + "processing.actions.upgradeSuffix": " · ulepsz", + "processing.actions.credits": "{credits} kredytów", + "processing.actions.free": "bezpÅ‚atne", "processing.actions.autoCategorizeTitle": "Automatyczne dodawanie kategoryzacji", "processing.actions.autoCategorizeBody": "{count} produkt(y) wymaga kategoryzacji do przetwarzania {types}", - "processing.actions.aiLocked": "Opcje AI są zablokowane na Free. Ulepsz plan, aby przetwarzać tytuły/opisy.", - "processing.actions.totalCredits": "Łączne kredyty ({count} na tej stronie):", - "processing.actions.starting": "Uruchamianie…", - "processing.actions.processCount": "Przetwórz {count} na tej stronie", + "processing.actions.aiLocked": "Opcje AI sÄ… zablokowane na Free. Ulepsz plan, aby przetwarzać tytuÅ‚y/opisy.", + "processing.actions.totalCredits": "Łączne kredyty ({count} na tej stronie):", + "processing.actions.starting": "Uruchamianie…", + "processing.actions.processCount": "Przetwórz {count} na tej stronie", "processing.actions.close": "Zamknij", "processing.actions.accept": "Zaakceptuj", "processing.actions.acceptEnrichment": "Zaakceptuj wzbogacenie", "processing.actions.export": "Eksportuj", "processing.actions.exportSelected": "Eksportuj zaznaczenie", - "processing.actions.reject": "Odrzuć", - "processing.actions.rejectReset": "Odrzuć (reset)", + "processing.actions.reject": "Odrzuć", + "processing.actions.rejectReset": "Odrzuć (reset)", "processing.actions.resetUnprocessed": "Resetuj do Nieprzetworzone", - "processing.actions.confirmTitle": "Potwierdź przetwarzanie", - "processing.actions.confirmBody": "Przetwórz {count} produkt(ów) na tej stronie za {credits} kredytów. Kredyty są zużywane przy starcie zadania i nie można ich cofnąć z tej akcji.", + "processing.actions.confirmTitle": "Potwierdź przetwarzanie", + "processing.actions.confirmBody": "Przetwórz {count} produkt(ów) na tej stronie za {credits} kredytów. Kredyty sÄ… zużywane przy starcie zadania i nie można ich cofnąć z tej akcji.", "processing.actions.confirmStart": "Rozpocznij przetwarzanie", "processing.option.category": "Kategorie", "processing.option.attributes": "Atrybuty / specs", - "processing.option.title": "Tytuły (AI)", + "processing.option.title": "TytuÅ‚y (AI)", "processing.option.description": "Opisy (AI)", "processing.receipt.view": "Zobacz w Przetwarzaniu", "processing.receipt.undo": "Cofnij", - "processing.receipt.format": "{succeeded} powiodło się · {skipped} pominięto · {failed} niepowodzeń", + "processing.receipt.format": "{succeeded} powiodÅ‚o siÄ™ · {skipped} pominiÄ™to · {failed} niepowodzeÅ„", "processing.receipt.cancelledOne": "Przetwarzanie anulowane", "processing.receipt.cancelledMany": "Anulowano zadania przetwarzania", - "processing.receipt.cancelledDesc": "Właśnie uruchomione zadanie zostało anulowane.", - "processing.receipt.cancelFailed": "Nie można anulować zadania przetwarzania", - "unsubscribe.title": "Wypisz się", + "processing.receipt.cancelledDesc": "WÅ‚aÅ›nie uruchomione zadanie zostaÅ‚o anulowane.", + "processing.receipt.cancelFailed": "Nie można anulować zadania przetwarzania", + "unsubscribe.title": "Wypisz siÄ™", "unsubscribe.me": "Wypisz mnie", - "unsubscribe.invalidLink": "Nieprawidłowy link", - "unsubscribe.failedShort": "Wypisanie nie powiodło się", - "unsubscribe.already": "Jesteś już wypisany.", - "unsubscribe.confirmPrompt": "Potwierdź poniżej, aby wypisać się z e-maili marketingowych.", - "unsubscribe.done": "Zostałeś wypisany.", - "stores.title": "Sklepy i źródła", - "stores.description": "Połącz dowolny sklep lub dostawcę w jednym miejscu — Woo, Shopify, URL feedu lub CSV. Sklepy live: produkty Descrybe → sklep; zamówienia/opinie sklep → Descrybe. Eksportuj, gdy katalog jest gotowy.", - "stores.allInputFeeds": "Wszystkie feedy wejściowe", + "unsubscribe.invalidLink": "NieprawidÅ‚owy link", + "unsubscribe.failedShort": "Wypisanie nie powiodÅ‚o siÄ™", + "unsubscribe.already": "JesteÅ› już wypisany.", + "unsubscribe.confirmPrompt": "Potwierdź poniżej, aby wypisać siÄ™ z e-maili marketingowych.", + "unsubscribe.done": "ZostaÅ‚eÅ› wypisany.", + "stores.title": "Sklepy i źródÅ‚a", + "stores.description": "Połącz dowolny sklep lub dostawcÄ™ w jednym miejscu — Woo, Shopify, URL feedu lub CSV. Sklepy live: produkty Descrybe → sklep; zamówienia/opinie sklep → Descrybe. Eksportuj, gdy katalog jest gotowy.", + "stores.allInputFeeds": "Wszystkie feedy wejÅ›ciowe", "stores.exportFeeds": "Feedy eksportu", - "stores.migrationNote": "Po migracji platformy Descrybe dane logowania WooCommerce i Shopify mogą wymagać ponownego wprowadzenia — to ponowne połączenie, nie uszkodzona synchronizacja.", + "stores.migrationNote": "Po migracji platformy Descrybe dane logowania WooCommerce i Shopify mogÄ… wymagać ponownego wprowadzenia — to ponowne połączenie, nie uszkodzona synchronizacja.", "stores.docsPrefix": "Docs:", - "stores.docsApiOverview": "Przegląd API", - "stores.docsSuffix": "dla publicznego dostępu do produktów; użyj WooCommerce lub Shopify poniżej do live-synchronizacji sklepu.", + "stores.docsApiOverview": "PrzeglÄ…d API", + "stores.docsSuffix": "dla publicznego dostÄ™pu do produktów; użyj WooCommerce lub Shopify poniżej do live-synchronizacji sklepu.", "stores.connectorsHeading": "Konektory sklepu i katalogu", "stores.statusAria": "Status: {label}", "stores.ctaAria": "{cta}: {title}", - "stores.startTitle": "Od czego zacząć?", - "stores.startBody": "Sklep Woo → WooCommerce. Shopify lub inna platforma → URL feedu lub upload CSV. Gotowe do Merchant Center lub partnerów → Feedy eksportu (preset Google Shopping lub własne pola). Po migracji połącz ponownie Woo/Shopify, zanim oczekujesz działania sync.", - "stores.startBodyMember": "Poproś admina firmy o podłączenie WooCommerce lub Shopify. Nadal możesz otwierać podłączone sklepy (sync/przegląd) oraz używać Feed URL, CSV lub feedów eksportu według planu.", + "stores.startTitle": "Od czego zacząć?", + "stores.startBody": "Sklep Woo → WooCommerce. Shopify lub inna platforma → URL feedu lub upload CSV. Gotowe do Merchant Center lub partnerów → Feedy eksportu (preset Google Shopping lub wÅ‚asne pola). Po migracji połącz ponownie Woo/Shopify, zanim oczekujesz dziaÅ‚ania sync.", + "stores.startBodyMember": "PoproÅ› admina firmy o podłączenie WooCommerce lub Shopify. Nadal możesz otwierać podłączone sklepy (sync/przeglÄ…d) oraz używać Feed URL, CSV lub feedów eksportu wedÅ‚ug planu.", "stores.wizard.title": "Prowadzona konfiguracja sklepu", - "stores.wizard.description": "Połącz sklep, przetestuj połączenie, ustaw pierwszą synchronizację produktów w kolejce — gotowe.", + "stores.wizard.description": "Połącz sklep, przetestuj połączenie, ustaw pierwszÄ… synchronizacjÄ™ produktów w kolejce — gotowe.", "stores.wizard.guidedSetup": "Prowadzona konfiguracja", - "stores.wizard.guidedSetupAria": "Rozpocznij prowadzoną konfigurację sklepu", - "stores.wizard.adminOnly": "Tylko admini firmy mogą uruchomić prowadzoną konfigurację sklepu (zapis poświadczeń i pierwszy sync). Nadal możesz otwierać podłączone sklepy.", + "stores.wizard.guidedSetupAria": "Rozpocznij prowadzonÄ… konfiguracjÄ™ sklepu", + "stores.wizard.adminOnly": "Tylko admini firmy mogÄ… uruchomić prowadzonÄ… konfiguracjÄ™ sklepu (zapis poÅ›wiadczeÅ„ i pierwszy sync). Nadal możesz otwierać podłączone sklepy.", "stores.wizard.pickChannel": "Wybierz konektor sklepu", - "stores.wizard.pickChannelBody": "Wybierz WooCommerce lub Shopify. Dokończ połącz → test → pierwsza sync na stronie konektora, potem wróć tutaj.", + "stores.wizard.pickChannelBody": "Wybierz WooCommerce lub Shopify. DokoÅ„cz połącz → test → pierwsza sync na stronie konektora, potem wróć tutaj.", "stores.wizard.channel.shopify": "Shopify", "stores.wizard.channel.woocommerce": "WooCommerce", "stores.wizard.channelLabel": "Konfiguracja: {channel}", - "stores.wizard.changeChannel": "Zmień konektor", - "stores.wizard.noChannels": "Brak konektorów sklepu w Twoim planie. Ulepsz plan lub zapytaj admina.", - "stores.wizard.progress": "{done} z {total} ukończone", + "stores.wizard.changeChannel": "ZmieÅ„ konektor", + "stores.wizard.noChannels": "Brak konektorów sklepu w Twoim planie. Ulepsz plan lub zapytaj admina.", + "stores.wizard.progress": "{done} z {total} ukoÅ„czone", "stores.wizard.stepsLabel": "Kroki konfiguracji sklepu", - "stores.wizard.step.connect.title": "Połącz", - "stores.wizard.step.connect.body": "Zapisz dane dostępowe na stronie konektora.", - "stores.wizard.step.test.title": "Test połączenia", - "stores.wizard.step.test.body": "Uruchom Test połączenia, aż się powiedzie.", + "stores.wizard.step.connect.title": "Połącz", + "stores.wizard.step.connect.body": "Zapisz dane dostÄ™powe na stronie konektora.", + "stores.wizard.step.test.title": "Test połączenia", + "stores.wizard.step.test.body": "Uruchom Test połączenia, aż siÄ™ powiedzie.", "stores.wizard.step.sync.title": "Pierwsza synchronizacja", - "stores.wizard.step.sync.body": "Ustaw pierwszą sync produktów w kolejce (włącz sync, jeśli trzeba).", + "stores.wizard.step.sync.body": "Ustaw pierwszÄ… sync produktów w kolejce (włącz sync, jeÅ›li trzeba).", "stores.wizard.step.done.title": "Gotowe", - "stores.wizard.step.done.body": "Sklep jest połączony, a synchronizacja została uruchomiona lub zakończona.", - "stores.wizard.openConnector": "Otwórz konektor", + "stores.wizard.step.done.body": "Sklep jest połączony, a synchronizacja zostaÅ‚a uruchomiona lub zakoÅ„czona.", + "stores.wizard.openConnector": "Otwórz konektor", "stores.wizard.viewProducts": "Zobacz produkty", - "stores.wizard.backToHub": "Wróć do sklepów", - "stores.wizard.banner.generic": "Prowadzona konfiguracja: dokończ ten krok, potem wróć do kreatora.", - "stores.wizard.banner.test": "Prowadzona konfiguracja — przetestuj połączenie, potem wróć do kreatora.", - "stores.wizard.banner.sync": "Prowadzona konfiguracja — ustaw pierwszą sync produktów, potem wróć do kreatora.", - "stores.wizard.banner.return": "Wróć do kreatora", + "stores.wizard.backToHub": "Wróć do sklepów", + "stores.wizard.banner.generic": "Prowadzona konfiguracja: dokoÅ„cz ten krok, potem wróć do kreatora.", + "stores.wizard.banner.test": "Prowadzona konfiguracja — przetestuj połączenie, potem wróć do kreatora.", + "stores.wizard.banner.sync": "Prowadzona konfiguracja — ustaw pierwszÄ… sync produktów, potem wróć do kreatora.", + "stores.wizard.banner.return": "Wróć do kreatora", "stores.wizard.banner.dismiss": "Zamknij", "stores.woo.title": "WooCommerce", - "stores.woo.description": "Wypychaj produkty Descrybe → WooCommerce. Pobieraj zamówienia i opinie WooCommerce → Descrybe.", - "stores.woo.ctaReconnect": "Połącz Woo ponownie", - "stores.woo.ctaOpen": "Otwórz Woo", - "stores.woo.ctaConnect": "Połącz Woo", + "stores.woo.description": "Wypychaj produkty Descrybe → WooCommerce. Pobieraj zamówienia i opinie WooCommerce → Descrybe.", + "stores.woo.ctaReconnect": "Połącz Woo ponownie", + "stores.woo.ctaOpen": "Otwórz Woo", + "stores.woo.ctaConnect": "Połącz Woo", "stores.woo.ctaView": "Zobacz Woo", "stores.shopify.title": "Shopify", - "stores.shopify.description": "Wypychaj produkty Descrybe → Shopify. Pobieraj zamówienia Shopify → Descrybe. Opinie nie są dostępne przez Admin API Shopify.", - "stores.shopify.ctaReconnect": "Połącz Shopify ponownie", - "stores.shopify.ctaOpen": "Otwórz Shopify", - "stores.shopify.ctaConnect": "Połącz Shopify", + "stores.shopify.description": "Wypychaj produkty Descrybe → Shopify. Pobieraj zamówienia Shopify → Descrybe. Opinie nie sÄ… dostÄ™pne przez Admin API Shopify.", + "stores.shopify.ctaReconnect": "Połącz Shopify ponownie", + "stores.shopify.ctaOpen": "Otwórz Shopify", + "stores.shopify.ctaConnect": "Połącz Shopify", "stores.shopify.ctaView": "Zobacz Shopify", "stores.feedUrl.title": "URL feedu", "stores.feedUrl.description": "Pull any supplier or sklep catalog from a public CSV or XML URL on a schedule. Map fields, then sync.", "stores.feedUrl.cta": "Dodaj URL feedu", - "stores.csv.title": "Przesyłanie CSV", - "stores.csv.description": "Prześlij CSV produktów jako feed wejściowy. Najlepsze do jednorazowych plików dostawcy lub eksportów z admina Shopify.", - "stores.csv.cta": "Prześlij CSV", + "stores.csv.title": "PrzesyÅ‚anie CSV", + "stores.csv.description": "PrzeÅ›lij CSV produktów jako feed wejÅ›ciowy. Najlepsze do jednorazowych plików dostawcy lub eksportów z admina Shopify.", + "stores.csv.cta": "PrzeÅ›lij CSV", "stores.export.title": "Eksport / REST", - "stores.export.description": "Opublikuj Google Shopping lub własny CSV/XML z publicznym URL. Albo pobieraj produkty kluczem API (/api/v1).", - "stores.export.cta": "Otwórz eksporty", + "stores.export.description": "Opublikuj Google Shopping lub wÅ‚asny CSV/XML z publicznym URL. Albo pobieraj produkty kluczem API (/api/v1).", + "stores.export.cta": "Otwórz eksporty", "stores.apiKeys.title": "Klucze API", - "stores.apiKeys.description": "Stare klucze API nie zostały zmigrowane. Utwórz nowy klucz w Ustawieniach, aby przywrócić dostęp do /api/v1 — sekret jest pokazany tylko raz.", - "stores.apiKeys.descriptionMember": "Firmowe klucze API dla /api/v1. Starsze nie zostały zmigrowane — tylko admini mogą tworzyć lub unieważniać; prefiksy zobaczysz w Ustawieniach.", - "stores.apiKeys.cta": "Zarządzaj kluczami API", + "stores.apiKeys.description": "Stare klucze API nie zostaÅ‚y zmigrowane. Utwórz nowy klucz w Ustawieniach, aby przywrócić dostÄ™p do /api/v1 — sekret jest pokazany tylko raz.", + "stores.apiKeys.descriptionMember": "Firmowe klucze API dla /api/v1. Starsze nie zostaÅ‚y zmigrowane — tylko admini mogÄ… tworzyć lub unieważniać; prefiksy zobaczysz w Ustawieniach.", + "stores.apiKeys.cta": "ZarzÄ…dzaj kluczami API", "stores.apiKeys.ctaView": "Zobacz klucze API", - "stores.status.needsReconnect": "Wymaga ponownego połączenia", - "stores.status.connected": "Połączono", - "stores.status.notConnected": "Niepołączone", + "stores.status.needsReconnect": "Wymaga ponownego połączenia", + "stores.status.connected": "Połączono", + "stores.status.notConnected": "Niepołączone", "stores.status.ready": "Gotowe", - "stores.status.outbound": "Wychodzące", + "stores.status.outbound": "WychodzÄ…ce", "stores.status.reissue": "Wystaw ponownie", - "store.tab.connection": "Połączenie", - "store.tab.orders": "Zamówienia", + "store.tab.connection": "Połączenie", + "store.tab.orders": "Zamówienia", "store.tab.settings": "Ustawienia", "store.tab.categories": "Kategorie", "store.tab.attributes": "Atrybuty", "store.tab.reviews": "Recenzje", "store.badge.credentialsOnFile": "Dane logowania zapisane", - "store.badge.syncEnabled": "Wypychanie produktów włączone", - "store.badge.syncDisabled": "Wypychanie produktów wyłączone", - "store.badge.syncQueued": "Wypychanie produktów w kolejce", + "store.badge.syncEnabled": "Wypychanie produktów włączone", + "store.badge.syncDisabled": "Wypychanie produktów wyłączone", + "store.badge.syncQueued": "Wypychanie produktów w kolejce", "store.badge.dryRun": "Symulacja", "store.badge.testStatus": "Test: {status}", - "store.badge.syncStatus": "Wypychanie produktów: {status}", - "store.badge.ordersQueued": "Sync zamówień w kolejce", - "store.badge.ordersStatus": "Zamówienia: {status}", + "store.badge.syncStatus": "Wypychanie produktów: {status}", + "store.badge.ordersQueued": "Sync zamówieÅ„ w kolejce", + "store.badge.ordersStatus": "Zamówienia: {status}", "store.badge.syncedCount": "Zsynchronizowano {count}", "store.badge.mappedCount": "{count} zmapowane", - "store.badge.productsCount": "{count} produktów", + "store.badge.productsCount": "{count} produktów", "store.badge.optionsCount": "{count} opcji", "store.lastSync": "Ostatnia sync: {date}", - "store.noOrdersSyncYet": "Żadna sync zamówień nie została jeszcze ukończona.", + "store.noOrdersSyncYet": "Å»adna sync zamówieÅ„ nie zostaÅ‚a jeszcze ukoÅ„czona.", "store.save": "Zapisz", "store.saving": "Zapisywanie...", "store.testing": "Testowanie...", - "store.testConnection": "Testuj połączenie", + "store.testConnection": "Testuj połączenie", "store.queueing": "Kolejkowanie...", - "store.queueProductPush": "Dodaj wypychanie produktów do kolejki (Descrybe → sklep)", - "store.queueFirstProductSync": "Dodaj pierwsze wypychanie produktów do kolejki (Descrybe → sklep)", - "store.queueOrdersImport": "Dodaj import zamówień do kolejki (sklep → Descrybe)", - "store.refreshList": "Odśwież listę", + "store.queueProductPush": "Dodaj wypychanie produktów do kolejki (Descrybe → sklep)", + "store.queueFirstProductSync": "Dodaj pierwsze wypychanie produktów do kolejki (Descrybe → sklep)", + "store.queueOrdersImport": "Dodaj import zamówieÅ„ do kolejki (sklep → Descrybe)", + "store.refreshList": "OdÅ›wież listÄ™", "store.saveBeforeTest": "Zapisz dane logowania przed testem", - "store.saveTestBeforeQueue": "Zapisz dane logowania i przetestuj połączenie przed sync", - "store.connectionOk": "Połączenie OK", - "store.connectionSuccessful": "Połączenie udane", - "store.connectionSuccessfulDot": "Połączenie udane.", - "store.connectionFailed": "Połączenie nie powiodło się", - "store.connectionFailedDot": "Połączenie nie powiodło się.", - "store.connectionTestFailed": "Test połączenia nie powiódł się", - "store.testFailed": "Test nie powiódł się", + "store.saveTestBeforeQueue": "Zapisz dane logowania i przetestuj połączenie przed sync", + "store.connectionOk": "Połączenie OK", + "store.connectionSuccessful": "Połączenie udane", + "store.connectionSuccessfulDot": "Połączenie udane.", + "store.connectionFailed": "Połączenie nie powiodÅ‚o siÄ™", + "store.connectionFailedDot": "Połączenie nie powiodÅ‚o siÄ™.", + "store.connectionTestFailed": "Test połączenia nie powiódÅ‚ siÄ™", + "store.testFailed": "Test nie powiódÅ‚ siÄ™", "store.setupSteps": "Kroki konfiguracji", - "store.col.order": "Zamówienie", + "store.col.order": "Zamówienie", "store.col.customer": "Klient", "store.col.status": "Stan", "store.col.total": "Razem", "store.col.date": "Data", - "store.loadingOrders": "Ładowanie zamówień…", - "store.loadingOrdersDot": "Ładowanie zamówień.", - "flash.store.saveFailed": "Nie można zapisać ustawień", - "flash.store.queueSyncFailed": "Nie można dodać synchronizacji do kolejki", - "flash.store.queueOrdersFailed": "Nie można dodać synchronizacji zamówień do kolejki", - "flash.store.connectedTo": "Połączono z {name}.", - "flash.shopify.loadFailed": "Nie udało się wczytać konfiguracji Shopify", - "flash.shopify.productSyncQueued": "Synchronizacja produktów w kolejce. Worker uruchomi ją wkrótce.", - "flash.shopify.ordersSyncQueued": "Synchronizacja zamówień w kolejce. Worker uruchomi ją wkrótce.", - "flash.woo.loadFailed": "Nie udało się wczytać konfiguracji WooCommerce", - "flash.woo.productSyncQueued": "Synchronizacja produktów w kolejce. Uruchomi się wkrótce.", - "flash.woo.ordersSyncQueued": "Synchronizacja zamówień w kolejce. Uruchomi się wkrótce.", - "flash.woo.reviewsSyncQueued": "Synchronizacja recenzji w kolejce. Uruchomi się wkrótce.", - "flash.woo.queueReviewsFailed": "Nie można dodać synchronizacji recenzji do kolejki", - "flash.woo.remoteMapsFailed": "Nie udało się wczytać zdalnych mapowań", - "flash.woo.syncSettingsFailed": "Nie można zapisać ustawień synchronizacji", - "flash.woo.categoryAutoMapFailed": "Automatyczne mapowanie kategorii nie powiodło się", - "flash.woo.attributeAutoMapFailed": "Automatyczne mapowanie atrybutów nie powiodło się", + "store.loadingOrders": "Ładowanie zamówień…", + "store.loadingOrdersDot": "Ładowanie zamówieÅ„.", + "flash.store.saveFailed": "Nie można zapisać ustawieÅ„", + "flash.store.queueSyncFailed": "Nie można dodać synchronizacji do kolejki", + "flash.store.queueOrdersFailed": "Nie można dodać synchronizacji zamówieÅ„ do kolejki", + "flash.store.connectedTo": "Połączono z {name}.", + "flash.shopify.loadFailed": "Nie udaÅ‚o siÄ™ wczytać konfiguracji Shopify", + "flash.shopify.productSyncQueued": "Synchronizacja produktów w kolejce. Worker uruchomi jÄ… wkrótce.", + "flash.shopify.ordersSyncQueued": "Synchronizacja zamówieÅ„ w kolejce. Worker uruchomi jÄ… wkrótce.", + "flash.woo.loadFailed": "Nie udaÅ‚o siÄ™ wczytać konfiguracji WooCommerce", + "flash.woo.productSyncQueued": "Synchronizacja produktów w kolejce. Uruchomi siÄ™ wkrótce.", + "flash.woo.ordersSyncQueued": "Synchronizacja zamówieÅ„ w kolejce. Uruchomi siÄ™ wkrótce.", + "flash.woo.reviewsSyncQueued": "Synchronizacja recenzji w kolejce. Uruchomi siÄ™ wkrótce.", + "flash.woo.queueReviewsFailed": "Nie można dodać synchronizacji recenzji do kolejki", + "flash.woo.remoteMapsFailed": "Nie udaÅ‚o siÄ™ wczytać zdalnych mapowaÅ„", + "flash.woo.syncSettingsFailed": "Nie można zapisać ustawieÅ„ synchronizacji", + "flash.woo.categoryAutoMapFailed": "Automatyczne mapowanie kategorii nie powiodÅ‚o siÄ™", + "flash.woo.attributeAutoMapFailed": "Automatyczne mapowanie atrybutów nie powiodÅ‚o siÄ™", "shopify.title": "Integracja Shopify", - "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", - "shopify.adminOnly": "Only firma admins can change Shopify connection ustawienia. Synchronizuj and browse stay dostępne.", - "shopify.lockedTitle": "Połączenie Shopify zablokowane", - "shopify.noCredentialsMember": "Brak danych Shopify. Poproś administratora firmy o podłączenie sklepu. Sync i przeglądanie zamówień będą dostępne po zapisaniu i teście połączenia.", - "shopify.enterToken": "Wprowadź poświadczenia", - "shopify.noCredentials": "Brak danych Shopify. Podaj domenę *.myshopify.com oraz Client ID + secret z Dev Dashboard (lub starszy token Admin API), potem Zapisz i Przetestuj połączenie. Po migracji platformy stare sekrety nie są przenoszone — połącz ponownie świeżym tokenem.", - "shopify.allConnectors": "Wszystkie konektory sklepów", - "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", + "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", + "shopify.adminOnly": "Only firma admins can change Shopify connection ustawienia. Synchronizuj and browse stay dostÄ™pne.", + "shopify.lockedTitle": "Połączenie Shopify zablokowane", + "shopify.noCredentialsMember": "Brak danych Shopify. PoproÅ› administratora firmy o podłączenie sklepu. Sync i przeglÄ…danie zamówieÅ„ bÄ™dÄ… dostÄ™pne po zapisaniu i teÅ›cie połączenia.", + "shopify.enterToken": "Wprowadź poÅ›wiadczenia", + "shopify.noCredentials": "Brak danych Shopify. Podaj domenÄ™ *.myshopify.com oraz Client ID + secret z Dev Dashboard (lub starszy token Admin API), potem Zapisz i Przetestuj połączenie. Po migracji platformy stare sekrety nie sÄ… przenoszone — połącz ponownie Å›wieżym tokenem.", + "shopify.allConnectors": "Wszystkie konektory sklepów", + "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", "shopify.setup.oauthNote": "Still manual: create/install the app in Shopify and paste Client ID + secret here. Descrybe does not host a one-click App Store install. Legacy permanent shpat_ tokens from older Admin custom apps still work.", "shopify.setup.scopesTitle": "Wymagane zakresy Admin API", "shopify.setup.scopesIntro": "Add these scopes on the app version in the Dev Dashboard before you release and install:", @@ -3841,154 +3842,154 @@ export const pl: MessageDict = { "shopify.setup.step5.clientId": "Client ID", "shopify.setup.step5.and": "and", "shopify.setup.step5.clientSecret": "Client secret", - "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", + "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", "shopify.setup.step5.save": "Save", - "shopify.setup.step5.arrow": "→", + "shopify.setup.step5.arrow": "→", "shopify.setup.step5.test": "Test Connection", "shopify.setup.step5.after": ". Descrybe stores secrets encrypted and refreshes the short-lived access token automatically.", "shopify.setup.step6.products": "Products", - "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", + "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", "shopify.setup.step6.orders": "Orders", - "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", + "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", "shopify.setup.step7.before": "No live shop yet? Enable", "shopify.setup.step7.dryRun": "Dry run", "shopify.setup.step7.after": "(or use the special dry-run access token) to walk through the flow without calling Shopify.", "shopify.setup.openDevDashboard": "Open Dev Dashboard", "shopify.setup.openDevelopApps": "Open shop Develop apps", "shopify.setup.openDevelopAppsNeedDomain": "Enter your shop domain below to unlock a direct Admin link for this store.", - "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", + "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", "shopify.setup.copyScopes": "Copy required scopes", "shopify.setup.scopesCopied": "Scopes copied", "shopify.setup.docsCreate": "Create app docs", "shopify.setup.docsTokens": "Access token docs", - "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", + "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", "shopify.setup.hideLegacyToken": "Hide legacy token field", - "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", + "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", "shopify.field.clientId": "Client ID", "shopify.field.clientSecret": "Client secret", - "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", + "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", "shopify.field.accessTokenHelp": "Only for custom apps created in Shopify Admin before January 2026. New apps should use Client ID + secret instead.", "shopify.placeholder.clientId": "Client ID from Dev Dashboard", - "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", + "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", "shopify.placeholder.clientSecret": "Client secret", - "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", + "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", "shopify.setup.scope.write_products": "write_products", - "shopify.setup.scope.write_productsWhy": "Tworzenie i aktualizacja produktów w Shopify (push wychodzący)", + "shopify.setup.scope.write_productsWhy": "Tworzenie i aktualizacja produktów w Shopify (push wychodzÄ…cy)", "shopify.setup.scope.read_products": "read_products", - "shopify.setup.scope.read_productsWhy": "Znajdowanie istniejących produktów po SKU przed aktualizacją", + "shopify.setup.scope.read_productsWhy": "Znajdowanie istniejÄ…cych produktów po SKU przed aktualizacjÄ…", "shopify.setup.scope.read_orders": "read_orders", - "shopify.setup.scope.read_ordersWhy": "Import zamówień do Descrybe (przychodzący)", - "shopify.setup.step1": "Jeśli łączyłeś Shopify przed migracją platformy: utwórz nową aplikację Dev Dashboard (lub połącz ponownie świeżym tokenem legacy) — stare zapisane sekrety nie są przenoszone.", + "shopify.setup.scope.read_ordersWhy": "Import zamówieÅ„ do Descrybe (przychodzÄ…cy)", + "shopify.setup.step1": "JeÅ›li łączyÅ‚eÅ› Shopify przed migracjÄ… platformy: utwórz nowÄ… aplikacjÄ™ Dev Dashboard (lub połącz ponownie Å›wieżym tokenem legacy) — stare zapisane sekrety nie sÄ… przenoszone.", "shopify.setup.step2.before": "Open the", "shopify.setup.step2.path": "Shopify Dev Dashboard", - "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", + "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", "shopify.setup.step3.before": "Create a version: set App URL (default home is fine for API-only), add scopes", "shopify.setup.step3.after": ".", "shopify.setup.step4.before": "From the app Home tab,", "shopify.setup.step4.after": "on your store (merchant must approve scopes).", - "shopify.testSectionTitle": "Zweryfikuj połączenie", - "shopify.testHint": "Najpierw zapisz domenę sklepu i token, potem uruchom Testuj połączenie. Udany test potwierdza token i zakresy przed kolejkowaniem sync.", - "shopify.overwriteTitle": "Nadpisać produkty Shopify?", - "shopify.overwriteBodyCount": "To ustawia w kolejce wychodzący push produktów. {count} wcześniej powiązany(ch) produkt(ów) Shopify może zostać zaktualizowany treścią Descrybe.", - "shopify.overwriteBody": "To ustawia w kolejce wychodzący push produktów. Pasujące produkty Shopify mogą zostać zaktualizowane treścią Descrybe.", - "shopify.credentialsTitle": "Poświadczenia sklepu", - "shopify.credentialsDesc.before": "Domena sklepu musi być Twoja", + "shopify.testSectionTitle": "Zweryfikuj połączenie", + "shopify.testHint": "Najpierw zapisz domenÄ™ sklepu i token, potem uruchom Testuj połączenie. Udany test potwierdza token i zakresy przed kolejkowaniem sync.", + "shopify.overwriteTitle": "Nadpisać produkty Shopify?", + "shopify.overwriteBodyCount": "To ustawia w kolejce wychodzÄ…cy push produktów. {count} wczeÅ›niej powiÄ…zany(ch) produkt(ów) Shopify może zostać zaktualizowany treÅ›ciÄ… Descrybe.", + "shopify.overwriteBody": "To ustawia w kolejce wychodzÄ…cy push produktów. PasujÄ…ce produkty Shopify mogÄ… zostać zaktualizowane treÅ›ciÄ… Descrybe.", + "shopify.credentialsTitle": "PoÅ›wiadczenia sklepu", + "shopify.credentialsDesc.before": "Domena sklepu musi być Twoja", "shopify.credentialsDesc.code": "*.myshopify.com", "shopify.credentialsDesc.after": "domain. Prefer Dev Dashboard Client ID + secret; legacy Admin API tokens still work.", "shopify.field.shopDomain": "Domena sklepu", - "shopify.field.accessToken": "Token dostępu Admin API", + "shopify.field.accessToken": "Token dostÄ™pu Admin API", "shopify.field.apiVersion": "Wersja API", - "shopify.placeholder.tokenKeep": "******** (pozostaw puste, aby zachować)", - "shopify.enableSync": "Włącz wypychanie produktów (Descrybe → Shopify)", - "shopify.dryRunLabel": "Dry run (bez live wywołań Shopify)", - "shopify.ordersTitle": "Import zamówień (Shopify → Descrybe)", - "shopify.ordersDesc": "Shopify → Descrybe — pobiera zamówienia i pozycje do Descrybe (nie zapisuje z powrotem do Shopify).", - "shopify.ordersNeedsReconnect": "Import zamówień nie może działać, dopóki dane logowania nie zostaną ponownie połączone po migracji. W zakładce Połączenie: Zapisz, potem Przetestuj połączenie.", + "shopify.placeholder.tokenKeep": "******** (pozostaw puste, aby zachować)", + "shopify.enableSync": "Włącz wypychanie produktów (Descrybe → Shopify)", + "shopify.dryRunLabel": "Dry run (bez live wywoÅ‚aÅ„ Shopify)", + "shopify.ordersTitle": "Import zamówieÅ„ (Shopify → Descrybe)", + "shopify.ordersDesc": "Shopify → Descrybe — pobiera zamówienia i pozycje do Descrybe (nie zapisuje z powrotem do Shopify).", + "shopify.ordersNeedsReconnect": "Import zamówieÅ„ nie może dziaÅ‚ać, dopóki dane logowania nie zostanÄ… ponownie połączone po migracji. W zakÅ‚adce Połączenie: Zapisz, potem Przetestuj połączenie.", "shopify.notesTitle": "Uwagi", - "shopify.notesDesc": "Możliwości konektora Shopify", - "shopify.notes.productsLabel": "Produkty (Descrybe → Shopify)", - "shopify.notes.productsBody": "— przetworzone produkty Descrybe są tworzone lub aktualizowane w Shopify (dopasowanie SKU przez GraphQL, gdy brak cache’owanego id produktu Shopify). Re-sync może nadpisać pasujące pola zdalne.", - "shopify.notes.ordersLabel": "Zamówienia (Shopify → Descrybe)", - "shopify.notes.ordersBody": "— pobrane do raportów i przyszłych procesów audience.", + "shopify.notesDesc": "MożliwoÅ›ci konektora Shopify", + "shopify.notes.productsLabel": "Produkty (Descrybe → Shopify)", + "shopify.notes.productsBody": "— przetworzone produkty Descrybe sÄ… tworzone lub aktualizowane w Shopify (dopasowanie SKU przez GraphQL, gdy brak cache’owanego id produktu Shopify). Re-sync może nadpisać pasujÄ…ce pola zdalne.", + "shopify.notes.ordersLabel": "Zamówienia (Shopify → Descrybe)", + "shopify.notes.ordersBody": "— pobrane do raportów i przyszÅ‚ych procesów audience.", "shopify.notes.reviewsLabel": "Recenzje", "shopify.notes.reviewsBody": "-- not wsparcieed. Shopify has no first-party produkt reviews Admin API (third-party review apps are out of scope here).", "shopify.notes.encryption.before": "Tokeny are encrypted at rest with", "woo.title": "Integracja WooCommerce", - "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", + "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", "woo.allStores": "Wszystkie sklepy", - "woo.adminOnly": "Tylko administratorzy firmy mogą zmieniać połączenie i mapowanie WooCommerce. Synchronizacja i przeglądanie pozostają dostępne.", - "woo.enterCredentials": "Wprowadź poświadczenia", - "woo.noCredentials": "Brak danych WooCommerce. Podaj URL sklepu, utwórz w WordPress klucz REST API Read/Write, wklej Consumer Key i Secret, potem Zapisz i Przetestuj połączenie. Po migracji platformy stare sekrety nie są przenoszone — połącz ponownie świeżym kluczem.", - "woo.lockedTitle": "Połączenie WooCommerce zablokowane", - "woo.noCredentialsMember": "Brak danych WooCommerce. Poproś administratora firmy o podłączenie sklepu. Sync, zamówienia i recenzje będą dostępne po zapisaniu i teście połączenia.", + "woo.adminOnly": "Tylko administratorzy firmy mogÄ… zmieniać połączenie i mapowanie WooCommerce. Synchronizacja i przeglÄ…danie pozostajÄ… dostÄ™pne.", + "woo.enterCredentials": "Wprowadź poÅ›wiadczenia", + "woo.noCredentials": "Brak danych WooCommerce. Podaj URL sklepu, utwórz w WordPress klucz REST API Read/Write, wklej Consumer Key i Secret, potem Zapisz i Przetestuj połączenie. Po migracji platformy stare sekrety nie sÄ… przenoszone — połącz ponownie Å›wieżym kluczem.", + "woo.lockedTitle": "Połączenie WooCommerce zablokowane", + "woo.noCredentialsMember": "Brak danych WooCommerce. PoproÅ› administratora firmy o podłączenie sklepu. Sync, zamówienia i recenzje bÄ™dÄ… dostÄ™pne po zapisaniu i teÅ›cie połączenia.", "woo.setupDesc": "Follow these steps to create a WooCommerce REST API key in WordPress and connect it here. Descrybe never creates keys on your store for you.", - "woo.setup.step1": "Jeśli łączyłeś WooCommerce przed migracją platformy: utwórz nowy klucz REST API — stare zapisane dane nie są użyteczne.", + "woo.setup.step1": "JeÅ›li łączyÅ‚eÅ› WooCommerce przed migracjÄ… platformy: utwórz nowy klucz REST API — stare zapisane dane nie sÄ… użyteczne.", "woo.setup.step2.before": "Enter your store", "woo.setup.step2.path": "HTTPS URL", "woo.setup.step2.after": "in the form below (example: https://yourstore.com).", "woo.setup.step3.before": "In WordPress admin, open", - "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", + "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", "woo.setup.step3.after": "(or use the deep link once your store URL is filled in).", "woo.setup.step4.before": "Click", "woo.setup.step4.addKey": "Add key", "woo.setup.step4.mid": ", set permissions to", "woo.setup.step4.permissions": "Read/Write", - "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", + "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", "woo.setup.step5.before": "Paste the key and secret below, enable sync if ready, then", "woo.setup.step5.save": "Save", - "woo.setup.step5.arrow": "→", + "woo.setup.step5.arrow": "→", "woo.setup.step5.test": "Test Connection", "woo.setup.step5.after": ".", "woo.setup.step6.products": "Products", - "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", + "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", "woo.setup.step6.orders": "Orders", "woo.setup.step6.and": "and", "woo.setup.step6.reviews": "reviews", - "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", - "woo.setup.openKeys": "Otwórz klucze REST API", + "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", + "woo.setup.openKeys": "Otwórz klucze REST API", "woo.setup.addKey": "Dodaj klucz", - "woo.setup.openKeysHint": "Otwiera WordPress admin → WooCommerce → Ustawienia → Zaawansowane → REST API.", - "woo.setup.openKeysNeedUrl": "Najpierw zapisz prawidłowy URL sklepu, aby otworzyć linki admina.", + "woo.setup.openKeysHint": "Otwiera WordPress admin → WooCommerce → Ustawienia → Zaawansowane → REST API.", + "woo.setup.openKeysNeedUrl": "Najpierw zapisz prawidÅ‚owy URL sklepu, aby otworzyć linki admina.", "woo.setup.docsLink": "Dokumentacja REST API WooCommerce", - "woo.overwriteTitle": "Nadpisać produkty WooCommerce?", - "woo.overwriteBodyCount": "To ustawia w kolejce wychodzący push produktów. {count} wcześniej powiązany(ch) produkt(ów) WooCommerce może zostać zaktualizowany treścią Descrybe.", - "woo.overwriteBody": "To ustawia w kolejce wychodzący push produktów. Pasujące produkty WooCommerce mogą zostać zaktualizowane treścią Descrybe.", + "woo.overwriteTitle": "Nadpisać produkty WooCommerce?", + "woo.overwriteBodyCount": "To ustawia w kolejce wychodzÄ…cy push produktów. {count} wczeÅ›niej powiÄ…zany(ch) produkt(ów) WooCommerce może zostać zaktualizowany treÅ›ciÄ… Descrybe.", + "woo.overwriteBody": "To ustawia w kolejce wychodzÄ…cy push produktów. PasujÄ…ce produkty WooCommerce mogÄ… zostać zaktualizowane treÅ›ciÄ… Descrybe.", "woo.connectionTitle": "Store connection", "woo.connectionDesc": "Paste your store URL and a Read/Write REST API key pair. Save, then Test Connection before queuing syncs.", - "woo.enableSync": "Włącz wypychanie produktów (Descrybe → WooCommerce)", + "woo.enableSync": "Włącz wypychanie produktów (Descrybe → WooCommerce)", "woo.field.storeUrl": "URL sklepu", - "woo.field.storeUrlHelp": "Publiczny URL witryny z https. Do REST API WooCommerce i głębokich linków do panelu WordPress.", + "woo.field.storeUrlHelp": "Publiczny URL witryny z https. Do REST API WooCommerce i głębokich linków do panelu WordPress.", "woo.field.consumerKey": "Consumer Key", "woo.field.consumerSecret": "Consumer Secret", - "woo.field.credentialsHelp": "Consumer Key i Secret z odczytem/zapisem. Zostaw puste, aby zachować istniejące dane.", + "woo.field.credentialsHelp": "Consumer Key i Secret z odczytem/zapisem. Zostaw puste, aby zachować istniejÄ…ce dane.", "woo.placeholder.keep": "******** (bez zmian)", - "woo.keepCredentialsHint": "Pozostaw klucz/sekret puste przy zapisie, aby zachować istniejące poświadczenia.", - "woo.saveConfiguration": "Zapisz konfigurację", + "woo.keepCredentialsHint": "Pozostaw klucz/sekret puste przy zapisie, aby zachować istniejÄ…ce poÅ›wiadczenia.", + "woo.saveConfiguration": "Zapisz konfiguracjÄ™", "woo.categoryMappingTitle": "Mapowanie kategorii", - "woo.categoryMappingDesc": "Zmapuj wewnętrzne kategorie na kategorie WooCommerce", + "woo.categoryMappingDesc": "Zmapuj wewnÄ™trzne kategorie na kategorie WooCommerce", "woo.autoMapCategories": "Automatycznie mapuj kategorie", "woo.autoMapping": "Automatyczne mapowanie...", - "woo.refreshCategories": "Odśwież kategorie", - "woo.availableCategories": "Dostępne kategorie WooCommerce", - "woo.categoriesEmptyHint": "Przetestuj połączenie, potem odśwież, aby wczytać kategorie WooCommerce.", - "woo.attributeMappingTitle": "Mapowanie atrybutów", - "woo.attributeMappingDesc": "Zmapuj wewnętrzne atrybuty na atrybuty WooCommerce", + "woo.refreshCategories": "OdÅ›wież kategorie", + "woo.availableCategories": "DostÄ™pne kategorie WooCommerce", + "woo.categoriesEmptyHint": "Przetestuj połączenie, potem odÅ›wież, aby wczytać kategorie WooCommerce.", + "woo.attributeMappingTitle": "Mapowanie atrybutów", + "woo.attributeMappingDesc": "Zmapuj wewnÄ™trzne atrybuty na atrybuty WooCommerce", "woo.autoMapAttributes": "Automatycznie mapuj atrybuty", - "woo.refreshAttributes": "Odśwież atrybuty", - "woo.availableAttributes": "Dostępne atrybuty WooCommerce", - "woo.attributesEmptyHint": "Przetestuj połączenie, potem odśwież, aby wczytać atrybuty WooCommerce.", - "woo.ordersTitle": "Import zamówień (WooCommerce → Descrybe)", - "woo.ordersDesc": "WooCommerce → Descrybe — pobiera zamówienia i pozycje do Descrybe (nie zapisuje z powrotem do sklepu).", - "woo.ordersNeedsReconnect": "Import zamówień nie może działać, dopóki dane logowania nie zostaną ponownie połączone po migracji. W zakładce Połączenie: Zapisz, potem Przetestuj połączenie.", + "woo.refreshAttributes": "OdÅ›wież atrybuty", + "woo.availableAttributes": "DostÄ™pne atrybuty WooCommerce", + "woo.attributesEmptyHint": "Przetestuj połączenie, potem odÅ›wież, aby wczytać atrybuty WooCommerce.", + "woo.ordersTitle": "Import zamówieÅ„ (WooCommerce → Descrybe)", + "woo.ordersDesc": "WooCommerce → Descrybe — pobiera zamówienia i pozycje do Descrybe (nie zapisuje z powrotem do sklepu).", + "woo.ordersNeedsReconnect": "Import zamówieÅ„ nie może dziaÅ‚ać, dopóki dane logowania nie zostanÄ… ponownie połączone po migracji. W zakÅ‚adce Połączenie: Zapisz, potem Przetestuj połączenie.", "woo.syncSettingsTitle": "Ustawienia sync", - "woo.syncSettingsDesc": "Skonfiguruj, jak produkty są wypychane Descrybe → WooCommerce", + "woo.syncSettingsDesc": "Skonfiguruj, jak produkty sÄ… wypychane Descrybe → WooCommerce", "woo.matchStrategy": "Produkt Matching Strategy", - "woo.matchStrategyHelp": "Wypychanie produktów (Descrybe → WooCommerce) dopasowuje produkty zdalne po SKU lub EAN/GTIN. Kolejkuj sync z karty Połączenie (ręcznie).", + "woo.matchStrategyHelp": "Wypychanie produktów (Descrybe → WooCommerce) dopasowuje produkty zdalne po SKU lub EAN/GTIN. Kolejkuj sync z karty Połączenie (rÄ™cznie).", "woo.lastSyncLabel": "Ostatnia sync", "woo.saveSyncSettings": "Zapisz ustawienia sync", "woo.match.sku": "SKU", "woo.match.ean": "EAN/GTIN", - "plan.feature.section.shell": "Powłoka", + "plan.feature.section.shell": "PowÅ‚oka", "plan.feature.section.dashboard": "Panel", "plan.feature.section.catalog": "Katalog", "plan.feature.section.feeds": "Feedy", @@ -3999,143 +4000,143 @@ export const pl: MessageDict = { "plan.feature.section.billing": "Rozliczenia", "plan.feature.section.settings": "Ustawienia", "plan.feature.section.support": "Wsparcie", - "plan.feature.section.capabilities": "Możliwości", + "plan.feature.section.capabilities": "MożliwoÅ›ci", "plan.feature.shell.navigation": "Nawigacja boczna", - "plan.feature.shell.command_palette": "Paleta poleceń", - "plan.feature.shell.company_switcher": "Przełącznik firmy", - "plan.feature.shell.support_notifications": "Dzwonek powiadomień wsparcia", + "plan.feature.shell.command_palette": "Paleta poleceÅ„", + "plan.feature.shell.company_switcher": "Przełącznik firmy", + "plan.feature.shell.support_notifications": "Dzwonek powiadomieÅ„ wsparcia", "plan.feature.shell.tutorial": "Samouczek produktu", "plan.feature.shell.account_menu": "Menu konta", - "plan.feature.shell.billing_recovery_banner": "Baner odzyskiwania rozliczeń", - "plan.feature.dashboard.overview": "Przegląd panelu", + "plan.feature.shell.billing_recovery_banner": "Baner odzyskiwania rozliczeÅ„", + "plan.feature.dashboard.overview": "PrzeglÄ…d panelu", "plan.feature.dashboard.stats": "Karty statystyk", "plan.feature.dashboard.quick_links": "Szybkie linki", "plan.feature.dashboard.recent_jobs": "Ostatnie zadania", - "plan.feature.dashboard.news_feed": "Kanał aktualności", + "plan.feature.dashboard.news_feed": "KanaÅ‚ aktualnoÅ›ci", "plan.feature.dashboard.activation_checklist": "Lista aktywacji", "plan.feature.dashboard.migrated_checklist": "Lista migrowanej kohorty", "plan.feature.dashboard.etl_gaps": "Panel luk ETL", - "plan.feature.dashboard.store_reconnect": "Baner ponownego połączenia sklepu", + "plan.feature.dashboard.store_reconnect": "Baner ponownego połączenia sklepu", "plan.feature.dashboard.upgrade_banners": "Banery ulepszenia", "plan.feature.catalog.products": "Produkty", - "plan.feature.catalog.products.tab_processed": "Produkty - zakładka Przetworzone", - "plan.feature.catalog.products.tab_needs_review": "Produkty - zakładka Do sprawdzenia", - "plan.feature.catalog.products.tab_error": "Produkty - zakładka Błąd", - "plan.feature.catalog.products.tab_processing": "Produkty - zakładka Przetwarzanie", - "plan.feature.catalog.products.tab_unprocessed": "Produkty - zakładka Nieprzetworzone", + "plan.feature.catalog.products.tab_processed": "Produkty - zakÅ‚adka Przetworzone", + "plan.feature.catalog.products.tab_needs_review": "Produkty - zakÅ‚adka Do sprawdzenia", + "plan.feature.catalog.products.tab_error": "Produkty - zakÅ‚adka Błąd", + "plan.feature.catalog.products.tab_processing": "Produkty - zakÅ‚adka Przetwarzanie", + "plan.feature.catalog.products.tab_unprocessed": "Produkty - zakÅ‚adka Nieprzetworzone", "plan.feature.catalog.products.process_categories": "Przetwarzaj kategorie", "plan.feature.catalog.products.process_attributes": "Przetwarzaj atrybuty / specyfikacje", - "plan.feature.catalog.products.process_ai_titles": "Przetwarzaj tytuły AI", + "plan.feature.catalog.products.process_ai_titles": "Przetwarzaj tytuÅ‚y AI", "plan.feature.catalog.products.process_ai_descriptions": "Przetwarzaj opisy AI", - "plan.feature.catalog.products.enrichment_review": "Panel przeglądu wzbogacenia", + "plan.feature.catalog.products.enrichment_review": "Panel przeglÄ…du wzbogacenia", "plan.feature.catalog.products.export_selection": "Eksportuj wybrane produkty", - "plan.feature.catalog.products.upgrade_prompt": "Monity ulepszenia produktów", + "plan.feature.catalog.products.upgrade_prompt": "Monity ulepszenia produktów", "plan.feature.catalog.categories": "Kategorie", - "plan.feature.catalog.categories.title_formula": "Formuła tytułu kategorii", - "plan.feature.catalog.categories.description_formula": "Formuła opisu kategorii", + "plan.feature.catalog.categories.title_formula": "FormuÅ‚a tytuÅ‚u kategorii", + "plan.feature.catalog.categories.description_formula": "FormuÅ‚a opisu kategorii", "plan.feature.catalog.attributes": "Atrybuty", - "plan.feature.catalog.attributes.bulk_import": "Masowy import atrybutów", + "plan.feature.catalog.attributes.bulk_import": "Masowy import atrybutów", "plan.feature.catalog.standard_fields": "Pola standardowe", - "plan.feature.catalog.standard_fields.groups": "Grupy pól standardowych", + "plan.feature.catalog.standard_fields.groups": "Grupy pól standardowych", "plan.feature.catalog.structured_descriptions": "Pola opisu strukturalnego", "plan.feature.catalog.vector_categories": "Kategorie wektorowe", "plan.feature.feeds.list": "Feedy importu", "plan.feature.feeds.add_url": "Dodaj URL feedu", - "plan.feature.feeds.add_csv": "Dodaj feed przez przesłanie CSV", + "plan.feature.feeds.add_csv": "Dodaj feed przez przesÅ‚anie CSV", "plan.feature.feeds.sync": "Synchronizuj feed", "plan.feature.feeds.mapping": "Mapowanie feedu", "plan.feature.feeds.mapping.select_item": "Mapowanie - wybierz element item", "plan.feature.feeds.mapping.map_fields": "Mapowanie - mapuj pola", "plan.feature.feeds.export_feeds": "Feedy eksportu", - "plan.feature.feeds.export_feeds.create": "Utwórz feed eksportu", + "plan.feature.feeds.export_feeds.create": "Utwórz feed eksportu", "plan.feature.feeds.export_feeds.generate": "Generuj feed eksportu", - "plan.feature.feeds.uploads": "Przesyłanie plików", - "plan.feature.stores.hub": "Hub sklepów", + "plan.feature.feeds.uploads": "PrzesyÅ‚anie plików", + "plan.feature.stores.hub": "Hub sklepów", "plan.feature.stores.woocommerce": "Integracja WooCommerce", - "plan.feature.stores.woocommerce.connection": "Połączenie WooCommerce", + "plan.feature.stores.woocommerce.connection": "Połączenie WooCommerce", "plan.feature.stores.woocommerce.categories": "Sync kategorii WooCommerce", - "plan.feature.stores.woocommerce.attributes": "Sync atrybutów WooCommerce", - "plan.feature.stores.woocommerce.orders": "Zamówienia WooCommerce", + "plan.feature.stores.woocommerce.attributes": "Sync atrybutów WooCommerce", + "plan.feature.stores.woocommerce.orders": "Zamówienia WooCommerce", "plan.feature.stores.woocommerce.reviews": "Recenzje WooCommerce", "plan.feature.stores.woocommerce.settings": "Ustawienia WooCommerce", "plan.feature.stores.shopify": "Integracja Shopify", - "plan.feature.stores.shopify.connection": "Połączenie Shopify", - "plan.feature.stores.shopify.orders": "Zamówienia Shopify", + "plan.feature.stores.shopify.connection": "Połączenie Shopify", + "plan.feature.stores.shopify.orders": "Zamówienia Shopify", "plan.feature.stores.shopify.settings": "Ustawienia Shopify", "plan.feature.processing.monitor": "Monitor przetwarzania", "plan.feature.marketing.campaigns": "Kampanie", "plan.feature.marketing.campaigns.create": "Kreator nowej kampanii", "plan.feature.marketing.campaigns.generate_ai": "Generowanie kampanii AI", - "plan.feature.marketing.campaigns.send": "Wysyłka / blast kampanii", - "plan.feature.marketing.content_calendar": "Kalendarz treści", + "plan.feature.marketing.campaigns.send": "WysyÅ‚ka / blast kampanii", + "plan.feature.marketing.content_calendar": "Kalendarz treÅ›ci", "plan.feature.marketing.brand_kit": "Zestaw marki", - "plan.feature.marketing.brand_ai_apply": "Zastosuj markę AI w promptach", + "plan.feature.marketing.brand_ai_apply": "Zastosuj markÄ™ AI w promptach", "plan.feature.marketing.seo": "Rekomendacje SEO", - "plan.feature.marketing.seo.template_fill": "Wypełnianie szablonu SEO", + "plan.feature.marketing.seo.template_fill": "WypeÅ‚nianie szablonu SEO", "plan.feature.marketing.seo.ai_rewrite": "Przepisanie SEO AI", "plan.feature.marketing.reviews": "Recenzje", "plan.feature.integrations.ai": "Integracje AI", - "plan.feature.integrations.ai.byok": "Własny klucz AI", - "plan.feature.integrations.email": "Wysyłka e-mail", - "plan.feature.integrations.email.test": "Testowa wysyłka e-mail", - "plan.feature.integrations.email.blast": "Masowa wysyłka e-mail", - "plan.feature.billing.overview": "Przegląd rozliczeń", + "plan.feature.integrations.ai.byok": "WÅ‚asny klucz AI", + "plan.feature.integrations.email": "WysyÅ‚ka e-mail", + "plan.feature.integrations.email.test": "Testowa wysyÅ‚ka e-mail", + "plan.feature.integrations.email.blast": "Masowa wysyÅ‚ka e-mail", + "plan.feature.billing.overview": "PrzeglÄ…d rozliczeÅ„", "plan.feature.billing.customer_portal": "Portal klienta Stripe", - "plan.feature.billing.quick_upgrade": "Szybka płatność ulepszenia", - "plan.feature.billing.plans_compare": "Porównaj plany", - "plan.feature.billing.checkout": "Płatność Stripe", + "plan.feature.billing.quick_upgrade": "Szybka pÅ‚atność ulepszenia", + "plan.feature.billing.plans_compare": "Porównaj plany", + "plan.feature.billing.checkout": "PÅ‚atność Stripe", "plan.feature.settings.profile": "Ustawienia profilu", "plan.feature.settings.company": "Ustawienia firmy", - "plan.feature.settings.alerts": "Preferencje alertów", + "plan.feature.settings.alerts": "Preferencje alertów", "plan.feature.settings.api_keys": "Klucze API", - "plan.feature.settings.team": "Zarządzanie zespołem", - "plan.feature.settings.team_invite": "Zaproś członka zespołu", + "plan.feature.settings.team": "ZarzÄ…dzanie zespoÅ‚em", + "plan.feature.settings.team_invite": "ZaproÅ› czÅ‚onka zespoÅ‚u", "plan.feature.support.center": "Centrum wsparcia", - "plan.feature.support.ticket_create": "Nowe zgłoszenie wsparcia", - "plan.feature.support.ticket_thread": "Wątek zgłoszenia wsparcia", + "plan.feature.support.ticket_create": "Nowe zgÅ‚oszenie wsparcia", + "plan.feature.support.ticket_thread": "WÄ…tek zgÅ‚oszenia wsparcia", "plan.feature.capability.sku_cap": "Limit SKU produktu", - "plan.feature.capability.ai_credits": "Portfel kredytów AI", + "plan.feature.capability.ai_credits": "Portfel kredytów AI", "plan.feature.capability.ai_processing": "Zadania przetwarzania AI", "plan.feature.capability.eprel": "Wzbogacenie EPREL", - "plan.feature.capability.normalize_specs_fill": "Normalizuj / specyfikacje / uzupełnij", + "plan.feature.capability.normalize_specs_fill": "Normalizuj / specyfikacje / uzupeÅ‚nij", "plan.feature.capability.campaign_ai": "Generowanie kampanii AI", "plan.feature.capability.email_live_send": "Live dostarczanie e-mail", - "plan.feature.capability.brand_ai_apply": "Głos marki w promptach AI", + "plan.feature.capability.brand_ai_apply": "GÅ‚os marki w promptach AI", "plan.feature.capability.seo_ai_rewrite": "Przepisanie SEO AI", - "plan.feature.capability.feed_source_limit": "Limit źródeł feedu (marketing)", - "plan.feature.capability.export_feed_limit": "Limit feedów eksportu (marketing)", - "plan.feature.capability.storage_limit": "Limit pamięci (marketing)", - "plan.feature.capability.api_access": "Dostęp do API REST (marketing)", - "plan.feature.capability.byok": "Własny klucz AI", - "billing.plan.free": "Bezpłatny", + "plan.feature.capability.feed_source_limit": "Limit źródeÅ‚ feedu (marketing)", + "plan.feature.capability.export_feed_limit": "Limit feedów eksportu (marketing)", + "plan.feature.capability.storage_limit": "Limit pamiÄ™ci (marketing)", + "plan.feature.capability.api_access": "DostÄ™p do API REST (marketing)", + "plan.feature.capability.byok": "WÅ‚asny klucz AI", + "billing.plan.free": "BezpÅ‚atny", "products.actions.selectAll": "Zaznacz wszystko", - "products.actions.upgradeSuffix": " · ulepsz", + "products.actions.upgradeSuffix": " · ulepsz", "products.actions.upgradeRequired": "{label} (wymagane ulepszenie)", - "products.actions.free": "bezpłatne", - "products.actions.credits": "{credits} kredytów", + "products.actions.free": "bezpÅ‚atne", + "products.actions.credits": "{credits} kredytów", "products.actions.autoCategorizeTitle": "Automatyczne dodawanie kategoryzacji", "products.actions.autoCategorizeBody": "{count} produkt(y) wymaga kategoryzacji do przetwarzania {types}", - "products.actions.aiLocked": "Opcje AI są zablokowane na Free. Ulepsz plan, aby przetwarzać tytuły/opisy.", - "products.actions.processSelected": "Przetwórz zaznaczone", + "products.actions.aiLocked": "Opcje AI sÄ… zablokowane na Free. Ulepsz plan, aby przetwarzać tytuÅ‚y/opisy.", + "products.actions.processSelected": "Przetwórz zaznaczone", "products.actions.markProcessed": "Oznacz jako przetworzone", "products.actions.resetUnprocessed": "Zresetuj do nieprzetworzonych", "products.actions.export": "Eksportuj", - "products.upload.dropHint": "Upuść CSV tutaj lub kliknij, aby przeglądać", - "products.upload.supportsHint": "Obsługuje import produktów .csv (ean, name, category…)", - "products.export.chooseConfig": "Eksportuj {count} zaznaczonych produktów. Wybierz feed eksportu określający format i pola.", - "products.export.selectPlaceholder": "Wybierz feed eksportu…", + "products.upload.dropHint": "Upuść CSV tutaj lub kliknij, aby przeglÄ…dać", + "products.upload.supportsHint": "ObsÅ‚uguje import produktów .csv (ean, name, category…)", + "products.export.chooseConfig": "Eksportuj {count} zaznaczonych produktów. Wybierz feed eksportu okreÅ›lajÄ…cy format i pola.", + "products.export.selectPlaceholder": "Wybierz feed eksportu…", "fields.typeLabel": "Typ", "fields.groupLabel": "Grupa", - "fields.selectGroup": "Wybierz grupę", - "fields.groupBelongsHint": "Grupa, do której należy to pole", + "fields.selectGroup": "Wybierz grupÄ™", + "fields.groupBelongsHint": "Grupa, do której należy to pole", "fields.addFieldShort": "Dodaj pole", - "fields.enableRecommended": "Włącz zalecane", + "fields.enableRecommended": "Włącz zalecane", "feeds.activated": "Aktywowano feed.", "feeds.deactivated": "Dezaktywowano feed.", - "feeds.syncTimeout": "Synchronizuj timed out waiting for the server. The job may still finish — open Synchronizuj History to check status.", - "feeds.createdMapHint": "Utworzono feed. Zmapuj pola przed synchronizacją.", + "feeds.syncTimeout": "Synchronizuj timed out waiting for the server. The job may still finish — open Synchronizuj History to check status.", + "feeds.createdMapHint": "Utworzono feed. Zmapuj pola przed synchronizacjÄ….", "feeds.createdPlain": "Utworzono feed.", - "feeds.createdMapDesc": "Zmapuj kolumny źródłowe na pola produktu, potem synchronizuj.", + "feeds.createdMapDesc": "Zmapuj kolumny źródÅ‚owe na pola produktu, potem synchronizuj.", "feeds.lastLiveSync": "Ostatnia udana sync feedu: {when}", "feeds.noLiveSyncProducts": "Brak udanej sync feedu. Katalog ostatnio zaktualizowany {when}.", "feeds.noDataYet": "Brak sync lub danych katalogu.", @@ -4143,82 +4144,82 @@ export const pl: MessageDict = { "products.filters.complete44": "Kompletne (4/4)", "products.filters.missingName": "Brak nazwy", "products.filters.missingDescription": "Brak opisu", - "products.filters.missingAttributes": "Brak atrybutów", + "products.filters.missingAttributes": "Brak atrybutów", "products.filters.missingCategory": "Brak kategorii", "products.filters.hasEprel": "Ma EPREL", "products.filters.noEprel": "Brak EPREL", - "products.filters.priceChanged": "Zmieniono cenę", + "products.filters.priceChanged": "Zmieniono cenÄ™", "products.filters.stockChanged": "Zmieniono stan", - "products.filters.titleChanged": "Zmieniono tytuł", + "products.filters.titleChanged": "Zmieniono tytuÅ‚", "products.filters.newFromFeed": "Nowe z feedu", "products.filters.otherFieldChange": "Inna zmiana pola", "products.filters.sortUpdatedNewest": "Zaktualizowano (najnowsze)", "products.filters.sortUpdatedOldest": "Zaktualizowano (najstarsze)", "products.filters.sortNameAsc": "Nazwa (A-Z)", "products.filters.sortNameDesc": "Nazwa (Z-A)", - "products.filters.searchPlaceholder": "Szukaj produktów...", + "products.filters.searchPlaceholder": "Szukaj produktów...", "products.filters.searchCategories": "Szukaj kategorii...", "products.filters.selectFeed": "Wybierz feed", - "products.filters.loadingFeeds": "Ładowanie feedów…", - "products.table.loading": "Ładowanie produktów", + "products.filters.loadingFeeds": "Ładowanie feedów…", + "products.table.loading": "Ładowanie produktów", "products.table.uncategorized": "Bez kategorii", - "products.table.assignCategory": "Przypisz kategorię", - "products.table.changeCategory": "Zmień kategorię dla {name}", - "products.table.selectCategory": "Wybierz kategorię…", - "products.table.saveCategory": "Zapisz kategorię", - "products.table.cancelCategory": "Anuluj edycję kategorii", - "products.table.categoryRequired": "Wybierz kategorię", - "products.table.noCategoriesAvailable": "Brak kategorii — utwórz jedną w Katalogu", - "products.table.qualityUnavailable": "Jakość niedostępna", - "products.table.full": "Pełny", + "products.table.assignCategory": "Przypisz kategoriÄ™", + "products.table.changeCategory": "ZmieÅ„ kategoriÄ™ dla {name}", + "products.table.selectCategory": "Wybierz kategorię…", + "products.table.saveCategory": "Zapisz kategoriÄ™", + "products.table.cancelCategory": "Anuluj edycjÄ™ kategorii", + "products.table.categoryRequired": "Wybierz kategoriÄ™", + "products.table.noCategoriesAvailable": "Brak kategorii — utwórz jednÄ… w Katalogu", + "products.table.qualityUnavailable": "Jakość niedostÄ™pna", + "products.table.full": "PeÅ‚ny", "products.table.empty": "Puste", - "products.table.saveName": "Zapisz nazwę", - "products.table.cancelRename": "Anuluj zmianę nazwy", + "products.table.saveName": "Zapisz nazwÄ™", + "products.table.cancelRename": "Anuluj zmianÄ™ nazwy", "products.table.noSyncYet": "Brak sync", - "products.feedSync.feedAndWhen": "{feed} · {when}", + "products.feedSync.feedAndWhen": "{feed} · {when}", "products.feedSync.syncedWhen": "Zsynchronizowano {when}", "products.table.productOptions": "Opcje produktu", - "products.edit.details": "Szczegóły produktu", + "products.edit.details": "Szczegóły produktu", "products.edit.noEprel": "Brak id EPREL na tym produkcie.", - "products.edit.specsPresent": "Specyfikacje techniczne są obecne na tym produkcie.", + "products.edit.specsPresent": "Specyfikacje techniczne sÄ… obecne na tym produkcie.", "products.edit.noEnrichedName": "Brak wzbogaconej nazwy", - "products.edit.resetName": "Zresetuj wzbogaconą nazwę do oryginału", - "products.edit.cannotClearName": "Oryginał jest pusty — nie można wyczyścić wzbogaconej nazwy przez PATCH", - "products.edit.showPreview": "Pokaż podgląd", + "products.edit.resetName": "Zresetuj wzbogaconÄ… nazwÄ™ do oryginaÅ‚u", + "products.edit.cannotClearName": "OryginaÅ‚ jest pusty — nie można wyczyÅ›cić wzbogaconej nazwy przez PATCH", + "products.edit.showPreview": "Pokaż podglÄ…d", "products.edit.editHtml": "Edytuj HTML", "products.edit.noEnrichedDescription": "Brak wzbogaconego opisu", - "products.edit.resetDescription": "Zresetuj wzbogacony opis do oryginału", - "products.edit.cannotClearDescription": "Oryginał jest pusty — nie można wyczyścić wzbogaconego opisu przez PATCH", + "products.edit.resetDescription": "Zresetuj wzbogacony opis do oryginaÅ‚u", + "products.edit.cannotClearDescription": "OryginaÅ‚ jest pusty — nie można wyczyÅ›cić wzbogaconego opisu przez PATCH", "products.edit.unknownFeed": "Nieznany feed", "products.edit.noProcessedName": "Brak przetworzonej nazwy", - "products.edit.feedNamed": "Feed · {name}", + "products.edit.feedNamed": "Feed · {name}", "products.edit.noAiDescription": "Brak opisu AI", - "products.edit.sourceLabel": "Etykieta źródła", - "products.edit.coverageTitle": "Ile spośród Nazwa, Opis, Atrybuty i Kategoria jest obecnych (feed lub przetworzone).", + "products.edit.sourceLabel": "Etykieta źródÅ‚a", + "products.edit.coverageTitle": "Ile spoÅ›ród Nazwa, Opis, Atrybuty i Kategoria jest obecnych (feed lub przetworzone).", "products.edit.coverageReady": "{count}/4 gotowe", "products.edit.eprelPresentTitle": "Id European Product Registry for Energy Labelling (EPREL) jest obecne na tym produkcie.", "products.edit.noEprelBadge": "Brak EPREL", "products.edit.specsBadge": "Specyfikacje", - "products.edit.reviewBannerTitle": "Przejrzyj wzbogacone pola przed akceptacją", - "products.edit.reviewBannerHelp": "Użyj karty Przegląd, aby porównać oryginały z AI. Skróty: A akceptuj · R odrzuć · Alt+1/2 pole · ⌘/Ctrl+Enter zaakceptuj wszystko.", + "products.edit.reviewBannerTitle": "Przejrzyj wzbogacone pola przed akceptacjÄ…", + "products.edit.reviewBannerHelp": "Użyj karty PrzeglÄ…d, aby porównać oryginaÅ‚y z AI. Skróty: A akceptuj · R odrzuć · Alt+1/2 pole · ⌘/Ctrl+Enter zaakceptuj wszystko.", "products.edit.tab.review": "Przejrzyj", - "products.edit.tab.details": "Szczegóły", - "products.edit.tab.content": "Treść", + "products.edit.tab.details": "Szczegóły", + "products.edit.tab.content": "Treść", "products.edit.tab.attributes": "Atrybuty", "products.edit.tab.feed": "Feed", "products.edit.changed": "Zmieniono", "products.edit.matched": "Dopasowane", - "products.edit.original": "Oryginał", + "products.edit.original": "OryginaÅ‚", "products.edit.enriched": "Wzbogacone", - "products.edit.discardName": "Odrzuć nazwę", - "products.edit.acceptName": "Zaakceptuj nazwę", - "products.edit.discardDescription": "Odrzuć opis", + "products.edit.discardName": "Odrzuć nazwÄ™", + "products.edit.acceptName": "Zaakceptuj nazwÄ™", + "products.edit.discardDescription": "Odrzuć opis", "products.edit.acceptDescription": "Zaakceptuj opis", "products.edit.noCategory": "No Kategoria", - "products.edit.whatsFilledIn": "Co jest wypełnione", - "products.edit.coverageLegend": "Szary = brak · Pomarańczowy = z feedu · Zielony = przetworzone", - "products.edit.feedSource": "Źródło feedu", - "products.edit.updatedRelative": "· zaktualizowano {when}", + "products.edit.whatsFilledIn": "Co jest wypeÅ‚nione", + "products.edit.coverageLegend": "Szary = brak · PomaraÅ„czowy = z feedu · Zielony = przetworzone", + "products.edit.feedSource": "ŹródÅ‚o feedu", + "products.edit.updatedRelative": "· zaktualizowano {when}", "products.edit.viewAllFeedFields": "Zobacz all feed fields ({filled}/{total})", "products.edit.productIdentity": "Produkt identity", "products.edit.aiProcessedName": "Nazwa przetworzona przez AI", @@ -4226,425 +4227,425 @@ export const pl: MessageDict = { "products.edit.productIdSku": "Produkt ID / SKU", "products.edit.rowUpdated": "Wiersz produktu zaktualizowany {when}", "products.edit.noRawUpdateTime": "No raw produkt update time", - "products.edit.feedSyncLabel": "· sync feedu {when}", + "products.edit.feedSyncLabel": "· sync feedu {when}", "products.edit.neverRecorded": "nigdy nie zarejestrowano", - "products.edit.feedFilledCount": "{filled} wypełnione · {total} pól", + "products.edit.feedFilledCount": "{filled} wypeÅ‚nione · {total} pól", "products.edit.noMappedFeedFields": "No mapped feed fields on this produkt.", "products.edit.fieldCol": "Pole", - "products.edit.valueFromFeed": "Wartość from feed", - "products.edit.core": "Rdzeń", + "products.edit.valueFromFeed": "Wartość from feed", + "products.edit.core": "RdzeÅ„", "products.edit.aiProcessedDescription": "AI-Processed Opis", "products.edit.originalDescription": "Oryginalny opis", "products.edit.noAttrsYet": "No atrybut or specification data on this produkt yet.", "products.edit.fromFeed": "Z feedu", - "products.edit.feedAttrsHelp": "Wartości sparsowane z feedu (specyfikacje HTML, gwarancja, wymiary, EPREL). Klucze są łączone z attribute_key, gdy to możliwe.", - "products.edit.fieldsCount": "{count} pól", + "products.edit.feedAttrsHelp": "WartoÅ›ci sparsowane z feedu (specyfikacje HTML, gwarancja, wymiary, EPREL). Klucze sÄ… łączone z attribute_key, gdy to możliwe.", + "products.edit.fieldsCount": "{count} pól", "products.edit.originalAttributes": "Oryginalne atrybuty", "products.edit.aiAttributes": "Atrybuty AI / wzbogacone", "products.edit.editableAttributes": "Edytowalne atrybuty", - "products.edit.editableAttributesHelp": "Zmiany zapisują się w mapie atrybutów produktu. Wiersze feedu i AI poniżej pozostają jako odniesienie, gdy się różnią.", + "products.edit.editableAttributesHelp": "Zmiany zapisujÄ… siÄ™ w mapie atrybutów produktu. Wiersze feedu i AI poniżej pozostajÄ… jako odniesienie, gdy siÄ™ różniÄ….", "products.edit.addAttribute": "Dodaj atrybut", "products.edit.attrKeyPlaceholder": "Klucz", - "products.edit.attrValuePlaceholder": "Wartość", - "products.edit.removeAttribute": "Usuń {key}", - "products.edit.noEditableAttrs": "Brak edytowalnych atrybutów. Dodaj parę klucz/wartość.", - "products.edit.reject": "Odrzuć", + "products.edit.attrValuePlaceholder": "Wartość", + "products.edit.removeAttribute": "UsuÅ„ {key}", + "products.edit.noEditableAttrs": "Brak edytowalnych atrybutów. Dodaj parÄ™ klucz/wartość.", + "products.edit.reject": "Odrzuć", "products.edit.accept": "Zaakceptuj", "taskIndicator.title": "Zadania w tle", "taskIndicator.activeOne": "1 zadanie w toku", - "taskIndicator.activeMany": "{count} zadań w toku", - "taskIndicator.view": "Zobacz postęp", - "taskIndicator.expand": "Rozwiń listę zadań", - "taskIndicator.collapse": "Zwiń listę zadań", - "taskIndicator.progressAria": "Postęp zadania {pct} procent", - "taskIndicator.progressCounts": "{done} z {total} produktów", + "taskIndicator.activeMany": "{count} zadaÅ„ w toku", + "taskIndicator.view": "Zobacz postÄ™p", + "taskIndicator.expand": "RozwiÅ„ listÄ™ zadaÅ„", + "taskIndicator.collapse": "ZwiÅ„ listÄ™ zadaÅ„", + "taskIndicator.progressAria": "PostÄ™p zadania {pct} procent", + "taskIndicator.progressCounts": "{done} z {total} produktów", "attributes.assignBulk": "Przypisz do kategorii", "products.filters.search": "Szukaj", "products.filters.sortAria": "Sortowanie: {label}", "products.filters.sortLabel": "Sortowanie: {label}", "products.table.colIdName": "ID/Nazwa", "products.table.colCoverage": "Pokrycie", - "products.table.coverageTitle": "Pokrycie: N=Nazwa, D=Opis, A=Atrybuty, C=Kategoria. Szary=brak, pomarańczowy=z feedu, zielony=przetworzone. EPREL pokazuje id rejestru etykiety energetycznej.", + "products.table.coverageTitle": "Pokrycie: N=Nazwa, D=Opis, A=Atrybuty, C=Kategoria. Szary=brak, pomaraÅ„czowy=z feedu, zielony=przetworzone. EPREL pokazuje id rejestru etykiety energetycznej.", "products.table.colFeed": "Feed", "products.table.colCategory": "Kategoria", "products.table.colStatus": "Stan", "products.table.colUpdated": "Ostatnia aktualizacja", "products.table.colActions": "Akcje", - "products.table.loadingDots": "Wczytywanie produktów…", + "products.table.loadingDots": "Wczytywanie produktów…", "products.table.noneFound": "Nie znaleziono: produkty.", "products.table.selectProduct": "Wybierz produkt {name}", - "products.table.rename": "Zmień nazwę {name}", + "products.table.rename": "ZmieÅ„ nazwÄ™ {name}", "products.table.productNameAria": "Nazwa produktu dla {name}", "products.table.selectPage": "Wybierz {count} on this page", "products.table.deselectPage": "Odznacz {count} na tej stronie", "categories.assign": "Przypisz", - "categories.titleFormulaSubtitle": "Skonfiguruj, jak mają być generowane tytuły produktów dla {name}", + "categories.titleFormulaSubtitle": "Skonfiguruj, jak majÄ… być generowane tytuÅ‚y produktów dla {name}", "categories.addText": "Dodaj tekst", - "categories.aboutTitleFormulas": "O formułach tytułu", - "categories.aboutTitleFormulasHelp": "Tytuły są składane od lewej do prawej z poniższych elementów.", - "categories.variablesReplacedHelp": "Zmienne są zastępowane danymi produktu, gdy są dostępne. Brakujące wartości są pomijane.", - "categories.variableTypeHelp": "Dynamiczne pole z danych produktu (przykład: marka).", - "categories.textTypeHelp": "Tekst statyczny, który zawsze pojawia się tak, jak zapisano.", - "categories.assignTitleCopyHelp": "Użyj Przypisz, aby skopiować tę formułę do innych kategorii, które powinny mieć ten sam wzorzec tytułu.", - "categories.titleFormulaInvalid": "Ta strona formuły tytułu wymaga prawidłowej kategorii. Wróć do kategorii i ponownie otwórz Edytuj formułę tytułu.", - "categories.preview.title": "Podgląd tytułu", - "categories.preview.description": "Tak będą strukturyzowane tytuły Twoich produktów", - "categories.preview.exampleTab": "Podgląd przykładowy", - "categories.preview.structureTab": "Struktura formuły", - "categories.preview.noElements": "Nie dodano jeszcze elementów", - "categories.brandTips.title": "Wskazówki związane z marką", - "categories.brandTips.freePlan": "Zestaw marki można edytować w planie Free; zastosowanie AI odblokowuje się w płatnych planach.", + "categories.aboutTitleFormulas": "O formuÅ‚ach tytuÅ‚u", + "categories.aboutTitleFormulasHelp": "TytuÅ‚y sÄ… skÅ‚adane od lewej do prawej z poniższych elementów.", + "categories.variablesReplacedHelp": "Zmienne sÄ… zastÄ™powane danymi produktu, gdy sÄ… dostÄ™pne. BrakujÄ…ce wartoÅ›ci sÄ… pomijane.", + "categories.variableTypeHelp": "Dynamiczne pole z danych produktu (przykÅ‚ad: marka).", + "categories.textTypeHelp": "Tekst statyczny, który zawsze pojawia siÄ™ tak, jak zapisano.", + "categories.assignTitleCopyHelp": "Użyj Przypisz, aby skopiować tÄ™ formułę do innych kategorii, które powinny mieć ten sam wzorzec tytuÅ‚u.", + "categories.titleFormulaInvalid": "Ta strona formuÅ‚y tytuÅ‚u wymaga prawidÅ‚owej kategorii. Wróć do kategorii i ponownie otwórz Edytuj formułę tytuÅ‚u.", + "categories.preview.title": "PodglÄ…d tytuÅ‚u", + "categories.preview.description": "Tak bÄ™dÄ… strukturyzowane tytuÅ‚y Twoich produktów", + "categories.preview.exampleTab": "PodglÄ…d przykÅ‚adowy", + "categories.preview.structureTab": "Struktura formuÅ‚y", + "categories.preview.noElements": "Nie dodano jeszcze elementów", + "categories.brandTips.title": "Wskazówki zwiÄ…zane z markÄ…", + "categories.brandTips.freePlan": "Zestaw marki można edytować w planie Free; zastosowanie AI odblokowuje siÄ™ w pÅ‚atnych planach.", "categories.brandTips.editBrandKit": "Edytuj zestaw marki", "categories.brandTips.emptyBefore": "Dodaj ton lub preferowane terminy w ", - "categories.brandTips.emptyAfter": ", aby zobaczyć wskazówki tutaj.", + "categories.brandTips.emptyAfter": ", aby zobaczyć wskazówki tutaj.", "categories.brandTips.brandKit": "Zestaw marki", - "categories.brandTips.descGuidanceBefore": "Wskazówki z Twojego ", + "categories.brandTips.descGuidanceBefore": "Wskazówki z Twojego ", "categories.brandTips.descGuidanceAfter": " dla sekcji opisu.", - "categories.formulaElementsTitle": "Elementy formuły", - "categories.formulaElementsHelp": "Przeciągnij i upuść elementy, aby zmienić ich kolejność", - "categories.noElementsAdded": "Nie dodano elementów", + "categories.formulaElementsTitle": "Elementy formuÅ‚y", + "categories.formulaElementsHelp": "PrzeciÄ…gnij i upuść elementy, aby zmienić ich kolejność", + "categories.noElementsAdded": "Nie dodano elementów", "categories.addElementsHint": "Dodaj zmienne lub tekst z panelu po prawej", "categories.editTextElementAria": "Edytuj element tekstowy {value}", - "categories.removeElementAria": "Usuń element {type} {value}", + "categories.removeElementAria": "UsuÅ„ element {type} {value}", "categories.tab.single": "Pojedynczy", - "categories.tab.bulk": "Masowe przesyłanie", + "categories.tab.bulk": "Masowe przesyÅ‚anie", "categories.uniqueIdLabel": "Unikalny ID", - "categories.parentLabel": "Nadrzędna", - "categories.noneRoot": "Brak (główna)", + "categories.parentLabel": "NadrzÄ™dna", + "categories.noneRoot": "Brak (główna)", "categories.descriptionLabel": "Opis", - "categories.csvUploadHelp": "Prześlij CSV z kolumnami name, unique_id oraz opcjonalnie parent_unique_id i description.", + "categories.csvUploadHelp": "PrzeÅ›lij CSV z kolumnami name, unique_id oraz opcjonalnie parent_unique_id i description.", "categories.downloadTemplate": "Pobierz szablon", "categories.variableNameKey": "Nazwa (klucz)", - "categories.displayName": "Nazwa wyświetlana", - "categories.exampleValue": "Wartość przykładowa", - "categories.variableExists": "Zmienna o nazwie \"{name}\" już istnieje.", - "categories.addVariable": "Dodaj zmienną", - "categories.updateVariable": "Aktualizuj zmienną", - "categories.col.displayName": "Nazwa wyświetlana", + "categories.displayName": "Nazwa wyÅ›wietlana", + "categories.exampleValue": "Wartość przykÅ‚adowa", + "categories.variableExists": "Zmienna o nazwie \"{name}\" już istnieje.", + "categories.addVariable": "Dodaj zmiennÄ…", + "categories.updateVariable": "Aktualizuj zmiennÄ…", + "categories.col.displayName": "Nazwa wyÅ›wietlana", "categories.col.key": "Klucz", "categories.col.description": "Opis", - "categories.col.example": "Przykład", + "categories.col.example": "PrzykÅ‚ad", "categories.noVariablesFound": "Nie znaleziono zmiennych", - "categories.availableVariables": "Dostępne zmienne", - "categories.manage": "Zarządzaj", - "categories.noVariablesMatch": "Żadna zmienna nie pasuje do „{query}”.", - "categories.noUnusedVariables": "Nie pozostały nieużywane zmienne. Dodaj własną zmienną lub usuń element, aby zwolnić jedną.", - "categories.exampleColon": "Przykład: {value}", + "categories.availableVariables": "DostÄ™pne zmienne", + "categories.manage": "ZarzÄ…dzaj", + "categories.noVariablesMatch": "Å»adna zmienna nie pasuje do „{query}”.", + "categories.noUnusedVariables": "Nie pozostaÅ‚y nieużywane zmienne. Dodaj wÅ‚asnÄ… zmiennÄ… lub usuÅ„ element, aby zwolnić jednÄ….", + "categories.exampleColon": "PrzykÅ‚ad: {value}", "categories.editVariableAria": "Edytuj {label}", "categories.deleteVariableAria": "Usun {label}", "categories.addVariableAria": "Dodaj {label}", "categories.textLabel": "Tekst", - "categories.textAppearsAsWritten": "Ten tekst pojawi się w tytułach dokładnie tak, jak zapisano", + "categories.textAppearsAsWritten": "Ten tekst pojawi siÄ™ w tytuÅ‚ach dokÅ‚adnie tak, jak zapisano", "categories.addTextButton": "Dodaj tekst", "categories.updateTextButton": "Aktualizuj tekst", - "categories.structureDescriptionsFor": "Ustrukturyzuj opisy produktów dla {name}", + "categories.structureDescriptionsFor": "Ustrukturyzuj opisy produktów dla {name}", "categories.metaInformation": "Informacje meta", - "categories.metaInformationHelp": "Instrukcje używane przez AI do tagów tytułu SEO i meta opisu.", - "categories.metaTitleFormula": "Formuła meta tytułu", - "categories.metaTitleHint": "Wyświetlane w wynikach wyszukiwania i kartach przeglądarki (ok. 50–60 znaków).", - "categories.metaDescriptionFormula": "Formuła meta opisu", - "categories.metaDescriptionHint": "Wyświetlane pod tytułem w wynikach wyszukiwania (ok. 120–155 znaków).", - "categories.resetToDefault": "Przywróć domyślne", + "categories.metaInformationHelp": "Instrukcje używane przez AI do tagów tytuÅ‚u SEO i meta opisu.", + "categories.metaTitleFormula": "FormuÅ‚a meta tytuÅ‚u", + "categories.metaTitleHint": "WyÅ›wietlane w wynikach wyszukiwania i kartach przeglÄ…darki (ok. 50–60 znaków).", + "categories.metaDescriptionFormula": "FormuÅ‚a meta opisu", + "categories.metaDescriptionHint": "WyÅ›wietlane pod tytuÅ‚em w wynikach wyszukiwania (ok. 120–155 znaków).", + "categories.resetToDefault": "Przywróć domyÅ›lne", "categories.descriptionSections": "Sekcje opisu", - "categories.descriptionSectionsHelp": "Przeciągnij sekcje, aby ustawić kolejność generowanego opisu.", + "categories.descriptionSectionsHelp": "PrzeciÄ…gnij sekcje, aby ustawić kolejność generowanego opisu.", "categories.noSectionsYet": "Brak jeszcze sekcji", - "categories.addSectionsHint": "Dodaj nagłówek, akapit lub listę, aby zacząć.", + "categories.addSectionsHint": "Dodaj nagłówek, akapit lub listÄ™, aby zacząć.", "categories.aiInstructions": "Instrukcje AI", "categories.exportIdOptional": "ID eksportu (opcjonalne)", - "categories.exportIdUnique": "ID eksportu musi być unikalne", - "categories.addSection": "Dodaj sekcję", - "categories.aboutDescriptionFormulas": "O formułach opisu", - "categories.aboutDescriptionFormulasHelp": "Te instrukcje mówią AI, jak pisać opisy produktów w tej kategorii.", + "categories.exportIdUnique": "ID eksportu musi być unikalne", + "categories.addSection": "Dodaj sekcjÄ™", + "categories.aboutDescriptionFormulas": "O formuÅ‚ach opisu", + "categories.aboutDescriptionFormulasHelp": "Te instrukcje mówiÄ… AI, jak pisać opisy produktów w tej kategorii.", "categories.sectionTypesHeading": "Typy sekcji", - "categories.sectionTypeHeadings": "Nagłówki (H1–H4):", - "categories.sectionTypeHeadingsHelp": "Tytuły i podtytuły", + "categories.sectionTypeHeadings": "Nagłówki (H1–H4):", + "categories.sectionTypeHeadingsHelp": "TytuÅ‚y i podtytuÅ‚y", "categories.sectionTypeParagraphs": "Akapity:", - "categories.sectionTypeParagraphsHelp": "Główne bloki treści", + "categories.sectionTypeParagraphsHelp": "Główne bloki treÅ›ci", "categories.sectionTypeLists": "Listy punktowane:", "categories.sectionTypeListsHelp": "Cechy i specyfikacje", "categories.aiInstructionsHeading": "Instrukcje AI", - "categories.aiInstructionsBody": "Napisz jedno jasne zadanie na sekcję (co uwzględnić, ton, długość). Niejasne prompt’y dają niejasny tekst.", + "categories.aiInstructionsBody": "Napisz jedno jasne zadanie na sekcjÄ™ (co uwzglÄ™dnić, ton, dÅ‚ugość). Niejasne prompt’y dajÄ… niejasny tekst.", "categories.exportIdsHeading": "ID eksportu", - "categories.exportIdsBody": "Opcjonalne ID mapują sekcję do feedów eksportu (na przykład short_description).", - "categories.assignDescCopyHelp": "Użyj Przypisz, aby skopiować ten szablon do innych kategorii o tej samej strukturze.", - "categories.descriptionFormulaInvalid": "Ta strona formuły opisu wymaga prawidłowej kategorii. Wróć do kategorii i ponownie otwórz Edytuj formułę opisu.", - "categories.sectionType.h1": "Nagłówek 1", - "categories.sectionType.h2": "Nagłówek 2", - "categories.sectionType.h3": "Nagłówek 3", - "categories.sectionType.h4": "Nagłówek 4", + "categories.exportIdsBody": "Opcjonalne ID mapujÄ… sekcjÄ™ do feedów eksportu (na przykÅ‚ad short_description).", + "categories.assignDescCopyHelp": "Użyj Przypisz, aby skopiować ten szablon do innych kategorii o tej samej strukturze.", + "categories.descriptionFormulaInvalid": "Ta strona formuÅ‚y opisu wymaga prawidÅ‚owej kategorii. Wróć do kategorii i ponownie otwórz Edytuj formułę opisu.", + "categories.sectionType.h1": "Nagłówek 1", + "categories.sectionType.h2": "Nagłówek 2", + "categories.sectionType.h3": "Nagłówek 3", + "categories.sectionType.h4": "Nagłówek 4", "categories.sectionType.p": "Akapit", "categories.sectionType.ul": "Lista punktowana", "categories.aiGenerationPrompt": "Prompt generowania AI", - "categories.aiPromptOverrides": "Zastępuje firmowy prompt użytkownika ulepszania produktu dla {name}", + "categories.aiPromptOverrides": "ZastÄ™puje firmowy prompt użytkownika ulepszania produktu dla {name}", "categories.promptTemplate": "Szablon promptu", - "categories.promptTemplateHelp": "Używaj placeholderów jak {{name}} i {{description}}. Zostaw puste, aby użyć domyślnego firmowego z Integracje → AI.", - "categories.clear": "Wyczyść", + "categories.promptTemplateHelp": "Używaj placeholderów jak {{name}} i {{description}}. Zostaw puste, aby użyć domyÅ›lnego firmowego z Integracje → AI.", + "categories.clear": "Wyczyść", "categories.promptLabel": "Prompt", - "categories.charactersCount": "{count} znaków", - "categories.activeOverride": "· aktywne nadpisanie dla tej kategorii", - "categories.usingCompanyDefault": "· używane domyślne firmowe / wbudowane", - "categories.usingCompanyDefaultForLang": "· puste dla tego języka — obowiązuje domyślny firmy / wbudowany", + "categories.charactersCount": "{count} znaków", + "categories.activeOverride": "· aktywne nadpisanie dla tej kategorii", + "categories.usingCompanyDefault": "· używane domyÅ›lne firmowe / wbudowane", + "categories.usingCompanyDefaultForLang": "· puste dla tego jÄ™zyka — obowiÄ…zuje domyÅ›lny firmy / wbudowany", "categories.aiPromptSavedLang": "Zapisano prompt AI dla {lang}.", - "categories.aiPromptClearedLang": "Wyczyszczono prompt AI dla {lang} (zastosuje się domyślny firmy).", - "contentLang.switcherLabel": "Język treści", - "contentLang.primary": "główny", - "contentLang.hasOverride": "własny", - "contentLang.addLanguage": "Dodaj język…", + "categories.aiPromptClearedLang": "Wyczyszczono prompt AI dla {lang} (zastosuje siÄ™ domyÅ›lny firmy).", + "contentLang.switcherLabel": "JÄ™zyk treÅ›ci", + "contentLang.primary": "główny", + "contentLang.hasOverride": "wÅ‚asny", + "contentLang.addLanguage": "Dodaj jÄ™zyk…", "contentLang.add": "Dodaj", - "contentLang.removeLanguage": "Usuń {lang}", - "contentLang.resultsHint": "Przełącz język, aby sprawdzić tytuły i opisy AI dla każdego języka treści.", - "contentLang.settingsTitle": "Języki treści", - "contentLang.settingsHelp": "Język główny jest używany domyślnie. Dodatkowe języki mają własne prompty i wyniki AI (każde uruchomienie zużywa kredyty).", - "ai.prompts.languageHelp": "Edytuj prompty firmowe według języka treści. Pusty język używa wbudowanej wartości domyślnej dla tego języka.", + "contentLang.removeLanguage": "UsuÅ„ {lang}", + "contentLang.resultsHint": "Przełącz jÄ™zyk, aby sprawdzić tytuÅ‚y i opisy AI dla każdego jÄ™zyka treÅ›ci.", + "contentLang.settingsTitle": "JÄ™zyki treÅ›ci", + "contentLang.settingsHelp": "JÄ™zyk główny jest używany domyÅ›lnie. Dodatkowe jÄ™zyki majÄ… wÅ‚asne prompty i wyniki AI (każde uruchomienie zużywa kredyty).", + "ai.prompts.languageHelp": "Edytuj prompty firmowe wedÅ‚ug jÄ™zyka treÅ›ci. Pusty jÄ™zyk używa wbudowanej wartoÅ›ci domyÅ›lnej dla tego jÄ™zyka.", "header.accountSettingsAria": "Ustawienia konta dla {email}", - "switcher.switchUserAria": "Przełącz użytkownika: {label}", - "switcher.unavailable": "Przełączanie użytkowników jest niedostępne w tym środowisku.", - "switcher.loadFailed": "Nie można wczytać użytkowników.", + "switcher.switchUserAria": "Przełącz użytkownika: {label}", + "switcher.unavailable": "Przełączanie użytkowników jest niedostÄ™pne w tym Å›rodowisku.", + "switcher.loadFailed": "Nie można wczytać użytkowników.", "support.notifications.aria": "Powiadomienia wsparcia", "support.notifications.ariaUnread": "Powiadomienia wsparcia, {count} nieprzeczytanych", "time.never": "Nigdy", - "time.invalid": "Nieprawidłowa data", + "time.invalid": "NieprawidÅ‚owa data", "time.unknown": "Nieznana data", - "time.justNow": "przed chwilą", - "time.neverUsed": "Nigdy nie użyto", + "time.justNow": "przed chwilÄ…", + "time.neverUsed": "Nigdy nie użyto", "billing.plan.enterprise": "Enterprise", "news.heading": "Aktualizacje platformy", "news.subtitle": "Najnowsze funkcje i ulepszenia", "news.keyFeatures": "Kluczowe funkcje:", "news.badge.new": "Nowe", - "news.footer": "To na razie wszystko — zajrzyj po kolejnej wersji.", + "news.footer": "To na razie wszystko — zajrzyj po kolejnej wersji.", "news.category.enhancement": "Ulepszenie", "news.category.feature": "Funkcja", "news.category.integration": "Integracja", "news.category.newFeature": "Nowa funkcja", "news.category.billing": "Rozliczenia", - "news.uxImprovements.description": "Lepsza użyteczność dzięki sterowaniu wycieczką, ulepszeniom API i lepszej nawigacji.", - "news.uxImprovements.f1": "Pomiń/ukryj wycieczkę", - "news.uxImprovements.f2": "Ulepszenia niezawodności API", + "news.uxImprovements.description": "Lepsza użyteczność dziÄ™ki sterowaniu wycieczkÄ…, ulepszeniom API i lepszej nawigacji.", + "news.uxImprovements.f1": "PomiÅ„/ukryj wycieczkÄ™", + "news.uxImprovements.f2": "Ulepszenia niezawodnoÅ›ci API", "news.uxImprovements.f3": "Lepsza nawigacja interfejsu", - "news.uxImprovements.f4": "Lepsza efektywność przepływu pracy", - "news.multiselect.title": "Obsługa atrybutów wielokrotnego wyboru", - "news.multiselect.description": "Produkty mogą mieć wiele wartości dla atrybutów typu lista.", + "news.uxImprovements.f4": "Lepsza efektywność przepÅ‚ywu pracy", + "news.multiselect.title": "ObsÅ‚uga atrybutów wielokrotnego wyboru", + "news.multiselect.description": "Produkty mogÄ… mieć wiele wartoÅ›ci dla atrybutów typu lista.", "news.multiselect.f1": "Typ atrybutu wielokrotnego wyboru", - "news.multiselect.f2": "Wybór wielu wartości przy edycji produktu", - "news.multiselect.f3": "Wiele wartości w jednym atrybucie", - "news.multiselect.f4": "Lepsza ekstrakcja pól wielokrotnego wyboru", - "news.multiselect.f5": "Lepsza zgodność feedów eksportu", - "news.csvEan.title": "Przesyłanie EAN z CSV", - "news.csvEan.description": "Przesyłaj pliki CSV z kodami EAN, by przetwarzać setki produktów naraz.", - "news.csvEan.f1": "Przesyłanie CSV przeciągnij i upuść", + "news.multiselect.f2": "Wybór wielu wartoÅ›ci przy edycji produktu", + "news.multiselect.f3": "Wiele wartoÅ›ci w jednym atrybucie", + "news.multiselect.f4": "Lepsza ekstrakcja pól wielokrotnego wyboru", + "news.multiselect.f5": "Lepsza zgodność feedów eksportu", + "news.csvEan.title": "PrzesyÅ‚anie EAN z CSV", + "news.csvEan.description": "PrzesyÅ‚aj pliki CSV z kodami EAN, by przetwarzać setki produktów naraz.", + "news.csvEan.f1": "PrzesyÅ‚anie CSV przeciÄ…gnij i upuść", "news.csvEan.f2": "Walidacja formatu EAN (EAN-8, EAN-13, UPC-12, GTIN-14)", - "news.csvEan.f3": "Automatyczne wykrywanie duplikatów", - "news.csvEan.f4": "Masowe przetwarzanie produktów", - "news.csvEan.f5": "Szczegółowe statystyki przetwarzania", - "news.brick.title": "Obsługa atrybutów kodu BRICK", - "news.brick.description": "System atrybutów z kodami BRICK do standaryzowanej klasyfikacji i eksportu.", - "news.brick.f1": "Obsługa atrybutów kodu BRICK", - "news.brick.f2": "Automatyczne formatowanie kodów w eksporcie", - "news.brick.f3": "Integracja kodów BRICK w feedach XML", - "news.brick.f4": "Ulepszenia zgodności feedów eksportu", + "news.csvEan.f3": "Automatyczne wykrywanie duplikatów", + "news.csvEan.f4": "Masowe przetwarzanie produktów", + "news.csvEan.f5": "Szczegółowe statystyki przetwarzania", + "news.brick.title": "ObsÅ‚uga atrybutów kodu BRICK", + "news.brick.description": "System atrybutów z kodami BRICK do standaryzowanej klasyfikacji i eksportu.", + "news.brick.f1": "ObsÅ‚uga atrybutów kodu BRICK", + "news.brick.f2": "Automatyczne formatowanie kodów w eksporcie", + "news.brick.f3": "Integracja kodów BRICK w feedach XML", + "news.brick.f4": "Ulepszenia zgodnoÅ›ci feedów eksportu", "news.apiV1.title": "Wydanie API v1", - "news.apiV1.description": "Nowe endpointy API v1 dla kategorii, atrybutów, feedów, produktów i eksportów.", + "news.apiV1.description": "Nowe endpointy API v1 dla kategorii, atrybutów, feedów, produktów i eksportów.", "news.apiV1.f1": "Endpointy RESTful API v1", - "news.apiV1.f2": "Zarządzanie kategoriami i atrybutami", - "news.apiV1.f3": "Tworzenie i zarządzanie feedami", - "news.apiV1.f4": "Przetwarzanie produktów przez API", - "news.apiV1.f5": "Programowy dostęp do feedów eksportu", + "news.apiV1.f2": "ZarzÄ…dzanie kategoriami i atrybutami", + "news.apiV1.f3": "Tworzenie i zarzÄ…dzanie feedami", + "news.apiV1.f4": "Przetwarzanie produktów przez API", + "news.apiV1.f5": "Programowy dostÄ™p do feedów eksportu", "news.apiV1.f6": "Uwierzytelnianie i autoryzacja", - "news.feedFiltering.title": "Filtrowanie feedów na stronie produktów", - "news.feedFiltering.description": "Strona produktów z optymalnym filtrowaniem feedów, stanami ładowania i lepszą wydajnością.", - "news.feedFiltering.f1": "Lepsze filtrowanie feedów", - "news.feedFiltering.f2": "Lepsze stany ładowania", - "news.feedFiltering.f3": "Zoptymalizowana wydajność zapytań", - "news.feedFiltering.f4": "Lepsza obsługa paginacji", + "news.feedFiltering.title": "Filtrowanie feedów na stronie produktów", + "news.feedFiltering.description": "Strona produktów z optymalnym filtrowaniem feedów, stanami Å‚adowania i lepszÄ… wydajnoÅ›ciÄ….", + "news.feedFiltering.f1": "Lepsze filtrowanie feedów", + "news.feedFiltering.f2": "Lepsze stany Å‚adowania", + "news.feedFiltering.f3": "Zoptymalizowana wydajność zapytaÅ„", + "news.feedFiltering.f4": "Lepsza obsÅ‚uga paginacji", "news.feedFiltering.f5": "Ulepszenia funkcji eksportu", - "news.exportFeeds.title": "System feedów eksportu", - "news.exportFeeds.description": "Kompleksowy system feedów eksportu XML/CSV z własnymi konfiguracjami.", + "news.exportFeeds.title": "System feedów eksportu", + "news.exportFeeds.description": "Kompleksowy system feedów eksportu XML/CSV z wÅ‚asnymi konfiguracjami.", "news.exportFeeds.f1": "Formaty eksportu XML i CSV", - "news.exportFeeds.f2": "Niestandardowe mapowanie pól", - "news.exportFeeds.f3": "Podgląd eksportu", - "news.exportFeeds.f4": "Eksport produktów oparty na zadaniach", + "news.exportFeeds.f2": "Niestandardowe mapowanie pól", + "news.exportFeeds.f3": "PodglÄ…d eksportu", + "news.exportFeeds.f4": "Eksport produktów oparty na zadaniach", "news.exportFeeds.f5": "Integracja danych EPREL", - "news.exportFeeds.f6": "Publiczne adresy URL feedów eksportu", + "news.exportFeeds.f6": "Publiczne adresy URL feedów eksportu", "news.woocommerce.title": "Integracja WooCommerce", "news.woocommerce.description": "Synchronizuj produkty, kategorie i atrybuty ze sklepami WooCommerce.", - "news.woocommerce.f1": "Konfiguracja poświadczeń sklepu", - "news.woocommerce.f2": "Mapowanie kategorii i atrybutów", - "news.woocommerce.f3": "Dwukierunkowa synchronizacja produktów", + "news.woocommerce.f1": "Konfiguracja poÅ›wiadczeÅ„ sklepu", + "news.woocommerce.f2": "Mapowanie kategorii i atrybutów", + "news.woocommerce.f3": "Dwukierunkowa synchronizacja produktów", "news.woocommerce.f4": "Opcje strategii dopasowania", "news.eprel.title": "Integracja etykiet energetycznych EPREL", "news.eprel.description": "Integracja z europejskim rejestrem etykiet energetycznych w celu pobierania danych.", "news.eprel.f1": "Automatyczne przetwarzanie ID EPREL", - "news.eprel.f2": "Pobieranie obrazów etykiet energetycznych", + "news.eprel.f2": "Pobieranie obrazów etykiet energetycznych", "news.eprel.f3": "Pobieranie kart energetycznych produktu", "news.eprel.f4": "Ekstrakcja klasy energetycznej", - "news.eprel.f5": "Obsługa wielu języków", - "news.aiCategorization.title": "Ulepszona kategoryzacja produktów", - "news.aiCategorization.description": "System kategoryzacji AI z lepszą dokładnością i obsługą hierarchii.", + "news.eprel.f5": "ObsÅ‚uga wielu jÄ™zyków", + "news.aiCategorization.title": "Ulepszona kategoryzacja produktów", + "news.aiCategorization.description": "System kategoryzacji AI z lepszÄ… dokÅ‚adnoÅ›ciÄ… i obsÅ‚ugÄ… hierarchii.", "news.aiCategorization.f1": "Hierarchiczna nawigacja kategorii", - "news.aiCategorization.f2": "Ocena pewności", - "news.aiCategorization.f3": "Obsługa wielu języków", - "news.aiCategorization.f4": "Automatyczna obsługa awaryjna", - "news.standardFields.title": "Zarządzanie polami standardowymi", - "news.standardFields.description": "Zarządzaj standardowymi polami produktu z grupami, walidacją i wartościami domyślnymi.", - "news.standardFields.f1": "Organizowanie w grupy pól", + "news.aiCategorization.f2": "Ocena pewnoÅ›ci", + "news.aiCategorization.f3": "ObsÅ‚uga wielu jÄ™zyków", + "news.aiCategorization.f4": "Automatyczna obsÅ‚uga awaryjna", + "news.standardFields.title": "ZarzÄ…dzanie polami standardowymi", + "news.standardFields.description": "ZarzÄ…dzaj standardowymi polami produktu z grupami, walidacjÄ… i wartoÅ›ciami domyÅ›lnymi.", + "news.standardFields.f1": "Organizowanie w grupy pól", "news.standardFields.f2": "Pola systemowe i niestandardowe", - "news.standardFields.f3": "Reguły walidacji pól", - "news.standardFields.f4": "Obsługa wartości domyślnych", - "news.standardFields.f5": "Automatyczna konfiguracja pól", + "news.standardFields.f3": "ReguÅ‚y walidacji pól", + "news.standardFields.f4": "ObsÅ‚uga wartoÅ›ci domyÅ›lnych", + "news.standardFields.f5": "Automatyczna konfiguracja pól", "news.billingSystem.title": "Rozliczenia oparte na kredytach", - "news.billingSystem.description": "Nowy system rozliczeń kredytowych ze śledzeniem użycia i elastycznymi opcjami płatności.", + "news.billingSystem.description": "Nowy system rozliczeÅ„ kredytowych ze Å›ledzeniem użycia i elastycznymi opcjami pÅ‚atnoÅ›ci.", "news.billingSystem.f1": "Przetwarzanie oparte na kredytach", - "news.billingSystem.f2": "Analityka użycia", + "news.billingSystem.f2": "Analityka użycia", "news.billingSystem.f3": "Elastyczne cykle rozliczeniowe", - "news.billingSystem.f4": "Zarządzanie metodami płatności", + "news.billingSystem.f4": "ZarzÄ…dzanie metodami pÅ‚atnoÅ›ci", "news.billingSystem.f5": "Generowanie faktur", - "products.pageTitle": "Zarządzanie produktami", - "products.pageDescriptionStoresBefore": "Zarządzaj, przetwarzaj i optymalizuj katalog. Połącz sklep lub zaimportuj CSV przez", - "products.pageDescriptionBasic": "Zarządzaj, przetwarzaj i optymalizuj katalog. Importuj przez Feedy lub prześlij CSV.", - "products.keyboard.esc": "— zamknij panel edycji lub okna dialogowe", - "products.keyboard.toggle": "— przełącz tę wskazówkę", + "products.pageTitle": "ZarzÄ…dzanie produktami", + "products.pageDescriptionStoresBefore": "ZarzÄ…dzaj, przetwarzaj i optymalizuj katalog. Połącz sklep lub zaimportuj CSV przez", + "products.pageDescriptionBasic": "ZarzÄ…dzaj, przetwarzaj i optymalizuj katalog. Importuj przez Feedy lub przeÅ›lij CSV.", + "products.keyboard.esc": "— zamknij panel edycji lub okna dialogowe", + "products.keyboard.toggle": "— przełącz tÄ™ wskazówkÄ™", "products.keyboard.reviewPrefix": "W panelu Needs Review:", "products.keyboard.acceptAll": "zaakceptuj wszystko", - "products.keyboard.rejectShort": "odrzuć", - "products.keyboard.acceptFields": "zaakceptuj nazwę / opis", - "products.connectStore": "Połącz sklep", - "products.updating": "Aktualizacja…", - "products.needLinkedRaw": "Wybrane produkty wymagają powiązanego surowego produktu do przetworzenia.", + "products.keyboard.rejectShort": "odrzuć", + "products.keyboard.acceptFields": "zaakceptuj nazwÄ™ / opis", + "products.connectStore": "Połącz sklep", + "products.updating": "Aktualizacja…", + "products.needLinkedRaw": "Wybrane produkty wymagajÄ… powiÄ…zanego surowego produktu do przetworzenia.", "products.selectToProcess": "Wybierz co najmniej jeden produkt do przetworzenia.", "products.undoResetHint": "Cofnij przywraca produkt do nieprzetworzonego przez reset.", "products.field.accepted": "Zaakceptowano {label} w produkcie.", - "products.field.acceptFailed": "Nie można zaakceptować {field}", + "products.field.acceptFailed": "Nie można zaakceptować {field}", "products.field.discarded": "Odrzucono wzbogacenie {label}.", - "products.field.discardFailed": "Nie można odrzucić {field}", + "products.field.discardFailed": "Nie można odrzucić {field}", "products.upgradeRequired": "Wymagane ulepszenie planu", - "products.upgradeBody": "Ta funkcja wymaga płatnego planu lub kredytów AI.", - "products.enrichment.rejectTitle": "Odrzucić wzbogacenie?", - "products.enrichment.rejectSelectedTitle": "Odrzucić wybrane produkty?", - "products.enrichment.resetTitle": "Zresetować do nieprzetworzonego?", + "products.upgradeBody": "Ta funkcja wymaga pÅ‚atnego planu lub kredytów AI.", + "products.enrichment.rejectTitle": "Odrzucić wzbogacenie?", + "products.enrichment.rejectSelectedTitle": "Odrzucić wybrane produkty?", + "products.enrichment.resetTitle": "Zresetować do nieprzetworzonego?", "products.selectedOnPage": "Wybrano {count} na tej stronie", - "products.selectionPageOnly": "Pokazano {shown} z {total} — wybór tylko na tej stronie", - "products.edit.coverageHint": "Ile spośród Nazwa, Opis, Atrybuty i Kategoria jest obecnych (feed lub przetworzone).", + "products.selectionPageOnly": "Pokazano {shown} z {total} — wybór tylko na tej stronie", + "products.edit.coverageHint": "Ile spoÅ›ród Nazwa, Opis, Atrybuty i Kategoria jest obecnych (feed lub przetworzone).", "products.edit.noEprelShort": "Brak EPREL", "products.edit.specs": "Specyfikacje", - "products.edit.reviewBannerBody": "Użyj karty Przegląd, aby porównać oryginały z AI. Skróty: A akceptuj · R odrzuć · Alt+1/2 pole · ⌘/Ctrl+Enter zaakceptuj wszystko.", - "products.edit.whatsFilled": "Co jest wypełnione", - "products.edit.legend": "Szary = brak · Pomarańczowy = z feedu · Zielony = przetworzone", - "products.edit.updatedAgo": "· zaktualizowano {relative}", + "products.edit.reviewBannerBody": "Użyj karty PrzeglÄ…d, aby porównać oryginaÅ‚y z AI. Skróty: A akceptuj · R odrzuć · Alt+1/2 pole · ⌘/Ctrl+Enter zaakceptuj wszystko.", + "products.edit.whatsFilled": "Co jest wypeÅ‚nione", + "products.edit.legend": "Szary = brak · PomaraÅ„czowy = z feedu · Zielony = przetworzone", + "products.edit.updatedAgo": "· zaktualizowano {relative}", "products.edit.status": "Stan", "products.edit.noRawUpdate": "No raw produkt update time", - "products.edit.feedSyncPart": "· synchronizacja feedu", - "products.edit.filledFields": "{filled} wypełnione · {total} pól", + "products.edit.feedSyncPart": "· synchronizacja feedu", + "products.edit.filledFields": "{filled} wypeÅ‚nione · {total} pól", "products.edit.noMappedFields": "No mapped feed fields on this produkt.", "products.edit.emptyBadge": "Puste", - "products.edit.coreBadge": "Rdzeń", - "products.edit.feedAttrsHint": "Wartości sparsowane z feedu (specyfikacje HTML, gwarancja, wymiary, EPREL). Klucze są łączone z attribute_key, gdy to możliwe.", + "products.edit.coreBadge": "RdzeÅ„", + "products.edit.feedAttrsHint": "WartoÅ›ci sparsowane z feedu (specyfikacje HTML, gwarancja, wymiary, EPREL). Klucze sÄ… łączone z attribute_key, gdy to możliwe.", "products.edit.originalAttrs": "Oryginalne atrybuty", "products.edit.aiAttrs": "Atrybuty AI / wzbogacone", - "mapping.confidence.exact": "Dokładne", + "mapping.confidence.exact": "DokÅ‚adne", "mapping.confidence.alias": "Alias", - "mapping.confidence.fuzzy": "Przybliżone", + "mapping.confidence.fuzzy": "Przybliżone", "field.group.basic": "Informacje podstawowe", "field.group.pricing": "Ceny", "field.group.media": "Media", "field.group.taxonomy": "Taksonomia", "field.group.inventory": "Magazyn", "field.group.attributes": "Atrybuty", - "field.group.shipping": "Wysyłka", - "field.group.compliance": "Zgodność", + "field.group.shipping": "WysyÅ‚ka", + "field.group.compliance": "Zgodność", "field.group.other": "Inne", "common.yes": "Tak", "common.no": "Nie", "status.running": "Uruchomione", - "flash.admin.analyticsLoadFailed": "Nie udało się wczytać analityki", - "flash.admin.diagnosticsLoadFailed": "Nie udało się wczytać diagnostyki", - "flash.admin.diagnosticsUnavailable": "Diagnostyka nie jest dostępna w tym wdrożeniu. Skontaktuj się z administratorem platformy.", - "flash.admin.diagnosticsUnreachable": "Nie można połączyć się z API diagnostyki. Sprawdź, czy API działa i czy PUBLIC_API_URL / proxy Vite na nie wskazują.", + "flash.admin.analyticsLoadFailed": "Nie udaÅ‚o siÄ™ wczytać analityki", + "flash.admin.diagnosticsLoadFailed": "Nie udaÅ‚o siÄ™ wczytać diagnostyki", + "flash.admin.diagnosticsUnavailable": "Diagnostyka nie jest dostÄ™pna w tym wdrożeniu. Skontaktuj siÄ™ z administratorem platformy.", + "flash.admin.diagnosticsUnreachable": "Nie można połączyć siÄ™ z API diagnostyki. Sprawdź, czy API dziaÅ‚a i czy PUBLIC_API_URL / proxy Vite na nie wskazujÄ….", "admin.charts.statusEmpty": "Brak wierszy w tym podziale.", "admin.charts.seriesEmpty": "Brak danych w tym okresie.", - "admin.charts.primaryDefault": "Główna", - "admin.charts.statusAria": "Rozkład statusów", + "admin.charts.primaryDefault": "Główna", + "admin.charts.statusAria": "RozkÅ‚ad statusów", "admin.charts.seriesAria": "Wykres {label}", "admin.analytics.lastNDaysAria": "Ostatnie {days} dni", - "admin.analytics.overview": "Przegląd", + "admin.analytics.overview": "PrzeglÄ…d", "admin.analytics.overviewHint": "Sumy platformy z kontekstem okresu z ostatnich {days} dni.", - "admin.analytics.tokensInPeriod": "{tokens} w okresie · z przetworzonych produktów", - "admin.analytics.creditsRemainingOf": "{remaining} pozostało z {allocated} przydzielonych", - "admin.analytics.noJobsYet": "Brak zadań", - "admin.analytics.feedsVolume": "{input} wejściowych · {export} feedów eksportu", - "admin.analytics.usersCompaniesRaw": "{users} użytkowników · {companies} firm · {raw} surowych", + "admin.analytics.tokensInPeriod": "{tokens} w okresie · z przetworzonych produktów", + "admin.analytics.creditsRemainingOf": "{remaining} pozostaÅ‚o z {allocated} przydzielonych", + "admin.analytics.noJobsYet": "Brak zadaÅ„", + "admin.analytics.feedsVolume": "{input} wejÅ›ciowych · {export} feedów eksportu", + "admin.analytics.usersCompaniesRaw": "{users} użytkowników · {companies} firm · {raw} surowych", "admin.analytics.operations": "Operacje", - "admin.analytics.operationsHint": "Sygnały niezawodności, klucze i wzrost w wybranym okresie.", - "admin.analytics.failedCompleted": "{failed} nieudanych · {completed} ukończonych", - "admin.analytics.runningOver2h": "W toku > 2 godz. ·", - "admin.analytics.apiKeysTotal": "{total} łącznie (w tym unieważnione)", - "admin.analytics.signupsDetail": "użytkownicy · {companies} firm · {tickets} otwartych/oczekujących ticketów", - "admin.analytics.providerMix": "Mix dostawców", - "admin.analytics.providerMixHint": "Zużycie tokenów według sposobu konfiguracji poświadczeń AI.", - "admin.analytics.productsJobs": "{products} produktów · {jobs} zadań", + "admin.analytics.operationsHint": "SygnaÅ‚y niezawodnoÅ›ci, klucze i wzrost w wybranym okresie.", + "admin.analytics.failedCompleted": "{failed} nieudanych · {completed} ukoÅ„czonych", + "admin.analytics.runningOver2h": "W toku > 2 godz. ·", + "admin.analytics.apiKeysTotal": "{total} łącznie (w tym unieważnione)", + "admin.analytics.signupsDetail": "użytkownicy · {companies} firm · {tickets} otwartych/oczekujÄ…cych ticketów", + "admin.analytics.providerMix": "Mix dostawców", + "admin.analytics.providerMixHint": "Zużycie tokenów wedÅ‚ug sposobu konfiguracji poÅ›wiadczeÅ„ AI.", + "admin.analytics.productsJobs": "{products} produktów · {jobs} zadaÅ„", "admin.analytics.trends": "Trendy", - "admin.analytics.trendsHint": "Serie dzienne tokenów, dostawców, zadań i rejestracji.", - "admin.analytics.tokensByDayHint": "Tokeny z ukończonego przetwarzania produktów (druga seria = produkty tego dnia)", + "admin.analytics.trendsHint": "Serie dzienne tokenów, dostawców, zadaÅ„ i rejestracji.", + "admin.analytics.tokensByDayHint": "Tokeny z ukoÅ„czonego przetwarzania produktów (druga seria = produkty tego dnia)", "admin.analytics.seriesTokens": "Tokeny", "admin.analytics.seriesProducts": "Produkty", - "admin.analytics.emptyTokens": "Brak przetworzonych produktów z tokenami w tym okresie.", - "admin.analytics.tokensByProviderHint": "Podział dzienny: wewnętrzny / popularny / własny (wg typu dostawcy)", - "admin.analytics.emptyProviderTokens": "Brak tokenów oznaczonych dostawcą w tym okresie.", - "admin.analytics.providerDayTip": "{date}: Wewnętrzny {internal} · Popularny {popular} · Własny {custom}", + "admin.analytics.emptyTokens": "Brak przetworzonych produktów z tokenami w tym okresie.", + "admin.analytics.tokensByProviderHint": "PodziaÅ‚ dzienny: wewnÄ™trzny / popularny / wÅ‚asny (wg typu dostawcy)", + "admin.analytics.emptyProviderTokens": "Brak tokenów oznaczonych dostawcÄ… w tym okresie.", + "admin.analytics.providerDayTip": "{date}: WewnÄ™trzny {internal} · Popularny {popular} · WÅ‚asny {custom}", "admin.analytics.seriesCreated": "Utworzono", "admin.analytics.seriesFailed": "Niepowodzenie", - "admin.analytics.emptyJobsSeries": "Nie utworzono zadań przetwarzania w tym okresie.", - "admin.analytics.seriesUsers": "Użytkownicy", + "admin.analytics.emptyJobsSeries": "Nie utworzono zadaÅ„ przetwarzania w tym okresie.", + "admin.analytics.seriesUsers": "Użytkownicy", "admin.analytics.seriesCompanies": "Firmy", - "admin.analytics.emptySignups": "Brak rejestracji użytkowników lub firm w tym okresie.", - "admin.analytics.statusMix": "Mix statusów", - "admin.analytics.statusMixHint": "Historyczne kolejki zadań, sync feedów i wsparcia.", - "admin.analytics.jobStatus": "Status zadań", - "admin.analytics.feedSyncQueue": "Kolejka sync feedów", + "admin.analytics.emptySignups": "Brak rejestracji użytkowników lub firm w tym okresie.", + "admin.analytics.statusMix": "Mix statusów", + "admin.analytics.statusMixHint": "Historyczne kolejki zadaÅ„, sync feedów i wsparcia.", + "admin.analytics.jobStatus": "Status zadaÅ„", + "admin.analytics.feedSyncQueue": "Kolejka sync feedów", "admin.analytics.supportTickets": "Tickety wsparcia", - "admin.analytics.emptyJobStatus": "Brak zadań przetwarzania.", - "admin.analytics.emptyFeedSync": "Brak zadań sync feedów.", - "admin.analytics.emptyTickets": "Brak ticketów wsparcia.", - "admin.analytics.usageDetail": "Szczegóły użycia", - "admin.analytics.usageDetailHint": "Tryby dostawców, czołowe firmy i podsumowania cykli rozliczeniowych.", - "admin.analytics.companyUsage": "Użycie firm", + "admin.analytics.emptyJobStatus": "Brak zadaÅ„ przetwarzania.", + "admin.analytics.emptyFeedSync": "Brak zadaÅ„ sync feedów.", + "admin.analytics.emptyTickets": "Brak ticketów wsparcia.", + "admin.analytics.usageDetail": "Szczegóły użycia", + "admin.analytics.usageDetailHint": "Tryby dostawców, czoÅ‚owe firmy i podsumowania cykli rozliczeniowych.", + "admin.analytics.companyUsage": "Użycie firm", "admin.analytics.jobsCol": "Zadania", "admin.analytics.billingCycles": "Rozliczenia cycles", - "admin.analytics.billingCyclesHint": "Historyczne podsumowania przeszłych cykli rozliczeniowych (mogą opóźniać się względem aktywnej subskrypcji)", + "admin.analytics.billingCyclesHint": "Historyczne podsumowania przeszÅ‚ych cykli rozliczeniowych (mogÄ… opóźniać siÄ™ wzglÄ™dem aktywnej subskrypcji)", "admin.analytics.periodCol": "Okres", "admin.analytics.creditsCol": "Kredyty", "admin.analytics.dataNotes": "Uwagi o danych", "admin.diagnostics.endpointNotMounted": "Endpoint niezamontowany", "admin.diagnostics.noPayload": "Brak danych diagnostycznych", - "admin.diagnostics.unavailableShort": "Diagnostyka nie jest dostępna w tym wdrożeniu.", - "admin.diagnostics.fixThenRefresh": "Napraw błąd powyżej, a następnie odśwież.", - "admin.diagnostics.refreshOrConfirm": "Odśwież lub potwierdź, że API działa poprawnie.", + "admin.diagnostics.unavailableShort": "Diagnostyka nie jest dostÄ™pna w tym wdrożeniu.", + "admin.diagnostics.fixThenRefresh": "Napraw błąd powyżej, a nastÄ™pnie odÅ›wież.", + "admin.diagnostics.refreshOrConfirm": "OdÅ›wież lub potwierdź, że API dziaÅ‚a poprawnie.", "admin.diagnostics.systemStatus": "Status systemu", "admin.diagnostics.snapshot": "Migawka {when}", - "admin.diagnostics.queueTotal": "{total} łącznie", - "admin.diagnostics.queueStuck": "processing_jobs · zablokowane w toku (>2 godz.):", + "admin.diagnostics.queueTotal": "{total} łącznie", + "admin.diagnostics.queueStuck": "processing_jobs · zablokowane w toku (>2 godz.):", "admin.diagnostics.driver": "Sterownik: {driver}", - "admin.diagnostics.openStuck": "Otwórz zablokowane produkty", - "admin.diagnostics.configPresence": "Obecność konfiguracji", - "admin.diagnostics.configHint": "Tylko wartości logiczne · env {env} · RPM {rpm} · batch {batch} · retries {retries}", - "admin.diagnostics.cutoverTitle": "Gotowość cutover", - "admin.diagnostics.cutoverHint": "Tylko flagi obecności — wskazówki goose, wiek workera, brakujące plany. Bez live Stripe/SMTP.", + "admin.diagnostics.openStuck": "Otwórz zablokowane produkty", + "admin.diagnostics.configPresence": "Obecność konfiguracji", + "admin.diagnostics.configHint": "Tylko wartoÅ›ci logiczne · env {env} · RPM {rpm} · batch {batch} · retries {retries}", + "admin.diagnostics.cutoverTitle": "Gotowość cutover", + "admin.diagnostics.cutoverHint": "Tylko flagi obecnoÅ›ci — wskazówki goose, wiek workera, brakujÄ…ce plany. Bez live Stripe/SMTP.", "admin.diagnostics.cutoverGoose": "Goose", - "admin.diagnostics.cutoverGooseVersion": "version_max {max} · oczekiwane ≥ {min}", + "admin.diagnostics.cutoverGooseVersion": "version_max {max} · oczekiwane ≥ {min}", "admin.diagnostics.cutoverGooseRequired": "Wymagane migracje", "admin.diagnostics.cutoverWorker": "Worker", - "admin.diagnostics.cutoverWorkerAge": "ostatnio {age}s temu · nieaktualne po {stale}s", - "admin.diagnostics.cutoverWorkerAgeUnknown": "wiek niedostępny · nieaktualne po {stale}s", + "admin.diagnostics.cutoverWorkerAge": "ostatnio {age}s temu · nieaktualne po {stale}s", + "admin.diagnostics.cutoverWorkerAgeUnknown": "wiek niedostÄ™pny · nieaktualne po {stale}s", "admin.diagnostics.cutoverPlansMissing": "Firmy bez planu", - "admin.diagnostics.cutoverPlansUnavailable": "Licznik planów niedostępny", + "admin.diagnostics.cutoverPlansUnavailable": "Licznik planów niedostÄ™pny", "admin.diagnostics.cutoverApiKeysMissing": "Companies without API keys", "admin.diagnostics.cutoverApiKeysUnavailable": "API key inventory unavailable", - "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", + "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", "admin.diagnostics.cutoverApiKeysLink": "List companies needing reissue", "admin.diagnostics.cutoverApplied": "zastosowana", - "admin.diagnostics.cutoverPending": "oczekująca", + "admin.diagnostics.cutoverPending": "oczekujÄ…ca", "admin.diagnostics.etlInventoryTitle": "ETL gap inventory", - "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", + "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", "admin.diagnostics.etlInventoryFiles": "Files metadata-only", "admin.diagnostics.etlInventoryFilesDetail": "metadata-only / total file rows", "admin.diagnostics.etlInventoryJobs": "Jobs migrated tag", @@ -4653,199 +4654,199 @@ export const pl: MessageDict = { "admin.diagnostics.etlInventoryTasks": "Tasks rows", "admin.diagnostics.etlInventoryTasksDetail": "legacy task history present in Postgres", "admin.diagnostics.recentJobs": "Ostatnie zadania", - "admin.diagnostics.recentAiFailures": "Ostatnie błędy AI wsparcia", - "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", - "admin.diagnostics.relatedTools": "Powiązane narzędzia ops", + "admin.diagnostics.recentAiFailures": "Ostatnie błędy AI wsparcia", + "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", + "admin.diagnostics.relatedTools": "PowiÄ…zane narzÄ™dzia ops", "admin.diagnostics.toolStuckTitle": "Zablokowane produkty", - "admin.diagnostics.toolStuckDesc": "Czyszczenie zadań działających dłużej niż 2 godziny.", + "admin.diagnostics.toolStuckDesc": "Czyszczenie zadaÅ„ dziaÅ‚ajÄ…cych dÅ‚użej niż 2 godziny.", "admin.diagnostics.toolOrphanTitle": "Orphan processed", - "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", + "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", "admin.diagnostics.toolAnalyticsTitle": "Analityka", - "admin.diagnostics.toolAnalyticsDesc": "Trendy i wykresy użycia platformy.", + "admin.diagnostics.toolAnalyticsDesc": "Trendy i wykresy użycia platformy.", "admin.diagnostics.toolBootstrapTitle": "Bootstrap", - "admin.diagnostics.toolBootstrapDesc": "Potwierdź dostęp administratora platformy dla tego konta.", + "admin.diagnostics.toolBootstrapDesc": "Potwierdź dostÄ™p administratora platformy dla tego konta.", "admin.diagnostics.toolSettingsTitle": "Ustawienia", "admin.diagnostics.toolSettingsDesc": "Poczta, AI i tryb systemu platformy.", "admin.diagnostics.config.maintenance_mode": "Tryb konserwacji", "admin.diagnostics.config.read_only_mode": "Tryb tylko do odczytu", "admin.diagnostics.config.session_secure": "Bezpieczne cookie sesji", - "admin.diagnostics.config.smtp_enabled": "SMTP włączone", + "admin.diagnostics.config.smtp_enabled": "SMTP włączone", "admin.diagnostics.config.email_dry_run": "Email dry-run", "admin.diagnostics.config.smtp_host_set": "Host SMTP ustawiony", "admin.diagnostics.config.stripe_mock": "Stripe mock", - "admin.diagnostics.config.eprel_enabled": "EPREL włączone", + "admin.diagnostics.config.eprel_enabled": "EPREL włączone", "admin.diagnostics.config.upload_dir_configured": "Katalog uploadu skonfigurowany", "admin.diagnostics.config.trusted_proxies_configured": "Zaufane proxy ustawione", "admin.diagnostics.config.web_origin_set": "Pochodzenie web ustawione", "admin.diagnostics.config.public_api_url_set": "Publiczny URL API ustawiony", - "admin.diagnostics.config.token_signing_secret_set": "Sekret podpisu tokenów ustawiony", + "admin.diagnostics.config.token_signing_secret_set": "Sekret podpisu tokenów ustawiony", "admin.diagnostics.config.openai_key_set": "Klucz OpenAI ustawiony", "admin.diagnostics.config.pinecone_key_set": "Klucz Pinecone ustawiony", "admin.diagnostics.config.stripe_secret_set": "Sekret Stripe ustawiony", "admin.diagnostics.config.stripe_webhook_secret_set": "Sekret webhook Stripe ustawiony", "admin.diagnostics.config.stripe_mock_rejected_in_prod": "Mock Stripe odrzucony w produkcji", - "admin.diagnostics.config.credentials_encryption_key_set": "Klucz szyfrowania poświadczeń ustawiony", + "admin.diagnostics.config.credentials_encryption_key_set": "Klucz szyfrowania poÅ›wiadczeÅ„ ustawiony", "categories.selectAll": "Zaznacz wszystko", "categories.selectedCount": "{count} wybrano", - "categories.noMatchingCategories": "Brak pasujących kategorii", - "categories.assigningProgress": "Przypisywanie… {progress}%", + "categories.noMatchingCategories": "Brak pasujÄ…cych kategorii", + "categories.assigningProgress": "Przypisywanie… {progress}%", "categories.assignToCount": "Przypisz do {count}", "categories.aiPromptSavedForCategory": "Dla tej kategorii zapisano prompt generowania AI.", - "categories.titleAndDescriptionFormulasSaved": "Formuły tytułu i opisu są zapisane dla tej kategorii.", - "categories.titleFormulaSavedForCategory": "Dla tej kategorii zapisano formułę tytułu.", - "categories.descriptionFormulaSavedForCategory": "Dla tej kategorii zapisano formułę opisu.", + "categories.titleAndDescriptionFormulasSaved": "FormuÅ‚y tytuÅ‚u i opisu sÄ… zapisane dla tej kategorii.", + "categories.titleFormulaSavedForCategory": "Dla tej kategorii zapisano formułę tytuÅ‚u.", + "categories.descriptionFormulaSavedForCategory": "Dla tej kategorii zapisano formułę opisu.", "site.account": "Konto", - "site.goToApp": "Przejdź do aplikacji", - "site.logIn": "Zaloguj się", + "site.goToApp": "Przejdź do aplikacji", + "site.logIn": "Zaloguj siÄ™", "site.getStarted": "Zacznij", - "site.nav.primary": "Główna", + "site.nav.primary": "Główna", "site.nav.mobile": "Mobilna", - "site.nav.home": "Strona główna", + "site.nav.home": "Strona główna", "site.nav.pricing": "Cennik", "site.nav.apiDocs": "Dokumentacja API", - "seo.home.title": "Descrybe — Przekształć feedy dostawców w gotowe karty produktów", - "seo.home.description": "Podłącz feedy CSV lub XML dostawców, przypisz je do swoich kategorii i atrybutów, generuj tytuły i opisy według swoich reguł oraz eksportuj lub synchronizuj z WooCommerce.", - "seo.pricing.title": "Cennik — Free, Starter, Growth, Business | Descrybe", - "seo.pricing.description": "Zacznij za darmo z 100 produktami i mapowaniem feedów. Plany płatne dodają tytuły i opisy AI, więcej SKU, feedy eksportowe i sync WooCommerce — od 49 $/mies. Enterprise dla nieograniczonych katalogów.", - "seo.privacy.title": "Polityka prywatności | Descrybe", - "seo.privacy.description": "Jak Descrybe zbiera, wykorzystuje i chroni dane konta, katalogi produktów oraz feedy dostawców podczas korzystania z naszej platformy danych produktowych.", - "seo.terms.title": "Regulamin świadczenia usług | Descrybe", - "seo.terms.description": "Warunki korzystania z Descrybe: import feedów, wzbogacanie katalogu, treści wspierane przez AI, eksporty oraz synchronizacja z WooCommerce dla Twojej firmy.", - "seo.features.title": "Funkcje — Feedy, wzbogacanie i eksport | Descrybe", - "seo.features.description": "Dowiedz się, jak Descrybe importuje feedy dostawców, mapuje pola na Twoją taksonomię, wzbogaca dane produktów i dostarcza katalogi przez feedy eksportowe, WooCommerce lub API.", + "seo.home.title": "Descrybe — Przekształć feedy dostawców w gotowe karty produktów", + "seo.home.description": "Podłącz feedy CSV lub XML dostawców, przypisz je do swoich kategorii i atrybutów, generuj tytuÅ‚y i opisy wedÅ‚ug swoich reguÅ‚ oraz eksportuj lub synchronizuj z WooCommerce.", + "seo.pricing.title": "Cennik — Free, Starter, Growth, Business | Descrybe", + "seo.pricing.description": "Zacznij za darmo z 100 produktami i mapowaniem feedów. Plany pÅ‚atne dodajÄ… tytuÅ‚y i opisy AI, wiÄ™cej SKU, feedy eksportowe i sync WooCommerce — od 49 $/mies. Enterprise dla nieograniczonych katalogów.", + "seo.privacy.title": "Polityka prywatnoÅ›ci | Descrybe", + "seo.privacy.description": "Jak Descrybe zbiera, wykorzystuje i chroni dane konta, katalogi produktów oraz feedy dostawców podczas korzystania z naszej platformy danych produktowych.", + "seo.terms.title": "Regulamin Å›wiadczenia usÅ‚ug | Descrybe", + "seo.terms.description": "Warunki korzystania z Descrybe: import feedów, wzbogacanie katalogu, treÅ›ci wspierane przez AI, eksporty oraz synchronizacja z WooCommerce dla Twojej firmy.", + "seo.features.title": "Funkcje — Feedy, wzbogacanie i eksport | Descrybe", + "seo.features.description": "Dowiedz siÄ™, jak Descrybe importuje feedy dostawców, mapuje pola na TwojÄ… taksonomiÄ™, wzbogaca dane produktów i dostarcza katalogi przez feedy eksportowe, WooCommerce lub API.", "pricing.page.eyebrow": "Cennik", - "pricing.page.title": "Proste plany dla rosnących katalogów", - "pricing.page.lead": "Zacznij za darmo od mapowania feedów i podstawowego czyszczenia. Ulepsz, gdy potrzebujesz tytułów i opisów AI, większej liczby produktów, feedów eksportu lub synchronizacji WooCommerce — od Starter do Enterprise.", - "pricing.page.subscribedBefore": "Już masz subskrypcję? Zarządzaj użyciem w", - "pricing.page.subscribedMid": "lub porównaj plany w", + "pricing.page.title": "Proste plany dla rosnÄ…cych katalogów", + "pricing.page.lead": "Zacznij za darmo od mapowania feedów i podstawowego czyszczenia. Ulepsz, gdy potrzebujesz tytułów i opisów AI, wiÄ™kszej liczby produktów, feedów eksportu lub synchronizacji WooCommerce — od Starter do Enterprise.", + "pricing.page.subscribedBefore": "Już masz subskrypcjÄ™? ZarzÄ…dzaj użyciem w", + "pricing.page.subscribedMid": "lub porównaj plany w", "pricing.page.plansLink": "Plany", "pricing.page.subscribedAfter": ".", "legal.lastUpdated": "Ostatnia aktualizacja: {date}", - "legal.backHome": "← Powrót do strony głównej", + "legal.backHome": "← Powrót do strony głównej", "legal.emailLabel": "E-mail:", "legal.postalLabel": "Adres pocztowy:", - "legal.privacy.title": "Polityka prywatności", + "legal.privacy.title": "Polityka prywatnoÅ›ci", "legal.privacy.intro.h": "Wprowadzenie", - "legal.privacy.intro.p1": "W Descrybe (\"my\", \"nasz\" lub \"nas\") szanujemy Twoją prywatność i zobowiązujemy się chronić Twoje dane osobowe. Niniejsza Polityka prywatności wyjaśnia, w jaki sposób zbieramy, wykorzystujemy, ujawniamy i chronimy Twoje informacje, gdy korzystasz z platformy danych produktowych Descrybe oraz powiązanych usług (łącznie: \"Usługi\").", - "legal.privacy.intro.p2": "Uzyskując dostęp do naszych Usług lub korzystając z nich, akceptujesz praktyki opisane w niniejszej Polityce prywatności. Jeśli nie zgadzasz się z politykami i praktykami tutaj opisanymi, nie korzystaj z naszych Usług.", - "legal.privacy.collect.h": "Informacje, które zbieramy", - "legal.privacy.collect.lead": "Zbieramy różne rodzaje informacji od użytkowników i o użytkownikach naszych Usług, w tym:", + "legal.privacy.intro.p1": "W Descrybe (\"my\", \"nasz\" lub \"nas\") szanujemy TwojÄ… prywatność i zobowiÄ…zujemy siÄ™ chronić Twoje dane osobowe. Niniejsza Polityka prywatnoÅ›ci wyjaÅ›nia, w jaki sposób zbieramy, wykorzystujemy, ujawniamy i chronimy Twoje informacje, gdy korzystasz z platformy danych produktowych Descrybe oraz powiÄ…zanych usÅ‚ug (łącznie: \"UsÅ‚ugi\").", + "legal.privacy.intro.p2": "UzyskujÄ…c dostÄ™p do naszych UsÅ‚ug lub korzystajÄ…c z nich, akceptujesz praktyki opisane w niniejszej Polityce prywatnoÅ›ci. JeÅ›li nie zgadzasz siÄ™ z politykami i praktykami tutaj opisanymi, nie korzystaj z naszych UsÅ‚ug.", + "legal.privacy.collect.h": "Informacje, które zbieramy", + "legal.privacy.collect.lead": "Zbieramy różne rodzaje informacji od użytkowników i o użytkownikach naszych UsÅ‚ug, w tym:", "legal.privacy.collect.personal.h": "Dane osobowe", - "legal.privacy.collect.personal.p": "Podczas rejestracji konta zbieramy informacje, które mogą służyć do Twojej identyfikacji, takie jak imię i nazwisko, adres e-mail, numer telefonu, nazwa firmy oraz dane rozliczeniowe. Zbieramy te informacje bezpośrednio od Ciebie, gdy nam je przekazujesz.", - "legal.privacy.collect.userData.h": "Dane użytkownika", - "legal.privacy.collect.userData.p": "W celu świadczenia naszych Usług zbieramy i przetwarzamy dane produktów, feedy dostawców, opisy produktów oraz inne treści, które ładujesz, wprowadzasz lub w inny sposób przesyłasz na naszą platformę. Może to obejmować atrybuty produktów, struktury taksonomii, szablony oraz inne dane niezbędne do działania naszych Usług.", - "legal.privacy.collect.usage.h": "Informacje o użytkowaniu", - "legal.privacy.collect.usage.p": "Automatycznie zbieramy pewne informacje o Twoim urządzeniu oraz o tym, jak korzystasz z naszych Usług, w tym adres IP, typ urządzenia, typ przeglądarki, system operacyjny, godziny dostępu, wyświetlone strony, używane funkcje oraz inną aktywność systemu. Wykorzystujemy te informacje do ulepszania naszych Usług i doświadczenia użytkownika.", - "legal.privacy.collect.cookies.h": "Pliki cookie i technologie śledzące", - "legal.privacy.collect.cookies.p": "Używamy plików cookie, web beaconów oraz podobnych technologii śledzących do zbierania informacji o Twojej aktywności przeglądania na naszej stronie. Możesz kontrolować pliki cookie za pomocą ustawień przeglądarki i innych narzędzi. Należy jednak pamiętać, że zablokowanie niektórych plików cookie może uniemożliwić korzystanie ze wszystkich funkcji naszych Usług.", + "legal.privacy.collect.personal.p": "Podczas rejestracji konta zbieramy informacje, które mogÄ… sÅ‚użyć do Twojej identyfikacji, takie jak imiÄ™ i nazwisko, adres e-mail, numer telefonu, nazwa firmy oraz dane rozliczeniowe. Zbieramy te informacje bezpoÅ›rednio od Ciebie, gdy nam je przekazujesz.", + "legal.privacy.collect.userData.h": "Dane użytkownika", + "legal.privacy.collect.userData.p": "W celu Å›wiadczenia naszych UsÅ‚ug zbieramy i przetwarzamy dane produktów, feedy dostawców, opisy produktów oraz inne treÅ›ci, które Å‚adujesz, wprowadzasz lub w inny sposób przesyÅ‚asz na naszÄ… platformÄ™. Może to obejmować atrybuty produktów, struktury taksonomii, szablony oraz inne dane niezbÄ™dne do dziaÅ‚ania naszych UsÅ‚ug.", + "legal.privacy.collect.usage.h": "Informacje o użytkowaniu", + "legal.privacy.collect.usage.p": "Automatycznie zbieramy pewne informacje o Twoim urzÄ…dzeniu oraz o tym, jak korzystasz z naszych UsÅ‚ug, w tym adres IP, typ urzÄ…dzenia, typ przeglÄ…darki, system operacyjny, godziny dostÄ™pu, wyÅ›wietlone strony, używane funkcje oraz innÄ… aktywność systemu. Wykorzystujemy te informacje do ulepszania naszych UsÅ‚ug i doÅ›wiadczenia użytkownika.", + "legal.privacy.collect.cookies.h": "Pliki cookie i technologie Å›ledzÄ…ce", + "legal.privacy.collect.cookies.p": "Używamy plików cookie, web beaconów oraz podobnych technologii Å›ledzÄ…cych do zbierania informacji o Twojej aktywnoÅ›ci przeglÄ…dania na naszej stronie. Możesz kontrolować pliki cookie za pomocÄ… ustawieÅ„ przeglÄ…darki i innych narzÄ™dzi. Należy jednak pamiÄ™tać, że zablokowanie niektórych plików cookie może uniemożliwić korzystanie ze wszystkich funkcji naszych UsÅ‚ug.", "legal.privacy.use.h": "Jak wykorzystujemy Twoje informacje", - "legal.privacy.use.lead": "Wykorzystujemy zbierane informacje do różnych celów, w tym:", - "legal.privacy.use.li1": "Świadczenia, utrzymania i ulepszania naszych Usług", - "legal.privacy.use.li2": "Przetwarzania transakcji oraz wysyłania powiązanych informacji, w tym potwierdzeń, faktur i powiadomień serwisowych", - "legal.privacy.use.li3": "Opracowywania nowych produktów, usług, funkcji i funkcjonalności", - "legal.privacy.use.li4": "Personalizacji Twojego doświadczenia oraz dostarczania treści i funkcji odpowiadających Twoim zainteresowaniom", - "legal.privacy.use.li5": "Odpowiadania na Twoje prośby, uwagi i pytania", - "legal.privacy.use.li6": "Wysyłania Ci powiadomień technicznych, aktualizacji, alertów bezpieczeństwa oraz komunikatów wsparcia i administracyjnych", - "legal.privacy.use.li7": "Monitorowania i analizy trendów, użytkowania oraz aktywności w związku z naszymi Usługami", - "legal.privacy.use.li8": "Wykrywania, badania i zapobiegania transakcjom oszukańczym oraz innym nielegalnym działaniom", - "legal.privacy.use.li9": "Ochrony naszych praw, własności i bezpieczeństwa, a także praw, własności i bezpieczeństwa naszych użytkowników lub innych osób", - "legal.privacy.use.li10": "Wypełniania obowiązków prawnych oraz egzekwowania naszego regulaminu świadczenia usług", + "legal.privacy.use.lead": "Wykorzystujemy zbierane informacje do różnych celów, w tym:", + "legal.privacy.use.li1": "Åšwiadczenia, utrzymania i ulepszania naszych UsÅ‚ug", + "legal.privacy.use.li2": "Przetwarzania transakcji oraz wysyÅ‚ania powiÄ…zanych informacji, w tym potwierdzeÅ„, faktur i powiadomieÅ„ serwisowych", + "legal.privacy.use.li3": "Opracowywania nowych produktów, usÅ‚ug, funkcji i funkcjonalnoÅ›ci", + "legal.privacy.use.li4": "Personalizacji Twojego doÅ›wiadczenia oraz dostarczania treÅ›ci i funkcji odpowiadajÄ…cych Twoim zainteresowaniom", + "legal.privacy.use.li5": "Odpowiadania na Twoje proÅ›by, uwagi i pytania", + "legal.privacy.use.li6": "WysyÅ‚ania Ci powiadomieÅ„ technicznych, aktualizacji, alertów bezpieczeÅ„stwa oraz komunikatów wsparcia i administracyjnych", + "legal.privacy.use.li7": "Monitorowania i analizy trendów, użytkowania oraz aktywnoÅ›ci w zwiÄ…zku z naszymi UsÅ‚ugami", + "legal.privacy.use.li8": "Wykrywania, badania i zapobiegania transakcjom oszukaÅ„czym oraz innym nielegalnym dziaÅ‚aniom", + "legal.privacy.use.li9": "Ochrony naszych praw, wÅ‚asnoÅ›ci i bezpieczeÅ„stwa, a także praw, wÅ‚asnoÅ›ci i bezpieczeÅ„stwa naszych użytkowników lub innych osób", + "legal.privacy.use.li10": "WypeÅ‚niania obowiÄ…zków prawnych oraz egzekwowania naszego regulaminu Å›wiadczenia usÅ‚ug", "legal.privacy.ai.h": "AI i uczenie maszynowe", - "legal.privacy.ai.p1": "Nasze Usługi wykorzystują technologie sztucznej inteligencji i uczenia maszynowego do przetwarzania danych produktów, generowania treści oraz oferowania innych funkcji automatycznych. Dane, które przekazujesz naszym Usługom, mogą być wykorzystywane do trenowania i ulepszania naszych modeli AI. Stosujemy jednak odpowiednie zabezpieczenia w celu ochrony Twoich danych i zachowania ich poufności.", - "legal.privacy.ai.p2": "Nie wykorzystujemy informacji umożliwiających identyfikację osoby do trenowania naszych ogólnych modeli AI bez Twojej wyraźnej zgody. Dane produktów wykorzystywane do trenowania AI są anonimizowane i agregowane, o ile jest to możliwe.", - "legal.privacy.share.h": "Jak udostępniamy Twoje informacje", - "legal.privacy.share.lead": "Możemy udostępniać Twoje informacje w następujących okolicznościach:", - "legal.privacy.share.providers.h": "Dostawcy usług", - "legal.privacy.share.providers.p": "Możemy udostępniać Twoje informacje zewnętrznym dostawcom, usługodawcom, wykonawcom lub agentom, którzy świadczą usługi w naszym imieniu, takie jak przetwarzanie płatności, analiza danych, wysyłka e-maili, hosting, obsługa klienta oraz wsparcie marketingowe.", + "legal.privacy.ai.p1": "Nasze UsÅ‚ugi wykorzystujÄ… technologie sztucznej inteligencji i uczenia maszynowego do przetwarzania danych produktów, generowania treÅ›ci oraz oferowania innych funkcji automatycznych. Dane, które przekazujesz naszym UsÅ‚ugom, mogÄ… być wykorzystywane do trenowania i ulepszania naszych modeli AI. Stosujemy jednak odpowiednie zabezpieczenia w celu ochrony Twoich danych i zachowania ich poufnoÅ›ci.", + "legal.privacy.ai.p2": "Nie wykorzystujemy informacji umożliwiajÄ…cych identyfikacjÄ™ osoby do trenowania naszych ogólnych modeli AI bez Twojej wyraźnej zgody. Dane produktów wykorzystywane do trenowania AI sÄ… anonimizowane i agregowane, o ile jest to możliwe.", + "legal.privacy.share.h": "Jak udostÄ™pniamy Twoje informacje", + "legal.privacy.share.lead": "Możemy udostÄ™pniać Twoje informacje w nastÄ™pujÄ…cych okolicznoÅ›ciach:", + "legal.privacy.share.providers.h": "Dostawcy usÅ‚ug", + "legal.privacy.share.providers.p": "Możemy udostÄ™pniać Twoje informacje zewnÄ™trznym dostawcom, usÅ‚ugodawcom, wykonawcom lub agentom, którzy Å›wiadczÄ… usÅ‚ugi w naszym imieniu, takie jak przetwarzanie pÅ‚atnoÅ›ci, analiza danych, wysyÅ‚ka e-maili, hosting, obsÅ‚uga klienta oraz wsparcie marketingowe.", "legal.privacy.share.transfers.h": "Transfery biznesowe", - "legal.privacy.share.transfers.p": "Jeśli uczestniczymy w fuzji, przejęciu, finansowaniu, reorganizacji, upadłości lub sprzedaży aktywów przedsiębiorstwa, Twoje informacje mogą zostać przekazane w ramach takiej transakcji. Poinformujemy Cię o wszelkich takich zmianach własności lub kontroli nad Twoimi danymi osobowymi.", + "legal.privacy.share.transfers.p": "JeÅ›li uczestniczymy w fuzji, przejÄ™ciu, finansowaniu, reorganizacji, upadÅ‚oÅ›ci lub sprzedaży aktywów przedsiÄ™biorstwa, Twoje informacje mogÄ… zostać przekazane w ramach takiej transakcji. Poinformujemy CiÄ™ o wszelkich takich zmianach wÅ‚asnoÅ›ci lub kontroli nad Twoimi danymi osobowymi.", "legal.privacy.share.legal.h": "Wymogi prawne", - "legal.privacy.share.legal.p": "Możemy ujawnić Twoje informacje, jeśli wymaga tego prawo lub w odpowiedzi na ważne wnioski organów publicznych (np. sądu lub organu rządowego). Możemy również ujawnić Twoje informacje w celu egzekwowania naszego regulaminu świadczenia usług, ochrony naszych praw, prywatności, bezpieczeństwa lub własności i/lub praw, prywatności, bezpieczeństwa lub własności naszych podmiotów powiązanych, użytkowników lub innych osób.", - "legal.privacy.share.consent.h": "Za Twoją zgodą", - "legal.privacy.share.consent.p": "Możemy udostępniać Twoje informacje stronom trzecim, gdy wyraziłeś na to zgodę.", - "legal.privacy.security.h": "Bezpieczeństwo danych", - "legal.privacy.security.p1": "Wdrożyliśmy odpowiednie środki techniczne i organizacyjne zaprojektowane w celu ochrony Twoich danych osobowych przed przypadkową utratą oraz przed nieuprawnionym dostępem, wykorzystaniem, zmianą i ujawnieniem. Wszystkie informacje, które nam przekazujesz, są przechowywane na bezpiecznych serwerach za zaporami sieciowymi.", - "legal.privacy.security.p2": "Bezpieczeństwo Twoich informacji zależy również od Ciebie. Gdy udostępniliśmy Ci (lub gdy wybrałeś) hasło umożliwiające dostęp do określonych części naszych Usług, jesteś odpowiedzialny za zachowanie poufności tego hasła. Prosimy, abyś nie udostępniał swojego hasła nikomu.", - "legal.privacy.security.p3": "Niestety, przesyłanie informacji przez Internet nie jest całkowicie bezpieczne. Chociaż dokładamy wszelkich starań, aby chronić Twoje dane osobowe, nie możemy zagwarantować bezpieczeństwa danych osobowych przesyłanych do naszych Usług. Wszelkie przesyłanie danych osobowych odbywa się na Twoje własne ryzyko.", + "legal.privacy.share.legal.p": "Możemy ujawnić Twoje informacje, jeÅ›li wymaga tego prawo lub w odpowiedzi na ważne wnioski organów publicznych (np. sÄ…du lub organu rzÄ…dowego). Możemy również ujawnić Twoje informacje w celu egzekwowania naszego regulaminu Å›wiadczenia usÅ‚ug, ochrony naszych praw, prywatnoÅ›ci, bezpieczeÅ„stwa lub wÅ‚asnoÅ›ci i/lub praw, prywatnoÅ›ci, bezpieczeÅ„stwa lub wÅ‚asnoÅ›ci naszych podmiotów powiÄ…zanych, użytkowników lub innych osób.", + "legal.privacy.share.consent.h": "Za TwojÄ… zgodÄ…", + "legal.privacy.share.consent.p": "Możemy udostÄ™pniać Twoje informacje stronom trzecim, gdy wyraziÅ‚eÅ› na to zgodÄ™.", + "legal.privacy.security.h": "BezpieczeÅ„stwo danych", + "legal.privacy.security.p1": "WdrożyliÅ›my odpowiednie Å›rodki techniczne i organizacyjne zaprojektowane w celu ochrony Twoich danych osobowych przed przypadkowÄ… utratÄ… oraz przed nieuprawnionym dostÄ™pem, wykorzystaniem, zmianÄ… i ujawnieniem. Wszystkie informacje, które nam przekazujesz, sÄ… przechowywane na bezpiecznych serwerach za zaporami sieciowymi.", + "legal.privacy.security.p2": "BezpieczeÅ„stwo Twoich informacji zależy również od Ciebie. Gdy udostÄ™pniliÅ›my Ci (lub gdy wybraÅ‚eÅ›) hasÅ‚o umożliwiajÄ…ce dostÄ™p do okreÅ›lonych części naszych UsÅ‚ug, jesteÅ› odpowiedzialny za zachowanie poufnoÅ›ci tego hasÅ‚a. Prosimy, abyÅ› nie udostÄ™pniaÅ‚ swojego hasÅ‚a nikomu.", + "legal.privacy.security.p3": "Niestety, przesyÅ‚anie informacji przez Internet nie jest caÅ‚kowicie bezpieczne. Chociaż dokÅ‚adamy wszelkich staraÅ„, aby chronić Twoje dane osobowe, nie możemy zagwarantować bezpieczeÅ„stwa danych osobowych przesyÅ‚anych do naszych UsÅ‚ug. Wszelkie przesyÅ‚anie danych osobowych odbywa siÄ™ na Twoje wÅ‚asne ryzyko.", "legal.privacy.rights.h": "Twoje prawa i opcje", - "legal.privacy.rights.lead": "Staramy się zapewniać Ci wybór w zakresie danych osobowych, które nam przekazujesz. W zależności od Twojej lokalizacji możesz mieć określone prawa dotyczące swoich danych osobowych, w tym:", - "legal.privacy.rights.li1": "Dostęp do swoich danych osobowych i ich aktualizacja", - "legal.privacy.rights.li2": "Żądanie usunięcia swoich danych osobowych", + "legal.privacy.rights.lead": "Staramy siÄ™ zapewniać Ci wybór w zakresie danych osobowych, które nam przekazujesz. W zależnoÅ›ci od Twojej lokalizacji możesz mieć okreÅ›lone prawa dotyczÄ…ce swoich danych osobowych, w tym:", + "legal.privacy.rights.li1": "DostÄ™p do swoich danych osobowych i ich aktualizacja", + "legal.privacy.rights.li2": "Żądanie usuniÄ™cia swoich danych osobowych", "legal.privacy.rights.li3": "Sprzeciw lub ograniczenie przetwarzania swoich danych osobowych", "legal.privacy.rights.li4": "Przenoszenie danych", "legal.privacy.rights.li5": "Wycofanie zgody (gdy ma zastosowanie)", - "legal.privacy.rights.footer": "Aby skorzystać ze swoich praw, skontaktuj się z nami, korzystając z danych kontaktowych podanych na końcu niniejszej Polityki prywatności. Należy pamiętać, że niektóre z tych praw mogą być ograniczone lub nie mieć zastosowania w zależności od Twojej lokalizacji i konkretnych okoliczności.", + "legal.privacy.rights.footer": "Aby skorzystać ze swoich praw, skontaktuj siÄ™ z nami, korzystajÄ…c z danych kontaktowych podanych na koÅ„cu niniejszej Polityki prywatnoÅ›ci. Należy pamiÄ™tać, że niektóre z tych praw mogÄ… być ograniczone lub nie mieć zastosowania w zależnoÅ›ci od Twojej lokalizacji i konkretnych okolicznoÅ›ci.", "legal.privacy.retention.h": "Przechowywanie danych", - "legal.privacy.retention.p1": "Będziemy przechowywać Twoje dane osobowe przez okres niezbędny do realizacji celów opisanych w niniejszej Polityce prywatności, chyba że prawo wymaga lub zezwala na dłuższy okres przechowywania. Przy ustalaniu czasu przechowywania Twoich informacji bierzemy pod uwagę ilość, charakter i wrażliwość informacji, potencjalne ryzyko szkody wynikające z nieuprawnionego wykorzystania lub ujawnienia, cele przetwarzania oraz obowiązujące wymogi prawne.", - "legal.privacy.retention.p2": "Możemy przechowywać pewne informacje po zamknięciu Twojego konta, między innymi w celu wypełnienia naszych obowiązków prawnych, rozstrzygania sporów oraz egzekwowania naszych umów.", - "legal.privacy.intl.h": "Międzynarodowe transfery danych", - "legal.privacy.intl.p1": "Twoje dane osobowe mogą być przekazywane i przetwarzane w krajach innych niż kraj, w którym mieszkasz. Takie kraje mogą mieć inne przepisy o ochronie danych niż Twój kraj.", - "legal.privacy.intl.p2": "Jeśli przekazujemy Twoje dane osobowe do krajów poza Europejskim Obszarem Gospodarczym lub innych regionów z kompleksowymi przepisami o ochronie danych, zapewnimy odpowiednie zabezpieczenia chroniące Twoje dane osobowe oraz zgodność transferu z obowiązującymi przepisami o ochronie danych.", - "legal.privacy.children.h": "Prywatność osób niepełnoletnich", - "legal.privacy.children.p": "Nasze Usługi nie są przeznaczone dla osób poniżej 16. roku życia i nie zbieramy świadomie danych osobowych od osób poniżej 16. roku życia. Jeśli odkryjemy, że zebraliśmy lub otrzymaliśmy dane osobowe od osoby poniżej 16. roku życia bez weryfikacji zgody rodzicielskiej, usuniemy te informacje. Jeśli uważasz, że możemy posiadać informacje od lub o osobie poniżej 16. roku życia, skontaktuj się z nami.", - "legal.privacy.changes.h": "Zmiany w naszej Polityce prywatności", - "legal.privacy.changes.p1": "Możemy od czasu do czasu aktualizować naszą Politykę prywatności. Jeśli wprowadzimy istotne zmiany w sposobie przetwarzania danych osobowych użytkowników, powiadomimy Cię e-mailem na adres wskazany na Twoim koncie i/lub poprzez powiadomienie na naszej stronie internetowej.", - "legal.privacy.changes.p2": "Data ostatniej aktualizacji Polityki prywatności jest wskazana w górnej części strony. Jesteś odpowiedzialny za zapewnienie, że dysponujemy aktualnym, aktywnym i możliwym do doręczenia adresem e-mail, oraz za okresowe odwiedzanie naszej strony internetowej i niniejszej Polityki prywatności w celu sprawdzenia zmian.", + "legal.privacy.retention.p1": "BÄ™dziemy przechowywać Twoje dane osobowe przez okres niezbÄ™dny do realizacji celów opisanych w niniejszej Polityce prywatnoÅ›ci, chyba że prawo wymaga lub zezwala na dÅ‚uższy okres przechowywania. Przy ustalaniu czasu przechowywania Twoich informacji bierzemy pod uwagÄ™ ilość, charakter i wrażliwość informacji, potencjalne ryzyko szkody wynikajÄ…ce z nieuprawnionego wykorzystania lub ujawnienia, cele przetwarzania oraz obowiÄ…zujÄ…ce wymogi prawne.", + "legal.privacy.retention.p2": "Możemy przechowywać pewne informacje po zamkniÄ™ciu Twojego konta, miÄ™dzy innymi w celu wypeÅ‚nienia naszych obowiÄ…zków prawnych, rozstrzygania sporów oraz egzekwowania naszych umów.", + "legal.privacy.intl.h": "MiÄ™dzynarodowe transfery danych", + "legal.privacy.intl.p1": "Twoje dane osobowe mogÄ… być przekazywane i przetwarzane w krajach innych niż kraj, w którym mieszkasz. Takie kraje mogÄ… mieć inne przepisy o ochronie danych niż Twój kraj.", + "legal.privacy.intl.p2": "JeÅ›li przekazujemy Twoje dane osobowe do krajów poza Europejskim Obszarem Gospodarczym lub innych regionów z kompleksowymi przepisami o ochronie danych, zapewnimy odpowiednie zabezpieczenia chroniÄ…ce Twoje dane osobowe oraz zgodność transferu z obowiÄ…zujÄ…cymi przepisami o ochronie danych.", + "legal.privacy.children.h": "Prywatność osób niepeÅ‚noletnich", + "legal.privacy.children.p": "Nasze UsÅ‚ugi nie sÄ… przeznaczone dla osób poniżej 16. roku życia i nie zbieramy Å›wiadomie danych osobowych od osób poniżej 16. roku życia. JeÅ›li odkryjemy, że zebraliÅ›my lub otrzymaliÅ›my dane osobowe od osoby poniżej 16. roku życia bez weryfikacji zgody rodzicielskiej, usuniemy te informacje. JeÅ›li uważasz, że możemy posiadać informacje od lub o osobie poniżej 16. roku życia, skontaktuj siÄ™ z nami.", + "legal.privacy.changes.h": "Zmiany w naszej Polityce prywatnoÅ›ci", + "legal.privacy.changes.p1": "Możemy od czasu do czasu aktualizować naszÄ… PolitykÄ™ prywatnoÅ›ci. JeÅ›li wprowadzimy istotne zmiany w sposobie przetwarzania danych osobowych użytkowników, powiadomimy CiÄ™ e-mailem na adres wskazany na Twoim koncie i/lub poprzez powiadomienie na naszej stronie internetowej.", + "legal.privacy.changes.p2": "Data ostatniej aktualizacji Polityki prywatnoÅ›ci jest wskazana w górnej części strony. JesteÅ› odpowiedzialny za zapewnienie, że dysponujemy aktualnym, aktywnym i możliwym do dorÄ™czenia adresem e-mail, oraz za okresowe odwiedzanie naszej strony internetowej i niniejszej Polityki prywatnoÅ›ci w celu sprawdzenia zmian.", "legal.privacy.contact.h": "Kontakt", - "legal.privacy.contact.lead": "Jeśli masz pytania lub wątpliwości dotyczące naszej Polityki prywatności lub naszych praktyk w zakresie danych, skontaktuj się z nami pod adresem:", - "legal.terms.title": "Regulamin świadczenia usług", - "legal.terms.s1.h": "1. Akceptacja warunków", - "legal.terms.s1.p": "Uzyskując dostęp do platformy danych produktowych Descrybe oraz powiązanych usług (łącznie: \"Usługi\") lub korzystając z nich, zgadzasz się na związanie niniejszym Regulaminem świadczenia usług oraz wszystkimi obowiązującymi przepisami prawa. Jeśli nie zgadzasz się z którymkolwiek z tych warunków, korzystanie z Usług lub dostęp do nich jest zabroniony.", + "legal.privacy.contact.lead": "JeÅ›li masz pytania lub wÄ…tpliwoÅ›ci dotyczÄ…ce naszej Polityki prywatnoÅ›ci lub naszych praktyk w zakresie danych, skontaktuj siÄ™ z nami pod adresem:", + "legal.terms.title": "Regulamin Å›wiadczenia usÅ‚ug", + "legal.terms.s1.h": "1. Akceptacja warunków", + "legal.terms.s1.p": "UzyskujÄ…c dostÄ™p do platformy danych produktowych Descrybe oraz powiÄ…zanych usÅ‚ug (łącznie: \"UsÅ‚ugi\") lub korzystajÄ…c z nich, zgadzasz siÄ™ na zwiÄ…zanie niniejszym Regulaminem Å›wiadczenia usÅ‚ug oraz wszystkimi obowiÄ…zujÄ…cymi przepisami prawa. JeÅ›li nie zgadzasz siÄ™ z którymkolwiek z tych warunków, korzystanie z UsÅ‚ug lub dostÄ™p do nich jest zabroniony.", "legal.terms.s2.h": "2. Licencja na korzystanie", - "legal.terms.s2.p1": "Z zastrzeżeniem przestrzegania niniejszego Regulaminu świadczenia usług, Descrybe udziela Ci ograniczonej, niewyłącznej, niezbywalnej i odwołalnej licencji na dostęp do Usług i korzystanie z nich w celach biznesowych.", + "legal.terms.s2.p1": "Z zastrzeżeniem przestrzegania niniejszego Regulaminu Å›wiadczenia usÅ‚ug, Descrybe udziela Ci ograniczonej, niewyłącznej, niezbywalnej i odwoÅ‚alnej licencji na dostÄ™p do UsÅ‚ug i korzystanie z nich w celach biznesowych.", "legal.terms.s2.lead": "Niniejsza licencja nie obejmuje:", - "legal.terms.s2.li1": "Modyfikowania lub kopiowania Usług ani jakichkolwiek ich treści", - "legal.terms.s2.li2": "Korzystania z Usług w jakimkolwiek celu komercyjnym innym niż autoryzowane korzystanie biznesowe", - "legal.terms.s2.li3": "Próby dekompilacji lub inżynierii wstecznej jakiegokolwiek oprogramowania zawartego w Usługach", - "legal.terms.s2.li4": "Usuwania jakichkolwiek informacji o prawach autorskich lub własności z materiałów", - "legal.terms.s2.li5": "Przekazywania materiałów innej osobie lub \"odzwierciedlania\" materiałów na jakimkolwiek innym serwerze", - "legal.terms.s2.p2": "Niniejsza licencja wygaśnie automatycznie w przypadku naruszenia któregokolwiek z tych ograniczeń i może zostać wypowiedziana przez Descrybe w dowolnym momencie.", - "legal.terms.s3.h": "3. Subskrypcja i płatność", - "legal.terms.s3.p1": "Dostęp do Usług może wymagać płatnej subskrypcji. Warunki płatności zostaną określone w trakcie procesu subskrypcji. Wszystkie płatności są bezzwrotne, chyba że Descrybe określi inaczej na piśmie.", - "legal.terms.s3.p2": "Descrybe zastrzega sobie prawo do zmiany opłat abonamentowych z rozsądnym wyprzedzeniem. Dalsze korzystanie z Usług po zmianie opłaty stanowi akceptację nowych opłat.", - "legal.terms.s4.h": "4. Treści użytkownika", - "legal.terms.s4.p1": "Zachowujesz wszystkie prawa do wszelkich treści, które przesyłasz, publikujesz lub wyświetlasz w Usługach lub za ich pośrednictwem (\"Treści użytkownika\"). Przekazując Treści użytkownika do Descrybe, udzielasz Descrybe światowej, niewyłącznej i nieodpłatnej licencji na używanie, reprodukowanie, modyfikowanie, adaptowanie, publikowanie, tłumaczenie i dystrybucję takich treści w związku ze świadczeniem Usług.", - "legal.terms.s4.lead": "Oświadczasz i gwarantujesz, że:", - "legal.terms.s4.li1": "Posiadasz lub kontrolujesz wszystkie prawa do Treści użytkownika, które przekazujesz", - "legal.terms.s4.li2": "Treści użytkownika nie naruszają niniejszego Regulaminu świadczenia usług", - "legal.terms.s4.li3": "Treści użytkownika nie spowodują szkody żadnej osobie ani podmiotowi", + "legal.terms.s2.li1": "Modyfikowania lub kopiowania UsÅ‚ug ani jakichkolwiek ich treÅ›ci", + "legal.terms.s2.li2": "Korzystania z UsÅ‚ug w jakimkolwiek celu komercyjnym innym niż autoryzowane korzystanie biznesowe", + "legal.terms.s2.li3": "Próby dekompilacji lub inżynierii wstecznej jakiegokolwiek oprogramowania zawartego w UsÅ‚ugach", + "legal.terms.s2.li4": "Usuwania jakichkolwiek informacji o prawach autorskich lub wÅ‚asnoÅ›ci z materiałów", + "legal.terms.s2.li5": "Przekazywania materiałów innej osobie lub \"odzwierciedlania\" materiałów na jakimkolwiek innym serwerze", + "legal.terms.s2.p2": "Niniejsza licencja wygaÅ›nie automatycznie w przypadku naruszenia któregokolwiek z tych ograniczeÅ„ i może zostać wypowiedziana przez Descrybe w dowolnym momencie.", + "legal.terms.s3.h": "3. Subskrypcja i pÅ‚atność", + "legal.terms.s3.p1": "DostÄ™p do UsÅ‚ug może wymagać pÅ‚atnej subskrypcji. Warunki pÅ‚atnoÅ›ci zostanÄ… okreÅ›lone w trakcie procesu subskrypcji. Wszystkie pÅ‚atnoÅ›ci sÄ… bezzwrotne, chyba że Descrybe okreÅ›li inaczej na piÅ›mie.", + "legal.terms.s3.p2": "Descrybe zastrzega sobie prawo do zmiany opÅ‚at abonamentowych z rozsÄ…dnym wyprzedzeniem. Dalsze korzystanie z UsÅ‚ug po zmianie opÅ‚aty stanowi akceptacjÄ™ nowych opÅ‚at.", + "legal.terms.s4.h": "4. TreÅ›ci użytkownika", + "legal.terms.s4.p1": "Zachowujesz wszystkie prawa do wszelkich treÅ›ci, które przesyÅ‚asz, publikujesz lub wyÅ›wietlasz w UsÅ‚ugach lub za ich poÅ›rednictwem (\"TreÅ›ci użytkownika\"). PrzekazujÄ…c TreÅ›ci użytkownika do Descrybe, udzielasz Descrybe Å›wiatowej, niewyłącznej i nieodpÅ‚atnej licencji na używanie, reprodukowanie, modyfikowanie, adaptowanie, publikowanie, tÅ‚umaczenie i dystrybucjÄ™ takich treÅ›ci w zwiÄ…zku ze Å›wiadczeniem UsÅ‚ug.", + "legal.terms.s4.lead": "OÅ›wiadczasz i gwarantujesz, że:", + "legal.terms.s4.li1": "Posiadasz lub kontrolujesz wszystkie prawa do TreÅ›ci użytkownika, które przekazujesz", + "legal.terms.s4.li2": "TreÅ›ci użytkownika nie naruszajÄ… niniejszego Regulaminu Å›wiadczenia usÅ‚ug", + "legal.terms.s4.li3": "TreÅ›ci użytkownika nie spowodujÄ… szkody żadnej osobie ani podmiotowi", "legal.terms.s5.h": "5. Sztuczna inteligencja", - "legal.terms.s5.p1": "Usługi wykorzystują technologie sztucznej inteligencji i uczenia maszynowego. Przyjmujesz do wiadomości, że treści generowane przez AI mogą nie być doskonałe, i zgadzasz się przeglądać wszystkie treści generowane przez AI przed ich wykorzystaniem w swojej działalności.", - "legal.terms.s5.p2": "Descrybe może wykorzystywać zanonimizowane i zagregowane Treści użytkownika do trenowania i ulepszania naszych modeli AI, z zastrzeżeniem naszej Polityki prywatności. Możesz zrezygnować z wykorzystywania swoich danych do trenowania AI, kontaktując się z nami.", - "legal.terms.s6.h": "6. Własność intelektualna", - "legal.terms.s6.p": "Usługi oraz ich oryginalna treść, funkcje i funkcjonalność są własnością Descrybe i są chronione międzynarodowymi przepisami o prawie autorskim, znakach towarowych, patentach, tajemnicach handlowych oraz innymi prawami własności intelektualnej lub prawami własności.", - "legal.terms.s7.h": "7. Wyłączenie gwarancji", - "legal.terms.s7.p1": "Usługi są świadczone \"tak jak są\" i \"w miarę dostępności\". Descrybe nie składa żadnych gwarancji, wyraźnych ani dorozumianych, i niniejszym zrzeka się wszelkich gwarancji, w tym — bez ograniczeń — dorozumianych gwarancji przydatności handlowej, przydatności do określonego celu, braku naruszeń lub przebiegu realizacji.", - "legal.terms.s7.p2": "Descrybe nie gwarantuje, że Usługi będą działać w sposób nieprzerwany, bezpieczny lub dostępny w określonym czasie lub miejscu, ani że błędy lub wady zostaną naprawione.", - "legal.terms.s8.h": "8. Ograniczenie odpowiedzialności", - "legal.terms.s8.lead": "W żadnym wypadku Descrybe nie ponosi odpowiedzialności za szkody pośrednie, przypadkowe, szczególne, wtórne lub karne, w tym — bez ograniczeń — utratę zysków, danych, użytkowania, wartości firmy lub inne straty niematerialne, wynikające z:", - "legal.terms.s8.li1": "Twojego dostępu do Usług lub korzystania z nich albo niemożności uzyskania dostępu lub korzystania z Usług", - "legal.terms.s8.li2": "Jakiegokolwiek postępowania lub treści osób trzecich w Usługach", - "legal.terms.s8.li3": "Jakichkolwiek treści uzyskanych z Usług", - "legal.terms.s8.li4": "Nieuprawnionego dostępu, wykorzystania lub zmiany Twoich transmisji lub treści", - "legal.terms.s9.h": "9. Rozwiązanie", - "legal.terms.s9.p1": "Descrybe może natychmiast zakończyć lub zawiesić Twój dostęp do Usług, bez wcześniejszego powiadomienia i bez odpowiedzialności, z dowolnego powodu, w tym — bez ograniczeń — w przypadku naruszenia niniejszego Regulaminu świadczenia usług.", - "legal.terms.s9.p2": "Po rozwiązaniu Twoje prawo do korzystania z Usług ustaje natychmiast. Jeśli chcesz zakończyć swoje konto, możesz po prostu zaprzestać korzystania z Usług lub skontaktować się z nami w celu żądania usunięcia konta.", - "legal.terms.s10.h": "10. Prawo właściwe", - "legal.terms.s10.p": "Niniejsze Warunki podlegają prawu Słowenii i będą interpretowane zgodnie z nim, bez względu na zasady kolizji praw.", - "legal.terms.s11.h": "11. Zmiany warunków", - "legal.terms.s11.p": "Descrybe zastrzega sobie prawo do zmiany lub zastąpienia niniejszego Regulaminu świadczenia usług w dowolnym momencie. Twoim obowiązkiem jest okresowe sprawdzanie niniejszych Warunków pod kątem zmian. Dalsze korzystanie z Usług po opublikowaniu jakichkolwiek zmian stanowi akceptację tych zmian.", + "legal.terms.s5.p1": "UsÅ‚ugi wykorzystujÄ… technologie sztucznej inteligencji i uczenia maszynowego. Przyjmujesz do wiadomoÅ›ci, że treÅ›ci generowane przez AI mogÄ… nie być doskonaÅ‚e, i zgadzasz siÄ™ przeglÄ…dać wszystkie treÅ›ci generowane przez AI przed ich wykorzystaniem w swojej dziaÅ‚alnoÅ›ci.", + "legal.terms.s5.p2": "Descrybe może wykorzystywać zanonimizowane i zagregowane TreÅ›ci użytkownika do trenowania i ulepszania naszych modeli AI, z zastrzeżeniem naszej Polityki prywatnoÅ›ci. Możesz zrezygnować z wykorzystywania swoich danych do trenowania AI, kontaktujÄ…c siÄ™ z nami.", + "legal.terms.s6.h": "6. WÅ‚asność intelektualna", + "legal.terms.s6.p": "UsÅ‚ugi oraz ich oryginalna treść, funkcje i funkcjonalność sÄ… wÅ‚asnoÅ›ciÄ… Descrybe i sÄ… chronione miÄ™dzynarodowymi przepisami o prawie autorskim, znakach towarowych, patentach, tajemnicach handlowych oraz innymi prawami wÅ‚asnoÅ›ci intelektualnej lub prawami wÅ‚asnoÅ›ci.", + "legal.terms.s7.h": "7. Wyłączenie gwarancji", + "legal.terms.s7.p1": "UsÅ‚ugi sÄ… Å›wiadczone \"tak jak sÄ…\" i \"w miarÄ™ dostÄ™pnoÅ›ci\". Descrybe nie skÅ‚ada żadnych gwarancji, wyraźnych ani dorozumianych, i niniejszym zrzeka siÄ™ wszelkich gwarancji, w tym — bez ograniczeÅ„ — dorozumianych gwarancji przydatnoÅ›ci handlowej, przydatnoÅ›ci do okreÅ›lonego celu, braku naruszeÅ„ lub przebiegu realizacji.", + "legal.terms.s7.p2": "Descrybe nie gwarantuje, że UsÅ‚ugi bÄ™dÄ… dziaÅ‚ać w sposób nieprzerwany, bezpieczny lub dostÄ™pny w okreÅ›lonym czasie lub miejscu, ani że błędy lub wady zostanÄ… naprawione.", + "legal.terms.s8.h": "8. Ograniczenie odpowiedzialnoÅ›ci", + "legal.terms.s8.lead": "W żadnym wypadku Descrybe nie ponosi odpowiedzialnoÅ›ci za szkody poÅ›rednie, przypadkowe, szczególne, wtórne lub karne, w tym — bez ograniczeÅ„ — utratÄ™ zysków, danych, użytkowania, wartoÅ›ci firmy lub inne straty niematerialne, wynikajÄ…ce z:", + "legal.terms.s8.li1": "Twojego dostÄ™pu do UsÅ‚ug lub korzystania z nich albo niemożnoÅ›ci uzyskania dostÄ™pu lub korzystania z UsÅ‚ug", + "legal.terms.s8.li2": "Jakiegokolwiek postÄ™powania lub treÅ›ci osób trzecich w UsÅ‚ugach", + "legal.terms.s8.li3": "Jakichkolwiek treÅ›ci uzyskanych z UsÅ‚ug", + "legal.terms.s8.li4": "Nieuprawnionego dostÄ™pu, wykorzystania lub zmiany Twoich transmisji lub treÅ›ci", + "legal.terms.s9.h": "9. RozwiÄ…zanie", + "legal.terms.s9.p1": "Descrybe może natychmiast zakoÅ„czyć lub zawiesić Twój dostÄ™p do UsÅ‚ug, bez wczeÅ›niejszego powiadomienia i bez odpowiedzialnoÅ›ci, z dowolnego powodu, w tym — bez ograniczeÅ„ — w przypadku naruszenia niniejszego Regulaminu Å›wiadczenia usÅ‚ug.", + "legal.terms.s9.p2": "Po rozwiÄ…zaniu Twoje prawo do korzystania z UsÅ‚ug ustaje natychmiast. JeÅ›li chcesz zakoÅ„czyć swoje konto, możesz po prostu zaprzestać korzystania z UsÅ‚ug lub skontaktować siÄ™ z nami w celu żądania usuniÄ™cia konta.", + "legal.terms.s10.h": "10. Prawo wÅ‚aÅ›ciwe", + "legal.terms.s10.p": "Niniejsze Warunki podlegajÄ… prawu SÅ‚owenii i bÄ™dÄ… interpretowane zgodnie z nim, bez wzglÄ™du na zasady kolizji praw.", + "legal.terms.s11.h": "11. Zmiany warunków", + "legal.terms.s11.p": "Descrybe zastrzega sobie prawo do zmiany lub zastÄ…pienia niniejszego Regulaminu Å›wiadczenia usÅ‚ug w dowolnym momencie. Twoim obowiÄ…zkiem jest okresowe sprawdzanie niniejszych Warunków pod kÄ…tem zmian. Dalsze korzystanie z UsÅ‚ug po opublikowaniu jakichkolwiek zmian stanowi akceptacjÄ™ tych zmian.", "legal.terms.s12.h": "12. Kontakt", - "legal.terms.s12.lead": "Jeśli masz pytania dotyczące niniejszego Regulaminu świadczenia usług, skontaktuj się z nami pod adresem:", - "plans.loadFailed": "Nie udało się załadować planów", - "plans.loading": "Ładowanie planów…", - "plans.apiUnavailable": "API planów nie jest jeszcze dostępne w tym backendzie. Wyświetlamy publiczne porównanie cen.", - "plans.title": "Wybierz swój plan", - "plans.sub.onPrefix": "Jesteś na planie", - "plans.sub.enterpriseSuffix": "— nieograniczone produkty i AI. Nie jest potrzebny upgrade w trybie samoobsługowym.", - "plans.sub.paygSuffix": "— płatność według użycia. Porównaj publiczne plany poniżej lub skontaktuj się z działem sprzedaży w sprawie Enterprise.", - "plans.sub.creditsMid": "z {remaining} pozostałymi kredytami AI.", - "plans.sub.creditsSuffix": "Ulepsz Starter → Growth → Business przez Checkout lub skontaktuj się z działem sprzedaży w sprawie Enterprise.", - "plans.sub.none": "Nie przypisano jeszcze planu (np. po pominiętej migracji). Wybierz plan poniżej — pojemność nie jest Nieograniczona, dopóki Checkout lub administrator nie przypisze planu.", - "plans.stripeHint": "Upgrade'y samoobsługowe korzystają ze Stripe Checkout.", + "legal.terms.s12.lead": "JeÅ›li masz pytania dotyczÄ…ce niniejszego Regulaminu Å›wiadczenia usÅ‚ug, skontaktuj siÄ™ z nami pod adresem:", + "plans.loadFailed": "Nie udaÅ‚o siÄ™ zaÅ‚adować planów", + "plans.loading": "Ładowanie planów…", + "plans.apiUnavailable": "API planów nie jest jeszcze dostÄ™pne w tym backendzie. WyÅ›wietlamy publiczne porównanie cen.", + "plans.title": "Wybierz swój plan", + "plans.sub.onPrefix": "JesteÅ› na planie", + "plans.sub.enterpriseSuffix": "— nieograniczone produkty i AI. Nie jest potrzebny upgrade w trybie samoobsÅ‚ugowym.", + "plans.sub.paygSuffix": "— pÅ‚atność wedÅ‚ug użycia. Porównaj publiczne plany poniżej lub skontaktuj siÄ™ z dziaÅ‚em sprzedaży w sprawie Enterprise.", + "plans.sub.creditsMid": "z {remaining} pozostaÅ‚ymi kredytami AI.", + "plans.sub.creditsSuffix": "Ulepsz Starter → Growth → Business przez Checkout lub skontaktuj siÄ™ z dziaÅ‚em sprzedaży w sprawie Enterprise.", + "plans.sub.none": "Nie przypisano jeszcze planu (np. po pominiÄ™tej migracji). Wybierz plan poniżej — pojemność nie jest Nieograniczona, dopóki Checkout lub administrator nie przypisze planu.", + "plans.stripeHint": "Upgrade'y samoobsÅ‚ugowe korzystajÄ… ze Stripe Checkout.", "plans.checkoutUnavailable": "Checkout samoobslugowy jest niedostepny, dopoki Stripe nie zostanie skonfigurowany. Skontaktuj sie ze sprzedaza, aby uzyskac plan.", "plans.fallbackName": "Plan taryfowy", - "plans.fallbackDescription": "Pojemność dla Twojego katalogu", + "plans.fallbackDescription": "Pojemność dla Twojego katalogu", "plans.badge.current": "Aktualny", "plans.badge.popular": "Najpopularniejszy", "plans.price.custom": "Indywidualny", @@ -4854,104 +4855,104 @@ export const pl: MessageDict = { "plans.price.seePricing": "Zobacz cennik", "plans.capacity.unlimitedSkus": "Nieograniczone SKU", "plans.capacity.unlimitedAi": "Nieograniczone kredyty AI", - "plans.capacity.upToProducts": "Do {count} produktów", - "plans.capacity.creditsPerMonth": "{count} kredytów AI / mies.", - "plans.cta.requestUpgrade": "Poproś o ulepszenie", + "plans.capacity.upToProducts": "Do {count} produktów", + "plans.capacity.creditsPerMonth": "{count} kredytów AI / mies.", + "plans.cta.requestUpgrade": "PoproÅ› o ulepszenie", "plans.cta.current": "Aktualny plan", - "plans.cta.contactSales": "Kontakt ze sprzedażą", - "plans.cta.switchInBilling": "Zmień w rozliczeniach", + "plans.cta.contactSales": "Kontakt ze sprzedażą", + "plans.cta.switchInBilling": "ZmieÅ„ w rozliczeniach", "plans.cta.upgradeTo": "Ulepsz do {name}", - "plans.cta.startingCheckout": "Uruchamianie checkout…", - "plans.planApplied": "Plan {plan} zastosowany. Twoje kredyty są gotowe.", - "plans.faq.title": "Często zadawane pytania", - "plans.faq.limit.q": "Co się stanie, gdy osiągnę limit?", - "plans.faq.limit.a": "Najpierw zobaczysz łagodne ostrzeżenia. Gdy skończą Ci się kredyty AI lub osiągniesz limit SKU, zadania wymagające tej pojemności są blokowane, dopóki nie zwolnisz miejsca, nie poczekasz na kolejny cykl lub nie ulepszysz planu.", - "plans.faq.selfServe.q": "Czy mogę samodzielnie ulepszyć plan?", - "plans.faq.selfServe.a": "Administratorzy firmy mogą samodzielnie wykupić Starter, Growth i Business przez Checkout na karcie planu. Członkowie muszą poprosić administratora — Checkout wymaga roli administratora. Enterprise zawsze idzie przez sprzedaż. Administratorzy platformy nadal mogą przypisywać plany w Billing Admin.", + "plans.cta.startingCheckout": "Uruchamianie checkout…", + "plans.planApplied": "Plan {plan} zastosowany. Twoje kredyty sÄ… gotowe.", + "plans.faq.title": "CzÄ™sto zadawane pytania", + "plans.faq.limit.q": "Co siÄ™ stanie, gdy osiÄ…gnÄ™ limit?", + "plans.faq.limit.a": "Najpierw zobaczysz Å‚agodne ostrzeżenia. Gdy skoÅ„czÄ… Ci siÄ™ kredyty AI lub osiÄ…gniesz limit SKU, zadania wymagajÄ…ce tej pojemnoÅ›ci sÄ… blokowane, dopóki nie zwolnisz miejsca, nie poczekasz na kolejny cykl lub nie ulepszysz planu.", + "plans.faq.selfServe.q": "Czy mogÄ™ samodzielnie ulepszyć plan?", + "plans.faq.selfServe.a": "Administratorzy firmy mogÄ… samodzielnie wykupić Starter, Growth i Business przez Checkout na karcie planu. CzÅ‚onkowie muszÄ… poprosić administratora — Checkout wymaga roli administratora. Enterprise zawsze idzie przez sprzedaż. Administratorzy platformy nadal mogÄ… przypisywać plany w Billing Admin.", "plans.faq.enterprise.q": "Enterprise i miliony SKU", - "plans.faq.enterprise.a": "Indywidualna pojemność, własny klucz AI (BYOK), SLA i zarządzanie kontem idą przez sprzedaż. Zarezerwuj termin w Calendly — Enterprise nie jest samoobsługowe przy skali milionów SKU. Aplikacja pokazuje Nieograniczone dla pojemności SKU i AI.", + "plans.faq.enterprise.a": "Indywidualna pojemność, wÅ‚asny klucz AI (BYOK), SLA i zarzÄ…dzanie kontem idÄ… przez sprzedaż. Zarezerwuj termin w Calendly — Enterprise nie jest samoobsÅ‚ugowe przy skali milionów SKU. Aplikacja pokazuje Nieograniczone dla pojemnoÅ›ci SKU i AI.", "plans.faq.pricing.q": "Gdzie jest publiczny cennik?", - "plans.faq.pricing.aBefore": "Zobacz porównanie marketingowe na", + "plans.faq.pricing.aBefore": "Zobacz porównanie marketingowe na", "plans.faq.pricing.pricingPage": "stronie Cennik", - "plans.faq.pricing.aMid": "— CTA to Zacznij (rejestracja) lub Kontakt ze sprzedażą. Zarządzaj użyciem w dowolnym momencie w", + "plans.faq.pricing.aMid": "— CTA to Zacznij (rejestracja) lub Kontakt ze sprzedażą. ZarzÄ…dzaj użyciem w dowolnym momencie w", "plans.faq.pricing.aAfter": ".", "plans.custom.title": "Potrzebujesz planu indywidualnego?", - "plans.custom.body": "Pojemność Enterprise, własny klucz AI i SLA są obsługiwane przez nasz zespół.", - "plans.custom.looking": "Szukasz szczegółów publicznych planów?", + "plans.custom.body": "Pojemność Enterprise, wÅ‚asny klucz AI i SLA sÄ… obsÅ‚ugiwane przez nasz zespół.", + "plans.custom.looking": "Szukasz szczegółów publicznych planów?", "ai.title": "Integracje AI", - "ai.description": "Wybierz kredyty platformy lub własny klucz, a następnie dostosuj prompty za pomocą zmiennych.", + "ai.description": "Wybierz kredyty platformy lub wÅ‚asny klucz, a nastÄ™pnie dostosuj prompty za pomocÄ… zmiennych.", "ai.crumb": "Integracje AI", - "ai.adminOnly": "Tylko administratorzy firmy mogą zmieniać ustawienia AI. Możesz przeglądać bieżącą konfigurację.", - "ai.badge.ownKey": "Twój własny klucz", + "ai.adminOnly": "Tylko administratorzy firmy mogÄ… zmieniać ustawienia AI. Możesz przeglÄ…dać bieżącÄ… konfiguracjÄ™.", + "ai.badge.ownKey": "Twój wÅ‚asny klucz", "ai.badge.platform": "Kredyty / klucz platformy", "ai.badge.active": "Aktywne: {label}", - "ai.badge.platformKeyAvailable": "Klucz platformy dostępny", + "ai.badge.platformKeyAvailable": "Klucz platformy dostÄ™pny", "ai.badge.lastTest": "Ostatni test: {status}", "ai.providerMode.title": "Tryb dostawcy", - "ai.providerMode.desc": "Platforma używa kredytów Descrybe i naszego klucza. Popularny lub Niestandardowy używa Twojego klucza zgodnego z OpenAI (samo wywołanie dostawcy nie zużywa kredytów platformy; reguły kredytów funkcji nadal obowiązują).", - "ai.whoPays": "Kto płaci za model?", + "ai.providerMode.desc": "Platforma używa kredytów Descrybe i naszego klucza. Popularny lub Niestandardowy używa Twojego klucza zgodnego z OpenAI (samo wywoÅ‚anie dostawcy nie zużywa kredytów platformy; reguÅ‚y kredytów funkcji nadal obowiÄ…zujÄ…).", + "ai.whoPays": "Kto pÅ‚aci za model?", "ai.mode.internal": "Platforma (kredyty / klucz Descrybe)", - "ai.mode.popular": "Twój klucz — popularny dostawca", - "ai.mode.custom": "Twój klucz — własny endpoint", - "ai.useCompanyKey": "Używaj tego klucza firmowego do przetwarzania, SEO AI i kampanii AI", + "ai.mode.popular": "Twój klucz — popularny dostawca", + "ai.mode.custom": "Twój klucz — wÅ‚asny endpoint", + "ai.useCompanyKey": "Używaj tego klucza firmowego do przetwarzania, SEO AI i kampanii AI", "ai.popular.title": "Popularny dostawca", "ai.popular.desc": "Endpointy zgodne z OpenAI. Anthropic przez OpenRouter.", "ai.field.provider": "Dostawca", "ai.field.model": "Model", "ai.placeholder.modelId": "id modelu", "ai.baseUrlLabel": "Bazowy URL: {url}", - "ai.custom.title": "Własny endpoint", + "ai.custom.title": "WÅ‚asny endpoint", "ai.custom.desc": "Wpisz bazowy URL HTTPS swojego dostawcy AI.", "ai.field.baseUrl": "Bazowy URL", "ai.apiKey.title": "Klucz API", - "ai.apiKey.desc": "Pozostaw puste, aby zachować istniejący klucz. Surowych sekretów nigdy nie zwracamy — tylko zamaskowane last4.", + "ai.apiKey.desc": "Pozostaw puste, aby zachować istniejÄ…cy klucz. Surowych sekretów nigdy nie zwracamy — tylko zamaskowane last4.", "ai.storedKey": "Zapisany klucz: {masked}", "ai.field.apiKey": "Klucz API", - "ai.placeholder.keepKey": "•••• pozostaw puste, aby zachować", - "ai.clearStoredKey": "Wyczyść zapisany klucz API", - "ai.saveProvider": "Zapisz dostawcę", - "ai.testConnection": "Testuj połączenie", - "ai.prompts.title": "Szablony promptów", - "ai.prompts.descBefore": "Dostosuj prompty systemowe i użytkownika dla tekstów produktów, meta SEO i e-maili kampanii. Wstawiaj zmienne takie jak", - "ai.prompts.descMid": "— są wypełniane w czasie działania. Głos brand kitu jest dostępny jako", + "ai.placeholder.keepKey": "•••• pozostaw puste, aby zachować", + "ai.clearStoredKey": "Wyczyść zapisany klucz API", + "ai.saveProvider": "Zapisz dostawcÄ™", + "ai.testConnection": "Testuj połączenie", + "ai.prompts.title": "Szablony promptów", + "ai.prompts.descBefore": "Dostosuj prompty systemowe i użytkownika dla tekstów produktów, meta SEO i e-maili kampanii. Wstawiaj zmienne takie jak", + "ai.prompts.descMid": "— sÄ… wypeÅ‚niane w czasie dziaÅ‚ania. GÅ‚os brand kitu jest dostÄ™pny jako", "ai.prompts.descAfter": ".", "ai.field.feature": "Funkcja", "ai.badge.custom": "Niestandardowy", - "ai.badge.builtin": "Wbudowany domyślny", - "ai.badge.disabledDefault": "Wyłączone → używany domyślny", - "ai.useCustomPrompt": "Użyj tego niestandardowego promptu (wył. = wbudowany domyślny)", - "ai.insertVariableInto": "Wstaw zmienną do", + "ai.badge.builtin": "Wbudowany domyÅ›lny", + "ai.badge.disabledDefault": "Wyłączone → używany domyÅ›lny", + "ai.useCustomPrompt": "Użyj tego niestandardowego promptu (wyÅ‚. = wbudowany domyÅ›lny)", + "ai.insertVariableInto": "Wstaw zmiennÄ… do", "ai.insert.system": "Warstwa systemu", - "ai.insert.user": "Użytkownik", + "ai.insert.user": "Użytkownik", "ai.field.systemPrompt": "Prompt systemowy", - "ai.field.userPrompt": "Prompt użytkownika", + "ai.field.userPrompt": "Prompt użytkownika", "ai.savePrompts": "Zapisz prompty", - "ai.resetDefault": "Przywróć domyślne", - "ai.editBrandVoice": "Edytuj głos marki", - "ai.flash.loadFailed": "Nie udało się wczytać ustawień AI", - "ai.flash.usingPlatform": "Używane jest AI platformy (kredyty / klucz Descrybe, gdy skonfigurowane).", - "ai.flash.providerSaved": "Dostawca AI zapisany. Klucze są szyfrowane i nie są już pokazywane.", - "ai.flash.saveFailed": "Nie udało się zapisać", - "ai.flash.savePromptsFailed": "Nie udało się zapisać promptów", - "ai.flash.resetFailed": "Nie udało się zresetować promptu", - "ai.flash.connectionFailed": "Połączenie nieudane", + "ai.resetDefault": "Przywróć domyÅ›lne", + "ai.editBrandVoice": "Edytuj gÅ‚os marki", + "ai.flash.loadFailed": "Nie udaÅ‚o siÄ™ wczytać ustawieÅ„ AI", + "ai.flash.usingPlatform": "Używane jest AI platformy (kredyty / klucz Descrybe, gdy skonfigurowane).", + "ai.flash.providerSaved": "Dostawca AI zapisany. Klucze sÄ… szyfrowane i nie sÄ… już pokazywane.", + "ai.flash.saveFailed": "Nie udaÅ‚o siÄ™ zapisać", + "ai.flash.savePromptsFailed": "Nie udaÅ‚o siÄ™ zapisać promptów", + "ai.flash.resetFailed": "Nie udaÅ‚o siÄ™ zresetować promptu", + "ai.flash.connectionFailed": "Połączenie nieudane", "ai.flash.testFailed": "Test nieudany", - "ai.action.changeSettings": "zmienić ustawienia dostawcy AI", - "ai.action.changePrompts": "zmienić prompty AI", - "ai.action.testProvider": "przetestować dostawcę AI", - "email.title": "Wysyłka e-mail", + "ai.action.changeSettings": "zmienić ustawienia dostawcy AI", + "ai.action.changePrompts": "zmienić prompty AI", + "ai.action.testProvider": "przetestować dostawcÄ™ AI", + "email.title": "WysyÅ‚ka e-mail", "email.description": "Resend lub SMTP do kampanii marketingowych. Sekrety szyfrowane w spoczynku.", - "email.adminOnly": "Tylko administratorzy firmy mogą zmieniać ustawienia dostawcy e-mail. Możesz przeglądać bieżącą konfigurację.", + "email.adminOnly": "Tylko administratorzy firmy mogÄ… zmieniać ustawienia dostawcy e-mail. Możesz przeglÄ…dać bieżącÄ… konfiguracjÄ™.", "email.crumb": "Integracja e-mail", - "email.dryRunForced": "Tryb dry-run jest wymuszony ({reason}). Plany Free i EMAIL_DRY_RUN nigdy nie wysyłają prawdziwych blastów.", + "email.dryRunForced": "Tryb dry-run jest wymuszony ({reason}). Plany Free i EMAIL_DRY_RUN nigdy nie wysyÅ‚ajÄ… prawdziwych blastów.", "email.dryRunPolicy": "polityka", "email.badge.verified": "Zweryfikowano", "email.badge.notVerified": "Niezweryfikowano", - "email.badge.canSendReal": "Może wysyłać prawdziwie", - "email.badge.realBlocked": "Prawdziwa wysyłka zablokowana", + "email.badge.canSendReal": "Może wysyÅ‚ać prawdziwie", + "email.badge.realBlocked": "Prawdziwa wysyÅ‚ka zablokowana", "email.badge.lastTest": "Ostatni test: {status}", "email.provider.title": "Dostawca", - "email.provider.desc": "Konfiguracja per firma. Środowiskowe SMTP/Resend platformy to tylko zapas, gdy brakuje sekretów.", + "email.provider.desc": "Konfiguracja per firma. Åšrodowiskowe SMTP/Resend platformy to tylko zapas, gdy brakuje sekretów.", "email.field.provider": "Dostawca", "email.provider.resend": "Resend", "email.provider.smtp": "SMTP", @@ -4960,112 +4961,112 @@ export const pl: MessageDict = { "email.field.from": "Od", "email.field.fromName": "Nazwa nadawcy", "email.field.replyTo": "Reply-To", - "email.resendKeySaved": "Klucz API Resend (zapisany — pozostaw puste, aby zachować)", + "email.resendKeySaved": "Klucz API Resend (zapisany — pozostaw puste, aby zachować)", "email.resendKey": "Klucz API Resend", "email.field.smtpHost": "Host SMTP", "email.field.port": "Port", - "email.field.username": "Nazwa użytkownika", - "email.field.passwordSaved": "Hasło (zapisane)", - "email.field.password": "Hasło", - "email.verifyDomain": "Zweryfikuj domenę", - "email.testGate.title": "Test i bramka wysyłki", - "email.testGate.desc": "Wysyłki testowe weryfikują adres nadawcy. Prawdziwe blasty wymagają wpisania “I understand”.", + "email.field.username": "Nazwa użytkownika", + "email.field.passwordSaved": "HasÅ‚o (zapisane)", + "email.field.password": "HasÅ‚o", + "email.verifyDomain": "Zweryfikuj domenÄ™", + "email.testGate.title": "Test i bramka wysyÅ‚ki", + "email.testGate.desc": "WysyÅ‚ki testowe weryfikujÄ… adres nadawcy. Prawdziwe blasty wymagajÄ… wpisania “I understand”.", "email.field.recipient": "Odbiorca", - "email.sendTest": "Wyślij test", - "email.confirmBlast": "Potwierdź blast…", - "email.flash.loadFailed": "Nie udało się wczytać ustawień e-mail", - "email.flash.saveFailed": "Nie udało się zapisać", + "email.sendTest": "WyÅ›lij test", + "email.confirmBlast": "Potwierdź blast…", + "email.flash.loadFailed": "Nie udaÅ‚o siÄ™ wczytać ustawieÅ„ e-mail", + "email.flash.saveFailed": "Nie udaÅ‚o siÄ™ zapisać", "email.flash.verifyUpdated": "Weryfikacja zaktualizowana.", "email.flash.verifyFailed": "Weryfikacja nieudana", - "email.flash.testFailed": "Wysłanie testu nieudane", - "email.flash.blastDryRun": "Sprawdzenie dostawy zapisane w trybie dry-run — nie wysłano żadnego e-maila.", - "email.flash.blastDone": "Sprawdzenie dostawy zakończone: {sent} wysłano, {failed} nieudanych.", + "email.flash.testFailed": "WysÅ‚anie testu nieudane", + "email.flash.blastDryRun": "Sprawdzenie dostawy zapisane w trybie dry-run — nie wysÅ‚ano żadnego e-maila.", + "email.flash.blastDone": "Sprawdzenie dostawy zakoÅ„czone: {sent} wysÅ‚ano, {failed} nieudanych.", "email.flash.blastFailed": "Blast nieudany", "email.blast.subject": "Sprawdzenie dostawy e-mail Descrybe", - "email.blast.body": "To jednoadresowe sprawdzenie dostawy z Descrybe, aby potwierdzić, że Twoja integracja e-mail może wysyłać. Odbiorca: {recipient}", - "email.action.changeSettings": "zmienić ustawienia dostawcy e-mail", - "email.action.verifyDomain": "zweryfikować domenę e-mail", - "email.action.sendTest": "wysłać e-mail testowy", - "email.action.sendBlasts": "wysyłać blasty e-mail", + "email.blast.body": "To jednoadresowe sprawdzenie dostawy z Descrybe, aby potwierdzić, że Twoja integracja e-mail może wysyÅ‚ać. Odbiorca: {recipient}", + "email.action.changeSettings": "zmienić ustawienia dostawcy e-mail", + "email.action.verifyDomain": "zweryfikować domenÄ™ e-mail", + "email.action.sendTest": "wysÅ‚ać e-mail testowy", + "email.action.sendBlasts": "wysyÅ‚ać blasty e-mail", "seo.title": "Rekomendacje SEO", - "seo.description": "Wyniki checklisty dla meta katalogu, tytułów, obrazów i słów kluczowych. Wypełnianie szablonem jest darmowe; przepisanie AI jest płatne.", - "seo.upgradeTitle": "Przepisanie AI to funkcja płatna", - "seo.upgradeMessage": "Plany Free nadal mogą uzupełniać brakujące meta szablonami opartymi na regułach. Ulepsz plan lub dodaj kredyty, aby używać przepisań AI.", - "seo.comparePlans": "Porównaj plany", - "seo.openProducts": "Otwórz produkty", - "seo.overallScore": "Ogólny wynik SEO", - "seo.overallScoreHint": "Średnia z elementów checklisty", + "seo.description": "Wyniki checklisty dla meta katalogu, tytułów, obrazów i słów kluczowych. WypeÅ‚nianie szablonem jest darmowe; przepisanie AI jest pÅ‚atne.", + "seo.upgradeTitle": "Przepisanie AI to funkcja pÅ‚atna", + "seo.upgradeMessage": "Plany Free nadal mogÄ… uzupeÅ‚niać brakujÄ…ce meta szablonami opartymi na reguÅ‚ach. Ulepsz plan lub dodaj kredyty, aby używać przepisaÅ„ AI.", + "seo.comparePlans": "Porównaj plany", + "seo.openProducts": "Otwórz produkty", + "seo.overallScore": "Ogólny wynik SEO", + "seo.overallScoreHint": "Åšrednia z elementów checklisty", "seo.productsScanned": "Przeskanowane produkty", "seo.productsScannedHint": "Przetworzone produkty w firmie", "seo.categoriesScanned": "Przeskanowane kategorie", - "seo.categoriesScannedHint": "W tym kontrole formuł meta", + "seo.categoriesScannedHint": "W tym kontrole formuÅ‚ meta", "seo.aiRewrite": "Przepisanie AI", - "seo.available": "Dostępne", + "seo.available": "DostÄ™pne", "seo.gated": "Ograniczone", - "seo.templateFree": "Wypełnianie szablonem pozostaje darmowe we wszystkich planach", + "seo.templateFree": "WypeÅ‚nianie szablonem pozostaje darmowe we wszystkich planach", "seo.checklist": "Checklist", - "seo.affectedFindings": "{affected} dotkniętych · {count} ustaleń", + "seo.affectedFindings": "{affected} dotkniÄ™tych · {count} ustaleÅ„", "seo.fixable": "Do naprawy", - "seo.clearFilter": "Wyczyść filtr", + "seo.clearFilter": "Wyczyść filtr", "seo.findings": "Ustalenia", - "seo.noFindings": "Brak ustaleń dla tego filtra — dobra robota.", + "seo.noFindings": "Brak ustaleÅ„ dla tego filtra — dobra robota.", "seo.col.issue": "Problem", "seo.col.entity": "Encja", - "seo.col.severity": "Ważność", + "seo.col.severity": "Ważność", "seo.col.actions": "Akcje", - "seo.filling": "Wypełnianie…", - "seo.templateFill": "Wypełnianie szablonem", - "seo.aiTitleAllowed": "Przepisz z AI (zużywa kredyty)", - "seo.aiTitleGated": "Wymaga płatnego planu lub kredytów", - "seo.rewriting": "Przepisywanie…", + "seo.filling": "WypeÅ‚nianie…", + "seo.templateFill": "WypeÅ‚nianie szablonem", + "seo.aiTitleAllowed": "Przepisz z AI (zużywa kredyty)", + "seo.aiTitleGated": "Wymaga pÅ‚atnego planu lub kredytów", + "seo.rewriting": "Przepisywanie…", "seo.aiRewriteBtn": "Przepisanie AI", "seo.viewProduct": "Zobacz produkt", - "seo.flash.loadFailed": "Nie udało się wczytać rekomendacji SEO", - "seo.flash.aiPaid": "Przepisanie AI wymaga płatnego planu lub kredytów.", - "seo.flash.applyFailed": "Nie udało się zastosować poprawki", + "seo.flash.loadFailed": "Nie udaÅ‚o siÄ™ wczytać rekomendacji SEO", + "seo.flash.aiPaid": "Przepisanie AI wymaga pÅ‚atnego planu lub kredytów.", + "seo.flash.applyFailed": "Nie udaÅ‚o siÄ™ zastosować poprawki", "brand.title": "Zestaw marki", - "brand.description": "Zdefiniuj głos, wytyczne i kolory, aby tytuły i opisy produktów pozostały zgodne z marką.", - "brand.loading": "Wczytywanie brand kitu…", - "brand.adminOnly": "Tylko administratorzy firmy mogą edytować brand kit. Możesz przeglądać bieżący głos, kolory i logo.", - "brand.aiApplyFreeAdmin": "Możesz edytować brand kit w planie Free. Zastosowanie AI (wstrzykiwanie głosu marki do promptów enhance) odblokowuje się od Starter wzwyż.", - "brand.aiApplyGated": "Zastosowanie AI (wstrzykiwanie głosu marki do promptów enhance) odblokowuje się od Starter wzwyż.", - "brand.aiEnhanceUses": "Enhance AI użyje tego głosu marki podczas przetwarzania produktów.", - "brand.comparePlans": "Porównaj plany", - "brand.voice.title": "Głos i wytyczne", - "brand.voice.desc": "Ton, reguły do/don’t oraz preferowane sformułowania", - "brand.field.voiceTone": "Głos / ton", - "brand.placeholder.voiceTone": "np. Pewny, zwięzły, techniczny, ale przystępny", + "brand.description": "Zdefiniuj gÅ‚os, wytyczne i kolory, aby tytuÅ‚y i opisy produktów pozostaÅ‚y zgodne z markÄ….", + "brand.loading": "Wczytywanie brand kitu…", + "brand.adminOnly": "Tylko administratorzy firmy mogÄ… edytować brand kit. Możesz przeglÄ…dać bieżący gÅ‚os, kolory i logo.", + "brand.aiApplyFreeAdmin": "Możesz edytować brand kit w planie Free. Zastosowanie AI (wstrzykiwanie gÅ‚osu marki do promptów enhance) odblokowuje siÄ™ od Starter wzwyż.", + "brand.aiApplyGated": "Zastosowanie AI (wstrzykiwanie gÅ‚osu marki do promptów enhance) odblokowuje siÄ™ od Starter wzwyż.", + "brand.aiEnhanceUses": "Enhance AI użyje tego gÅ‚osu marki podczas przetwarzania produktów.", + "brand.comparePlans": "Porównaj plany", + "brand.voice.title": "GÅ‚os i wytyczne", + "brand.voice.desc": "Ton, reguÅ‚y do/don’t oraz preferowane sformuÅ‚owania", + "brand.field.voiceTone": "GÅ‚os / ton", + "brand.placeholder.voiceTone": "np. Pewny, zwiÄ™zÅ‚y, techniczny, ale przystÄ™pny", "brand.field.dos": "Do (po jednym w wierszu)", - "brand.placeholder.dos": "Zacznij od głównej korzyści\nUtrzymuj tytuły poniżej 80 znaków", - "brand.field.donts": "Don’t (po jednym w wierszu)", - "brand.placeholder.donts": "Bez WIELKICH LITER\nUnikaj superlatywów bez dowodu", + "brand.placeholder.dos": "Zacznij od głównej korzyÅ›ci\nUtrzymuj tytuÅ‚y poniżej 80 znaków", + "brand.field.donts": "Don’t (po jednym w wierszu)", + "brand.placeholder.donts": "Bez WIELKICH LITER\nUnikaj superlatywów bez dowodu", "brand.field.preferredTerms": "Preferowane terminy (po jednym w wierszu lub rozdzielone przecinkami)", "brand.placeholder.preferredTerms": "bezprzewodowy, premium, klasa energetyczna", "brand.visual.title": "Identyfikacja wizualna", - "brand.visual.desc": "Kolory i logo używane w wskazówkach i kampaniach uwzględniających markę", + "brand.visual.desc": "Kolory i logo używane w wskazówkach i kampaniach uwzglÄ™dniajÄ…cych markÄ™", "brand.field.primaryColor": "Kolor podstawowy", "brand.field.secondaryColor": "Kolor dodatkowy", "brand.field.logoImage": "Obraz logo", - "brand.logoHint": "PNG, JPEG lub WebP do 2 MiB. Przechowywane w przesyłanych plikach firmy.", - "brand.uploading": "Przesyłanie…", - "brand.uploadLogo": "Prześlij logo", - "brand.clear": "Wyczyść", + "brand.logoHint": "PNG, JPEG lub WebP do 2 MiB. Przechowywane w przesyÅ‚anych plikach firmy.", + "brand.uploading": "PrzesyÅ‚anie…", + "brand.uploadLogo": "PrzeÅ›lij logo", + "brand.clear": "Wyczyść", "brand.field.logoUrl": "URL logo", - "brand.placeholder.logoUrl": "https://… lub przesłane /api/brand/logo/files/…", - "brand.logoAlt": "Podgląd logo marki", - "brand.tipsTitle": "Wskazówki formuły / podglądu", - "brand.saving": "Zapisywanie…", + "brand.placeholder.logoUrl": "https://… lub przesÅ‚ane /api/brand/logo/files/…", + "brand.logoAlt": "PodglÄ…d logo marki", + "brand.tipsTitle": "Wskazówki formuÅ‚y / podglÄ…du", + "brand.saving": "Zapisywanie…", "brand.save": "Zapisz brand kit", - "brand.flash.loadFailed": "Nie udało się wczytać brand kitu", + "brand.flash.loadFailed": "Nie udaÅ‚o siÄ™ wczytać brand kitu", "structured.title": "Pola opisu strukturalnego", - "structured.loading": "Wczytywanie pól opisu strukturalnego…", - "structured.backDashboard": "Powrót do pulpitu", - "structured.categoryFormulas": "Formuły kategorii", + "structured.loading": "Wczytywanie pól opisu strukturalnego…", + "structured.backDashboard": "Powrót do pulpitu", + "structured.categoryFormulas": "FormuÅ‚y kategorii", "structured.exportFeeds": "Feedy eksportu", - "structured.intro": "Te pola są tworzone automatycznie, gdy dodasz Export IDs do sekcji formuły opisu. Można ich używać w feedach eksportu, aby uwzględnić konkretne części opisów produktów.", + "structured.intro": "Te pola sÄ… tworzone automatycznie, gdy dodasz Export IDs do sekcji formuÅ‚y opisu. Można ich używać w feedach eksportu, aby uwzglÄ™dnić konkretne części opisów produktów.", "structured.addField": "Dodaj pole", - "structured.openCategories": "Otwórz kategorie", - "structured.tableCaption": "Te pola służą do strukturyzowania części opisów produktów na potrzeby eksportu.", + "structured.openCategories": "Otwórz kategorie", + "structured.tableCaption": "Te pola sÅ‚użą do strukturyzowania części opisów produktów na potrzeby eksportu.", "structured.col.fieldKey": "Klucz pola", "structured.col.type": "Typ", "structured.col.created": "Utworzono", @@ -5079,184 +5080,184 @@ export const pl: MessageDict = { "structured.type.boolean": "Logiczny", "structured.type.list": "Lista", "structured.adding": "Dodawanie...", - "structured.flash.loadFailed": "Nie udało się wczytać pól opisu strukturalnego", + "structured.flash.loadFailed": "Nie udaÅ‚o siÄ™ wczytać pól opisu strukturalnego", "assistant.ariaLabel": "Asystent systemowy", "assistant.title": "Asystent systemowy", - "assistant.subtitle": "Nawiguj, prowadź i uruchamiaj obsługiwane działania", - "assistant.resetAria": "Zresetuj rozmowę", + "assistant.subtitle": "Nawiguj, prowadź i uruchamiaj obsÅ‚ugiwane dziaÅ‚ania", + "assistant.resetAria": "Zresetuj rozmowÄ™", "assistant.resetTitle": "Resetuj", "assistant.closeAria": "Zamknij asystenta", - "assistant.messageLabel": "Wiadomość", - "assistant.placeholder": "np. dodaj URL feeda, klucze API, atrybuty, przetwarzanie…", - "assistant.sendAria": "Wyślij", - "site.bookDemo": "Umów demo", + "assistant.messageLabel": "Wiadomość", + "assistant.placeholder": "np. dodaj URL feeda, klucze API, atrybuty, przetwarzanie…", + "assistant.sendAria": "WyÅ›lij", + "site.bookDemo": "Umów demo", "site.demoShort": "Demo", - "site.allRightsReserved": "Wszelkie prawa zastrzeżone.", + "site.allRightsReserved": "Wszelkie prawa zastrzeżone.", "site.cookiePolicy": "Polityka cookies", "site.cookieSettings": "Ustawienia cookies", "consent.title": "Cookies i analityka", - "consent.description": "Używamy niezbędnych plików cookie, aby Descrybe działał. Opcjonalne cookie analityczne i marketingowe pomagają nam rozumieć użycie i mierzyć kampanie. Możesz zmienić wybór w każdej chwili.", + "consent.description": "Używamy niezbÄ™dnych plików cookie, aby Descrybe dziaÅ‚aÅ‚. Opcjonalne cookie analityczne i marketingowe pomagajÄ… nam rozumieć użycie i mierzyć kampanie. Możesz zmienić wybór w każdej chwili.", "consent.acceptAll": "Zaakceptuj wszystkie", - "consent.rejectNonEssential": "Odrzuć nieistotne", + "consent.rejectNonEssential": "Odrzuć nieistotne", "consent.customize": "Dostosuj", "consent.save": "Zapisz preferencje", - "consent.necessary": "Niezbędne", - "consent.necessaryDesc": "Wymagane do logowania, bezpieczeństwa (CSRF), motywu, języka i zapamiętania tego wyboru.", - "consent.alwaysOn": "Zawsze włączone", + "consent.necessary": "NiezbÄ™dne", + "consent.necessaryDesc": "Wymagane do logowania, bezpieczeÅ„stwa (CSRF), motywu, jÄ™zyka i zapamiÄ™tania tego wyboru.", + "consent.alwaysOn": "Zawsze włączone", "consent.analytics": "Analityka", - "consent.analyticsDesc": "Pomaga zrozumieć, jak używany jest produkt (Google Analytics przez GTM).", + "consent.analyticsDesc": "Pomaga zrozumieć, jak używany jest produkt (Google Analytics przez GTM).", "consent.marketing": "Marketing", "consent.marketingDesc": "Do pomiaru reklam i personalizacji, gdy w GTM skonfigurowano tagi reklamowe.", - "consent.policyLink": "Przeczytaj Politykę cookies", + "consent.policyLink": "Przeczytaj PolitykÄ™ cookies", "seo.cookies.title": "Polityka cookies | Descrybe", - "seo.cookies.description": "Jak Descrybe używa niezbędnych, analitycznych i marketingowych cookies, w tym GTM i GA4, oraz jak zmienić zgodę.", + "seo.cookies.description": "Jak Descrybe używa niezbÄ™dnych, analitycznych i marketingowych cookies, w tym GTM i GA4, oraz jak zmienić zgodÄ™.", "legal.cookies.title": "Polityka cookies", - "legal.cookies.intro.h": "Przegląd", - "legal.cookies.intro.p1": "Ta Polityka cookies wyjaśnia, jak Descrybe używa cookies i podobnych technologii w witrynie i aplikacji. Czytaj razem z Polityką prywatności.", - "legal.cookies.intro.p2": "Gdzie to wymagane, prosimy o zgodę przed włączeniem cookies analitycznych lub marketingowych. Niezbędne cookies zapewniają bezpieczną usługę i nie wymagają zgody.", + "legal.cookies.intro.h": "PrzeglÄ…d", + "legal.cookies.intro.p1": "Ta Polityka cookies wyjaÅ›nia, jak Descrybe używa cookies i podobnych technologii w witrynie i aplikacji. Czytaj razem z PolitykÄ… prywatnoÅ›ci.", + "legal.cookies.intro.p2": "Gdzie to wymagane, prosimy o zgodÄ™ przed włączeniem cookies analitycznych lub marketingowych. NiezbÄ™dne cookies zapewniajÄ… bezpiecznÄ… usÅ‚ugÄ™ i nie wymagajÄ… zgody.", "legal.cookies.types.h": "Kategorie cookies", - "legal.cookies.necessary.h": "Niezbędne", - "legal.cookies.necessary.p": "Utrzymują sesję, chronią formularze CSRF, zapisują motyw i język oraz zapamiętują wybór cookies. Bez nich produkt nie działa poprawnie.", + "legal.cookies.necessary.h": "NiezbÄ™dne", + "legal.cookies.necessary.p": "UtrzymujÄ… sesjÄ™, chroniÄ… formularze CSRF, zapisujÄ… motyw i jÄ™zyk oraz zapamiÄ™tujÄ… wybór cookies. Bez nich produkt nie dziaÅ‚a poprawnie.", "legal.cookies.analytics.h": "Analityka", - "legal.cookies.analytics.p": "Jeśli zezwolisz na analitykę, ładujemy tagi GTM, które mogą ustawiać cookies GA4 do pomiaru stron i zdarzeń. Zdarzenia są blokowane do przyznania analytics_storage.", + "legal.cookies.analytics.p": "JeÅ›li zezwolisz na analitykÄ™, Å‚adujemy tagi GTM, które mogÄ… ustawiać cookies GA4 do pomiaru stron i zdarzeÅ„. Zdarzenia sÄ… blokowane do przyznania analytics_storage.", "legal.cookies.marketing.h": "Marketing", - "legal.cookies.marketing.p": "Jeśli zezwolisz na marketing, tagi reklamowe w GTM mogą używać pamięci reklam i powiązanych sygnałów do pomiaru i personalizacji.", + "legal.cookies.marketing.p": "JeÅ›li zezwolisz na marketing, tagi reklamowe w GTM mogÄ… używać pamiÄ™ci reklam i powiÄ…zanych sygnałów do pomiaru i personalizacji.", "legal.cookies.gtm.h": "Google Tag Manager i GA4", - "legal.cookies.gtm.p": "Gdy skonfigurowano, Descrybe ładuje kontener GTM. GA4 jest konfigurowane w tym kontenerze. Consent Mode v2 domyślnie odmawia magazynowania analytics i ads do akceptacji kategorii.", + "legal.cookies.gtm.p": "Gdy skonfigurowano, Descrybe Å‚aduje kontener GTM. GA4 jest konfigurowane w tym kontenerze. Consent Mode v2 domyÅ›lnie odmawia magazynowania analytics i ads do akceptacji kategorii.", "legal.cookies.third.h": "Podmioty trzecie", - "legal.cookies.third.p": "Google (Tag Manager / Analytics) może przy zgodzie przetwarzać dane techniczne (URL, urządzenie/przeglądarka, nazwy zdarzeń). Świadomie nie wysyłamy haseł, kluczy API ani danych kontaktowych w zdarzeniach.", - "legal.cookies.manage.h": "Jak zmienić zgodę", - "legal.cookies.manage.p": "Użyj Ustawień cookies w stopce (lub przycisku poniżej), aby ponownie otworzyć baner. Możesz też wyczyścić dane witryny w przeglądarce.", - "site.privacyPolicy": "Polityka prywatności", + "legal.cookies.third.p": "Google (Tag Manager / Analytics) może przy zgodzie przetwarzać dane techniczne (URL, urzÄ…dzenie/przeglÄ…darka, nazwy zdarzeÅ„). Åšwiadomie nie wysyÅ‚amy haseÅ‚, kluczy API ani danych kontaktowych w zdarzeniach.", + "legal.cookies.manage.h": "Jak zmienić zgodÄ™", + "legal.cookies.manage.p": "Użyj UstawieÅ„ cookies w stopce (lub przycisku poniżej), aby ponownie otworzyć baner. Możesz też wyczyÅ›cić dane witryny w przeglÄ…darce.", + "site.privacyPolicy": "Polityka prywatnoÅ›ci", "site.termsOfService": "Warunki korzystania", "site.legalNav": "Prawne", "site.footer.aria": "Witryna", - "site.footer.description": "Descrybe zamienia feedy dostawców w czyste katalogi produktów gotowe na kanały — mapuj pola, wzbogacaj atrybuty i teksty ofert, a potem eksportuj lub synchronizuj z WooCommerce.", - "site.footer.rightsLine": "© {year} {name}. Wszelkie prawa zastrzeżone.", + "site.footer.description": "Descrybe zamienia feedy dostawców w czyste katalogi produktów gotowe na kanaÅ‚y — mapuj pola, wzbogacaj atrybuty i teksty ofert, a potem eksportuj lub synchronizuj z WooCommerce.", + "site.footer.rightsLine": "© {year} {name}. Wszelkie prawa zastrzeżone.", "site.footer.navTitle": "Nawigacja", "site.footer.platform": "Platforma", - "site.footer.solutions": "Rozwiązania", + "site.footer.solutions": "RozwiÄ…zania", "site.footer.contact": "Kontakt", - "home.hero.tagline": "Dane produktowe dla zespołów ecommerce", - "home.hero.title": "Od feedów dostawców do stron produktów", - "home.hero.lead": "Podłącz feedy dostawców, zmapuj je do swoich kategorii, uzupełnij wymagane atrybuty i pisz tytuły oraz opisy według swoich reguł — potem eksportuj lub synchronizuj ze sklepem.", - "home.hero.learnMore": "Dowiedz się więcej", - "home.hero.apply": "Poproś o dostęp", + "home.hero.tagline": "Dane produktowe dla zespołów ecommerce", + "home.hero.title": "Od feedów dostawców do stron produktów", + "home.hero.lead": "Podłącz feedy dostawców, zmapuj je do swoich kategorii, uzupeÅ‚nij wymagane atrybuty i pisz tytuÅ‚y oraz opisy wedÅ‚ug swoich reguÅ‚ — potem eksportuj lub synchronizuj ze sklepem.", + "home.hero.learnMore": "Dowiedz siÄ™ wiÄ™cej", + "home.hero.apply": "PoproÅ› o dostÄ™p", "home.hero.supportedBy": "Wspierane przez", "home.hero.msAlt": "Microsoft for Startups", - "home.image.previewAlt": "Podgląd platformy Descrybe: od feedu do karty produktu", - "home.how.title": "Tak Descrybe oszczędza czas przy wprowadzaniu produktów na rynek", - "home.how.lead": "Zaimportuj bałagan w danych dostawców raz. Descrybe pomaga je kategoryzować, uzupełniać atrybuty, pisać teksty ofert i wysyłać gotowe produkty do Twoich kanałów.", - "home.how.apply": "Poproś o dostęp", - "home.how.step1.title": "Zaimportuj taksonomię", - "home.how.step1.desc": "Skonfiguruj kategorie i atrybuty, których Twój sklep już używa", - "home.how.step1.f1": "Zdefiniuj wymagane atrybuty dla każdej kategorii", - "home.how.step1.f2": "Ustaw formuły tytułów per kategoria", + "home.image.previewAlt": "PodglÄ…d platformy Descrybe: od feedu do karty produktu", + "home.how.title": "Tak Descrybe oszczÄ™dza czas przy wprowadzaniu produktów na rynek", + "home.how.lead": "Zaimportuj baÅ‚agan w danych dostawców raz. Descrybe pomaga je kategoryzować, uzupeÅ‚niać atrybuty, pisać teksty ofert i wysyÅ‚ać gotowe produkty do Twoich kanałów.", + "home.how.apply": "PoproÅ› o dostÄ™p", + "home.how.step1.title": "Zaimportuj taksonomiÄ™", + "home.how.step1.desc": "Skonfiguruj kategorie i atrybuty, których Twój sklep już używa", + "home.how.step1.f1": "Zdefiniuj wymagane atrybuty dla każdej kategorii", + "home.how.step1.f2": "Ustaw formuÅ‚y tytułów per kategoria", "home.how.step1.f3": "Ustaw szablony opisu i snippeta wyszukiwania", - "home.how.step2.title": "Zaimportuj dane dostawców", - "home.how.step2.desc": "Podłącz URL feedu lub prześlij plik produktów", - "home.how.step2.f1": "Import z źródeł CSV, XML lub API", - "home.how.step2.f2": "Zaplanuj automatyczne importy od dostawców", - "home.how.step2.f3": "Mapuj pola źródłowe prostym interfejsem przeciągnij i upuść", - "home.how.step3.title": "Przekształć i wzbogać", - "home.how.step3.desc": "Wybierz produkty do przetworzenia i pozwól Descrybe:", - "home.how.step3.f1": "Przypisać właściwe kategorie", - "home.how.step3.f2": "Uzupełnić wymagane atrybuty produktu", - "home.how.step3.f3": "Tworzyć jasne, przyjazne wyszukiwaniu tytuły i opisy", - "home.how.step4.title": "Eksportuj do kanałów", - "home.how.step4.desc": "Wysyłaj gotowe dane produktowe tam, gdzie sprzedajesz", - "home.how.step4.f1": "Generuj feedy produktów pod konkretne kanały", - "home.how.step4.f2": "Zachowaj pełną kontrolę nad eksportowanymi polami", - "home.how.step4.f3": "Bądź na bieżąco, gdy dane dostawcy się zmieniają", + "home.how.step2.title": "Zaimportuj dane dostawców", + "home.how.step2.desc": "Podłącz URL feedu lub przeÅ›lij plik produktów", + "home.how.step2.f1": "Import z źródeÅ‚ CSV, XML lub API", + "home.how.step2.f2": "Zaplanuj automatyczne importy od dostawców", + "home.how.step2.f3": "Mapuj pola źródÅ‚owe prostym interfejsem przeciÄ…gnij i upuść", + "home.how.step3.title": "Przekształć i wzbogać", + "home.how.step3.desc": "Wybierz produkty do przetworzenia i pozwól Descrybe:", + "home.how.step3.f1": "Przypisać wÅ‚aÅ›ciwe kategorie", + "home.how.step3.f2": "UzupeÅ‚nić wymagane atrybuty produktu", + "home.how.step3.f3": "Tworzyć jasne, przyjazne wyszukiwaniu tytuÅ‚y i opisy", + "home.how.step4.title": "Eksportuj do kanałów", + "home.how.step4.desc": "WysyÅ‚aj gotowe dane produktowe tam, gdzie sprzedajesz", + "home.how.step4.f1": "Generuj feedy produktów pod konkretne kanaÅ‚y", + "home.how.step4.f2": "Zachowaj peÅ‚nÄ… kontrolÄ™ nad eksportowanymi polami", + "home.how.step4.f3": "BÄ…dź na bieżąco, gdy dane dostawcy siÄ™ zmieniajÄ…", "home.benefits.title": "Wszystko, czego potrzebujesz do czystszych danych produktowych", - "home.benefits.lead": "Od importu feedu do ofert gotowych na kanał — bez ręcznego przebudowywania każdego pliku.", - "home.benefits.shield.title": "Wcześnie wykrywaj niekompletne oferty", - "home.benefits.shield.desc": "Sprawdzaj dane produktów względem reguł kategorii, by uzupełnić brakujące atrybuty i słabe teksty przed publikacją.", - "home.benefits.chart.title": "Wyraźniejsze oferty, silniejsza konwersja", - "home.benefits.chart.desc": "Tytuły i opisy, które podkreślają to, na czym zależy kupującym — korzyści, specyfikacje i terminy wyszukiwania z Twojego katalogu.", - "home.benefits.database.title": "Jedna spójna struktura produktu", - "home.benefits.database.desc": "Utrzymuj to samo drzewo kategorii i kształt atrybutów w eksportach i kanałach, by klienci znajdowali produkty tak samo wszędzie.", - "home.benefits.search.title": "Treści produktowe przyjazne wyszukiwaniu", - "home.benefits.search.desc": "Pisz tytuły, opisy i meta snippety łatwiejsze do zrozumienia dla kupujących i wyszukiwarek.", - "home.benefits.cost.title": "Mniej ręcznego wprowadzania danych", - "home.benefits.cost.desc": "Automatyzuj mapowanie, uzupełnianie atrybutów i teksty ofert, by zespół zajmował się merchandisingiem — a nie czyszczeniem arkuszy.", - "home.benefits.scale.title": "Gotowe na każdy kanał sprzedaży", - "home.benefits.scale.desc": "Dopasuj feedy eksportu i sync WooCommerce do formatów oczekiwanych przez każdy kanał, bez ręcznego przebudowywania katalogu.", + "home.benefits.lead": "Od importu feedu do ofert gotowych na kanaÅ‚ — bez rÄ™cznego przebudowywania każdego pliku.", + "home.benefits.shield.title": "WczeÅ›nie wykrywaj niekompletne oferty", + "home.benefits.shield.desc": "Sprawdzaj dane produktów wzglÄ™dem reguÅ‚ kategorii, by uzupeÅ‚nić brakujÄ…ce atrybuty i sÅ‚abe teksty przed publikacjÄ….", + "home.benefits.chart.title": "Wyraźniejsze oferty, silniejsza konwersja", + "home.benefits.chart.desc": "TytuÅ‚y i opisy, które podkreÅ›lajÄ… to, na czym zależy kupujÄ…cym — korzyÅ›ci, specyfikacje i terminy wyszukiwania z Twojego katalogu.", + "home.benefits.database.title": "Jedna spójna struktura produktu", + "home.benefits.database.desc": "Utrzymuj to samo drzewo kategorii i ksztaÅ‚t atrybutów w eksportach i kanaÅ‚ach, by klienci znajdowali produkty tak samo wszÄ™dzie.", + "home.benefits.search.title": "TreÅ›ci produktowe przyjazne wyszukiwaniu", + "home.benefits.search.desc": "Pisz tytuÅ‚y, opisy i meta snippety Å‚atwiejsze do zrozumienia dla kupujÄ…cych i wyszukiwarek.", + "home.benefits.cost.title": "Mniej rÄ™cznego wprowadzania danych", + "home.benefits.cost.desc": "Automatyzuj mapowanie, uzupeÅ‚nianie atrybutów i teksty ofert, by zespół zajmowaÅ‚ siÄ™ merchandisingiem — a nie czyszczeniem arkuszy.", + "home.benefits.scale.title": "Gotowe na każdy kanaÅ‚ sprzedaży", + "home.benefits.scale.desc": "Dopasuj feedy eksportu i sync WooCommerce do formatów oczekiwanych przez każdy kanaÅ‚, bez rÄ™cznego przebudowywania katalogu.", "home.cta.titleLead": "Wprowadzaj produkty na rynek ", "home.cta.titleHighlight": "szybciej", - "home.cta.description": "Przestań przebudowywać dane produktów z każdego pliku dostawcy. Zmapuj raz, wzbogać według swoich reguł i publikuj oferty gotowe do sprzedaży.", + "home.cta.description": "PrzestaÅ„ przebudowywać dane produktów z każdego pliku dostawcy. Zmapuj raz, wzbogać wedÅ‚ug swoich reguÅ‚ i publikuj oferty gotowe do sprzedaży.", "home.cta.f1": "Spersonalizowane demo", "home.cta.f2": "Konsultacja z ekspertami", "home.cta.f3": "Jasne kolejne kroki", - "home.cta.apply": "Poproś o dostęp", - "home.cta.imageAlt": "Strony produktów Descrybe", + "home.cta.apply": "PoproÅ› o dostÄ™p", + "home.cta.imageAlt": "Strony produktów Descrybe", "home.product.eyebrow": "Co robi Descrybe", - "home.product.title": "Feedy dostawców na wejściu. Gotowe oferty na wyjściu — eksport, WooCommerce lub API.", - "home.product.description": "Descrybe pomaga zespołom ecommerce zamieniać feedy CSV i XML dostawców w czyste katalogi produktów. Mapuj pola do swoich kategorii, wzbogacaj atrybuty i teksty ofert, a potem wysyłaj dane przez feedy eksportu, sync WooCommerce lub publiczne API.", + "home.product.title": "Feedy dostawców na wejÅ›ciu. Gotowe oferty na wyjÅ›ciu — eksport, WooCommerce lub API.", + "home.product.description": "Descrybe pomaga zespoÅ‚om ecommerce zamieniać feedy CSV i XML dostawców w czyste katalogi produktów. Mapuj pola do swoich kategorii, wzbogacaj atrybuty i teksty ofert, a potem wysyÅ‚aj dane przez feedy eksportu, sync WooCommerce lub publiczne API.", "home.product.pipelineAria": "Pipeline produktu", - "home.product.p1.label": "Feedy wejściowe", - "home.product.p1.detail": "CSV / XML z URL-i dostawców", + "home.product.p1.label": "Feedy wejÅ›ciowe", + "home.product.p1.detail": "CSV / XML z URL-i dostawców", "home.product.p2.label": "Mapuj", - "home.product.p2.detail": "Dopasuj kolumny do swoich pól", - "home.product.p3.label": "Wzbogać", - "home.product.p3.detail": "Kategorie, atrybuty, tytuły", - "home.product.p4.label": "Wysyłaj", - "home.product.p4.detail": "Eksport · Woo · API", - "pricing.section.badge": "Pojemność SKU + kredyty AI", - "pricing.section.title": "Zacznij za darmo. Skaluj, gdy katalog rośnie.", - "pricing.section.lead": "Free obejmuje mapowanie feedów, podstawowe czyszczenie produktów i etykiety energetyczne UE (EPREL) do 100 SKU (bez kredytów AI). Plany płatne dodają tytuły i opisy AI, większą pojemność oraz opcje eksportu — Starter, Growth, Business, albo porozmawiaj ze sprzedażą o Enterprise.", + "home.product.p2.detail": "Dopasuj kolumny do swoich pól", + "home.product.p3.label": "Wzbogać", + "home.product.p3.detail": "Kategorie, atrybuty, tytuÅ‚y", + "home.product.p4.label": "WysyÅ‚aj", + "home.product.p4.detail": "Eksport · Woo · API", + "pricing.section.badge": "Pojemność SKU + kredyty AI", + "pricing.section.title": "Zacznij za darmo. Skaluj, gdy katalog roÅ›nie.", + "pricing.section.lead": "Free obejmuje mapowanie feedów, podstawowe czyszczenie produktów i etykiety energetyczne UE (EPREL) do 100 SKU (bez kredytów AI). Plany pÅ‚atne dodajÄ… tytuÅ‚y i opisy AI, wiÄ™kszÄ… pojemność oraz opcje eksportu — Starter, Growth, Business, albo porozmawiaj ze sprzedażą o Enterprise.", "pricing.section.billingPeriod": "Okres rozliczeniowy", - "pricing.section.monthly": "Miesięcznie", + "pricing.section.monthly": "MiesiÄ™cznie", "pricing.section.yearly": "Rocznie", - "pricing.section.savePercent": "Oszczędź 20%", - "pricing.section.publicBefore": "Plany publiczne: Free, Starter, Growth, Business i Enterprise. Utwórz konto Free, a potem przejdź wyżej w", + "pricing.section.savePercent": "OszczÄ™dź 20%", + "pricing.section.publicBefore": "Plany publiczne: Free, Starter, Growth, Business i Enterprise. Utwórz konto Free, a potem przejdź wyżej w", "pricing.section.publicOr": "lub", - "pricing.section.publicAfter": "przez Stripe Checkout. Enterprise pozostaje obsługiwany przez sprzedaż.", + "pricing.section.publicAfter": "przez Stripe Checkout. Enterprise pozostaje obsÅ‚ugiwany przez sprzedaż.", "pricing.section.plansLink": "Plany", - "pricing.section.billingLink": "Płatności", - "pricing.section.capabilitiesTitle": "Do czego jest stworzony każdy plan", + "pricing.section.billingLink": "PÅ‚atnoÅ›ci", + "pricing.section.capabilitiesTitle": "Do czego jest stworzony każdy plan", "pricing.section.capabilitiesLead": "Importuj feedy, wzbogacaj katalog, a potem eksportuj lub synchronizuj z WooCommerce", - "pricing.section.faqTitle": "Często zadawane pytania", - "pricing.section.readyTitle": "Gotowy zmapować pierwszy feed?", - "pricing.section.readyLead": "Utwórz konto Free — bez karty. Masz już konto? Otwórz aplikację lub porównaj plany.", - "pricing.section.contactSales": "Kontakt ze sprzedażą", - "pricing.cap.feeds": "Z feedów do katalogu", - "pricing.cap.feeds.f1": "Feedy dostawców CSV / XML / URL", - "pricing.cap.feeds.f2": "Mapowanie i walidacja pól", - "pricing.cap.feeds.f3": "Scalanie wielu dostawców", + "pricing.section.faqTitle": "CzÄ™sto zadawane pytania", + "pricing.section.readyTitle": "Gotowy zmapować pierwszy feed?", + "pricing.section.readyLead": "Utwórz konto Free — bez karty. Masz już konto? Otwórz aplikacjÄ™ lub porównaj plany.", + "pricing.section.contactSales": "Kontakt ze sprzedażą", + "pricing.cap.feeds": "Z feedów do katalogu", + "pricing.cap.feeds.f1": "Feedy dostawców CSV / XML / URL", + "pricing.cap.feeds.f2": "Mapowanie i walidacja pól", + "pricing.cap.feeds.f3": "Scalanie wielu dostawców", "pricing.cap.feeds.f4": "Zaplanowana synchronizacja", - "pricing.cap.feeds.f5": "Transformacje zależne od kategorii", + "pricing.cap.feeds.f5": "Transformacje zależne od kategorii", "pricing.cap.processing": "Przetwarzanie i AI", - "pricing.cap.processing.f1": "Czyszczenie danych i uzupełnianie atrybutów (wszystkie plany)", - "pricing.cap.processing.f2": "Tytuły i opisy AI (płatne)", + "pricing.cap.processing.f1": "Czyszczenie danych i uzupeÅ‚nianie atrybutów (wszystkie plany)", + "pricing.cap.processing.f2": "TytuÅ‚y i opisy AI (pÅ‚atne)", "pricing.cap.processing.f3": "Etykiety energetyczne UE / EPREL (wszystkie plany)", - "pricing.cap.processing.f4": "Formuły, głos marki, zmienne", - "pricing.cap.processing.f5": "Zarządzane kredyty lub własny klucz AI", - "pricing.cap.export": "Eksport i kanały", + "pricing.cap.processing.f4": "FormuÅ‚y, gÅ‚os marki, zmienne", + "pricing.cap.processing.f5": "ZarzÄ…dzane kredyty lub wÅ‚asny klucz AI", + "pricing.cap.export": "Eksport i kanaÅ‚y", "pricing.cap.export.f1": "Feedy eksportu XML / CSV", "pricing.cap.export.f2": "Sync WooCommerce / Shopify", - "pricing.cap.export.f3": "Pełne API", - "pricing.cap.export.f4": "Formaty pod konkretne kanały", + "pricing.cap.export.f3": "PeÅ‚ne API", + "pricing.cap.export.f4": "Formaty pod konkretne kanaÅ‚y", "pricing.cap.export.f5": "Aktualizacje masowe", "pricing.cap.limits": "Limity i kontrola", - "pricing.cap.limits.f1": "Limity SKU (produktów)", - "pricing.cap.limits.f2": "Miesięczne pakiety kredytów AI", - "pricing.cap.limits.f3": "Role zespołu i zaproszenia", + "pricing.cap.limits.f1": "Limity SKU (produktów)", + "pricing.cap.limits.f2": "MiesiÄ™czne pakiety kredytów AI", + "pricing.cap.limits.f3": "Role zespoÅ‚u i zaproszenia", "pricing.cap.limits.f4": "Opcje SLA Enterprise", - "pricing.faq.credits.q": "Czym są kredyty AI?", - "pricing.faq.credits.a": "Kredyty AI opłacają kroki takie jak generowanie tytułów i opisów. Free obejmuje 0 kredytów AI — nadal możesz mapować feedy i czyścić dane produktów. Płatne pakiety miesięczne: Starter 150, Plus 500, Growth 1 200, Business 4 000, Scale 8 000. Enterprise obejmuje duży zarządzany pakiet (oraz własny klucz AI). Od Growth w górę możesz opcjonalnie uruchamiać AI na własnym kluczu zamiast zarządzanych kredytów.", + "pricing.faq.credits.q": "Czym sÄ… kredyty AI?", + "pricing.faq.credits.a": "Kredyty AI opÅ‚acajÄ… kroki takie jak generowanie tytułów i opisów. Free obejmuje 0 kredytów AI — nadal możesz mapować feedy i czyÅ›cić dane produktów. PÅ‚atne pakiety miesiÄ™czne: Starter 150, Plus 500, Growth 1 200, Business 4 000, Scale 8 000. Enterprise obejmuje duży zarzÄ…dzany pakiet (oraz wÅ‚asny klucz AI). Od Growth w górÄ™ możesz opcjonalnie uruchamiać AI na wÅ‚asnym kluczu zamiast zarzÄ…dzanych kredytów.", "pricing.faq.packs.q": "Can I buy extra AI credits?", "pricing.faq.packs.a": "Yes. One-time packs: Starter $19 / 500 credits, Growth $59 / 2,000, Catalog $199 / 10,000, Scale $599 / 40,000. Buy from Billing after you have a paid plan (or Free with leftover trial credits). Packs do not change your SKU or feed limits.", - "pricing.faq.limits.q": "Co się stanie, gdy osiągnę limit produktów lub kredytów?", - "pricing.faq.limits.a": "Ostrzegamy, gdy się zbliżasz. Po osiągnięciu limitu produktów lub wyczerpaniu kredytów AI zadania wymagające tej pojemności wstrzymują się, aż zwolnisz miejsce, poczekasz na kolejny cykl rozliczeniowy lub przejdziesz wyżej.", - "pricing.faq.change.q": "Czy mogę przejść wyżej lub niżej?", - "pricing.faq.change.a": "Tak. Zacznij od Free, potem przejdź na Starter, Plus, Growth, Business lub Scale w Planach lub Płatnościach (Stripe Checkout). Enterprise zawsze obsługuje sprzedaż.", + "pricing.faq.limits.q": "Co siÄ™ stanie, gdy osiÄ…gnÄ™ limit produktów lub kredytów?", + "pricing.faq.limits.a": "Ostrzegamy, gdy siÄ™ zbliżasz. Po osiÄ…gniÄ™ciu limitu produktów lub wyczerpaniu kredytów AI zadania wymagajÄ…ce tej pojemnoÅ›ci wstrzymujÄ… siÄ™, aż zwolnisz miejsce, poczekasz na kolejny cykl rozliczeniowy lub przejdziesz wyżej.", + "pricing.faq.change.q": "Czy mogÄ™ przejść wyżej lub niżej?", + "pricing.faq.change.a": "Tak. Zacznij od Free, potem przejdź na Starter, Plus, Growth, Business lub Scale w Planach lub PÅ‚atnoÅ›ciach (Stripe Checkout). Enterprise zawsze obsÅ‚uguje sprzedaż.", "pricing.faq.free.q": "Co obejmuje Free?", - "pricing.faq.free.a": "Free na zawsze: 50 produktów, jeden feed, czyszczenie danych i uzupełnianie atrybutów, etykiety energetyczne UE (EPREL — dane publiczne, bez kredytów) oraz jeden ręczny eksport — z 0 kredytami AI. Bez karty kredytowej. Przejdź wyżej, gdy potrzebujesz tytułów i opisów AI lub większej pojemności.", - "pricing.faq.why.q": "Dlaczego nie płacić za produkt jak w narzędziach tylko do treści?", - "pricing.faq.why.a": "Descrybe obejmuje całą ścieżkę od feedu dostawcy przez katalog do WooCommerce lub eksportu — nie tylko teksty AI. Płacisz za pojemność platformy (produkty i feedy); AI to warstwa użycia na wierzchu.", - "pricing.faq.annual.q": "Jak działa rozliczenie roczne?", - "pricing.faq.annual.a": "Rozliczenie roczne to ok. 20% mniej niż cena miesięczna. Zacznij za darmo, a potem wybierz rozliczenie roczne w Checkout przy upgrade (lub skontaktuj się ze sprzedażą).", + "pricing.faq.free.a": "Free na zawsze: 50 produktów, jeden feed, czyszczenie danych i uzupeÅ‚nianie atrybutów, etykiety energetyczne UE (EPREL — dane publiczne, bez kredytów) oraz jeden rÄ™czny eksport — z 0 kredytami AI. Bez karty kredytowej. Przejdź wyżej, gdy potrzebujesz tytułów i opisów AI lub wiÄ™kszej pojemnoÅ›ci.", + "pricing.faq.why.q": "Dlaczego nie pÅ‚acić za produkt jak w narzÄ™dziach tylko do treÅ›ci?", + "pricing.faq.why.a": "Descrybe obejmuje całą Å›cieżkÄ™ od feedu dostawcy przez katalog do WooCommerce lub eksportu — nie tylko teksty AI. PÅ‚acisz za pojemność platformy (produkty i feedy); AI to warstwa użycia na wierzchu.", + "pricing.faq.annual.q": "Jak dziaÅ‚a rozliczenie roczne?", + "pricing.faq.annual.a": "Rozliczenie roczne to ok. 20% mniej niż cena miesiÄ™czna. Zacznij za darmo, a potem wybierz rozliczenie roczne w Checkout przy upgrade (lub skontaktuj siÄ™ ze sprzedażą).", "pricing.calc.badge": "Plan calculator", "pricing.calc.title": "Find the right plan", "pricing.calc.lead": "Enter feeds, catalog size, and how many products you want to enhance with AI (count each language pass).", @@ -5265,12 +5266,12 @@ export const pl: MessageDict = { "pricing.calc.skus": "Catalog products (SKUs)", "pricing.calc.skusHint": "Total products you will store and process", "pricing.calc.aiVolume": "AI process volume", - "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", + "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", "pricing.calc.recommendedLabel": "Recommended", "pricing.calc.budgetLabel": "Budget option", "pricing.calc.coversCredits": "Needs about {count} AI credits / month", "pricing.calc.aiIncluded": "Included monthly credits cover this AI volume", - "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", + "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", "pricing.calc.orYearly": "or ~{amount}/mo yearly", "pricing.calc.budgetNote": "Lower list price with yearly discount and/or credit packs when that still fits.", "pricing.calc.noBudget": "The recommended plan is already the leanest fit for these inputs.", @@ -5281,27 +5282,27 @@ export const pl: MessageDict = { "pricing.card.mostPopular": "Najpopularniejszy", "pricing.card.custom": "Indywidualny", "pricing.card.forever": "na zawsze", - "pricing.card.perMonth": "miesiąc", + "pricing.card.perMonth": "miesiÄ…c", "pricing.card.perYear": "rok", - "pricing.card.savePerMonth": "Oszczędź ${amount}/mies.", + "pricing.card.savePerMonth": "OszczÄ™dź ${amount}/mies.", "pricing.card.discountBadge": "-20%", "pricing.card.unlimitedSkus": "Bez limitu SKU", "pricing.card.oneMSkus": "1 mln+ SKU", "pricing.card.upToSkus": "Do {count} SKU", - "pricing.card.unlimitedAi": "Bez limitu kredytów AI", - "pricing.card.zeroCredits": "0 kredytów AI / mies.", - "pricing.card.creditsPerMonth": "{count} kredytów AI / mies.", - "pricing.card.showLess": "Pokaż mniej", - "pricing.card.showMoreFeature": "Pokaż jeszcze {count} funkcję", - "pricing.card.showMoreFeatures": "Pokaż jeszcze {count} funkcji", - "pricing.card.upgradeTo": "Przejdź na {name}", - "pricing.plan.free.description": "Zmapuj przykładowy feed i wyczyść dane produktów — bez karty", - "pricing.plan.starter.description": "Małe katalogi potrzebujące tytułów i opisów AI", - "pricing.plan.plus.description": "Więcej produktów, feedów i AI dla rosnących katalogów", - "pricing.plan.growth.description": "Feedy wielu dostawców do sklepów i eksportów shopping", + "pricing.card.unlimitedAi": "Bez limitu kredytów AI", + "pricing.card.zeroCredits": "0 kredytów AI / mies.", + "pricing.card.creditsPerMonth": "{count} kredytów AI / mies.", + "pricing.card.showLess": "Pokaż mniej", + "pricing.card.showMoreFeature": "Pokaż jeszcze {count} funkcjÄ™", + "pricing.card.showMoreFeatures": "Pokaż jeszcze {count} funkcji", + "pricing.card.upgradeTo": "Przejdź na {name}", + "pricing.plan.free.description": "Zmapuj przykÅ‚adowy feed i wyczyść dane produktów — bez karty", + "pricing.plan.starter.description": "MaÅ‚e katalogi potrzebujÄ…ce tytułów i opisów AI", + "pricing.plan.plus.description": "WiÄ™cej produktów, feedów i AI dla rosnÄ…cych katalogów", + "pricing.plan.growth.description": "Feedy wielu dostawców do sklepów i eksportów shopping", "pricing.plan.business.description": "Katalogi mid-market z BYOK", "pricing.plan.scale.description": "Katalogi w skali dystrybutora z priorytetowym wsparciem", - "pricing.plan.enterprise.description": "Bez limitu pojemności, SLA i dedykowany zespół konta", + "pricing.plan.enterprise.description": "Bez limitu pojemnoÅ›ci, SLA i dedykowany zespół konta", "pricing.feature.credits100": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits100starter": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits400": "400 AI credits / month (~50% catalog cover)", @@ -5322,25 +5323,25 @@ export const pl: MessageDict = { "pricing.feature.upTo1200Skus": "Up to 1,200 SKUs", "pricing.feature.upTo4kSkus": "Up to 4,000 SKUs", "pricing.feature.upTo12kSkus": "Up to 12,000 SKUs", - "pricing.feature.oneFeedSource": "1 źródło feedu", + "pricing.feature.oneFeedSource": "1 źródÅ‚o feedu", "pricing.feature.twoFeedSources": "2 feed sources", - "pricing.feature.threeFeedSources": "3 źródła feedów", + "pricing.feature.threeFeedSources": "3 źródÅ‚a feedów", "pricing.feature.fourFeedSources": "4 feed sources", "pricing.feature.sixFeedSources": "6 feed sources", "pricing.feature.twelveFeedSources": "12 feed sources", "pricing.feature.twentyFiveFeedSources": "25 feed sources", - "pricing.feature.cleanData": "Czyszczenie danych, parsowanie specyfikacji i uzupełnianie pól", + "pricing.feature.cleanData": "Czyszczenie danych, parsowanie specyfikacji i uzupeÅ‚nianie pól", "pricing.feature.eprel": "Etykiety energetyczne UE (EPREL)", - "pricing.feature.zeroCredits": "0 kredytów AI / mies.", - "pricing.feature.oneManualExport": "1 ręczny feed eksportu", + "pricing.feature.zeroCredits": "0 kredytów AI / mies.", + "pricing.feature.oneManualExport": "1 rÄ™czny feed eksportu", "pricing.feature.twoExports": "2 export feeds", "pricing.feature.fourExports": "4 export feeds", - "pricing.feature.wooTestOnly": "Tylko test połączenia WooCommerce", + "pricing.feature.wooTestOnly": "Tylko test połączenia WooCommerce", "pricing.feature.upTo2Seats": "Do 2 miejsc", - "pricing.feature.aiTitles": "Tytuły i opisy AI", + "pricing.feature.aiTitles": "TytuÅ‚y i opisy AI", "pricing.feature.liveStoreSync": "Live sync ze sklepem", - "pricing.feature.apiAccess": "Dostęp do API", - "pricing.feature.byok": "Własny klucz AI", + "pricing.feature.apiAccess": "DostÄ™p do API", + "pricing.feature.byok": "WÅ‚asny klucz AI", "pricing.feature.upTo500Skus": "Do 500 SKU", "pricing.feature.upTo1000Skus": "Up to 1,000 SKUs", "pricing.feature.fiveFeedSources": "5 feed sources", @@ -5358,8 +5359,8 @@ export const pl: MessageDict = { "pricing.feature.threeExports": "3 feedy eksportu", "pricing.feature.sixExports": "6 export feeds", "pricing.feature.tenExports": "10 export feeds", - "pricing.feature.fullWooSync": "Pełny sync WooCommerce", - "pricing.feature.readApi": "Dostęp do API tylko do odczytu", + "pricing.feature.fullWooSync": "PeÅ‚ny sync WooCommerce", + "pricing.feature.readApi": "DostÄ™p do API tylko do odczytu", "pricing.feature.emailSupport": "Wsparcie e-mail", "pricing.feature.creditPacks": "Buy extra AI credit packs", "pricing.feature.upTo2500Skus": "Do 2 500 SKU", @@ -5369,55 +5370,55 @@ export const pl: MessageDict = { "pricing.feature.upTo18kSkus": "Up to 18,000 SKUs", "pricing.feature.upTo55kSkus": "Up to 55,000 SKUs", "pricing.feature.upTo5000Skus": "Up to 5,000 SKUs", - "pricing.feature.eightFeedSources": "8 źródeł feedów", - "pricing.feature.credits500": "500 kredytów AI / mies.", + "pricing.feature.eightFeedSources": "8 źródeÅ‚ feedów", + "pricing.feature.credits500": "500 kredytów AI / mies.", "pricing.feature.credits1250": "1,250 AI credits / month (~25% catalog cover)", "pricing.feature.credits5000": "5,000 AI credits / month (~25% catalog cover)", - "pricing.feature.eightExports": "8 feedów eksportu", + "pricing.feature.eightExports": "8 feedów eksportu", "pricing.feature.fifteenExports": "15 export feeds", - "pricing.feature.wooShopifySync": "Pełny sync WooCommerce + Shopify", + "pricing.feature.wooShopifySync": "PeÅ‚ny sync WooCommerce + Shopify", "pricing.feature.upTo10kSkus": "Do 10 000 SKU", "pricing.feature.upTo25kSkus": "Up to 25,000 SKUs", - "pricing.feature.fifteenFeedSources": "15 źródeł feedów", + "pricing.feature.fifteenFeedSources": "15 źródeÅ‚ feedów", "pricing.feature.tenFeedSources": "10 feed sources", "pricing.feature.twentyFeedSources": "20 feed sources", "pricing.feature.thirtyFeedSources": "30 feed sources", - "pricing.feature.credits1200": "1 200 kredytów AI / mies.", + "pricing.feature.credits1200": "1 200 kredytów AI / mies.", "pricing.feature.credits10000": "10,000 AI credits / month (~50% catalog cover)", "pricing.feature.credits25000": "25,000 AI credits / month (~50% catalog cover)", - "pricing.feature.twentyExports": "20 feedów eksportu", + "pricing.feature.twentyExports": "20 feedów eksportu", "pricing.feature.fortyExports": "40 export feeds", - "pricing.feature.fullFormulas": "Pełne formuły i zmienne", - "pricing.feature.fullApi": "Pełny dostęp do API", + "pricing.feature.fullFormulas": "PeÅ‚ne formuÅ‚y i zmienne", + "pricing.feature.fullApi": "PeÅ‚ny dostÄ™p do API", "pricing.feature.byokAddon": "Dodatek bring-your-own-key", "pricing.feature.emailSupport24h": "Wsparcie e-mail (24h)", "pricing.feature.upTo40kSkus": "Do 40 000 SKU", "pricing.feature.upTo50kSkus": "Up to 50,000 SKUs", - "pricing.feature.fortyFeedSources": "40 źródeł feedów", + "pricing.feature.fortyFeedSources": "40 źródeÅ‚ feedów", "pricing.feature.fiftyFeedSources": "50 feed sources", - "pricing.feature.credits4000": "4 000 kredytów AI / mies.", + "pricing.feature.credits4000": "4 000 kredytów AI / mies.", "pricing.feature.credits40000": "40,000 AI credits / month (~50% catalog cover)", "pricing.feature.credits50000half": "50,000 AI credits / month (~50% catalog cover)", - "pricing.feature.unlimitedExports": "Bez limitu feedów eksportu", - "pricing.feature.fullApiWebhooks": "Pełne API", - "pricing.feature.byokIncluded": "Własny klucz AI w cenie", + "pricing.feature.unlimitedExports": "Bez limitu feedów eksportu", + "pricing.feature.fullApiWebhooks": "PeÅ‚ne API", + "pricing.feature.byokIncluded": "WÅ‚asny klucz AI w cenie", "pricing.feature.priorityEmail": "Priorytetowe wsparcie e-mail", "pricing.feature.upTo100kSkus": "Do 100 000 SKU", "pricing.feature.upTo150kSkus": "Up to 150,000 SKUs", - "pricing.feature.hundredFeedSources": "100 źródeł feedów", + "pricing.feature.hundredFeedSources": "100 źródeÅ‚ feedów", "pricing.feature.hundredFiftyFeedSources": "150 feed sources", - "pricing.feature.credits8000": "8 000 kredytów AI / mies.", + "pricing.feature.credits8000": "8 000 kredytów AI / mies.", "pricing.feature.credits50000": "50,000 AI credits / month (~25% catalog cover)", "pricing.feature.credits120000": "120,000 AI credits / month (~40% catalog cover)", "pricing.feature.prioritySlack": "Priorytetowe wsparcie + Slack", "pricing.feature.unlimitedSkus": "Bez limitu SKU", - "pricing.feature.unlimitedFeeds": "Bez limitu źródeł feedów", - "pricing.feature.unlimitedAiOwnKey": "Bez limitu kredytów AI / własny klucz", + "pricing.feature.unlimitedFeeds": "Bez limitu źródeÅ‚ feedów", + "pricing.feature.unlimitedAiOwnKey": "Bez limitu kredytów AI / wÅ‚asny klucz", "pricing.feature.ssoWebhooksAm": "SSO, dedykowany opiekun konta", - "pricing.feature.customIntegrations": "Integracje na zamówienie", + "pricing.feature.customIntegrations": "Integracje na zamówienie", "pricing.feature.slaPriority": "SLA i priorytetowe wsparcie", "pricing.pack.tiny.name": "Nano pack", - "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", + "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", "pricing.pack.small.name": "Starter pack", "pricing.pack.small.desc": "Extra AI for fixes and tests (~250 products)", "pricing.pack.medium.name": "Growth pack", @@ -5427,114 +5428,114 @@ export const pl: MessageDict = { "pricing.pack.xl.name": "Scale pack", "pricing.pack.xl.desc": "Heavy usage / agency bursts (~20,000 products)", "pricing.pack.xxl.name": "Business pack", - "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", + "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", "pricing.pack.mega.name": "Scale pack", - "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", + "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", "pricing.section.faqDescription": "Proste odpowiedzi o planach, kredytach i tym, co obejmuje Free.", "billing.buyCreditPacks": "Buy AI credit packs", - "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", - "billing.packCredits": "{credits} kredytów", + "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", + "billing.packCredits": "{credits} kredytów", "billing.packApproxProducts": "~{count} AI products", "billing.buyPack": "Buy", - "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", + "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", "billing.packCheckoutFailed": "Could not start credit pack checkout.", - "empty.default.noItems": "Nie znaleziono elementów.", + "empty.default.noItems": "Nie znaleziono elementów.", "settings.tabLockedHint": "Not on your plan", "stores.connectorLocked": "Not on your plan", "stores.connectorUpgrade": "Upgrade to unlock", "plan.upgrade.title": "Ta funkcja nie jest w Twoim planie", - "plan.upgrade.message": "Ulepsz plan, aby odblokować tę część Descrybe.", - "plan.upgrade.defaultMessage": "Twój obecny plan nie obejmuje tej części Descrybe. Ulepsz plan, aby ją odblokować, albo poproś administratora firmy, jeśli nie możesz zmienić rozliczeń.", - "plan.upgrade.sectionOff.title": "Ta funkcja jest tymczasowo niedostępna", - "plan.upgrade.sectionOff.message": "Ta część Descrybe jest teraz wyłączona na platformie. To nie problem z upgrade’em — spróbuj później lub skontaktuj się z pomocą.", - "plan.upgrade.sectionOff.cta": "Wróć do pulpitu", - "plan.upgrade.stores.message": "Konektory WooCommerce i Shopify wymagają planu ze Sklepami. Ulepsz plan, aby je połączyć — albo korzystaj z feedów i API w obecnym planie.", - "plan.upgrade.stillWorks.title": "Co nadal działa w Twoim planie", - "plan.upgrade.stillWorks.feeds.label": "Feedy wejściowe", - "plan.upgrade.stillWorks.feeds.description": "Dodaj URL CSV lub XML oraz uploady plików, aby synchronizować katalogi bez konektorów sklepu.", + "plan.upgrade.message": "Ulepsz plan, aby odblokować tÄ™ część Descrybe.", + "plan.upgrade.defaultMessage": "Twój obecny plan nie obejmuje tej części Descrybe. Ulepsz plan, aby jÄ… odblokować, albo poproÅ› administratora firmy, jeÅ›li nie możesz zmienić rozliczeÅ„.", + "plan.upgrade.sectionOff.title": "Ta funkcja jest tymczasowo niedostÄ™pna", + "plan.upgrade.sectionOff.message": "Ta część Descrybe jest teraz wyłączona na platformie. To nie problem z upgrade’em — spróbuj później lub skontaktuj siÄ™ z pomocÄ….", + "plan.upgrade.sectionOff.cta": "Wróć do pulpitu", + "plan.upgrade.stores.message": "Konektory WooCommerce i Shopify wymagajÄ… planu ze Sklepami. Ulepsz plan, aby je połączyć — albo korzystaj z feedów i API w obecnym planie.", + "plan.upgrade.stillWorks.title": "Co nadal dziaÅ‚a w Twoim planie", + "plan.upgrade.stillWorks.feeds.label": "Feedy wejÅ›ciowe", + "plan.upgrade.stillWorks.feeds.description": "Dodaj URL CSV lub XML oraz uploady plików, aby synchronizować katalogi bez konektorów sklepu.", "plan.upgrade.stillWorks.export.label": "Feedy eksportu", - "plan.upgrade.stillWorks.export.description": "Generuj wychodzące feedy dla kanałów zakupowych i partnerów.", + "plan.upgrade.stillWorks.export.description": "Generuj wychodzÄ…ce feedy dla kanałów zakupowych i partnerów.", "plan.upgrade.stillWorks.processing.label": "Zadania w tle", - "plan.upgrade.stillWorks.processing.description": "Monitoruj zadania AI i katalogu w Przetwarzaniu — dostępne w Twoim planie nawet bez konektorów sklepu.", + "plan.upgrade.stillWorks.processing.description": "Monitoruj zadania AI i katalogu w Przetwarzaniu — dostÄ™pne w Twoim planie nawet bez konektorów sklepu.", "plan.upgrade.stillWorks.api.label": "Klucze API", - "plan.upgrade.stillWorks.api.description": "Utwórz klucz w Ustawieniach, aby używać /api/v1 — sekret jest pokazany tylko raz.", + "plan.upgrade.stillWorks.api.description": "Utwórz klucz w Ustawieniach, aby używać /api/v1 — sekret jest pokazany tylko raz.", "plan.upgrade.stillWorks.docs.label": "Dokumentacja API", - "plan.upgrade.stillWorks.docs.description": "Przeczytaj przegląd API i integruj bez WooCommerce ani Shopify.", - "plan.upgrade.feature.settings.api_keys": "Klucze API wymagają płatnego planu", - "plan.upgrade.feature.catalog.products.process_ai_titles": "Tytuły AI to funkcja płatna", - "plan.upgrade.feature.catalog.products.process_ai_descriptions": "Opisy AI to funkcja płatna", - "plan.upgrade.feature.marketing.campaigns.generate_ai": "AI kampanii wymaga płatnego planu", - "plan.upgrade.feature.marketing.campaigns.send": "Wysłanie kampanii na żywo wymaga płatnego planu", - "plan.upgrade.feature.marketing.brand_ai_apply": "Głos marki w AI wymaga płatnego planu", - "plan.upgrade.feature.marketing.seo.ai_rewrite": "Przepisanie SEO AI wymaga płatnego planu", - "plan.upgrade.feature.integrations.ai.byok": "Własny klucz AI od planu Growth", - "plan.upgrade.feature.capability.byok": "Własny klucz AI od planu Growth", - "plan.upgrade.feature.marketing.campaigns": "Kampanie nie są w Twoim planie", - "plan.upgrade.feature.marketing.content_calendar": "Kalendarz treści nie jest w Twoim planie", - "plan.upgrade.feature.marketing.seo": "Narzędzia SEO nie są w Twoim planie", + "plan.upgrade.stillWorks.docs.description": "Przeczytaj przeglÄ…d API i integruj bez WooCommerce ani Shopify.", + "plan.upgrade.feature.settings.api_keys": "Klucze API wymagajÄ… pÅ‚atnego planu", + "plan.upgrade.feature.catalog.products.process_ai_titles": "TytuÅ‚y AI to funkcja pÅ‚atna", + "plan.upgrade.feature.catalog.products.process_ai_descriptions": "Opisy AI to funkcja pÅ‚atna", + "plan.upgrade.feature.marketing.campaigns.generate_ai": "AI kampanii wymaga pÅ‚atnego planu", + "plan.upgrade.feature.marketing.campaigns.send": "WysÅ‚anie kampanii na żywo wymaga pÅ‚atnego planu", + "plan.upgrade.feature.marketing.brand_ai_apply": "GÅ‚os marki w AI wymaga pÅ‚atnego planu", + "plan.upgrade.feature.marketing.seo.ai_rewrite": "Przepisanie SEO AI wymaga pÅ‚atnego planu", + "plan.upgrade.feature.integrations.ai.byok": "WÅ‚asny klucz AI od planu Growth", + "plan.upgrade.feature.capability.byok": "WÅ‚asny klucz AI od planu Growth", + "plan.upgrade.feature.marketing.campaigns": "Kampanie nie sÄ… w Twoim planie", + "plan.upgrade.feature.marketing.content_calendar": "Kalendarz treÅ›ci nie jest w Twoim planie", + "plan.upgrade.feature.marketing.seo": "NarzÄ™dzia SEO nie sÄ… w Twoim planie", "plan.upgrade.feature.marketing.brand_kit": "Brand kit nie jest w Twoim planie", - "plan.upgrade.feature.marketing.reviews": "Opinie nie są w Twoim planie", - "plan.upgrade.feature.integrations.ai": "Integracje AI nie są w Twoim planie", - "plan.upgrade.feature.integrations.email": "Wysyłka e-mail nie jest w Twoim planie", + "plan.upgrade.feature.marketing.reviews": "Opinie nie sÄ… w Twoim planie", + "plan.upgrade.feature.integrations.ai": "Integracje AI nie sÄ… w Twoim planie", + "plan.upgrade.feature.integrations.email": "WysyÅ‚ka e-mail nie jest w Twoim planie", "plan.upgrade.feature.processing.monitor": "Przetwarzanie nie jest w Twoim planie", - "plan.upgrade.feature.stores.hub": "Konektory sklepu nie są w Twoim planie", + "plan.upgrade.feature.stores.hub": "Konektory sklepu nie sÄ… w Twoim planie", "plan.upgrade.feature.stores.woocommerce": "WooCommerce nie jest w Twoim planie", "plan.upgrade.feature.stores.shopify": "Shopify nie jest w Twoim planie", "plan.upgrade.feature.support.center": "Centrum pomocy nie jest w Twoim planie", - "plan.upgrade.feature.support.ticket_create": "Tworzenie ticketów pomocy nie jest w Twoim planie", - "plan.upgrade.feature.support.ticket_thread": "Wątki ticketów pomocy nie są w Twoim planie", - "plan.upgrade.feature.catalog.structured_descriptions": "Opisy strukturalne nie są w Twoim planie", - "plan.upgrade.feature.catalog.vector_categories": "Kategorie wektorowe nie są w Twoim planie", - "plan.checkingAccess": "Sprawdzanie dostępu do planu…", - "upgradeBanner.comparePlans": "Porównaj plany", - "upgradeBanner.talkToSales": "Porozmawiaj ze sprzedażą", + "plan.upgrade.feature.support.ticket_create": "Tworzenie ticketów pomocy nie jest w Twoim planie", + "plan.upgrade.feature.support.ticket_thread": "WÄ…tki ticketów pomocy nie sÄ… w Twoim planie", + "plan.upgrade.feature.catalog.structured_descriptions": "Opisy strukturalne nie sÄ… w Twoim planie", + "plan.upgrade.feature.catalog.vector_categories": "Kategorie wektorowe nie sÄ… w Twoim planie", + "plan.checkingAccess": "Sprawdzanie dostÄ™pu do planu…", + "upgradeBanner.comparePlans": "Porównaj plany", + "upgradeBanner.talkToSales": "Porozmawiaj ze sprzedażą", "commandPalette.closeAria": "Zamknij wyszukiwanie", "commandPalette.ariaLabel": "Szukaj stron", - "commandPalette.placeholder": "Szukaj stron…", + "commandPalette.placeholder": "Szukaj stron…", "commandPalette.searchAria": "Szukaj stron", "commandPalette.destinationsAria": "Strony", - "commandPalette.noMatches": "Brak pasujących stron", + "commandPalette.noMatches": "Brak pasujÄ…cych stron", "commandPalette.announceIdleOne": "Wyszukiwanie. {count} strona.", "commandPalette.announceIdleMany": "Wyszukiwanie. {count} stron.", - "commandPalette.announceNone": "Brak pasujących stron.", - "commandPalette.announceMatchOne": "{count} pasująca strona.", - "commandPalette.announceMatchMany": "{count} pasujące strony.", + "commandPalette.announceNone": "Brak pasujÄ…cych stron.", + "commandPalette.announceMatchOne": "{count} pasujÄ…ca strona.", + "commandPalette.announceMatchMany": "{count} pasujÄ…ce strony.", "vector.title": "Test kategorii wektorowych", - "vector.description": "Przeszukuj indeks kategorii wektorowych, gdy Pinecone jest skonfigurowany. Tworzenie indeksu i inicjalizacja nie są jeszcze dostępne w v2.", - "vector.probing": "Sprawdzanie API kategorii wektorowych…", - "vector.unavailable": "Kategorie wektorowe nie są jeszcze na tym backendzie. Nie ma tu nic do uruchomienia, dopóki /api/vector-categories/* nie zostanie podłączone.", - "vector.browseCategories": "Przeglądaj kategorie", - "vector.initHeading": "Inicjalizuj bazę wektorową", - "vector.initComingSoon": "Utwórz indeks i Inicjalizuj DB wektorową nie są jeszcze dostępne w v2 (wkrótce). Wyszukiwanie nadal działa, gdy Pinecone jest skonfigurowany.", - "vector.createIndex": "Utwórz indeks", - "vector.initDb": "Inicjalizuj DB wektorową", + "vector.description": "Przeszukuj indeks kategorii wektorowych, gdy Pinecone jest skonfigurowany. Tworzenie indeksu i inicjalizacja nie sÄ… jeszcze dostÄ™pne w v2.", + "vector.probing": "Sprawdzanie API kategorii wektorowych…", + "vector.unavailable": "Kategorie wektorowe nie sÄ… jeszcze na tym backendzie. Nie ma tu nic do uruchomienia, dopóki /api/vector-categories/* nie zostanie podłączone.", + "vector.browseCategories": "PrzeglÄ…daj kategorie", + "vector.initHeading": "Inicjalizuj bazÄ™ wektorowÄ…", + "vector.initComingSoon": "Utwórz indeks i Inicjalizuj DB wektorowÄ… nie sÄ… jeszcze dostÄ™pne w v2 (wkrótce). Wyszukiwanie nadal dziaÅ‚a, gdy Pinecone jest skonfigurowany.", + "vector.createIndex": "Utwórz indeks", + "vector.initDb": "Inicjalizuj DB wektorowÄ…", "vector.searchHeading": "Szukaj kategorii", - "vector.searchPlaceholder": "Wpisz opis produktu…", + "vector.searchPlaceholder": "Wpisz opis produktu…", "vector.results": "Wyniki:", "vector.categoryLabel": "Kategoria:", "vector.idLabel": "ID:", "vector.scoreLabel": "Wynik:", - "switcher.switching": "Przełączanie…", - "switcher.returnTo": "Wróć do {email}", - "switcher.switchUser": "Przełącz użytkownika", - "switcher.loadingUsers": "Ładowanie użytkowników…", - "switcher.empty": "Nie znaleziono użytkowników do przełączenia.", + "switcher.switching": "Przełączanie…", + "switcher.returnTo": "Wróć do {email}", + "switcher.switchUser": "Przełącz użytkownika", + "switcher.loadingUsers": "Ładowanie użytkowników…", + "switcher.empty": "Nie znaleziono użytkowników do przełączenia.", "switcher.noCompany": "Brak firmy", "switcher.unknownCompany": "Nieznana firma", - "companySwitcher.select": "Wybierz firmę", - "companySwitcher.switchAria": "Przełącz firmę: {label}", + "companySwitcher.select": "Wybierz firmÄ™", + "companySwitcher.switchAria": "Przełącz firmÄ™: {label}", "companySwitcher.companies": "Firmy", - "companySwitcher.returnTo": "Wróć do {name}", - "companySwitcher.returnHome": "Wróć do firmy domowej", - "storeReconnect.primaryLabel": "Połącz sklep ponownie", - "storeReconnect.titlePlural": "Połącz sklepy ponownie po migracji", - "storeReconnect.titleChannel": "Połącz {channel} ponownie po migracji", - "storeReconnect.titleSingular": "Połącz sklep ponownie po migracji", - "storeReconnect.messageWithItems": "Dane logowania API sklepu nie zostały przeniesione (lub nie można ich użyć) po migracji platformy. To nie jest uszkodzona synchronizacja — połącz ponownie każdy sklep, a potem Przetestuj połączenie przed kolejką synchronizacji.", - "storeReconnect.messageSingle": "Dane logowania API {channel} nie zostały przeniesione (lub nie można ich użyć) po migracji platformy. To nie jest uszkodzona synchronizacja — wklej świeże dane, Zapisz, a potem Przetestuj połączenie przed kolejką synchronizacji.", + "companySwitcher.returnTo": "Wróć do {name}", + "companySwitcher.returnHome": "Wróć do firmy domowej", + "storeReconnect.primaryLabel": "Połącz sklep ponownie", + "storeReconnect.titlePlural": "Połącz sklepy ponownie po migracji", + "storeReconnect.titleChannel": "Połącz {channel} ponownie po migracji", + "storeReconnect.titleSingular": "Połącz sklep ponownie po migracji", + "storeReconnect.messageWithItems": "Dane logowania API sklepu nie zostaÅ‚y przeniesione (lub nie można ich użyć) po migracji platformy. To nie jest uszkodzona synchronizacja — połącz ponownie każdy sklep, a potem Przetestuj połączenie przed kolejkÄ… synchronizacji.", + "storeReconnect.messageSingle": "Dane logowania API {channel} nie zostaÅ‚y przeniesione (lub nie można ich użyć) po migracji platformy. To nie jest uszkodzona synchronizacja — wklej Å›wieże dane, Zapisz, a potem Przetestuj połączenie przed kolejkÄ… synchronizacji.", "storeReconnect.channelFallback": "Sklep", - "storeReconnect.askAdmin": "Poproś administratora firmy o ponowne połączenie — tylko administratorzy mogą zapisywać dane logowania sklepu.", - "storeReconnect.reconnectItem": "Połącz ponownie {label}", + "storeReconnect.askAdmin": "PoproÅ› administratora firmy o ponowne połączenie — tylko administratorzy mogÄ… zapisywać dane logowania sklepu.", + "storeReconnect.reconnectItem": "Połącz ponownie {label}", "admin.storeReconnect.channel.other": "Other", "admin.storeReconnect.channel.woocommerce": "WooCommerce", "admin.storeReconnect.channel.shopify": "Shopify", @@ -5556,7 +5557,7 @@ export const pl: MessageDict = { "admin.storeReconnect.listTitle": "Connected but invalid", "admin.storeReconnect.metric.showing": "Rows shown", "admin.storeReconnect.metric.total": "Gaps total", - "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", + "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", "admin.storeReconnect.loadFailed": "Could not load store reconnect inventory.", "admin.storeReconnect.refresh": "Refresh", "admin.storeReconnect.description": "Companies with a connected store identity but missing or unusable API credentials (cutover credential gaps).", @@ -5564,38 +5565,38 @@ export const pl: MessageDict = { "admin.nav.storeReconnect": "Store reconnect", "storeReconnect.wizardHint": "Prefer a step-by-step flow? Open Guided setup (/stores/wizard), or reconnect the channel below and Test Connection before syncing.", "storeReconnect.wizardLabel": "Guided setup", - "storeReconnect.reviewsHint": "Import recenzji nie może działać, dopóki dane logowania nie zostaną ponownie połączone po migracji. W zakładce Połączenie: Zapisz, potem Przetestuj połączenie.", - "storeReconnect.ordersHint": "Import zamówień nie może działać, dopóki dane logowania nie zostaną ponownie połączone po migracji. W zakładce Połączenie: Zapisz, potem Przetestuj połączenie.", - "productSync.directionTitle": "Produkty: Descrybe → sklep", - "productSync.outbound": "Descrybe → {channel}", - "productSync.outboundBody": "— wysyła przetworzone produkty Descrybe do sklepu (tworzy lub aktualizuje dopasowane produkty zdalne). Nie importuje katalogu sklepu do Descrybe.", + "storeReconnect.reviewsHint": "Import recenzji nie może dziaÅ‚ać, dopóki dane logowania nie zostanÄ… ponownie połączone po migracji. W zakÅ‚adce Połączenie: Zapisz, potem Przetestuj połączenie.", + "storeReconnect.ordersHint": "Import zamówieÅ„ nie może dziaÅ‚ać, dopóki dane logowania nie zostanÄ… ponownie połączone po migracji. W zakÅ‚adce Połączenie: Zapisz, potem Przetestuj połączenie.", + "productSync.directionTitle": "Produkty: Descrybe → sklep", + "productSync.outbound": "Descrybe → {channel}", + "productSync.outboundBody": "— wysyÅ‚a przetworzone produkty Descrybe do sklepu (tworzy lub aktualizuje dopasowane produkty zdalne). Nie importuje katalogu sklepu do Descrybe.", "productSync.firstSync": "Pierwsza synchronizacja", - "productSync.firstSyncBody": "— niedopasowane produkty są tworzone w {channel}. Kolejne synchronizacje aktualizują produkty już powiązane po id lub strategii dopasowania.", + "productSync.firstSyncBody": "— niedopasowane produkty sÄ… tworzone w {channel}. Kolejne synchronizacje aktualizujÄ… produkty już powiÄ…zane po id lub strategii dopasowania.", "productSync.reSync": "Ponowna synchronizacja", - "productSync.reSyncBody": "— dopasowane produkty zdalne mogą zostać nadpisane treścią Descrybe ({count} powiązanych do tej pory).", - "productSync.queued": "Synchronizacja produktów w kolejce", - "productSync.live.queued": "W kolejce — oczekiwanie na workera", + "productSync.reSyncBody": "— dopasowane produkty zdalne mogÄ… zostać nadpisane treÅ›ciÄ… Descrybe ({count} powiÄ…zanych do tej pory).", + "productSync.queued": "Synchronizacja produktów w kolejce", + "productSync.live.queued": "W kolejce — oczekiwanie na workera", "productSync.live.running": "Synchronizacja w toku", - "productSync.live.watching": "Śledzenie statusu… liczniki pojawią się po zakończeniu.", - "productSync.live.success": "Sync zakończona: {total} łącznie · {created} utworzonych · {updated} zaktualizowanych · {failed} nieudanych · {skipped} pominiętych", - "productSync.live.partial": "Sync z błędami: {total} łącznie · {created} utworzonych · {updated} zaktualizowanych · {failed} nieudanych · {skipped} pominiętych", + "productSync.live.watching": "Åšledzenie statusu… liczniki pojawiÄ… siÄ™ po zakoÅ„czeniu.", + "productSync.live.success": "Sync zakoÅ„czona: {total} łącznie · {created} utworzonych · {updated} zaktualizowanych · {failed} nieudanych · {skipped} pominiÄ™tych", + "productSync.live.partial": "Sync z błędami: {total} łącznie · {created} utworzonych · {updated} zaktualizowanych · {failed} nieudanych · {skipped} pominiÄ™tych", "productSync.live.failed": "Sync nieudana{detail}.", - "productSync.live.timedOut": "Nadal trwa — odśwież później, by zobaczyć status i liczniki.", - "productSync.live.ordersSuccess": "Sync zamówień zakończona ({status}).", - "productSync.live.reviewsSuccess": "Sync recenzji zakończona ({status}).", - "productSync.retry": "Ponów sync", + "productSync.live.timedOut": "Nadal trwa — odÅ›wież później, by zobaczyć status i liczniki.", + "productSync.live.ordersSuccess": "Sync zamówieÅ„ zakoÅ„czona ({status}).", + "productSync.live.reviewsSuccess": "Sync recenzji zakoÅ„czona ({status}).", + "productSync.retry": "Ponów sync", "productSync.lastStatus": "Ostatnia: {status}", "productSync.dryRun": "Symulacja", - "productSync.lastSyncAt": "Ostatnia synchronizacja produktów: {date}", - "productSync.noneYet": "Żadna synchronizacja produktów jeszcze się nie zakończyła.", - "productSync.lastRun": "Ostatnie uruchomienie: {total} łącznie · {created} utworzonych · {updated} zaktualizowanych · {failed} nieudanych · {skipped} pominiętych", - "productSync.needsReconnect": "Synchronizacja produktów nie może działać, dopóki dane logowania nie zostaną ponownie połączone po migracji. W zakładce Połączenie: Zapisz, potem Przetestuj połączenie.", + "productSync.lastSyncAt": "Ostatnia synchronizacja produktów: {date}", + "productSync.noneYet": "Å»adna synchronizacja produktów jeszcze siÄ™ nie zakoÅ„czyÅ‚a.", + "productSync.lastRun": "Ostatnie uruchomienie: {total} łącznie · {created} utworzonych · {updated} zaktualizowanych · {failed} nieudanych · {skipped} pominiÄ™tych", + "productSync.needsReconnect": "Synchronizacja produktów nie może dziaÅ‚ać, dopóki dane logowania nie zostanÄ… ponownie połączone po migracji. W zakÅ‚adce Połączenie: Zapisz, potem Przetestuj połączenie.", "productSync.scheduleTitle": "Automatic product sync schedule", - "productSync.scheduleHelp": "Jak interwały feedów: ustaw, jak często Descrybe wypycha produkty do sklepu, albo wstrzymaj harmonogram. Ręczna kolejka działa mimo pauzy. Webhooki sklepu nie są używane — tylko odpytywanie/kolejka.", - "productSync.scheduleInterval": "Interwał sync (godziny)", - "productSync.scheduleIntervalHint": "1–168 godzin. Domyślnie 6 godzin, jeśli nie ustawiono na serwerze.", + "productSync.scheduleHelp": "Jak interwaÅ‚y feedów: ustaw, jak czÄ™sto Descrybe wypycha produkty do sklepu, albo wstrzymaj harmonogram. RÄ™czna kolejka dziaÅ‚a mimo pauzy. Webhooki sklepu nie sÄ… używane — tylko odpytywanie/kolejka.", + "productSync.scheduleInterval": "InterwaÅ‚ sync (godziny)", + "productSync.scheduleIntervalHint": "1–168 godzin. DomyÅ›lnie 6 godzin, jeÅ›li nie ustawiono na serwerze.", "productSync.schedulePause": "Wstrzymaj automatyczny sync", - "productSync.schedulePauseHint": "Zatrzymuje tylko zaplanowane wypchnięcia. Nadal możesz ręcznie ustawić sync produktów w kolejce.", + "productSync.schedulePauseHint": "Zatrzymuje tylko zaplanowane wypchniÄ™cia. Nadal możesz rÄ™cznie ustawić sync produktów w kolejce.", "productSync.scheduleSave": "Save schedule", "productSync.scheduleSaved": "Product sync schedule saved.", "productSync.schedulePausedSaved": "Automatic product sync paused.", @@ -5605,14 +5606,14 @@ export const pl: MessageDict = { "productSync.scheduleNeedsConfig": "Save store connection first", "productSync.scheduleAdminOnly": "Company admin required", "productSync.delivery.title": "Aktualizacje przez odpytywanie, nie webhooki sklepu", - "productSync.delivery.body": "Descrybe nie odbiera webhooków Shopify ani WooCommerce. Wypychanie produktów działa po dodaniu do kolejki lub według harmonogramu. Ta strona śledzi postęp, odpytując status połączenia — nie przez live push ze sklepu.", - "productSync.delivery.inboundNote": "Zamówienia i recenzje też używają kolejek (harmonogram lub ręcznie), nie live webhooków.", - "productSync.delivery.hubNote": "Konektory sklepów synchronizują według harmonogramu lub po dodaniu zadania do kolejki — nie przez live webhooki sklepu.", - "productSync.delivery.badge.manual": "Kolejka ręczna", + "productSync.delivery.body": "Descrybe nie odbiera webhooków Shopify ani WooCommerce. Wypychanie produktów dziaÅ‚a po dodaniu do kolejki lub wedÅ‚ug harmonogramu. Ta strona Å›ledzi postÄ™p, odpytujÄ…c status połączenia — nie przez live push ze sklepu.", + "productSync.delivery.inboundNote": "Zamówienia i recenzje też używajÄ… kolejek (harmonogram lub rÄ™cznie), nie live webhooków.", + "productSync.delivery.hubNote": "Konektory sklepów synchronizujÄ… wedÅ‚ug harmonogramu lub po dodaniu zadania do kolejki — nie przez live webhooki sklepu.", + "productSync.delivery.badge.manual": "Kolejka rÄ™czna", "productSync.delivery.badge.scheduled": "Harmonogram co {hours} godz.", - "productSync.delivery.badge.scheduledDefault": "Harmonogram (domyślnie serwera)", + "productSync.delivery.badge.scheduledDefault": "Harmonogram (domyÅ›lnie serwera)", "productSync.delivery.badge.paused": "Harmonogram wstrzymany", - "productSync.delivery.badge.webhooksOff": "Webhooki sklepu: niedostępne", + "productSync.delivery.badge.webhooksOff": "Webhooki sklepu: niedostÄ™pne", "productSync.scope.title": "What to sync", "productSync.scope.hint": "Optional filters for this push only. Leave blank to sync the latest processed products up to the limit.", "productSync.scope.status": "Status", @@ -5627,21 +5628,21 @@ export const pl: MessageDict = { "productSync.scope.products": "Specific products", "productSync.scope.productsHint": "Optional. Search and select processed products to push only those.", "productSync.scope.productsOverrideHint": "Selected products override status, category, and max-products filters for this sync.", - "productSync.scope.productsSearch": "Search products…", - "productSync.scope.productsLoading": "Loading products…", + "productSync.scope.productsSearch": "Search products…", + "productSync.scope.productsLoading": "Loading products…", "productSync.scope.productsEmpty": "No processed products found.", "productSync.scope.productsSelected": "{count} selected", "productSync.scope.productsSelectedList": "Selected products", "productSync.scope.productsClear": "Clear selection", "productSync.scope.productsMax": "Maximum {max} products", - "store.syncingLive": "Synchronizacja…", - "files.recentUploads": "Ostatnie przesłania", + "store.syncingLive": "Synchronizacja…", + "files.recentUploads": "Ostatnie przesÅ‚ania", "files.colFileName": "Nazwa pliku", "files.colKind": "Rodzaj", - "files.colUploaded": "Przesłano", + "files.colUploaded": "PrzesÅ‚ano", "files.colRows": "Wiersze", - "files.loading": "Ładowanie przesłań…", - "files.empty": "Brak przesłań.", + "files.loading": "Ładowanie przesÅ‚ań…", + "files.empty": "Brak przesÅ‚aÅ„.", "products.filters.sortProducts": "Sortuj produkty", "products.table.options": "Opcje", }; diff --git a/apps/web/src/lib/i18n/messages/pt.ts b/apps/web/src/lib/i18n/messages/pt.ts index afeb16a..534ec1e 100644 --- a/apps/web/src/lib/i18n/messages/pt.ts +++ b/apps/web/src/lib/i18n/messages/pt.ts @@ -1,47 +1,47 @@ -import type { MessageDict } from "./types"; +import type { MessageDict } from "./types"; -/** Portuguese (pt) UI pack — keys must stay in sync with en.ts. */ +/** Portuguese (pt) UI pack — keys must stay in sync with en.ts. */ export const pt: MessageDict = { "app.name": "Descrybe", - "app.home": "Início Descrybe", + "app.home": "Início Descrybe", "common.cancel": "Cancelar", - "common.save": "Guardar alterações", + "common.save": "Guardar alterações", "common.saveShort": "Guardar", "common.continue": "Continuar", "common.open": "Abrir", - "common.markDone": "Marcar como concluído", + "common.markDone": "Marcar como concluído", "common.viewAll": "Ver tudo", "common.close": "Fechar", - "common.askAdmin": "Peça a um administrador da empresa", - "common.you": "Você", + "common.askAdmin": "Peça a um administrador da empresa", + "common.you": "Você", "common.active": "Ativo", "common.pending": "Pendente", "common.email": "E-mail", "common.password": "Palavra-passe", "common.name": "O seu nome", - "common.viewPricing": "Ver preços", - "common.backToSignIn": "Voltar ao início de sessão", - "common.signingOut": "A terminar sessão…", - "common.signOutAndContinue": "Terminar sessão e continuar", - "common.staySignedIn": "Manter sessão iniciada", - "a11y.skipToContent": "Saltar para o conteúdo", + "common.viewPricing": "Ver preços", + "common.backToSignIn": "Voltar ao início de sessão", + "common.signingOut": "A terminar sessão…", + "common.signOutAndContinue": "Terminar sessão e continuar", + "common.staySignedIn": "Manter sessão iniciada", + "a11y.skipToContent": "Saltar para o conteúdo", "theme.switchToDark": "Mudar para tema escuro", "theme.switchToLight": "Mudar para tema claro", - "header.signOut": "Terminar sessão", - "header.signingOut": "A terminar sessão…", - "status.emDash": "—", + "header.signOut": "Terminar sessão", + "header.signingOut": "A terminar sessão…", + "status.emDash": "—", "status.pending": "Pendente", "status.processing": "A processar", - "status.completed": "Concluído", + "status.completed": "Concluído", "status.failed": "Falhou", "status.cancelled": "Cancelado", - "nav.section.overview": "Visão geral", - "nav.section.catalog": "Catálogo", + "nav.section.overview": "Visão geral", + "nav.section.catalog": "Catálogo", "nav.section.feeds": "Feeds", "nav.section.stores": "Lojas", "nav.section.processing": "A processar", "nav.section.marketing": "Marketing", - "nav.section.integrations": "Integrações", + "nav.section.integrations": "Integrações", "nav.section.account": "Conta", "nav.section.platform": "Plataforma", "nav.dashboard": "Painel", @@ -50,208 +50,208 @@ export const pt: MessageDict = { "nav.attributes": "Atributos", "nav.fields": "Campos", "nav.feeds": "Feeds", - "nav.exports": "Exportações", + "nav.exports": "Exportações", "nav.stores": "Lojas", "nav.jobs": "Tarefas", "nav.campaigns": "Campanhas", - "nav.calendar": "Calendário", + "nav.calendar": "Calendário", "nav.seo": "SEO", "nav.brand": "Marca", - "nav.reviews": "Avaliações", + "nav.reviews": "Avaliações", "nav.ai": "IA", "nav.email": "E-mail", - "nav.billing": "Faturação", - "nav.settings": "Definições", + "nav.billing": "Faturação", + "nav.settings": "Definições", "nav.support": "Suporte", "nav.admin": "Admin", - "nav.main": "Navegação principal", + "nav.main": "Navegação principal", "nav.sidebar": "Barra lateral da app", - "nav.close": "Fechar navegação", + "nav.close": "Fechar navegação", "nav.closeMenu": "Fechar menu", - "nav.open": "Abrir navegação", - "nav.commandPalette": "Pesquisar páginas", + "nav.open": "Abrir navegação", + "nav.commandPalette": "Pesquisar páginas", "nav.commandPaletteLabel": "Pesquisar", - "auth.login.title": "Iniciar sessão", + "auth.login.title": "Iniciar sessão", "auth.login.description": "Utilize o seu e-mail e palavra-passe Descrybe.", - "auth.login.submit": "Iniciar sessão", - "auth.login.submitting": "A iniciar sessão…", - "auth.login.failed": "Falha no início de sessão", - "auth.login.passwordNotSet": "Esta conta ainda precisa de uma palavra-passe. Abra o link do convite ou peça a um administrador para emitir um novo.", + "auth.login.submit": "Iniciar sessão", + "auth.login.submitting": "A iniciar sessão…", + "auth.login.failed": "Falha no início de sessão", + "auth.login.passwordNotSet": "Esta conta ainda precisa de uma palavra-passe. Abra o link do convite ou peça a um administrador para emitir um novo.", "auth.login.setPasswordFirstTitle": "Defina primeiro a palavra-passe:", - "auth.login.setPasswordFirstBody": "utilize o link do convite do seu e-mail. Se o link foi para um endereço antigo (desvio de e-mail), peça a um administrador da empresa para emitir um novo convite de definição de palavra-passe para {email}.", + "auth.login.setPasswordFirstBody": "utilize o link do convite do seu e-mail. Se o link foi para um endereço antigo (desvio de e-mail), peça a um administrador da empresa para emitir um novo convite de definição de palavra-passe para {email}.", "auth.login.yourEmail": "o seu e-mail", "auth.login.platformAdminsReissue": "Os administradores da plataforma podem reemitir a partir de", - "auth.login.adminUsersLink": "Admin → Utilizadores", + "auth.login.adminUsersLink": "Admin → Utilizadores", "auth.login.haveToken": "Tem um token? Abrir aceitar convite", "auth.login.noAccount": "Sem conta?", "auth.login.createCompany": "Criar empresa", "auth.login.haveInvite": "Tem um convite ou um link para definir a palavra-passe?", "auth.login.acceptInvite": "Aceitar convite", "auth.login.forgotPassword": "Esqueceu a palavra-passe?", - "auth.login.forgotPasswordHelp": "Introduza o seu e-mail na página de redefinição. Se nunca definiu uma palavra-passe, use o link de convite / definir palavra-passe.", + "auth.login.forgotPasswordHelp": "Introduza o seu e-mail na página de redefinição. Se nunca definiu uma palavra-passe, use o link de convite / definir palavra-passe.", "auth.forgot.title": "Esqueceu a palavra-passe", - "auth.forgot.description": "Introduza o e-mail da conta. Se corresponder a uma conta ativa, enviaremos um link de redefinição.", - "auth.forgot.submit": "Enviar link de redefinição", - "auth.forgot.submitting": "A enviar…", - "auth.forgot.failed": "Não foi possível pedir a redefinição", + "auth.forgot.description": "Introduza o e-mail da conta. Se corresponder a uma conta ativa, enviaremos um link de redefinição.", + "auth.forgot.submit": "Enviar link de redefinição", + "auth.forgot.submitting": "A enviar…", + "auth.forgot.failed": "Não foi possível pedir a redefinição", "auth.forgot.sentTitle": "Verifique o seu e-mail", - "auth.forgot.sentBody": "Se existir uma conta para esse endereço, o link de redefinição está a caminho. O link expira em uma hora.", - "auth.forgot.backToSignIn": "Voltar ao início de sessão", + "auth.forgot.sentBody": "Se existir uma conta para esse endereço, o link de redefinição está a caminho. O link expira em uma hora.", + "auth.forgot.backToSignIn": "Voltar ao início de sessão", "auth.reset.title": "Redefinir palavra-passe", "auth.reset.description": "Escolha uma nova palavra-passe para a sua conta Descrybe (pelo menos 8 caracteres).", "auth.reset.submit": "Guardar nova palavra-passe", - "auth.reset.submitting": "A guardar…", - "auth.reset.failed": "Não foi possível redefinir a palavra-passe", + "auth.reset.submitting": "A guardar…", + "auth.reset.failed": "Não foi possível redefinir a palavra-passe", "auth.reset.doneTitle": "Palavra-passe atualizada", - "auth.reset.doneDescription": "Inicie sessão com o seu e-mail e a nova palavra-passe.", - "auth.reset.goToSignIn": "Ir para iniciar sessão", + "auth.reset.doneDescription": "Inicie sessão com o seu e-mail e a nova palavra-passe.", + "auth.reset.goToSignIn": "Ir para iniciar sessão", "auth.reset.passwordConfirm": "Confirmar palavra-passe", - "auth.reset.passwordMismatch": "As palavras-passe não coincidem", - "auth.reset.missingTitle": "Link de redefinição em falta", + "auth.reset.passwordMismatch": "As palavras-passe não coincidem", + "auth.reset.missingTitle": "Link de redefinição em falta", "auth.reset.missingDescription": "Abra o link do seu e-mail para escolher uma nova palavra-passe.", - "auth.reset.requestNewLink": "Pedir um novo link de redefinição", - "auth.reset.tokenMissing": "Não foi fornecido um link de redefinição. Use o link do e-mail ou peça um novo.", - "auth.reset.tokenInvalid": "Este link de redefinição é inválido ou expirou. Peça um novo na página de esqueci a palavra-passe.", - "auth.reset.linkRecognized": "Link de redefinição reconhecido. Introduza uma nova palavra-passe abaixo — o segredo não é mostrado nesta página.", - "auth.reset.tokenLabel": "Token de redefinição", + "auth.reset.requestNewLink": "Pedir um novo link de redefinição", + "auth.reset.tokenMissing": "Não foi fornecido um link de redefinição. Use o link do e-mail ou peça um novo.", + "auth.reset.tokenInvalid": "Este link de redefinição é inválido ou expirou. Peça um novo na página de esqueci a palavra-passe.", + "auth.reset.linkRecognized": "Link de redefinição reconhecido. Introduza uma nova palavra-passe abaixo — o segredo não é mostrado nesta página.", + "auth.reset.tokenLabel": "Token de redefinição", "auth.reset.passwordHint": "Pelo menos 8 caracteres. Sem outras regras de complexidade.", "auth.register.title": "Criar empresa", "auth.register.description": "Regista uma empresa e o respetivo utilizador administrador.", "auth.register.companyName": "Nome da empresa", "auth.register.submit": "Criar conta", - "auth.register.submitting": "A criar…", + "auth.register.submitting": "A criar…", "auth.register.failed": "Falha no registo", - "auth.register.haveAccount": "Já tem uma conta?", - "auth.register.signIn": "Iniciar sessão", + "auth.register.haveAccount": "Já tem uma conta?", + "auth.register.signIn": "Iniciar sessão", "auth.invite.title": "Aceitar convite", "auth.invite.setPasswordTitle": "Definir palavra-passe", - "auth.invite.description": "Defina a sua palavra-passe para aderir à empresa. O seu administrador atribuiu Membro (trabalho diário) ou Admin (equipa e faturação).", + "auth.invite.description": "Defina a sua palavra-passe para aderir à empresa. O seu administrador atribuiu Membro (trabalho diário) ou Admin (equipa e faturação).", "auth.invite.setPasswordDescription": "Escolha uma palavra-passe para a sua conta Descrybe migrada (pelo menos 8 caracteres).", - "auth.invite.checking": "A verificar convite…", + "auth.invite.checking": "A verificar convite…", "auth.invite.forEmail": "Convite para {email}.", - "auth.invite.linkRecognized": "Link de convite reconhecido. Introduza uma palavra-passe abaixo para continuar — o segredo não é mostrado nesta página.", - "auth.invite.resetLinkRecognized": "Link de redefinição reconhecido. Introduza uma palavra-passe abaixo para continuar — o segredo não é mostrado nesta página.", + "auth.invite.linkRecognized": "Link de convite reconhecido. Introduza uma palavra-passe abaixo para continuar — o segredo não é mostrado nesta página.", + "auth.invite.resetLinkRecognized": "Link de redefinição reconhecido. Introduza uma palavra-passe abaixo para continuar — o segredo não é mostrado nesta página.", "auth.invite.tokenLabel": "Token de convite", - "auth.invite.resetTokenLabel": "Token de redefinição", - "auth.invite.tokenHelp": "Cole o token do e-mail de convite. É mascarado neste campo.", + "auth.invite.resetTokenLabel": "Token de redefinição", + "auth.invite.tokenHelp": "Cole o token do e-mail de convite. É mascarado neste campo.", "auth.invite.passwordHint": "Pelo menos 8 caracteres. Sem outras regras de complexidade.", "auth.invite.submit": "Aceitar convite", "auth.invite.setPasswordSubmit": "Definir palavra-passe", - "auth.invite.accepting": "A aceitar…", - "auth.invite.saving": "A guardar…", - "auth.invite.verifyFailed": "Não foi possível verificar o convite", - "auth.invite.verifySetPasswordFailed": "Não foi possível verificar o link de definição de palavra-passe", - "auth.invite.acceptFailed": "Não foi possível aceitar o convite", - "auth.invite.setPasswordFailed": "Não foi possível definir a palavra-passe", - "auth.invite.expired": "Este convite é inválido ou expirou. Peça ao administrador da empresa para enviar um novo convite e abra o novo link (ou cole o novo token abaixo).", - "auth.invite.setPasswordExpired": "Este link de definição de palavra-passe é inválido ou expirou. Peça a um administrador da empresa ou da plataforma para o reemitir e abra o novo link (ou cole o novo token abaixo).", - "auth.invite.emailMismatchDefault": "Tem sessão iniciada com um e-mail diferente deste convite.", - "auth.invite.expiredFooter": "Link expirado? Peça a um administrador para o reemitir — não há API de reenvio self-service. Administradores da plataforma:", - "auth.invite.adminUsersLink": "Admin → Utilizadores", - "auth.invite.doneTitle": "Já faz parte da equipa", + "auth.invite.accepting": "A aceitar…", + "auth.invite.saving": "A guardar…", + "auth.invite.verifyFailed": "Não foi possível verificar o convite", + "auth.invite.verifySetPasswordFailed": "Não foi possível verificar o link de definição de palavra-passe", + "auth.invite.acceptFailed": "Não foi possível aceitar o convite", + "auth.invite.setPasswordFailed": "Não foi possível definir a palavra-passe", + "auth.invite.expired": "Este convite é inválido ou expirou. Peça ao administrador da empresa para enviar um novo convite e abra o novo link (ou cole o novo token abaixo).", + "auth.invite.setPasswordExpired": "Este link de definição de palavra-passe é inválido ou expirou. Peça a um administrador da empresa ou da plataforma para o reemitir e abra o novo link (ou cole o novo token abaixo).", + "auth.invite.emailMismatchDefault": "Tem sessão iniciada com um e-mail diferente deste convite.", + "auth.invite.expiredFooter": "Link expirado? Peça a um administrador para o reemitir — não há API de reenvio self-service. Administradores da plataforma:", + "auth.invite.adminUsersLink": "Admin → Utilizadores", + "auth.invite.doneTitle": "Já faz parte da equipa", "auth.invite.doneSetPasswordTitle": "Palavra-passe guardada", - "auth.invite.doneDescription": "A sua conta está pronta. Em seguida, abra o painel para trabalhar com feeds e produtos, ou reveja as definições da empresa.", - "auth.invite.doneSetPasswordDescription": "Inicie sessão com o seu e-mail e a nova palavra-passe para abrir o seu espaço de trabalho.", + "auth.invite.doneDescription": "A sua conta está pronta. Em seguida, abra o painel para trabalhar com feeds e produtos, ou reveja as definições da empresa.", + "auth.invite.doneSetPasswordDescription": "Inicie sessão com o seu e-mail e a nova palavra-passe para abrir o seu espaço de trabalho.", "auth.invite.openDashboard": "Abrir painel", - "auth.invite.companySettings": "Definições da empresa", - "auth.invite.goToSignIn": "Ir para início de sessão", - "auth.invite.afterSignInNote": "Após o início de sessão chega ao seu espaço de trabalho — o tour de configuração inicial é ignorado.", + "auth.invite.companySettings": "Definições da empresa", + "auth.invite.goToSignIn": "Ir para início de sessão", + "auth.invite.afterSignInNote": "Após o início de sessão chega ao seu espaço de trabalho — o tour de configuração inicial é ignorado.", "auth.invite.mismatchTitle": "Conta errada para este convite", - "auth.invite.mismatchDescription": "Este link é para um e-mail diferente daquele com que tem sessão iniciada. Termine a sessão para continuar como o utilizador convidado, ou mantenha a sessão e peça a um administrador para reemitir o convite.", - "auth.invite.mismatchDetail": "Sessão iniciada como {session}, mas este convite é para {invite}.", - "auth.invite.mismatchFallback": "O e-mail da sessão não corresponde a este convite.", + "auth.invite.mismatchDescription": "Este link é para um e-mail diferente daquele com que tem sessão iniciada. Termine a sessão para continuar como o utilizador convidado, ou mantenha a sessão e peça a um administrador para reemitir o convite.", + "auth.invite.mismatchDetail": "Sessão iniciada como {session}, mas este convite é para {invite}.", + "auth.invite.mismatchFallback": "O e-mail da sessão não corresponde a este convite.", "auth.invite.switchAccountTitle": "Mudar de conta:", - "auth.invite.switchAccountBody": "termine a sessão e conclua este formulário com o e-mail convidado{emailSuffix}.", - "auth.invite.reissueTitle": "Caminho de reemissão:", - "auth.invite.reissueBody": "se o seu e-mail real de início de sessão mudou (desvio de e-mail), peça a um administrador da empresa para revogar este convite e enviar um novo para o e-mail que utiliza para iniciar sessão. Os administradores da plataforma também podem reemitir links de definição de palavra-passe em Admin → Utilizadores.", + "auth.invite.switchAccountBody": "termine a sessão e conclua este formulário com o e-mail convidado{emailSuffix}.", + "auth.invite.reissueTitle": "Caminho de reemissão:", + "auth.invite.reissueBody": "se o seu e-mail real de início de sessão mudou (desvio de e-mail), peça a um administrador da empresa para revogar este convite e enviar um novo para o e-mail que utiliza para iniciar sessão. Os administradores da plataforma também podem reemitir links de definição de palavra-passe em Admin → Utilizadores.", "locale.switcher": "Idioma da interface", "locale.menu": "Escolher idioma da interface", "locale.label": "Idioma do painel", - "locale.help": "Altera as etiquetas da navegação e das definições. O idioma do conteúdo gerado é definido separadamente em Empresa.", - "settings.contentLanguage": "Idioma do conteúdo", - "settings.contentLanguageHelp": "Idioma usado para títulos, descrições e outros conteúdos gerados", + "locale.help": "Altera as etiquetas da navegação e das definições. O idioma do conteúdo gerado é definido separadamente em Empresa.", + "settings.contentLanguage": "Idioma do conteúdo", + "settings.contentLanguageHelp": "Idioma usado para títulos, descrições e outros conteúdos gerados", "settings.tab.profile": "Perfil", "settings.tab.company": "Empresa", "settings.tab.alerts": "Alertas", "settings.tab.apiKeys": "Chaves API", "settings.tab.team": "Equipa", - "settings.title": "Definições", + "settings.title": "Definições", "settings.description": "Conta, empresa, chaves API e equipa.", - "settings.accessDenied": "Não tem permissão para abrir as definições da empresa. Peça ajuda a um administrador da empresa.", - "settings.loadFailed": "Falha ao carregar as definições", + "settings.accessDenied": "Não tem permissão para abrir as definições da empresa. Peça ajuda a um administrador da empresa.", + "settings.loadFailed": "Falha ao carregar as definições", "settings.profileHeading": "Perfil", - "settings.personalInfo": "Informação pessoal", + "settings.personalInfo": "Informação pessoal", "settings.personalInfoHelp": "Atualize os seus dados pessoais", - "settings.firstName": "Nome próprio", - "settings.firstNamePlaceholder": "O seu nome próprio", + "settings.firstName": "Nome próprio", + "settings.firstNamePlaceholder": "O seu nome próprio", "settings.lastName": "Apelido", "settings.lastNamePlaceholder": "O seu apelido", "settings.email": "E-mail", "settings.profileUpdated": "Perfil atualizado.", - "settings.profileUpdateFailed": "Não foi possível atualizar o perfil", + "settings.profileUpdateFailed": "Não foi possível atualizar o perfil", "settings.role.member": "Membro", "settings.role.admin": "Admin", "settings.teamHeading": "Membros da equipa", "settings.inviteUser": "Convidar utilizador", "settings.teamAdminOnly": "Apenas administradores da empresa podem convidar, promover, despromover ou remover colegas.", - "settings.shareAcceptLink": "Partilhar link de aceitação", - "settings.shareAcceptLinkHelp": "O e-mail de saída não está configurado. Copie este link de utilização única e envie-o ao convidado. Definirá uma palavra-passe (pelo menos 8 caracteres) e aderirá com o papel que escolheu.", - "settings.acceptLinkLabel": "Link de aceitação de convite de utilização única", + "settings.shareAcceptLink": "Partilhar link de aceitação", + "settings.shareAcceptLinkHelp": "O e-mail de saída não está configurado. Copie este link de utilização única e envie-o ao convidado. Definirá uma palavra-passe (pelo menos 8 caracteres) e aderirá com o papel que escolheu.", + "settings.acceptLinkLabel": "Link de aceitação de convite de utilização única", "settings.copyLink": "Copiar link", - "settings.linkCopied": "Link de aceitação copiado.", + "settings.linkCopied": "Link de aceitação copiado.", "settings.table.email": "E-mail", "settings.table.role": "Papel", "settings.table.status": "Estado", - "settings.table.joined": "Adesão / expira", - "settings.table.actions": "Ações", - "settings.teamForbidden": "Não tem permissão para ver a lista da equipa. Peça ajuda a um administrador da empresa.", + "settings.table.joined": "Adesão / expira", + "settings.table.actions": "Ações", + "settings.teamForbidden": "Não tem permissão para ver a lista da equipa. Peça ajuda a um administrador da empresa.", "settings.noTeammates": "Ainda sem colegas", - "settings.noTeammatesHelp": "Convide colegas como Membro (produtos e feeds) ou Admin (equipa e definições da empresa). Os convites pendentes aparecem aqui até serem aceites.", - "settings.noTeammatesMemberHelp": "Ainda não há colegas listados. Peça a um administrador da empresa para enviar convites.", - "settings.memberActions": "Ações do membro", + "settings.noTeammatesHelp": "Convide colegas como Membro (produtos e feeds) ou Admin (equipa e definições da empresa). Os convites pendentes aparecem aqui até serem aceites.", + "settings.noTeammatesMemberHelp": "Ainda não há colegas listados. Peça a um administrador da empresa para enviar convites.", + "settings.memberActions": "Ações do membro", "settings.makeAdmin": "Tornar admin", "settings.makeMember": "Tornar membro", "settings.removeMember": "Remover", "settings.revokeInvite": "Revogar convite", "settings.needOneAdmin": "As empresas precisam de pelo menos um administrador", "settings.expires": "Expira a {date}", - "settings.invalidEmail": "Introduza um endereço de e-mail válido.", - "settings.inviteCreatedNoMail": "Convite criado para {email} como {role}. Copie o link de aceitação abaixo e partilhe-o — o e-mail de saída não está configurado.", + "settings.invalidEmail": "Introduza um endereço de e-mail válido.", + "settings.inviteCreatedNoMail": "Convite criado para {email} como {role}. Copie o link de aceitação abaixo e partilhe-o — o e-mail de saída não está configurado.", "settings.inviteSent": "Convite enviado para {email} como {role}. Deve abrir o e-mail e aceitar antes de expirar.", - "settings.inviteFailed": "Não foi possível enviar o convite", + "settings.inviteFailed": "Não foi possível enviar o convite", "settings.revokeConfirm": "Revogar este convite?", "settings.revoked": "Convite revogado.", - "settings.revokeFailed": "Não foi possível revogar o convite", + "settings.revokeFailed": "Não foi possível revogar o convite", "settings.removeConfirm": "Remover {email} desta empresa?", "settings.memberRemoved": "{email} removido.", - "settings.removeFailed": "Não foi possível remover o utilizador", + "settings.removeFailed": "Não foi possível remover o utilizador", "settings.roleChangeConfirm": "{action} {email} para {role}?", - "settings.roleChanged": "{email} é agora {role}.", - "settings.roleChangeFailed": "Não foi possível atualizar o papel", + "settings.roleChanged": "{email} é agora {role}.", + "settings.roleChangeFailed": "Não foi possível atualizar o papel", "settings.promote": "Promover", "settings.demote": "Despromover", "settings.inviteTitle": "Convidar colega", - "settings.inviteDescription": "Receberão um link para definir uma palavra-passe (pelo menos 8 caracteres) e aderir a esta empresa.", + "settings.inviteDescription": "Receberão um link para definir uma palavra-passe (pelo menos 8 caracteres) e aderir a esta empresa.", "settings.inviteEmail": "E-mail", "settings.inviteEmailPlaceholder": "colega@exemplo.com", "settings.inviteRole": "Papel", - "settings.inviteRoleHint": "Os membros gerem produtos e feeds. Os administradores também podem convidar colegas e alterar as definições da empresa.", + "settings.inviteRoleHint": "Os membros gerem produtos e feeds. Os administradores também podem convidar colegas e alterar as definições da empresa.", "settings.sendInvite": "Enviar convite", - "settings.companyHeading": "Definições da empresa", + "settings.companyHeading": "Definições da empresa", "settings.activeCompany": "Empresa ativa", - "settings.creditsOverview": "Resumo de créditos", + "settings.creditsOverview": "Resumo de créditos", "settings.plan": "Plano", "settings.used": "Usado", - "settings.companyInfo": "Informação da empresa", + "settings.companyInfo": "Informação da empresa", "settings.companyInfoHelp": "Atualize os detalhes da empresa", "settings.companyName": "Nome da empresa", "settings.companyNamePlaceholder": "O nome da sua empresa", - "settings.contentSettings": "Definições de conteúdo", + "settings.contentSettings": "Definições de conteúdo", "settings.mergeProducts": "Unir produtos com o mesmo GTIN", - "settings.emailIntegration": "Integração de e-mail", - "settings.aiIntegrations": "Integrações de IA", + "settings.emailIntegration": "Integração de e-mail", + "settings.aiIntegrations": "Integrações de IA", "settings.alertsHeading": "Alertas do operador", - "settings.inAppToasts": "Toasts na aplicação", + "settings.inAppToasts": "Toasts na aplicação", "settings.emailAlerts": "Alertas por e-mail", "settings.apiKeysHeading": "Chaves API", "settings.createApiKey": "Criar chave API", @@ -259,169 +259,169 @@ export const pt: MessageDict = { "settings.createApiKeyTitle": "Criar chave API", "settings.apiKeyLabel": "Chave API", "settings.keyName": "Nome da chave", - "settings.storeKeySafe": "Guarde-a num local seguro — não poderá ver o segredo completo de novo.", - "settings.apiKeysIntro": "Crie uma chave API da empresa para chamar os endpoints públicos /api/v1. O segredo completo é mostrado apenas uma vez ao criar — copie-o de imediato.", + "settings.storeKeySafe": "Guarde-a num local seguro — não poderá ver o segredo completo de novo.", + "settings.apiKeysIntro": "Crie uma chave API da empresa para chamar os endpoints públicos /api/v1. O segredo completo é mostrado apenas uma vez ao criar — copie-o de imediato.", "settings.apiKeysUseWhere": "Envie-a como Authorization: Bearer (preferido) ou X-API-Key.", - "settings.apiKeysDocsLink": "Documentação de autenticação da API", - "settings.apiKeyOnceWarning": "Esta é a única vez que o segredo completo é mostrado. Copie-o agora antes de fechar este diálogo.", + "settings.apiKeysDocsLink": "Documentação de autenticação da API", + "settings.apiKeyOnceWarning": "Esta é a única vez que o segredo completo é mostrado. Copie-o agora antes de fechar este diálogo.", "settings.table.name": "Nome", "settings.table.key": "Chave", - "settings.table.lastUsed": "Última utilização", - "dashboard.demoSandbox": "Sandbox de demonstração", - "dashboard.demoEmptyTitle": "A sandbox de demonstração está vazia", - "dashboard.demoEmptyHint": "A sandbox de demonstração está vazia — mude para A1 ou ligue um feed para ver estatísticas reais do catálogo.", - "dashboard.overviewTitle": "Visão geral", - "dashboard.quickLinks": "Ligações rápidas", + "settings.table.lastUsed": "Última utilização", + "dashboard.demoSandbox": "Sandbox de demonstração", + "dashboard.demoEmptyTitle": "A sandbox de demonstração está vazia", + "dashboard.demoEmptyHint": "A sandbox de demonstração está vazia — mude para A1 ou ligue um feed para ver estatísticas reais do catálogo.", + "dashboard.overviewTitle": "Visão geral", + "dashboard.quickLinks": "Ligações rápidas", "dashboard.whatsNew": "Novidades", "dashboard.startTutorial": "Iniciar tutorial", "dashboard.resumeTutorial": "Retomar tutorial", "dashboard.restartTutorial": "Reiniciar tutorial", - "dashboard.tourTopics": "Tópicos do tour", - "dashboard.browseTutorialSections": "Explorar secções do tutorial", + "dashboard.tourTopics": "Tópicos do tour", + "dashboard.browseTutorialSections": "Explorar secções do tutorial", "dashboard.connectFeed": "Ligar um feed", "dashboard.processProducts": "Processar produtos", "dashboard.openProducts": "Abrir produtos", "dashboard.welcomeTo": "Bem-vindo a {name}", "dashboard.trialBadge": "Teste", - "dashboard.actions": "Ações do painel", - "dashboard.emptyPaygHint": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as lojas. Use Primeiros passos abaixo.", - "dashboard.emptyCreditsHint": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as lojas. Tem {credits} — comece com Primeiros passos abaixo.", - "dashboard.workflowTitle": "Fluxo do catálogo", + "dashboard.actions": "Ações do painel", + "dashboard.emptyPaygHint": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as lojas. Use Primeiros passos abaixo.", + "dashboard.emptyCreditsHint": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as lojas. Tem {credits} — comece com Primeiros passos abaixo.", + "dashboard.workflowTitle": "Fluxo do catálogo", "dashboard.recentActivity": "Atividade recente", "dashboard.loadFailed": "Falha ao carregar o painel", - "dashboard.workspaceFallback": "Este espaço de trabalho", + "dashboard.workspaceFallback": "Este espaço de trabalho", "dashboard.jobFallback": "Trabalho {id}", "dashboard.workflow.feeds.connect": "Ligar uma origem", "dashboard.workflow.feeds.sources": "{count} origem", "dashboard.workflow.feeds.sourcesPlural": "{count} origens", - "dashboard.workflow.products.build": "Criar catálogo", - "dashboard.workflow.products.count": "{count} no catálogo", + "dashboard.workflow.products.build": "Criar catálogo", + "dashboard.workflow.products.count": "{count} no catálogo", "dashboard.workflow.map": "Map", "dashboard.workflow.map.detail": "Associe colunas depois de adicionar um feed", "dashboard.workflow.map.ready": "Abrir Map num feed", "dashboard.workflow.sync": "Sync", - "dashboard.workflow.sync.detail": "Obtenha uma amostra após o mapeamento", + "dashboard.workflow.sync.detail": "Obtenha uma amostra após o mapeamento", "dashboard.workflow.sync.ready": "Sincronizar uma amostra nos produtos", "dashboard.workflow.process": "Processar", "dashboard.workflow.processActive": "{count} ativos", "dashboard.workflow.processWaiting": "{count} em espera", - "dashboard.workflow.processDone": "{count} concluídos", + "dashboard.workflow.processDone": "{count} concluídos", "dashboard.workflow.processRun": "Executar tarefas de IA", "dashboard.workflow.export": "Exportar", - "dashboard.workflow.exportReady": "Modelos e transferência", + "dashboard.workflow.exportReady": "Modelos e transferência", "dashboard.workflow.exportMap": "Mapear e exportar", - "dashboard.workflowHint": "Catálogo a entrar → enriquecer / processar → exportar ou enviar para lojas. Salte para o passo seguinte para {name}.", + "dashboard.workflowHint": "Catálogo a entrar → enriquecer / processar → exportar ou enviar para lojas. Salte para o passo seguinte para {name}.", "dashboard.overviewHint": "Totais em direto para {name}", - "dashboard.demoEmptyMessage": "Mude para A1 (ou outra empresa com dados) no cabeçalho, ou ligue um feed aqui para preencher esta sandbox.", - "dashboard.emptyTitle": "Importe um catálogo", - "dashboard.emptyMessage": "Catálogo a entrar → enriquecer / processar → exportar ou enviar para lojas. Comece com Primeiros passos abaixo (ou ligue um feed / carregue um CSV).", + "dashboard.demoEmptyMessage": "Mude para A1 (ou outra empresa com dados) no cabeçalho, ou ligue um feed aqui para preencher esta sandbox.", + "dashboard.emptyTitle": "Importe um catálogo", + "dashboard.emptyMessage": "Catálogo a entrar → enriquecer / processar → exportar ou enviar para lojas. Comece com Primeiros passos abaixo (ou ligue um feed / carregue um CSV).", "dashboard.connectFeedAnyway": "Ligar feed mesmo assim", "dashboard.connectFeedShort": "Ligar feed", "dashboard.uploadCsv": "Carregar CSV", - "dashboard.goToBilling": "Ir para Faturação", - "dashboard.freePlanTitle": "Está no plano Free", - "dashboard.freePlanMessageWithLimit": "{used} de {max} produtos usados. O mapeamento de feeds, a limpeza básica e as etiquetas energéticas da UE (EPREL) estão incluídos; atualize para títulos e descrições com IA e mais capacidade.", - "dashboard.freePlanMessage": "O mapeamento de feeds, a limpeza básica e as etiquetas energéticas da UE (EPREL) estão incluídos; atualize para títulos e descrições com IA e mais capacidade.", - "dashboard.outOfCreditsTitle": "Ficou sem créditos de IA", - "dashboard.outOfCreditsMessage": "Compre mais créditos ou atualize o plano para continuar a processar.", + "dashboard.goToBilling": "Ir para Faturação", + "dashboard.freePlanTitle": "Está no plano Free", + "dashboard.freePlanMessageWithLimit": "{used} de {max} produtos usados. O mapeamento de feeds, a limpeza básica e as etiquetas energéticas da UE (EPREL) estão incluídos; atualize para títulos e descrições com IA e mais capacidade.", + "dashboard.freePlanMessage": "O mapeamento de feeds, a limpeza básica e as etiquetas energéticas da UE (EPREL) estão incluídos; atualize para títulos e descrições com IA e mais capacidade.", + "dashboard.outOfCreditsTitle": "Ficou sem créditos de IA", + "dashboard.outOfCreditsMessage": "Compre mais créditos ou atualize o plano para continuar a processar.", "dashboard.productLimitTitle": "Limite de produtos atingido", - "dashboard.productLimitMessage": "O seu plano {plan} permite {max} produtos ({count} no catálogo). Atualize para processar mais.", + "dashboard.productLimitMessage": "O seu plano {plan} permite {max} produtos ({count} no catálogo). Atualize para processar mais.", "dashboard.productLimitMessageFull": "O limite de produtos do plano {plan} foi atingido. Atualize para processar mais.", "dashboard.comparePlans": "Comparar planos", "dashboard.viewPlans": "Ver planos", - "dashboard.trialTitle": "Teste · {plan}", - "dashboard.trialMessageDated": "O teste termina a {date}. {credits} créditos restantes.", - "dashboard.trialMessage": "{credits} créditos restantes no seu teste.", - "dashboard.lowCreditsTitle": "Créditos a esgotar-se", - "dashboard.lowCreditsMessage": "Restam {remaining} de {total} créditos. Recarregue ou atualize antes de as tarefas pararem.", - "dashboard.latestJobs": "Últimas tarefas de processamento", - "dashboard.noJobsEmpty": "Ainda sem tarefas — importe produtos primeiro.", + "dashboard.trialTitle": "Teste · {plan}", + "dashboard.trialMessageDated": "O teste termina a {date}. {credits} créditos restantes.", + "dashboard.trialMessage": "{credits} créditos restantes no seu teste.", + "dashboard.lowCreditsTitle": "Créditos a esgotar-se", + "dashboard.lowCreditsMessage": "Restam {remaining} de {total} créditos. Recarregue ou atualize antes de as tarefas pararem.", + "dashboard.latestJobs": "Últimas tarefas de processamento", + "dashboard.noJobsEmpty": "Ainda sem tarefas — importe produtos primeiro.", "dashboard.noJobsReady": "Sem tarefas recentes. Inicie uma em Produtos quando estiver pronto.", "dashboard.startJob": "Iniciar um trabalho a partir de Produtos", - "dashboard.quickLinksHint": "Feeds, produtos, tarefas e exportação.", + "dashboard.quickLinksHint": "Feeds, produtos, tarefas e exportação.", "dashboard.feedsImportMap": "Importar e mapear", "dashboard.productsBrowse": "Explorar e processar", "dashboard.jobsMonitor": "Monitorizar tarefas", - "dashboard.exportsTemplates": "Modelos e transferência", + "dashboard.exportsTemplates": "Modelos e transferência", "activation.title": "Primeiros passos", - "activation.description": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as lojas. Conclua o passo atual e continue — o tour demo explica os ecrãs sem alterar o progresso da lista.", - "activation.descriptionShort": "Comece pelo passo destacado abaixo — uma ação de cada vez. Ligar a loja é opcional.", + "activation.description": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as lojas. Conclua o passo atual e continue — o tour demo explica os ecrãs sem alterar o progresso da lista.", + "activation.descriptionShort": "Comece pelo passo destacado abaixo — uma ação de cada vez. Ligar a loja é opcional.", "activation.nextCta": "Fazer este passo", - "activation.valueProp": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as suas lojas.", - "activation.alreadyDone": "Já feito", + "activation.valueProp": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as suas lojas.", + "activation.alreadyDone": "Já feito", "activation.skipForNow": "Ignorar por agora", "activation.showAllSteps": "Mostrar os {total} passos", "activation.showFewerSteps": "Mostrar menos passos", "activation.corePathLabel": "Em resumo", - "activation.corePath": "Catálogo a entrar → Enriquecer / processar → Exportar ou enviar para lojas", - "activation.storeWizardHint": "Não é necessário para feeds ou exportações — ignore a menos que queira enviar produtos para uma loja ativa.", - "activation.storeWizardCta": "Iniciar configuração guiada", + "activation.corePath": "Catálogo a entrar → Enriquecer / processar → Exportar ou enviar para lojas", + "activation.storeWizardHint": "Não é necessário para feeds ou exportações — ignore a menos que queira enviar produtos para uma loja ativa.", + "activation.storeWizardCta": "Iniciar configuração guiada", "activation.focus.map": "Seguinte: abra Map num feed, associe colunas e guarde. Adicione primeiro um feed se a lista estiver vazia.", - "activation.focus.sync": "Seguinte: sincronize uma amostra depois de guardar o mapeamento. Use Sync num feed mapeado — evite origens sem mapa.", + "activation.focus.sync": "Seguinte: sincronize uma amostra depois de guardar o mapeamento. Use Sync num feed mapeado — evite origens sem mapa.", "activation.focus.dismiss": "Fechar dica", "activation.dismiss": "Dispensar lista", "hypercare.report.title": "Hypercare de cutover", - "hypercare.report.message": "Dados em falta ou incorretos após a migração? Reporte para podermos corrigir o seu espaço de trabalho.", + "hypercare.report.message": "Dados em falta ou incorretos após a migração? Reporte para podermos corrigir o seu espaço de trabalho.", "hypercare.report.cta": "Reportar dados em falta ou incorretos", "hypercare.report.dismiss": "Dispensar", "hypercare.report.adminTriage": "Abrir fila de hypercare", "etl.gaps.title": "What did not migrate", - "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", + "etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.", "etl.gaps.dismiss": "Dismiss", "etl.gaps.apiKeys.title": "API keys", - "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", + "etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.", "etl.gaps.apiKeys.cta": "Open API keys", "etl.gaps.blobs.title": "File contents (blobs)", - "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", + "etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.", "etl.gaps.blobs.countHint": "{count} file records are metadata-only (bytes were not migrated).", "etl.gaps.blobs.cta": "Open Files", "etl.gaps.jobs.title": "Processing history", "etl.gaps.jobs.body": "Legacy job and task history was not backfilled for cutover. New jobs you start here will appear normally.", - "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", + "etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.", "etl.gaps.jobs.migratedHint": "{count} jobs were tagged migrated from an optional backfill.", "etl.gaps.jobs.cta": "Open Processing", "etl.gaps.woo.title": "Store credentials", - "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", + "etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.", "etl.gaps.woo.cta": "Open Stores", "etl.gaps.settings.title": "Company settings", "etl.gaps.settings.body": "Only language and merge-products settings were imported. Re-check other company preferences in Settings.", "etl.gaps.settings.cta": "Open company settings", - "activation.progress": "{done} de {total} concluídos", - "activation.stepsLabel": "Passos de ativação", - "activation.pausedTitle": "Começar em pausa", - "activation.pausedBody": "Retome quando quiser — dos campos de produto até à exportação. Ligar a loja continua opcional.", + "activation.progress": "{done} de {total} concluídos", + "activation.stepsLabel": "Passos de ativação", + "activation.pausedTitle": "Começar em pausa", + "activation.pausedBody": "Retome quando quiser — dos campos de produto até à exportação. Ligar a loja continua opcional.", "activation.resume": "Retomar lista", "activation.step.enable-fields.title": "Ativar campos de produto", - "activation.step.enable-fields.body": "Escolha quais colunas de produto padrão o Descrybe deve mapear e limpar.", + "activation.step.enable-fields.body": "Escolha quais colunas de produto padrão o Descrybe deve mapear e limpar.", "activation.step.connect-source.title": "Adicionar um feed de produtos", - "activation.step.connect-source.body": "Adicione um feed de catálogo CSV ou XML para os produtos entrarem no Descrybe. Ligar uma loja ativa é um passo opcional posterior.", + "activation.step.connect-source.body": "Adicione um feed de catálogo CSV ou XML para os produtos entrarem no Descrybe. Ligar uma loja ativa é um passo opcional posterior.", "activation.step.map.title": "Mapear colunas do feed", - "activation.step.map.body": "Em Feeds, abra Map no seu feed, faça corresponder as colunas do fornecedor e guarde.", + "activation.step.map.body": "Em Feeds, abra Map no seu feed, faça corresponder as colunas do fornecedor e guarde.", "activation.step.sync-sample.title": "Sincronizar uma amostra", - "activation.step.sync-sample.body": "Em Feeds, sincronize uma pequena amostra de um feed mapeado para verificar o mapeamento antes da execução completa.", + "activation.step.sync-sample.body": "Em Feeds, sincronize uma pequena amostra de um feed mapeado para verificar o mapeamento antes da execução completa.", "activation.step.process.title": "Processar produtos", - "activation.step.process.body": "Abra produtos não processados e execute o processamento para gerar conteúdo de catálogo limpo.", + "activation.step.process.body": "Abra produtos não processados e execute o processamento para gerar conteúdo de catálogo limpo.", "activation.step.store-connect.title": "Ligar uma loja", - "activation.step.store-connect.body": "Opcional. Ligue WooCommerce ou Shopify para enviar produtos para a sua loja. Ignore se usar apenas feeds e exportações.", - "activation.step.export.title": "Criar uma exportação", - "activation.step.export.body": "Crie um feed de exportação para descarregar ou publicar produtos limpos como XML ou CSV.", + "activation.step.store-connect.body": "Opcional. Ligue WooCommerce ou Shopify para enviar produtos para a sua loja. Ignore se usar apenas feeds e exportações.", + "activation.step.export.title": "Criar uma exportação", + "activation.step.export.body": "Crie um feed de exportação para descarregar ou publicar produtos limpos como XML ou CSV.", "stats.products": "Produtos importados", "stats.categories": "Categorias", "stats.attributes": "Atributos", "stats.feeds": "Feeds", - "stats.credits": "Créditos", - "stats.openCatalog": "Abrir catálogo", - "stats.productsHint": "Catálogo {processed} · fila {unprocessed} (contagens separadas)", - "stats.catalogTree": "Árvore do catálogo", + "stats.credits": "Créditos", + "stats.openCatalog": "Abrir catálogo", + "stats.productsHint": "Catálogo {processed} · fila {unprocessed} (contagens separadas)", + "stats.catalogTree": "Árvore do catálogo", "stats.attributeLibrary": "Biblioteca de atributos", - "stats.importSources": "Origens de importação", + "stats.importSources": "Origens de importação", "stats.payAsYouGo": "Pagamento conforme o uso", - "stats.walletBilling": "Carteira · Faturação", - "stats.enterpriseBilling": "Empresarial · Faturação", - "stats.usedBilling": "{used} usados · Faturação", + "stats.walletBilling": "Carteira · Faturação", + "stats.enterpriseBilling": "Empresarial · Faturação", + "stats.usedBilling": "{used} usados · Faturação", "processing.jobStatus.processing": "A processar", - "processing.jobStatus.completed": "Concluído", + "processing.jobStatus.completed": "Concluído", "processing.jobStatus.failed": "Falhou", "processing.jobStatus.cancelled": "Cancelado", "processing.jobStatus.pending": "Pendente", @@ -436,51 +436,51 @@ export const pt: MessageDict = { "processing.step.eprel": "EPREL", "processing.step.ai_enhance": "Melhoria com IA", "processing.type.full": "Processamento completo", - "processing.type.enhance_only": "Só melhorar", - "processing.type.title": "Só título", - "processing.type.description": "Só descrição", + "processing.type.enhance_only": "Só melhorar", + "processing.type.title": "Só título", + "processing.type.description": "Só descrição", "processing.type.attributes": "Atributos", "processing.type.category": "Categoria", "processing.type.eprel": "EPREL", "processing.type.seo": "SEO", "processing.type.normalize": "Normalizar", "errors.requestFailed": "Pedido falhou", - "errors.maintenance": "O sistema está em manutenção. Tente novamente mais tarde.", - "errors.readOnly": "O sistema está em modo só de leitura. As alterações estão temporariamente desativadas.", - "errors.companyAdminDenied": "Apenas administradores da empresa podem {action}. Peça ajuda a um administrador.", + "errors.maintenance": "O sistema está em manutenção. Tente novamente mais tarde.", + "errors.readOnly": "O sistema está em modo só de leitura. As alterações estão temporariamente desativadas.", + "errors.companyAdminDenied": "Apenas administradores da empresa podem {action}. Peça ajuda a um administrador.", "errors.companyAdminDenied.actionDefault": "fazer isto", - "docs.tryIt.memberCannotCreate": "Só os admins da empresa podem criar chaves API. As legado não foram migradas — cole uma chave abaixo ou peça a um admin para criar uma nova.", - "docs.tryIt.noKeysLegacyAdmin": "As chaves API legado não foram migradas. Crie uma nova via Use my API key ou Definições → Chaves API — o segredo só é mostrado uma vez.", - "docs.tryIt.noKeysLegacyMember": "Sem chaves API listadas. As legado não foram migradas — peça a um admin para criar uma, ou cole uma chave dk_.", - "errors.couldNotUpdateLanguage": "Não foi possível atualizar o idioma", + "docs.tryIt.memberCannotCreate": "Só os admins da empresa podem criar chaves API. As legado não foram migradas — cole uma chave abaixo ou peça a um admin para criar uma nova.", + "docs.tryIt.noKeysLegacyAdmin": "As chaves API legado não foram migradas. Crie uma nova via Use my API key ou Definições → Chaves API — o segredo só é mostrado uma vez.", + "docs.tryIt.noKeysLegacyMember": "Sem chaves API listadas. As legado não foram migradas — peça a um admin para criar uma, ou cole uma chave dk_.", + "errors.couldNotUpdateLanguage": "Não foi possível atualizar o idioma", "toast.support.replyTitle": "Resposta de suporte", "toast.support.replyBody": "A equipa respondeu ao seu ticket de suporte.", "toast.support.replyRe": "Re: {subject}", "toast.support.statusTitle": "Estado do ticket atualizado", "toast.support.statusBody": "O estado do seu ticket de suporte alterou-se.", - "toast.support.updateTitle": "Atualização de suporte", + "toast.support.updateTitle": "Atualização de suporte", "assistant.label": "Assistente", "assistant.open": "Abrir o assistente do sistema", "assistant.close": "Fechar o assistente do sistema", "tutorial.demoTour": "Tour demo", - "tutorial.jumpToTopic": "Ir para um tópico", + "tutorial.jumpToTopic": "Ir para um tópico", "tutorial.whereNeedHelp": "Em que precisa de ajuda?", "tutorial.skipTour": "Saltar tour", "tutorial.skipAria": "Saltar tutorial", - "tutorial.pickerBody": "Escolha uma secção para reabrir essa parte da demo. Explorar o tour não altera os dados da sua conta.", - "tutorial.sectionsAria": "Secções do tutorial", + "tutorial.pickerBody": "Escolha uma secção para reabrir essa parte da demo. Explorar o tour não altera os dados da sua conta.", + "tutorial.sectionsAria": "Secções do tutorial", "tutorial.open": "Abrir", "tutorial.close": "Fechar", - "tutorial.resumeLastStep": "Retomar último passo", - "tutorial.startFromBeginning": "Começar do início", + "tutorial.resumeLastStep": "Retomar último passo", + "tutorial.startFromBeginning": "Começar do início", "tutorial.stepOf": "Passo {current} de {total}", - "tutorial.jumpTo": "Ir para…", - "tutorial.jumpToSectionAria": "Ir para a secção", + "tutorial.jumpTo": "Ir para…", + "tutorial.jumpToSectionAria": "Ir para a secção", "tutorial.back": "Voltar", "tutorial.pause": "Pausar", "tutorial.continue": "Continuar", "tutorial.finishTour": "Concluir tour", - "tutorial.missingTargetHint": "Esse controlo ainda não está neste ecrã. Pode Continuar na mesma — o tour nunca exige guardar ou sincronizar.", + "tutorial.missingTargetHint": "Esse controlo ainda não está neste ecrã. Pode Continuar na mesma — o tour nunca exige guardar ou sincronizar.", "tutorial.section.welcome": "Welcome", "tutorial.section.catalog": "Catalog setup", "tutorial.section.sources": "Feeds", @@ -490,112 +490,112 @@ export const pt: MessageDict = { "tutorial.section.grow": "Grow", "tutorial.section.done": "Done", "tutorial.step.welcome.title": "Bem-vindo ao Descrybe", - "tutorial.step.welcome.body": "O ciclo principal do Descrybe é Feeds → Process → Export / Stores. Esta demo guiada destaca esses ecrãs no seu dashboard real — sem exigir guardar, sincronizar, ativar campos ou criar feeds. Pause quando quiser; retome no cabeçalho. Salte para uma secção se só precisar de ajuda num tópico.", - "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", + "tutorial.step.welcome.body": "O ciclo principal do Descrybe é Feeds → Process → Export / Stores. Esta demo guiada destaca esses ecrãs no seu dashboard real — sem exigir guardar, sincronizar, ativar campos ou criar feeds. Pause quando quiser; retome no cabeçalho. Salte para uma secção se só precisar de ajuda num tópico.", + "tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.", "tutorial.step.welcome.nextLabel": "Start tour", - "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", + "tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.", "tutorial.step.dashboard-overview.title": "O seu centro de comando", - "tutorial.step.dashboard-overview.body": "A faixa de workflow do catálogo mostra o caminho diário: Feeds → Map → Sync → Process. Getting started acompanha o progresso real do workspace (à parte desta demo). Quando estiver pronto, use Manage feeds ou Start processing — depois exporte ou ligue uma loja.", - "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", + "tutorial.step.dashboard-overview.body": "A faixa de workflow do catálogo mostra o caminho diário: Feeds → Map → Sync → Process. Getting started acompanha o progresso real do workspace (à parte desta demo). Quando estiver pronto, use Manage feeds ou Start processing — depois exporte ou ligue uma loja.", + "tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.", "tutorial.step.dashboard-overview.missingHint": "The workflow strip and checklist appear after the dashboard loads.", "tutorial.step.enable-fields.title": "Campos standard", - "tutorial.step.enable-fields.body": "Standard Fields são as colunas de produto que o Descrybe mapeia, processa e exporta — título, descrição, GTIN, imagens e mais. Enable recommended ativa um conjunto predefinido sensato para a maioria dos catálogos. Pode afinar a lista depois sem partir mapeamentos existentes.", - "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", + "tutorial.step.enable-fields.body": "Standard Fields são as colunas de produto que o Descrybe mapeia, processa e exporta — título, descrição, GTIN, imagens e mais. Enable recommended ativa um conjunto predefinido sensato para a maioria dos catálogos. Pode afinar a lista depois sem partir mapeamentos existentes.", + "tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.", "tutorial.step.enable-fields.warning": "Enabling or disabling fields affects mapping and processing for this company. Prefer Enable recommended once, then tweak carefully.", "tutorial.step.enable-fields.missingHint": "Wait for the Fields page to load, or open Fields from the Catalog section in the sidebar.", "tutorial.step.catalog-depth.title": "Categorias e atributos", - "tutorial.step.catalog-depth.body": "Na secção Catalog da barra lateral também encontra Categories e Attributes. Categories organizam o catálogo; os atributos alimentam filtros e descrições estruturadas. Não precisa de os configurar para terminar este tour.", - "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", + "tutorial.step.catalog-depth.body": "Na secção Catalog da barra lateral também encontra Categories e Attributes. Categories organizam o catálogo; os atributos alimentam filtros e descrições estruturadas. Não precisa de os configurar para terminar este tour.", + "tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.", "tutorial.step.catalog-depth.missingHint": "Expand Catalog in the sidebar to open Categories or Attributes after the tour.", "tutorial.step.connect-source.title": "Adicionar uma origem de produtos", - "tutorial.step.connect-source.body": "Os feeds são como os catálogos de fornecedores entram no Descrybe — ficheiros CSV, XML ou URL. Add Feed cria uma nova origem; cada linha mostra o estado (pronto para mapear, mapeado, ativo). Map abre o ecrã de correspondência de campos desse feed.", - "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", + "tutorial.step.connect-source.body": "Os feeds são como os catálogos de fornecedores entram no Descrybe — ficheiros CSV, XML ou URL. Add Feed cria uma nova origem; cada linha mostra o estado (pronto para mapear, mapeado, ativo). Map abre o ecrã de correspondência de campos desse feed.", + "tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.", "tutorial.step.connect-source.warning": "Avoid deleting live feeds unless you intend to remove that source and its sync history.", - "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", + "tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.", "tutorial.step.map.title": "Mapear campos de origem", - "tutorial.step.map.body": "No ecrã Map de um feed associa colunas do fornecedor aos standard fields do Descrybe. Auto-map sugere correspondências pelos nomes das colunas; confirme as aproximadas e corrija o resto. Save Mappings guarda o mapa para que sync e processamento saibam ler cada linha.", - "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", - "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", + "tutorial.step.map.body": "No ecrã Map de um feed associa colunas do fornecedor aos standard fields do Descrybe. Auto-map sugere correspondências pelos nomes das colunas; confirme as aproximadas e corrija o resto. Save Mappings guarda o mapa para que sync e processamento saibam ler cada linha.", + "tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.", + "tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.", "tutorial.step.map.missingHint": "Add a feed and click Map to see the mapping UI; or Continue to keep learning.", "tutorial.step.sync-sample.title": "Sincronizar uma amostra (quando estiver pronto)", - "tutorial.step.sync-sample.body": "Depois de guardar os mapeamentos, Sync + Process sample obtém um lote pequeno e corre o processamento para verificar títulos, imagens e atributos antes de uma execução completa. Full Sync now na lista de feeds serve para importações maiores quando a amostra estiver boa.", - "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", + "tutorial.step.sync-sample.body": "Depois de guardar os mapeamentos, Sync + Process sample obtém um lote pequeno e corre o processamento para verificar títulos, imagens e atributos antes de uma execução completa. Full Sync now na lista de feeds serve para importações maiores quando a amostra estiver boa.", + "tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.", "tutorial.step.sync-sample.warning": "Syncing writes products into this company. Prefer a sample first; avoid Sync now on unmapped feeds.", "tutorial.step.sync-sample.missingHint": "Sync controls appear on feed rows and on the mapping screen footer.", "tutorial.step.process.title": "Rever produtos", - "tutorial.step.process.body": "Products lista itens sincronizados e processados. Filtre por estado, abra uma linha para detalhes e use badges EPREL quando existirem dados de etiqueta energética. É aqui que deteta erros de mapeamento antes da exportação ou sync de loja.", - "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", + "tutorial.step.process.body": "Products lista itens sincronizados e processados. Filtre por estado, abra uma linha para detalhes e use badges EPREL quando existirem dados de etiqueta energética. É aqui que deteta erros de mapeamento antes da exportação ou sync de loja.", + "tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.", "tutorial.step.process.missingHint": "Wait for the products table, or Continue if the catalog is still empty.", "tutorial.step.processing-hub.title": "Processamento em segundo plano", - "tutorial.step.processing-hub.body": "Os jobs em Processing mostram progresso de AI e pipeline: execuções concluídas e falhas. Inicie jobs a partir do dashboard ou produtos quando quiser gastar créditos num lote de propósito.", - "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", + "tutorial.step.processing-hub.body": "Os jobs em Processing mostram progresso de AI e pipeline: execuções concluídas e falhas. Inicie jobs a partir do dashboard ou produtos quando quiser gastar créditos num lote de propósito.", + "tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.", "tutorial.step.processing-hub.missingHint": "Open Jobs from the Processing section in the sidebar if the page is empty.", "tutorial.step.stores-hub.title": "Lojas e plataformas", - "tutorial.step.stores-hub.body": "Depois de processar, Stores liga WooCommerce ou Shopify para enviar o catálogo limpo para a loja. Use isto quando um marketplace ou CMS for o destino — ou salte para Export feeds se os parceiros só precisarem de ficheiro/URL.", - "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", + "tutorial.step.stores-hub.body": "Depois de processar, Stores liga WooCommerce ou Shopify para enviar o catálogo limpo para a loja. Use isto quando um marketplace ou CMS for o destino — ou salte para Export feeds se os parceiros só precisarem de ficheiro/URL.", + "tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.", "tutorial.step.stores-hub.missingHint": "Open Stores from the sidebar to see connection cards.", "tutorial.step.export.title": "Exportar produtos limpos", - "tutorial.step.export.body": "Os export feeds publicam produtos limpos como XML ou CSV para canais, parceiros ou a sua loja. Crie uma exportação, escolha formato e filtros, depois partilhe o URL do feed ou descarregue. As exportações leem dados de catálogo processados — mapeie e processe primeiro para melhores resultados.", - "tutorial.step.export.tip": "You don’t need to create an export during the demo.", - "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", + "tutorial.step.export.body": "Os export feeds publicam produtos limpos como XML ou CSV para canais, parceiros ou a sua loja. Crie uma exportação, escolha formato e filtros, depois partilhe o URL do feed ou descarregue. As exportações leem dados de catálogo processados — mapeie e processe primeiro para melhores resultados.", + "tutorial.step.export.tip": "You don’t need to create an export during the demo.", + "tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.", "tutorial.step.export.missingHint": "Wait for Export feeds to load, or open Exports from the Feeds section in the sidebar.", - "tutorial.step.billing-hub.title": "Créditos e faturação", - "tutorial.step.billing-hub.body": "Billing mostra o seu plano, carteira e créditos restantes. O processamento e algumas funcionalidades de AI usam este saldo. Vigie o uso antes de grandes execuções de catálogo.", - "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", + "tutorial.step.billing-hub.title": "Créditos e faturação", + "tutorial.step.billing-hub.body": "Billing mostra o seu plano, carteira e créditos restantes. O processamento e algumas funcionalidades de AI usam este saldo. Vigie o uso antes de grandes execuções de catálogo.", + "tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.", "tutorial.step.billing-hub.missingHint": "Open Billing from the Account section in the sidebar.", "tutorial.step.grow-hub.title": "Campanhas, SEO e reviews", - "tutorial.step.grow-hub.body": "Em Marketing: Campaigns gera conteúdo, Content calendar planeia publicações, SEO verifica listagens e Reviews liga-se ao WooCommerce. Assentam num catálogo bem mapeado — termine Feeds → Process → Export / Stores antes de depender deles.", - "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", + "tutorial.step.grow-hub.body": "Em Marketing: Campaigns gera conteúdo, Content calendar planeia publicações, SEO verifica listagens e Reviews liga-se ao WooCommerce. Assentam num catálogo bem mapeado — termine Feeds → Process → Export / Stores antes de depender deles.", + "tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.", "tutorial.step.grow-hub.missingHint": "Open Campaigns from Marketing in the sidebar, or Continue.", "tutorial.step.tour-done.title": "Pronto para explorar", - "tutorial.step.tour-done.body": "Esse é o mapa do produto: Feeds → Map → Sync → Process → Export / Stores. Use Getting started no dashboard para a configuração real. Retome ou reinicie este tour no cabeçalho a qualquer momento, ou Jump to… uma secção. Skip tour termina a demo sem alterar a checklist.", - "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", + "tutorial.step.tour-done.body": "Esse é o mapa do produto: Feeds → Map → Sync → Process → Export / Stores. Use Getting started no dashboard para a configuração real. Retome ou reinicie este tour no cabeçalho a qualquer momento, ou Jump to… uma secção. Skip tour termina a demo sem alterar a checklist.", + "tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.", "tutorial.step.tour-done.nextLabel": "Finish tour", "tutorial.step.tour-done.missingHint": "Return to the dashboard to finish.", - "news.uxImprovements.title": "Melhorias na experiência do utilizador", - "flash.contentLanguageUpdated": "Idioma do conteúdo atualizado.", + "news.uxImprovements.title": "Melhorias na experiência do utilizador", + "flash.contentLanguageUpdated": "Idioma do conteúdo atualizado.", "theme.darkMode": "Modo escuro", "theme.lightMode": "Modo claro", "forbidden.title.accessRestricted": "Acesso restrito", - "forbidden.title.permissionDenied": "Permissão negada", - "forbidden.message.support": "Esta área só está disponível para a equipa de suporte e administradores da plataforma.", - "forbidden.message.platform": "Esta área só está disponível para administradores da plataforma.", - "forbidden.message.company": "Não tem permissão para isto. Peça ajuda a um administrador da empresa.", + "forbidden.title.permissionDenied": "Permissão negada", + "forbidden.message.support": "Esta área só está disponível para a equipa de suporte e administradores da plataforma.", + "forbidden.message.platform": "Esta área só está disponível para administradores da plataforma.", + "forbidden.message.company": "Não tem permissão para isto. Peça ajuda a um administrador da empresa.", "forbidden.backToDashboard": "Voltar ao painel", "admin.chrome.platformOps": "Ops da plataforma", "admin.chrome.sidebar": "Barra lateral de ops da plataforma", "admin.chrome.nav": "Ops da plataforma", - "admin.chrome.mobileMenu": "Menu móvel de ops da plataforma", + "admin.chrome.mobileMenu": "Menu móvel de ops da plataforma", "admin.chrome.opsBadge": "Ops", - "admin.chrome.backToApp": "Voltar à app", + "admin.chrome.backToApp": "Voltar à app", "admin.chrome.uiLanguage": "Idioma da UI", - "admin.chrome.staff.supportDesk": "Secretária de suporte", + "admin.chrome.staff.supportDesk": "Secretária de suporte", "admin.chrome.staff.platformAdmin": "Admin da plataforma", "admin.chrome.staff.staff": "Equipa", "admin.chrome.staff.admin": "Admin", - "admin.nav.section.overview": "Visão geral", - "admin.nav.section.directory": "Diretório", + "admin.nav.section.overview": "Visão geral", + "admin.nav.section.directory": "Diretório", "admin.nav.section.support": "Suporte", - "admin.nav.section.ops": "Operações", - "admin.nav.section.commerce": "Comércio", + "admin.nav.section.ops": "Operações", + "admin.nav.section.commerce": "Comércio", "admin.nav.section.system": "Sistema", "admin.nav.commandCenter": "Centro de comando", - "admin.nav.analytics": "Análises", + "admin.nav.analytics": "Análises", "admin.nav.usersOrgs": "Utilizadores e orgs", "admin.nav.tickets": "Tickets", "admin.nav.knowledge": "Conhecimento", - "admin.nav.diagnostics": "Diagnósticos", + "admin.nav.diagnostics": "Diagnósticos", "admin.nav.stuckProducts": "Produtos bloqueados", "admin.nav.orphanProcessed": "Orphan processed", - "admin.nav.billing": "Faturação", + "admin.nav.billing": "Faturação", "admin.nav.sales": "Sales", - "admin.nav.translations": "Traduções", - "admin.nav.settings": "Definições", + "admin.nav.translations": "Traduções", + "admin.nav.settings": "Definições", "admin.sales.title": "Sales leads", "admin.sales.description": "Inbound Contact sales messages and custom payment quotes.", "admin.sales.listTitle": "Leads", "admin.sales.listDesc": "{total} matching leads", - "admin.sales.searchPlaceholder": "Search name, email, company…", + "admin.sales.searchPlaceholder": "Search name, email, company…", "admin.sales.statusAll": "All statuses", "admin.sales.status.new": "New", "admin.sales.status.contacted": "Contacted", @@ -643,7 +643,7 @@ export const pt: MessageDict = { "admin.sales.col.status": "Status", "admin.sales.col.created": "Created", "sales.contact.title": "Contact sales", - "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", + "sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.", "sales.contact.formTitle": "Send a message", "sales.contact.formLead": "Enterprise and custom deals are prepared by our team, then paid via Stripe Checkout.", "sales.contact.name": "Name", @@ -653,88 +653,88 @@ export const pt: MessageDict = { "sales.contact.estimatedSkus": "Estimated SKUs (optional)", "sales.contact.message": "How can we help?", "sales.contact.submit": "Send message", - "sales.contact.submitting": "Sending…", + "sales.contact.submitting": "Sending…", "sales.contact.error": "Could not send your message. Please try again.", - "sales.contact.toast.success": "Message sent — we will follow up soon.", - "sales.contact.thanksTitle": "Thanks — we got your message", + "sales.contact.toast.success": "Message sent — we will follow up soon.", + "sales.contact.thanksTitle": "Thanks — we got your message", "sales.contact.thanksBody": "A platform admin will review your request and can send a Checkout link for a custom plan.", "sales.contact.bookDemo": "Book a live demo", "sales.contact.orBookDemo": "Or book a Calendly demo", "sales.contact.backPricing": "Back to pricing", "admin.overview.eyebrow": "Centro de comando", - "admin.overview.title": "Visão geral da plataforma", - "admin.overview.description": "Pulso ao vivo da plataforma a partir do resumo de análises — salte para ops, insights e suporte.", + "admin.overview.title": "Visão geral da plataforma", + "admin.overview.description": "Pulso ao vivo da plataforma a partir do resumo de análises — salte para ops, insights e suporte.", "admin.overview.tokens": "Fichas", - "admin.overview.tokensHint": "De sempre · período", - "admin.overview.credits": "Créditos", + "admin.overview.tokensHint": "De sempre · período", + "admin.overview.credits": "Créditos", "admin.overview.creditsHint": "Em todas as empresas", "admin.overview.jobs": "Tarefas", - "admin.overview.jobsHint": "Instantâneo da fila", + "admin.overview.jobsHint": "Instantâneo da fila", "admin.overview.platform": "Plataforma", - "admin.overview.platformHint": "Inquilinos · volume", + "admin.overview.platformHint": "Inquilinos · volume", "admin.overview.signals": "Sinais recentes", "admin.overview.shortcuts": "Atalhos de ops", "admin.overview.providers": "Mix de fornecedores de IA", "admin.overview.internalAi": "IA interna", - "admin.overview.internalAiHint": "Definições da plataforma", + "admin.overview.internalAiHint": "Definições da plataforma", "admin.overview.popularKeys": "Chaves populares", "admin.overview.popularKeysHint": "Fornecedores populares do inquilino", "admin.overview.customUrl": "URL personalizado", "admin.overview.customUrlHint": "URL base personalizado do inquilino", - "admin.overview.linkBilling": "Faturação", - "admin.overview.linkSettings": "Definições", - "admin.overview.shortcut.diagnostics.title": "Diagnósticos", - "admin.overview.shortcut.diagnostics.desc": "Verificações de saúde, fila, falhas recentes", - "admin.overview.shortcut.analytics.title": "Análises", + "admin.overview.linkBilling": "Faturação", + "admin.overview.linkSettings": "Definições", + "admin.overview.shortcut.diagnostics.title": "Diagnósticos", + "admin.overview.shortcut.diagnostics.desc": "Verificações de saúde, fila, falhas recentes", + "admin.overview.shortcut.analytics.title": "Análises", "admin.overview.shortcut.analytics.desc": "Tokens, trabalhos, registos, fornecedores", "admin.overview.shortcut.knowledge.title": "Conhecimento", - "admin.overview.shortcut.knowledge.desc": "Artigos, modelos, resposta automática", + "admin.overview.shortcut.knowledge.desc": "Artigos, modelos, resposta automática", "admin.overview.shortcut.users.title": "Utilizadores e orgs", "admin.overview.shortcut.users.desc": "Contas, empresas, convites", "admin.overview.shortcut.stuck.title": "Produtos bloqueados", - "admin.overview.shortcut.stuck.desc": "Em execução há mais de 2 horas", + "admin.overview.shortcut.stuck.desc": "Em execução há mais de 2 horas", "admin.overview.signal.stuckTitle": "{count} trabalho bloqueado", "admin.overview.signal.stuckTitlePlural": "{count} trabalhos bloqueados", - "admin.overview.signal.stuckDetail": "Em execução há mais de 2 horas — reveja e reponha se necessário.", + "admin.overview.signal.stuckDetail": "Em execução há mais de 2 horas — reveja e reponha se necessário.", "admin.overview.signal.stuckCta": "Abrir trabalhos bloqueados", - "admin.overview.signal.failedTitle": "{count} falhados nos últimos {days} d", - "admin.overview.signal.failedDetail": "{completed} concluídos na mesma janela.", - "admin.overview.signal.failedDetailRate": "{rate}% taxa de falha · {completed} concluídos.", - "admin.overview.signal.failedCta": "Abrir diagnósticos", - "admin.overview.signal.runningTitle": "{count} trabalho em execução", - "admin.overview.signal.runningTitlePlural": "{count} trabalhos em execução", + "admin.overview.signal.failedTitle": "{count} falhados nos últimos {days} d", + "admin.overview.signal.failedDetail": "{completed} concluídos na mesma janela.", + "admin.overview.signal.failedDetailRate": "{rate}% taxa de falha · {completed} concluídos.", + "admin.overview.signal.failedCta": "Abrir diagnósticos", + "admin.overview.signal.runningTitle": "{count} trabalho em execução", + "admin.overview.signal.runningTitlePlural": "{count} trabalhos em execução", "admin.overview.signal.runningDetail": "Trabalhos de processamento ativos neste momento.", "admin.overview.signal.runningCta": "Ver fila", "admin.overview.signal.ticketsTitle": "{count} ticket de suporte aberto", "admin.overview.signal.ticketsTitlePlural": "{count} tickets de suporte abertos", - "admin.overview.signal.ticketsDetail": "Tickets abertos ou pendentes na secretária de suporte.", + "admin.overview.signal.ticketsDetail": "Tickets abertos ou pendentes na secretária de suporte.", "admin.overview.signal.ticketsCta": "Abrir suporte", "admin.overview.signal.clearTitle": "Sem sinais elevados", - "admin.overview.signal.clearDetail": "Sem trabalhos bloqueados, falhas do período ou tickets abertos no resumo ao vivo (últimos {days} d).", - "admin.overview.signal.clearCta": "Confirmar nos diagnósticos", - "admin.overview.badge.action": "Ação", + "admin.overview.signal.clearDetail": "Sem trabalhos bloqueados, falhas do período ou tickets abertos no resumo ao vivo (últimos {days} d).", + "admin.overview.signal.clearCta": "Confirmar nos diagnósticos", + "admin.overview.badge.action": "Ação", "admin.overview.badge.watch": "Monitorizar", "admin.overview.badge.live": "Ao vivo", "admin.overview.badge.clear": "Limpar", - "admin.overview.summaryLoadFailed": "Não foi possível carregar o resumo ao vivo. Os atalhos abaixo ainda funcionam.", - "admin.overview.keyMetrics": "Métricas principais", - "admin.overview.summaryWindow": "Últimos {days} d · endpoint de resumo", - "admin.overview.tokensPeriod": "{count} nos últimos {days} d", - "admin.overview.creditsFoot": "{remaining} restantes de {allocated} atribuídos", - "admin.overview.jobsFoot": "{failed} falhados · {running} a correr · {stuck} presos", - "admin.overview.platformFoot": "{users} utilizadores · {processed} processados · {feeds} feeds de entrada", - "admin.overview.fullDiagnostics": "Diagnósticos completos", - "admin.overview.also": "Também:", - "admin.overview.linkSupport": "Secretária de suporte", - "admin.overview.charts": "Gráficos", - "admin.overview.providerFoot": "{jobs} tarefas · {products} produtos", + "admin.overview.summaryLoadFailed": "Não foi possível carregar o resumo ao vivo. Os atalhos abaixo ainda funcionam.", + "admin.overview.keyMetrics": "Métricas principais", + "admin.overview.summaryWindow": "Últimos {days} d · endpoint de resumo", + "admin.overview.tokensPeriod": "{count} nos últimos {days} d", + "admin.overview.creditsFoot": "{remaining} restantes de {allocated} atribuídos", + "admin.overview.jobsFoot": "{failed} falhados · {running} a correr · {stuck} presos", + "admin.overview.platformFoot": "{users} utilizadores · {processed} processados · {feeds} feeds de entrada", + "admin.overview.fullDiagnostics": "Diagnósticos completos", + "admin.overview.also": "Também:", + "admin.overview.linkSupport": "Secretária de suporte", + "admin.overview.charts": "Gráficos", + "admin.overview.providerFoot": "{jobs} tarefas · {products} produtos", "admin.analytics.eyebrow": "Insights", - "admin.analytics.title": "Análises e relatórios", - "admin.analytics.description": "KPI e tendências ao vivo da plataforma a partir de tokens, trabalhos, registos, feeds, tickets e faturação.", - "admin.analytics.period": "Período", - "admin.analytics.refreshing": "A atualizar…", + "admin.analytics.title": "Análises e relatórios", + "admin.analytics.description": "KPI e tendências ao vivo da plataforma a partir de tokens, trabalhos, registos, feeds, tickets e faturação.", + "admin.analytics.period": "Período", + "admin.analytics.refreshing": "A atualizar…", "admin.analytics.llmTokens": "Tokens LLM", - "admin.analytics.credits": "Créditos", + "admin.analytics.credits": "Créditos", "admin.analytics.jobs": "Tarefas", "admin.analytics.volume": "Volume", "admin.analytics.failureRate": "Taxa de falha", @@ -742,9 +742,9 @@ export const pt: MessageDict = { "admin.analytics.apiKeys": "Chaves API", "admin.analytics.signups": "Registos", "admin.analytics.internalAi": "IA interna", - "admin.analytics.internalAiHint": "OpenAI da plataforma (definições admin)", + "admin.analytics.internalAiHint": "OpenAI da plataforma (definições admin)", "admin.analytics.popularKeys": "Chaves populares", - "admin.analytics.popularKeysHint": "OpenAI / Groq / … do inquilino", + "admin.analytics.popularKeysHint": "OpenAI / Groq / … do inquilino", "admin.analytics.customUrl": "URL/modelo personalizado", "admin.analytics.customUrlHint": "URL base do inquilino + modelo + chave", "admin.analytics.tokensByDay": "Tokens por dia", @@ -754,9 +754,9 @@ export const pt: MessageDict = { "admin.analytics.popularCount": "Popular {count}", "admin.analytics.customCount": "Personalizado {count}", "admin.analytics.jobsByDay": "Trabalhos por dia", - "admin.analytics.jobsByDayHint": "Trabalhos criados (secundário = falhados).", + "admin.analytics.jobsByDayHint": "Trabalhos criados (secundário = falhados).", "admin.analytics.signupsByDay": "Registos por dia", - "admin.analytics.signupsByDayHint": "Novos utilizadores (principal) e empresas (secundário)", + "admin.analytics.signupsByDayHint": "Novos utilizadores (principal) e empresas (secundário)", "admin.analytics.processingJobsStatus": "processing_jobs por estado", "admin.analytics.feedSyncStatus": "feed_sync_jobs por estado", "admin.analytics.ticketsStatus": "support_tickets por estado", @@ -767,20 +767,20 @@ export const pt: MessageDict = { "admin.analytics.class": "Classe", "admin.analytics.tokensCol": "Fichas", "admin.analytics.productsCol": "Produtos", - "admin.analytics.companiesHint": "Principais empresas por tokens com divisão de fornecedor", + "admin.analytics.companiesHint": "Principais empresas por tokens com divisão de fornecedor", "admin.analytics.noCompanies": "Sem empresas", - "admin.analytics.noCompaniesMsg": "A lista de empresas está vazia.", + "admin.analytics.noCompaniesMsg": "A lista de empresas está vazia.", "admin.analytics.company": "Empresa", "admin.analytics.internal": "Interno", "admin.analytics.popular": "Popular", "admin.analytics.custom": "Personalizado", - "admin.analytics.noBillingCycles": "Ainda sem ciclos de faturação", - "admin.analytics.linkDiagnostics": "Diagnósticos", + "admin.analytics.noBillingCycles": "Ainda sem ciclos de faturação", + "admin.analytics.linkDiagnostics": "Diagnósticos", "admin.analytics.linkStuck": "Produtos bloqueados", "admin.users.eyebrow": "Admin da plataforma", - "admin.users.title": "Utilizadores e organizações", - "admin.users.description": "Diretório de utilizadores da plataforma, funções de equipa e atribuições de planos de empresa.", - "admin.users.staffRoleUnavailable": "As atualizações de função de equipa ainda não estão disponíveis neste deployment. Contacte o administrador da plataforma se precisar.", + "admin.users.title": "Utilizadores e organizações", + "admin.users.description": "Diretório de utilizadores da plataforma, funções de equipa e atribuições de planos de empresa.", + "admin.users.staffRoleUnavailable": "As atualizações de função de equipa ainda não estão disponíveis neste deployment. Contacte o administrador da plataforma se precisar.", "admin.users.search": "Pesquisar", "admin.users.tabUsers": "Utilizadores", "admin.users.tabCompanies": "Empresas", @@ -788,10 +788,10 @@ export const pt: MessageDict = { "admin.users.filterWithoutApiKeys": "Keys needing reissue", "admin.users.needsApiKeyReissue": "Needs API key reissue", "admin.users.colName": "Nome", - "admin.users.colStaffRole": "Função da equipa", + "admin.users.colStaffRole": "Função da equipa", "admin.users.colStatus": "Estado", "admin.users.colCreated": "Criado", - "admin.users.colActions": "Ações", + "admin.users.colActions": "Ações", "admin.users.mustSetPassword": "Tem de definir palavra-passe", "admin.users.inactive": "Inativo", "admin.users.reissueInvite": "Reemitir convite", @@ -799,64 +799,64 @@ export const pt: MessageDict = { "admin.users.switchToUser": "Mudar para utilizador", "admin.users.colCompany": "Empresa", "admin.users.colPlan": "Plano", - "admin.users.colCredits": "Créditos", + "admin.users.colCredits": "Créditos", "admin.users.colLanguage": "Idioma", "admin.users.assignPlan": "Atribuir plano", "admin.users.cloneCatalog": "Copiar para a minha empresa", - "admin.users.cloneCatalogAria": "Copiar o catálogo de {name} para a sua empresa sandbox", - "admin.users.cloneCatalogTitle": "Copiar catálogo da empresa", - "admin.users.cloneCatalogDesc": "Permanece na sua conta de admin. Os dados de origem não são alterados.", + "admin.users.cloneCatalogAria": "Copiar o catálogo de {name} para a sua empresa sandbox", + "admin.users.cloneCatalogTitle": "Copiar catálogo da empresa", + "admin.users.cloneCatalogDesc": "Permanece na sua conta de admin. Os dados de origem não são alterados.", "admin.users.cloneCatalogFrom": "Origem: {name}", "admin.users.cloneCatalogInto": "Destino: {name}", - "admin.users.cloneCatalogWarning": "Substitui categorias, feeds, produtos, atributos, mappings e marca no destino. Plano, faturação, membros, chaves API e conectores de loja não são copiados.", + "admin.users.cloneCatalogWarning": "Substitui categorias, feeds, produtos, atributos, mappings e marca no destino. Plano, faturação, membros, chaves API e conectores de loja não são copiados.", "admin.users.cloneCatalogCancel": "Cancelar", - "admin.users.cloneCatalogConfirm": "Copiar catálogo", + "admin.users.cloneCatalogConfirm": "Copiar catálogo", "admin.users.cloneDestFallback": "a sua empresa sandbox", - "admin.users.fixA1": "Reparar catálogo A1", + "admin.users.fixA1": "Reparar catálogo A1", "admin.users.fixA1Aria": "Reparar prompts de IA, categorias e hashes de enhance para {name}", - "admin.users.fixA1Title": "Reparar catálogo da empresa", + "admin.users.fixA1Title": "Reparar catálogo da empresa", "admin.users.fixA1Desc": "Reaplica prompts de IA corrigidos, limpa hashes de enhance fracos e preenche categorias a partir de mapped_data.", "admin.users.fixA1Company": "Empresa: {name}", - "admin.users.fixA1Warning": "Prefira Platform Demo ou uma empresa explícita. Não elimina feeds, mapeamentos ou produtos brutos. Protege as regras de substituição da coorte A1.", + "admin.users.fixA1Warning": "Prefira Platform Demo ou uma empresa explícita. Não elimina feeds, mapeamentos ou produtos brutos. Protege as regras de substituição da coorte A1.", "admin.users.fixA1Cancel": "Cancelar", - "admin.users.fixA1Confirm": "Reparar catálogo", + "admin.users.fixA1Confirm": "Reparar catálogo", "admin.users.noUsers": "Nenhum utilizador corresponde a este filtro.", "admin.users.noCompanies": "Nenhuma empresa corresponde a este filtro.", - "admin.users.assignRoleTitle": "Atribuir função de equipa", - "admin.users.assignRoleDesc": "As funções da plataforma controlam o painel admin (Admin e Developer) e a secretária de suporte (equipa de suporte).", - "admin.users.staffRole": "Função da equipa", - "admin.users.saveRole": "Guardar função", + "admin.users.assignRoleTitle": "Atribuir função de equipa", + "admin.users.assignRoleDesc": "As funções da plataforma controlam o painel admin (Admin e Developer) e a secretária de suporte (equipa de suporte).", + "admin.users.staffRole": "Função da equipa", + "admin.users.saveRole": "Guardar função", "admin.users.assignPlanTitle": "Atribuir plano", - "admin.users.assignPlanDesc": "Associar um plano público, legacy ou personalizado a esta empresa.", + "admin.users.assignPlanDesc": "Associar um plano público, legacy ou personalizado a esta empresa.", "admin.users.selectPlan": "Selecionar plano", "admin.users.assign": "Atribuir", - "admin.settings.title": "Definições da plataforma", - "admin.settings.description": "Credenciais da plataforma, funções de IA, e-mail e integrações para este deployment", - "admin.settings.intro": "Configure aqui funções de IA da plataforma, SMTP, OAuth, EPREL, Pinecone e Stripe. Deixe os segredos em branco para manter o valor guardado. As chaves por empresa ficam em Integrações do inquilino.", - "admin.settings.aiRolesUnavailable": "As funções de IA completas ainda não estão disponíveis neste deployment. O processamento continua a guardar via definições OpenAI da plataforma; outras funções serão persistidas quando suportadas.", - "admin.settings.tab.integrations": "Visão geral", - "admin.settings.tab.ai": "Funções de IA", + "admin.settings.title": "Definições da plataforma", + "admin.settings.description": "Credenciais da plataforma, funções de IA, e-mail e integrações para este deployment", + "admin.settings.intro": "Configure aqui funções de IA da plataforma, SMTP, OAuth, EPREL, Pinecone e Stripe. Deixe os segredos em branco para manter o valor guardado. As chaves por empresa ficam em Integrações do inquilino.", + "admin.settings.aiRolesUnavailable": "As funções de IA completas ainda não estão disponíveis neste deployment. O processamento continua a guardar via definições OpenAI da plataforma; outras funções serão persistidas quando suportadas.", + "admin.settings.tab.integrations": "Visão geral", + "admin.settings.tab.ai": "Funções de IA", "admin.settings.tab.mail": "Mail", "admin.settings.tab.other": "Outro", "admin.settings.tab.admins": "Utilizadores admin", - "admin.settings.mailCardDesc": "Convites de definição de palavra-passe e e-mail de saída da plataforma", + "admin.settings.mailCardDesc": "Convites de definição de palavra-passe e e-mail de saída da plataforma", "admin.settings.integrationsCardDesc": "OAuth, EPREL, Pinecone, Stripe, feeds", "admin.settings.tenantVsPlatform": "Inquilino vs plataforma", - "admin.settings.hostSecrets": "Segredos de base de dados, sessão e assinatura do servidor — configurar apenas no host", + "admin.settings.hostSecrets": "Segredos de base de dados, sessão e assinatura do servidor — configurar apenas no host", "admin.settings.linkAi": "IA", - "admin.settings.linkEmail": "Correio eletrónico", - "admin.settings.linkBilling": "Faturação", + "admin.settings.linkEmail": "Correio eletrónico", + "admin.settings.linkBilling": "Faturação", "admin.settings.provider": "Fornecedor", "admin.settings.model": "Modelo", "admin.settings.baseUrl": "URL base", "admin.settings.apiKey": "Chave API", - "admin.settings.embeddingDims": "Dimensões de embedding (opcional)", + "admin.settings.embeddingDims": "Dimensões de embedding (opcional)", "admin.settings.smtpHost": "Host SMTP", "admin.settings.port": "Porta", "admin.settings.username": "Nome de utilizador", - "admin.settings.fromAddress": "Endereço de origem", - "admin.settings.testRecipient": "Destinatário de teste (opcional)", - "admin.settings.testRecipientPlaceholder": "Predefinição: o seu e-mail de admin", + "admin.settings.fromAddress": "Endereço de origem", + "admin.settings.testRecipient": "Destinatário de teste (opcional)", + "admin.settings.testRecipientPlaceholder": "Predefinição: o seu e-mail de admin", "admin.settings.googleOauth": "Google OAuth", "admin.settings.googleOauthDesc": "Credenciais de cliente Google OAuth da plataforma opcionais.", "admin.settings.clientId": "ID de cliente", @@ -868,18 +868,18 @@ export const pt: MessageDict = { "admin.settings.namespace": "Namespace", "admin.settings.namespacePlaceholder": "opcional", "admin.settings.stripe": "Stripe", - "admin.settings.priceStarterMo": "ID de preço mensal Starter", - "admin.settings.priceStarterYr": "ID de preço anual Starter", + "admin.settings.priceStarterMo": "ID de preço mensal Starter", + "admin.settings.priceStarterYr": "ID de preço anual Starter", "admin.settings.pricePlusMo": "Plus monthly price ID", "admin.settings.pricePlusYr": "Plus yearly price ID", - "admin.settings.priceGrowthMo": "ID de preço mensal Growth", - "admin.settings.priceGrowthYr": "ID de preço anual Growth", - "admin.settings.priceBusinessMo": "ID de preço mensal Business", - "admin.settings.priceBusinessYr": "ID de preço anual Business", + "admin.settings.priceGrowthMo": "ID de preço mensal Growth", + "admin.settings.priceGrowthYr": "ID de preço anual Growth", + "admin.settings.priceBusinessMo": "ID de preço mensal Business", + "admin.settings.priceBusinessYr": "ID de preço anual Business", "admin.settings.priceScaleMo": "Scale monthly price ID", "admin.settings.priceScaleYr": "Scale yearly price ID", "admin.settings.creditPackPrices": "AI credit pack price IDs (one-time)", - "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", + "admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.", "admin.settings.syncCreditPacks": "Sync Stripe packs", "admin.settings.syncCreditPacksOk": "Synced {count} credit pack price(s) ({mode} mode).", "admin.settings.syncCreditPacksModeHint": "Stripe mode for this sync: {mode}. Switch the secret key (sk_test_ vs sk_live_) to sync the other environment.", @@ -888,36 +888,36 @@ export const pt: MessageDict = { "admin.settings.pricePackMedium": "Growth pack (2,000 credits) price ID", "admin.settings.pricePackLarge": "Catalog pack (10,000 credits) price ID", "admin.settings.pricePackXL": "Scale pack (40,000 credits) price ID", - "admin.settings.feedAllowlist": "Lista de permissão de URL privadas de feeds", - "admin.settings.allowlist": "Lista de permissões", + "admin.settings.feedAllowlist": "Lista de permissão de URL privadas de feeds", + "admin.settings.allowlist": "Lista de permissões", "admin.settings.platformAdmins": "Administradores da plataforma", "admin.settings.colUserId": "ID de utilizador", - "admin.settings.colEmail": "Correio eletrónico", + "admin.settings.colEmail": "Correio eletrónico", "admin.settings.colName": "Nome", "admin.settings.colAddedOn": "Adicionado em", - "admin.settings.colRole": "Função", + "admin.settings.colRole": "Função", "admin.settings.platformAdminBadge": "Admin da plataforma", "admin.settings.noAdmins": "Nenhum utilizador admin encontrado", - "admin.settings.adminStatusCheck": "Verificação de estado admin", - "admin.settings.bootstrapPage": "página bootstrap", - "admin.readiness.title": "Preparação do cutover", - "admin.readiness.detail": "Contagens de hypercare que ainda precisam de atenção antes da mudança de DNS.", + "admin.settings.adminStatusCheck": "Verificação de estado admin", + "admin.settings.bootstrapPage": "página bootstrap", + "admin.readiness.title": "Preparação do cutover", + "admin.readiness.detail": "Contagens de hypercare que ainda precisam de atenção antes da mudança de DNS.", "admin.readiness.mustSetPassword": "{count} utilizadores devem definir palavra-passe", "admin.readiness.withoutAdmin": "{count} empresas sem administrador", "admin.readiness.withoutPlan": "{count} empresas sem plano ativo", "admin.readiness.withoutApiKeys": "{count} companies needing API key reissue", - "admin.readiness.linksAria": "Ligações profundas de preparação", + "admin.readiness.linksAria": "Ligações profundas de preparação", "admin.readiness.linkUsers": "Utilizadores", - "admin.readiness.linkBilling": "Faturação", - "admin.readiness.linkSettings": "Definições", + "admin.readiness.linkBilling": "Faturação", + "admin.readiness.linkSettings": "Definições", "admin.readiness.linkApiKeys": "Keys needing reissue", "admin.diagnostics.eyebrow": "Plataforma", - "admin.diagnostics.title": "Diagnósticos", - "admin.diagnostics.description": "Consola ops para saúde da app, profundidade da fila, trabalhos recentes e flags de config. Segredos e DSN nunca são mostrados; erros de trabalhos são sanitizados.", + "admin.diagnostics.title": "Diagnósticos", + "admin.diagnostics.description": "Consola ops para saúde da app, profundidade da fila, trabalhos recentes e flags de config. Segredos e DSN nunca são mostrados; erros de trabalhos são sanitizados.", "admin.diagnostics.filterAria": "Filtro de estado do trabalho", "admin.diagnostics.queue": "Fila", - "admin.diagnostics.noJobsInQueue": "Não há trabalhos na fila.", - "admin.diagnostics.sanitizedErrors": "Erros sanitizados · máx. 25", + "admin.diagnostics.noJobsInQueue": "Não há trabalhos na fila.", + "admin.diagnostics.sanitizedErrors": "Erros sanitizados · máx. 25", "admin.diagnostics.colId": "ID", "admin.diagnostics.colCompany": "Empresa", "admin.diagnostics.colStatus": "Estado", @@ -926,17 +926,17 @@ export const pt: MessageDict = { "admin.diagnostics.colError": "Erro", "admin.diagnostics.colTicket": "Ticket", "admin.diagnostics.colWhen": "Quando", - "admin.diagnostics.noJobsFilter": "Não há trabalhos para este filtro.", + "admin.diagnostics.noJobsFilter": "Não há trabalhos para este filtro.", "admin.stuck.title": "Produtos bloqueados", - "admin.stuck.description": "Reveja trabalhos de processamento recentes e reponha os bloqueados há mais de 2 horas", + "admin.stuck.description": "Reveja trabalhos de processamento recentes e reponha os bloqueados há mais de 2 horas", "admin.stuck.noJobs": "Nenhum trabalho encontrado.", "admin.stuck.filterAria": "Filtrar trabalhos por estado", "admin.orphan.title": "Orphan processed", - "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", + "admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.", "admin.orphan.cutoverHint": "Safe by default: refresh and dry-run never delete. Confirm delete sends confirm=true only after you approve the dialog.", "admin.orphan.refreshReport": "Refresh report", "admin.orphan.dryRunBtn": "Dry-run cleanup", - "admin.orphan.deleteBtn": "Confirm delete…", + "admin.orphan.deleteBtn": "Confirm delete…", "admin.orphan.loadFailed": "Could not load orphan report", "admin.orphan.dryRunFailed": "Dry-run cleanup failed", "admin.orphan.deleteFailed": "Confirmed orphan cleanup failed", @@ -947,7 +947,7 @@ export const pt: MessageDict = { "admin.orphan.samplesDesc": "Up to 25 most recently updated orphan catalog rows", "admin.orphan.cleanBadge": "Clean", "admin.orphan.needsCleanupBadge": "Needs cleanup", - "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", + "admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.", "admin.orphan.noSamples": "No sample rows in this report.", "admin.orphan.colProcessed": "Processed ID", "admin.orphan.colCompany": "Company", @@ -962,48 +962,48 @@ export const pt: MessageDict = { "admin.orphan.confirmTitle": "Delete orphan processed rows?", "admin.orphan.confirmDesc": "This permanently deletes {total} processed_products row(s) whose raw is missing or unprocessed. Job product links use ON DELETE SET NULL.", "admin.orphan.confirmDelete": "Delete orphans", - "admin.billing.title": "Admin de faturação", - "admin.billing.description": "Gira planos, créditos, permissões de funcionalidades por pacote e interruptores de funcionalidades em toda a plataforma.", + "admin.billing.title": "Admin de faturação", + "admin.billing.description": "Gira planos, créditos, permissões de funcionalidades por pacote e interruptores de funcionalidades em toda a plataforma.", "admin.billing.noCompanies": "Nenhuma empresa encontrada.", "admin.billing.noCompaniesFilter": "Nenhuma empresa corresponde a este filtro.", "admin.billing.assignPlanTitle": "Atribuir plano", - "admin.billing.assignPlanDesc": "Associe um plano de faturação a uma empresa. Os créditos de teste opcionais repõem o saldo da empresa para o período de teste.", - "admin.billing.creditsTitle": "Adicionar / ajustar créditos", + "admin.billing.assignPlanDesc": "Associe um plano de faturação a uma empresa. Os créditos de teste opcionais repõem o saldo da empresa para o período de teste.", + "admin.billing.creditsTitle": "Adicionar / ajustar créditos", "admin.billing.creditsDesc": "Creditar ou debitar o saldo de uma empresa.", - "admin.billing.searchCompany": "Pesquisar empresa…", + "admin.billing.searchCompany": "Pesquisar empresa…", "admin.knowledge.draft": "Rascunho", "admin.knowledge.badge.draft": "Rascunho", "admin.knowledge.newArticle": "Novo artigo", "admin.knowledge.editArticle": "Editar artigo", "admin.knowledge.noMatchingArticles": "Sem artigos correspondentes", "admin.knowledge.noArticles": "Sem artigos de conhecimento", - "admin.knowledge.emptyCategoryMsg": "A categoria “{category}” está pronta — adicione um artigo base para um agente de conteúdo preencher.", - "admin.knowledge.emptyArticlesMsg": "Adicione bases estilo FAQ com categorias e palavras-chave. Deixe marcadores no corpo para agentes de conteúdo.", - "admin.knowledge.col.title": "Título", + "admin.knowledge.emptyCategoryMsg": "A categoria “{category}” está pronta — adicione um artigo base para um agente de conteúdo preencher.", + "admin.knowledge.emptyArticlesMsg": "Adicione bases estilo FAQ com categorias e palavras-chave. Deixe marcadores no corpo para agentes de conteúdo.", + "admin.knowledge.col.title": "Título", "admin.knowledge.col.name": "Nome", "admin.knowledge.edit": "Editar", "admin.knowledge.newTemplate": "Novo modelo", "admin.knowledge.editTemplate": "Editar modelo", "admin.knowledge.allCategories": "Tudo", "admin.settings.enablePlatformSmtp": "Ativar SMTP da plataforma", - "admin.plans.title": "Planos de subscrição", - "admin.plans.description": "Público ladder, A1 / Legacy, Plataforma Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Oculto.", - "admin.plans.searchPlaceholder": "Pesquisar nome ou descrição…", + "admin.plans.title": "Planos de subscrição", + "admin.plans.description": "Público ladder, A1 / Legacy, Plataforma Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Oculto.", + "admin.plans.searchPlaceholder": "Pesquisar nome ou descrição…", "admin.plans.searchAria": "Pesquisar planos", "admin.plans.filterAria": "Filtrar planos por visibilidade", - "admin.plans.filter.catalog": "Catálogo", - "admin.plans.filter.public": "Público", + "admin.plans.filter.catalog": "Catálogo", + "admin.plans.filter.public": "Público", "admin.plans.filter.legacy": "Legacy", "admin.plans.filter.custom": "Personalizado", "admin.plans.filter.hidden": "Oculto", "admin.plans.filter.all": "Tudo", "admin.plans.col.plan": "Plano", "admin.plans.col.visibility": "Visibilidade", - "admin.plans.col.monthlyCredits": "Créditos mensais", - "admin.plans.col.maxProducts": "Produtos máx.", + "admin.plans.col.monthlyCredits": "Créditos mensais", + "admin.plans.col.maxProducts": "Produtos máx.", "admin.plans.col.term": "Prazo", "admin.plans.customPackageFlag": "Sinalizador de pacote personalizado", - "admin.plans.visibility.public": "Público", + "admin.plans.visibility.public": "Público", "admin.plans.visibility.legacy": "Legacy", "admin.plans.visibility.hidden": "Oculto", "admin.plans.visibility.custom": "Personalizado", @@ -1011,34 +1011,34 @@ export const pt: MessageDict = { "admin.plans.editAria": "Editar {name}", "admin.plans.assign": "Atribuir", "admin.plans.assignAria": "Atribuir {name}", - "admin.plans.permissions": "Permissões do plano", - "admin.plans.permissionsAria": "Editar permissões do plano for {name}", + "admin.plans.permissions": "Permissões do plano", + "admin.plans.permissionsAria": "Editar permissões do plano for {name}", "admin.plans.showing": "A mostrar {filtered} de {total} planos", "admin.plans.unlimited": "Ilimitado", - "admin.plans.optionLabel": "{name} ({credits} créditos) · {kind}", + "admin.plans.optionLabel": "{name} ({credits} créditos) · {kind}", "admin.permissions.noteStrong": "Plano entitlements only.", - "admin.permissions.noteBody": "These toggles set what this package may include. Plataforma-wide on/desligado masters are on the {global} tab — a plan can enable a feature that still stays desligado when the platform switch is desativado.", + "admin.permissions.noteBody": "These toggles set what this package may include. Plataforma-wide on/desligado masters are on the {global} tab — a plan can enable a feature that still stays desligado when the platform switch is desativado.", "admin.permissions.globalTab": "Interruptores globais", - "admin.permissions.title": "Permissões do plano", + "admin.permissions.title": "Permissões do plano", "admin.permissions.descCount": "{enabled}/{total} ativados", "admin.permissions.matchesProfile": "corresponde a {profile}", - "admin.permissions.customizedOverrides": "substituições personalizadas", - "admin.permissions.planDefaults": "predefinições do plano", + "admin.permissions.customizedOverrides": "substituições personalizadas", + "admin.permissions.planDefaults": "predefinições do plano", "admin.permissions.badge.legacy": "Pacote legado migrado", - "admin.permissions.badge.publicLadder": "Público ladder", - "admin.permissions.badge.ladderCustom": "Público ladder · personalizado flag", + "admin.permissions.badge.publicLadder": "Público ladder", + "admin.permissions.badge.ladderCustom": "Público ladder · personalizado flag", "admin.permissions.badge.customDeal": "Personalizado deal", "admin.permissions.badge.clientDeal": "Acordo com cliente", "admin.permissions.badge.customOverrides": "Personalizado overrides", - "admin.permissions.badge.defaults": "Predefinições", + "admin.permissions.badge.defaults": "Predefinições", "admin.permissions.badge.customFlag": "Personalizado flag", "admin.permissions.package": "Pacote", "admin.permissions.noPlans": "Sem planos", - "admin.permissions.suffix.legacy": "· legacy", - "admin.permissions.suffix.default": " · predefinido", - "admin.permissions.suffix.custom": " · personalizado", - "admin.permissions.section": "Secção", - "admin.permissions.allSections": "Todas as secções", + "admin.permissions.suffix.legacy": "· legacy", + "admin.permissions.suffix.default": " · predefinido", + "admin.permissions.suffix.custom": " · personalizado", + "admin.permissions.section": "Secção", + "admin.permissions.allSections": "Todas as secções", "admin.permissions.state": "Estado", "admin.permissions.stateAll": "Tudo", "admin.permissions.stateOn": "Ativado", @@ -1054,59 +1054,59 @@ export const pt: MessageDict = { "admin.permissions.applyGeneric": "Aplicar perfil", "admin.permissions.enableAll": "Ativar tudo", "admin.permissions.disableAll": "Desativar tudo", - "admin.permissions.clearOverrides": "Limpar substituições", + "admin.permissions.clearOverrides": "Limpar substituições", "admin.permissions.globallyOff": "Globally desligado", - "admin.permissions.enableSection": "Ativar secção", - "admin.permissions.disableSection": "Desativar secção", + "admin.permissions.enableSection": "Ativar secção", + "admin.permissions.disableSection": "Desativar secção", "admin.permissions.noMatch": "Nenhuma funcionalidade corresponde aos filtros atuais.", "admin.permissions.differs": "Difere", "admin.permissions.platformOffHint": "Desligado em toda a plataforma even if this plan enables it.", "admin.permissions.sectionToggled": "{label} {state} para este plano.", "admin.permissions.state.enabled": "ativado", "admin.permissions.state.disabled": "desativado", - "admin.permissions.loadFailed": "Falha ao carregar permissões do plano", + "admin.permissions.loadFailed": "Falha ao carregar permissões do plano", "admin.permissions.saveFailed": "Falha ao guardar feature", "admin.permissions.enableAllFailed": "Ativar tudo falhou", "admin.permissions.disableAllFailed": "Desativar tudo falhou", "admin.permissions.profileFailed": "Falha ao apply profile", "admin.permissions.resetFailed": "Falha ao reset defaults", - "admin.permissions.sectionFailed": "Secção update falhou", + "admin.permissions.sectionFailed": "Secção update falhou", "admin.profile.legacy.label": "Legacy", - "admin.profile.legacy.description": "Migrated legacy navigation: catalog, feeds, faturação, and definições; no Voltarground Tasks, lojas, or marketing.", - "admin.profile.free.label": "Grátis", - "admin.profile.free.description": "Público Free ladder — AI, chave APIs, live email, and own-key AI desligado.", + "admin.profile.legacy.description": "Migrated legacy navigation: catalog, feeds, faturação, and definições; no Voltarground Tasks, lojas, or marketing.", + "admin.profile.free.label": "Grátis", + "admin.profile.free.description": "Público Free ladder — AI, chave APIs, live email, and own-key AI desligado.", "admin.profile.starter.label": "Starter", - "admin.profile.starter.description": "Público Starter — AI on; own-key AI desligado.", + "admin.profile.starter.description": "Público Starter — AI on; own-key AI desligado.", "admin.profile.growth.label": "Growth", - "admin.profile.growth.description": "Todas as funcionalidades do catálogo ativas.", + "admin.profile.growth.description": "Todas as funcionalidades do catálogo ativas.", "admin.profile.business.label": "Business", - "admin.profile.business.description": "Todas as funcionalidades do catálogo ativas.", + "admin.profile.business.description": "Todas as funcionalidades do catálogo ativas.", "admin.profile.enterprise.label": "Enterprise / tudo ligado", "admin.profile.enterprise.description": "Full matriz de funcionalidades (custom and Enterprise default).", "admin.gates.noteStrong": "Plataforma-wide masters.", - "admin.gates.noteBody": "Estes interruptores aplicam-se a todos os pacotes. O acesso efetivo é {combo}. Os direitos por pacote ficam no separador {permissions}.", - "admin.gates.combo": "permissão do plano E secção global E funcionalidade global", - "admin.gates.permissionsTab": "Permissões do plano", + "admin.gates.noteBody": "Estes interruptores aplicam-se a todos os pacotes. O acesso efetivo é {combo}. Os direitos por pacote ficam no separador {permissions}.", + "admin.gates.combo": "permissão do plano E secção global E funcionalidade global", + "admin.gates.permissionsTab": "Permissões do plano", "admin.gates.sectionsOff": "{count} section desligado", "admin.gates.sectionsOffPlural": "{count} sections desligado", "admin.gates.featuresOff": "{count} feature master desligado", "admin.gates.featuresOffPlural": "{count} feature masters desligado", "admin.gates.title": "Mestres de funcionalidades globais", "admin.gates.description": "Disable a feature here to turn it desligado for every package, even when a plan enables it.", - "admin.gates.section": "Secção", - "admin.gates.allSections": "Todas as secções", + "admin.gates.section": "Secção", + "admin.gates.allSections": "Todas as secções", "admin.gates.search": "Pesquisar", "admin.gates.searchPlaceholder": "Filtrar por chave ou etiqueta", - "admin.gates.sectionOff": "Secção desligado", + "admin.gates.sectionOff": "Secção desligado", "admin.gates.noMatch": "Nenhuma funcionalidade corresponde aos filtros atuais.", "admin.gates.featureAria": "{label} global", - "admin.gates.sectionsTitle": "Interruptores de secção global", - "admin.gates.sectionsDesc": "Turn an entire produto area on or desligado for all packages. “Secção + features” also updates every feature master in that section.", - "admin.gates.sectionAria": "Secção global {label}", - "admin.gates.enableSectionFeatures": "Ativar secção + funcionalidades", - "admin.gates.disableSectionFeatures": "Desativar secção + funcionalidades", + "admin.gates.sectionsTitle": "Interruptores de secção global", + "admin.gates.sectionsDesc": "Turn an entire produto area on or desligado for all packages. “Secção + features” also updates every feature master in that section.", + "admin.gates.sectionAria": "Secção global {label}", + "admin.gates.enableSectionFeatures": "Ativar secção + funcionalidades", + "admin.gates.disableSectionFeatures": "Desativar secção + funcionalidades", "admin.gates.sectionSuccess": "{label} {state} para todos os pacotes.", - "admin.gates.sectionSuccessWithFeatures": "{label} {state} para todos os pacotes (mestres de secção e funcionalidade).", + "admin.gates.sectionSuccessWithFeatures": "{label} {state} para todos os pacotes (mestres de secção e funcionalidade).", "admin.gates.featureSuccess": "{key} {state} globalmente.", "admin.gates.state.enabled": "ativado", "admin.gates.state.disabled": "desativado", @@ -1116,22 +1116,22 @@ export const pt: MessageDict = { "admin.billing.createPlan": "Criar plano", "admin.billing.assignPlanBtn": "Atribuir plano", "admin.billing.stat.plans": "Planos", - "admin.billing.stat.catalogHidden": "{catalog} catálogo · {hidden} ocultos", - "admin.billing.stat.creditsAllocated": "Créditos allocated", + "admin.billing.stat.catalogHidden": "{catalog} catálogo · {hidden} ocultos", + "admin.billing.stat.creditsAllocated": "Créditos allocated", "admin.billing.stat.acrossCompanies": "Across empresas on this page (first 50)", - "admin.billing.stat.creditsUsed": "Créditos used", - "admin.billing.stat.creditsConsumed": "Créditos consumed on this page", + "admin.billing.stat.creditsUsed": "Créditos used", + "admin.billing.stat.creditsConsumed": "Créditos consumed on this page", "admin.billing.stat.noActivePlan": "Sem plano ativo", "admin.billing.stat.noActivePlanHint": "Empresas with no active subscription (this page)", "admin.billing.tab.plans": "Planos", - "admin.billing.tab.permissions": "Permissões do plano", + "admin.billing.tab.permissions": "Permissões do plano", "admin.billing.tab.global": "Interruptores globais", "admin.billing.tab.companies": "Empresas", - "admin.billing.cyclesTitle": "Faturação cycles", - "admin.billing.cyclesDesc": "Process due renewals for empresas on scheduled ciclos de faturação.", - "admin.billing.runCycles": "Run due ciclos de faturação", + "admin.billing.cyclesTitle": "Faturação cycles", + "admin.billing.cyclesDesc": "Process due renewals for empresas on scheduled ciclos de faturação.", + "admin.billing.runCycles": "Run due ciclos de faturação", "admin.billing.companiesTitle": "Empresas", - "admin.billing.companiesDesc": "Saldos de créditos e estado do plano — atribua planos ou ajuste créditos.", + "admin.billing.companiesDesc": "Saldos de créditos e estado do plano — atribua planos ou ajuste créditos.", "admin.billing.searchCompaniesAria": "Pesquisar empresas", "admin.billing.planStatusAria": "Estado do plano", "admin.billing.filter.all": "Tudo empresas", @@ -1139,14 +1139,14 @@ export const pt: MessageDict = { "admin.billing.filter.withoutPlan": "Sem plano ativo", "admin.billing.col.company": "Empresa", "admin.billing.col.planStatus": "Estado do plano", - "admin.billing.col.creditsRemaining": "Créditos restantes", + "admin.billing.col.creditsRemaining": "Créditos restantes", "admin.billing.col.total": "Total", "admin.billing.col.used": "Usados", - "admin.billing.col.usagePct": "% de utilização", + "admin.billing.col.usagePct": "% de utilização", "admin.billing.badge.noPlan": "Sem plano", "admin.billing.badge.active": "Ativo", "admin.billing.assignPlanAria": "Atribuir plano a {name}", - "admin.billing.addCredits": "Adicionar créditos", + "admin.billing.addCredits": "Adicionar créditos", "admin.billing.addCreditsAria": "Adicionar credits for {name}", "admin.billing.showingCompanies": "A mostrar {filtered} de {total} empresas", "admin.billing.editPlanTitle": "Editar plan", @@ -1154,43 +1154,43 @@ export const pt: MessageDict = { "admin.billing.editPlanDesc": "Update credits, produto caps, and whether this plan is marked custom.", "admin.billing.createPlanDesc": "Criar a package. Personalizado plans stay hidden from public pricing.", "admin.billing.field.name": "Nome", - "admin.billing.field.description": "Descrição", + "admin.billing.field.description": "Descrição", "admin.billing.field.descriptionPlaceholder": "Opcional short summary for admins", - "admin.billing.field.monthlyCredits": "Créditos mensais", - "admin.billing.field.yearlyCredits": "Créditos anuais", - "admin.billing.field.maxProducts": "Produtos máx.", + "admin.billing.field.monthlyCredits": "Créditos mensais", + "admin.billing.field.yearlyCredits": "Créditos anuais", + "admin.billing.field.maxProducts": "Produtos máx.", "admin.billing.field.maxProductsPlaceholder": "Em branco = ilimitado", "admin.billing.field.term": "Prazo", "admin.billing.term.monthly": "Mensal", "admin.billing.term.yearly": "Anual", "admin.billing.customPackage": "Personalizado package", - "admin.billing.customPackageHint": "Oculto from public pricing. Use for client deals; leave desligado for Free–Business.", - "admin.billing.previewBadge": "Distintivo de pré-visualização: {preview}.", + "admin.billing.customPackageHint": "Oculto from public pricing. Use for client deals; leave desligado for Free–Business.", + "admin.billing.previewBadge": "Distintivo de pré-visualização: {preview}.", "admin.billing.company": "Empresa", "admin.billing.selectCompany": "Selecionar empresa", - "admin.billing.noPlanSuffix": "· no plan", + "admin.billing.noPlanSuffix": "· no plan", "admin.billing.plan": "Plano", "admin.billing.selectPlan": "Selecionar plano", - "admin.billing.trialAssignment": "Atribuição de teste", + "admin.billing.trialAssignment": "Atribuição de teste", "admin.billing.trialHint": "Opcional trial flag + credit grant for sales or evaluation trials.", - "admin.billing.trialCredits": "Créditos de teste", + "admin.billing.trialCredits": "Créditos de teste", "admin.billing.assign": "Atribuir", "admin.billing.amount": "Valor", "admin.billing.amountHint": "Use um valor negativo para debitar.", "admin.billing.apply": "Aplicar", "admin.billing.planUpdated": "Plano atualizado.", "admin.billing.planCreated": "Plano criado.", - "admin.billing.loadFailed": "Falha ao carregar faturação data", + "admin.billing.loadFailed": "Falha ao carregar faturação data", "admin.billing.updateFailed": "Update plan falhou", "admin.billing.createFailed": "Criar plan falhou", "admin.billing.assignFailed": "Assign falhou", "admin.billing.creditsFailed": "Add credits falhou", "admin.billing.cyclesFailed": "Run cycles falhou", "admin.knowledge.supportInbox": "Suporte inbox", - "admin.knowledge.aiRoles": "Funções de IA", + "admin.knowledge.aiRoles": "Funções de IA", "admin.knowledge.tab.articles": "Artigos", "admin.knowledge.tab.templates": "Modelos", - "admin.knowledge.tab.settings": "Resposta automática", + "admin.knowledge.tab.settings": "Resposta automática", "admin.knowledge.allStatuses": "Tudo statuses", "admin.knowledge.published": "Publicado", "admin.knowledge.createArticle": "Criar article", @@ -1201,53 +1201,53 @@ export const pt: MessageDict = { "admin.knowledge.createTemplate": "Criar template", "admin.knowledge.badge.active": "Ativo", "admin.knowledge.badge.inactive": "Inativo", - "admin.knowledge.autoFirstResponses": "Ativar primeiras respostas automáticas", - "admin.knowledge.faqMatching": "Correspondência FAQ / modelo", + "admin.knowledge.autoFirstResponses": "Ativar primeiras respostas automáticas", + "admin.knowledge.faqMatching": "Correspondência FAQ / modelo", "admin.knowledge.retryOnReply": "Tentar novamente on first customer reply (if no prior auto)", - "admin.knowledge.matchThreshold": "Limiar de confiança de correspondência", + "admin.knowledge.matchThreshold": "Limiar de confiança de correspondência", "admin.knowledge.enableAiFallback": "Ativar fallback de IA", "admin.knowledge.deliveryMode": "Modo de entrega", "admin.knowledge.delivery.draft": "Apenas rascunho (nota interna)", - "admin.knowledge.delivery.autoSend": "Envio automático ao cliente", - "admin.knowledge.aiThreshold": "Limiar de confiança da IA", + "admin.knowledge.delivery.autoSend": "Envio automático ao cliente", + "admin.knowledge.aiThreshold": "Limiar de confiança da IA", "admin.knowledge.usePlatformRole": "Use platform suporte AI role (recommended)", "admin.knowledge.modelOverride": "Modelo override", "admin.knowledge.providerOverride": "Fornecedor override", - "admin.knowledge.baseUrlOverride": "Substituição do URL base", + "admin.knowledge.baseUrlOverride": "Substituição do URL base", "admin.knowledge.supportAiRoleTitle": "Suporte AI role (fallback provider)", "admin.knowledge.configured": "Configurado", - "admin.knowledge.notReadyBadge": "Não pronto", + "admin.knowledge.notReadyBadge": "Não pronto", "admin.knowledge.enabled": "Ativado", "admin.knowledge.disabled": "Desativado", - "admin.knowledge.openAiRoles": "Abrir Plataforma definições → AI roles", - "admin.knowledge.field.title": "Título", + "admin.knowledge.openAiRoles": "Abrir Plataforma definições → AI roles", + "admin.knowledge.field.title": "Título", "admin.knowledge.field.slug": "Slug", "admin.knowledge.field.body": "Corpo (markdown)", "admin.knowledge.field.keywords": "Palavras-chave", - "admin.knowledge.keywordsPlaceholder": "separados por vírgulas", - "admin.knowledge.field.intents": "Chaves de intenção", - "admin.knowledge.intentsPlaceholder": "separados por vírgulas", + "admin.knowledge.keywordsPlaceholder": "separados por vírgulas", + "admin.knowledge.field.intents": "Chaves de intenção", + "admin.knowledge.intentsPlaceholder": "separados por vírgulas", "admin.knowledge.field.categories": "Categoria slugs", - "admin.knowledge.categoriesPlaceholder": "faturação, account…", + "admin.knowledge.categoriesPlaceholder": "faturação, account…", "admin.knowledge.field.weight": "Peso de prioridade", - "admin.knowledge.publishedEligible": "Publicado (elegível para correspondência)", + "admin.knowledge.publishedEligible": "Publicado (elegível para correspondência)", "admin.knowledge.field.name": "Nome", "admin.knowledge.field.templateBody": "Corpo", "admin.knowledge.active": "Ativo", "admin.settings.card.aiRolesTitle": "Plataforma AI roles", - "admin.settings.card.aiRolesDesc": "Processamento, vectorization, docs/API, and suporte — separate keys/models", + "admin.settings.card.aiRolesDesc": "Processamento, vectorization, docs/API, and suporte — separate keys/models", "admin.settings.roleOff": " (desligado)", - "admin.settings.roleNotSet": "· not set", - "admin.settings.someRolesUnavailable": "Some AI roles are not disponível on this deployment yet. Processamento still uses the platform AbrirAI definições until all roles are suporteed.", + "admin.settings.roleNotSet": "· not set", + "admin.settings.someRolesUnavailable": "Some AI roles are not disponível on this deployment yet. Processamento still uses the platform AbrirAI definições until all roles are suporteed.", "admin.settings.configure": "Configurar", "admin.settings.card.smtpTitle": "Plataforma SMTP", "admin.settings.configured": "Configurado", - "admin.settings.notConfigured": "Não configurado", + "admin.settings.notConfigured": "Não configurado", "admin.settings.source": "origem: {source}", "admin.settings.smtpEnabled": "SMTP ativado", "admin.settings.smtpDisabled": "SMTP desativado", - "admin.settings.passwordSet": "· password set", - "admin.settings.card.otherTitle": "Outras integrações", + "admin.settings.passwordSet": "· password set", + "admin.settings.card.otherTitle": "Outras integrações", "admin.settings.oauthSet": "Google OAuth definido", "admin.settings.oauthOff": "Google OAuth desligado", "admin.settings.eprelOn": "EPREL ligado", @@ -1257,28 +1257,28 @@ export const pt: MessageDict = { "admin.settings.stripeSet": "Stripe definido", "admin.settings.stripeOff": "Stripe desligado", "admin.settings.password": "Palavra-passe", - "admin.settings.passwordSavedHint": "(guardado — leave blank to keep)", + "admin.settings.passwordSavedHint": "(guardado — leave blank to keep)", "admin.settings.secretKey": "Chave secreta", - "admin.settings.secretConfiguredHint": "(configurado — deixe em branco para manter)", + "admin.settings.secretConfiguredHint": "(configurado — deixe em branco para manter)", "admin.settings.passwordConfigured": "Palavra-passe configured", "admin.settings.noSmtpPassword": "Sem palavra-passe SMTP", "admin.settings.enabled": "Ativado", "admin.settings.disabled": "Desativado", "admin.settings.saveRole": "Guardar {label}", - "admin.settings.testConnection": "Testar ligação", - "admin.settings.saveMail": "Guardar mail definições", + "admin.settings.testConnection": "Testar ligação", + "admin.settings.saveMail": "Guardar mail definições", "admin.settings.saveIntegrations": "Guardar integrations", "admin.settings.eprelEnabled": "EPREL enrichment ativado", - "admin.settings.loadFailed": "Plataforma definições could not be loaded. Saving is desativado until reload succeeds.", + "admin.settings.loadFailed": "Plataforma definições could not be loaded. Saving is desativado until reload succeeds.", "admin.settings.testAccepted": "Mensagem de teste aceite pelo SMTP", - "admin.stuck.cleanupBtn": "Limpeza de trabalhos presos (>2 h em execução)", + "admin.stuck.cleanupBtn": "Limpeza de trabalhos presos (>2 h em execução)", "admin.stuck.jobsTitle": "Trabalhos de processamento", - "admin.stuck.jobsDesc": "Últimos 100 trabalhos · {running} em execução", + "admin.stuck.jobsDesc": "Últimos 100 trabalhos · {running} em execução", "admin.stuck.filterAll": "Tudo", - "admin.stuck.filterRunning": "Em execução", + "admin.stuck.filterRunning": "Em execução", "admin.stuck.filterFailed": "Falhado", "admin.stuck.filterPending": "Pendente", - "admin.stuck.filterCompleted": "Concluído", + "admin.stuck.filterCompleted": "Concluído", "admin.stuck.colId": "ID", "admin.stuck.colCompany": "Empresa", "admin.stuck.colStatus": "Estado", @@ -1287,17 +1287,17 @@ export const pt: MessageDict = { "admin.stuck.colError": "Erro", "admin.stuck.loadFailed": "Falha ao carregar trabalhos", "admin.stuck.cleanupFailed": "Falha na limpeza", - "admin.support.knowledgeLink": "Conhecimento e resposta automática", + "admin.support.knowledgeLink": "Conhecimento e resposta automática", "admin.support.queueTitle": "Fila de tickets", - "admin.support.queueMeta": "{total} · âmbito {scope}", - "admin.support.queueMetaStatus": "· estado {status}", + "admin.support.queueMeta": "{total} · âmbito {scope}", + "admin.support.queueMetaStatus": "· estado {status}", "admin.support.ticketCountOne": "{count} ticket", "admin.support.ticketCountMany": "{count} tickets", "admin.support.statusAll": "Tudo statuses", "admin.support.scopeAll": "Tudo tickets", "admin.support.scopeInbox": "Caixa de entrada", "admin.support.scopeMine": "Meus", - "admin.support.scopeUnassigned": "Não atribuídos", + "admin.support.scopeUnassigned": "Não atribuídos", "admin.support.flagAny": "Qualquer estado auto", "admin.support.flagNeedsHuman": "Precisa de humano", "admin.support.flagAiDraft": "Rascunho IA", @@ -1305,94 +1305,94 @@ export const pt: MessageDict = { "admin.support.colStatus": "Estado", "admin.support.colAuto": "Auto", "admin.support.colPriority": "Prioridade", - "admin.support.colAssignee": "Atribuído", + "admin.support.colAssignee": "Atribuído", "admin.support.colCompany": "Empresa", "admin.support.colUpdated": "Atualizado", - "admin.support.colActions": "Ações", + "admin.support.colActions": "Ações", "admin.support.autoOff": "Auto desligado", "admin.support.claim": "Assumir", "admin.support.claimAria": "Assumir ticket {subject}", - "admin.support.unassigned": "Não atribuído", - "admin.support.you": "Você", - "admin.support.assigned": "Atribuído", + "admin.support.unassigned": "Não atribuído", + "admin.support.you": "Você", + "admin.support.assigned": "Atribuído", "admin.support.loadQueueFailed": "Falha ao carregar a fila de suporte", "admin.support.claimFailed": "Falha ao assumir o ticket", "admin.support.ticketFallbackTitle": "Suporte ticket", - "admin.support.ticketMeta": "{company} · {requester}", - "admin.support.ticketMetaFallback": "Thread de revisão da equipa", + "admin.support.ticketMeta": "{company} · {requester}", + "admin.support.ticketMetaFallback": "Thread de revisão da equipa", "admin.support.companyFallback": "Empresa", "admin.support.requesterFallback": "requerente", "admin.support.backQueue": "Fila", "admin.support.resolve": "Resolver", "admin.support.markPending": "Marcar pendente", "admin.support.reopen": "Reabrir", - "admin.support.assigneeLabel": "Atribuído:", - "admin.support.unassign": "Remover atribuição", - "admin.support.assignToStaff": "Atribuir à equipa", + "admin.support.assigneeLabel": "Atribuído:", + "admin.support.unassign": "Remover atribuição", + "admin.support.assignToStaff": "Atribuir à equipa", "admin.support.apply": "Aplicar", - "admin.support.autoPanelTitle": "Auto-match / assistência IA", - "admin.support.autoPanelDesc": "Resultado só para a equipa do match FAQ e rascunho/envio IA. Os clientes nunca veem rascunhos.", + "admin.support.autoPanelTitle": "Auto-match / assistência IA", + "admin.support.autoPanelDesc": "Resultado só para a equipa do match FAQ e rascunho/envio IA. Os clientes nunca veem rascunhos.", "admin.support.autoDisabledBadge": "Auto desativado", "admin.support.autoStatusLabel": "Estado:", - "admin.support.lastAttempt": "Última tentativa:", + "admin.support.lastAttempt": "Última tentativa:", "admin.support.reenableAuto": "Reativar auto", "admin.support.disableAuto": "Desativar auto neste ticket", "admin.support.aiDraftTitle": "Rascunho IA (aprovar ou editar)", - "admin.support.aiDraftDesc": "O modo só-rascunho deixou uma nota interna. Edite se necessário e envie ao cliente — ou descarte e continue manualmente.", - "admin.support.confidence": "Confiança {value}", - "admin.support.statusAfterSend": "Estado após o envio", + "admin.support.aiDraftDesc": "O modo só-rascunho deixou uma nota interna. Edite se necessário e envie ao cliente — ou descarte e continue manualmente.", + "admin.support.confidence": "Confiança {value}", + "admin.support.statusAfterSend": "Estado após o envio", "admin.support.approveSend": "Aprovar e enviar", "admin.support.discardDraft": "Descartar rascunho", - "admin.support.threadTitle": "Tópico", - "admin.support.threadMeta": "{count} · última atividade {when}", + "admin.support.threadTitle": "Tópico", + "admin.support.threadMeta": "{count} · última atividade {when}", "admin.support.messageCountOne": "{count} mensagem", "admin.support.messageCountMany": "{count} mensagens", "admin.support.replyTitle": "Responder", - "admin.support.replyDesc": "As respostas públicas notificam o cliente. As notas internas ficam só para a equipa. O estado predefinido após uma resposta pública é pendente.", - "admin.support.internalNote": "Nota interna (não visível ao cliente)", + "admin.support.replyDesc": "As respostas públicas notificam o cliente. As notas internas ficam só para a equipa. O estado predefinido após uma resposta pública é pendente.", + "admin.support.internalNote": "Nota interna (não visível ao cliente)", "admin.support.setStatus": "Definir estado", - "admin.support.statusDefault": "Predefinição", + "admin.support.statusDefault": "Predefinição", "admin.support.saveNote": "Guardar nota", "admin.support.sendReply": "Enviar resposta", "admin.support.replyAndResolve": "Responder e resolver", - "admin.support.closedBanner": "Este ticket está fechado. Reabra-o para continuar a conversa.", + "admin.support.closedBanner": "Este ticket está fechado. Reabra-o para continuar a conversa.", "admin.support.priorityMeta": "prioridade {priority}", - "admin.support.authorAiDraft": "Rascunho IA (só equipa)", + "admin.support.authorAiDraft": "Rascunho IA (só equipa)", "admin.support.authorInternal": "Nota interna", "admin.support.authorStaff": "Equipa", "admin.support.authorCustomer": "Cliente", "admin.support.flash.noteSaved": "Nota interna guardada.", "admin.support.flash.replySent": "Resposta enviada.", "admin.support.flash.resolved": "Ticket marcado como resolvido.", - "admin.support.flash.pending": "Ticket marcado como pendente (à espera do cliente).", + "admin.support.flash.pending": "Ticket marcado como pendente (à espera do cliente).", "admin.support.flash.reopened": "Ticket reaberto.", "admin.support.flash.statusSet": "Estado do ticket definido para {status}.", - "admin.support.flash.autoDisabled": "Respostas automáticas desativadas neste ticket.", - "admin.support.flash.autoEnabled": "Respostas automáticas reativadas neste ticket.", + "admin.support.flash.autoDisabled": "Respostas automáticas desativadas neste ticket.", + "admin.support.flash.autoEnabled": "Respostas automáticas reativadas neste ticket.", "admin.support.loadTicketFailed": "Falha ao carregar o ticket", "admin.support.replyFailed": "Falha ao enviar a resposta", "admin.support.statusFailed": "Falha ao atualizar o estado", - "admin.support.unassignFailed": "Falha ao remover a atribuição", + "admin.support.unassignFailed": "Falha ao remover a atribuição", "admin.support.assignFailed": "Falha ao atribuir o ticket", - "admin.support.autoFailed": "Falha ao atualizar a resposta automática", + "admin.support.autoFailed": "Falha ao atualizar a resposta automática", "admin.support.approveFailed": "Falha ao aprovar o rascunho IA", "admin.support.discardFailed": "Falha ao descartar o rascunho IA", "admin.settings.sourceResolved": "Resolvido a partir de {sources}", - "admin.settings.sourceUpdated": " · atualizado {when}", + "admin.settings.sourceUpdated": " · atualizado {when}", "admin.settings.updatedAt": "Atualizado {when}", - "admin.settings.tenantDesc": "As chaves de IA e o e-mail de marketing da empresa ficam em Integrações. Os segredos de sessão e encriptação ficam no ambiente do servidor e não se editam aqui.", - "admin.settings.perCompanyAiEmail": "IA/e-mail por empresa —", - "admin.settings.plansCredits": "Planos e créditos —", + "admin.settings.tenantDesc": "As chaves de IA e o e-mail de marketing da empresa ficam em Integrações. Os segredos de sessão e encriptação ficam no ambiente do servidor e não se editam aqui.", + "admin.settings.perCompanyAiEmail": "IA/e-mail por empresa —", + "admin.settings.plansCredits": "Planos e créditos —", "admin.settings.fromDatabase": "Da base de dados", "admin.settings.fromEnvironment": "Do ambiente", "admin.settings.sourceBadge": "Origem: {source}", "admin.settings.storedKey": "Chave guardada: {masked}", - "admin.settings.enableRole": "Ativar esta função", + "admin.settings.enableRole": "Ativar esta função", "admin.settings.clearApiKey": "Limpar chave API guardada", - "admin.settings.apiKeyKeepPlaceholder": "•••• deixe em branco para manter", - "admin.settings.apiKeyNewPlaceholder": "sk-… ou local", + "admin.settings.apiKeyKeepPlaceholder": "•••• deixe em branco para manter", + "admin.settings.apiKeyNewPlaceholder": "sk-… ou local", "admin.settings.smtpCardTitle": "Plataforma SMTP", - "admin.settings.smtpCardDesc": "Usado para convites de palavra-passe e e-mail de saída da plataforma. Resend/SMTP de marketing continua por empresa em Integrações → Email.", + "admin.settings.smtpCardDesc": "Usado para convites de palavra-passe e e-mail de saída da plataforma. Resend/SMTP de marketing continua por empresa em Integrações → Email.", "admin.settings.smtpBadgeOn": "SMTP ativado", "admin.settings.smtpBadgeOff": "SMTP desativado", "admin.settings.enableSmtp": "Ativar SMTP da plataforma", @@ -1404,83 +1404,83 @@ export const pt: MessageDict = { "admin.settings.leaveBlankKeep": "(deixe em branco para manter)", "admin.settings.storedSecret": "Segredo guardado: {masked}", "admin.settings.clearClientSecret": "Limpar segredo de cliente guardado", - "admin.settings.eprelDesc": "Dados públicos gratuitos de rótulos energéticos da UE durante o processamento. Ativo por predefinição em todos os planos — sem ativação nem upgrade pago. Use os controlos só para desativar ou afinar o cliente.", + "admin.settings.eprelDesc": "Dados públicos gratuitos de rótulos energéticos da UE durante o processamento. Ativo por predefinição em todos os planos — sem ativação nem upgrade pago. Use os controlos só para desativar ou afinar o cliente.", "admin.settings.optionalKeySaved": "Chave API opcional guardada", - "admin.settings.noApiKeyNeeded": "Não é necessária chave API", + "admin.settings.noApiKeyNeeded": "Não é necessária chave API", "admin.settings.optionalApiKey": "Chave API opcional", - "admin.settings.optionalApiKeySavedHint": "(guardado — leave blank to keep)", - "admin.settings.optionalApiKeyPublicHint": "(a API pública funciona sem ela)", + "admin.settings.optionalApiKeySavedHint": "(guardado — leave blank to keep)", + "admin.settings.optionalApiKeyPublicHint": "(a API pública funciona sem ela)", "admin.settings.clearEprelKey": "Limpar chave API EPREL guardada", - "admin.settings.pineconeDesc": "Sugestões opcionais de categoria vetorial durante o processamento. Valores do ambiente do host são usados quando estes campos ficam vazios.", + "admin.settings.pineconeDesc": "Sugestões opcionais de categoria vetorial durante o processamento. Valores do ambiente do host são usados quando estes campos ficam vazios.", "admin.settings.apiKeyConfigured": "Chave API configurada", "admin.settings.noApiKey": "Sem chave API", "admin.settings.apiKeyLabel": "Chave API", "admin.settings.clearPineconeKey": "Limpar chave API Pinecone guardada", - "admin.settings.stripeDesc": "Substituições opcionais da configuração Stripe do servidor. Prefira campos de palavra-passe; os valores não voltam a ser mostrados após guardar.", - "admin.settings.stripeMock": "Forçar modo mock Stripe (apenas não produção — desativa cobranças reais)", + "admin.settings.stripeDesc": "Substituições opcionais da configuração Stripe do servidor. Prefira campos de palavra-passe; os valores não voltam a ser mostrados após guardar.", + "admin.settings.stripeMock": "Forçar modo mock Stripe (apenas não produção — desativa cobranças reais)", "admin.settings.webhookSecret": "Segredo do webhook", "admin.settings.clearStripeSecret": "Limpar chave secreta Stripe", "admin.settings.clearStripeWebhook": "Limpar segredo de webhook Stripe", - "admin.settings.feedAllowlistDesc": "Hosts/CIDR separados por vírgulas permitidos para URL de feeds privadas.", + "admin.settings.feedAllowlistDesc": "Hosts/CIDR separados por vírgulas permitidos para URL de feeds privadas.", "admin.settings.adminsDesc": "Administradores da plataforma neste deployment", "admin.settings.onboardingTitle": "Ajudas de onboarding de admins", - "admin.settings.onboardingDesc": "Use e-mails de convite set-password para integrar utilizadores elegíveis que ainda precisam de palavra-passe.", + "admin.settings.onboardingDesc": "Use e-mails de convite set-password para integrar utilizadores elegíveis que ainda precisam de palavra-passe.", "admin.settings.sendInvites": "Enviar e-mails set-password", - "admin.settings.adminStatusBefore": "Os admins da plataforma não podem ser criados neste ecrã. Confirme o acesso na", - "admin.settings.adminStatusAfter": ", ou peça a um admin/ops existente para promover a sua conta.", + "admin.settings.adminStatusBefore": "Os admins da plataforma não podem ser criados neste ecrã. Confirme o acesso na", + "admin.settings.adminStatusAfter": ", ou peça a um admin/ops existente para promover a sua conta.", "admin.settings.loadUsersFailed": "Falha ao carregar utilizadores admin", "admin.settings.sendFailed": "Falha no envio", - "admin.settings.saveMailFailed": "Não foi possível guardar as definições de correio", - "admin.settings.smtpNotConfigured": "O SMTP não está configurado — ative e guarde primeiro as definições de correio.", + "admin.settings.saveMailFailed": "Não foi possível guardar as definições de correio", + "admin.settings.smtpNotConfigured": "O SMTP não está configurado — ative e guarde primeiro as definições de correio.", "admin.settings.smtpTestFailed": "Teste SMTP falhou", - "admin.settings.testEmailFailed": "Não foi possível enviar o e-mail de teste", - "admin.settings.saveIntegrationFailed": "Não foi possível guardar as definições de integração", - "admin.settings.aiSaved": "Definições de IA {label} guardadas. As chaves API nunca são mostradas de novo.", - "admin.settings.aiSaveFailed": "Não foi possível guardar as definições de IA {label}", - "admin.settings.aiTestOk": "{label}: ligação OK", - "admin.settings.aiTestSkipped": "{label}: ignorado — guarde credenciais (e ative a função) para testar.", - "admin.settings.aiTestFailed": "{label}: falha na ligação", - "admin.settings.aiTestError": "Não foi possível testar a ligação {label}", + "admin.settings.testEmailFailed": "Não foi possível enviar o e-mail de teste", + "admin.settings.saveIntegrationFailed": "Não foi possível guardar as definições de integração", + "admin.settings.aiSaved": "Definições de IA {label} guardadas. As chaves API nunca são mostradas de novo.", + "admin.settings.aiSaveFailed": "Não foi possível guardar as definições de IA {label}", + "admin.settings.aiTestOk": "{label}: ligação OK", + "admin.settings.aiTestSkipped": "{label}: ignorado — guarde credenciais (e ative a função) para testar.", + "admin.settings.aiTestFailed": "{label}: falha na ligação", + "admin.settings.aiTestError": "Não foi possível testar a ligação {label}", "admin.settings.aiRole.processing.label": "Processamento", - "admin.settings.aiRole.processing.desc": "Chat/completions do pipeline de produtos (títulos, descrições, enhance).", - "admin.settings.aiRole.vectorization.label": "Vetorização", - "admin.settings.aiRole.vectorization.desc": "Embeddings para pesquisa / indexação Pinecone (alinhar dimensões do índice).", + "admin.settings.aiRole.processing.desc": "Chat/completions do pipeline de produtos (títulos, descrições, enhance).", + "admin.settings.aiRole.vectorization.label": "Vetorização", + "admin.settings.aiRole.vectorization.desc": "Embeddings para pesquisa / indexação Pinecone (alinhar dimensões do índice).", "admin.settings.aiRole.docs_api.label": "Docs / API", - "admin.settings.aiRole.docs_api.desc": "Slot futuro de assistente docs/API — /docs Ask continua baseado em regras e nunca deve chamar este papel.", + "admin.settings.aiRole.docs_api.desc": "Slot futuro de assistente docs/API — /docs Ask continua baseado em regras e nunca deve chamar este papel.", "admin.settings.aiRole.support.label": "Suporte", - "admin.settings.aiRole.support.desc": "IA de fallback para auto-resposta de tickets — configure fornecedor/chave/modelo aqui; ative o envio em Conhecimento de suporte → Auto-resposta.", + "admin.settings.aiRole.support.desc": "IA de fallback para auto-resposta de tickets — configure fornecedor/chave/modelo aqui; ative o envio em Conhecimento de suporte → Auto-resposta.", "admin.settings.providerOption.openai": "OpenAI", "admin.settings.providerOption.openrouter": "OpenRouter", "admin.settings.providerOption.azure": "Azure OpenAI", "admin.settings.providerOption.ollama": "Ollama", "admin.settings.providerOption.custom": "Personalizado / outro", "admin.support.title": "Centro de suporte", - "admin.support.description": "Caixa de entrada da equipa — reivindique da fila, filtre por âmbito, abra tópicos e resolva", - "admin.support.unavailable": "A fila de suporte não está disponível. Contacte o administrador da plataforma se persistir.", - "admin.support.noTickets": "Não há tickets nesta fila.", - "admin.support.ticketNotFound": "Ticket não encontrado.", - "admin.support.notAvailable": "O suporte não está disponível neste deployment.", - "admin.support.loadFailed": "Não foi possível carregar este ticket.", + "admin.support.description": "Caixa de entrada da equipa — reivindique da fila, filtre por âmbito, abra tópicos e resolva", + "admin.support.unavailable": "A fila de suporte não está disponível. Contacte o administrador da plataforma se persistir.", + "admin.support.noTickets": "Não há tickets nesta fila.", + "admin.support.ticketNotFound": "Ticket não encontrado.", + "admin.support.notAvailable": "O suporte não está disponível neste deployment.", + "admin.support.loadFailed": "Não foi possível carregar este ticket.", "admin.support.noMessages": "Ainda sem mensagens.", - "admin.support.queueScopeAria": "Âmbito da fila", + "admin.support.queueScopeAria": "Âmbito da fila", "admin.support.statusFilterAria": "Filtro de estado", "admin.support.autoAssistFilterAria": "Filtro de autoajuda", "admin.support.searchPlaceholder": "Pesquisar assunto, e-mail ou empresa", "admin.support.searchAria": "Pesquisar tickets", - "admin.support.assignStaffAria": "Atribuir à equipa", + "admin.support.assignStaffAria": "Atribuir à equipa", "admin.support.aiDraftAria": "Rascunho IA", - "admin.support.replyPlaceholder": "Escrever uma resposta…", + "admin.support.replyPlaceholder": "Escrever uma resposta…", "admin.support.replyAria": "Corpo da resposta", "admin.knowledge.eyebrow": "Admin da plataforma", "admin.knowledge.title": "Conhecimento de suporte", - "admin.knowledge.description": "Estruture artigos de ajuda para correspondência automática de FAQ. Agentes de conteúdo preenchem corpos — mantenha os factos precisos.", - "admin.knowledge.notReady": "O conhecimento de suporte não está pronto", + "admin.knowledge.description": "Estruture artigos de ajuda para correspondência automática de FAQ. Agentes de conteúdo preenchem corpos — mantenha os factos precisos.", + "admin.knowledge.notReady": "O conhecimento de suporte não está pronto", "admin.knowledge.noTemplates": "Sem modelos de resposta", - "admin.knowledge.articleDesc": "O corpo Markdown admite imagens via carregamento seguro. Não invente factos de produto — deixe marcadores para agentes de conteúdo.", + "admin.knowledge.articleDesc": "O corpo Markdown admite imagens via carregamento seguro. Não invente factos de produto — deixe marcadores para agentes de conteúdo.", "admin.knowledge.templateDesc": "Marcadores permitidos: subject, category.", - "admin.knowledge.searchPlaceholder": "Pesquisar título, slug, palavras-chave…", + "admin.knowledge.searchPlaceholder": "Pesquisar título, slug, palavras-chave…", "admin.knowledge.searchAria": "Pesquisar artigos", - "admin.knowledge.publishFilterAria": "Filtro de estado de publicação", + "admin.knowledge.publishFilterAria": "Filtro de estado de publicação", "admin.knowledge.deleteArticleAria": "Eliminar artigo", "admin.knowledge.deleteTemplateAria": "Eliminar modelo", "admin.support.autoReplyStatus.matched": "FAQ correspondente", @@ -1495,23 +1495,23 @@ export const pt: MessageDict = { "admin.support.autoSource.ai": "Assistido por IA", "admin.support.autoSource.automated": "Automatizado", "admin.knowledge.categoriesHeading": "Categorias", - "admin.knowledge.categoriesHint": "Buckets vazios preparados para agentes de conteúdo.", + "admin.knowledge.categoriesHint": "Buckets vazios preparados para agentes de conteúdo.", "admin.knowledge.showingArticles": "A mostrar {shown} artigos (corpo carrega ao editar).", "admin.knowledge.showingArticlesOf": "A mostrar {shown} de {total} artigos (corpo carrega ao editar).", "admin.knowledge.templatesHint": "Respostas prontas com marcadores opcionais {{subject}} / {{category}}.", - "admin.knowledge.faqAutoMatchTitle": "Correspondência FAQ automática", - "admin.knowledge.faqAutoMatchDesc": "Correspondência de palavras-chave na criação do ticket. Limiar predefinido 0,78 (intervalo 0,50–0,95).", + "admin.knowledge.faqAutoMatchTitle": "Correspondência FAQ automática", + "admin.knowledge.faqAutoMatchDesc": "Correspondência de palavras-chave na criação do ticket. Limiar predefinido 0,78 (intervalo 0,50–0,95).", "admin.knowledge.aiFallbackTitle": "Fallback de IA", - "admin.knowledge.aiFallbackDesc": "Usado quando a correspondência FAQ está abaixo do limiar. As respostas usam o papel de IA da plataforma {role}.", + "admin.knowledge.aiFallbackDesc": "Usado quando a correspondência FAQ está abaixo do limiar. As respostas usam o papel de IA da plataforma {role}.", "admin.knowledge.noModel": "sem modelo", - "admin.knowledge.keyLast4": "chave …{last4}", + "admin.knowledge.keyLast4": "chave …{last4}", "admin.knowledge.sourceLabel": "origem {source}", - "admin.knowledge.apiKeyNote": "A chave API vem sempre deste papel; os overrides acima só alteram fornecedor / modelo / URL base.", - "admin.knowledge.saveAutoSettings": "Guardar definições de auto-resposta", + "admin.knowledge.apiKeyNote": "A chave API vem sempre deste papel; os overrides acima só alteram fornecedor / modelo / URL base.", + "admin.knowledge.saveAutoSettings": "Guardar definições de auto-resposta", "admin.knowledge.insertImage": "Inserir imagem", - "admin.knowledge.uploading": "A carregar…", - "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, máx. 2 MiB. Guardado em UPLOAD_DIR/support-kb (URL pública HMAC).", - "admin.knowledge.unavailableMsg": "O conhecimento de suporte não está disponível neste deployment. Contacte o administrador da plataforma.", + "admin.knowledge.uploading": "A carregar…", + "admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, máx. 2 MiB. Guardado em UPLOAD_DIR/support-kb (URL pública HMAC).", + "admin.knowledge.unavailableMsg": "O conhecimento de suporte não está disponível neste deployment. Contacte o administrador da plataforma.", "admin.knowledge.loadFailed": "Falha ao carregar o conhecimento de suporte", "admin.knowledge.loadArticleFailed": "Falha ao carregar o artigo", "admin.knowledge.loadTemplateFailed": "Falha ao carregar o modelo", @@ -1519,12 +1519,12 @@ export const pt: MessageDict = { "admin.knowledge.saveTemplateFailed": "Falha ao guardar o modelo", "admin.knowledge.deleteArticleFailed": "Falha ao eliminar o artigo", "admin.knowledge.deleteTemplateFailed": "Falha ao eliminar o modelo", - "admin.knowledge.saveAutoFailed": "Falha ao guardar as definições de auto-resposta", + "admin.knowledge.saveAutoFailed": "Falha ao guardar as definições de auto-resposta", "admin.knowledge.uploadImageFailed": "Falha ao carregar a imagem", "admin.translations.eyebrow": "Plataforma", - "admin.translations.title": "Traduções", + "admin.translations.title": "Traduções", "admin.translations.description": "Reveja a cobertura da UI do painel e edite packs de locale baseados em ficheiros.", - "admin.translations.unavailable": "Traduções indisponíveis", + "admin.translations.unavailable": "Traduções indisponíveis", "admin.translations.sourceOfTruth": "Fonte da verdade", "admin.translations.sourceOfTruthLabel": "Fonte da verdade:", "admin.translations.colLocale": "Locale", @@ -1533,137 +1533,137 @@ export const pt: MessageDict = { "admin.translations.colStatus": "Estado", "admin.translations.badgeBase": "Base", "admin.translations.badgeComplete": "Completo", - "admin.translations.badgeUnregistered": "Não registado", + "admin.translations.badgeUnregistered": "Não registado", "admin.translations.badgeGaps": "Lacunas", "admin.translations.language": "Idioma", "admin.translations.show": "Mostrar", - "admin.translations.filterMissing": "Só em falta", - "admin.translations.filterTranslated": "Só traduzidos", + "admin.translations.filterMissing": "Só em falta", + "admin.translations.filterTranslated": "Só traduzidos", "admin.translations.filterAll": "Todas as chaves", "admin.translations.search": "Pesquisar", - "admin.translations.searchPlaceholder": "Chave ou texto…", + "admin.translations.searchPlaceholder": "Chave ou texto…", "admin.translations.noKeysMatch": "Nenhuma chave corresponde", "admin.translations.badgeMissing": "Em falta", - "admin.translations.badgeUnsaved": "Não guardado", - "admin.translations.english": "Inglês", + "admin.translations.badgeUnsaved": "Não guardado", + "admin.translations.english": "Inglês", "admin.bootstrap.title": "Acesso admin bootstrap", - "admin.bootstrap.description": "Confirme se a sua conta já tem acesso de admin da plataforma. Novos admins devem ser concedidos por um administrador existente.", + "admin.bootstrap.description": "Confirme se a sua conta já tem acesso de admin da plataforma. Novos admins devem ser concedidos por um administrador existente.", "admin.bootstrap.statusTitle": "Estado de admin da plataforma", - "admin.bootstrap.statusDesc": "O acesso de admin da plataforma é concedido por um administrador existente. Não há bootstrap self-serve para esta função.", - "admin.bootstrap.alreadyAdmin": "Já tem acesso de admin da plataforma.", - "admin.bootstrap.signedInAs": "Sessão iniciada como {email}. Abra o painel admin para continuar.", - "admin.bootstrap.signedInAsShort": "Sessão iniciada como {email}", - "admin.bootstrap.notAdminTitle": "Não é admin da plataforma", - "admin.bootstrap.notAdminMsg": "A sua conta está com sessão iniciada mas não está marcada como admin da plataforma. Peça a um admin existente que conceda acesso, depois termine a sessão e inicie novamente.", + "admin.bootstrap.statusDesc": "O acesso de admin da plataforma é concedido por um administrador existente. Não há bootstrap self-serve para esta função.", + "admin.bootstrap.alreadyAdmin": "Já tem acesso de admin da plataforma.", + "admin.bootstrap.signedInAs": "Sessão iniciada como {email}. Abra o painel admin para continuar.", + "admin.bootstrap.signedInAsShort": "Sessão iniciada como {email}", + "admin.bootstrap.notAdminTitle": "Não é admin da plataforma", + "admin.bootstrap.notAdminMsg": "A sua conta está com sessão iniciada mas não está marcada como admin da plataforma. Peça a um admin existente que conceda acesso, depois termine a sessão e inicie novamente.", "admin.bootstrap.goToPanel": "Ir para o painel admin", "admin.bootstrap.loadFailed": "Falha ao carregar o perfil", - "admin.migrate.title": "Migração de organização", - "admin.migrate.description": "Esta ferramenta de migração está retirada e não altera quaisquer dados.", - "admin.migrate.notAvailable": "Não disponível", - "admin.migrate.body": "A migração de organização do fornecedor de identidade anterior já não é necessária. Empresas e auth local são geridas em Utilizadores e organizações.", - "admin.migrate.hint": "Se abriu isto a partir de um marcador antigo, continue com Utilizadores e organizações, Faturação da plataforma ou Produtos bloqueados.", - "admin.migrate.adminHome": "Início admin", + "admin.migrate.title": "Migração de organização", + "admin.migrate.description": "Esta ferramenta de migração está retirada e não altera quaisquer dados.", + "admin.migrate.notAvailable": "Não disponível", + "admin.migrate.body": "A migração de organização do fornecedor de identidade anterior já não é necessária. Empresas e auth local são geridas em Utilizadores e organizações.", + "admin.migrate.hint": "Se abriu isto a partir de um marcador antigo, continue com Utilizadores e organizações, Faturação da plataforma ou Produtos bloqueados.", + "admin.migrate.adminHome": "Início admin", "admin.migrate.users": "Utilizadores", - "admin.redirect.diagnostics": "A redirecionar para Diagnósticos…", - "admin.redirect.stuck": "A redirecionar para Produtos bloqueados…", + "admin.redirect.diagnostics": "A redirecionar para Diagnósticos…", + "admin.redirect.stuck": "A redirecionar para Produtos bloqueados…", "common.refresh": "Atualizar", "common.delete": "Eliminar", "common.clearSearch": "Limpar pesquisa", - "common.loading": "A carregar…", + "common.loading": "A carregar…", "common.never": "Nunca", "common.back": "Voltar", - "common.startOver": "Começar de novo", + "common.startOver": "Começar de novo", "common.create": "Criar", - "common.required": "Obrigatório", - "common.actions": "Ações", + "common.required": "Obrigatório", + "common.actions": "Ações", "common.status": "Estado", "common.nameCol": "Nome", "common.products": "Produtos", "common.more": "+{count} mais", "feeds.title": "Os seus feeds", - "feeds.loadingDesc": "A carregar os seus feeds de fornecedor…", - "feeds.desc": "{page} nesta página · {total} feeds no total — URL CSV/XML de fornecedor e carregamentos. Ligue a partir de Lojas para opções guiadas.", + "feeds.loadingDesc": "A carregar os seus feeds de fornecedor…", + "feeds.desc": "{page} nesta página · {total} feeds no total — URL CSV/XML de fornecedor e carregamentos. Ligue a partir de Lojas para opções guiadas.", "feeds.storesHub": "Centro de lojas", "feeds.addFeed": "Adicionar Feed", "feeds.searchPlaceholder": "Pesquisar feeds...", "feeds.emptyTitle": "Ainda sem feeds de produtos", - "feeds.emptyMessage": "Ligue um URL CSV/XML de fornecedor ou carregue um ficheiro para sincronizar produtos no seu catálogo.", + "feeds.emptyMessage": "Ligue um URL CSV/XML de fornecedor ou carregue um ficheiro para sincronizar produtos no seu catálogo.", "feeds.connectFeed": "Ligar feed", "feeds.uploadCsvCta": "Carregar CSV", "feeds.noMatchTitle": "Sem feeds correspondentes", "feeds.noMatchMessage": "Experimente outro termo de pesquisa, ou limpe a pesquisa para ver todos os feeds.", "feeds.col.source": "Origem", "feeds.col.mapping": "Mapeamento", - "feeds.col.lastData": "Última sync", + "feeds.col.lastData": "Última sync", "feeds.copyUrl": "Copiar URL", "feeds.fieldsMapped": "{count} campos", "feeds.fieldsMappedTitle": "{count} campo mapeado", "feeds.fieldsMappedTitlePlural": "{count} campos mapeados", "feeds.mappingsSaved": "Mapeamentos de campos guardados", "feeds.mapped": "Mapeado", - "feeds.notMapped": "Não mapeado", - "feeds.notMappedTitle": "Ainda sem mapeamentos de campos — abra Mapear para configurar", + "feeds.notMapped": "Não mapeado", + "feeds.notMappedTitle": "Ainda sem mapeamentos de campos — abra Mapear para configurar", "feeds.productsFromFeed": "{count} produtos deste feed", "feeds.noProductsYet": "Ainda sem produtos importados deste feed", - "feeds.syncing": "A sincronizar…", + "feeds.syncing": "A sincronizar…", "feeds.syncingShort": "A sincronizar", "feeds.syncingHint": "Pode demorar alguns minutos em feeds grandes", "feeds.liveSync": "Sync do feed", - "feeds.productData": "Dados do catálogo", + "feeds.productData": "Dados do catálogo", "feeds.mapFields": "Mapear campos", "feeds.map": "Mapear", "feeds.sync": "Sincronizar", "feeds.syncNow": "Sincronizar agora", - "feeds.syncManualTitle": "Executar uma sincronização pontual agora. A sync automática usa o intervalo definido ao editar o feed.", + "feeds.syncManualTitle": "Executar uma sincronização pontual agora. A sync automática usa o intervalo definido ao editar o feed.", "feeds.syncInProgress": "Sync em curso", "feeds.addTitle": "Adicionar Feed", - "feeds.addDesc": "Ligue um URL de feed de produtos ou carregue um CSV. Use as amostras abaixo para corresponder à estrutura esperada.", + "feeds.addDesc": "Ligue um URL de feed de produtos ou carregue um CSV. Use as amostras abaixo para corresponder à estrutura esperada.", "feeds.field.name": "Nome", "feeds.field.namePlaceholder": "O meu feed de produtos", "feeds.tab.url": "URL do feed", "feeds.tab.file": "Ficheiro CSV", "feeds.field.url": "URL do feed", - "feeds.field.urlPlaceholder": "https://…", + "feeds.field.urlPlaceholder": "https://…", "feeds.field.type": "Tipo", "feeds.field.file": "Ficheiro CSV", - "feeds.fileHint": "Máx. 5 MiB. Após criar, mapeie colunas e depois sincronize — mesmo fluxo dos feeds por URL.", - "feeds.field.interval": "Intervalo de sync automática (minutos)", - "feeds.field.intervalHint": "Com que frequência o Descrybe deve puxar este feed automaticamente enquanto estiver ativo. Use Sync na lista para um puxão pontual — isso não altera este agendamento.", + "feeds.fileHint": "Máx. 5 MiB. Após criar, mapeie colunas e depois sincronize — mesmo fluxo dos feeds por URL.", + "feeds.field.interval": "Intervalo de sync automática (minutos)", + "feeds.field.intervalHint": "Com que frequência o Descrybe deve puxar este feed automaticamente enquanto estiver ativo. Use Sync na lista para um puxão pontual — isso não altera este agendamento.", "feeds.createFeed": "Criar feed", "feeds.editTitle": "Editar Feed", - "feeds.editDesc": "Atualize nome, tipo, agendamento de sync automática ou URL de origem. Sync na lista de feeds executa um puxão pontual.", + "feeds.editDesc": "Atualize nome, tipo, agendamento de sync automática ou URL de origem. Sync na lista de feeds executa um puxão pontual.", "feeds.csvSource": "Origem CSV", "feeds.uploadedCsv": "CSV carregado", "feeds.replaceFileHint": "Para substituir o ficheiro, crie um novo feed. A sync volta a ler o carregamento guardado.", - "feeds.csvTypeLocked": "Os feeds CSV carregados mantêm o tipo CSV.", - "feeds.saveChanges": "Guardar alterações", - "feeds.historyTitle": "Histórico de sync", - "feeds.historyDesc": "Trabalhos de sync recentes de “{name}”.", - "feeds.historyLastSynced": "Última sync bem-sucedida {relative} ({absolute}).", + "feeds.csvTypeLocked": "Os feeds CSV carregados mantêm o tipo CSV.", + "feeds.saveChanges": "Guardar alterações", + "feeds.historyTitle": "Histórico de sync", + "feeds.historyDesc": "Trabalhos de sync recentes de “{name}”.", + "feeds.historyLastSynced": "Última sync bem-sucedida {relative} ({absolute}).", "feeds.historyNeverSynced": "Ainda sem sync bem-sucedida.", - "feeds.historyLoading": "A carregar histórico de sync…", + "feeds.historyLoading": "A carregar histórico de sync…", "feeds.historyEmpty": "Ainda sem trabalhos de sync.", "feeds.history.started": "Iniciado", - "feeds.history.completed": "Concluído", + "feeds.history.completed": "Concluído", "feeds.loadFailed": "Falha ao carregar feeds", - "feeds.copyFailed": "Não foi possível copiar o URL", + "feeds.copyFailed": "Não foi possível copiar o URL", "feeds.created": "Feed criado", "feeds.updated": "Feed atualizado.", "feeds.mapBeforeSync": "Mapeie os campos antes de sincronizar este feed.", "feeds.activateBeforeSync": "Ative o feed antes de sincronizar.", - "feeds.syncFinished": "Sincronização concluída", + "feeds.syncFinished": "Sincronização concluída", "feeds.viewProducts": "Ver produtos", "feeds.processing": "Processamento", - "feeds.syncFailed": "Falha na sincronização", - "feeds.statusUpdateFailed": "Não foi possível atualizar o estado", - "feeds.deleteConfirm": "Eliminar o feed “{name}”? Isto não pode ser anulado.", + "feeds.syncFailed": "Falha na sincronização", + "feeds.statusUpdateFailed": "Não foi possível atualizar o estado", + "feeds.deleteConfirm": "Eliminar o feed “{name}”? Isto não pode ser anulado.", "feeds.deleted": "Feed eliminado.", - "feeds.deleteFailed": "Não foi possível eliminar o feed", - "feeds.historyLoadFailed": "Não foi possível carregar o histórico de sync", - "feeds.ftpUnsupported": "A sync não está disponível para esta ligação de fornecedor. Carregue um ficheiro ou use um URL HTTPS do fornecedor.", - "feeds.ftpUnsupportedShort": "Sync FTP não suportada", + "feeds.deleteFailed": "Não foi possível eliminar o feed", + "feeds.historyLoadFailed": "Não foi possível carregar o histórico de sync", + "feeds.ftpUnsupported": "A sync não está disponível para esta ligação de fornecedor. Carregue um ficheiro ou use um URL HTTPS do fornecedor.", + "feeds.ftpUnsupportedShort": "Sync FTP não suportada", "feeds.ftpBadge": "FTP", - "feeds.ftpMigrateBanner": "Alguns feeds ainda usam FTP/FTPS. O Descrybe não consegue obter esses links. Mude para um URL HTTPS público, adicione um feed CSV ou carregue em Uploads.", + "feeds.ftpMigrateBanner": "Alguns feeds ainda usam FTP/FTPS. O Descrybe não consegue obter esses links. Mude para um URL HTTPS público, adicione um feed CSV ou carregue em Uploads.", "feeds.ftpUploadCta": "Ir para Uploads", "feeds.ftpHttpsCta": "Adicionar feed HTTPS", "feeds.ftpCsvCta": "Carregar feed CSV", @@ -1674,44 +1674,44 @@ export const pt: MessageDict = { "feeds.status.inactive": "Inativo", "feeds.status.error": "Erro", "feeds.status.unknown": "Desconhecido", - "feeds.actions.menu": "Ações do feed", - "feeds.actions.menuSyncing": "Ações do feed (sync em curso)", + "feeds.actions.menu": "Ações do feed", + "feeds.actions.menuSyncing": "Ações do feed (sync em curso)", "feeds.actions.editFeed": "Editar Feed", "feeds.actions.editMapping": "Editar mapeamento", "feeds.actions.syncNow": "Sincronizar agora", - "feeds.actions.syncInProgress": "Sync em curso…", + "feeds.actions.syncInProgress": "Sync em curso…", "feeds.actions.activateToSync": "Ativar feed para sincronizar", - "feeds.actions.viewHistory": "Ver histórico de sync", + "feeds.actions.viewHistory": "Ver histórico de sync", "feeds.actions.deactivate": "Desativar feed", "feeds.actions.activate": "Ativar feed", "feeds.actions.delete": "Eliminar feed", "feeds.stats.totalFeeds": "Total de feeds", - "feeds.stats.activeMapped": "{active} ativos · {mapped} mapeados", + "feeds.stats.activeMapped": "{active} ativos · {mapped} mapeados", "feeds.stats.activeOnly": "{active} ativos", "feeds.stats.totalProducts": "Produtos importados", - "feeds.stats.acrossFeeds": "Linhas em bruto (não catálogo + fila)", - "feeds.stats.processed": "No catálogo", - "feeds.stats.readyCatalog": "Linhas do catálogo — não uma parte dos importados", + "feeds.stats.acrossFeeds": "Linhas em bruto (não catálogo + fila)", + "feeds.stats.processed": "No catálogo", + "feeds.stats.readyCatalog": "Linhas do catálogo — não uma parte dos importados", "feeds.stats.unprocessed": "A aguardar processamento", - "feeds.stats.waiting": "Fila em bruto — não uma parte dos importados", + "feeds.stats.waiting": "Fila em bruto — não uma parte dos importados", "feeds.format.howTo": "Como estruturar o seu feed", - "feeds.format.required": "Obrigatório:", - "feeds.preview.title": "Pré-visualização da origem do feed", + "feeds.format.required": "Obrigatório:", + "feeds.preview.title": "Pré-visualização da origem do feed", "feeds.preview.truncated": "Truncado", - "feeds.preview.refresh": "Atualizar pré-visualização", - "feeds.preview.copy": "Copiar pré-visualização", - "feeds.preview.loading": "A carregar pré-visualização…", - "feeds.preview.empty": "Extraia o esquema para pré-visualizar a origem do feed.", - "feeds.schema.search": "Pesquisar campos…", + "feeds.preview.refresh": "Atualizar pré-visualização", + "feeds.preview.copy": "Copiar pré-visualização", + "feeds.preview.loading": "A carregar pré-visualização…", + "feeds.preview.empty": "Extraia o esquema para pré-visualizar a origem do feed.", + "feeds.schema.search": "Pesquisar campos…", "feeds.schema.fieldName": "Nome do campo", "feeds.schema.sourcePath": "Caminho de origem", "feeds.schema.confirm": "Confirmar", "feeds.schema.apply": "Aplicar", "feeds.preflight.missingItemPath": "Selecione um caminho de elemento de produto antes de sincronizar.", "feeds.preflight.emptyMappings": "Mapeie pelo menos um campo de origem antes de sincronizar.", - "feeds.preflight.missingRequired": "Mapeie os campos obrigatórios antes de sincronizar: {fields}.", - "feeds.preflight.unknownSource": "Algumas origens mapeadas não foram encontradas no esquema extraído: {fields}{more}. Volte a extrair ou corrija caminhos antes de confiar nos valores de amostra.", - "feeds.preflight.emptySample": "Os campos obrigatórios têm valores de amostra vazios: {fields}. Verifique as colunas de origem antes de uma sync completa.", + "feeds.preflight.missingRequired": "Mapeie os campos obrigatórios antes de sincronizar: {fields}.", + "feeds.preflight.unknownSource": "Algumas origens mapeadas não foram encontradas no esquema extraído: {fields}{more}. Volte a extrair ou corrija caminhos antes de confiar nos valores de amostra.", + "feeds.preflight.emptySample": "Os campos obrigatórios têm valores de amostra vazios: {fields}. Verifique as colunas de origem antes de uma sync completa.", "feeds.preflight.fix": "Corrija os mapeamentos de campos antes de sincronizar.", "mapping.title": "Mapeamento de Feed", "mapping.titleNamed": "Mapear: {name}", @@ -1724,112 +1724,112 @@ export const pt: MessageDict = { "mapping.ftpUploadCta": "Ir para Uploads", "mapping.ftpHttpsCta": "Adicionar feed HTTPS", "mapping.ftpCsvCta": "Carregar feed CSV", - "mapping.loading": "A carregar detalhes do feed…", + "mapping.loading": "A carregar detalhes do feed…", "mapping.step1": "Selecionar elemento de produto", "mapping.step2": "Mapear campos", "mapping.step1Heading": "Passo 1: Selecionar elemento de produto", - "mapping.csvHint": "Os feeds CSV usam cabeçalhos de coluna como campos de origem. Extraia o esquema para carregar as colunas e depois continue para as mapear.", + "mapping.csvHint": "Os feeds CSV usam cabeçalhos de coluna como campos de origem. Extraia o esquema para carregar as colunas e depois continue para as mapear.", "mapping.howToSelect": "Como selecionar o elemento de produto:", "mapping.howToHint": "Guia opcional", - "mapping.howTo.1": "Extraia o esquema ou clique numa etiqueta repetida na pré-visualização", - "mapping.howTo.2": "Cada elemento deve conter os detalhes de um único produto", + "mapping.howTo.1": "Extraia o esquema ou clique numa etiqueta repetida na pré-visualização", + "mapping.howTo.2": "Cada elemento deve conter os detalhes de um único produto", "mapping.howTo.3": "Confirme o caminho (por exemplo", "mapping.howTo.4": "Continue para mapear os campos de origem para os campos de produto", "mapping.productElementPath": "Caminho do elemento de produto", "mapping.pathPlaceholder": "ex. rss/channel/item ou products/product", - "mapping.continue": "Continuar →", - "mapping.continueFields": "Continuar para o mapeamento de campos →", + "mapping.continue": "Continuar →", + "mapping.continueFields": "Continuar para o mapeamento de campos →", "mapping.discovered": "Detetados {fields} campos de origem a partir de {rows} linha(s) de amostra.", - "mapping.suggestionsCount": "· {count} sugestão(ões) de mapeamento automático", + "mapping.suggestionsCount": "· {count} sugestão(ões) de mapeamento automático", "mapping.step2Heading": "Passo 2: Mapear campos", - "mapping.requiredFieldsBadge": "{count} campos obrigatórios", - "mapping.unmappedRequired": "{count} obrigatório(s) por mapear", + "mapping.requiredFieldsBadge": "{count} campos obrigatórios", + "mapping.unmappedRequired": "{count} obrigatório(s) por mapear", "mapping.sourceFieldsBadge": "{count} campos de origem", "mapping.suggestedBadge": "{count} sugerido(s)", - "mapping.step2Help": "Mapeie colunas de origem ou nós XPath para os seus campos de produto. Os campos obrigatórios estão marcados com *. Passe o rato sobre o ícone de ajuda para uma dica rápida do glossário.", - "mapping.requiredFields": "Campos obrigatórios", - "mapping.requiredMapped": "· {mapped}/{total} mapeados", - "mapping.requiredProgressDone": "Todos os campos obrigatórios mapeados — pronto para o passo seguinte.", + "mapping.step2Help": "Mapeie colunas de origem ou nós XPath para os seus campos de produto. Os campos obrigatórios estão marcados com *. Passe o rato sobre o ícone de ajuda para uma dica rápida do glossário.", + "mapping.requiredFields": "Campos obrigatórios", + "mapping.requiredMapped": "· {mapped}/{total} mapeados", + "mapping.requiredProgressDone": "Todos os campos obrigatórios mapeados — pronto para o passo seguinte.", "mapping.requiredProgressHint": "Os campos marcados com * devem ser mapeados antes de este feed poder sincronizar produtos.", - "mapping.requiredProgressAria": "Progresso dos campos obrigatórios: {mapped} de {total} mapeados", + "mapping.requiredProgressAria": "Progresso dos campos obrigatórios: {mapped} de {total} mapeados", "mapping.nextAfterSaveReady": "Mappings saved. Next, sync a small sample to check products look right.", "mapping.nextAfterSaveIncomplete": "Mappings saved. Finish the remaining required fields, then sync a sample.", "mapping.nextCtaSyncSample": "Sync + process sample", "mapping.nextCtaFinishRequired": "Show missing required fields", - "mapping.highConfidence": "{count} mapeamento de alta confiança pronto", - "mapping.highConfidencePlural": "{count} mapeamentos de alta confiança prontos", - "mapping.highConfidenceHelp": "Correspondências exatas e de alias (por exemplo EAN → GTIN). Aplique todas, ou aceite chips por linha na tabela.", + "mapping.highConfidence": "{count} mapeamento de alta confiança pronto", + "mapping.highConfidencePlural": "{count} mapeamentos de alta confiança prontos", + "mapping.highConfidenceHelp": "Correspondências exatas e de alias (por exemplo EAN → GTIN). Aplique todas, ou aceite chips por linha na tabela.", "mapping.reviewMappings": "Rever mapeamentos", "mapping.needItemPath": "Introduza um caminho de elemento de produto antes de mapear campos.", "mapping.removeMapping": "Remover mapeamento", "mapping.sourcePlaceholder": "nome da coluna ou xpath", - "mapping.processAfterSync": "Produtos a processar após a sincronização", - "mapping.noFuzzyLeft": "Não restam correspondências aproximadas para confirmar.", + "mapping.processAfterSync": "Produtos a processar após a sincronização", + "mapping.noFuzzyLeft": "Não restam correspondências aproximadas para confirmar.", "mapping.syncedQueued": "Feed sincronizado e {queued} produto(s) colocado(s) na fila para processamento{jobId}.", "mapping.saveMappings": "Guardar mapeamentos", "mapping.syncProcessSample": "Sincronizar + processar amostra", "mapping.badgeCsv": "CSV", - "mapping.requiredAria": "Ajuda dos campos obrigatórios", - "mapping.applySuggestions": "Aplicar sugestões ({count})", + "mapping.requiredAria": "Ajuda dos campos obrigatórios", + "mapping.applySuggestions": "Aplicar sugestões ({count})", "mapping.confirmFuzzy": "Confirmar aproximados ({count})", - "mapping.fuzzyNeedConfirm": "{count} correspondência aproximada precisa de confirmação", - "mapping.fuzzyNeedConfirmPlural": "{count} correspondências aproximadas precisam de confirmação", - "mapping.fuzzyHelp": "As correspondências de nome com baixa confiança não são aplicadas automaticamente. Confirme aqui ou aceite por linha na tabela.", - "mapping.missingRequiredTitle": "Os campos obrigatórios ainda precisam de um mapeamento de origem:", - "mapping.applyTip": "Dica: aplique as sugestões acima — muitos campos obrigatórios correspondem a nomes de origem comuns.", + "mapping.fuzzyNeedConfirm": "{count} correspondência aproximada precisa de confirmação", + "mapping.fuzzyNeedConfirmPlural": "{count} correspondências aproximadas precisam de confirmação", + "mapping.fuzzyHelp": "As correspondências de nome com baixa confiança não são aplicadas automaticamente. Confirme aqui ou aceite por linha na tabela.", + "mapping.missingRequiredTitle": "Os campos obrigatórios ainda precisam de um mapeamento de origem:", + "mapping.applyTip": "Dica: aplique as sugestões acima — muitos campos obrigatórios correspondem a nomes de origem comuns.", "mapping.formatLabel": "Formato:", "mapping.itemPathLabel": "Caminho do item:", "mapping.reExtract": "Reextrair", "mapping.manualRows": "Linhas manuais", "mapping.schemaTable": "Tabela de esquema", "mapping.addField": "Adicionar campo", - "mapping.noSchemaYet": "Ainda não há esquema extraído.", + "mapping.noSchemaYet": "Ainda não há esquema extraído.", "mapping.orManualRows": "ou use as linhas manuais abaixo.", "mapping.sourceField": "Campo de origem", - "mapping.selectSource": "Selecionar origem…", + "mapping.selectSource": "Selecionar origem…", "mapping.mapsTo": "Mapeia para", "mapping.none": "Nenhum", - "mapping.backToItem": "← Voltar à seleção de item", - "mapping.unsaved": "Alterações por guardar", - "mapping.requiredFieldsColon": "Campos obrigatórios:", - "mapping.sampleOptions": "Opções de amostra", + "mapping.backToItem": "← Voltar à seleção de item", + "mapping.unsaved": "Alterações por guardar", + "mapping.requiredFieldsColon": "Campos obrigatórios:", + "mapping.sampleOptions": "Opções de amostra", "mapping.sampleSize": "Tamanho da amostra", - "mapping.noExactAlias": "Não há sugestões exatas/de alias para aplicar. Reveja as correspondências aproximadas abaixo.", - "mapping.noSuggestionsExtract": "Sem sugestões — extraia primeiro o esquema.", - "mapping.schemaExtracted": "Esquema extraído: {fields} campos a partir de {rows} linha(s) de amostra.", + "mapping.noExactAlias": "Não há sugestões exatas/de alias para aplicar. Reveja as correspondências aproximadas abaixo.", + "mapping.noSuggestionsExtract": "Sem sugestões — extraia primeiro o esquema.", + "mapping.schemaExtracted": "Esquema extraído: {fields} campos a partir de {rows} linha(s) de amostra.", "mapping.saved": "Mapeamentos de campos guardados{version}.", "mapping.savedVersion": " (v{version})", - "mapping.syncNoProducts": "Sincronização concluída; sem produtos para processar.", + "mapping.syncNoProducts": "Sincronização concluída; sem produtos para processar.", "mapping.jobSuffix": " (tarefa {jobId})", "mapping.appliedReplace": "Aplicado(s) {count} mapeamento(s) {kind}.", "mapping.appliedNew": "Aplicado(s) {count} novo(s) mapeamento(s) {kind} ({total} no total).", - "mapping.kindHighConfidence": "de alta confiança", + "mapping.kindHighConfidence": "de alta confiança", "mapping.kindFuzzy": "aproximado", - "mapping.fuzzyConfirmFlash": "{count} correspondência aproximada precisa de confirmação — use Confirmar aproximados abaixo ou chips por linha.", - "mapping.fuzzyConfirmFlashPlural": "{count} correspondências aproximadas precisam de confirmação — use Confirmar aproximados abaixo ou chips por linha.", + "mapping.fuzzyConfirmFlash": "{count} correspondência aproximada precisa de confirmação — use Confirmar aproximados abaixo ou chips por linha.", + "mapping.fuzzyConfirmFlashPlural": "{count} correspondências aproximadas precisam de confirmação — use Confirmar aproximados abaixo ou chips por linha.", "mapping.formatHelp.title": "Como estruturar o seu feed", - "mapping.formatHelp.required": "Obrigatório:", + "mapping.formatHelp.required": "Obrigatório:", "mapping.formatHelp.requiredBody": "{gtin} (EAN/UPC), {title} (ou {name}), {brand}", - "mapping.formatHelp.https": "Use URLs HTTPS públicas para feeds remotos (não FTP nem localhost). O carregamento de CSV funciona para ficheiros locais.", - "mapping.formatHelp.specs": "Especificações como pares Etiqueta: valor (ex. {ram}). Dimensões: {height}, {width}, {depth}, {mass}", - "mapping.formatHelp.also": "Também suportado: preços, stock, imagens, categoria, garantia, ID EPREL, descrições HTML, imagens extra, URL de vídeo e mais — descarregue a amostra completa.", + "mapping.formatHelp.https": "Use URLs HTTPS públicas para feeds remotos (não FTP nem localhost). O carregamento de CSV funciona para ficheiros locais.", + "mapping.formatHelp.specs": "Especificações como pares Etiqueta: valor (ex. {ram}). Dimensões: {height}, {width}, {depth}, {mass}", + "mapping.formatHelp.also": "Também suportado: preços, stock, imagens, categoria, garantia, ID EPREL, descrições HTML, imagens extra, URL de vídeo e mais — descarregue a amostra completa.", "mapping.formatHelp.downloadXml": "Descarregar amostra XML", "mapping.formatHelp.downloadCsv": "Descarregar amostra CSV", "mapping.formatHelp.xmlExample": "Exemplo XML", - "mapping.formatHelp.csvExample": "Exemplo CSV (cabeçalho + linhas)", - "mapping.sourcePreview.title": "Pré-visualização da origem do feed", + "mapping.formatHelp.csvExample": "Exemplo CSV (cabeçalho + linhas)", + "mapping.sourcePreview.title": "Pré-visualização da origem do feed", "mapping.sourcePreview.truncated": "Truncado", - "mapping.sourcePreview.refresh": "Atualizar pré-visualização", - "mapping.sourcePreview.copy": "Copiar pré-visualização", - "mapping.sourcePreview.loading": "A carregar amostra do feed…", - "mapping.sourcePreview.errorHint": "Ainda pode introduzir manualmente o caminho do elemento de produto. Extraia o esquema quando o URL do feed estiver acessível.", + "mapping.sourcePreview.refresh": "Atualizar pré-visualização", + "mapping.sourcePreview.copy": "Copiar pré-visualização", + "mapping.sourcePreview.loading": "A carregar amostra do feed…", + "mapping.sourcePreview.errorHint": "Ainda pode introduzir manualmente o caminho do elemento de produto. Extraia o esquema quando o URL do feed estiver acessível.", "mapping.sourcePreview.retry": "Tentar novamente", - "mapping.sourcePreview.empty": "Ainda sem pré-visualização", - "mapping.sourcePreview.emptyHintXml": "Clique em “Extrair esquema” para descarregar uma amostra e descobrir campos, ou introduza um caminho de item manualmente.", - "mapping.sourcePreview.emptyHintCsv": "Clique em “Extrair esquema” para descarregar uma amostra e descobrir campos.", + "mapping.sourcePreview.empty": "Ainda sem pré-visualização", + "mapping.sourcePreview.emptyHintXml": "Clique em “Extrair esquema” para descarregar uma amostra e descobrir campos, ou introduza um caminho de item manualmente.", + "mapping.sourcePreview.emptyHintCsv": "Clique em “Extrair esquema” para descarregar uma amostra e descobrir campos.", "mapping.sourcePreview.selectPath": "Selecionar caminho: {path}", "mapping.sourcePreview.clickTag": "Clique numa linha de etiqueta para definir o caminho do elemento de produto.", - "mapping.table.search": "Pesquisar campos…", + "mapping.table.search": "Pesquisar campos…", "mapping.table.all": "Todos os campos", "mapping.table.mapped": "Mapeado", "mapping.table.unmapped": "Por mapear", @@ -1839,27 +1839,27 @@ export const pt: MessageDict = { "mapping.table.type": "Tipo", "mapping.table.mapTo": "Mapear para", "mapping.table.emptySchema": "Extraia o esquema do feed para preencher os campos de origem, ou adicione mapeamentos manualmente.", - "mapping.table.noMatch": "Nenhum campo corresponde aos seus critérios.", - "mapping.table.unique": "{count} único(s)", + "mapping.table.noMatch": "Nenhum campo corresponde aos seus critérios.", + "mapping.table.unique": "{count} único(s)", "mapping.table.nested": "aninhado", "mapping.table.apply": "Aplicar", "mapping.table.confirm": "Confirmar", - "mapping.table.suggestedMatch": "Correspondência sugerida {confidence}", - "mapping.table.confirmFuzzyMatch": "Confirmar correspondência aproximada ({percent}%)", - "mapping.preview.title": "Pré-visualização do mapeamento", + "mapping.table.suggestedMatch": "Correspondência sugerida {confidence}", + "mapping.table.confirmFuzzyMatch": "Confirmar correspondência aproximada ({percent}%)", + "mapping.preview.title": "Pré-visualização do mapeamento", "mapping.preview.subtitle": "Forma de produto de amostra a partir dos seus mapeamentos de campos atuais", - "mapping.preview.usingSamples": "· a usar amostras extraídas", + "mapping.preview.usingSamples": "· a usar amostras extraídas", "mapping.preview.formatCsv": "formato: csv", "mapping.preview.item": "item: {path}", - "mapping.preview.sourceFields": "· {count} campos de origem", + "mapping.preview.sourceFields": "· {count} campos de origem", "mapping.preview.empty": "Ainda sem campos mapeados", - "mapping.preview.emptyHint": "Mapeie colunas de origem ou nós XPath para campos de produto. Uma pré-visualização de produto de amostra aparecerá aqui.", + "mapping.preview.emptyHint": "Mapeie colunas de origem ou nós XPath para campos de produto. Uma pré-visualização de produto de amostra aparecerá aqui.", "mapping.preview.rawSample": "Fragmento de amostra em bruto", "imports.title": "Carregamentos", - "imports.description": "Importações CSV guardadas neste espaço de trabalho — produtos, categorias e atributos.", + "imports.description": "Importações CSV guardadas neste espaço de trabalho — produtos, categorias e atributos.", "imports.importProducts": "Importar produtos", "imports.emptyTitle": "Ainda sem carregamentos", - "imports.emptyMessage": "As importações CSV de produtos, categorias e atributos aparecem aqui após o carregamento.", + "imports.emptyMessage": "As importações CSV de produtos, categorias e atributos aparecem aqui após o carregamento.", "imports.goProducts": "Ir para produtos", "imports.categories": "Categorias", "imports.recent": "Carregamentos recentes", @@ -1869,332 +1869,332 @@ export const pt: MessageDict = { "imports.col.kind": "Tipo", "imports.col.uploaded": "Carregado", "imports.col.size": "Tamanho", - "imports.actions": "Ações de carregamento", + "imports.actions": "Ações de carregamento", "imports.loadFailed": "Falha ao carregar carregamentos", - "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", + "imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.", "imports.metadataOnlyBadge": "Metadata only (blob not migrated)", - "imports.deleteConfirm": "Eliminar “{name}”? Isto remove o registo de carregamento (e o blob local, se existir).", + "imports.deleteConfirm": "Eliminar “{name}”? Isto remove o registo de carregamento (e o blob local, se existir).", "imports.deleted": "Carregamento eliminado.", - "imports.deleteFailed": "Não foi possível eliminar o carregamento", + "imports.deleteFailed": "Não foi possível eliminar o carregamento", "imports.status.uploaded": "Carregado", - "reviews.redirectLoading": "A abrir avaliações WooCommerce…", - "reviews.tab": "Avaliações", - "reviews.syncTitle": "Importação de avaliações (loja → Descrybe)", - "reviews.syncDesc": "Importação de entrada — trazer avaliações de produtos WooCommerce para o Descrybe para campanhas e reputação", - "reviews.syncQueued": "Sync de avaliações em fila", - "reviews.statusBadge": "Avaliações: {status}", + "reviews.redirectLoading": "A abrir avaliações WooCommerce…", + "reviews.tab": "Avaliações", + "reviews.syncTitle": "Importação de avaliações (loja → Descrybe)", + "reviews.syncDesc": "Importação de entrada — trazer avaliações de produtos WooCommerce para o Descrybe para campanhas e reputação", + "reviews.syncQueued": "Sync de avaliações em fila", + "reviews.statusBadge": "Avaliações: {status}", "reviews.syncedCount": "{count} sincronizados", - "reviews.lastSync": "Última sync: {date}", - "reviews.noSyncYet": "Ainda não foi concluída nenhuma sync de avaliações.", - "reviews.needsReconnect": "A importação de avaliações não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", - "reviews.queueImport": "Colocar importação de avaliações na fila (loja → Descrybe)", + "reviews.lastSync": "Última sync: {date}", + "reviews.noSyncYet": "Ainda não foi concluída nenhuma sync de avaliações.", + "reviews.needsReconnect": "A importação de avaliações não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", + "reviews.queueImport": "Colocar importação de avaliações na fila (loja → Descrybe)", "reviews.queueing": "A colocar na fila...", - "reviews.saveTestFirst": "Guarde as credenciais e teste a ligação antes de sincronizar", + "reviews.saveTestFirst": "Guarde as credenciais e teste a ligação antes de sincronizar", "reviews.refreshList": "Atualizar lista", - "reviews.loading": "A carregar avaliações…", - "reviews.emptyTitle": "Ainda sem avaliações", - "reviews.emptyMessage": "Coloque na fila uma sincronização de avaliações após ligar a loja. Este separador continua utilizável com lista vazia.", + "reviews.loading": "A carregar avaliações…", + "reviews.emptyTitle": "Ainda sem avaliações", + "reviews.emptyMessage": "Coloque na fila uma sincronização de avaliações após ligar a loja. Este separador continua utilizável com lista vazia.", "reviews.col.product": "Produto", "reviews.col.reviewer": "Avaliador", - "reviews.col.rating": "Classificação", + "reviews.col.rating": "Classificação", "reviews.col.review": "Rever", - "reviews.queuedSuccess": "Sincronização de avaliações em fila. Será executada em breve.", - "reviews.queueFailed": "Não foi possível colocar a sincronização de avaliações na fila", + "reviews.queuedSuccess": "Sincronização de avaliações em fila. Será executada em breve.", + "reviews.queueFailed": "Não foi possível colocar a sincronização de avaliações na fila", "campaigns.title": "Campanhas", - "campaigns.description": "Crie campanhas de e-mail sazonais a partir do seu catálogo — escolha uma estação, selecione produtos, defina o público e gere.", + "campaigns.description": "Crie campanhas de e-mail sazonais a partir do seu catálogo — escolha uma estação, selecione produtos, defina o público e gere.", "campaigns.new": "Nova campanha", - "campaigns.loading": "A carregar campanhas…", + "campaigns.loading": "A carregar campanhas…", "campaigns.loadFailed": "Falha ao carregar campanhas", - "campaigns.deleteConfirm": "Eliminar a campanha “{name}”? Isto não pode ser anulado.", + "campaigns.deleteConfirm": "Eliminar a campanha “{name}”? Isto não pode ser anulado.", "campaigns.deleted": "Campanha eliminada", "campaigns.deleteFailed": "Falha ao eliminar a campanha", - "campaigns.partialUnavailable": "As campanhas não estão totalmente acessíveis neste momento. Gerar e enviar podem falhar até o serviço voltar.", - "campaigns.searchPlaceholder": "Pesquisar campanhas…", - "campaigns.unavailableTitle": "Campanhas indisponíveis", - "campaigns.unavailableMessage": "O serviço de campanhas não está acessível. Pode abrir o assistente, mas gerar e enviar aguardam o regresso do serviço.", - "campaigns.openWizard": "Abrir assistente de criação", + "campaigns.partialUnavailable": "As campanhas não estão totalmente acessíveis neste momento. Gerar e enviar podem falhar até o serviço voltar.", + "campaigns.searchPlaceholder": "Pesquisar campanhas…", + "campaigns.unavailableTitle": "Campanhas indisponíveis", + "campaigns.unavailableMessage": "O serviço de campanhas não está acessível. Pode abrir o assistente, mas gerar e enviar aguardam o regresso do serviço.", + "campaigns.openWizard": "Abrir assistente de criação", "campaigns.backDashboard": "Voltar ao painel", "campaigns.browseProducts": "Explorar produtos", "campaigns.emptyTitle": "Ainda sem campanhas", - "campaigns.noMatches": "Sem correspondências", - "campaigns.emptyMessage": "Crie uma campanha de Black Friday, Natal ou personalizada em poucos passos — predefinições sazonais estão prontas para começar.", - "campaigns.noMatchesMessage": "Tente outro nome, época ou estado.", + "campaigns.noMatches": "Sem correspondências", + "campaigns.emptyMessage": "Crie uma campanha de Black Friday, Natal ou personalizada em poucos passos — predefinições sazonais estão prontas para começar.", + "campaigns.noMatchesMessage": "Tente outro nome, época ou estado.", "campaigns.create": "Criar campanha", - "campaigns.col.season": "Época", + "campaigns.col.season": "Época", "campaigns.col.updated": "Atualizado", "campaigns.scheduled": "Agendado {date}", "campaigns.newTitle": "Nova campanha", - "campaigns.newDesc": "Escolha uma estação, selecione produtos e público, escreva o prompt e depois gere, teste e agende.", + "campaigns.newDesc": "Escolha uma estação, selecione produtos e público, escreva o prompt e depois gere, teste e agende.", "campaigns.editTitle": "Editar campanha", - "campaigns.editDesc": "Atualize a estação, os produtos e o público — depois regenere, envie um teste ou agende.", - "campaignWizard.loading": "A carregar assistente de campanha…", - "campaignWizard.apiMissing": "A API de campanhas está temporariamente indisponível. Pode explorar o assistente; guardar / gerar / enviar precisam de /api/campaigns acessível.", - "campaignWizard.upgradeTitle": "As campanhas de IA são uma funcionalidade paga", - "campaignWizard.upgradeMessage": "Os planos Free podem preparar estações e públicos, mas Gerar IA requer Starter ou superior. Atualize para desbloquear rascunhos de e-mail IA.", + "campaigns.editDesc": "Atualize a estação, os produtos e o público — depois regenere, envie um teste ou agende.", + "campaignWizard.loading": "A carregar assistente de campanha…", + "campaignWizard.apiMissing": "A API de campanhas está temporariamente indisponível. Pode explorar o assistente; guardar / gerar / enviar precisam de /api/campaigns acessível.", + "campaignWizard.upgradeTitle": "As campanhas de IA são uma funcionalidade paga", + "campaignWizard.upgradeMessage": "Os planos Free podem preparar estações e públicos, mas Gerar IA requer Starter ou superior. Atualize para desbloquear rascunhos de e-mail IA.", "campaignWizard.comparePlans": "Comparar planos", - "campaignWizard.step.season": "Época", + "campaignWizard.step.season": "Época", "campaignWizard.step.catalog": "Produtos", - "campaignWizard.step.audience": "Público", + "campaignWizard.step.audience": "Público", "campaignWizard.step.prompt": "Prompt", - "campaignWizard.step.preview": "Pré-visualização", + "campaignWizard.step.preview": "Pré-visualização", "campaignWizard.step.send": "Enviar", - "campaignWizard.pickSeason": "Escolha uma estação", - "campaignWizard.pickSeasonHelp": "Comece a partir de um modelo — pode editar tudo depois.", + "campaignWizard.pickSeason": "Escolha uma estação", + "campaignWizard.pickSeasonHelp": "Comece a partir de um modelo — pode editar tudo depois.", "campaignWizard.name": "Nome da campanha", "campaignWizard.namePlaceholder": "Black Friday 2026", "campaignWizard.catalogTitle": "Categorias e produtos", - "campaignWizard.catalogHelp": "Selecione o que este e-mail deve destacar. Só categorias bastam para um início rápido.", + "campaignWizard.catalogHelp": "Selecione o que este e-mail deve destacar. Só categorias bastam para um início rápido.", "campaignWizard.categories": "Categorias", - "campaignWizard.noCategories": "Ainda sem categorias — adicione algumas em Catálogo.", + "campaignWizard.noCategories": "Ainda sem categorias — adicione algumas em Catálogo.", "campaignWizard.categoriesSelected": "{count} categoria selecionada", "campaignWizard.categoriesSelectedPlural": "{count} categorias selecionadas", "campaignWizard.productsOptional": "Produtos (opcional)", "campaignWizard.selectedCount": "{count} selecionados", - "campaignWizard.searchProducts": "Pesquisar produtos…", - "campaignWizard.noProducts": "Não foram encontrados produtos.", + "campaignWizard.searchProducts": "Pesquisar produtos…", + "campaignWizard.noProducts": "Não foram encontrados produtos.", "campaignWizard.audienceTitle": "Quem deve receber isto?", - "campaignWizard.audienceHelp": "Por predefinição a todos. Restrinja com categorias ou compradores anteriores quando as encomendas estiverem sync.", + "campaignWizard.audienceHelp": "Por predefinição a todos. Restrinja com categorias ou compradores anteriores quando as encomendas estiverem sync.", "campaignWizard.audience.all": "Todos os contactos", "campaignWizard.audience.allHint": "Enviar para a lista completa (quando o fornecedor de e-mail estiver configurado).", "campaignWizard.audience.byCategory": "Por interesse de categoria", - "campaignWizard.audience.byCategoryHint": "Pessoas associadas às categorias selecionadas.", + "campaignWizard.audience.byCategoryHint": "Pessoas associadas às categorias selecionadas.", "campaignWizard.audience.purchased": "Comprado na categoria", - "campaignWizard.audience.purchasedHint": "Clientes que compraram produtos nas categorias de público (de encomendas sync).", - "campaignWizard.audience.notPurchased": "Ainda não comprado", - "campaignWizard.audience.notPurchasedHint": "Contactos que não compraram essas categorias — ótimo para reconquista.", - "campaignWizard.ordersHint": "A segmentação comprado / não comprado aparece após sync de encomendas WooCommerce.", - "campaignWizard.audienceCategories": "Categorias de público", + "campaignWizard.audience.purchasedHint": "Clientes que compraram produtos nas categorias de público (de encomendas sync).", + "campaignWizard.audience.notPurchased": "Ainda não comprado", + "campaignWizard.audience.notPurchasedHint": "Contactos que não compraram essas categorias — ótimo para reconquista.", + "campaignWizard.ordersHint": "A segmentação comprado / não comprado aparece após sync de encomendas WooCommerce.", + "campaignWizard.audienceCategories": "Categorias de público", "campaignWizard.promptTitle": "Prompt de e-mail", - "campaignWizard.promptHelp": "Preenchemos um padrão sólido para {season}. Edite à vontade ou mantenha.", - "campaignWizard.promptSeasonFallback": "esta estação", + "campaignWizard.promptHelp": "Preenchemos um padrão sólido para {season}. Edite à vontade ou mantenha.", + "campaignWizard.promptSeasonFallback": "esta estação", "campaignWizard.useDefaultPrompt": "Usar prompt sazonal predefinido", "campaignWizard.promptLabel": "Prompt", - "campaignWizard.advanced": "Opções avançadas", - "campaignWizard.advancedHelp": "A geração IA usa o kit de marca (se definido) e os produtos selecionados. A pré-visualização só de modelo ignora a IA e serve de esboço de layout.", - "campaignWizard.planFree": "Grátis", + "campaignWizard.advanced": "Opções avançadas", + "campaignWizard.advancedHelp": "A geração IA usa o kit de marca (se definido) e os produtos selecionados. A pré-visualização só de modelo ignora a IA e serve de esboço de layout.", + "campaignWizard.planFree": "Grátis", "campaignWizard.planPaid": "Pago", "campaignWizard.planLine": "Plano:", - "campaignWizard.aiLocked": "— Gerar IA está bloqueado.", + "campaignWizard.aiLocked": "— Gerar IA está bloqueado.", "campaignWizard.generateAi": "Gerar IA", - "campaignWizard.templatePreview": "Pré-visualização do modelo", + "campaignWizard.templatePreview": "Pré-visualização do modelo", "campaignWizard.saveDraft": "Guardar rascunho", - "campaignWizard.previewTitle": "Pré-visualização", + "campaignWizard.previewTitle": "Pré-visualização", "campaignWizard.status": "Estado:", "campaignWizard.generateToSee": "Gere um rascunho para ver o corpo do e-mail.", - "campaignWizard.noPreview": "Ainda sem pré-visualização. Volte a Prompt e execute Gerar IA ou Pré-visualização do modelo.", + "campaignWizard.noPreview": "Ainda sem pré-visualização. Volte a Prompt e execute Gerar IA ou Pré-visualização do modelo.", "campaignWizard.backToPrompt": "Voltar ao prompt", "campaignWizard.subject": "Assunto", - "campaignWizard.emailPreview": "Pré-visualização do e-mail", + "campaignWizard.emailPreview": "Pré-visualização do e-mail", "campaignWizard.regenerateAi": "Regenerar com IA", "campaignWizard.regenerate": "Regenerar", "campaignWizard.continueSend": "Continuar para enviar", "campaignWizard.testSend": "Envio de teste", - "campaignWizard.testSendHelp": "Envie uma cópia a si próprio antes de agendar.", + "campaignWizard.testSendHelp": "Envie uma cópia a si próprio antes de agendar.", "campaignWizard.testEmail": "E-mail de teste", "campaignWizard.testEmailPlaceholder": "voce@empresa.com", "campaignWizard.sendTest": "Enviar teste", "campaignWizard.scheduleTitle": "Agendar", "campaignWizard.scheduleHelp": "Escolha quando esta campanha deve sair.", - "campaignWizard.sendAt": "Enviar às", + "campaignWizard.sendAt": "Enviar às", "campaignWizard.schedule": "Agendar campanha", "campaignWizard.generateToContinue": "Gere para continuar", - "campaignWizard.done": "Concluído", + "campaignWizard.done": "Concluído", "campaignWizard.loadFailed": "Falha ao carregar o assistente", "campaignWizard.pickCatalog": "Escolha pelo menos uma categoria ou produto", - "campaignWizard.pickAudienceCats": "Escolha categorias de audiência para este filtro", + "campaignWizard.pickAudienceCats": "Escolha categorias de audiência para este filtro", "campaignWizard.completeStep": "Conclua este passo para continuar", "campaignWizard.aiDraftReady": "Rascunho de IA gerado", - "campaignWizard.templateReady": "Pré-visualização do modelo pronta", - "campaignWizard.unavailableSave": "As campanhas não estão disponíveis. Os rascunhos não podem ser guardados até a funcionalidade estar ativa.", + "campaignWizard.templateReady": "Pré-visualização do modelo pronta", + "campaignWizard.unavailableSave": "As campanhas não estão disponíveis. Os rascunhos não podem ser guardados até a funcionalidade estar ativa.", "campaignWizard.generateFailed": "Falha ao gerar", - "campaignWizard.generateFirst": "Gere primeiro uma pré-visualização", - "campaignWizard.enterTestEmail": "Introduza um endereço de e-mail de teste", + "campaignWizard.generateFirst": "Gere primeiro uma pré-visualização", + "campaignWizard.enterTestEmail": "Introduza um endereço de e-mail de teste", "campaignWizard.testFailed": "Falha no envio de teste", "campaignWizard.pickSchedule": "Escolha data e hora", "campaignWizard.scheduled": "Campanha agendada", "campaignWizard.scheduleFailed": "Falha ao agendar", "campaignWizard.draftSaved": "Rascunho guardado", - "campaignWizard.unavailableShort": "As campanhas não estão disponíveis neste momento.", + "campaignWizard.unavailableShort": "As campanhas não estão disponíveis neste momento.", "campaignWizard.saveFailed": "Falha ao guardar", - "marketing.calendarTitle": "Calendário de conteúdos", - "marketing.calendarDesc": "Ligue campanhas sazonais a datas e prepare um feed de exportação com predefinições de shopping.", - "marketing.loadFailed": "Falha ao carregar o calendário", + "marketing.calendarTitle": "Calendário de conteúdos", + "marketing.calendarDesc": "Ligue campanhas sazonais a datas e prepare um feed de exportação com predefinições de shopping.", + "marketing.loadFailed": "Falha ao carregar o calendário", "marketing.prepared": "Campanha preparada", - "marketing.alreadyReady": "A campanha já está pronta", - "marketing.exportFeedsHint": "{name} → Feeds de exportação", - "marketing.prepareFailed": "Não foi possível preparar a campanha", + "marketing.alreadyReady": "A campanha já está pronta", + "marketing.exportFeedsHint": "{name} → Feeds de exportação", + "marketing.prepareFailed": "Não foi possível preparar a campanha", "marketing.requestFailed": "Pedido falhou", "marketing.emptyTitle": "Sem presets sazonais", - "marketing.emptyMessage": "Os presets do calendário aparecerão aqui quando a API de marketing estiver disponível.", + "marketing.emptyMessage": "Os presets do calendário aparecerão aqui quando a API de marketing estiver disponível.", "marketing.openCampaigns": "Abrir campanhas de e-mail", "marketing.window": "Janela:", - "marketing.linkedExport": "Exportação ligada:", + "marketing.linkedExport": "Exportação ligada:", "marketing.openPrepared": "Abrir feed preparado", - "marketing.preparing": "A preparar…", + "marketing.preparing": "A preparar…", "marketing.prepareNamed": "Preparar campanha {name}", - "marketing.footer": "As campanhas de e-mail ficam em {link} — esta página só prepara feeds de exportação do catálogo.", - "common.done": "Concluído", - "common.copied": "Copiado para a área de transferência.", - "common.copyFailed": "Não foi possível copiar. Selecione o texto e copie manualmente.", - "common.submitting": "A submeter…", - "common.sending": "A enviar…", - "settings.companyAdminOnlyView": "Só os admins da empresa podem alterar as definições. Pode ver os detalhes do espaço de trabalho atual.", - "settings.activeCompanyHelp": "Espaço de trabalho para catálogo, feeds, faturação e chaves API. Mude a qualquer momento daqui ou no cabeçalho.", + "marketing.footer": "As campanhas de e-mail ficam em {link} — esta página só prepara feeds de exportação do catálogo.", + "common.done": "Concluído", + "common.copied": "Copiado para a área de transferência.", + "common.copyFailed": "Não foi possível copiar. Selecione o texto e copie manualmente.", + "common.submitting": "A submeter…", + "common.sending": "A enviar…", + "settings.companyAdminOnlyView": "Só os admins da empresa podem alterar as definições. Pode ver os detalhes do espaço de trabalho atual.", + "settings.activeCompanyHelp": "Espaço de trabalho para catálogo, feeds, faturação e chaves API. Mude a qualquer momento daqui ou no cabeçalho.", "settings.noCompanySelected": "Nenhuma empresa selecionada", - "settings.creditsOverviewHelp": "Saldo de créditos de IA da empresa ativa. A utilização detalhada está em Faturação.", - "settings.billingLabel": "Faturação", + "settings.creditsOverviewHelp": "Saldo de créditos de IA da empresa ativa. A utilização detalhada está em Faturação.", + "settings.billingLabel": "Faturação", "settings.remainingLabel": "Restantes", - "settings.creditsUnavailable": "O saldo de créditos ainda não está disponível para este espaço de trabalho.", - "settings.openBilling": "Abrir utilização e faturação", - "settings.companyNameHelp": "Este nome aparece em convites e definições da organização", - "settings.contentSettingsHelp": "Configure o idioma e a correspondência de produtos para o conteúdo gerado", - "settings.mergeProductsHelp": "Quando ativado, as importações CSV combinam linhas com o mesmo GTIN num produto. Desative para manter cada linha independente.", + "settings.creditsUnavailable": "O saldo de créditos ainda não está disponível para este espaço de trabalho.", + "settings.openBilling": "Abrir utilização e faturação", + "settings.companyNameHelp": "Este nome aparece em convites e definições da organização", + "settings.contentSettingsHelp": "Configure o idioma e a correspondência de produtos para o conteúdo gerado", + "settings.mergeProductsHelp": "Quando ativado, as importações CSV combinam linhas com o mesmo GTIN num produto. Desative para manter cada linha independente.", "settings.emailIntegrationHelp": "Configure o Resend ou SMTP para convites, campanhas e e-mail transacional.", "settings.configureEmail": "Configurar e-mail", - "settings.aiIntegrationsHelp": "Créditos da plataforma ou a sua própria chave, mais prompts editáveis para títulos, descrições, SEO e campanhas. Chaves encriptadas em repouso.", - "settings.openAiIntegrations": "Abrir integrações de IA", + "settings.aiIntegrationsHelp": "Créditos da plataforma ou a sua própria chave, mais prompts editáveis para títulos, descrições, SEO e campanhas. Chaves encriptadas em repouso.", + "settings.openAiIntegrations": "Abrir integrações de IA", "settings.companyNameRequired": "Introduza um nome de empresa.", - "settings.companySaved": "Definições da empresa guardadas.", - "settings.companyUpdateFailed": "Não foi possível atualizar a empresa", - "settings.mergeOn": "Os produtos com o mesmo GTIN serão unidos entre feeds.", - "settings.mergeOff": "Os produtos com o mesmo GTIN mantêm-se separados.", - "settings.mergeUpdateFailed": "Não foi possível atualizar a definição de união", - "settings.inAppToastsHelp": "Apenas neste browser. As falhas estão ativas por predefinição; as conclusões são silenciadas para reduzir ruído. Feedback de formulários e Anular nunca são silenciados.", - "settings.emailAlertsHelp": "As preferências de alerta por e-mail chegam em breve. Alertas de falha estarão ativas por predefinição (como na app); e-mails de conclusão ficam off salvo opt-in.", - "settings.emailAlertsBody": "Por agora, configure o correio transacional em Empresa → Integração de e-mail. Os alertas in-app acima continuam a aplicar-se.", - "settings.apiKeysLegacyNotice": "As chaves API legado não foram migradas. Crie uma nova para restaurar o acesso — o segredo é mostrado apenas uma vez.", - "settings.apiKeysAdminOnly": "Só os administradores podem criar ou revogar chaves API. Pode ver os prefixos existentes.", - "settings.apiKeysCopyUnavailableNotice": "Cópia indisponível para chaves existentes — só o prefixo é guardado. Crie uma nova para copiar o segredo uma vez e revogue a antiga se necessário.", - "settings.apiKeysForbidden": "Não tem permissão para ver chaves API. Peça ajuda a um administrador da empresa.", + "settings.companySaved": "Definições da empresa guardadas.", + "settings.companyUpdateFailed": "Não foi possível atualizar a empresa", + "settings.mergeOn": "Os produtos com o mesmo GTIN serão unidos entre feeds.", + "settings.mergeOff": "Os produtos com o mesmo GTIN mantêm-se separados.", + "settings.mergeUpdateFailed": "Não foi possível atualizar a definição de união", + "settings.inAppToastsHelp": "Apenas neste browser. As falhas estão ativas por predefinição; as conclusões são silenciadas para reduzir ruído. Feedback de formulários e Anular nunca são silenciados.", + "settings.emailAlertsHelp": "As preferências de alerta por e-mail chegam em breve. Alertas de falha estarão ativas por predefinição (como na app); e-mails de conclusão ficam off salvo opt-in.", + "settings.emailAlertsBody": "Por agora, configure o correio transacional em Empresa → Integração de e-mail. Os alertas in-app acima continuam a aplicar-se.", + "settings.apiKeysLegacyNotice": "As chaves API legado não foram migradas. Crie uma nova para restaurar o acesso — o segredo é mostrado apenas uma vez.", + "settings.apiKeysAdminOnly": "Só os administradores podem criar ou revogar chaves API. Pode ver os prefixos existentes.", + "settings.apiKeysCopyUnavailableNotice": "Cópia indisponível para chaves existentes — só o prefixo é guardado. Crie uma nova para copiar o segredo uma vez e revogue a antiga se necessário.", + "settings.apiKeysForbidden": "Não tem permissão para ver chaves API. Peça ajuda a um administrador da empresa.", "settings.noApiKeys": "Ainda sem chaves API", - "settings.noApiKeysHelpAdmin": "As chaves API legado não foram migradas. Crie uma nova para autenticar pedidos Descrybe (X-API-Key). O segredo completo é mostrado apenas uma vez.", - "settings.noApiKeysHelpMember": "Ainda sem chaves API para esta empresa. As legado não foram migradas — peça a um administrador para criar uma.", + "settings.noApiKeysHelpAdmin": "As chaves API legado não foram migradas. Crie uma nova para autenticar pedidos Descrybe (X-API-Key). O segredo completo é mostrado apenas uma vez.", + "settings.noApiKeysHelpMember": "Ainda sem chaves API para esta empresa. As legado não foram migradas — peça a um administrador para criar uma.", "settings.unnamedKey": "Chave sem nome", "settings.neverUsed": "Nunca usado", - "settings.apiKeyActions": "Ações de chave API", - "settings.copyUnavailable": "Cópia indisponível", - "settings.copyUnavailableTitle": "O segredo completo é mostrado apenas uma vez quando a chave é criada", + "settings.apiKeyActions": "Ações de chave API", + "settings.copyUnavailable": "Cópia indisponível", + "settings.copyUnavailableTitle": "O segredo completo é mostrado apenas uma vez quando a chave é criada", "settings.revoke": "Revogar", "settings.apiKeyNameRequired": "Introduza um nome para esta chave API.", - "settings.apiKeyCreatedOnce": "Chave API criada. Copie-a agora — não será mostrada novamente.", + "settings.apiKeyCreatedOnce": "Chave API criada. Copie-a agora — não será mostrada novamente.", "settings.apiKeyCreated": "Chave API criada.", - "settings.apiKeyCreateFailed": "Não foi possível criar a chave API", - "settings.apiKeyRevokeConfirm": "Revogar esta chave API? Os pedidos que a usam deixarão de funcionar.", + "settings.apiKeyCreateFailed": "Não foi possível criar a chave API", + "settings.apiKeyRevokeConfirm": "Revogar esta chave API? Os pedidos que a usam deixarão de funcionar.", "settings.apiKeyRevoked": "Chave API revogada.", - "settings.apiKeyRevokeFailed": "Não foi possível revogar a chave API", + "settings.apiKeyRevokeFailed": "Não foi possível revogar a chave API", "settings.apiKeyCopied": "Chave API copiada.", - "settings.createApiKeyOnceHelp": "Copie esta chave agora — não será mostrada novamente. Use-a como Authorization: Bearer ou X-API-Key em /api/v1.", - "settings.createApiKeyNameHelp": "Dê um nome à chave para a distinguir depois. Após criar, envie-a como Authorization: Bearer (preferido) ou X-API-Key.", + "settings.createApiKeyOnceHelp": "Copie esta chave agora — não será mostrada novamente. Use-a como Authorization: Bearer ou X-API-Key em /api/v1.", + "settings.createApiKeyNameHelp": "Dê um nome à chave para a distinguir depois. Após criar, envie-a como Authorization: Bearer (preferido) ou X-API-Key.", "settings.keyNamePlaceholder": "p.ex. Production", "settings.newApiKeyAria": "Nova chave API mostrada uma vez", "settings.copyApiKeyAria": "Copiar chave API", "settings.alert.sync_fail.title": "Falhas de sync", - "settings.alert.sync_fail.description": "Quando uma sincronização de feed expira ou a API devolve um erro.", - "settings.alert.sync_done.title": "Sync concluída", - "settings.alert.sync_done.description": "Quando uma sincronização de feed termina com sucesso.", + "settings.alert.sync_fail.description": "Quando uma sincronização de feed expira ou a API devolve um erro.", + "settings.alert.sync_done.title": "Sync concluída", + "settings.alert.sync_done.description": "Quando uma sincronização de feed termina com sucesso.", "settings.alert.ai_fail.title": "Falhas de IA / processamento", - "settings.alert.ai_fail.description": "Quando falha o início ou a execução de um trabalho de processamento.", - "settings.alert.ai_done.title": "IA / processamento concluído", - "settings.alert.ai_done.description": "Quando um trabalho em segundo plano termina com sucesso. Os toasts de início ficam sempre ativos para Anular permanecer disponível.", - "settings.alert.export_fail.title": "Falhas de exportação", - "settings.alert.export_fail.description": "Quando falha a exportação de um produto ou feed de exportação.", - "settings.alert.export_done.title": "Exportação concluída", - "settings.alert.export_done.description": "Quando uma exportação termina com sucesso.", + "settings.alert.ai_fail.description": "Quando falha o início ou a execução de um trabalho de processamento.", + "settings.alert.ai_done.title": "IA / processamento concluído", + "settings.alert.ai_done.description": "Quando um trabalho em segundo plano termina com sucesso. Os toasts de início ficam sempre ativos para Anular permanecer disponível.", + "settings.alert.export_fail.title": "Falhas de exportação", + "settings.alert.export_fail.description": "Quando falha a exportação de um produto ou feed de exportação.", + "settings.alert.export_done.title": "Exportação concluída", + "settings.alert.export_done.description": "Quando uma exportação termina com sucesso.", "settings.alert.support_reply.title": "Respostas da equipa de suporte", "settings.alert.support_reply.description": "Quando um agente da plataforma responde ao seu ticket de suporte.", - "settings.alert.support_status.title": "Alterações de estado do suporte", + "settings.alert.support_status.title": "Alterações de estado do suporte", "settings.alert.support_status.description": "Quando um ticket de suporte passa a pendente ou resolvido.", - "empty.forbidden.title.company": "Permissão negada", + "empty.forbidden.title.company": "Permissão negada", "empty.forbidden.title.platform": "Acesso restrito", - "empty.forbidden.message.company": "Não tem permissão para isto. Peça ajuda a um administrador da empresa.", - "empty.forbidden.message.platform": "Esta área só está disponível para administradores da plataforma.", - "empty.forbidden.message.support": "Esta área só está disponível para a equipa de suporte e administradores da plataforma.", + "empty.forbidden.message.company": "Não tem permissão para isto. Peça ajuda a um administrador da empresa.", + "empty.forbidden.message.platform": "Esta área só está disponível para administradores da plataforma.", + "empty.forbidden.message.support": "Esta área só está disponível para a equipa de suporte e administradores da plataforma.", "empty.forbidden.backDashboard": "Voltar ao painel", - "empty.forbidden.apiKeys": "Não tem permissão para ver chaves API. Peça ajuda a um administrador da empresa.", - "empty.forbidden.ai": "Não tem permissão para ver as definições do fornecedor de IA. Peça ajuda a um administrador.", - "empty.forbidden.email": "Não tem permissão para ver as definições do fornecedor de e-mail. Peça ajuda a um administrador.", - "confirm.defaultTitle": "Confirmar eliminação", + "empty.forbidden.apiKeys": "Não tem permissão para ver chaves API. Peça ajuda a um administrador da empresa.", + "empty.forbidden.ai": "Não tem permissão para ver as definições do fornecedor de IA. Peça ajuda a um administrador.", + "empty.forbidden.email": "Não tem permissão para ver as definições do fornecedor de e-mail. Peça ajuda a um administrador.", + "confirm.defaultTitle": "Confirmar eliminação", "confirm.defaultDescription": "Tem a certeza?", "confirm.defaultConfirm": "Confirmar", - "confirm.deleteFeed": "Eliminar o feed “{name}”? Isto não pode ser anulado.", - "confirm.deleteCampaign": "Eliminar a campanha “{name}”? Isto não pode ser anulado.", - "confirm.deleteExportFeed": "Tem a certeza de que pretende eliminar este feed de exportação?", + "confirm.deleteFeed": "Eliminar o feed “{name}”? Isto não pode ser anulado.", + "confirm.deleteCampaign": "Eliminar a campanha “{name}”? Isto não pode ser anulado.", + "confirm.deleteExportFeed": "Tem a certeza de que pretende eliminar este feed de exportação?", "confirm.rotateExportToken": "Rodar o token do URL do feed? O URL publico antigo deixa de funcionar de imediato.", - "confirm.deleteUpload": "Eliminar “{name}”? Isto remove o registo de carregamento (e o blob local, se existir).", - "confirm.revokeApiKey": "Revogar esta chave API? Os pedidos que a usam deixarão de funcionar.", + "confirm.deleteUpload": "Eliminar “{name}”? Isto remove o registo de carregamento (e o blob local, se existir).", + "confirm.revokeApiKey": "Revogar esta chave API? Os pedidos que a usam deixarão de funcionar.", "confirm.deleteKnowledgeArticle": "Eliminar este artigo de conhecimento?", "confirm.deleteReplyTemplate": "Eliminar este modelo de resposta?", - "confirm.deleteStructuredField": "Tem a certeza de que quer eliminar este campo? Esta ação não pode ser anulada.", + "confirm.deleteStructuredField": "Tem a certeza de que quer eliminar este campo? Esta ação não pode ser anulada.", "toast.campaign.pickAudience": "Escolha pelo menos uma categoria ou produto", - "toast.campaign.pickCategories": "Escolha categorias de audiência para este filtro", + "toast.campaign.pickCategories": "Escolha categorias de audiência para este filtro", "toast.campaign.completeStep": "Conclua este passo para continuar", "toast.campaign.aiDraft": "Rascunho de IA gerado", - "toast.campaign.templatePreview": "Pré-visualização do modelo pronta", - "toast.campaign.generateFirst": "Gere primeiro uma pré-visualização", + "toast.campaign.templatePreview": "Pré-visualização do modelo pronta", + "toast.campaign.generateFirst": "Gere primeiro uma pré-visualização", "toast.campaign.testSent": "E-mail de teste enviado para {email}", "toast.campaign.scheduled": "Campanha agendada", "toast.campaign.draftSaved": "Rascunho guardado", "toast.campaign.deleted": "Campanha eliminada", "toast.campaign.prepared": "Campanha preparada", - "toast.campaign.alreadyReady": "A campanha já está pronta", - "toast.campaign.prepareFailed": "Não foi possível preparar a campanha", + "toast.campaign.alreadyReady": "A campanha já está pronta", + "toast.campaign.prepareFailed": "Não foi possível preparar a campanha", "toast.campaign.deleteFailed": "Falha ao eliminar a campanha", - "toast.feed.copyFailed": "Não foi possível copiar o URL", + "toast.feed.copyFailed": "Não foi possível copiar o URL", "toast.feed.created": "Feed criado", "toast.feed.updated": "Feed atualizado.", "toast.feed.mapBeforeSync": "Mapeie os campos antes de sincronizar este feed.", "toast.feed.activateBeforeSync": "Ative o feed antes de sincronizar.", - "toast.feed.syncFinished": "Sincronização concluída", + "toast.feed.syncFinished": "Sincronização concluída", "toast.feed.deleted": "Feed eliminado.", - "toast.feed.mappingLoadFailed": "Não foi possível carregar os mapeamentos. Abra o mapeamento para corrigir antes de sincronizar.", - "toast.feed.syncFailed": "Falha na sincronização", - "toast.feed.statusFailed": "Não foi possível atualizar o estado", - "toast.feed.deleteFailed": "Não foi possível eliminar o feed", + "toast.feed.mappingLoadFailed": "Não foi possível carregar os mapeamentos. Abra o mapeamento para corrigir antes de sincronizar.", + "toast.feed.syncFailed": "Falha na sincronização", + "toast.feed.statusFailed": "Não foi possível atualizar o estado", + "toast.feed.deleteFailed": "Não foi possível eliminar o feed", "toast.feed.beforeSampling": "Antes da amostragem", - "toast.processing.jobCompleted": "Processamento concluído", + "toast.processing.jobCompleted": "Processamento concluído", "toast.processing.jobFailed": "Processamento falhou", - "toast.products.startFailed": "Não foi possível iniciar o processamento", + "toast.products.startFailed": "Não foi possível iniciar o processamento", "toast.products.jobStarted": "Trabalho de processamento iniciado", - "toast.products.acceptUndone": "Aceitação anulada", - "toast.products.resetComplete": "Reposição concluída", - "toast.products.nameAcceptUndone": "Aceitação do nome anulada", - "toast.products.descAcceptUndone": "Aceitação da descrição anulada", + "toast.products.acceptUndone": "Aceitação anulada", + "toast.products.resetComplete": "Reposição concluída", + "toast.products.nameAcceptUndone": "Aceitação do nome anulada", + "toast.products.descAcceptUndone": "Aceitação da descrição anulada", "toast.products.cancelOne": "Processamento cancelado", "toast.products.cancelMany": "Trabalhos de processamento cancelados", - "toast.products.startJobFailed": "Não foi possível iniciar o trabalho de processamento", - "toast.products.acceptFailed": "Não foi possível aceitar o enriquecimento", - "toast.products.updateFailed": "Não foi possível atualizar o produto", - "toast.products.undoAcceptFailed": "Não foi possível anular a aceitação", - "toast.products.undoFieldAcceptFailed": "Não foi possível anular a aceitação do campo", - "toast.products.undoFieldDiscardFailed": "Não foi possível anular o descarte do campo", - "toast.products.rejectFailed": "Não foi possível rejeitar o enriquecimento", - "toast.products.exportFailed": "Não foi possível exportar os produtos selecionados", - "toast.products.resetFailed": "Não foi possível repor os produtos", - "toast.products.cancelFailed": "Não foi possível cancelar o trabalho de processamento", + "toast.products.startJobFailed": "Não foi possível iniciar o trabalho de processamento", + "toast.products.acceptFailed": "Não foi possível aceitar o enriquecimento", + "toast.products.updateFailed": "Não foi possível atualizar o produto", + "toast.products.undoAcceptFailed": "Não foi possível anular a aceitação", + "toast.products.undoFieldAcceptFailed": "Não foi possível anular a aceitação do campo", + "toast.products.undoFieldDiscardFailed": "Não foi possível anular o descarte do campo", + "toast.products.rejectFailed": "Não foi possível rejeitar o enriquecimento", + "toast.products.exportFailed": "Não foi possível exportar os produtos selecionados", + "toast.products.resetFailed": "Não foi possível repor os produtos", + "toast.products.cancelFailed": "Não foi possível cancelar o trabalho de processamento", "toast.support.ticketCreated": "Ticket criado", "toast.support.replySent": "Resposta enviada", "toast.support.thanksFeedback": "Obrigado pelo feedback", - "toast.support.createFailed": "Não foi possível criar o ticket", - "toast.support.unavailable": "Suporte indisponível", + "toast.support.createFailed": "Não foi possível criar o ticket", + "toast.support.unavailable": "Suporte indisponível", "toast.support.loadFailed": "Falha ao carregar tickets de suporte", "toast.support.loadTicketFailed": "Falha ao carregar o ticket", - "toast.support.replyFailed": "Não foi possível enviar a resposta", - "toast.support.ratingUnavailable": "Avaliação indisponível", - "toast.support.alreadyRated": "Já avaliado", - "toast.support.ratingFailed": "Não foi possível enviar a avaliação", + "toast.support.replyFailed": "Não foi possível enviar a resposta", + "toast.support.ratingUnavailable": "Avaliação indisponível", + "toast.support.alreadyRated": "Já avaliado", + "toast.support.ratingFailed": "Não foi possível enviar a avaliação", "toast.structured.fieldAdded": "Campo adicionado", - "toast.structured.fieldAddedBody": "O campo de descrição estruturada foi adicionado.", + "toast.structured.fieldAddedBody": "O campo de descrição estruturada foi adicionado.", "toast.structured.fieldDeleted": "Campo eliminado", - "toast.structured.fieldDeletedBody": "O campo de descrição estruturada foi eliminado.", + "toast.structured.fieldDeletedBody": "O campo de descrição estruturada foi eliminado.", "toast.structured.addFailed": "Falha ao adicionar o campo", "toast.structured.deleteFailed": "Falha ao eliminar o campo", "toast.brand.saved": "Kit de marca guardado", - "toast.brand.logoUploaded": "Logótipo carregado", + "toast.brand.logoUploaded": "Logótipo carregado", "toast.brand.saveFailed": "Falha ao guardar o kit de marca", - "toast.brand.uploadFailed": "Falha ao carregar o logótipo", - "toast.vector.indexCreated": "Índice vetorial criado com sucesso", + "toast.brand.uploadFailed": "Falha ao carregar o logótipo", + "toast.vector.indexCreated": "Índice vetorial criado com sucesso", "toast.vector.dbInitialized": "Base de dados vetorial inicializada com sucesso", - "toast.vector.indexFailed": "Falha ao criar o índice vetorial", + "toast.vector.indexFailed": "Falha ao criar o índice vetorial", "toast.vector.initFailed": "Falha ao inicializar a base de dados vetorial", "toast.vector.searchFailed": "Falha ao pesquisar categorias", "toast.export.refreshFailed": "Falha ao atualizar o feed", @@ -2203,95 +2203,95 @@ export const pt: MessageDict = { "toast.mapping.saveFailed": "Falha ao guardar os mapeamentos de campos", "toast.mapping.sampleFailed": "Falha ao sincronizar + processar a amostra", "toast.attrs.createFailed": "Falha ao criar", - "toast.attrs.importFailed": "Falha na importação", - "toast.attrs.updateFailed": "Falha na atualização", + "toast.attrs.importFailed": "Falha na importação", + "toast.attrs.updateFailed": "Falha na atualização", "toast.attrs.deleteFailed": "Falha ao eliminar", - "toast.switcher.loadUsersFailed": "Não foi possível carregar os utilizadores comutáveis", - "toast.switcher.switchFailed": "Não foi possível mudar de utilizador", - "toast.switcher.returnFailed": "Não foi possível voltar ao utilizador original", - "toast.switcher.companyFailed": "Não foi possível mudar de empresa", + "toast.switcher.loadUsersFailed": "Não foi possível carregar os utilizadores comutáveis", + "toast.switcher.switchFailed": "Não foi possível mudar de utilizador", + "toast.switcher.returnFailed": "Não foi possível voltar ao utilizador original", + "toast.switcher.companyFailed": "Não foi possível mudar de empresa", "toast.requestFailed": "Pedido falhou", - "flash.campaign.unavailableDraft": "As campanhas não estão disponíveis. Os rascunhos não podem ser guardados até a funcionalidade estar ativa.", - "flash.campaign.testEmailRequired": "Introduza um endereço de e-mail de teste", + "flash.campaign.unavailableDraft": "As campanhas não estão disponíveis. Os rascunhos não podem ser guardados até a funcionalidade estar ativa.", + "flash.campaign.testEmailRequired": "Introduza um endereço de e-mail de teste", "flash.campaign.scheduleRequired": "Escolha data e hora", - "flash.campaign.unavailable": "As campanhas não estão disponíveis neste momento.", + "flash.campaign.unavailable": "As campanhas não estão disponíveis neste momento.", "flash.campaign.generateFailed": "Falha ao gerar", "flash.campaign.testFailed": "Falha no envio de teste", "flash.campaign.scheduleFailed": "Falha ao agendar", "flash.campaign.saveFailed": "Falha ao guardar", - "flash.feed.copyFailed": "Não foi possível copiar o URL", + "flash.feed.copyFailed": "Não foi possível copiar o URL", "flash.feed.csvRequired": "Escolha um ficheiro .csv.", "flash.feed.csvFileRequired": "Escolha um ficheiro CSV.", - "flash.feed.urlRequired": "O URL do feed é obrigatório.", + "flash.feed.urlRequired": "O URL do feed é obrigatório.", "flash.feed.updated": "Feed atualizado.", - "flash.feed.syncFinishedNamed": "Sincronização concluída para \"{name}\" ({status}: {products}).", + "flash.feed.syncFinishedNamed": "Sincronização concluída para \"{name}\" ({status}: {products}).", "flash.feed.deleted": "Feed eliminado.", - "flash.feed.createFailed": "Não foi possível criar o feed", - "flash.feed.updateFailed": "Não foi possível atualizar o feed", + "flash.feed.createFailed": "Não foi possível criar o feed", + "flash.feed.updateFailed": "Não foi possível atualizar o feed", "flash.settings.companyNameRequired": "Introduza um nome de empresa.", - "flash.settings.companySaved": "Definições da empresa guardadas.", - "flash.settings.companyFailed": "Não foi possível atualizar a empresa", - "flash.settings.mergeFailed": "Não foi possível atualizar a definição de união", + "flash.settings.companySaved": "Definições da empresa guardadas.", + "flash.settings.companyFailed": "Não foi possível atualizar a empresa", + "flash.settings.mergeFailed": "Não foi possível atualizar a definição de união", "flash.settings.apiKeyNameRequired": "Introduza um nome para esta chave API.", - "flash.settings.apiKeyCreatedFailed": "Não foi possível criar a chave API", + "flash.settings.apiKeyCreatedFailed": "Não foi possível criar a chave API", "flash.settings.apiKeyRevoked": "Chave API revogada.", - "flash.settings.apiKeyRevokeFailed": "Não foi possível revogar a chave API", - "flash.settings.copyFailed": "Não foi possível copiar. Selecione o texto e copie manualmente.", - "flash.products.accepted": "Aceites {count} produto(s) — movidos para Processados.", + "flash.settings.apiKeyRevokeFailed": "Não foi possível revogar a chave API", + "flash.settings.copyFailed": "Não foi possível copiar. Selecione o texto e copie manualmente.", + "flash.products.accepted": "Aceites {count} produto(s) — movidos para Processados.", "flash.products.updated": "Produto atualizado.", - "flash.products.enrichmentAccepted": "Enriquecimento aceite — movido para Processados.", - "flash.products.originalEmpty": "O valor original está vazio; o enriquecimento não pode ser limpo via PATCH.", + "flash.products.enrichmentAccepted": "Enriquecimento aceite — movido para Processados.", + "flash.products.originalEmpty": "O valor original está vazio; o enriquecimento não pode ser limpo via PATCH.", "flash.products.selectExport": "Selecione pelo menos um produto para exportar.", - "flash.products.exported": "Exportados {count} produto(s) via feed de exportação.", + "flash.products.exported": "Exportados {count} produto(s) via feed de exportação.", "flash.support.missingId": "Falta o id do ticket", - "flash.support.notFound": "Ticket não encontrado", - "flash.support.unavailable": "O suporte está temporariamente indisponível.", - "flash.support.ratingUnavailable": "A avaliação está temporariamente indisponível. Tente novamente mais tarde.", - "flash.support.alreadyRated": "Já avaliou este ticket.", - "flash.support.queueUnavailable": "A fila de suporte não está disponível neste deployment.", - "flash.support.deploymentUnavailable": "O suporte não está disponível neste deployment.", - "flash.support.replyRequired": "O corpo da resposta é obrigatório.", - "flash.support.draftRequired": "O corpo do rascunho é obrigatório antes de aprovar.", + "flash.support.notFound": "Ticket não encontrado", + "flash.support.unavailable": "O suporte está temporariamente indisponível.", + "flash.support.ratingUnavailable": "A avaliação está temporariamente indisponível. Tente novamente mais tarde.", + "flash.support.alreadyRated": "Já avaliou este ticket.", + "flash.support.queueUnavailable": "A fila de suporte não está disponível neste deployment.", + "flash.support.deploymentUnavailable": "O suporte não está disponível neste deployment.", + "flash.support.replyRequired": "O corpo da resposta é obrigatório.", + "flash.support.draftRequired": "O corpo do rascunho é obrigatório antes de aprovar.", "flash.support.claimed": "Ticket reclamado.", - "flash.support.unassigned": "Ticket sem atribuição.", - "flash.support.assigneeCleared": "Responsável limpo.", - "flash.support.assigneeUpdated": "Responsável atualizado.", + "flash.support.unassigned": "Ticket sem atribuição.", + "flash.support.assigneeCleared": "Responsável limpo.", + "flash.support.assigneeUpdated": "Responsável atualizado.", "flash.support.draftApproved": "Rascunho de IA aprovado e enviado ao cliente.", "flash.support.draftSent": "Rascunho enviado como resposta da equipa.", "flash.support.draftDiscarded": "Rascunho de IA descartado. Ticket enviado para a fila humana.", - "flash.support.autoReplyDisabled": "Resposta automática desativada (rascunho mantido como nota interna).", - "flash.structured.keyRequired": "A chave do campo é obrigatória", - "flash.category.nameRequired": "O nome e o ID único são obrigatórios.", - "flash.category.textEmpty": "O texto não pode estar vazio", - "flash.export.noConfigs": "Ainda sem feeds de exportação. Crie um em Feeds de exportação e volte para exportar a sua seleção.", - "flash.export.selectFormat": "Selecione um feed de exportação.", + "flash.support.autoReplyDisabled": "Resposta automática desativada (rascunho mantido como nota interna).", + "flash.structured.keyRequired": "A chave do campo é obrigatória", + "flash.category.nameRequired": "O nome e o ID único são obrigatórios.", + "flash.category.textEmpty": "O texto não pode estar vazio", + "flash.export.noConfigs": "Ainda sem feeds de exportação. Crie um em Feeds de exportação e volte para exportar a sua seleção.", + "flash.export.selectFormat": "Selecione um feed de exportação.", "flash.files.deleted": "Carregamento eliminado.", - "flash.mapping.noSuggestions": "Sem sugestões — verifique os nomes dos campos de origem.", - "flash.mapping.allMapped": "Todas as sugestões já estão mapeadas. Reveja os chips de confiança na tabela.", - "flash.mapping.extractFirst": "Sem sugestões — extraia primeiro o esquema.", + "flash.mapping.noSuggestions": "Sem sugestões — verifique os nomes dos campos de origem.", + "flash.mapping.allMapped": "Todas as sugestões já estão mapeadas. Reveja os chips de confiança na tabela.", + "flash.mapping.extractFirst": "Sem sugestões — extraia primeiro o esquema.", "flash.mapping.pathRequired": "Introduza um caminho de elemento de produto antes de mapear campos.", - "flash.billing.checkoutCanceled": "O Checkout foi cancelado. Não foram feitas alterações.", - "flash.billing.portalReturn": "Regressou do portal de faturação. Faça a gestão do plano aqui ou em Plans.", - "flash.billing.invalidAmount": "Introduza um montante de créditos válido.", - "flash.billing.companyNotFound": "Empresa não encontrada.", - "flash.billing.creditsAdded": "Foram adicionados {amount} créditos.", - "flash.unsubscribe.missingToken": "Falta o token de anulação de subscrição.", - "flash.unsubscribe.loadFailed": "Não foi possível carregar o estado de anulação.", - "flash.unsubscribe.failed": "Falha ao anular a subscrição.", - "flash.seo.filledMeta": "Meta preenchida para “{label}” ({mode}).", - "flash.shopify.saved": "Definições Shopify guardadas.", - "flash.woo.saved": "Definições WooCommerce guardadas.", - "flash.woo.syncSaved": "Definições de sincronização guardadas.", + "flash.billing.checkoutCanceled": "O Checkout foi cancelado. Não foram feitas alterações.", + "flash.billing.portalReturn": "Regressou do portal de faturação. Faça a gestão do plano aqui ou em Plans.", + "flash.billing.invalidAmount": "Introduza um montante de créditos válido.", + "flash.billing.companyNotFound": "Empresa não encontrada.", + "flash.billing.creditsAdded": "Foram adicionados {amount} créditos.", + "flash.unsubscribe.missingToken": "Falta o token de anulação de subscrição.", + "flash.unsubscribe.loadFailed": "Não foi possível carregar o estado de anulação.", + "flash.unsubscribe.failed": "Falha ao anular a subscrição.", + "flash.seo.filledMeta": "Meta preenchida para “{label}” ({mode}).", + "flash.shopify.saved": "Definições Shopify guardadas.", + "flash.woo.saved": "Definições WooCommerce guardadas.", + "flash.woo.syncSaved": "Definições de sincronização guardadas.", "flash.woo.autoCategories": "Mapeadas automaticamente {count} categorias.", "flash.woo.autoAttributes": "Mapeados automaticamente {count} atributos.", - "flash.ai.promptsSaved": "Modelos de prompt guardados. Aplicam-se à próxima execução de IA.", + "flash.ai.promptsSaved": "Modelos de prompt guardados. Aplicam-se à próxima execução de IA.", "flash.ai.promptRestored": "Prompt predefinido integrado restaurado.", - "flash.ai.connectionOk": "Ligação OK ({detail}).", - "flash.ai.connectionByok": ", a sua própria chave", - "flash.email.saved": "Fornecedor de e-mail guardado. Verifique o domínio e envie um teste.", - "flash.email.testDryRun": "Teste registado em modo de simulação — nenhum e-mail foi enviado.", - "flash.email.testSent": "E-mail de teste enviado. O endereço de origem é marcado como verificado se a entrega for bem-sucedida.", - "flash.fields.apiUnavailable": "A API de campos standard não está disponível. As alterações não podem ser guardadas.", + "flash.ai.connectionOk": "Ligação OK ({detail}).", + "flash.ai.connectionByok": ", a sua própria chave", + "flash.email.saved": "Fornecedor de e-mail guardado. Verifique o domínio e envie um teste.", + "flash.email.testDryRun": "Teste registado em modo de simulação — nenhum e-mail foi enviado.", + "flash.email.testSent": "E-mail de teste enviado. O endereço de origem é marcado como verificado se a entrega for bem-sucedida.", + "flash.fields.apiUnavailable": "A API de campos standard não está disponível. As alterações não podem ser guardadas.", "flash.fields.updated": "Campo atualizado com sucesso", "flash.fields.created": "Campo criado com sucesso", "flash.fields.enabledRecommended": "Campos de ecommerce recomendados ativados", @@ -2301,28 +2301,29 @@ export const pt: MessageDict = { "flash.fields.groupDeleted": "Grupo eliminado com sucesso", "flash.processing.cancelled": "\"{name}\" foi cancelado.", "flash.processing.retried": "\"{name}\" em fila para nova tentativa.", - "flash.admin.staffRoleUpdated": "Função de pessoal atualizada para {email}.", - "flash.admin.staffRoleUnavailable": "As atualizações de função de pessoal ainda não estão disponíveis neste servidor.", - "flash.admin.catalogCloned": "Copiado {source} para {dest}: {products} produtos, {categories} categorias.", - "flash.admin.fixA1Success": "Reparação do catálogo de {name} concluída: {prompts} prompts atualizados, {hashes} hashes limpos, {categories} categorias preenchidas.", - "flash.admin.fixA1Error": "Falha na reparação do catálogo de {name}.", - "flash.admin.planAssigned": "Plano atribuído a {name}.", - "flash.admin.planAssignedShort": "Plano atribuído.", - "flash.admin.creditsUpdated": "Créditos atualizados.", - "flash.admin.cyclesProcessed": "Ciclos de faturação processados: {count}", + "flash.admin.staffRoleUpdated": "Função de pessoal atualizada para {email}.", + "flash.admin.staffRoleUnavailable": "As atualizações de função de pessoal ainda não estão disponíveis neste servidor.", + "flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.", + "flash.admin.fixA1Success": "Catalog repair finished for {name}: {prompts} prompts, {hashes} hashes, {categories} processed←mapped, {mapped_backfilled} mapped←processed. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).", + "flash.admin.fixA1Error": "Falha na reparação do catálogo de {name}.", + "flash.admin.cloneDestMissing": "No sandbox destination. Switch to Platform Demo (staff home), then clone again.", + "flash.admin.planAssigned": "Plano atribuído a {name}.", + "flash.admin.planAssignedShort": "Plano atribuído.", + "flash.admin.creditsUpdated": "Créditos atualizados.", + "flash.admin.cyclesProcessed": "Ciclos de faturação processados: {count}", "flash.admin.invitesSummary": "Convites para definir palavra-passe: {parts}. Entrega de e-mail: {smtp}.", "flash.admin.smtpOn": "ligado", "flash.admin.smtpOff": "desligado", "flash.admin.localPasswordSet": "Palavra-passe local definida para {email}.", - "flash.admin.localPasswordUnavailable": "As ferramentas de palavra-passe local não estão disponíveis neste ambiente.", - "flash.admin.switchedUser": "Utilizador alterado. A recarregar…", - "flash.admin.switchUnavailable": "A mudança de utilizador não está disponível neste ambiente.", - "flash.admin.diagnosticsRateLimit": "Limite de diagnósticos atingido (20/min). Aguarde um minuto e atualize.", - "flash.admin.smtpSaved": "Definições SMTP da plataforma guardadas. As palavras-passe permanecem ocultas.", - "flash.admin.integrationSaved": "Definições de integração guardadas. Os campos secretos nunca são mostrados de novo na íntegra.", - "flash.admin.aiSaved": "Definições de IA {label} guardadas. As chaves API nunca são mostradas de novo.", + "flash.admin.localPasswordUnavailable": "As ferramentas de palavra-passe local não estão disponíveis neste ambiente.", + "flash.admin.switchedUser": "Utilizador alterado. A recarregar…", + "flash.admin.switchUnavailable": "A mudança de utilizador não está disponível neste ambiente.", + "flash.admin.diagnosticsRateLimit": "Limite de diagnósticos atingido (20/min). Aguarde um minuto e atualize.", + "flash.admin.smtpSaved": "Definições SMTP da plataforma guardadas. As palavras-passe permanecem ocultas.", + "flash.admin.integrationSaved": "Definições de integração guardadas. Os campos secretos nunca são mostrados de novo na íntegra.", + "flash.admin.aiSaved": "Definições de IA {label} guardadas. As chaves API nunca são mostradas de novo.", "flash.admin.cleanup": "Limpeza: {jobs} trabalhos falharam, {products} produtos repostos.", - "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", + "flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.", "flash.admin.orphanDeleted": "Deleted {deleted} orphan row(s). Remaining: {remaining}.", "flash.admin.articleUpdated": "Artigo atualizado.", "flash.admin.articleCreated": "Artigo criado.", @@ -2330,152 +2331,152 @@ export const pt: MessageDict = { "flash.admin.templateCreated": "Modelo criado.", "flash.admin.articleDeleted": "Artigo eliminado.", "flash.admin.templateDeleted": "Modelo eliminado.", - "flash.admin.autoReplySaved": "Definições de resposta automática guardadas.", + "flash.admin.autoReplySaved": "Definições de resposta automática guardadas.", "flash.admin.imageUploaded": "Imagem carregada e inserida no markdown.", - "flash.admin.translationsSaved": "Guardadas {count} cadeia(s) para {locale}. Faça commit do pack quando estiver pronto.", + "flash.admin.translationsSaved": "Guardadas {count} cadeia(s) para {locale}. Faça commit do pack quando estiver pronto.", "flash.admin.featuresUpdated": "Atualizado {key}.", "flash.admin.featuresAllOn": "Todas as funcionalidades ativadas para este plano.", "flash.admin.featuresAllOff": "Todas as funcionalidades desativadas para este plano.", "flash.admin.profileApplied": "Perfil {label} aplicado a {name}.", - "flash.admin.overridesCleared": "Substituições limpas — a usar predefinições do nome do plano.", + "flash.admin.overridesCleared": "Substituições limpas — a usar predefinições do nome do plano.", "empty.plans.none": "Nenhum plano encontrado.", "empty.plans.noMatch": "Nenhum plano corresponde a este filtro.", "empty.plans.selectPackage": "Selecione um pacote para editar funcionalidades.", "empty.products.processingTitle": "Nenhum produto em processamento", - "empty.products.processingMessageCan": "O progresso em direto está em Processamento. Abra um trabalho em curso para ver o estado dos passos; este separador listará produtos em curso quando o filtro por itens estiver disponível.", - "empty.products.processingMessageCannot": "Os produtos num trabalho aparecem aqui assim que o processamento começar a partir do catálogo.", - "empty.products.reviewTitle": "Nenhum produto a precisar de revisão", - "empty.products.reviewMessage": "Após um trabalho, os produtos enriquecidos aparecem aqui. Abra uma linha para comparar original vs enriquecido e Aceitar, editar ou Rejeitar.", + "empty.products.processingMessageCan": "O progresso em direto está em Processamento. Abra um trabalho em curso para ver o estado dos passos; este separador listará produtos em curso quando o filtro por itens estiver disponível.", + "empty.products.processingMessageCannot": "Os produtos num trabalho aparecem aqui assim que o processamento começar a partir do catálogo.", + "empty.products.reviewTitle": "Nenhum produto a precisar de revisão", + "empty.products.reviewMessage": "Após um trabalho, os produtos enriquecidos aparecem aqui. Abra uma linha para comparar original vs enriquecido e Aceitar, editar ou Rejeitar.", "empty.products.errorTitle": "Nenhum produto com erros", "empty.products.errorMessage": "Quando um trabalho falha para um produto, ele aparece aqui para poder tentar novamente.", - "empty.products.filterTitleUnprocessed": "Sem correspondências não processadas", + "empty.products.filterTitleUnprocessed": "Sem correspondências não processadas", "empty.products.filterTitle": "Nenhum produto corresponde", - "empty.products.filterMessage": "Tente outra pesquisa, categoria ou feed — ou limpe os filtros para ver tudo.", - "empty.products.unprocessedTitle": "Ainda sem produtos não processados", + "empty.products.filterMessage": "Tente outra pesquisa, categoria ou feed — ou limpe os filtros para ver tudo.", + "empty.products.unprocessedTitle": "Ainda sem produtos não processados", "empty.products.unprocessedMessage": "Ligue um feed de fornecedor ou carregue um CSV para importar produtos.", "empty.products.noneTitle": "Ainda sem produtos", - "empty.products.noneMessageStores": "Importe de um feed ou loja e inicie um trabalho para construir o catálogo.", + "empty.products.noneMessageStores": "Importe de um feed ou loja e inicie um trabalho para construir o catálogo.", "empty.products.noneMessage": "Importe de um feed ou carregue um CSV e inicie um trabalho.", "empty.products.viewJobs": "Ver trabalhos", "empty.products.startJob": "Iniciar um trabalho", "empty.products.clearFilters": "Limpar filtros", "empty.products.viewProcessed": "Ver processados", - "empty.products.retryCatalog": "Tentar novamente a partir do catálogo", + "empty.products.retryCatalog": "Tentar novamente a partir do catálogo", "empty.products.connectFeed": "Ligar feed", "empty.products.addProduct": "Adicionar produto", "empty.products.uploadCsv": "Carregar CSV", "empty.feeds.noneTitle": "Ainda sem feeds de produtos", - "empty.feeds.noneMessage": "Ligue um URL CSV/XML de fornecedor ou carregue um ficheiro. Seguinte: Map → Sync → Process.", + "empty.feeds.noneMessage": "Ligue um URL CSV/XML de fornecedor ou carregue um ficheiro. Seguinte: Map → Sync → Process.", "empty.feeds.noMatchTitle": "Sem feeds correspondentes", "empty.feeds.noMatchMessage": "Experimente outro termo de pesquisa, ou limpe a pesquisa para ver todos os feeds.", - "empty.export.loadFailedTitle": "Não foi possível carregar os feeds de exportação", - "empty.export.loadFailedMessage": "Algo correu mal ao carregar as suas exportações. Tente novamente ou veja o erro acima para detalhes.", - "empty.export.noneTitle": "Ainda sem feeds de exportação", - "empty.export.noneMessage": "Crie um feed Google Shopping, Meta ou CSV/XML personalizado para escolher que produtos e campos saem. Gere um URL público para Merchant Center ou qualquer parceiro — ou exporte um subconjunto em Produtos.", + "empty.export.loadFailedTitle": "Não foi possível carregar os feeds de exportação", + "empty.export.loadFailedMessage": "Algo correu mal ao carregar as suas exportações. Tente novamente ou veja o erro acima para detalhes.", + "empty.export.noneTitle": "Ainda sem feeds de exportação", + "empty.export.noneMessage": "Crie um feed Google Shopping, Meta ou CSV/XML personalizado para escolher que produtos e campos saem. Gere um URL público para Merchant Center ou qualquer parceiro — ou exporte um subconjunto em Produtos.", "empty.export.noMatchTitle": "Sem feeds correspondentes", "empty.export.noMatchMessage": "Tente outro termo de pesquisa.", "empty.files.noneTitle": "Ainda sem carregamentos", - "empty.files.noneMessage": "Importações CSV de produtos, categorias e atributos aparecem aqui após o carregamento. Após uma migração de plataforma, os conteúdos dos ficheiros (blobs) não foram copiados — volte a carregar se precisar deles.", + "empty.files.noneMessage": "Importações CSV de produtos, categorias e atributos aparecem aqui após o carregamento. Após uma migração de plataforma, os conteúdos dos ficheiros (blobs) não foram copiados — volte a carregar se precisar deles.", "empty.files.uploadCta": "Carregar CSV", "empty.export.fromProductsCta": "Exportar a partir de Produtos", "empty.dashboard.noJobsTitle": "Sem trabalhos recentes", - "empty.dashboard.noJobsMessage": "Os trabalhos aparecem aqui depois de iniciar o processamento em Produtos. Enriqueça títulos e descrições antes de exportar.", + "empty.dashboard.noJobsMessage": "Os trabalhos aparecem aqui depois de iniciar o processamento em Produtos. Enriqueça títulos e descrições antes de exportar.", "empty.stores.noneTitle": "Ainda sem loja ligada", - "empty.stores.noneMessage": "Ligue o WooCommerce ou Shopify para sincronizar catálogo e encomendas. Prefere um ficheiro de fornecedor? Use URL de feed ou carregamento CSV.", + "empty.stores.noneMessage": "Ligue o WooCommerce ou Shopify para sincronizar catálogo e encomendas. Prefere um ficheiro de fornecedor? Use URL de feed ou carregamento CSV.", "empty.stores.noneTitleMember": "Ainda sem loja ligada", - "empty.stores.noneMessageMember": "Só os admins da empresa podem ligar WooCommerce ou Shopify. Peça ajuda a um admin, ou use Feed URL/CSV se o seu papel permitir.", - "empty.woo.openConnection": "Abrir definições de ligação", - "empty.shopify.openConnection": "Abrir definições de ligação", + "empty.stores.noneMessageMember": "Só os admins da empresa podem ligar WooCommerce ou Shopify. Peça ajuda a um admin, ou use Feed URL/CSV se o seu papel permitir.", + "empty.woo.openConnection": "Abrir definições de ligação", + "empty.shopify.openConnection": "Abrir definições de ligação", "empty.processing.noneTitle": "Ainda sem trabalhos", - "empty.processing.noneMessage": "Inicie um trabalho a partir de Produtos quando estiver pronto. O progresso e o histórico aparecem aqui.", - "empty.campaigns.unavailableTitle": "Campanhas indisponíveis", - "empty.campaigns.unavailableMessage": "O serviço de campanhas não está acessível. Pode abrir o assistente, mas gerar e enviar aguardam o regresso do serviço.", + "empty.processing.noneMessage": "Inicie um trabalho a partir de Produtos quando estiver pronto. O progresso e o histórico aparecem aqui.", + "empty.campaigns.unavailableTitle": "Campanhas indisponíveis", + "empty.campaigns.unavailableMessage": "O serviço de campanhas não está acessível. Pode abrir o assistente, mas gerar e enviar aguardam o regresso do serviço.", "empty.calendar.noneTitle": "Sem presets sazonais", - "empty.calendar.noneMessage": "Os presets do calendário aparecerão aqui quando a API de marketing estiver disponível.", - "empty.seo.noneTitle": "Sem catálogo para pontuar", - "empty.seo.noneMessage": "Processe produtos ou adicione categorias primeiro. As pontuações SEO aparecem quando há dados de catálogo.", - "empty.vector.unavailableTitle": "Categorias vetoriais indisponíveis", - "empty.vector.noMatchTitle": "Ainda sem correspondências", - "empty.vector.noMatchMessage": "Introduza uma descrição de produto e pesquise para ver correspondências vetoriais.", - "empty.structured.unavailableTitle": "Descrições estruturadas indisponíveis", - "empty.structured.unavailableMessage": "Esta API ainda não está neste backend. Não pode gerir campos Export ID até /api/structured-descriptions estar ligada.", - "empty.structured.noneTitle": "Ainda sem campos de descrição estruturada", - "empty.structured.noneMessage": "Adicione um campo aqui ou crie Export IDs numa fórmula de descrição de categoria — aparecerão para feeds de exportação.", - "empty.support.unavailableTitle": "Suporte indisponível", + "empty.calendar.noneMessage": "Os presets do calendário aparecerão aqui quando a API de marketing estiver disponível.", + "empty.seo.noneTitle": "Sem catálogo para pontuar", + "empty.seo.noneMessage": "Processe produtos ou adicione categorias primeiro. As pontuações SEO aparecem quando há dados de catálogo.", + "empty.vector.unavailableTitle": "Categorias vetoriais indisponíveis", + "empty.vector.noMatchTitle": "Ainda sem correspondências", + "empty.vector.noMatchMessage": "Introduza uma descrição de produto e pesquise para ver correspondências vetoriais.", + "empty.structured.unavailableTitle": "Descrições estruturadas indisponíveis", + "empty.structured.unavailableMessage": "Esta API ainda não está neste backend. Não pode gerir campos Export ID até /api/structured-descriptions estar ligada.", + "empty.structured.noneTitle": "Ainda sem campos de descrição estruturada", + "empty.structured.noneMessage": "Adicione um campo aqui ou crie Export IDs numa fórmula de descrição de categoria — aparecerão para feeds de exportação.", + "empty.support.unavailableTitle": "Suporte indisponível", "empty.support.noneTitle": "Ainda sem tickets", - "empty.support.unavailableMessage": "A API de suporte não está acessível. Tente em breve ou abra um novo ticket quando o serviço estiver ativo.", + "empty.support.unavailableMessage": "A API de suporte não está acessível. Tente em breve ou abra um novo ticket quando o serviço estiver ativo.", "empty.support.filterMessage": "Nenhum ticket corresponde a este estado. Tente outro filtro ou crie um novo ticket.", - "empty.support.noneMessage": "Descreva o problema e a equipa responderá neste tópico. Também receberá uma notificação na app quando a equipa responder.", + "empty.support.noneMessage": "Descreva o problema e a equipa responderá neste tópico. Também receberá uma notificação na app quando a equipa responder.", "empty.support.createTicket": "Criar ticket", "empty.support.clearFilter": "Limpar filtro", - "empty.support.ticketNotFoundTitle": "Ticket não encontrado", - "empty.support.ticketNotFoundMessage": "Este ticket pode ter sido removido ou não tem acesso.", + "empty.support.ticketNotFoundTitle": "Ticket não encontrado", + "empty.support.ticketNotFoundMessage": "Este ticket pode ter sido removido ou não tem acesso.", "empty.support.noMessagesTitle": "Sem mensagens", - "empty.support.noMessagesMessage": "Este tópico ainda não tem mensagens.", + "empty.support.noMessagesMessage": "Este tópico ainda não tem mensagens.", "empty.settings.noApiKeysTitle": "Ainda sem chaves API", "empty.shopify.noOrdersTitle": "Ainda sem encomendas", - "empty.shopify.noOrdersMessage": "As encomendas aparecem após ligar o Shopify e executar uma importação. Listas vazias são normais até ao primeiro sync.", + "empty.shopify.noOrdersMessage": "As encomendas aparecem após ligar o Shopify e executar uma importação. Listas vazias são normais até ao primeiro sync.", "empty.woo.noOrdersTitle": "Ainda sem encomendas", - "empty.woo.noOrdersMessage": "As encomendas aparecem após ligar o WooCommerce e executar uma sincronização. Listas vazias são normais até ao primeiro sync.", - "empty.woo.noReviewsTitle": "Ainda sem avaliações", - "empty.woo.noReviewsMessage": "As avaliações aparecem após colocar na fila uma importação de uma loja ligada. Este separador continua utilizável com a lista vazia.", + "empty.woo.noOrdersMessage": "As encomendas aparecem após ligar o WooCommerce e executar uma sincronização. Listas vazias são normais até ao primeiro sync.", + "empty.woo.noReviewsTitle": "Ainda sem avaliações", + "empty.woo.noReviewsMessage": "As avaliações aparecem após colocar na fila uma importação de uma loja ligada. Este separador continua utilizável com a lista vazia.", "empty.admin.noProviderTitle": "Sem linhas de fornecedor", "empty.admin.noProviderMessage": "Os tokens aparecem aqui depois de os produtos registarem um tipo de fornecedor.", "empty.admin.noCompaniesTitle": "Sem empresas", - "empty.admin.noCompaniesMessage": "A lista de empresas está vazia.", - "empty.admin.noCyclesTitle": "Ainda sem ciclos de faturação", - "empty.admin.noCyclesMessage": "Os ciclos aparecem depois de as execuções de faturação criarem linhas históricas.", + "empty.admin.noCompaniesMessage": "A lista de empresas está vazia.", + "empty.admin.noCyclesTitle": "Ainda sem ciclos de faturação", + "empty.admin.noCyclesMessage": "Os ciclos aparecem depois de as execuções de faturação criarem linhas históricas.", "empty.admin.noCompaniesFound": "Nenhuma empresa encontrada.", "empty.admin.noCompaniesMatch": "Nenhuma empresa corresponde a este filtro.", - "empty.admin.notPlatformTitle": "Não é admin da plataforma", - "empty.admin.notPlatformMessage": "A sua conta está com sessão iniciada mas não está marcada como admin da plataforma. Peça a um admin existente que conceda acesso, depois termine a sessão e inicie novamente.", - "empty.admin.noJobsFilter": "Não há trabalhos para este filtro.", + "empty.admin.notPlatformTitle": "Não é admin da plataforma", + "empty.admin.notPlatformMessage": "A sua conta está com sessão iniciada mas não está marcada como admin da plataforma. Peça a um admin existente que conceda acesso, depois termine a sessão e inicie novamente.", + "empty.admin.noJobsFilter": "Não há trabalhos para este filtro.", "empty.admin.noAdminUsers": "Nenhum utilizador admin encontrado", "empty.admin.noJobs": "Nenhum trabalho encontrado.", - "empty.admin.queueUnavailable": "A fila de suporte não está disponível. Contacte o administrador da plataforma se persistir.", - "empty.admin.noTicketsQueue": "Não há tickets nesta fila.", + "empty.admin.queueUnavailable": "A fila de suporte não está disponível. Contacte o administrador da plataforma se persistir.", + "empty.admin.noTicketsQueue": "Não há tickets nesta fila.", "empty.admin.knowledgeTitle": "Conhecimento de suporte", - "empty.admin.knowledgeNotReadyTitle": "O conhecimento de suporte não está pronto", - "empty.admin.knowledgeNotReadyMessage": "Artigos e resposta automática ainda não estão configurados neste deployment.", + "empty.admin.knowledgeNotReadyTitle": "O conhecimento de suporte não está pronto", + "empty.admin.knowledgeNotReadyMessage": "Artigos e resposta automática ainda não estão configurados neste deployment.", "empty.admin.noTemplatesTitle": "Sem modelos de resposta", - "empty.admin.noTemplatesMessage": "Os modelos são correspondidos como artigos e publicados como respostas automáticas etiquetadas.", - "empty.admin.ticketNotFound": "Ticket não encontrado.", - "empty.admin.supportUnavailable": "O suporte não está disponível neste deployment.", - "empty.admin.ticketLoadFailed": "Não foi possível carregar este ticket.", + "empty.admin.noTemplatesMessage": "Os modelos são correspondidos como artigos e publicados como respostas automáticas etiquetadas.", + "empty.admin.ticketNotFound": "Ticket não encontrado.", + "empty.admin.supportUnavailable": "O suporte não está disponível neste deployment.", + "empty.admin.ticketLoadFailed": "Não foi possível carregar este ticket.", "empty.admin.noMessages": "Ainda sem mensagens.", - "empty.admin.translationsUnavailableTitle": "Traduções indisponíveis", - "empty.admin.translationsUnavailableMessage": "O endpoint do catálogo de traduções não está disponível nesta build.", + "empty.admin.translationsUnavailableTitle": "Traduções indisponíveis", + "empty.admin.translationsUnavailableMessage": "O endpoint do catálogo de traduções não está disponível nesta build.", "empty.admin.noKeysMatchTitle": "Nenhuma chave corresponde", - "empty.admin.noKeysMatchMessage": "Tente outro filtro ou pesquisa, ou atualize após novas chaves serem adicionadas ao inglês.", + "empty.admin.noKeysMatchMessage": "Tente outro filtro ou pesquisa, ou atualize após novas chaves serem adicionadas ao inglês.", "empty.admin.noUsersMatch": "Nenhum utilizador corresponde a este filtro.", "empty.admin.noCompaniesMatchFilter": "Nenhuma empresa corresponde a este filtro.", "blast.title": "Confirmar envio em massa", - "blast.dryRunDescription": "O modo de simulação está ativo — nenhum e-mail real sairá do Descrybe. Confirme para registar o envio de teste.", - "blast.liveDescription": "Isto enviará e-mails reais para o seu público. Escreva I understand para continuar.", - "blast.recipients": "Destinatários neste pedido: {count}", - "blast.typePhrase": "Escreva “I understand”", + "blast.dryRunDescription": "O modo de simulação está ativo — nenhum e-mail real sairá do Descrybe. Confirme para registar o envio de teste.", + "blast.liveDescription": "Isto enviará e-mails reais para o seu público. Escreva I understand para continuar.", + "blast.recipients": "Destinatários neste pedido: {count}", + "blast.typePhrase": "Escreva “I understand”", "blast.placeholder": "I understand", - "blast.runDryRun": "Executar simulação", + "blast.runDryRun": "Executar simulação", "blast.send": "Enviar blast", "marketing.footerBefore": "As campanhas de e-mail ficam em", - "marketing.footerAfter": "— esta página só prepara feeds de exportação do catálogo.", + "marketing.footerAfter": "— esta página só prepara feeds de exportação do catálogo.", "support.title": "Centro de suporte", - "support.description": "Abrir a ticket for faturação, bugs, or account help. Pessoal replies show here and as in-app notifications.", + "support.description": "Abrir a ticket for faturação, bugs, or account help. Pessoal replies show here and as in-app notifications.", "support.newTicket": "Novo ticket", "support.createTicket": "Criar ticket", - "support.loadingTickets": "A carregar tickets…", + "support.loadingTickets": "A carregar tickets…", "support.loadFailed": "Falha ao carregar tickets de suporte", - "support.unavailableBanner": "Suporte is not fully disponível yet. You can still prepare a ticket; submitting may wait until the service is ready.", + "support.unavailableBanner": "Suporte is not fully disponível yet. You can still prepare a ticket; submitting may wait until the service is ready.", "support.yourTickets": "Os seus tickets", "support.ticketCount": "{count} tickets", "support.ticketCountOne": "{count} ticket", - "support.statusFilterSuffix": "· estado {status}", + "support.statusFilterSuffix": "· estado {status}", "support.filterByStatus": "Filtrar by status", - "support.unavailableTitle": "Suporte indisponível", + "support.unavailableTitle": "Suporte indisponível", "support.emptyTitle": "Ainda sem tickets", - "support.unavailableEmpty": "A API de suporte não está acessível. Tente em breve ou abra um novo ticket quando o serviço estiver ativo.", + "support.unavailableEmpty": "A API de suporte não está acessível. Tente em breve ou abra um novo ticket quando o serviço estiver ativo.", "support.emptyFiltered": "Nenhum ticket corresponde a este estado. Tente outro filtro ou crie um novo ticket.", - "support.emptyHelp": "Descreva o problema e a equipa responderá neste tópico. Também receberá uma notificação na app quando a equipa responder.", + "support.emptyHelp": "Descreva o problema e a equipa responderá neste tópico. Também receberá uma notificação na app quando a equipa responder.", "support.clearFilter": "Limpar filtro", "support.table.subject": "Assunto", "support.table.category": "Categoria", @@ -2498,49 +2499,49 @@ export const pt: MessageDict = { "support.new.category": "Categoria", "support.new.priority": "Prioridade", "support.new.optional": "Opcional details", - "support.new.optionalHint": "(SKU, etiquetas — ajuda o encaminhamento)", + "support.new.optionalHint": "(SKU, etiquetas — ajuda o encaminhamento)", "support.new.relatedSku": "SKU relacionado", "support.new.relatedSkuPlaceholder": "p. ex. ABC-123", "support.new.relatedSkuHelp": "Produto or feed SKU if this is about a specific item.", "support.new.tags": "Etiquetas", - "support.new.tagsPlaceholder": "login, fatura (separados por vírgulas)", - "support.new.tagsHelp": "Até 10 rótulos curtos. Normalizamos espaços e pontuação.", - "support.new.tagsWillSend": "Será enviado: {tags}", + "support.new.tagsPlaceholder": "login, fatura (separados por vírgulas)", + "support.new.tagsHelp": "Até 10 rótulos curtos. Normalizamos espaços e pontuação.", + "support.new.tagsWillSend": "Será enviado: {tags}", "support.new.message": "Mensagem", "support.new.messagePlaceholder": "Descreva o problema, o que esperava e o que ajudar a reproduzi-lo.", "support.new.createdTitle": "Ticket criado", - "support.new.createdBody": "Responderemos neste tópico. Fique atento às notificações in-app.", + "support.new.createdBody": "Responderemos neste tópico. Fique atento às notificações in-app.", "support.new.viewTicket": "Ver ticket", - "support.new.unavailable": "Suporte is temporarily indisponível. Your message was not submitted — try again shortly.", - "support.new.unavailableTitle": "Suporte indisponível", - "support.new.createFailed": "Não foi possível criar o ticket", + "support.new.unavailable": "Suporte is temporarily indisponível. Your message was not submitted — try again shortly.", + "support.new.unavailableTitle": "Suporte indisponível", + "support.new.createFailed": "Não foi possível criar o ticket", "support.ticket.fallbackTitle": "Suporte ticket", "support.ticket.description": "Conversation thread with Descrybe suporte.", - "support.ticket.meta": "{category} · {priority} · Atualizado {when}", + "support.ticket.meta": "{category} · {priority} · Atualizado {when}", "support.ticket.allTickets": "Tudo tickets", - "support.ticket.loading": "A carregar ticket…", + "support.ticket.loading": "A carregar ticket…", "support.ticket.missingId": "Falta o id do ticket", - "support.ticket.notFound": "Ticket não encontrado", - "support.ticket.notFoundMessage": "Este ticket pode ter sido removido ou não tem acesso.", + "support.ticket.notFound": "Ticket não encontrado", + "support.ticket.notFoundMessage": "Este ticket pode ter sido removido ou não tem acesso.", "support.ticket.backCenter": "Voltar to Suporte Center", - "support.ticket.unavailable": "O suporte está temporariamente indisponível.", + "support.ticket.unavailable": "O suporte está temporariamente indisponível.", "support.ticket.loadFailed": "Falha ao carregar o ticket", - "support.ticket.openedMeta": "Abrired {when} · {category} · {priority} priority", + "support.ticket.openedMeta": "Abrired {when} · {category} · {priority} priority", "support.ticket.sku": "SKU {sku}", "support.ticket.messagesAria": "Mensagens do ticket", "support.ticket.noMessages": "Sem mensagens", - "support.ticket.noMessagesHelp": "Este tópico ainda não tem mensagens.", + "support.ticket.noMessagesHelp": "Este tópico ainda não tem mensagens.", "support.ticket.yourReply": "A sua resposta", - "support.ticket.replyPlaceholder": "Add details or reply to suporte…", + "support.ticket.replyPlaceholder": "Add details or reply to suporte…", "support.ticket.sendReply": "Enviar resposta", "support.ticket.replySent": "Resposta enviada", - "support.ticket.reopened": "Ticket reaberto para revisão da equipa.", - "support.ticket.replyAdded": "A sua mensagem foi adicionada ao tópico.", - "support.ticket.replyFailed": "Não foi possível enviar a resposta", + "support.ticket.reopened": "Ticket reaberto para revisão da equipa.", + "support.ticket.replyAdded": "A sua mensagem foi adicionada ao tópico.", + "support.ticket.replyFailed": "Não foi possível enviar a resposta", "support.ticket.reopenHint": "Responder reabre este ticket para a equipa.", "support.ticket.humanHint": "Replying asks a human teammate to continue from aqui.", "support.ticket.closedBanner": "This ticket is closed. Criar a new ticket if you still need help.", - "support.kind.you": "Você", + "support.kind.you": "Você", "support.kind.human": "Suporte", "support.kind.auto": "Automatizado", "support.kind.ai": "Assistido por IA", @@ -2550,73 +2551,73 @@ export const pt: MessageDict = { "support.progress.closed.title": "Ticket fechado", "support.progress.closed.message": "This conversation is closed. Abrir a new ticket if you still need help.", "support.progress.resolved.title": "Marcado como resolvido", - "support.progress.resolved.message": "Acreditamos que está resolvido. Responda para reabrir, ou deixe uma avaliação rápida abaixo.", - "support.progress.quickAnswer.title": "Resposta rápida enviada", - "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply aqui — a human will take over.", + "support.progress.resolved.message": "Acreditamos que está resolvido. Responda para reabrir, ou deixe uma avaliação rápida abaixo.", + "support.progress.quickAnswer.title": "Resposta rápida enviada", + "support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply aqui — a human will take over.", "support.progress.onIt.title": "Estamos a tratar", "support.progress.onIt.handedMessage": "A suporte teammate has your ticket and will reply in this thread.", "support.progress.onIt.pendingMessage": "Suporte is reviewing your message. You will see updates in this thread.", "support.progress.received.title": "Ticket recebido", - "support.progress.received.message": "Obrigado — temos o seu pedido. Pode surgir ajuda automática em breve, ou um colega responderá.", - "support.category.billing": "Faturação", + "support.progress.received.message": "Obrigado — temos o seu pedido. Pode surgir ajuda automática em breve, ou um colega responderá.", + "support.category.billing": "Faturação", "support.category.billing.help": "Faturas, payment methods, plan changes, and Stripe receipts.", - "support.category.billing_credits": "Faturação / credits", - "support.category.billing_credits.help": "Saldo de créditos, quotas de utilização e recargas.", + "support.category.billing_credits": "Faturação / credits", + "support.category.billing_credits.help": "Saldo de créditos, quotas de utilização e recargas.", "support.category.bug": "Bug / erro", - "support.category.bug.help": "Erros inesperados, ecrãs partidos ou passos que falham sempre.", + "support.category.bug.help": "Erros inesperados, ecrãs partidos ou passos que falham sempre.", "support.category.account": "Conta / acesso", "support.category.account.help": "Login, invites, empresa membership, and permissions.", - "support.category.integrations": "Integrações", - "support.category.integrations.help": "WooCommerce, Shopify, API pública ou configuração do conector.", + "support.category.integrations": "Integrações", + "support.category.integrations.help": "WooCommerce, Shopify, API pública ou configuração do conector.", "support.category.processing": "Processamento / AI", "support.category.processing.help": "Produto processamento, AI prompts, and generation quality.", "support.category.export": "Exportar / channels", "support.category.export.help": "Exportar feeds, channels, and sync destinations.", - "support.category.migration": "Migração / dados", - "support.category.migration.help": "Dados em falta ou incorretos após o cutover — produtos, feeds, lojas, faturação ou equipa.", + "support.category.migration": "Migração / dados", + "support.category.migration.help": "Dados em falta ou incorretos após o cutover — produtos, feeds, lojas, faturação ou equipa.", "support.category.other": "Outro", - "support.category.other.help": "Qualquer outra coisa — encaminhamos ao colega certo.", + "support.category.other.help": "Qualquer outra coisa — encaminhamos ao colega certo.", "support.priority.low": "Baixo", - "support.priority.low.help": "Desejável ou não bloqueante — trataremos por ordem.", + "support.priority.low.help": "Desejável ou não bloqueante — trataremos por ordem.", "support.priority.normal": "Normal", - "support.priority.normal.help": "Pedido padrão. A maioria dos tickets usa isto.", + "support.priority.normal.help": "Pedido padrão. A maioria dos tickets usa isto.", "support.priority.high": "Alto", - "support.priority.high.help": "Bloqueia o trabalho ou afeta receita — use com parcimónia.", + "support.priority.high.help": "Bloqueia o trabalho ou afeta receita — use com parcimónia.", "support.csat.thanks": "Obrigado pelo feedback", - "support.csat.unavailable": "A avaliação está temporariamente indisponível. Tente novamente mais tarde.", - "support.csat.unavailableTitle": "Avaliação indisponível", - "support.csat.alreadyRated": "Já avaliou este ticket.", - "support.csat.alreadyRatedTitle": "Já avaliado", - "support.csat.submitFailed": "Não foi possível enviar a avaliação", - "support.csat.yourRating": "A sua avaliação", + "support.csat.unavailable": "A avaliação está temporariamente indisponível. Tente novamente mais tarde.", + "support.csat.unavailableTitle": "Avaliação indisponível", + "support.csat.alreadyRated": "Já avaliou este ticket.", + "support.csat.alreadyRatedTitle": "Já avaliado", + "support.csat.submitFailed": "Não foi possível enviar a avaliação", + "support.csat.yourRating": "A sua avaliação", "support.csat.ratedOutOf": "Avaliou este ticket com {score} de 5", - "support.csat.howDidWeDo": "Como nos saímos?", - "support.csat.formHelp": "This ticket is {status}. Rate your experience (1–5). Opcional comment helps us improve.", - "support.csat.rating": "Classificação", - "support.csat.scoreAria": "{value} — {label}", + "support.csat.howDidWeDo": "Como nos saímos?", + "support.csat.formHelp": "This ticket is {status}. Rate your experience (1–5). Opcional comment helps us improve.", + "support.csat.rating": "Classificação", + "support.csat.scoreAria": "{value} — {label}", "support.csat.whatWentWrong": "What went wrong? (opcional)", "support.csat.whatWentWrongPlaceholder": "Uma nota breve ajuda-nos no seguimento.", "support.csat.anythingElse": "Anything else? (opcional)", "support.csat.optionalFeedback": "Opcional feedback", - "support.csat.submit": "Enviar avaliação", + "support.csat.submit": "Enviar avaliação", "support.csat.score.1": "Muito insatisfeito", "support.csat.score.2": "Insatisfeito", "support.csat.score.3": "OK", "support.csat.score.4": "Satisfeito", "support.csat.score.5": "Muito satisfeito", "catalog.delete": "Eliminar", - "catalog.deleting": "A eliminar…", - "catalog.saving": "A guardar…", - "catalog.adding": "A adicionar…", - "catalog.assigning": "A atribuir…", - "catalog.uploading": "A carregar…", + "catalog.deleting": "A eliminar…", + "catalog.saving": "A guardar…", + "catalog.adding": "A adicionar…", + "catalog.assigning": "A atribuir…", + "catalog.uploading": "A carregar…", "catalog.create": "Criar", "catalog.createFailed": "Falha ao criar", - "catalog.updateFailed": "Falha na atualização", + "catalog.updateFailed": "Falha na atualização", "catalog.deleteFailed": "Falha ao eliminar", - "catalog.importFailed": "Falha na importação", + "catalog.importFailed": "Falha na importação", "catalog.confirm": "Confirmar", - "catalog.confirmDeletion": "Confirmar eliminação", + "catalog.confirmDeletion": "Confirmar eliminação", "catalog.areYouSure": "Tem a certeza?", "catalog.previous": "Anterior", "catalog.next": "Seguinte", @@ -2624,7 +2625,7 @@ export const pt: MessageDict = { "catalog.collapse": "Recolher", "catalog.clearSearch": "Limpar pesquisa", "catalog.clearFilters": "Limpar filtros", - "catalog.clearSelection": "Limpar seleção", + "catalog.clearSelection": "Limpar seleção", "catalog.add": "Adicionar", "catalog.update": "Atualizar", "catalog.edit": "Editar", @@ -2636,307 +2637,307 @@ export const pt: MessageDict = { "catalog.closePanel": "Fechar painel", "catalog.closeMenus": "Fechar menus", "catalog.openMenu": "Abrir menu", - "catalog.loading": "A carregar…", + "catalog.loading": "A carregar…", "catalog.empty": "Vazio", - "catalog.required": "Obrigatório", + "catalog.required": "Obrigatório", "catalog.optional": "Opcional", "catalog.features": "Funcionalidades", - "catalog.csvImportFinished": "Importação CSV concluída.", + "catalog.csvImportFinished": "Importação CSV concluída.", "catalog.comparePlans": "Comparar planos", - "catalog.saveChanges": "Guardar alterações", - "catalog.saveFormula": "Guardar fórmula", - "catalog.saveFormulaShort": "Guardar fórmula", + "catalog.saveChanges": "Guardar alterações", + "catalog.saveFormula": "Guardar fórmula", + "catalog.saveFormulaShort": "Guardar fórmula", "catalog.noResults": "Sem resultados", "products.title": "Produtos", - "products.description": "Explore, reveja e processe o seu catálogo.", + "products.description": "Explore, reveja e processe o seu catálogo.", "products.loadFailed": "Falha ao carregar produtos", "products.unnamed": "Produto sem nome", "products.tabs.navLabel": "Vistas de produtos", "products.tab.processed": "Processados", - "products.tab.processedHint": "Produtos concluídos prontos para exportar ou sincronizar", - "products.tab.needsReview": "Precisa de revisão", + "products.tab.processedHint": "Produtos concluídos prontos para exportar ou sincronizar", + "products.tab.needsReview": "Precisa de revisão", "products.tab.needsReviewHint": "Produtos enriquecidos a aceitar, editar ou rejeitar", "products.tab.needsReviewShort": "Rever", "products.tab.error": "Erros", "products.tab.errorHint": "Produtos que falharam durante um trabalho", "products.tab.processing": "Em curso", - "products.tab.processingHint": "Produtos num trabalho em execução", + "products.tab.processingHint": "Produtos num trabalho em execução", "products.tab.busy": "Em curso", - "products.tab.unprocessed": "Não processados", - "products.tab.unprocessedHint": "Produtos do catálogo ainda não processados", - "products.tab.raw": "Não processados", + "products.tab.unprocessed": "Não processados", + "products.tab.unprocessedHint": "Produtos do catálogo ainda não processados", + "products.tab.raw": "Não processados", "products.status.processed": "Processados", - "products.status.needsReview": "Precisa de revisão", + "products.status.needsReview": "Precisa de revisão", "products.status.processing": "Processamento", "products.status.error": "Erro", "products.status.failed": "Falhado", - "products.status.unprocessed": "Não processados", + "products.status.unprocessed": "Não processados", "products.status.pending": "Pendente", "products.status.unknown": "Desconhecido", - "products.pagination.showing": "A mostrar {start}–{end} de {total}", + "products.pagination.showing": "A mostrar {start}–{end} de {total}", "products.empty.processing.title": "Ainda sem trabalhos", - "products.empty.processing.messageJobs": "Nada está a correr agora. Inicie um trabalho a partir de Não processados, ou abra Processamento para ver o progresso.", - "products.empty.processing.messageBasic": "Os produtos aparecem aqui enquanto um trabalho está a decorrer.", - "products.empty.needsReview.title": "Nenhum produto a precisar de revisão", - "products.empty.needsReview.message": "Após um trabalho, os produtos enriquecidos aparecem aqui. Abra uma linha para comparar original vs enriquecido e Aceitar, editar ou Rejeitar.", + "products.empty.processing.messageJobs": "Nada está a correr agora. Inicie um trabalho a partir de Não processados, ou abra Processamento para ver o progresso.", + "products.empty.processing.messageBasic": "Os produtos aparecem aqui enquanto um trabalho está a decorrer.", + "products.empty.needsReview.title": "Nenhum produto a precisar de revisão", + "products.empty.needsReview.message": "Após um trabalho, os produtos enriquecidos aparecem aqui. Abra uma linha para comparar original vs enriquecido e Aceitar, editar ou Rejeitar.", "products.empty.error.title": "Nenhum produto com erros", "products.empty.error.message": "Quando um trabalho falha para um produto, ele aparece aqui para poder tentar novamente.", - "products.empty.noUnprocessedMatches": "Sem correspondências não processadas", + "products.empty.noUnprocessedMatches": "Sem correspondências não processadas", "products.empty.noMatch": "Nenhum produto corresponde", - "products.empty.filtersHint": "Tente outra pesquisa, categoria ou feed — ou limpe os filtros para ver tudo.", - "products.empty.noUnprocessed.title": "Ainda sem produtos não processados", + "products.empty.filtersHint": "Tente outra pesquisa, categoria ou feed — ou limpe os filtros para ver tudo.", + "products.empty.noUnprocessed.title": "Ainda sem produtos não processados", "products.empty.noUnprocessed.message": "Ligue um feed de fornecedor ou carregue um CSV para importar produtos.", "products.empty.none.title": "Ainda sem produtos", - "products.empty.none.messageStores": "Conclua primeiro Feeds → Map → Sync e depois Process. Importe de um feed ou loja.", - "products.empty.none.messageBasic": "Conclua primeiro Feeds → Map → Sync e depois Process. Ligue um feed ou carregue um CSV.", + "products.empty.none.messageStores": "Conclua primeiro Feeds → Map → Sync e depois Process. Importe de um feed ou loja.", + "products.empty.none.messageBasic": "Conclua primeiro Feeds → Map → Sync e depois Process. Ligue um feed ou carregue um CSV.", "products.actions.viewJobs": "Ver trabalhos", "products.actions.startJob": "Iniciar um trabalho", "products.actions.viewProcessed": "Ver processados", - "products.actions.retryFromCatalog": "Tentar novamente a partir do catálogo", + "products.actions.retryFromCatalog": "Tentar novamente a partir do catálogo", "products.actions.connectFeed": "Ligar feed", "products.actions.addProduct": "Adicionar produto", "products.actions.uploadCsv": "Carregar CSV", "products.actions.exportSelected": "Exportar selecionados", "products.export.title": "Exportar produtos selecionados", - "products.export.confirm": "Confirmar exportação", - "products.export.loadFailed": "Falha ao carregar as opções de feed de exportação. Tente novamente.", - "products.export.noneFound": "Ainda sem feeds de exportação. Crie um em Feeds de exportação e volte para exportar a sua seleção.", - "products.export.selectFormat": "Selecione um feed de exportação.", - "products.export.failed": "Não foi possível exportar os produtos selecionados", + "products.export.confirm": "Confirmar exportação", + "products.export.loadFailed": "Falha ao carregar as opções de feed de exportação. Tente novamente.", + "products.export.noneFound": "Ainda sem feeds de exportação. Crie um em Feeds de exportação e volte para exportar a sua seleção.", + "products.export.selectFormat": "Selecione um feed de exportação.", + "products.export.failed": "Não foi possível exportar os produtos selecionados", "products.upload.title": "Carregar CSV", - "products.upload.description": "Importe produtos de um CSV (GTIN/EAN, nome, categoria, …). Descarregue o exemplo para o conjunto completo de colunas.", + "products.upload.description": "Importe produtos de um CSV (GTIN/EAN, nome, categoria, …). Descarregue o exemplo para o conjunto completo de colunas.", "products.upload.submit": "Carregar e importar", "products.upload.chooseFirst": "Escolha primeiro um ficheiro CSV.", "products.upload.csvOnly": "Carregue um ficheiro CSV.", "products.upload.tooLarge": "CSV must be 5 MB or smaller.", "products.processing.started": "Trabalho de processamento iniciado", - "products.processing.startFailed": "Não foi possível iniciar o processamento", - "products.processing.startJobFailed": "Não foi possível iniciar o trabalho de processamento", + "products.processing.startFailed": "Não foi possível iniciar o processamento", + "products.processing.startJobFailed": "Não foi possível iniciar o trabalho de processamento", "products.processing.cancelled": "Processamento cancelado", "products.processing.jobsCancelled": "Trabalhos de processamento cancelados", - "products.processing.cancelFailed": "Não foi possível cancelar o trabalho de processamento", - "products.processing.justCancelled": "O trabalho recém-iniciado foi cancelado.", + "products.processing.cancelFailed": "Não foi possível cancelar o trabalho de processamento", + "products.processing.justCancelled": "O trabalho recém-iniciado foi cancelado.", "products.processing.viewInProcessing": "Ver em Processamento", "products.processing.confirm": "Confirmar processamento", - "products.processing.freePlanTitle": "Plano Free — processamento sem IA", - "products.processing.freePlanBody": "Normalizar, especificações, preencher e EPREL não consomem créditos. Títulos/descrições AI requerem um plano pago ou créditos.", + "products.processing.freePlanTitle": "Plano Free — processamento sem IA", + "products.processing.freePlanBody": "Normalizar, especificações, preencher e EPREL não consomem créditos. Títulos/descrições AI requerem um plano pago ou créditos.", "products.enrichment.acceptTitle": "Aceitar o enriquecimento?", - "products.enrichment.acceptConfirm": "Confirmar aceitação do enriquecimento", - "products.enrichment.acceptSelected": "Aceitar o enriquecimento de {count} produto(s) selecionado(s)? Passarão para Processados.", - "products.enrichment.rejectConfirm": "Confirmar rejeição do enriquecimento", - "products.enrichment.rejectBody": "Rejeitar o enriquecimento e devolver este produto a não processado? Pode voltar a processar mais tarde.", - "products.enrichment.rejectSelectedConfirm": "Confirmar rejeição dos selecionados", - "products.enrichment.resetConfirm": "Confirmar reposição para não processado", - "products.enrichment.resetSelected": "Repor {count} produto(s) selecionado(s) para não processado? Voltarão a aparecer como itens não processados.", - "products.enrichment.accepted": "Enriquecimento aceite — movido para Processados.", - "products.enrichment.rejected": "Enriquecimento rejeitado — produto devolvido a não processado.", - "products.enrichment.acceptFailed": "Não foi possível aceitar o enriquecimento", - "products.enrichment.rejectFailed": "Não foi possível rejeitar o enriquecimento", - "products.enrichment.acceptUndone": "Aceitação anulada", - "products.enrichment.undoAcceptFailed": "Não foi possível anular a aceitação", - "products.enrichment.resetDone": "Produto devolvido a não processado.", - "products.enrichment.resetFailed": "Não foi possível repor os produtos", + "products.enrichment.acceptConfirm": "Confirmar aceitação do enriquecimento", + "products.enrichment.acceptSelected": "Aceitar o enriquecimento de {count} produto(s) selecionado(s)? Passarão para Processados.", + "products.enrichment.rejectConfirm": "Confirmar rejeição do enriquecimento", + "products.enrichment.rejectBody": "Rejeitar o enriquecimento e devolver este produto a não processado? Pode voltar a processar mais tarde.", + "products.enrichment.rejectSelectedConfirm": "Confirmar rejeição dos selecionados", + "products.enrichment.resetConfirm": "Confirmar reposição para não processado", + "products.enrichment.resetSelected": "Repor {count} produto(s) selecionado(s) para não processado? Voltarão a aparecer como itens não processados.", + "products.enrichment.accepted": "Enriquecimento aceite — movido para Processados.", + "products.enrichment.rejected": "Enriquecimento rejeitado — produto devolvido a não processado.", + "products.enrichment.acceptFailed": "Não foi possível aceitar o enriquecimento", + "products.enrichment.rejectFailed": "Não foi possível rejeitar o enriquecimento", + "products.enrichment.acceptUndone": "Aceitação anulada", + "products.enrichment.undoAcceptFailed": "Não foi possível anular a aceitação", + "products.enrichment.resetDone": "Produto devolvido a não processado.", + "products.enrichment.resetFailed": "Não foi possível repor os produtos", "products.enrichment.valueReset": "Valor enriquecido reposto para o original.", - "products.enrichment.originalEmpty": "O valor original está vazio; o enriquecimento não pode ser limpo via PATCH.", - "products.enrichment.staysNeedsReview": "O produto permanece em Needs Review até aceitar tudo.", - "products.field.nameAcceptUndone": "Aceitação do nome anulada", - "products.field.descriptionAcceptUndone": "Aceitação da descrição anulada", + "products.enrichment.originalEmpty": "O valor original está vazio; o enriquecimento não pode ser limpo via PATCH.", + "products.enrichment.staysNeedsReview": "O produto permanece em Needs Review até aceitar tudo.", + "products.field.nameAcceptUndone": "Aceitação do nome anulada", + "products.field.descriptionAcceptUndone": "Aceitação da descrição anulada", "products.field.nameDiscardUndone": "Descarte do nome anulado", - "products.field.descriptionDiscardUndone": "Descarte da descrição anulado", - "products.field.undoAcceptFailed": "Não foi possível anular a aceitação do campo", - "products.field.undoDiscardFailed": "Não foi possível anular o descarte do campo", - "products.updateFailed": "Não foi possível atualizar o produto", + "products.field.descriptionDiscardUndone": "Descarte da descrição anulado", + "products.field.undoAcceptFailed": "Não foi possível anular a aceitação do campo", + "products.field.undoDiscardFailed": "Não foi possível anular o descarte do campo", + "products.updateFailed": "Não foi possível atualizar o produto", "products.keyboardTips": "Atalhos de teclado", "products.keyboardTipsShort": "Atalhos de teclado (?)", "products.option.categories": "Categorias", - "products.option.attributes": "Atributos / especificações", - "products.option.titlesAi": "Títulos (IA)", - "products.option.descriptionsAi": "Descrições (IA)", + "products.option.attributes": "Atributos / especificações", + "products.option.titlesAi": "Títulos (IA)", + "products.option.descriptionsAi": "Descrições (IA)", "products.enrichment.piece.name": "Nome", - "products.enrichment.piece.description": "Descrição", + "products.enrichment.piece.description": "Descrição", "products.enrichment.piece.attributes": "Atributos", "products.enrichment.piece.category": "Categoria", "products.enrichment.state.processed": "Processados", "products.enrichment.state.feed": "Do feed", "products.enrichment.state.missing": "Em falta", - "products.enrichment.help.name": "Título do produto. Verde = nome processado com AI; laranja = apenas nome do feed/original; cinzento = em falta.", - "products.enrichment.help.description": "Descrição do produto. Verde = processada com AI; laranja = apenas feed/original; cinzento = em falta.", - "products.enrichment.help.attributes": "Especificações e atributos. Verde = atributos AI/enriquecidos; laranja = apenas do feed; cinzento = nenhum.", - "products.enrichment.help.category": "Categoria atribuída. Verde = categoria definida; cinzento = em falta.", + "products.enrichment.help.name": "Título do produto. Verde = nome processado com AI; laranja = apenas nome do feed/original; cinzento = em falta.", + "products.enrichment.help.description": "Descrição do produto. Verde = processada com AI; laranja = apenas feed/original; cinzento = em falta.", + "products.enrichment.help.attributes": "Especificações e atributos. Verde = atributos AI/enriquecidos; laranja = apenas do feed; cinzento = nenhum.", + "products.enrichment.help.category": "Categoria atribuída. Verde = categoria definida; cinzento = em falta.", "products.enrichment.chipTitle": "{label}: {state}. {help}", - "products.enrichment.complete": "Completo — {parts}", - "products.enrichment.missingSummary": "Falta {missing} — {parts}", - "products.issue.title": "título", + "products.enrichment.complete": "Completo — {parts}", + "products.enrichment.missingSummary": "Falta {missing} — {parts}", + "products.issue.title": "título", "products.issue.gtin": "GTIN", "products.issue.category": "categoria", "products.filters.allCategories": "Todas as categorias", "products.filters.allFeeds": "Todos os feeds", "products.filters.allCoverage": "Toda a cobertura", - "products.filters.anyFeedChange": "Qualquer alteração de feed", + "products.filters.anyFeedChange": "Qualquer alteração de feed", "products.filters.eprelAll": "EPREL: todos", - "products.filters.feedChangesAll": "Alterações de feed: todas", + "products.filters.feedChangesAll": "Alterações de feed: todas", "products.filters.byCategory": "Filtrar por categoria", "products.filters.byCoverage": "Filtrar by coverage", "products.filters.byFeed": "Filtrar por feed", "products.filters.byEprel": "Filtrar por EPREL", "products.filters.byFeedSync": "Filtrar by feed sync changes", - "products.filters.coverageHint": "Filtrar por completude de Nome / Descrição / Atributos / Categoria", + "products.filters.coverageHint": "Filtrar por completude de Nome / Descrição / Atributos / Categoria", "products.filters.feedSyncHint": "Filtrar by price/stock/title changes from the latest feed sync", - "products.filters.eprelHint": "Filtrar produtos que têm ou não um id de registo EPREL de etiqueta energética", + "products.filters.eprelHint": "Filtrar produtos que têm ou não um id de registo EPREL de etiqueta energética", "products.filters.availabilityChanged": "Disponibilidade alterada", "products.eprel.badgeTitle": "Id EPREL presente neste produto (European Product Registry for Energy Labelling).", - "products.eprel.help": "O id European Product Registry for Energy Labelling (EPREL) está presente neste produto.", + "products.eprel.help": "O id European Product Registry for Energy Labelling (EPREL) está presente neste produto.", "products.feedData": "Dados do feed", "attributes.title": "Atributos", - "attributes.description": "Defina campos de produto, valores de lista e atribuições de categoria.", + "attributes.description": "Defina campos de produto, valores de lista e atribuições de categoria.", "attributes.loadFailed": "Falha ao carregar os atributos", - "attributes.loading": "A carregar atributos…", + "attributes.loading": "A carregar atributos…", "attributes.zero": "0 atributos", "attributes.addNew": "Adicionar novo atributo", "attributes.create": "Criar atributo", "attributes.edit": "Editar atributo", "attributes.delete": "Eliminar atributo", "attributes.displayName": "Nome a mostrar do atributo", - "attributes.actions": "Ações do atributo", + "attributes.actions": "Ações do atributo", "attributes.created": "Atributo criado.", - "attributes.createdAssignFailed": "Atributo criado, mas a atribuição de categoria falhou.", + "attributes.createdAssignFailed": "Atributo criado, mas a atribuição de categoria falhou.", "attributes.updated": "Atributo atualizado.", "attributes.deleted": "Atributo eliminado.", "attributes.addValue": "Adicionar valor", "attributes.manageValues": "Adicionar, editar ou remover valores para este atributo de lista.", - "attributes.valueTypeHint": "Escolha como os valores são introduzidos para este atributo.", - "attributes.createDescription": "Crie uma nova definição de atributo. Pode atribuí-la a uma categoria durante a criação.", + "attributes.valueTypeHint": "Escolha como os valores são introduzidos para este atributo.", + "attributes.createDescription": "Crie uma nova definição de atributo. Pode atribuí-la a uma categoria durante a criação.", "attributes.assignToCategories": "Atribuir atributos a categorias", - "attributes.assignFailed": "Não foi possível atribuir o atributo à categoria selecionada.", - "attributes.bulkAssignFailed": "Falha na atribuição em massa", + "attributes.assignFailed": "Não foi possível atribuir o atributo à categoria selecionada.", + "attributes.bulkAssignFailed": "Falha na atribuição em massa", "attributes.filterByCategory": "Filtrar por categoria", - "attributes.saveValueFailed": "Não foi possível guardar o valor", - "attributes.deleteValueFailed": "Não foi possível eliminar o valor", - "attributes.csvNeedHeader": "O CSV deve incluir um cabeçalho e pelo menos uma linha", + "attributes.saveValueFailed": "Não foi possível guardar o valor", + "attributes.deleteValueFailed": "Não foi possível eliminar o valor", + "attributes.csvNeedHeader": "O CSV deve incluir um cabeçalho e pelo menos uma linha", "attributes.csvNeedColumns": "O CSV deve incluir as colunas \"category_id\" e \"attribute_key\"", "attributes.type.string": "Texto", - "attributes.type.stringHint": "Texto livre — nomes, modelos, notas curtas", - "attributes.type.number": "Número", - "attributes.type.numberHint": "Valor numérico; adicione uma unidade se for útil (cm, kg, W)", - "attributes.type.boolean": "Sim / Não", - "attributes.type.booleanHint": "Verdadeiro ou falso — ex. tem GPS, carregamento sem fios", + "attributes.type.stringHint": "Texto livre — nomes, modelos, notas curtas", + "attributes.type.number": "Número", + "attributes.type.numberHint": "Valor numérico; adicione uma unidade se for útil (cm, kg, W)", + "attributes.type.boolean": "Sim / Não", + "attributes.type.booleanHint": "Verdadeiro ou falso — ex. tem GPS, carregamento sem fios", "attributes.type.date": "Data", - "attributes.type.dateHint": "Uma data de calendário (lançamento, fim de garantia, …)", + "attributes.type.dateHint": "Uma data de calendário (lançamento, fim de garantia, …)", "attributes.type.list": "Lista pendente", - "attributes.type.listHint": "Escolha exatamente uma opção de uma lista definida", - "attributes.type.multiselect": "Seleção múltipla", - "attributes.type.multiselectHint": "Escolha uma ou mais opções de uma lista", + "attributes.type.listHint": "Escolha exatamente uma opção de uma lista definida", + "attributes.type.multiselect": "Seleção múltipla", + "attributes.type.multiselectHint": "Escolha uma ou mais opções de uma lista", "attributes.color": "Cor", "categories.title": "Categorias", - "categories.description": "Organize a hierarquia do catálogo. Edite uma categoria para abrir fórmulas de título/descrição e prompts IA.", + "categories.description": "Organize a hierarquia do catálogo. Edite uma categoria para abrir fórmulas de título/descrição e prompts IA.", "categories.loadFailed": "Falha ao carregar as categorias", "categories.add": "Adicionar categoria", "categories.edit": "Editar categoria", "categories.delete": "Eliminar categoria", - "categories.deleteConfirm": "Tem a certeza de que pretende eliminar esta categoria? Esta ação não pode ser anulada.", + "categories.deleteConfirm": "Tem a certeza de que pretende eliminar esta categoria? Esta ação não pode ser anulada.", "categories.name": "Nome da categoria", "categories.namePlaceholder": "Nome da categoria", - "categories.descriptionPlaceholder": "Descrição opcional da categoria", + "categories.descriptionPlaceholder": "Descrição opcional da categoria", "categories.uniqueIdPlaceholder": "Identificador exclusivo opcional", "categories.searchPlaceholder": "Pesquisar por nome ou ID...", "categories.created": "{name} foi criado.", "categories.updated": "A categoria foi atualizada com sucesso.", "categories.deleted": "A categoria foi eliminada com sucesso.", - "categories.notFound": "Categoria não encontrada.", + "categories.notFound": "Categoria não encontrada.", "categories.loadCategoryFailed": "Falha ao carregar a categoria", "categories.noCategoriesYet": "Ainda sem categorias", - "categories.noMatch": "Nenhuma categoria corresponde a “{query}”. Limpe a pesquisa ou tente outro termo.", - "categories.emptyHint": "Adicione uma categoria ou importe um CSV para construir a árvore.", - "categories.promptCountOne": "{count} categoria tem um prompt de geração IA. Abra o menu ⋮ → Editar prompt IA, ou edite uma categoria e escolha Editar prompt IA.", - "categories.promptCountMany": "{count} categorias têm um prompt de geração IA. Abra o menu ⋮ → Editar prompt IA, ou edite uma categoria e escolha Editar prompt IA.", - "categories.actions": "Ações de categoria", + "categories.noMatch": "Nenhuma categoria corresponde a “{query}”. Limpe a pesquisa ou tente outro termo.", + "categories.emptyHint": "Adicione uma categoria ou importe um CSV para construir a árvore.", + "categories.promptCountOne": "{count} categoria tem um prompt de geração IA. Abra o menu â‹® → Editar prompt IA, ou edite uma categoria e escolha Editar prompt IA.", + "categories.promptCountMany": "{count} categorias têm um prompt de geração IA. Abra o menu â‹® → Editar prompt IA, ou edite uma categoria e escolha Editar prompt IA.", + "categories.actions": "Ações de categoria", "categories.chooseCsv": "Escolher CSV", - "categories.createSingleOrImport": "Crie uma única categoria ou importe várias a partir de CSV.", - "categories.createSingle": "Criar uma única categoria.", - "categories.missingNameColumn": "Falta a coluna obrigatória 'name'", - "categories.missingUniqueIdColumn": "Falta a coluna obrigatória 'unique_id'", - "categories.nameAndIdRequired": "O nome e o ID único são obrigatórios.", - "categories.csvNeedRows": "O ficheiro deve ter uma linha de cabeçalho e pelo menos uma linha de dados", - "categories.titleFormula": "Fórmula de título", - "categories.descriptionFormula": "Fórmula de descrição", - "categories.setTitleFormula": "Definir fórmula de título", - "categories.editTitleFormula": "Editar fórmula de título", - "categories.setDescriptionFormula": "Definir fórmula de descrição", - "categories.editDescriptionFormula": "Editar fórmula de descrição", + "categories.createSingleOrImport": "Crie uma única categoria ou importe várias a partir de CSV.", + "categories.createSingle": "Criar uma única categoria.", + "categories.missingNameColumn": "Falta a coluna obrigatória 'name'", + "categories.missingUniqueIdColumn": "Falta a coluna obrigatória 'unique_id'", + "categories.nameAndIdRequired": "O nome e o ID único são obrigatórios.", + "categories.csvNeedRows": "O ficheiro deve ter uma linha de cabeçalho e pelo menos uma linha de dados", + "categories.titleFormula": "Fórmula de título", + "categories.descriptionFormula": "Fórmula de descrição", + "categories.setTitleFormula": "Definir fórmula de título", + "categories.editTitleFormula": "Editar fórmula de título", + "categories.setDescriptionFormula": "Definir fórmula de descrição", + "categories.editDescriptionFormula": "Editar fórmula de descrição", "categories.setAiPrompt": "Definir prompt IA", "categories.editAiPrompt": "Editar prompt IA", "categories.editAiPromptShort": "Editar prompt IA", - "categories.aiPromptSet": "Há um prompt de geração IA definido", + "categories.aiPromptSet": "Há um prompt de geração IA definido", "categories.aiPromptTitle": "Prompt IA da categoria", - "categories.aiPromptDescription": "Modelo de geração por categoria usado ao enriquecer produtos nesta categoria.", + "categories.aiPromptDescription": "Modelo de geração por categoria usado ao enriquecer produtos nesta categoria.", "categories.aiPromptSaved": "Prompt IA guardado.", "categories.aiPromptCleared": "Prompt IA limpo (aplica-se o predefinido da empresa).", "categories.aiPromptSaveFailed": "Falha ao guardar o prompt", "categories.aiPromptAssignFailed": "Falha ao atribuir o prompt", "categories.assignAiPrompt": "Atribuir prompt IA", - "categories.assignAiPromptHelp": "Copie este prompt de geração IA para outras categorias.", - "categories.loadingPrompt": "A carregar prompt…", + "categories.assignAiPromptHelp": "Copie este prompt de geração IA para outras categorias.", + "categories.loadingPrompt": "A carregar prompt…", "categories.brandVoice": "Voz da marca", "categories.productName": "Nome do produto", "categories.gtin": "GTIN", - "categories.backToCategories": "Voltar às categorias", - "categories.cancelReturn": "Cancelar e voltar às categorias", - "categories.assignFormula": "Atribuir fórmula", - "categories.assignFormulaOther": "Atribuir fórmula a outras categorias", - "categories.assignTitleFormula": "Atribuir fórmula de título", - "categories.assignDescriptionFormula": "Atribuir fórmula de descrição", + "categories.backToCategories": "Voltar às categorias", + "categories.cancelReturn": "Cancelar e voltar às categorias", + "categories.assignFormula": "Atribuir fórmula", + "categories.assignFormulaOther": "Atribuir fórmula a outras categorias", + "categories.assignTitleFormula": "Atribuir fórmula de título", + "categories.assignDescriptionFormula": "Atribuir fórmula de descrição", "categories.assignSelectHelp": "Selecione as categorias a que aplicar este modelo.", - "categories.assignTitleHelp": "Selecione as categorias a que aplicar este modelo de fórmula de título.", - "categories.assignDescriptionHelp": "Selecione as categorias a que aplicar este modelo de fórmula de descrição.", - "categories.searchCategories": "Pesquisar categorias…", + "categories.assignTitleHelp": "Selecione as categorias a que aplicar este modelo de fórmula de título.", + "categories.assignDescriptionHelp": "Selecione as categorias a que aplicar este modelo de fórmula de descrição.", + "categories.searchCategories": "Pesquisar categorias…", "categories.matching": " correspondentes", - "categories.titleFormulaHelp": "Crie títulos de produto a partir de variáveis e texto estático para esta categoria.", - "categories.descriptionFormulaHelp": "Defina o texto meta SEO e as secções de corpo que a IA deve gerar para esta categoria.", - "categories.loadingFormula": "A carregar fórmula…", - "categories.titleFormulaSaved": "Fórmula de título guardada com êxito", - "categories.titleFormulaRemoved": "Fórmula de título removida com êxito", - "categories.titleFormulaSaveFailed": "Falha ao guardar a fórmula de título", - "categories.titleFormulaAssignFailed": "Falha ao atribuir a fórmula de título", - "categories.descriptionFormulaRemoved": "Fórmula de descrição removida com êxito", - "categories.descriptionFormulaSaved": "Fórmula de descrição guardada com sucesso", - "categories.descriptionFormulaSavedWithExports": "Fórmula de descrição guardada com sucesso e {count} IDs de exportação sincronizados", - "categories.descriptionFormulaSaveFailed": "Falha ao guardar a fórmula de descrição", - "categories.descriptionFormulaAssignFailed": "Falha ao atribuir a fórmula de descrição", - "categories.seoTitlePlaceholder": "Indique à IA como escrever o título SEO…", - "categories.seoDescriptionPlaceholder": "Indique à IA como escrever a descrição SEO…", - "categories.sectionPromptPlaceholder": "O que deve a IA escrever nesta secção?", - "categories.sectionKeyPlaceholder": "p. ex. short_description (letras, números, _)", - "categories.formulaElementTypes": "Tipos de elemento de fórmula", - "categories.formulaElements": "Elementos de fórmula", + "categories.titleFormulaHelp": "Crie títulos de produto a partir de variáveis e texto estático para esta categoria.", + "categories.descriptionFormulaHelp": "Defina o texto meta SEO e as secções de corpo que a IA deve gerar para esta categoria.", + "categories.loadingFormula": "A carregar fórmula…", + "categories.titleFormulaSaved": "Fórmula de título guardada com êxito", + "categories.titleFormulaRemoved": "Fórmula de título removida com êxito", + "categories.titleFormulaSaveFailed": "Falha ao guardar a fórmula de título", + "categories.titleFormulaAssignFailed": "Falha ao atribuir a fórmula de título", + "categories.descriptionFormulaRemoved": "Fórmula de descrição removida com êxito", + "categories.descriptionFormulaSaved": "Fórmula de descrição guardada com sucesso", + "categories.descriptionFormulaSavedWithExports": "Fórmula de descrição guardada com sucesso e {count} IDs de exportação sincronizados", + "categories.descriptionFormulaSaveFailed": "Falha ao guardar a fórmula de descrição", + "categories.descriptionFormulaAssignFailed": "Falha ao atribuir a fórmula de descrição", + "categories.seoTitlePlaceholder": "Indique à IA como escrever o título SEO…", + "categories.seoDescriptionPlaceholder": "Indique à IA como escrever a descrição SEO…", + "categories.sectionPromptPlaceholder": "O que deve a IA escrever nesta secção?", + "categories.sectionKeyPlaceholder": "p. ex. short_description (letras, números, _)", + "categories.formulaElementTypes": "Tipos de elemento de fórmula", + "categories.formulaElements": "Elementos de fórmula", "categories.elementSeparator": "Separador de elementos", - "categories.elementSeparatorHint": "Espaço, travessão, etc.", + "categories.elementSeparatorHint": "Espaço, travessão, etc.", "categories.dragToReorder": "Arraste para reordenar", - "categories.addCustomVariable": "Adicionar variável personalizada", - "categories.editCustomVariable": "Editar variável personalizada", - "categories.customVariableHelp": "Defina uma variável reutilizável para fórmulas de título.", - "categories.manageVariables": "Gerir variáveis", - "categories.manageVariablesHelp": "Ver, editar e adicionar variáveis para as suas fórmulas de título.", - "categories.searchVariables": "Pesquisar variáveis…", - "categories.variableAdded": "Variável adicionada com êxito", - "categories.variableUpdated": "Variável atualizada com êxito", - "categories.variableDeleted": "Variável eliminada com sucesso", - "categories.variableDeleteFailed": "Falha ao eliminar a variável", - "categories.variableNameRequired": "O nome da variável é obrigatório", - "categories.displayNameRequired": "O nome a apresentar é obrigatório", - "categories.variableNamePattern": "O nome só pode conter letras, números e underscores", - "categories.deleteVariableConfirm": "Tem a certeza de que pretende eliminar esta variável? Pode afetar fórmulas que a usam.", - "categories.removeElementConfirm": "Tem a certeza de que pretende remover este elemento da fórmula?", + "categories.addCustomVariable": "Adicionar variável personalizada", + "categories.editCustomVariable": "Editar variável personalizada", + "categories.customVariableHelp": "Defina uma variável reutilizável para fórmulas de título.", + "categories.manageVariables": "Gerir variáveis", + "categories.manageVariablesHelp": "Ver, editar e adicionar variáveis para as suas fórmulas de título.", + "categories.searchVariables": "Pesquisar variáveis…", + "categories.variableAdded": "Variável adicionada com êxito", + "categories.variableUpdated": "Variável atualizada com êxito", + "categories.variableDeleted": "Variável eliminada com sucesso", + "categories.variableDeleteFailed": "Falha ao eliminar a variável", + "categories.variableNameRequired": "O nome da variável é obrigatório", + "categories.displayNameRequired": "O nome a apresentar é obrigatório", + "categories.variableNamePattern": "O nome só pode conter letras, números e underscores", + "categories.deleteVariableConfirm": "Tem a certeza de que pretende eliminar esta variável? Pode afetar fórmulas que a usam.", + "categories.removeElementConfirm": "Tem a certeza de que pretende remover este elemento da fórmula?", "categories.addTextElement": "Adicionar elemento de texto", - "categories.addTextElementHelp": "Adicione um elemento de texto estático à sua fórmula.", + "categories.addTextElementHelp": "Adicione um elemento de texto estático à sua fórmula.", "categories.editTextElement": "Editar elemento de texto", - "categories.editTextElementHelp": "Edite o elemento de texto da sua fórmula.", - "categories.staticTextPlaceholder": "Introduzir texto estático", - "categories.textCannotBeEmpty": "O texto não pode estar vazio", + "categories.editTextElementHelp": "Edite o elemento de texto da sua fórmula.", + "categories.staticTextPlaceholder": "Introduzir texto estático", + "categories.textCannotBeEmpty": "O texto não pode estar vazio", "categories.exampleProductName": "Nome do produto", "categories.exampleWidget": "Acme Widget Pro (exemplo)", - "fields.title": "Campos padrão", - "fields.description": "Defina campos de produto padrão e organize-os em grupos", - "fields.loading": "A carregar campos standard…", + "fields.title": "Campos padrão", + "fields.description": "Defina campos de produto padrão e organize-os em grupos", + "fields.loading": "A carregar campos standard…", "fields.loadFailed": "Falha ao carregar os campos", "fields.loadGroupsFailed": "Falha ao carregar os grupos de campos", "fields.addField": "Adicionar novo campo", @@ -2945,21 +2946,21 @@ export const pt: MessageDict = { "fields.createGroup": "Criar grupo", "fields.editField": "Editar campo", "fields.editGroup": "Editar grupo", - "fields.basicInfo": "Informação básica", - "fields.createFieldHelp": "Crie um novo campo padrão para os seus dados de produto", - "fields.editFieldHelp": "Atualize os detalhes deste campo padrão", - "fields.createGroupHelp": "Crie um novo grupo para organizar os seus campos padrão", + "fields.basicInfo": "Informação básica", + "fields.createFieldHelp": "Crie um novo campo padrão para os seus dados de produto", + "fields.editFieldHelp": "Atualize os detalhes deste campo padrão", + "fields.createGroupHelp": "Crie um novo grupo para organizar os seus campos padrão", "fields.editGroupHelp": "Atualize os detalhes deste grupo de campos", "fields.dataTypeHint": "Tipo de dados deste campo", "fields.defaultValueOptional": "Valor predefinido (opcional)", - "fields.fieldDescriptionPlaceholder": "Introduza uma descrição para este campo", - "fields.groupDescriptionPlaceholder": "Introduza uma descrição para este grupo", - "fields.keyHint": "Apenas letras minúsculas, números e underscores", - "fields.exampleTitle": "Título do produto", + "fields.fieldDescriptionPlaceholder": "Introduza uma descrição para este campo", + "fields.groupDescriptionPlaceholder": "Introduza uma descrição para este grupo", + "fields.keyHint": "Apenas letras minúsculas, números e underscores", + "fields.exampleTitle": "Título do produto", "fields.noFields": "Nenhum campo encontrado. Clique em \"Adicionar campo\" para criar um.", - "fields.noFieldsMatch": "Nenhum campo corresponde à pesquisa", + "fields.noFieldsMatch": "Nenhum campo corresponde à pesquisa", "fields.noGroups": "Nenhum grupo encontrado. Crie o seu primeiro grupo.", - "fields.noGroupsMatch": "Nenhum grupo corresponde à pesquisa", + "fields.noGroupsMatch": "Nenhum grupo corresponde à pesquisa", "fields.fieldCreated": "Campo criado com sucesso", "fields.fieldUpdated": "Campo atualizado com sucesso", "fields.fieldDeleted": "Campo eliminado com sucesso", @@ -2972,69 +2973,69 @@ export const pt: MessageDict = { "fields.updateUnitFailed": "Falha ao atualizar a unidade", "fields.deleteFieldFailed": "Falha ao eliminar o campo", "fields.deleteGroupFailed": "Falha ao eliminar o grupo", - "fields.bulkUpdateFailed": "Falha na atualização em massa", + "fields.bulkUpdateFailed": "Falha na atualização em massa", "fields.enableRecommendedFailed": "Falha ao ativar os campos recomendados", "fields.enabledRecommended": "Campos de ecommerce recomendados ativados", - "fields.deleteFieldConfirm": "Esta ação não pode ser anulada. Eliminará permanentemente o campo e removê-lo-á de quaisquer modelos que o usem.", - "fields.deleteGroupConfirm": "Esta ação não pode ser anulada. Eliminará permanentemente o grupo. Os campos deste grupo terão de ser reatribuídos.", + "fields.deleteFieldConfirm": "Esta ação não pode ser anulada. Eliminará permanentemente o campo e removê-lo-á de quaisquer modelos que o usem.", + "fields.deleteGroupConfirm": "Esta ação não pode ser anulada. Eliminará permanentemente o grupo. Os campos deste grupo terão de ser reatribuídos.", "fields.type.string": "Texto", - "fields.type.stringHint": "Texto livre: nomes, códigos, notas curtas", - "fields.type.number": "Número", - "fields.type.numberHint": "Valor numérico; adicione uma unidade quando for útil (EUR, pcs)", - "fields.type.boolean": "Sim / Não", + "fields.type.stringHint": "Texto livre: nomes, códigos, notas curtas", + "fields.type.number": "Número", + "fields.type.numberHint": "Valor numérico; adicione uma unidade quando for útil (EUR, pcs)", + "fields.type.boolean": "Sim / Não", "fields.type.booleanHint": "Verdadeiro ou falso", "fields.type.date": "Data", - "fields.type.dateHint": "Uma data de calendário", + "fields.type.dateHint": "Uma data de calendário", "fields.type.url": "URL", - "fields.type.urlHint": "Ligação web (página de produto, vídeo, fabricante)", + "fields.type.urlHint": "Ligação web (página de produto, vídeo, fabricante)", "fields.type.image": "Imagem", "fields.type.imageHint": "URL de imagem ou imagem de galeria", - "fields.type.dimension": "Dimensão", + "fields.type.dimension": "Dimensão", "fields.type.dimensionHint": "Medida de comprimento (largura, altura, profundidade)", "fields.type.weight": "Peso", "fields.type.weightHint": "Massa / peso de envio", "fields.type.color": "Cor", - "fields.type.colorHint": "Nome ou código de cor", + "fields.type.colorHint": "Nome ou código de cor", "fields.type.custom": "Personalizado", "fields.type.customHint": "Campo especial / livre", "empty.admin.knowledgeHeading": "Conhecimento de suporte", - "empty.admin.translationsHeading": "Traduções", - "flash.attrs.createdLinkFailed": "Atributo criado, mas a atribuição de categoria falhou.", + "empty.admin.translationsHeading": "Traduções", + "flash.attrs.createdLinkFailed": "Atributo criado, mas a atribuição de categoria falhou.", "flash.attrs.created": "Atributo criado.", - "flash.attrs.csvImported": "Importação CSV concluída.", + "flash.attrs.csvImported": "Importação CSV concluída.", "flash.attrs.updated": "Atributo atualizado.", "flash.attrs.deleted": "Atributo eliminado.", "flash.attrs.valueDeleted": "Valor eliminado.", - "flash.attrs.assignedLinks": "Atribuída(s) {count} ligação(ões) categoria–atributo.", + "flash.attrs.assignedLinks": "Atribuída(s) {count} ligação(ões) categoria–atributo.", "flash.brand.saved": "Kit de marca guardado.", - "flash.brand.logoType": "O logótipo deve ser PNG, JPEG ou WebP", - "flash.brand.logoSize": "O logótipo excede o limite de 2 MiB", - "flash.brand.logoUploaded": "Logótipo carregado.", + "flash.brand.logoType": "O logótipo deve ser PNG, JPEG ou WebP", + "flash.brand.logoSize": "O logótipo excede o limite de 2 MiB", + "flash.brand.logoUploaded": "Logótipo carregado.", "flash.categories.updated": "A categoria foi atualizada com sucesso.", "flash.categories.deleted": "A categoria foi eliminada com sucesso.", - "flash.categories.csvImported": "Importação CSV concluída.", + "flash.categories.csvImported": "Importação CSV concluída.", "flash.products.csvImported": "Product CSV import finished.", - "flash.categories.descFormulaAssigned": "Fórmula de descrição atribuída a {count} categorias", - "flash.categories.promptAssigned": "Prompt atribuído a {count} {noun}.", + "flash.categories.descFormulaAssigned": "Fórmula de descrição atribuída a {count} categorias", + "flash.categories.promptAssigned": "Prompt atribuído a {count} {noun}.", "flash.categories.promptNounOne": "categoria", "flash.categories.promptNounMany": "categorias", - "flash.categories.titleFormulaAssigned": "Fórmula de título atribuída a {count} {noun}", - "flash.categories.variableDeleted": "Variável eliminada com sucesso", - "flash.export.updated": "Feed de exportação atualizado.", - "flash.export.created": "Feed de exportação criado.", - "flash.export.urlCopied": "URL público do feed {format} copiado. Cole-o em qualquer sistema que obtenha feeds de produto.", - "flash.export.copyFailed": "Falha ao copiar o URL para a área de transferência", + "flash.categories.titleFormulaAssigned": "Fórmula de título atribuída a {count} {noun}", + "flash.categories.variableDeleted": "Variável eliminada com sucesso", + "flash.export.updated": "Feed de exportação atualizado.", + "flash.export.created": "Feed de exportação criado.", + "flash.export.urlCopied": "URL público do feed {format} copiado. Cole-o em qualquer sistema que obtenha feeds de produto.", + "flash.export.copyFailed": "Falha ao copiar o URL para a área de transferência", "flash.export.refreshed": "Feed atualizado.", "flash.export.refreshedWithCount": "Feed atualizado ({count} produtos).", - "flash.export.deleted": "Feed de exportação eliminado com sucesso.", + "flash.export.deleted": "Feed de exportação eliminado com sucesso.", "flash.export.tokenRotated": "Token do URL publico rodado. Atualize sistemas que usam o URL antigo.", "common.edit": "Editar", "common.previous": "Anterior", "common.next": "Seguinte", - "common.saving": "A guardar…", - "common.deleting": "A eliminar…", - "common.adding": "A adicionar…", - "common.processing": "A processar…", + "common.saving": "A guardar…", + "common.deleting": "A eliminar…", + "common.adding": "A adicionar…", + "common.processing": "A processar…", "common.upload": "Carregar", "common.expand": "Expandir", "common.collapse": "Recolher", @@ -3051,7 +3052,7 @@ export const pt: MessageDict = { "common.areYouSure": "Tem a certeza?", "common.selectGroup": "Selecionar um grupo", "attributes.addAttribute": "Adicionar atributo", - "attributes.searchPlaceholder": "Pesquisar atributos…", + "attributes.searchPlaceholder": "Pesquisar atributos…", "attributes.searchAria": "Pesquisar atributos (prima Enter para pesquisar)", "attributes.filterCategoryAria": "Filtrar por categoria", "attributes.allCategories": "Todas as categorias", @@ -3060,49 +3061,49 @@ export const pt: MessageDict = { "attributes.col.type": "Tipo", "attributes.col.unit": "Unidade", "attributes.col.categories": "Categorias", - "attributes.col.updated": "Última atualização", - "attributes.col.actions": "Ações", + "attributes.col.updated": "Última atualização", + "attributes.col.actions": "Ações", "attributes.emptyTitle": "Nenhum atributo encontrado", "attributes.emptyFiltered": "Tente limpar a pesquisa ou o filtro de categoria.", - "attributes.emptyHint": "Adicione um atributo ou importe um CSV para começar.", + "attributes.emptyHint": "Adicione um atributo ou importe um CSV para começar.", "attributes.noValues": "Sem valores", - "attributes.actionsAria": "Ações do atributo", + "attributes.actionsAria": "Ações do atributo", "attributes.editDetails": "Editar detalhes", "attributes.loadingValues": "A carregar valores...", "attributes.noValuesYetHint": "Ainda sem valores. Use \"Manage Values\" para adicionar valores.", "attributes.pageZero": "0 atributos", - "attributes.pageShowing": "A mostrar {from}–{to} de {total} atributos", - "attributes.linkCategoryFailed": "Não foi possível atribuir o atributo à categoria selecionada.", - "attributes.createdLinkFailed": "Atributo criado, mas a atribuição de categoria falhou.", + "attributes.pageShowing": "A mostrar {from}–{to} de {total} atributos", + "attributes.linkCategoryFailed": "Não foi possível atribuir o atributo à categoria selecionada.", + "attributes.createdLinkFailed": "Atributo criado, mas a atribuição de categoria falhou.", "attributes.createFailed": "Falha ao criar", - "attributes.importFinished": "Importação CSV concluída.", - "attributes.importFailed": "Falha na importação", - "attributes.updateFailed": "Falha na atualização", + "attributes.importFinished": "Importação CSV concluída.", + "attributes.importFailed": "Falha na importação", + "attributes.updateFailed": "Falha na atualização", "attributes.deleteFailed": "Falha ao eliminar", "attributes.valueUpdated": "Valor atualizado.", "attributes.valueAdded": "Valor adicionado.", - "attributes.valueSaveFailed": "Não foi possível guardar o valor", + "attributes.valueSaveFailed": "Não foi possível guardar o valor", "attributes.valueDeleted": "Valor eliminado.", - "attributes.valueDeleteFailed": "Não foi possível eliminar o valor", - "attributes.csvNeedRows": "O CSV deve incluir um cabeçalho e pelo menos uma linha", + "attributes.valueDeleteFailed": "Não foi possível eliminar o valor", + "attributes.csvNeedRows": "O CSV deve incluir um cabeçalho e pelo menos uma linha", "attributes.rowUnknown": "Linha {row}: categoria ou atributo desconhecido", "attributes.rowLinkFailed": "Linha {row}: {detail}", - "attributes.linkFailedShort": "falha no vínculo", - "attributes.assignedLinks": "Atribuída(s) {count} ligação(ões) categoria–atributo.", + "attributes.linkFailedShort": "falha no vínculo", + "attributes.assignedLinks": "Atribuída(s) {count} ligação(ões) categoria–atributo.", "attributes.rowsFailed": "{count} linha(s) falharam.", "attributes.addTitle": "Adicionar novo atributo", - "attributes.addDesc": "Crie uma nova definição de atributo. Pode atribuí-la a uma categoria durante a criação.", + "attributes.addDesc": "Crie uma nova definição de atributo. Pode atribuí-la a uma categoria durante a criação.", "attributes.tab.single": "Individual", - "attributes.tab.bulk": "Importação em massa", + "attributes.tab.bulk": "Importação em massa", "attributes.field.key": "Chave do atributo", "attributes.field.keyPlaceholder": "atributo-key", "attributes.field.displayName": "Nome a mostrar", "attributes.field.displayNamePlaceholder": "Nome a mostrar do atributo", "attributes.field.type": "Tipo", - "attributes.field.typeDefaultHint": "Escolha como os valores são introduzidos para este atributo.", + "attributes.field.typeDefaultHint": "Escolha como os valores são introduzidos para este atributo.", "attributes.field.category": "Categoria", - "attributes.field.categoryPlaceholder": "Selecionar uma categoria…", - "attributes.field.categoryHint": "Selecione a categoria a que este atributo pertence. Os atributos devem ser atribuídos a uma categoria.", + "attributes.field.categoryPlaceholder": "Selecionar uma categoria…", + "attributes.field.categoryHint": "Selecione a categoria a que este atributo pertence. Os atributos devem ser atribuídos a uma categoria.", "attributes.field.unitOptional": "Unidade (opcional)", "attributes.field.unitPlaceholder": "p. ex. cm, kg, etc.", "attributes.field.exampleOptional": "Exemplo (opcional)", @@ -3112,57 +3113,57 @@ export const pt: MessageDict = { "attributes.bulk.downloadCsv": "Transferir modelo CSV", "attributes.bulk.downloadTsv": "Transferir modelo TSV", "attributes.bulk.uploadHint": "Carregue um ficheiro CSV ou TSV com as seguintes colunas:", - "attributes.bulk.col.key": "Identificador único (obrigatório)", - "attributes.bulk.col.name": "Nome a mostrar (obrigatório)", - "attributes.bulk.col.valueType": "string (Texto), number, boolean (Sim/Não), date, list (Lista pendente), multiselect", - "attributes.bulk.col.categoryId": "ID único da categoria", + "attributes.bulk.col.key": "Identificador único (obrigatório)", + "attributes.bulk.col.name": "Nome a mostrar (obrigatório)", + "attributes.bulk.col.valueType": "string (Texto), number, boolean (Sim/Não), date, list (Lista pendente), multiselect", + "attributes.bulk.col.categoryId": "ID único da categoria", "attributes.bulk.col.unitExample": "opcional", "attributes.bulk.col.parentKey": "Chave pai para valores de lista", "attributes.editTitle": "Editar atributo", "attributes.editDesc": "Atualizar os detalhes do atributo \"{name}\"", - "attributes.field.keyHint": "Identificador único deste atributo", - "attributes.field.displayNameHint": "O nome que será mostrado aos utilizadores", + "attributes.field.keyHint": "Identificador único deste atributo", + "attributes.field.displayNameHint": "O nome que será mostrado aos utilizadores", "attributes.deleteTitle": "Eliminar atributo", - "attributes.deleteDesc": "Tem a certeza de que pretende eliminar \"{name}\"? Esta ação não pode ser anulada.", - "attributes.deleteWarningValues": "Aviso: isto também eliminará todos os valores associados a este atributo.", + "attributes.deleteDesc": "Tem a certeza de que pretende eliminar \"{name}\"? Esta ação não pode ser anulada.", + "attributes.deleteWarningValues": "Aviso: isto também eliminará todos os valores associados a este atributo.", "attributes.manageTitleNamed": "Gerir valores de {name}", "attributes.manageTitle": "Gerir valores", "attributes.manageDesc": "Adicionar, editar ou remover valores para este atributo de lista.", "attributes.valueKey": "Chave do valor", - "attributes.valueKeyHint": "Identificador único deste valor", + "attributes.valueKeyHint": "Identificador único deste valor", "attributes.displayValue": "Valor a mostrar", "attributes.displayValuePlaceholder": "Valor a mostrar", - "attributes.displayValueHint": "O nome a mostrar que será apresentado para este valor", + "attributes.displayValueHint": "O nome a mostrar que será apresentado para este valor", "attributes.updateValue": "Atualizar valor", "attributes.noValuesYet": "Ainda sem valores.", "attributes.assignTitle": "Atribuir atributos a categorias", - "attributes.assignDesc": "Carregue um CSV que mapeia IDs únicos de categoria para chaves de atributo.", + "attributes.assignDesc": "Carregue um CSV que mapeia IDs únicos de categoria para chaves de atributo.", "attributes.downloadTemplate": "Transferir modelo", "attributes.csvFile": "Ficheiro CSV", - "attributes.assignSuccess": "Atribuições aplicadas com sucesso.", - "attributes.assigning": "A atribuir…", + "attributes.assignSuccess": "Atribuições aplicadas com sucesso.", + "attributes.assigning": "A atribuir…", "attributes.uploadAndAssign": "Carregar e atribuir", "attributes.type.string.label": "Texto", - "attributes.type.string.hint": "Texto livre — nomes, modelos, notas curtas", - "attributes.type.number.label": "Número", - "attributes.type.number.hint": "Valor numérico; adicione uma unidade se for útil (cm, kg, W)", - "attributes.type.boolean.label": "Sim / Não", - "attributes.type.boolean.hint": "Verdadeiro ou falso — ex. tem GPS, carregamento sem fios", + "attributes.type.string.hint": "Texto livre — nomes, modelos, notas curtas", + "attributes.type.number.label": "Número", + "attributes.type.number.hint": "Valor numérico; adicione uma unidade se for útil (cm, kg, W)", + "attributes.type.boolean.label": "Sim / Não", + "attributes.type.boolean.hint": "Verdadeiro ou falso — ex. tem GPS, carregamento sem fios", "attributes.type.date.label": "Data", - "attributes.type.date.hint": "Uma data de calendário (lançamento, fim de garantia, …)", + "attributes.type.date.hint": "Uma data de calendário (lançamento, fim de garantia, …)", "attributes.type.list.label": "Lista pendente", - "attributes.type.list.hint": "Escolha exatamente uma opção de uma lista definida", - "attributes.type.multiselect.label": "Seleção múltipla", - "attributes.type.multiselect.hint": "Escolha uma ou mais opções de uma lista", - "standardFields.title": "Campos padrão", - "standardFields.description": "Defina campos de produto padrão e organize-os em grupos", - "standardFields.apiUnavailable": "A API de campos standard não está disponível. As alterações não podem ser guardadas.", - "standardFields.apiUnreachable": "A API de campos padrão não está acessível agora. Criar/editar permanece desativado até /api/standard-fields e /api/field-groups responderem.", - "standardFields.loading": "A carregar campos standard…", + "attributes.type.list.hint": "Escolha exatamente uma opção de uma lista definida", + "attributes.type.multiselect.label": "Seleção múltipla", + "attributes.type.multiselect.hint": "Escolha uma ou mais opções de uma lista", + "standardFields.title": "Campos padrão", + "standardFields.description": "Defina campos de produto padrão e organize-os em grupos", + "standardFields.apiUnavailable": "A API de campos standard não está disponível. As alterações não podem ser guardadas.", + "standardFields.apiUnreachable": "A API de campos padrão não está acessível agora. Criar/editar permanece desativado até /api/standard-fields e /api/field-groups responderem.", + "standardFields.loading": "A carregar campos standard…", "standardFields.tab.fields": "Campos", "standardFields.tab.groups": "Grupos", - "standardFields.heading": "Campos padrão", - "standardFields.headingHint": "Ative campos para mapeamento e processamento — um interruptor por linha.", + "standardFields.heading": "Campos padrão", + "standardFields.headingHint": "Ative campos para mapeamento e processamento — um interruptor por linha.", "standardFields.enableRecommended": "Ativar recomendados", "standardFields.enableSelected": "Ativar selecionados ({count})", "standardFields.disableSelected": "Desativar selecionados", @@ -3175,17 +3176,17 @@ export const pt: MessageDict = { "standardFields.col.unit": "Unidade", "standardFields.col.group": "Grupo", "standardFields.col.status": "Estado", - "standardFields.emptySearch": "Nenhum campo corresponde à pesquisa", + "standardFields.emptySearch": "Nenhum campo corresponde à pesquisa", "standardFields.emptyHint": "Nenhum campo encontrado. Clique em \"Adicionar campo\" para criar um.", "standardFields.selectFieldAria": "Selecionar {name}", "standardFields.enableFieldAria": "Ativar {name}", - "standardFields.systemFieldTitle": "Campo de sistema — não pode ser eliminado", + "standardFields.systemFieldTitle": "Campo de sistema — não pode ser eliminado", "standardFields.groupsHeading": "Grupos de campos", "standardFields.addGroup": "Adicionar grupo", "standardFields.searchGroups": "Pesquisar grupos...", - "standardFields.col.description": "Descrição", - "standardFields.col.displayOrder": "Ordem de apresentação", - "standardFields.emptyGroupsSearch": "Nenhum grupo corresponde à pesquisa", + "standardFields.col.description": "Descrição", + "standardFields.col.displayOrder": "Ordem de apresentação", + "standardFields.emptyGroupsSearch": "Nenhum grupo corresponde à pesquisa", "standardFields.emptyGroupsHint": "Nenhum grupo encontrado. Crie o seu primeiro grupo.", "standardFields.unknownGroup": "Grupo desconhecido", "standardFields.loadGroupsFailed": "Falha ao carregar os grupos de campos", @@ -3199,7 +3200,7 @@ export const pt: MessageDict = { "standardFields.updateUnitFailed": "Falha ao atualizar a unidade", "standardFields.bulkEnabled": "{count} campo(s) ativado(s)", "standardFields.bulkDisabled": "{count} campo(s) desativado(s)", - "standardFields.bulkFailed": "Falha na atualização em massa", + "standardFields.bulkFailed": "Falha na atualização em massa", "standardFields.recommendedEnabled": "Campos de ecommerce recomendados ativados", "standardFields.recommendedFailed": "Falha ao ativar os campos recomendados", "standardFields.fieldDeleted": "Campo eliminado com sucesso", @@ -3211,529 +3212,529 @@ export const pt: MessageDict = { "standardFields.deleteGroupFailed": "Falha ao eliminar o grupo", "standardFields.editField": "Editar campo", "standardFields.addNewField": "Adicionar novo campo", - "standardFields.editFieldDesc": "Atualize os detalhes deste campo padrão", - "standardFields.addFieldDesc": "Crie um novo campo padrão para os seus dados de produto", + "standardFields.editFieldDesc": "Atualize os detalhes deste campo padrão", + "standardFields.addFieldDesc": "Crie um novo campo padrão para os seus dados de produto", "standardFields.field.name": "Nome", - "standardFields.field.namePlaceholder": "Título do produto", + "standardFields.field.namePlaceholder": "Título do produto", "standardFields.field.nameHint": "Nome a mostrar deste campo", "standardFields.field.key": "Chave", "standardFields.field.keyPlaceholder": "titulo_produto", - "standardFields.field.keyTitle": "Apenas letras minúsculas, números e underscores", - "standardFields.field.keyHint": "Identificador exclusivo (minúsculas, sem espaços)", + "standardFields.field.keyTitle": "Apenas letras minúsculas, números e underscores", + "standardFields.field.keyHint": "Identificador exclusivo (minúsculas, sem espaços)", "standardFields.field.type": "Tipo", "standardFields.field.typeDefaultHint": "Tipo de dados deste campo", "standardFields.field.group": "Grupo", "standardFields.field.groupHint": "Grupo a que este campo pertence", "standardFields.field.enabled": "Ativado", "standardFields.field.enabledHint": "Usar este campo no mapeamento e no processamento", - "standardFields.field.required": "Campo obrigatório", - "standardFields.field.requiredHint": "Os campos obrigatórios devem ser mapeados em cada feed antes de os produtos poderem sincronizar.", + "standardFields.field.required": "Campo obrigatório", + "standardFields.field.requiredHint": "Os campos obrigatórios devem ser mapeados em cada feed antes de os produtos poderem sincronizar.", "standardFields.field.unit": "Unidade", - "standardFields.field.unitPlaceholder": "kg, EUR, cm…", + "standardFields.field.unitPlaceholder": "kg, EUR, cm…", "standardFields.field.unitHint": "Unidade opcional mostrada com este campo", - "standardFields.field.description": "Descrição", - "standardFields.field.descriptionPlaceholder": "Introduza uma descrição para este campo", + "standardFields.field.description": "Descrição", + "standardFields.field.descriptionPlaceholder": "Introduza uma descrição para este campo", "standardFields.field.default": "Valor predefinido", "standardFields.field.defaultPlaceholder": "Valor predefinido (opcional)", - "standardFields.field.defaultHint": "Valor predefinido quando nenhum valor é fornecido", - "standardFields.saveUnavailable": "Guardar (indisponível)", + "standardFields.field.defaultHint": "Valor predefinido quando nenhum valor é fornecido", + "standardFields.saveUnavailable": "Guardar (indisponível)", "standardFields.updateField": "Atualizar campo", "standardFields.createField": "Criar campo", "standardFields.editGroup": "Editar grupo", "standardFields.addNewGroup": "Adicionar novo grupo", "standardFields.editGroupDesc": "Atualize os detalhes deste grupo de campos", - "standardFields.addGroupDesc": "Crie um novo grupo para organizar os seus campos padrão", + "standardFields.addGroupDesc": "Crie um novo grupo para organizar os seus campos padrão", "standardFields.group.name": "Nome", - "standardFields.group.namePlaceholder": "Informação básica", + "standardFields.group.namePlaceholder": "Informação básica", "standardFields.group.nameHint": "Nome a mostrar deste grupo", - "standardFields.group.description": "Descrição", - "standardFields.group.descriptionPlaceholder": "Introduza uma descrição para este grupo", - "standardFields.group.descriptionHint": "Descrição opcional que explica o propósito deste grupo", - "standardFields.group.order": "Ordem de apresentação", - "standardFields.group.orderHint": "Números mais baixos aparecem primeiro", + "standardFields.group.description": "Descrição", + "standardFields.group.descriptionPlaceholder": "Introduza uma descrição para este grupo", + "standardFields.group.descriptionHint": "Descrição opcional que explica o propósito deste grupo", + "standardFields.group.order": "Ordem de apresentação", + "standardFields.group.orderHint": "Números mais baixos aparecem primeiro", "standardFields.updateGroup": "Atualizar grupo", "standardFields.createGroup": "Criar grupo", - "standardFields.deleteFieldDesc": "Esta ação não pode ser anulada. Eliminará permanentemente o campo e removê-lo-á de quaisquer modelos que o usem.", - "standardFields.deleteGroupDesc": "Esta ação não pode ser anulada. Eliminará permanentemente o grupo. Os campos deste grupo terão de ser reatribuídos.", + "standardFields.deleteFieldDesc": "Esta ação não pode ser anulada. Eliminará permanentemente o campo e removê-lo-á de quaisquer modelos que o usem.", + "standardFields.deleteGroupDesc": "Esta ação não pode ser anulada. Eliminará permanentemente o grupo. Os campos deste grupo terão de ser reatribuídos.", "standardFields.type.string.label": "Texto", - "standardFields.type.string.hint": "Texto livre: nomes, códigos, notas curtas", - "standardFields.type.number.label": "Número", - "standardFields.type.number.hint": "Valor numérico; adicione uma unidade quando for útil (EUR, pcs)", - "standardFields.type.boolean.label": "Sim / Não", + "standardFields.type.string.hint": "Texto livre: nomes, códigos, notas curtas", + "standardFields.type.number.label": "Número", + "standardFields.type.number.hint": "Valor numérico; adicione uma unidade quando for útil (EUR, pcs)", + "standardFields.type.boolean.label": "Sim / Não", "standardFields.type.boolean.hint": "Verdadeiro ou falso", "standardFields.type.date.label": "Data", - "standardFields.type.date.hint": "Uma data de calendário", + "standardFields.type.date.hint": "Uma data de calendário", "standardFields.type.url.label": "URL", - "standardFields.type.url.hint": "Ligação web (página de produto, vídeo, fabricante)", + "standardFields.type.url.hint": "Ligação web (página de produto, vídeo, fabricante)", "standardFields.type.image.label": "Imagem", "standardFields.type.image.hint": "URL de imagem ou imagem de galeria", - "standardFields.type.dimension.label": "Dimensão", + "standardFields.type.dimension.label": "Dimensão", "standardFields.type.dimension.hint": "Medida de comprimento (largura, altura, profundidade)", "standardFields.type.weight.label": "Peso", "standardFields.type.weight.hint": "Massa / peso de envio", "standardFields.type.color.label": "Cor", - "standardFields.type.color.hint": "Nome ou código de cor", + "standardFields.type.color.hint": "Nome ou código de cor", "standardFields.type.custom.label": "Personalizado", "standardFields.type.custom.hint": "Campo especial / livre", "standardFields.fallback.gtin": "GTIN/EAN", "standardFields.fallback.title": "Nome do produto", "standardFields.fallback.brand": "Marca", - "standardFields.fallback.description": "Descrição", + "standardFields.fallback.description": "Descrição", "standardFields.fallback.product_model": "Modelo do produto", - "standardFields.fallback.price": "Preço", - "standardFields.fallback.sale_price": "Preço promocional", - "standardFields.fallback.purchase_price": "Preço de compra", + "standardFields.fallback.price": "Preço", + "standardFields.fallback.sale_price": "Preço promocional", + "standardFields.fallback.purchase_price": "Preço de compra", "standardFields.fallback.currency": "Moeda", "standardFields.fallback.image_url": "URL da imagem", "standardFields.fallback.main_image": "Imagem principal", "standardFields.fallback.additional_image_urls": "Imagens adicionais", "standardFields.fallback.product_url": "URL do produto", - "standardFields.fallback.official_link": "Ligação oficial", + "standardFields.fallback.official_link": "Ligação oficial", "standardFields.fallback.sku": "SKU", "standardFields.fallback.mpn": "MPN", "standardFields.fallback.category": "Categoria", "standardFields.fallback.availability": "Disponibilidade", - "standardFields.fallback.stock": "Existências", + "standardFields.fallback.stock": "Existências", "standardFields.fallback.color": "Cor", "standardFields.fallback.size": "Tamanho", "standardFields.fallback.material": "Material", "standardFields.fallback.warranty": "Garantia", - "standardFields.fallback.service": "Serviço", + "standardFields.fallback.service": "Serviço", "standardFields.fallback.weight": "Peso", - "standardFields.fallback.net_depth": "Profundidade líquida", - "standardFields.fallback.net_height": "Altura líquida", - "standardFields.fallback.net_width": "Largura líquida", - "standardFields.fallback.net_mass": "Massa líquida", - "standardFields.fallback.video_url": "URL do vídeo", + "standardFields.fallback.net_depth": "Profundidade líquida", + "standardFields.fallback.net_height": "Altura líquida", + "standardFields.fallback.net_width": "Largura líquida", + "standardFields.fallback.net_mass": "Massa líquida", + "standardFields.fallback.video_url": "URL do vídeo", "standardFields.fallback.eprel_id": "ID EPREL", - "standardFields.fallback.specs": "Especificações", - "standardFields.fallback.specifications": "Especificações (legacy)", - "standardFields.tip.gtin": "Global Trade Item Number — código de barras/EAN/UPC que identifica o produto.", - "standardFields.tip.title": "Nome do produto voltado ao cliente, mostrado em catálogos e canais.", - "standardFields.tip.brand": "Nome do fabricante ou da marca (não do retalhista).", + "standardFields.fallback.specs": "Especificações", + "standardFields.fallback.specifications": "Especificações (legacy)", + "standardFields.tip.gtin": "Global Trade Item Number — código de barras/EAN/UPC que identifica o produto.", + "standardFields.tip.title": "Nome do produto voltado ao cliente, mostrado em catálogos e canais.", + "standardFields.tip.brand": "Nome do fabricante ou da marca (não do retalhista).", "standardFields.tip.description": "Texto de produto mais longo; usado para enriquecimento e listagens de canal.", - "standardFields.tip.product_model": "Nome/número de modelo do fabricante.", - "standardFields.tip.price": "Preço de venda regular (numérico; moeda mapeada em separado).", - "standardFields.tip.sale_price": "Preço com desconto ou promocional em promoção.", - "standardFields.tip.purchase_price": "O seu custo / preço de compra (interno).", - "standardFields.tip.currency": "Código ISO de moeda para campos de preço (p. ex. EUR, USD).", + "standardFields.tip.product_model": "Nome/número de modelo do fabricante.", + "standardFields.tip.price": "Preço de venda regular (numérico; moeda mapeada em separado).", + "standardFields.tip.sale_price": "Preço com desconto ou promocional em promoção.", + "standardFields.tip.purchase_price": "O seu custo / preço de compra (interno).", + "standardFields.tip.currency": "Código ISO de moeda para campos de preço (p. ex. EUR, USD).", "standardFields.tip.image_url": "URL da imagem principal do produto.", "standardFields.tip.main_image": "URL da imagem principal da galeria (alias de image).", - "standardFields.tip.additional_image_urls": "URL de imagens adicionais (separadas por vírgulas ou nós repetidos).", - "standardFields.tip.product_url": "URL pública da página do produto na sua loja ou site.", - "standardFields.tip.official_link": "URL da página do fabricante ou da marca.", - "standardFields.tip.sku": "Stock Keeping Unit — o seu código interno de artigo.", - "standardFields.tip.mpn": "Manufacturer Part Number — código de peça do fornecedor.", + "standardFields.tip.additional_image_urls": "URL de imagens adicionais (separadas por vírgulas ou nós repetidos).", + "standardFields.tip.product_url": "URL pública da página do produto na sua loja ou site.", + "standardFields.tip.official_link": "URL da página do fabricante ou da marca.", + "standardFields.tip.sku": "Stock Keeping Unit — o seu código interno de artigo.", + "standardFields.tip.mpn": "Manufacturer Part Number — código de peça do fornecedor.", "standardFields.tip.category": "Categoria de produto ou caminho de taxonomia.", - "standardFields.tip.availability": "Estado do tipo em stock / esgotado / pré-encomenda.", - "standardFields.tip.stock": "Quantidade de inventário numérica.", + "standardFields.tip.availability": "Estado do tipo em stock / esgotado / pré-encomenda.", + "standardFields.tip.stock": "Quantidade de inventário numérica.", "standardFields.tip.color": "Atributo de cor para variantes.", "standardFields.tip.size": "Atributo de tamanho para variantes.", - "standardFields.tip.material": "Material principal ou composição.", + "standardFields.tip.material": "Material principal ou composição.", "standardFields.tip.warranty": "Prazo ou texto de garantia.", - "standardFields.tip.service": "Notas de serviço ou suporte.", - "standardFields.tip.weight": "Peso de envio ou líquido.", - "standardFields.tip.eprel_id": "Identificador de produto do rótulo energético da UE (EPREL).", - "standardFields.tip.specs": "Especificações técnicas estruturadas.", + "standardFields.tip.service": "Notas de serviço ou suporte.", + "standardFields.tip.weight": "Peso de envio ou líquido.", + "standardFields.tip.eprel_id": "Identificador de produto do rótulo energético da UE (EPREL).", + "standardFields.tip.specs": "Especificações técnicas estruturadas.", "standardFields.tip.specifications": "Campo de specs legado; preferir specs quando ambos existirem.", "export.dialog.title": "Exportar produtos selecionados", - "export.dialog.description": "Exportar {count} produto(s) selecionado(s). Escolha o feed de exportação que define formato e campos — como escolher o que sincronizar, mas para download ou parceiro.", - "export.dialog.loadFailed": "Falha ao carregar as opções de feed de exportação. Tente novamente.", - "export.dialog.selectPlaceholder": "Selecione um feed de exportação…", - "export.dialog.help": "A sua seleção escolhe os produtos; o feed escolhe o formato do canal e os campos mapeados.", - "export.dialog.emptyTitle": "Ainda sem feeds de exportação", - "export.dialog.emptyMessage": "Crie um feed de exportação para escolher formato e campos e volte para exportar esta seleção.", - "export.dialog.createFeedCta": "Criar feed de exportação", - "export.dialog.confirmAria": "Confirmar exportação", + "export.dialog.description": "Exportar {count} produto(s) selecionado(s). Escolha o feed de exportação que define formato e campos — como escolher o que sincronizar, mas para download ou parceiro.", + "export.dialog.loadFailed": "Falha ao carregar as opções de feed de exportação. Tente novamente.", + "export.dialog.selectPlaceholder": "Selecione um feed de exportação…", + "export.dialog.help": "A sua seleção escolhe os produtos; o feed escolhe o formato do canal e os campos mapeados.", + "export.dialog.emptyTitle": "Ainda sem feeds de exportação", + "export.dialog.emptyMessage": "Crie um feed de exportação para escolher formato e campos e volte para exportar esta seleção.", + "export.dialog.createFeedCta": "Criar feed de exportação", + "export.dialog.confirmAria": "Confirmar exportação", "export.dialog.export": "Exportar", - "billing.title": "Uso e faturação", - "billing.loadFailed": "Falha ao carregar a faturação", - "billing.usageLoadFailed": "Falha ao carregar a utilização", - "billing.checkoutComplete": "Checkout concluído. O seu plano e créditos serão atualizados em breve.", - "billing.checkoutCompletePlan": "Plano atualizado. Os seus créditos {plan} estão prontos.", - "billing.checkoutCanceled": "O Checkout foi cancelado. Não foram feitas alterações.", - "billing.portalReturned": "Regressou do portal de faturação. Faça a gestão do plano aqui ou em Plans.", + "billing.title": "Uso e faturação", + "billing.loadFailed": "Falha ao carregar a faturação", + "billing.usageLoadFailed": "Falha ao carregar a utilização", + "billing.checkoutComplete": "Checkout concluído. O seu plano e créditos serão atualizados em breve.", + "billing.checkoutCompletePlan": "Plano atualizado. Os seus créditos {plan} estão prontos.", + "billing.checkoutCanceled": "O Checkout foi cancelado. Não foram feitas alterações.", + "billing.portalReturned": "Regressou do portal de faturação. Faça a gestão do plano aqui ou em Plans.", "billing.comparePlans": "Comparar planos", "billing.managePayment": "Gerir pagamento", - "billing.addCredits": "Adicionar créditos", - "billing.addingCredits": "A adicionar…", - "billing.addCreditsTitle": "Adicionar créditos", - "billing.addCreditsDescription": "Apenas administrador da plataforma. Os créditos ficam disponíveis de imediato para títulos de IA, descrições e outros passos pagos.", - "billing.creditAmount": "Montante de crédito", - "billing.invalidCreditAmount": "Introduza um montante de créditos válido.", - "billing.companyNotFound": "Empresa não encontrada.", - "billing.creditsAdded": "Foram adicionados {amount} créditos.", - "billing.addCreditsFailed": "Falha ao adicionar créditos. Pode ser necessário acesso de administrador da plataforma.", - "billing.planApplied": "Plano aplicado. Os seus créditos estão prontos.", + "billing.addCredits": "Adicionar créditos", + "billing.addingCredits": "A adicionar…", + "billing.addCreditsTitle": "Adicionar créditos", + "billing.addCreditsDescription": "Apenas administrador da plataforma. Os créditos ficam disponíveis de imediato para títulos de IA, descrições e outros passos pagos.", + "billing.creditAmount": "Montante de crédito", + "billing.invalidCreditAmount": "Introduza um montante de créditos válido.", + "billing.companyNotFound": "Empresa não encontrada.", + "billing.creditsAdded": "Foram adicionados {amount} créditos.", + "billing.addCreditsFailed": "Falha ao adicionar créditos. Pode ser necessário acesso de administrador da plataforma.", + "billing.planApplied": "Plano aplicado. Os seus créditos estão prontos.", "billing.checkoutFailed": "Checkout falhou", - "billing.portalFailed": "Não foi possível abrir o portal de faturação", - "billing.noPlanAssigned": "Nenhum plano atribuído", + "billing.portalFailed": "Não foi possível abrir o portal de faturação", + "billing.noPlanAssigned": "Nenhum plano atribuído", "billing.unlimited": "Ilimitado", "billing.payAsYouGo": "Pagamento conforme o uso", - "billing.noMonthlyAiCredits": "Sem créditos de IA mensais", - "billing.header.noPlan": "Ainda sem plano atribuído. Escolha um plano ou peça a um administrador.", - "billing.header.free": "Mapeie feeds e limpe dados de produto sem créditos de IA.", + "billing.noMonthlyAiCredits": "Sem créditos de IA mensais", + "billing.header.noPlan": "Ainda sem plano atribuído. Escolha um plano ou peça a um administrador.", + "billing.header.free": "Mapeie feeds e limpe dados de produto sem créditos de IA.", "billing.header.enterprise": "Produtos e capacidade de IA ilimitados.", - "billing.header.payg": "Pay as you go — os créditos vêm da carteira da empresa.", - "billing.header.remaining": "{remaining} créditos de IA restantes neste período.", + "billing.header.payg": "Pay as you go — os créditos vêm da carteira da empresa.", + "billing.header.remaining": "{remaining} créditos de IA restantes neste período.", "billing.na": "N/D", - "billing.range.7d": "últimos 7 dias", - "billing.range.30d": "últimos 30 dias", - "billing.range.cycle": "ciclo de faturação atual", + "billing.range.7d": "últimos 7 dias", + "billing.range.30d": "últimos 30 dias", + "billing.range.cycle": "ciclo de faturação atual", "billing.range.all": "de sempre", - "billing.rangeOpt.7d": "Últimos 7 dias", - "billing.rangeOpt.30d": "Últimos 30 dias", + "billing.rangeOpt.7d": "Últimos 7 dias", + "billing.rangeOpt.30d": "Últimos 30 dias", "billing.rangeOpt.cycle": "Ciclo atual", "billing.rangeOpt.all": "De sempre", - "billing.freeBannerTitle": "Está no plano Free", - "billing.freeBannerMessage": "Atualize para títulos e descrições de IA e limites de produtos mais elevados.", - "billing.outOfCreditsTitle": "Ficou sem créditos de IA", + "billing.freeBannerTitle": "Está no plano Free", + "billing.freeBannerMessage": "Atualize para títulos e descrições de IA e limites de produtos mais elevados.", + "billing.outOfCreditsTitle": "Ficou sem créditos de IA", "billing.productLimitTitle": "Limite de produtos atingido", - "billing.outOfCreditsMessage": "Os títulos e descrições de IA estão em pausa até adicionar créditos ou atualizar o plano.", + "billing.outOfCreditsMessage": "Os títulos e descrições de IA estão em pausa até adicionar créditos ou atualizar o plano.", "billing.productLimitMessage": "Atualize para mais capacidade de produtos.", - "billing.lowCreditsTitle": "Créditos a esgotar-se", - "billing.lowCreditsMessage": "Restam apenas {remaining} créditos em {plan}. Atualize antes do próximo lote grande.", + "billing.lowCreditsTitle": "Créditos a esgotar-se", + "billing.lowCreditsMessage": "Restam apenas {remaining} créditos em {plan}. Atualize antes do próximo lote grande.", "billing.currentPlan": "Plano atual", - "billing.periodEnds": "O período de faturação termina a {date}", + "billing.periodEnds": "O período de faturação termina a {date}", "billing.openEndedContract": "Contrato aberto", - "billing.creditWallet": "Carteira de créditos", - "billing.creditsRemaining": "Créditos restantes", + "billing.creditWallet": "Carteira de créditos", + "billing.creditsRemaining": "Créditos restantes", "billing.enterpriseCapacity": "Capacidade gerida empresarial", - "billing.paygUsed": "{used} usados · sem atribuição mensal", - "billing.trialLeftover": "Créditos de teste / restantes", + "billing.paygUsed": "{used} usados · sem atribuição mensal", + "billing.trialLeftover": "Créditos de teste / restantes", "billing.aiLockedFree": "IA bloqueada no Free", "billing.usedOf": "{used} usados de {total}", - "billing.noBalanceTitle": "Ainda sem saldo de créditos", - "billing.noBalanceBody": "Os créditos do seu plano aparecerão aqui assim que a faturação estiver configurada neste espaço de trabalho.", + "billing.noBalanceTitle": "Ainda sem saldo de créditos", + "billing.noBalanceBody": "Os créditos do seu plano aparecerão aqui assim que a faturação estiver configurada neste espaço de trabalho.", "billing.needCapacity": "Precisa de mais capacidade?", - "billing.selfServeUpgrade": "Atualização self-service para Starter, Growth ou Business", + "billing.selfServeUpgrade": "Atualização self-service para Starter, Growth ou Business", "billing.viaStripe": "via Stripe", "billing.checkoutUnavailable": "As compras self-service nao estao disponiveis ate o Stripe ser configurado. Contacte as vendas para um plano.", "billing.upgradeToGrowth": "Atualizar para Growth", - "billing.askAdminPlan": "Peça a um administrador da empresa para alterar o plano.", + "billing.askAdminPlan": "Peça a um administrador da empresa para alterar o plano.", "billing.usage": "Uso", - "billing.productsProcessed": "{count} produtos processados · {range}", - "billing.updating": "A atualizar…", + "billing.productsProcessed": "{count} produtos processados · {range}", + "billing.updating": "A atualizar…", "billing.productsByDay": "Produtos por dia", - "billing.chartAmber": "Âmbar = tokens. Intervalo: {range}.", + "billing.chartAmber": "Âmbar = tokens. Intervalo: {range}.", "billing.chartRange": "Intervalo: {range}.", "billing.nothingToChartTitle": "Ainda nada para graficar", - "billing.nothingToChartBody": "Adicione produtos ou ligue um feed — a utilização aparecerá aqui.", - "billing.dailyChartsHint": "Os gráficos diários estão disponíveis para os últimos 7 dias, 30 dias ou o ciclo de faturação atual.", + "billing.nothingToChartBody": "Adicione produtos ou ligue um feed — a utilização aparecerá aqui.", + "billing.dailyChartsHint": "Os gráficos diários estão disponíveis para os últimos 7 dias, 30 dias ou o ciclo de faturação atual.", "billing.noNewProducts": "Sem produtos novos em {range}", - "billing.catalogOverall": "O catálogo tem {count} produtos no total.", + "billing.catalogOverall": "O catálogo tem {count} produtos no total.", "billing.chartProducts": "Produtos", "billing.chartTokens": "Fichas", - "billing.chartEmpty": "Sem produtos neste período.", - "billing.adminStats": "{tokens} tokens · {jobs} trabalhos · {input} feeds de entrada / {export} de exportação", - "billing.whatUsesCredits": "O que consome créditos", - "billing.burnsCredits": "Consome créditos", - "billing.noCreditCost": "Sem custo de créditos", - "billing.publicPricing": "Preços públicos", + "billing.chartEmpty": "Sem produtos neste período.", + "billing.adminStats": "{tokens} tokens · {jobs} trabalhos · {input} feeds de entrada / {export} de exportação", + "billing.whatUsesCredits": "O que consome créditos", + "billing.burnsCredits": "Consome créditos", + "billing.noCreditCost": "Sem custo de créditos", + "billing.publicPricing": "Preços públicos", "billing.managePlanOnPlans": "Gerir plano em Planos", "billing.recovery.pastDueTitle": "Pagamento em atraso", - "billing.recovery.pastDueAdmin": "O pagamento da sua subscrição falhou. Atualize o pagamento no Customer Portal — o acesso permanece aberto durante este período de carência.", - "billing.recovery.pastDueMember": "A faturação precisa de atenção. Peça a um administrador da empresa para atualizar o pagamento no Customer Portal. O acesso permanece aberto durante este período de carência.", + "billing.recovery.pastDueAdmin": "O pagamento da sua subscrição falhou. Atualize o pagamento no Customer Portal — o acesso permanece aberto durante este período de carência.", + "billing.recovery.pastDueMember": "A faturação precisa de atenção. Peça a um administrador da empresa para atualizar o pagamento no Customer Portal. O acesso permanece aberto durante este período de carência.", "billing.recovery.openPortal": "Abrir Customer Portal", "billing.recovery.contactAdmin": "Contactar um administrador", - "billing.recovery.goToBilling": "Ir para Faturação", - "billing.recovery.missingPlanTitle": "Sem plano atribuído", - "billing.recovery.missingPlanMessage": "Esta empresa não tem um plano ativo (muitas vezes após uma migração ignorada). Atribua um plano via Checkout ou peça apoio — não assuma capacidade Unlimited.", + "billing.recovery.goToBilling": "Ir para Faturação", + "billing.recovery.missingPlanTitle": "Sem plano atribuído", + "billing.recovery.missingPlanMessage": "Esta empresa não tem um plano ativo (muitas vezes após uma migração ignorada). Atribua um plano via Checkout ou peça apoio — não assuma capacidade Unlimited.", "billing.recovery.choosePlan": "Escolha um plano", "billing.upgrade": "Atualizar", - "billing.askCompanyAdmin": "Peça a um administrador da empresa", - "billing.memberHint": "Só os administradores da empresa podem alterar planos ou abrir Checkout.", - "billing.unlimitedPlanWallet": "Plano ilimitado · carteira {wallet}", - "billing.creditsSuffix": "{label} créditos", - "billing.perMonth": "{amount} / mês", - "billing.zeroPerMonth": "0 / mês", - "billing.upTo": "Até {count}", + "billing.askCompanyAdmin": "Peça a um administrador da empresa", + "billing.memberHint": "Só os administradores da empresa podem alterar planos ou abrir Checkout.", + "billing.unlimitedPlanWallet": "Plano ilimitado · carteira {wallet}", + "billing.creditsSuffix": "{label} créditos", + "billing.perMonth": "{amount} / mês", + "billing.zeroPerMonth": "0 / mês", + "billing.upTo": "Até {count}", "billing.skusUnlimited": "{used} SKUs (ilimitado)", "billing.skusOnly": "{used} SKUs", "billing.skusOf": "{used} / {max} SKUs", "billing.planKind.none": "Sem plano ativo", "billing.planKind.enterprise": "Empresarial / personalizado", - "billing.planKind.trial": "Período de avaliação", - "billing.planKind.standard": "Plano padrão", + "billing.planKind.trial": "Período de avaliação", + "billing.planKind.standard": "Plano padrão", "billing.creditUsage.normalize.label": "Normalizar, specs e preencher", - "billing.creditUsage.normalize.detail": "A limpeza de dados e o preenchimento de atributos correm sem gastar créditos de IA.", - "billing.creditUsage.ai.label": "Títulos e descrições de IA", + "billing.creditUsage.normalize.detail": "A limpeza de dados e o preenchimento de atributos correm sem gastar créditos de IA.", + "billing.creditUsage.ai.label": "Títulos e descrições de IA", "billing.creditUsage.ai.detail": "Cobrado por produto com base na funcionalidade de IA e na quantidade de texto gerado.", - "billing.creditUsage.eprel.label": "EPREL / rótulos energéticos", - "billing.creditUsage.eprel.detail": "Dados EPREL da UE públicos e gratuitos em todos os planos (sem créditos).", - "billing.creditUsage.campaign.label": "IA de campanha e aplicação de marca", - "billing.creditUsage.campaign.detail": "Os passos de IA pagos que usam o modelo gerido consomem créditos da empresa.", - "exports.title": "Feeds de exportação", - "exports.description": "Escolha o que publicar por canal — que produtos e campos — e partilhe um URL de feed público (sem login).", - "exports.descriptionFiltered": "Ligações públicas Google Shopping, Meta e feeds personalizados. A mostrar {filtered} de {total} feeds.", - "exports.loadFailed": "Falha ao carregar os feeds de exportação", - "exports.loadFeedFailed": "Falha ao carregar o feed de exportação", + "billing.creditUsage.eprel.label": "EPREL / rótulos energéticos", + "billing.creditUsage.eprel.detail": "Dados EPREL da UE públicos e gratuitos em todos os planos (sem créditos).", + "billing.creditUsage.campaign.label": "IA de campanha e aplicação de marca", + "billing.creditUsage.campaign.detail": "Os passos de IA pagos que usam o modelo gerido consomem créditos da empresa.", + "exports.title": "Feeds de exportação", + "exports.description": "Escolha o que publicar por canal — que produtos e campos — e partilhe um URL de feed público (sem login).", + "exports.descriptionFiltered": "Ligações públicas Google Shopping, Meta e feeds personalizados. A mostrar {filtered} de {total} feeds.", + "exports.loadFailed": "Falha ao carregar os feeds de exportação", + "exports.loadFeedFailed": "Falha ao carregar o feed de exportação", "exports.refresh": "Atualizar", - "exports.refreshing": "A atualizar…", - "exports.create": "Criar feed de exportação", - "exports.edit": "Editar feed de exportação", - "exports.editDescription": "Atualize o nome, o estado, que produtos estão incluídos e que campos estão mapeados.", + "exports.refreshing": "A atualizar…", + "exports.create": "Criar feed de exportação", + "exports.edit": "Editar feed de exportação", + "exports.editDescription": "Atualize o nome, o estado, que produtos estão incluídos e que campos estão mapeados.", "exports.howToTitle": "Como escolher o que exportar", "exports.howTo.choose": "O que entra no feed", - "exports.howTo.chooseBody": "— defina o feed de origem e os estados do produto ao criar/editar para que o URL público só inclua esses produtos.", + "exports.howTo.chooseBody": "— defina o feed de origem e os estados do produto ao criar/editar para que o URL público só inclua esses produtos.", "exports.howTo.subset": "Subconjunto pontual", - "exports.howTo.subsetBody": "— em", + "exports.howTo.subsetBody": "— em", "exports.howTo.productsLink": "Produtos", - "exports.howTo.subsetTail": ", selecione linhas e Exporte para descarregar só esses produtos com o formato e campos do feed.", + "exports.howTo.subsetTail": ", selecione linhas e Exporte para descarregar só esses produtos com o formato e campos do feed.", "exports.howTo.google": "Google Shopping", - "exports.howTo.googleBody": "— crie uma predefinição CSV ou XML, Generate, copie o URL público para Merchant Center → Products → Feeds → scheduled fetch.", - "exports.howTo.meta": "Catálogo Meta", - "exports.howTo.metaBody": "— predefinição CSV para fontes de dados do Commerce Manager.", + "exports.howTo.googleBody": "— crie uma predefinição CSV ou XML, Generate, copie o URL público para Merchant Center → Products → Feeds → scheduled fetch.", + "exports.howTo.meta": "Catálogo Meta", + "exports.howTo.metaBody": "— predefinição CSV para fontes de dados do Commerce Manager.", "exports.howTo.custom": "CSV/XML personalizado", - "exports.howTo.customBody": "— qualquer parceiro; o mesmo URL público funciona para pollers cron / webhook.", + "exports.howTo.customBody": "— qualquer parceiro; o mesmo URL público funciona para pollers cron / webhook.", "exports.howTo.rest": "REST", - "exports.howTo.restBody": "— chaves API em", - "exports.howTo.settingsApiKeys": "Definições → Chaves API", - "exports.howTo.restTail": "(chaves legacy não migradas) pull", + "exports.howTo.restBody": "— chaves API em", + "exports.howTo.settingsApiKeys": "Definições → Chaves API", + "exports.howTo.restTail": "(chaves legacy não migradas) pull", "exports.howTo.openapi": "OpenAPI", "exports.feedStatus": "Estado do feed", - "exports.generating": "A gerar exportação — pode demorar um pouco para catálogos grandes.", - "exports.generationFailed": "Falha na geração. Veja o erro acima e tente Refresh Feed novamente.", + "exports.generating": "A gerar exportação — pode demorar um pouco para catálogos grandes.", + "exports.generationFailed": "Falha na geração. Veja o erro acima e tente Refresh Feed novamente.", "exports.exportedProducts": "{count} produtos exportados", - "exports.lastGenerated": "Última geração: {time}", + "exports.lastGenerated": "Última geração: {time}", "exports.neverGenerated": "Nunca gerado", "exports.searchPlaceholder": "Pesquisar feeds...", "exports.searchAria": "Pesquisar feeds", "exports.clearSearch": "Limpar pesquisa", - "exports.loading": "A carregar feeds…", - "exports.loadErrorTitle": "Não foi possível carregar os feeds de exportação", - "exports.loadErrorBody": "Algo correu mal ao carregar as suas exportações. Tente novamente ou veja o erro acima para detalhes.", + "exports.loading": "A carregar feeds…", + "exports.loadErrorTitle": "Não foi possível carregar os feeds de exportação", + "exports.loadErrorBody": "Algo correu mal ao carregar as suas exportações. Tente novamente ou veja o erro acima para detalhes.", "exports.tryAgain": "Tentar novamente", - "exports.emptyTitle": "Ainda sem feeds de exportação", - "exports.emptyBody": "Crie um feed Google Shopping, Meta ou CSV/XML personalizado para escolher que produtos e campos saem. Gere um URL público para Merchant Center ou qualquer parceiro — ou exporte um subconjunto em Produtos.", + "exports.emptyTitle": "Ainda sem feeds de exportação", + "exports.emptyBody": "Crie um feed Google Shopping, Meta ou CSV/XML personalizado para escolher que produtos e campos saem. Gere um URL público para Merchant Center ou qualquer parceiro — ou exporte um subconjunto em Produtos.", "exports.emptyCta": "Criar feed Google Shopping", "exports.noMatchTitle": "Sem feeds correspondentes", "exports.noMatchBody": "Tente outro termo de pesquisa.", "exports.col.name": "Nome", "exports.col.format": "Formato", "exports.col.feedUrl": "URL do feed", - "exports.col.lastGenerated": "Última geração", + "exports.col.lastGenerated": "Última geração", "exports.col.status": "Estado", - "exports.col.actions": "Ações", + "exports.col.actions": "Ações", "exports.working": "Em curso.", - "exports.generatingShort": "A gerar…", + "exports.generatingShort": "A gerar…", "exports.copyUrl": "Copiar URL", "exports.openMenu": "Abrir menu", - "exports.preview": "Pré-visualização", + "exports.preview": "Pré-visualização", "exports.download": "Descarregar", "exports.refreshFeed": "Atualizar feed", "exports.editAction": "Editar", "exports.delete": "Eliminar", "exports.rotateToken": "Rodar token do URL", "exports.rotateFailed": "Falha ao rodar o token do URL do feed", - "exports.deleting": "A eliminar…", - "exports.channelPreset": "Predefinição de canal", + "exports.deleting": "A eliminar…", + "exports.channelPreset": "Predefinição de canal", "exports.name": "Nome", "exports.format": "Formato", "exports.sourceFeed": "Feed de origem (opcional)", - "exports.sourceFeedHelp": "Limite este feed a produtos de um feed de entrada, ou deixe Todos os produtos — é assim que escolhe o que o URL público inclui.", + "exports.sourceFeedHelp": "Limite este feed a produtos de um feed de entrada, ou deixe Todos os produtos — é assim que escolhe o que o URL público inclui.", "exports.allProducts": "Todos os produtos", "exports.rootElement": "Elemento raiz", "exports.itemElement": "Elemento de item", - "exports.productStatuses": "Estados de produto (separados por vírgulas)", + "exports.productStatuses": "Estados de produto (separados por vírgulas)", "exports.productStatusesHelp": "Inclua apenas produtos com estes estados (por exemplo active). Deixe em branco para todos os estados.", "exports.status": "Estado", "exports.active": "Ativo", "exports.inactive": "Inativo", "exports.fieldMappings": "Mapeamentos de campos", "exports.addField": "Adicionar campo", - "exports.outputKey": "Chave de saída", + "exports.outputKey": "Chave de saída", "exports.source": "Origem", "exports.customSource": "Personalizado (attr.* / spec.*)", "exports.removeField": "Remover campo", - "exports.fieldHelp": "As exportações leem produtos processados (com mapped_data em bruto como fallback). Use eprel_* / energy_* para campos EPREL, spec.* para uma especificação, ou specifications.* para expandir todas as specs como nós XML.", - "exports.saving": "A guardar…", - "exports.saveChanges": "Guardar alterações", + "exports.fieldHelp": "As exportações leem produtos processados (com mapped_data em bruto como fallback). Use eprel_* / energy_* para campos EPREL, spec.* para uma especificação, ou specifications.* para expandir todas as specs como nós XML.", + "exports.saving": "A guardar…", + "exports.saveChanges": "Guardar alterações", "exports.createFeed": "Criar feed", - "exports.updated": "Feed de exportação atualizado.", - "exports.created": "Feed de exportação criado.", + "exports.updated": "Feed de exportação atualizado.", + "exports.created": "Feed de exportação criado.", "exports.saveFailed": "Falha ao guardar", - "exports.urlCopied": "URL público do feed {format} copiado. Cole-o em qualquer sistema que obtenha feeds de produto.", - "exports.copyFailed": "Falha ao copiar o URL para a área de transferência", + "exports.urlCopied": "URL público do feed {format} copiado. Cole-o em qualquer sistema que obtenha feeds de produto.", + "exports.copyFailed": "Falha ao copiar o URL para a área de transferência", "exports.refreshed": "Feed atualizado", "exports.refreshedWithCount": "Feed atualizado ({count} produtos).", "exports.refreshFailed": "Falha ao atualizar o feed", - "exports.deleteConfirm": "Tem a certeza de que pretende eliminar este feed de exportação?", - "exports.deleted": "Feed de exportação eliminado com sucesso.", - "exports.deleteFailed": "Falha ao eliminar o feed de exportação", - "exports.defaultName": "Novo feed de exportação", - "exports.fallbackName": "Feed de exportação", + "exports.deleteConfirm": "Tem a certeza de que pretende eliminar este feed de exportação?", + "exports.deleted": "Feed de exportação eliminado com sucesso.", + "exports.deleteFailed": "Falha ao eliminar o feed de exportação", + "exports.defaultName": "Novo feed de exportação", + "exports.fallbackName": "Feed de exportação", "exports.dialog.selectTitle": "Exportar produtos selecionados", - "exports.dialog.selectDescription": "Escolha uma configuração de feed de exportação para os {count} produtos selecionados.", - "exports.dialog.noneFound": "Nenhuma configuração de feed de exportação encontrada. Crie uma na secção Export Feeds.", - "exports.dialog.loadFailed": "Falha ao carregar as opções de feed de exportação. Tente novamente.", - "exports.dialog.selectRequired": "Selecione um formato de feed de exportação.", - "exports.dialog.selectPlaceholder": "Selecione um formato de feed de exportação...", - "exports.dialog.confirmAria": "Confirmar exportação", + "exports.dialog.selectDescription": "Escolha uma configuração de feed de exportação para os {count} produtos selecionados.", + "exports.dialog.noneFound": "Nenhuma configuração de feed de exportação encontrada. Crie uma na secção Export Feeds.", + "exports.dialog.loadFailed": "Falha ao carregar as opções de feed de exportação. Tente novamente.", + "exports.dialog.selectRequired": "Selecione um formato de feed de exportação.", + "exports.dialog.selectPlaceholder": "Selecione um formato de feed de exportação...", + "exports.dialog.confirmAria": "Confirmar exportação", "exports.dialog.export": "Exportar", "exports.preset.google_shopping_csv.label": "Google Shopping (CSV)", "exports.preset.google_shopping_csv.shortLabel": "Google Shopping CSV", - "exports.preset.google_shopping_csv.description": "Feed de produtos do Merchant Center com as colunas Google standard (id, title, price, gtin, …).", - "exports.preset.google_shopping_csv.hint": "Depois de atualizar o feed, copie o URL CSV público para Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.", + "exports.preset.google_shopping_csv.description": "Feed de produtos do Merchant Center com as colunas Google standard (id, title, price, gtin, …).", + "exports.preset.google_shopping_csv.hint": "Depois de atualizar o feed, copie o URL CSV público para Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.", "exports.preset.google_shopping_csv.defaultName": "Google Shopping CSV", "exports.preset.google_shopping_xml.label": "Google Shopping (XML)", "exports.preset.google_shopping_xml.shortLabel": "Google Shopping XML", - "exports.preset.google_shopping_xml.description": "As mesmas colunas Google que os elementos XML (g:id, g:title, …) para feeds XML do Merchant Center.", - "exports.preset.google_shopping_xml.hint": "Cole o URL XML público no Merchant Center como scheduled fetch. Se necessário, mapeie os campos da loja em falta (link, price) em Field mappings.", + "exports.preset.google_shopping_xml.description": "As mesmas colunas Google que os elementos XML (g:id, g:title, …) para feeds XML do Merchant Center.", + "exports.preset.google_shopping_xml.hint": "Cole o URL XML público no Merchant Center como scheduled fetch. Se necessário, mapeie os campos da loja em falta (link, price) em Field mappings.", "exports.preset.google_shopping_xml.defaultName": "Google Shopping XML", - "exports.preset.meta_csv.label": "Catálogo Meta (CSV)", + "exports.preset.meta_csv.label": "Catálogo Meta (CSV)", "exports.preset.meta_csv.shortLabel": "Meta CSV", - "exports.preset.meta_csv.description": "Colunas do catálogo Facebook / Instagram Commerce (id, title, availability, price, image_link, …).", - "exports.preset.meta_csv.hint": "No Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed, cole o URL CSV público.", - "exports.preset.meta_csv.defaultName": "Catálogo Meta CSV", + "exports.preset.meta_csv.description": "Colunas do catálogo Facebook / Instagram Commerce (id, title, availability, price, image_link, …).", + "exports.preset.meta_csv.hint": "No Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed, cole o URL CSV público.", + "exports.preset.meta_csv.defaultName": "Catálogo Meta CSV", "exports.preset.custom_csv.label": "CSV personalizado", "exports.preset.custom_csv.shortLabel": "CSV personalizado", - "exports.preset.custom_csv.description": "Escolha as suas próprias colunas e fontes de produto para qualquer parceiro ou webhook.", - "exports.preset.custom_csv.hint": "Adicione ou renomeie livremente as chaves de saída. O URL público não precisa de login para descarregar.", - "exports.preset.custom_csv.defaultName": "Exportação CSV personalizada", + "exports.preset.custom_csv.description": "Escolha as suas próprias colunas e fontes de produto para qualquer parceiro ou webhook.", + "exports.preset.custom_csv.hint": "Adicione ou renomeie livremente as chaves de saída. O URL público não precisa de login para descarregar.", + "exports.preset.custom_csv.defaultName": "Exportação CSV personalizada", "exports.preset.custom_xml.label": "XML personalizado", "exports.preset.custom_xml.shortLabel": "XML personalizado", - "exports.preset.custom_xml.description": "Crie uma forma XML personalizada com os seus próprios nomes root/item e mapeamentos de campos.", - "exports.preset.custom_xml.hint": "Defina os nomes dos elementos root e item e mapeie cada chave de saída para uma fonte de produto.", - "exports.preset.custom_xml.defaultName": "Exportação XML personalizada", + "exports.preset.custom_xml.description": "Crie uma forma XML personalizada com os seus próprios nomes root/item e mapeamentos de campos.", + "exports.preset.custom_xml.hint": "Defina os nomes dos elementos root e item e mapeie cada chave de saída para uma fonte de produto.", + "exports.preset.custom_xml.defaultName": "Exportação XML personalizada", "processing.title": "Processamento", - "processing.description": "Progresso em direto do pipeline para trabalhos de processamento de produtos. Atualiza automaticamente enquanto este separador está visível. Os trabalhos concluídos ligam a Needs Review para aceitar / editar / rejeitar.", + "processing.description": "Progresso em direto do pipeline para trabalhos de processamento de produtos. Atualiza automaticamente enquanto este separador está visível. Os trabalhos concluídos ligam a Needs Review para aceitar / editar / rejeitar.", "processing.refresh": "Atualizar", "processing.loadFailed": "Falha ao carregar os trabalhos de processamento", - "processing.tooManyRequests": "Demasiados pedidos — aguarde um momento e tente novamente.", + "processing.tooManyRequests": "Demasiados pedidos — aguarde um momento e tente novamente.", "processing.serverError": "{fallback} (erro do servidor {status}). Tente novamente em breve.", "processing.httpError": "{fallback} (HTTP {status})", - "processing.cancelFailed": "Não foi possível cancelar esta tarefa", - "processing.retryFailed": "Não foi possível repetir esta tarefa", + "processing.cancelFailed": "Não foi possível cancelar esta tarefa", + "processing.retryFailed": "Não foi possível repetir esta tarefa", "processing.cancelledMsg": "\"{name}\" foi cancelado.", "processing.queuedRetry": "\"{name}\" em fila para nova tentativa.", "processing.jobFallback": "Trabalho {id}", "processing.tasks": "Tarefas", - "processing.pipelineHint": "Pipeline: normalize → specs → fill → EPREL → AI. Inícios grandes podem dividir-se em trabalhos irmãos.", + "processing.pipelineHint": "Pipeline: normalize → specs → fill → EPREL → AI. Inícios grandes podem dividir-se em trabalhos irmãos.", "processing.emptyTitle": "Ainda sem tarefas em segundo plano", "processing.emptyBody": "Ainda sem tarefas em segundo plano. Inicie um novo trabalho a partir de Products quando estiver pronto.", "processing.startJob": "Iniciar um trabalho", "processing.connectFeed": "Ligar feed", - "processing.splitBatch": "Lote dividido · {jobs} trabalhos · {products} produtos", + "processing.splitBatch": "Lote dividido · {jobs} trabalhos · {products} produtos", "processing.col.task": "Tarefa", "processing.col.status": "Estado", "processing.col.steps": "Passos", "processing.col.progress": "Progresso", "processing.col.started": "Iniciado", - "processing.col.completed": "Concluído", - "processing.col.actions": "Ações", - "processing.partOfBatch": "· parte do lote", + "processing.col.completed": "Concluído", + "processing.col.actions": "Ações", + "processing.partOfBatch": "· parte do lote", "processing.nowStep": "Agora: {step}", "processing.skip": "(saltar)", "processing.reviewResults": "Rever resultados", "processing.reviewTitle": "Abra Needs Review para aceitar, editar ou rejeitar o enriquecimento", "processing.cancel": "Cancelar", - "processing.cancelling": "A cancelar…", - "processing.cancelTitle": "Cancelar este trabalho pendente ou em execução", + "processing.cancelling": "A cancelar…", + "processing.cancelTitle": "Cancelar este trabalho pendente ou em execução", "processing.retry": "Tentar novamente", - "processing.retrying": "A tentar novamente…", - "processing.actions.onPage": "{count} nesta página", - "processing.actions.clearSelection": "Limpar seleção", - "processing.actions.processSelected": "Processar seleção", + "processing.retrying": "A tentar novamente…", + "processing.actions.onPage": "{count} nesta página", + "processing.actions.clearSelection": "Limpar seleção", + "processing.actions.processSelected": "Processar seleção", "processing.actions.processAria": "Processar produtos selecionados", - "processing.actions.processAriaCount": "Processar {count} produto{plural} selecionado(s) nesta página", + "processing.actions.processAriaCount": "Processar {count} produto{plural} selecionado(s) nesta página", "processing.actions.whatToProcess": "O que processar", - "processing.actions.freeNoAiTitle": "Plano Free — sem créditos de IA", - "processing.actions.freeNoAiBody": "Normalize, specs, fill e EPREL continuam a correr. Títulos/descrições de IA precisam de um plano pago ou créditos.", + "processing.actions.freeNoAiTitle": "Plano Free — sem créditos de IA", + "processing.actions.freeNoAiBody": "Normalize, specs, fill e EPREL continuam a correr. Títulos/descrições de IA precisam de um plano pago ou créditos.", "processing.actions.comparePlans": "Comparar planos", "processing.actions.selectAll": "Selecionar tudo", "processing.actions.selectAllAria": "Selecionar todos os modos de processamento", - "processing.actions.upgradeRequired": "{label} (atualização necessária)", - "processing.actions.upgradeSuffix": " · atualizar", - "processing.actions.credits": "{credits} créditos", - "processing.actions.free": "grátis", - "processing.actions.autoCategorizeTitle": "A adicionar categorização automaticamente", - "processing.actions.autoCategorizeBody": "{count} produto(s) precisam de categorização para o processamento de {types}", - "processing.actions.aiLocked": "As opções de IA estão bloqueadas no Free. Atualize para processar títulos/descrições.", - "processing.actions.totalCredits": "Créditos totais ({count} nesta página):", - "processing.actions.starting": "A iniciar…", - "processing.actions.processCount": "Processar {count} nesta página", + "processing.actions.upgradeRequired": "{label} (atualização necessária)", + "processing.actions.upgradeSuffix": " · atualizar", + "processing.actions.credits": "{credits} créditos", + "processing.actions.free": "grátis", + "processing.actions.autoCategorizeTitle": "A adicionar categorização automaticamente", + "processing.actions.autoCategorizeBody": "{count} produto(s) precisam de categorização para o processamento de {types}", + "processing.actions.aiLocked": "As opções de IA estão bloqueadas no Free. Atualize para processar títulos/descrições.", + "processing.actions.totalCredits": "Créditos totais ({count} nesta página):", + "processing.actions.starting": "A iniciar…", + "processing.actions.processCount": "Processar {count} nesta página", "processing.actions.close": "Fechar", "processing.actions.accept": "Aceitar", "processing.actions.acceptEnrichment": "Aceitar enriquecimento", "processing.actions.export": "Exportar", - "processing.actions.exportSelected": "Exportar seleção", + "processing.actions.exportSelected": "Exportar seleção", "processing.actions.reject": "Rejeitar", "processing.actions.rejectReset": "Rejeitar (repor)", - "processing.actions.resetUnprocessed": "Repor para Não processado", + "processing.actions.resetUnprocessed": "Repor para Não processado", "processing.actions.confirmTitle": "Confirmar processamento", - "processing.actions.confirmBody": "Processar {count} produto(s) nesta página por {credits} créditos. Os créditos são consumidos quando o trabalho começa e não podem ser anulados a partir desta ação.", + "processing.actions.confirmBody": "Processar {count} produto(s) nesta página por {credits} créditos. Os créditos são consumidos quando o trabalho começa e não podem ser anulados a partir desta ação.", "processing.actions.confirmStart": "Iniciar processamento", "processing.option.category": "Categorias", "processing.option.attributes": "Atributos / specs", - "processing.option.title": "Títulos (IA)", - "processing.option.description": "Descrições (IA)", + "processing.option.title": "Títulos (IA)", + "processing.option.description": "Descrições (IA)", "processing.receipt.view": "Ver em Processamento", "processing.receipt.undo": "Anular", - "processing.receipt.format": "{succeeded} com sucesso · {skipped} ignorados · {failed} falhados", + "processing.receipt.format": "{succeeded} com sucesso · {skipped} ignorados · {failed} falhados", "processing.receipt.cancelledOne": "Processamento cancelado", "processing.receipt.cancelledMany": "Trabalhos de processamento cancelados", - "processing.receipt.cancelledDesc": "O trabalho recém-iniciado foi cancelado.", - "processing.receipt.cancelFailed": "Não foi possível cancelar o trabalho de processamento", - "unsubscribe.title": "Cancelar subscrição", - "unsubscribe.me": "Cancelar a minha subscrição", - "unsubscribe.invalidLink": "Ligação inválida", - "unsubscribe.failedShort": "Falha ao cancelar a subscrição", - "unsubscribe.already": "Já cancelou a subscrição.", - "unsubscribe.confirmPrompt": "Confirme abaixo para cancelar a subscrição dos e-mails de marketing.", - "unsubscribe.done": "A sua subscrição foi cancelada.", + "processing.receipt.cancelledDesc": "O trabalho recém-iniciado foi cancelado.", + "processing.receipt.cancelFailed": "Não foi possível cancelar o trabalho de processamento", + "unsubscribe.title": "Cancelar subscrição", + "unsubscribe.me": "Cancelar a minha subscrição", + "unsubscribe.invalidLink": "Ligação inválida", + "unsubscribe.failedShort": "Falha ao cancelar a subscrição", + "unsubscribe.already": "Já cancelou a subscrição.", + "unsubscribe.confirmPrompt": "Confirme abaixo para cancelar a subscrição dos e-mails de marketing.", + "unsubscribe.done": "A sua subscrição foi cancelada.", "stores.title": "Lojas e fontes", - "stores.description": "Ligue qualquer loja ou fornecedor num só sítio — Woo, Shopify, URL de feed ou CSV. Lojas live: produtos Descrybe → loja; encomendas/avaliações loja → Descrybe. Exporte quando o catálogo estiver pronto.", + "stores.description": "Ligue qualquer loja ou fornecedor num só sítio — Woo, Shopify, URL de feed ou CSV. Lojas live: produtos Descrybe → loja; encomendas/avaliações loja → Descrybe. Exporte quando o catálogo estiver pronto.", "stores.allInputFeeds": "Todos os feeds de entrada", - "stores.exportFeeds": "Feeds de exportação", - "stores.migrationNote": "Após uma migração da plataforma Descrybe, as credenciais de WooCommerce e Shopify podem precisar ser reintroduzidas — é um passo de religação, não uma sync avariada.", + "stores.exportFeeds": "Feeds de exportação", + "stores.migrationNote": "Após uma migração da plataforma Descrybe, as credenciais de WooCommerce e Shopify podem precisar ser reintroduzidas — é um passo de religação, não uma sync avariada.", "stores.docsPrefix": "Docs:", - "stores.docsApiOverview": "Visão geral da API", - "stores.docsSuffix": "para acesso público a produtos; use WooCommerce ou Shopify abaixo para a sync em direto da loja.", - "stores.connectorsHeading": "Conectores de loja e catálogo", + "stores.docsApiOverview": "Visão geral da API", + "stores.docsSuffix": "para acesso público a produtos; use WooCommerce ou Shopify abaixo para a sync em direto da loja.", + "stores.connectorsHeading": "Conectores de loja e catálogo", "stores.statusAria": "Estado: {label}", "stores.ctaAria": "{cta}: {title}", - "stores.startTitle": "Por onde começar?", - "stores.startBody": "Loja Woo → WooCommerce. Shopify ou outra plataforma → URL de feed ou carregamento CSV. Pronto para Merchant Center ou parceiros → Feeds de exportação (predefinição Google Shopping ou campos personalizados). Após uma migração, volte a ligar Woo/Shopify antes de esperar que a sync funcione.", - "stores.startBodyMember": "Peça a um admin da empresa para ligar WooCommerce ou Shopify. Ainda pode abrir lojas ligadas para sincronizar e navegar, e usar Feed URL, CSV ou feeds de exportação conforme o plano.", - "stores.wizard.title": "Configuração guiada da loja", - "stores.wizard.description": "Ligue uma loja, teste a ligação, coloque a primeira sync de produtos na fila e está feito.", - "stores.wizard.guidedSetup": "Configuração guiada", - "stores.wizard.guidedSetupAria": "Iniciar configuração guiada da loja", - "stores.wizard.adminOnly": "Só os admins da empresa podem executar a configuração guiada (guardar credenciais e primeira sincronização). Ainda pode abrir lojas ligadas.", + "stores.startTitle": "Por onde começar?", + "stores.startBody": "Loja Woo → WooCommerce. Shopify ou outra plataforma → URL de feed ou carregamento CSV. Pronto para Merchant Center ou parceiros → Feeds de exportação (predefinição Google Shopping ou campos personalizados). Após uma migração, volte a ligar Woo/Shopify antes de esperar que a sync funcione.", + "stores.startBodyMember": "Peça a um admin da empresa para ligar WooCommerce ou Shopify. Ainda pode abrir lojas ligadas para sincronizar e navegar, e usar Feed URL, CSV ou feeds de exportação conforme o plano.", + "stores.wizard.title": "Configuração guiada da loja", + "stores.wizard.description": "Ligue uma loja, teste a ligação, coloque a primeira sync de produtos na fila e está feito.", + "stores.wizard.guidedSetup": "Configuração guiada", + "stores.wizard.guidedSetupAria": "Iniciar configuração guiada da loja", + "stores.wizard.adminOnly": "Só os admins da empresa podem executar a configuração guiada (guardar credenciais e primeira sincronização). Ainda pode abrir lojas ligadas.", "stores.wizard.pickChannel": "Escolha um conector de loja", - "stores.wizard.pickChannelBody": "Escolha WooCommerce ou Shopify. Conclua ligar → testar → primeira sync na página do conector e volte aqui.", + "stores.wizard.pickChannelBody": "Escolha WooCommerce ou Shopify. Conclua ligar → testar → primeira sync na página do conector e volte aqui.", "stores.wizard.channel.shopify": "Shopify", "stores.wizard.channel.woocommerce": "WooCommerce", "stores.wizard.channelLabel": "A configurar: {channel}", "stores.wizard.changeChannel": "Mudar conector", - "stores.wizard.noChannels": "Não há conectores de loja no seu plano. Atualize ou peça a um admin.", - "stores.wizard.progress": "{done} de {total} concluídos", - "stores.wizard.stepsLabel": "Passos de configuração da loja", + "stores.wizard.noChannels": "Não há conectores de loja no seu plano. Atualize ou peça a um admin.", + "stores.wizard.progress": "{done} de {total} concluídos", + "stores.wizard.stepsLabel": "Passos de configuração da loja", "stores.wizard.step.connect.title": "Ligar", - "stores.wizard.step.connect.body": "Guarde as credenciais na página do conector.", - "stores.wizard.step.test.title": "Testar ligação", - "stores.wizard.step.test.body": "Execute Testar ligação até ter sucesso.", - "stores.wizard.step.sync.title": "Primeira sincronização", - "stores.wizard.step.sync.body": "Coloque a primeira sync de produtos na fila (ative a sync se necessário).", - "stores.wizard.step.done.title": "Concluído", - "stores.wizard.step.done.body": "A loja está ligada e uma sync foi iniciada ou concluída.", + "stores.wizard.step.connect.body": "Guarde as credenciais na página do conector.", + "stores.wizard.step.test.title": "Testar ligação", + "stores.wizard.step.test.body": "Execute Testar ligação até ter sucesso.", + "stores.wizard.step.sync.title": "Primeira sincronização", + "stores.wizard.step.sync.body": "Coloque a primeira sync de produtos na fila (ative a sync se necessário).", + "stores.wizard.step.done.title": "Concluído", + "stores.wizard.step.done.body": "A loja está ligada e uma sync foi iniciada ou concluída.", "stores.wizard.openConnector": "Abrir conector", "stores.wizard.viewProducts": "Ver produtos", - "stores.wizard.backToHub": "Voltar às lojas", - "stores.wizard.banner.generic": "Configuração guiada: conclua este passo e volte ao assistente.", - "stores.wizard.banner.test": "Configuração guiada — teste a ligação e volte ao assistente.", - "stores.wizard.banner.sync": "Configuração guiada — coloque a primeira sync de produtos na fila e volte ao assistente.", + "stores.wizard.backToHub": "Voltar às lojas", + "stores.wizard.banner.generic": "Configuração guiada: conclua este passo e volte ao assistente.", + "stores.wizard.banner.test": "Configuração guiada — teste a ligação e volte ao assistente.", + "stores.wizard.banner.sync": "Configuração guiada — coloque a primeira sync de produtos na fila e volte ao assistente.", "stores.wizard.banner.return": "Voltar ao assistente", "stores.wizard.banner.dismiss": "Dispensar", "stores.woo.title": "WooCommerce", - "stores.woo.description": "Envie produtos Descrybe → WooCommerce. Importe encomendas e avaliações WooCommerce → Descrybe.", + "stores.woo.description": "Envie produtos Descrybe → WooCommerce. Importe encomendas e avaliações WooCommerce → Descrybe.", "stores.woo.ctaReconnect": "Voltar a ligar Woo", "stores.woo.ctaOpen": "Abrir Woo", "stores.woo.ctaConnect": "Ligar Woo", "stores.woo.ctaView": "Ver Woo", "stores.shopify.title": "Shopify", - "stores.shopify.description": "Envie produtos Descrybe → Shopify. Importe encomendas Shopify → Descrybe. Avaliações não estão disponíveis na Admin API da Shopify.", + "stores.shopify.description": "Envie produtos Descrybe → Shopify. Importe encomendas Shopify → Descrybe. Avaliações não estão disponíveis na Admin API da Shopify.", "stores.shopify.ctaReconnect": "Voltar a ligar Shopify", "stores.shopify.ctaOpen": "Abrir Shopify", "stores.shopify.ctaConnect": "Ligar Shopify", @@ -3742,33 +3743,33 @@ export const pt: MessageDict = { "stores.feedUrl.description": "Pull any supplier or loja catalog from a public CSV or XML URL on a schedule. Map fields, then sync.", "stores.feedUrl.cta": "Adicionar URL do feed", "stores.csv.title": "Carregamento CSV", - "stores.csv.description": "Carregue um CSV de produtos como feed de entrada. Ideal para ficheiros de fornecedor pontuais ou exportações do admin Shopify.", + "stores.csv.description": "Carregue um CSV de produtos como feed de entrada. Ideal para ficheiros de fornecedor pontuais ou exportações do admin Shopify.", "stores.csv.cta": "Carregar CSV", "stores.export.title": "Exportar / REST", - "stores.export.description": "Publique Google Shopping ou CSV/XML personalizado com URL pública. Ou obtenha produtos via chave API (/api/v1).", - "stores.export.cta": "Abrir exportações", + "stores.export.description": "Publique Google Shopping ou CSV/XML personalizado com URL pública. Ou obtenha produtos via chave API (/api/v1).", + "stores.export.cta": "Abrir exportações", "stores.apiKeys.title": "Chaves API", - "stores.apiKeys.description": "As chaves API antigas não foram migradas. Crie uma nova chave em Definições para restaurar o acesso a /api/v1 — o segredo só é mostrado uma vez.", - "stores.apiKeys.descriptionMember": "Chaves API da empresa para /api/v1. As legado não foram migradas — só admins podem criar ou revogar; pode ver prefixos em Definições.", + "stores.apiKeys.description": "As chaves API antigas não foram migradas. Crie uma nova chave em Definições para restaurar o acesso a /api/v1 — o segredo só é mostrado uma vez.", + "stores.apiKeys.descriptionMember": "Chaves API da empresa para /api/v1. As legado não foram migradas — só admins podem criar ou revogar; pode ver prefixos em Definições.", "stores.apiKeys.cta": "Gerir chaves API", "stores.apiKeys.ctaView": "Ver chaves API", - "stores.status.needsReconnect": "Precisa de religação", + "stores.status.needsReconnect": "Precisa de religação", "stores.status.connected": "Ligado", - "stores.status.notConnected": "Não ligado", + "stores.status.notConnected": "Não ligado", "stores.status.ready": "Pronto", - "stores.status.outbound": "De saída", + "stores.status.outbound": "De saída", "stores.status.reissue": "Reemitir", - "store.tab.connection": "Ligação", + "store.tab.connection": "Ligação", "store.tab.orders": "Encomendas", - "store.tab.settings": "Definições", + "store.tab.settings": "Definições", "store.tab.categories": "Categorias", "store.tab.attributes": "Atributos", - "store.tab.reviews": "Avaliações", + "store.tab.reviews": "Avaliações", "store.badge.credentialsOnFile": "Credenciais guardadas", "store.badge.syncEnabled": "Envio de produtos ativado", "store.badge.syncDisabled": "Envio de produtos desativado", "store.badge.syncQueued": "Envio de produtos na fila", - "store.badge.dryRun": "Simulação", + "store.badge.dryRun": "Simulação", "store.badge.testStatus": "Teste: {status}", "store.badge.syncStatus": "Envio de produtos: {status}", "store.badge.ordersQueued": "Sync de encomendas em fila", @@ -3776,62 +3777,62 @@ export const pt: MessageDict = { "store.badge.syncedCount": "{count} sincronizados", "store.badge.mappedCount": "{count} mapeados", "store.badge.productsCount": "{count} produtos", - "store.badge.optionsCount": "{count} opções", - "store.lastSync": "Última sync: {date}", - "store.noOrdersSyncYet": "Ainda não foi concluída nenhuma sync de encomendas.", + "store.badge.optionsCount": "{count} opções", + "store.lastSync": "Última sync: {date}", + "store.noOrdersSyncYet": "Ainda não foi concluída nenhuma sync de encomendas.", "store.save": "Guardar", "store.saving": "A guardar...", "store.testing": "A testar...", - "store.testConnection": "Testar ligação", + "store.testConnection": "Testar ligação", "store.queueing": "A colocar na fila...", - "store.queueProductPush": "Colocar envio de produtos na fila (Descrybe → loja)", - "store.queueFirstProductSync": "Colocar primeiro envio de produtos na fila (Descrybe → loja)", - "store.queueOrdersImport": "Colocar importação de encomendas na fila (loja → Descrybe)", + "store.queueProductPush": "Colocar envio de produtos na fila (Descrybe → loja)", + "store.queueFirstProductSync": "Colocar primeiro envio de produtos na fila (Descrybe → loja)", + "store.queueOrdersImport": "Colocar importação de encomendas na fila (loja → Descrybe)", "store.refreshList": "Atualizar lista", "store.saveBeforeTest": "Guarde as credenciais antes de testar", - "store.saveTestBeforeQueue": "Guarde as credenciais e teste a ligação antes de sincronizar", - "store.connectionOk": "Ligação OK", - "store.connectionSuccessful": "Ligação bem-sucedida", - "store.connectionSuccessfulDot": "Ligação bem-sucedida.", - "store.connectionFailed": "Falha na ligação", - "store.connectionFailedDot": "Falha na ligação.", - "store.connectionTestFailed": "Teste de ligação falhou", + "store.saveTestBeforeQueue": "Guarde as credenciais e teste a ligação antes de sincronizar", + "store.connectionOk": "Ligação OK", + "store.connectionSuccessful": "Ligação bem-sucedida", + "store.connectionSuccessfulDot": "Ligação bem-sucedida.", + "store.connectionFailed": "Falha na ligação", + "store.connectionFailedDot": "Falha na ligação.", + "store.connectionTestFailed": "Teste de ligação falhou", "store.testFailed": "Teste falhou", - "store.setupSteps": "Passos de configuração", + "store.setupSteps": "Passos de configuração", "store.col.order": "Encomenda", "store.col.customer": "Cliente", "store.col.status": "Estado", "store.col.total": "Total", "store.col.date": "Data", - "store.loadingOrders": "A carregar encomendas…", + "store.loadingOrders": "A carregar encomendas…", "store.loadingOrdersDot": "A carregar encomendas.", - "flash.store.saveFailed": "Não foi possível guardar as definições", - "flash.store.queueSyncFailed": "Não foi possível colocar a sincronização na fila", - "flash.store.queueOrdersFailed": "Não foi possível colocar a sincronização de encomendas na fila", + "flash.store.saveFailed": "Não foi possível guardar as definições", + "flash.store.queueSyncFailed": "Não foi possível colocar a sincronização na fila", + "flash.store.queueOrdersFailed": "Não foi possível colocar a sincronização de encomendas na fila", "flash.store.connectedTo": "Ligado a {name}.", - "flash.shopify.loadFailed": "Falha ao carregar a configuração Shopify", - "flash.shopify.productSyncQueued": "Sincronização de produtos em fila. O worker irá executá-la em breve.", - "flash.shopify.ordersSyncQueued": "Sincronização de encomendas em fila. O worker irá executá-la em breve.", - "flash.woo.loadFailed": "Falha ao carregar a configuração WooCommerce", - "flash.woo.productSyncQueued": "Sincronização de produtos em fila. Será executada em breve.", - "flash.woo.ordersSyncQueued": "Sincronização de encomendas em fila. Será executada em breve.", - "flash.woo.reviewsSyncQueued": "Sincronização de avaliações em fila. Será executada em breve.", - "flash.woo.queueReviewsFailed": "Não foi possível colocar a sincronização de avaliações na fila", + "flash.shopify.loadFailed": "Falha ao carregar a configuração Shopify", + "flash.shopify.productSyncQueued": "Sincronização de produtos em fila. O worker irá executá-la em breve.", + "flash.shopify.ordersSyncQueued": "Sincronização de encomendas em fila. O worker irá executá-la em breve.", + "flash.woo.loadFailed": "Falha ao carregar a configuração WooCommerce", + "flash.woo.productSyncQueued": "Sincronização de produtos em fila. Será executada em breve.", + "flash.woo.ordersSyncQueued": "Sincronização de encomendas em fila. Será executada em breve.", + "flash.woo.reviewsSyncQueued": "Sincronização de avaliações em fila. Será executada em breve.", + "flash.woo.queueReviewsFailed": "Não foi possível colocar a sincronização de avaliações na fila", "flash.woo.remoteMapsFailed": "Falha ao carregar os mapas remotos", - "flash.woo.syncSettingsFailed": "Não foi possível guardar as definições de sincronização", - "flash.woo.categoryAutoMapFailed": "Falha no mapeamento automático de categorias", - "flash.woo.attributeAutoMapFailed": "Falha no mapeamento automático de atributos", - "shopify.title": "Integração Shopify", - "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", - "shopify.adminOnly": "Only empresa admins can change Shopify connection definições. Sincronizar and browse stay disponível.", - "shopify.lockedTitle": "Ligação Shopify bloqueada", - "shopify.noCredentialsMember": "Ainda não há credenciais Shopify. Peça a um administrador da empresa para ligar a loja. Sync e consulta de encomendas ficam disponíveis após guardar e testar a ligação.", + "flash.woo.syncSettingsFailed": "Não foi possível guardar as definições de sincronização", + "flash.woo.categoryAutoMapFailed": "Falha no mapeamento automático de categorias", + "flash.woo.attributeAutoMapFailed": "Falha no mapeamento automático de atributos", + "shopify.title": "Integração Shopify", + "shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.", + "shopify.adminOnly": "Only empresa admins can change Shopify connection definições. Sincronizar and browse stay disponível.", + "shopify.lockedTitle": "Ligação Shopify bloqueada", + "shopify.noCredentialsMember": "Ainda não há credenciais Shopify. Peça a um administrador da empresa para ligar a loja. Sync e consulta de encomendas ficam disponíveis após guardar e testar a ligação.", "shopify.enterToken": "Introduzir credenciais", - "shopify.noCredentials": "Sem credenciais Shopify. Introduza o domínio *.myshopify.com e o Client ID + secret do Dev Dashboard (ou um token Admin API legado), depois Guardar e Testar ligação. Após uma migração de plataforma, os segredos antigos não são transferidos — reconecte com um token novo.", + "shopify.noCredentials": "Sem credenciais Shopify. Introduza o domínio *.myshopify.com e o Client ID + secret do Dev Dashboard (ou um token Admin API legado), depois Guardar e Testar ligação. Após uma migração de plataforma, os segredos antigos não são transferidos — reconecte com um token novo.", "shopify.allConnectors": "Todos os conectores de loja", - "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", + "shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.", "shopify.setup.oauthNote": "Still manual: create/install the app in Shopify and paste Client ID + secret here. Descrybe does not host a one-click App Store install. Legacy permanent shpat_ tokens from older Admin custom apps still work.", - "shopify.setup.scopesTitle": "Scopes Admin API necessários", + "shopify.setup.scopesTitle": "Scopes Admin API necessários", "shopify.setup.scopesIntro": "Add these scopes on the app version in the Dev Dashboard before you release and install:", "shopify.setup.step3.scopes": "write_products, read_products, read_orders", "shopify.setup.step3.mid": ", then", @@ -3841,289 +3842,289 @@ export const pt: MessageDict = { "shopify.setup.step5.clientId": "Client ID", "shopify.setup.step5.and": "and", "shopify.setup.step5.clientSecret": "Client secret", - "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", + "shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →", "shopify.setup.step5.save": "Save", - "shopify.setup.step5.arrow": "→", + "shopify.setup.step5.arrow": "→", "shopify.setup.step5.test": "Test Connection", "shopify.setup.step5.after": ". Descrybe stores secrets encrypted and refreshes the short-lived access token automatically.", "shopify.setup.step6.products": "Products", - "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", + "shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).", "shopify.setup.step6.orders": "Orders", - "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", + "shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).", "shopify.setup.step7.before": "No live shop yet? Enable", "shopify.setup.step7.dryRun": "Dry run", "shopify.setup.step7.after": "(or use the special dry-run access token) to walk through the flow without calling Shopify.", "shopify.setup.openDevDashboard": "Open Dev Dashboard", "shopify.setup.openDevelopApps": "Open shop Develop apps", "shopify.setup.openDevelopAppsNeedDomain": "Enter your shop domain below to unlock a direct Admin link for this store.", - "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", + "shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.", "shopify.setup.copyScopes": "Copy required scopes", "shopify.setup.scopesCopied": "Scopes copied", "shopify.setup.docsCreate": "Create app docs", "shopify.setup.docsTokens": "Access token docs", - "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", + "shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)", "shopify.setup.hideLegacyToken": "Hide legacy token field", - "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", + "shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.", "shopify.field.clientId": "Client ID", "shopify.field.clientSecret": "Client secret", - "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", + "shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.", "shopify.field.accessTokenHelp": "Only for custom apps created in Shopify Admin before January 2026. New apps should use Client ID + secret instead.", "shopify.placeholder.clientId": "Client ID from Dev Dashboard", - "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", + "shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace", "shopify.placeholder.clientSecret": "Client secret", - "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", + "shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace", "shopify.setup.scope.write_products": "write_products", - "shopify.setup.scope.write_productsWhy": "Criar e atualizar produtos na Shopify (push de saída)", + "shopify.setup.scope.write_productsWhy": "Criar e atualizar produtos na Shopify (push de saída)", "shopify.setup.scope.read_products": "read_products", "shopify.setup.scope.read_productsWhy": "Encontrar produtos existentes por SKU antes de atualizar", "shopify.setup.scope.read_orders": "read_orders", "shopify.setup.scope.read_ordersWhy": "Importar encomendas para o Descrybe (entrada)", - "shopify.setup.step1": "Se ligou o Shopify antes de uma migração de plataforma: crie uma nova app no Dev Dashboard (ou reconecte com um token legado novo) — os segredos guardados não são transferidos.", + "shopify.setup.step1": "Se ligou o Shopify antes de uma migração de plataforma: crie uma nova app no Dev Dashboard (ou reconecte com um token legado novo) — os segredos guardados não são transferidos.", "shopify.setup.step2.before": "Open the", "shopify.setup.step2.path": "Shopify Dev Dashboard", - "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", + "shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).", "shopify.setup.step3.before": "Create a version: set App URL (default home is fine for API-only), add scopes", "shopify.setup.step3.after": ".", "shopify.setup.step4.before": "From the app Home tab,", "shopify.setup.step4.after": "on your store (merchant must approve scopes).", - "shopify.testSectionTitle": "Verificar ligação", - "shopify.testHint": "Guarde primeiro o domínio da loja e o token e depois execute Testar ligação. Um teste bem-sucedido confirma o token e os scopes antes de enfileirar a sync.", + "shopify.testSectionTitle": "Verificar ligação", + "shopify.testHint": "Guarde primeiro o domínio da loja e o token e depois execute Testar ligação. Um teste bem-sucedido confirma o token e os scopes antes de enfileirar a sync.", "shopify.overwriteTitle": "Substituir produtos Shopify?", - "shopify.overwriteBodyCount": "Isto coloca na fila um envio de produtos de saída. {count} produto(s) Shopify previamente ligados podem ser atualizados com o conteúdo Descrybe.", - "shopify.overwriteBody": "Isto coloca na fila um envio de produtos de saída. Os produtos Shopify correspondentes podem ser atualizados com o conteúdo Descrybe.", + "shopify.overwriteBodyCount": "Isto coloca na fila um envio de produtos de saída. {count} produto(s) Shopify previamente ligados podem ser atualizados com o conteúdo Descrybe.", + "shopify.overwriteBody": "Isto coloca na fila um envio de produtos de saída. Os produtos Shopify correspondentes podem ser atualizados com o conteúdo Descrybe.", "shopify.credentialsTitle": "Credenciais da loja", - "shopify.credentialsDesc.before": "O domínio da loja deve ser o seu", + "shopify.credentialsDesc.before": "O domínio da loja deve ser o seu", "shopify.credentialsDesc.code": "*.myshopify.com", "shopify.credentialsDesc.after": "domain. Prefer Dev Dashboard Client ID + secret; legacy Admin API tokens still work.", - "shopify.field.shopDomain": "Domínio da loja", + "shopify.field.shopDomain": "Domínio da loja", "shopify.field.accessToken": "Token de acesso Admin API", - "shopify.field.apiVersion": "Versão da API", + "shopify.field.apiVersion": "Versão da API", "shopify.placeholder.tokenKeep": "******** (deixar em branco para manter)", - "shopify.enableSync": "Ativar envio de produtos (Descrybe → Shopify)", - "shopify.dryRunLabel": "Simulação (sem chamadas Shopify ao vivo)", - "shopify.ordersTitle": "Importação de encomendas (Shopify → Descrybe)", - "shopify.ordersDesc": "Shopify → Descrybe — importa encomendas e linhas para o Descrybe (não escreve de volta na Shopify).", - "shopify.ordersNeedsReconnect": "A importação de encomendas não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", + "shopify.enableSync": "Ativar envio de produtos (Descrybe → Shopify)", + "shopify.dryRunLabel": "Simulação (sem chamadas Shopify ao vivo)", + "shopify.ordersTitle": "Importação de encomendas (Shopify → Descrybe)", + "shopify.ordersDesc": "Shopify → Descrybe — importa encomendas e linhas para o Descrybe (não escreve de volta na Shopify).", + "shopify.ordersNeedsReconnect": "A importação de encomendas não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", "shopify.notesTitle": "Notas", "shopify.notesDesc": "Capacidades do conector Shopify", - "shopify.notes.productsLabel": "Produtos (Descrybe → Shopify)", - "shopify.notes.productsBody": "— os produtos Descrybe processados são criados ou atualizados no Shopify (correspondência por SKU via GraphQL quando não há id de produto Shopify em cache). Uma re-sync pode sobrescrever campos remotos correspondentes.", - "shopify.notes.ordersLabel": "Encomendas (Shopify → Descrybe)", - "shopify.notes.ordersBody": "— obtidos para relatórios e futuros fluxos de audiência.", - "shopify.notes.reviewsLabel": "Avaliações", + "shopify.notes.productsLabel": "Produtos (Descrybe → Shopify)", + "shopify.notes.productsBody": "— os produtos Descrybe processados são criados ou atualizados no Shopify (correspondência por SKU via GraphQL quando não há id de produto Shopify em cache). Uma re-sync pode sobrescrever campos remotos correspondentes.", + "shopify.notes.ordersLabel": "Encomendas (Shopify → Descrybe)", + "shopify.notes.ordersBody": "— obtidos para relatórios e futuros fluxos de audiência.", + "shopify.notes.reviewsLabel": "Avaliações", "shopify.notes.reviewsBody": "-- not suporteed. Shopify has no first-party produto reviews Admin API (third-party review apps are out of scope here).", - "shopify.notes.encryption.before": "Os tokens são encriptados em repouso com", - "woo.title": "Integração WooCommerce", - "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", + "shopify.notes.encryption.before": "Os tokens são encriptados em repouso com", + "woo.title": "Integração WooCommerce", + "woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).", "woo.allStores": "Todas as lojas", - "woo.adminOnly": "Apenas administradores da empresa podem alterar a ligação e o mapeamento WooCommerce. A sincronização e a navegação continuam disponíveis.", + "woo.adminOnly": "Apenas administradores da empresa podem alterar a ligação e o mapeamento WooCommerce. A sincronização e a navegação continuam disponíveis.", "woo.enterCredentials": "Introduzir credenciais", - "woo.noCredentials": "Sem credenciais WooCommerce. Introduza o URL da loja, crie uma chave REST API Read/Write no WordPress, cole Consumer Key e Secret, depois Guardar e Testar ligação. Após uma migração de plataforma, os segredos antigos não são transferidos — reconecte com uma chave nova.", - "woo.lockedTitle": "Ligação WooCommerce bloqueada", - "woo.noCredentialsMember": "Ainda não há credenciais WooCommerce. Peça a um administrador da empresa para ligar a loja. Sync, encomendas e avaliações ficam disponíveis após guardar e testar a ligação.", + "woo.noCredentials": "Sem credenciais WooCommerce. Introduza o URL da loja, crie uma chave REST API Read/Write no WordPress, cole Consumer Key e Secret, depois Guardar e Testar ligação. Após uma migração de plataforma, os segredos antigos não são transferidos — reconecte com uma chave nova.", + "woo.lockedTitle": "Ligação WooCommerce bloqueada", + "woo.noCredentialsMember": "Ainda não há credenciais WooCommerce. Peça a um administrador da empresa para ligar a loja. Sync, encomendas e avaliações ficam disponíveis após guardar e testar a ligação.", "woo.setupDesc": "Follow these steps to create a WooCommerce REST API key in WordPress and connect it here. Descrybe never creates keys on your store for you.", - "woo.setup.step1": "Se ligou o WooCommerce antes de uma migração de plataforma: crie uma nova chave REST API — as credenciais guardadas antigas não são utilizáveis.", + "woo.setup.step1": "Se ligou o WooCommerce antes de uma migração de plataforma: crie uma nova chave REST API — as credenciais guardadas antigas não são utilizáveis.", "woo.setup.step2.before": "Enter your store", "woo.setup.step2.path": "HTTPS URL", "woo.setup.step2.after": "in the form below (example: https://yourstore.com).", "woo.setup.step3.before": "In WordPress admin, open", - "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", + "woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API", "woo.setup.step3.after": "(or use the deep link once your store URL is filled in).", "woo.setup.step4.before": "Click", "woo.setup.step4.addKey": "Add key", "woo.setup.step4.mid": ", set permissions to", "woo.setup.step4.permissions": "Read/Write", - "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", + "woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.", "woo.setup.step5.before": "Paste the key and secret below, enable sync if ready, then", "woo.setup.step5.save": "Save", - "woo.setup.step5.arrow": "→", + "woo.setup.step5.arrow": "→", "woo.setup.step5.test": "Test Connection", "woo.setup.step5.after": ".", "woo.setup.step6.products": "Products", - "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", + "woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).", "woo.setup.step6.orders": "Orders", "woo.setup.step6.and": "and", "woo.setup.step6.reviews": "reviews", - "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", + "woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.", "woo.setup.openKeys": "Abrir chaves REST API", "woo.setup.addKey": "Adicionar chave", - "woo.setup.openKeysHint": "Abre o admin WordPress → WooCommerce → Definições → Avançadas → REST API.", - "woo.setup.openKeysNeedUrl": "Guarde primeiro um URL de loja válido para abrir ligações de admin.", - "woo.setup.docsLink": "Documentação da REST API do WooCommerce", + "woo.setup.openKeysHint": "Abre o admin WordPress → WooCommerce → Definições → Avançadas → REST API.", + "woo.setup.openKeysNeedUrl": "Guarde primeiro um URL de loja válido para abrir ligações de admin.", + "woo.setup.docsLink": "Documentação da REST API do WooCommerce", "woo.overwriteTitle": "Substituir produtos WooCommerce?", - "woo.overwriteBodyCount": "Isto coloca na fila um envio de produtos de saída. {count} produto(s) WooCommerce previamente ligados podem ser atualizados com o conteúdo Descrybe.", - "woo.overwriteBody": "Isto coloca na fila um envio de produtos de saída. Os produtos WooCommerce correspondentes podem ser atualizados com o conteúdo Descrybe.", + "woo.overwriteBodyCount": "Isto coloca na fila um envio de produtos de saída. {count} produto(s) WooCommerce previamente ligados podem ser atualizados com o conteúdo Descrybe.", + "woo.overwriteBody": "Isto coloca na fila um envio de produtos de saída. Os produtos WooCommerce correspondentes podem ser atualizados com o conteúdo Descrybe.", "woo.connectionTitle": "Store connection", "woo.connectionDesc": "Paste your store URL and a Read/Write REST API key pair. Save, then Test Connection before queuing syncs.", - "woo.enableSync": "Ativar envio de produtos (Descrybe → WooCommerce)", + "woo.enableSync": "Ativar envio de produtos (Descrybe → WooCommerce)", "woo.field.storeUrl": "URL da loja", - "woo.field.storeUrlHelp": "URL público do site com https. Usado na REST API do WooCommerce e em ligações profundas ao admin WordPress.", + "woo.field.storeUrlHelp": "URL público do site com https. Usado na REST API do WooCommerce e em ligações profundas ao admin WordPress.", "woo.field.consumerKey": "Consumer Key", "woo.field.consumerSecret": "Consumer Secret", "woo.field.credentialsHelp": "Consumer Key e Secret com leitura/escrita. Deixe em branco para manter as credenciais existentes.", - "woo.placeholder.keep": "******** (sem alteração)", + "woo.placeholder.keep": "******** (sem alteração)", "woo.keepCredentialsHint": "Deixe chave/segredo em branco ao guardar para manter as credenciais existentes.", - "woo.saveConfiguration": "Guardar configuração", + "woo.saveConfiguration": "Guardar configuração", "woo.categoryMappingTitle": "Mapeamento de categorias", "woo.categoryMappingDesc": "Mapeie as suas categorias internas para as categorias WooCommerce", "woo.autoMapCategories": "Mapear categorias automaticamente", - "woo.autoMapping": "Mapeamento automático...", + "woo.autoMapping": "Mapeamento automático...", "woo.refreshCategories": "Atualizar categorias", - "woo.availableCategories": "Categorias WooCommerce disponíveis", - "woo.categoriesEmptyHint": "Teste a ligação e depois atualize para carregar categorias WooCommerce.", + "woo.availableCategories": "Categorias WooCommerce disponíveis", + "woo.categoriesEmptyHint": "Teste a ligação e depois atualize para carregar categorias WooCommerce.", "woo.attributeMappingTitle": "Mapeamento de atributos", "woo.attributeMappingDesc": "Mapeie os seus atributos internos para os atributos WooCommerce", "woo.autoMapAttributes": "Mapear atributos automaticamente", "woo.refreshAttributes": "Atualizar atributos", - "woo.availableAttributes": "Atributos WooCommerce disponíveis", - "woo.attributesEmptyHint": "Teste a ligação e depois atualize para carregar atributos WooCommerce.", - "woo.ordersTitle": "Importação de encomendas (WooCommerce → Descrybe)", - "woo.ordersDesc": "WooCommerce → Descrybe — importa encomendas e linhas para o Descrybe (não escreve de volta na loja).", - "woo.ordersNeedsReconnect": "A importação de encomendas não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", - "woo.syncSettingsTitle": "Definições de sync", - "woo.syncSettingsDesc": "Configure como os produtos são enviados Descrybe → WooCommerce", + "woo.availableAttributes": "Atributos WooCommerce disponíveis", + "woo.attributesEmptyHint": "Teste a ligação e depois atualize para carregar atributos WooCommerce.", + "woo.ordersTitle": "Importação de encomendas (WooCommerce → Descrybe)", + "woo.ordersDesc": "WooCommerce → Descrybe — importa encomendas e linhas para o Descrybe (não escreve de volta na loja).", + "woo.ordersNeedsReconnect": "A importação de encomendas não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", + "woo.syncSettingsTitle": "Definições de sync", + "woo.syncSettingsDesc": "Configure como os produtos são enviados Descrybe → WooCommerce", "woo.matchStrategy": "Produto Matching Strategy", - "woo.matchStrategyHelp": "O envio de produtos (Descrybe → WooCommerce) corresponde produtos remotos por SKU ou EAN/GTIN. Coloque na fila no separador Ligação (manual).", - "woo.lastSyncLabel": "Última sync", - "woo.saveSyncSettings": "Guardar definições de sync", + "woo.matchStrategyHelp": "O envio de produtos (Descrybe → WooCommerce) corresponde produtos remotos por SKU ou EAN/GTIN. Coloque na fila no separador Ligação (manual).", + "woo.lastSyncLabel": "Última sync", + "woo.saveSyncSettings": "Guardar definições de sync", "woo.match.sku": "SKU", "woo.match.ean": "EAN/GTIN", "plan.feature.section.shell": "Ambiente", "plan.feature.section.dashboard": "Painel", - "plan.feature.section.catalog": "Catálogo", + "plan.feature.section.catalog": "Catálogo", "plan.feature.section.feeds": "Feeds", "plan.feature.section.stores": "Lojas", "plan.feature.section.processing": "Processamento", "plan.feature.section.marketing": "Marketing", - "plan.feature.section.integrations": "Integrações", - "plan.feature.section.billing": "Faturação", - "plan.feature.section.settings": "Definições", + "plan.feature.section.integrations": "Integrações", + "plan.feature.section.billing": "Faturação", + "plan.feature.section.settings": "Definições", "plan.feature.section.support": "Suporte", "plan.feature.section.capabilities": "Capacidades", - "plan.feature.shell.navigation": "Navegação lateral", + "plan.feature.shell.navigation": "Navegação lateral", "plan.feature.shell.command_palette": "Paleta de comandos", "plan.feature.shell.company_switcher": "Seletor de empresa", - "plan.feature.shell.support_notifications": "Sino de notificações de suporte", + "plan.feature.shell.support_notifications": "Sino de notificações de suporte", "plan.feature.shell.tutorial": "Tutorial do produto", "plan.feature.shell.account_menu": "Menu da conta", - "plan.feature.shell.billing_recovery_banner": "Banner de recuperação de faturação", - "plan.feature.dashboard.overview": "Visão geral do painel", - "plan.feature.dashboard.stats": "Cartões de estatísticas", - "plan.feature.dashboard.quick_links": "Ligações rápidas", + "plan.feature.shell.billing_recovery_banner": "Banner de recuperação de faturação", + "plan.feature.dashboard.overview": "Visão geral do painel", + "plan.feature.dashboard.stats": "Cartões de estatísticas", + "plan.feature.dashboard.quick_links": "Ligações rápidas", "plan.feature.dashboard.recent_jobs": "Tarefas recentes", - "plan.feature.dashboard.news_feed": "Feed de notícias", - "plan.feature.dashboard.activation_checklist": "Lista de ativação", + "plan.feature.dashboard.news_feed": "Feed de notícias", + "plan.feature.dashboard.activation_checklist": "Lista de ativação", "plan.feature.dashboard.migrated_checklist": "Lista da coorte migrada", "plan.feature.dashboard.etl_gaps": "Painel de lacunas ETL", - "plan.feature.dashboard.store_reconnect": "Banner de reconexão da loja", - "plan.feature.dashboard.upgrade_banners": "Banners de atualização", + "plan.feature.dashboard.store_reconnect": "Banner de reconexão da loja", + "plan.feature.dashboard.upgrade_banners": "Banners de atualização", "plan.feature.catalog.products": "Produtos", "plan.feature.catalog.products.tab_processed": "Produtos - separador Processados", - "plan.feature.catalog.products.tab_needs_review": "Produtos - separador Precisa de revisão", + "plan.feature.catalog.products.tab_needs_review": "Produtos - separador Precisa de revisão", "plan.feature.catalog.products.tab_error": "Produtos - separador Erro", "plan.feature.catalog.products.tab_processing": "Produtos - separador A processar", - "plan.feature.catalog.products.tab_unprocessed": "Produtos - separador Não processados", + "plan.feature.catalog.products.tab_unprocessed": "Produtos - separador Não processados", "plan.feature.catalog.products.process_categories": "Processar categorias", - "plan.feature.catalog.products.process_attributes": "Processar atributos / especificações", - "plan.feature.catalog.products.process_ai_titles": "Processar títulos com IA", - "plan.feature.catalog.products.process_ai_descriptions": "Processar descrições com IA", - "plan.feature.catalog.products.enrichment_review": "Painel de revisão de enriquecimento", + "plan.feature.catalog.products.process_attributes": "Processar atributos / especificações", + "plan.feature.catalog.products.process_ai_titles": "Processar títulos com IA", + "plan.feature.catalog.products.process_ai_descriptions": "Processar descrições com IA", + "plan.feature.catalog.products.enrichment_review": "Painel de revisão de enriquecimento", "plan.feature.catalog.products.export_selection": "Exportar produtos selecionados", - "plan.feature.catalog.products.upgrade_prompt": "Avisos de atualização de produtos", + "plan.feature.catalog.products.upgrade_prompt": "Avisos de atualização de produtos", "plan.feature.catalog.categories": "Categorias", - "plan.feature.catalog.categories.title_formula": "Fórmula de título de categoria", - "plan.feature.catalog.categories.description_formula": "Fórmula de descrição de categoria", + "plan.feature.catalog.categories.title_formula": "Fórmula de título de categoria", + "plan.feature.catalog.categories.description_formula": "Fórmula de descrição de categoria", "plan.feature.catalog.attributes": "Atributos", - "plan.feature.catalog.attributes.bulk_import": "Importação em massa de atributos", - "plan.feature.catalog.standard_fields": "Campos padrão", - "plan.feature.catalog.standard_fields.groups": "Grupos de campos padrão", - "plan.feature.catalog.structured_descriptions": "Campos de descrição estruturada", + "plan.feature.catalog.attributes.bulk_import": "Importação em massa de atributos", + "plan.feature.catalog.standard_fields": "Campos padrão", + "plan.feature.catalog.standard_fields.groups": "Grupos de campos padrão", + "plan.feature.catalog.structured_descriptions": "Campos de descrição estruturada", "plan.feature.catalog.vector_categories": "Categorias vetoriais", - "plan.feature.feeds.list": "Feeds de importação", + "plan.feature.feeds.list": "Feeds de importação", "plan.feature.feeds.add_url": "Adicionar URL do feed", "plan.feature.feeds.add_csv": "Adicionar feed por carregamento CSV", "plan.feature.feeds.sync": "Sincronizar feed", "plan.feature.feeds.mapping": "Mapeamento de feed", "plan.feature.feeds.mapping.select_item": "Mapeamento - selecionar elemento item", "plan.feature.feeds.mapping.map_fields": "Mapeamento - mapear campos", - "plan.feature.feeds.export_feeds": "Feeds de exportação", - "plan.feature.feeds.export_feeds.create": "Criar feed de exportação", - "plan.feature.feeds.export_feeds.generate": "Gerar feed de exportação", + "plan.feature.feeds.export_feeds": "Feeds de exportação", + "plan.feature.feeds.export_feeds.create": "Criar feed de exportação", + "plan.feature.feeds.export_feeds.generate": "Gerar feed de exportação", "plan.feature.feeds.uploads": "Carregamentos de ficheiros", "plan.feature.stores.hub": "Centro de lojas", - "plan.feature.stores.woocommerce": "Integração WooCommerce", - "plan.feature.stores.woocommerce.connection": "Ligação WooCommerce", - "plan.feature.stores.woocommerce.categories": "Sincronização de categorias WooCommerce", - "plan.feature.stores.woocommerce.attributes": "Sincronização de atributos WooCommerce", + "plan.feature.stores.woocommerce": "Integração WooCommerce", + "plan.feature.stores.woocommerce.connection": "Ligação WooCommerce", + "plan.feature.stores.woocommerce.categories": "Sincronização de categorias WooCommerce", + "plan.feature.stores.woocommerce.attributes": "Sincronização de atributos WooCommerce", "plan.feature.stores.woocommerce.orders": "Encomendas WooCommerce", - "plan.feature.stores.woocommerce.reviews": "Avaliações WooCommerce", - "plan.feature.stores.woocommerce.settings": "Definições WooCommerce", - "plan.feature.stores.shopify": "Integração Shopify", - "plan.feature.stores.shopify.connection": "Ligação Shopify", + "plan.feature.stores.woocommerce.reviews": "Avaliações WooCommerce", + "plan.feature.stores.woocommerce.settings": "Definições WooCommerce", + "plan.feature.stores.shopify": "Integração Shopify", + "plan.feature.stores.shopify.connection": "Ligação Shopify", "plan.feature.stores.shopify.orders": "Encomendas Shopify", - "plan.feature.stores.shopify.settings": "Definições Shopify", + "plan.feature.stores.shopify.settings": "Definições Shopify", "plan.feature.processing.monitor": "Monitor de processamento", "plan.feature.marketing.campaigns": "Campanhas", "plan.feature.marketing.campaigns.create": "Assistente de nova campanha", - "plan.feature.marketing.campaigns.generate_ai": "Geração de campanha com IA", + "plan.feature.marketing.campaigns.generate_ai": "Geração de campanha com IA", "plan.feature.marketing.campaigns.send": "Envio / blast de campanha", - "plan.feature.marketing.content_calendar": "Calendário de conteúdos", + "plan.feature.marketing.content_calendar": "Calendário de conteúdos", "plan.feature.marketing.brand_kit": "Kit de marca", "plan.feature.marketing.brand_ai_apply": "Aplicar marca IA nos prompts", - "plan.feature.marketing.seo": "Recomendações SEO", + "plan.feature.marketing.seo": "Recomendações SEO", "plan.feature.marketing.seo.template_fill": "Preenchimento de modelo SEO", "plan.feature.marketing.seo.ai_rewrite": "Reescrita SEO com IA", - "plan.feature.marketing.reviews": "Avaliações", - "plan.feature.integrations.ai": "Integrações de IA", - "plan.feature.integrations.ai.byok": "Use a sua própria chave de IA", + "plan.feature.marketing.reviews": "Avaliações", + "plan.feature.integrations.ai": "Integrações de IA", + "plan.feature.integrations.ai.byok": "Use a sua própria chave de IA", "plan.feature.integrations.email": "Envio de e-mail", "plan.feature.integrations.email.test": "Envio de e-mail de teste", "plan.feature.integrations.email.blast": "Envio em massa de e-mail", - "plan.feature.billing.overview": "Visão geral da faturação", + "plan.feature.billing.overview": "Visão geral da faturação", "plan.feature.billing.customer_portal": "Portal de cliente Stripe", - "plan.feature.billing.quick_upgrade": "Checkout de atualização rápida", + "plan.feature.billing.quick_upgrade": "Checkout de atualização rápida", "plan.feature.billing.plans_compare": "Comparar planos", "plan.feature.billing.checkout": "Checkout Stripe", - "plan.feature.settings.profile": "Definições de perfil", - "plan.feature.settings.company": "Definições da empresa", - "plan.feature.settings.alerts": "Preferências de alertas", + "plan.feature.settings.profile": "Definições de perfil", + "plan.feature.settings.company": "Definições da empresa", + "plan.feature.settings.alerts": "Preferências de alertas", "plan.feature.settings.api_keys": "Chaves API", - "plan.feature.settings.team": "Gestão da equipa", + "plan.feature.settings.team": "Gestão da equipa", "plan.feature.settings.team_invite": "Convidar colega", "plan.feature.support.center": "Centro de suporte", "plan.feature.support.ticket_create": "Novo ticket de suporte", "plan.feature.support.ticket_thread": "Thread do ticket de suporte", "plan.feature.capability.sku_cap": "Limite de SKU de produto", - "plan.feature.capability.ai_credits": "Carteira de créditos de IA", + "plan.feature.capability.ai_credits": "Carteira de créditos de IA", "plan.feature.capability.ai_processing": "Tarefas de processamento com IA", "plan.feature.capability.eprel": "Enriquecimento EPREL", - "plan.feature.capability.normalize_specs_fill": "Normalizar / especificações / preencher", - "plan.feature.capability.campaign_ai": "Geração de campanha com IA", + "plan.feature.capability.normalize_specs_fill": "Normalizar / especificações / preencher", + "plan.feature.capability.campaign_ai": "Geração de campanha com IA", "plan.feature.capability.email_live_send": "Entrega de e-mail em direto", "plan.feature.capability.brand_ai_apply": "Voz da marca nos prompts de IA", "plan.feature.capability.seo_ai_rewrite": "Reescrita SEO com IA", "plan.feature.capability.feed_source_limit": "Limite de fontes de feed (marketing)", - "plan.feature.capability.export_feed_limit": "Limite de feeds de exportação (marketing)", + "plan.feature.capability.export_feed_limit": "Limite de feeds de exportação (marketing)", "plan.feature.capability.storage_limit": "Limite de armazenamento (marketing)", - "plan.feature.capability.api_access": "Acesso à API REST (marketing)", - "plan.feature.capability.byok": "Use a sua própria chave de IA", - "billing.plan.free": "Grátis", + "plan.feature.capability.api_access": "Acesso à API REST (marketing)", + "plan.feature.capability.byok": "Use a sua própria chave de IA", + "billing.plan.free": "Grátis", "products.actions.selectAll": "Selecionar tudo", - "products.actions.upgradeSuffix": " · atualizar", - "products.actions.upgradeRequired": "{label} (atualização necessária)", - "products.actions.free": "grátis", - "products.actions.credits": "{credits} créditos", - "products.actions.autoCategorizeTitle": "A adicionar categorização automaticamente", - "products.actions.autoCategorizeBody": "{count} produto(s) precisam de categorização para o processamento de {types}", - "products.actions.aiLocked": "As opções de IA estão bloqueadas no Free. Atualize para processar títulos/descrições.", + "products.actions.upgradeSuffix": " · atualizar", + "products.actions.upgradeRequired": "{label} (atualização necessária)", + "products.actions.free": "grátis", + "products.actions.credits": "{credits} créditos", + "products.actions.autoCategorizeTitle": "A adicionar categorização automaticamente", + "products.actions.autoCategorizeBody": "{count} produto(s) precisam de categorização para o processamento de {types}", + "products.actions.aiLocked": "As opções de IA estão bloqueadas no Free. Atualize para processar títulos/descrições.", "products.actions.processSelected": "Processar selecionados", "products.actions.markProcessed": "Marcar como processado", - "products.actions.resetUnprocessed": "Repor para não processado", + "products.actions.resetUnprocessed": "Repor para não processado", "products.actions.export": "Exportar", "products.upload.dropHint": "Largue um CSV aqui ou clique para procurar", - "products.upload.supportsHint": "Suporta importações de produtos .csv (ean, name, category…)", - "products.export.chooseConfig": "Exportar {count} produto(s) selecionado(s). Escolha o feed de exportação que define formato e campos.", - "products.export.selectPlaceholder": "Selecione um feed de exportação…", + "products.upload.supportsHint": "Suporta importações de produtos .csv (ean, name, category…)", + "products.export.chooseConfig": "Exportar {count} produto(s) selecionado(s). Escolha o feed de exportação que define formato e campos.", + "products.export.selectPlaceholder": "Selecione um feed de exportação…", "fields.typeLabel": "Tipo", "fields.groupLabel": "Grupo", "fields.selectGroup": "Selecionar um grupo", @@ -4132,26 +4133,26 @@ export const pt: MessageDict = { "fields.enableRecommended": "Ativar recomendados", "feeds.activated": "Feed ativado.", "feeds.deactivated": "Feed desativado.", - "feeds.syncTimeout": "Sincronizar timed out waiting for the server. The job may still finish — open Sincronizar History to check status.", + "feeds.syncTimeout": "Sincronizar timed out waiting for the server. The job may still finish — open Sincronizar History to check status.", "feeds.createdMapHint": "Feed criado. Mapeie campos antes de sincronizar.", "feeds.createdPlain": "Feed criado.", "feeds.createdMapDesc": "Mapeie colunas de origem para campos de produto e depois sincronize.", - "feeds.lastLiveSync": "Última sync bem-sucedida do feed: {when}", - "feeds.noLiveSyncProducts": "Ainda sem sync bem-sucedida do feed. Catálogo atualizado pela última vez {when}.", - "feeds.noDataYet": "Ainda sem sync ou dados de catálogo.", + "feeds.lastLiveSync": "Última sync bem-sucedida do feed: {when}", + "feeds.noLiveSyncProducts": "Ainda sem sync bem-sucedida do feed. Catálogo atualizado pela última vez {when}.", + "feeds.noDataYet": "Ainda sem sync ou dados de catálogo.", "products.filters.incomplete": "Incompleto", "products.filters.complete44": "Completo (4/4)", "products.filters.missingName": "Nome em falta", - "products.filters.missingDescription": "Descrição em falta", + "products.filters.missingDescription": "Descrição em falta", "products.filters.missingAttributes": "Atributos em falta", "products.filters.missingCategory": "Categoria em falta", "products.filters.hasEprel": "Tem EPREL", "products.filters.noEprel": "Sem EPREL", - "products.filters.priceChanged": "Preço alterado", + "products.filters.priceChanged": "Preço alterado", "products.filters.stockChanged": "Stock alterado", - "products.filters.titleChanged": "Título alterado", + "products.filters.titleChanged": "Título alterado", "products.filters.newFromFeed": "Novo do feed", - "products.filters.otherFieldChange": "Outra alteração de campo", + "products.filters.otherFieldChange": "Outra alteração de campo", "products.filters.sortUpdatedNewest": "Atualizado (mais recente)", "products.filters.sortUpdatedOldest": "Atualizado (mais antigo)", "products.filters.sortNameAsc": "Nome (A-Z)", @@ -4159,51 +4160,51 @@ export const pt: MessageDict = { "products.filters.searchPlaceholder": "Pesquisar produtos...", "products.filters.searchCategories": "Pesquisar categorias...", "products.filters.selectFeed": "Selecionar feed", - "products.filters.loadingFeeds": "A carregar feeds…", + "products.filters.loadingFeeds": "A carregar feeds…", "products.table.loading": "A carregar produtos", "products.table.uncategorized": "Sem categoria", "products.table.assignCategory": "Atribuir categoria", "products.table.changeCategory": "Alterar categoria de {name}", - "products.table.selectCategory": "Selecionar categoria…", + "products.table.selectCategory": "Selecionar categoria…", "products.table.saveCategory": "Guardar categoria", - "products.table.cancelCategory": "Cancelar edição da categoria", + "products.table.cancelCategory": "Cancelar edição da categoria", "products.table.categoryRequired": "Escolha uma categoria", - "products.table.noCategoriesAvailable": "Ainda sem categorias — crie uma em Catálogo", - "products.table.qualityUnavailable": "Qualidade indisponível", + "products.table.noCategoriesAvailable": "Ainda sem categorias — crie uma em Catálogo", + "products.table.qualityUnavailable": "Qualidade indisponível", "products.table.full": "Cheio", "products.table.empty": "Vazio", "products.table.saveName": "Guardar nome", - "products.table.cancelRename": "Cancelar mudança de nome", + "products.table.cancelRename": "Cancelar mudança de nome", "products.table.noSyncYet": "Ainda sem sync", - "products.feedSync.feedAndWhen": "{feed} · {when}", + "products.feedSync.feedAndWhen": "{feed} · {when}", "products.feedSync.syncedWhen": "Sincronizado {when}", - "products.table.productOptions": "Opções de produto", + "products.table.productOptions": "Opções de produto", "products.edit.details": "Detalhes do produto", "products.edit.noEprel": "Sem id EPREL neste produto.", - "products.edit.specsPresent": "As especificações técnicas estão presentes neste produto.", + "products.edit.specsPresent": "As especificações técnicas estão presentes neste produto.", "products.edit.noEnrichedName": "Sem nome enriquecido", "products.edit.resetName": "Repor o nome enriquecido para o original", - "products.edit.cannotClearName": "O original está vazio — não é possível limpar o nome enriquecido via PATCH", - "products.edit.showPreview": "Mostrar pré-visualização", + "products.edit.cannotClearName": "O original está vazio — não é possível limpar o nome enriquecido via PATCH", + "products.edit.showPreview": "Mostrar pré-visualização", "products.edit.editHtml": "Editar HTML", - "products.edit.noEnrichedDescription": "Sem descrição enriquecida", - "products.edit.resetDescription": "Repor a descrição enriquecida para o original", - "products.edit.cannotClearDescription": "O original está vazio — não é possível limpar a descrição enriquecida via PATCH", + "products.edit.noEnrichedDescription": "Sem descrição enriquecida", + "products.edit.resetDescription": "Repor a descrição enriquecida para o original", + "products.edit.cannotClearDescription": "O original está vazio — não é possível limpar a descrição enriquecida via PATCH", "products.edit.unknownFeed": "Feed desconhecido", - "products.edit.noProcessedName": "Sem nome processado disponível", - "products.edit.feedNamed": "Feed · {name}", - "products.edit.noAiDescription": "Sem descrição de IA", + "products.edit.noProcessedName": "Sem nome processado disponível", + "products.edit.feedNamed": "Feed · {name}", + "products.edit.noAiDescription": "Sem descrição de IA", "products.edit.sourceLabel": "Etiqueta de origem", - "products.edit.coverageTitle": "Quantos de Nome, Descrição, Atributos e Categoria estão presentes (feed ou processados).", + "products.edit.coverageTitle": "Quantos de Nome, Descrição, Atributos e Categoria estão presentes (feed ou processados).", "products.edit.coverageReady": "{count}/4 prontos", - "products.edit.eprelPresentTitle": "O id European Product Registry for Energy Labelling (EPREL) está presente neste produto.", + "products.edit.eprelPresentTitle": "O id European Product Registry for Energy Labelling (EPREL) está presente neste produto.", "products.edit.noEprelBadge": "Sem EPREL", "products.edit.specsBadge": "Especs", "products.edit.reviewBannerTitle": "Reveja os campos enriquecidos antes de aceitar", - "products.edit.reviewBannerHelp": "Use o separador Revisão para comparar originais vs IA. Atalhos: A aceitar · R rejeitar · Alt+1/2 campo · ⌘/Ctrl+Enter aceitar tudo.", + "products.edit.reviewBannerHelp": "Use o separador Revisão para comparar originais vs IA. Atalhos: A aceitar · R rejeitar · Alt+1/2 campo · ⌘/Ctrl+Enter aceitar tudo.", "products.edit.tab.review": "Rever", "products.edit.tab.details": "Detalhes", - "products.edit.tab.content": "Conteúdo", + "products.edit.tab.content": "Conteúdo", "products.edit.tab.attributes": "Atributos", "products.edit.tab.feed": "Feed", "products.edit.changed": "Alterado", @@ -4212,13 +4213,13 @@ export const pt: MessageDict = { "products.edit.enriched": "Enriquecido", "products.edit.discardName": "Descartar nome", "products.edit.acceptName": "Aceitar nome", - "products.edit.discardDescription": "Descartar descrição", - "products.edit.acceptDescription": "Aceitar descrição", + "products.edit.discardDescription": "Descartar descrição", + "products.edit.acceptDescription": "Aceitar descrição", "products.edit.noCategory": "No Categoria", - "products.edit.whatsFilledIn": "O que está preenchido", - "products.edit.coverageLegend": "Cinzento = em falta · Laranja = do feed · Verde = processado", + "products.edit.whatsFilledIn": "O que está preenchido", + "products.edit.coverageLegend": "Cinzento = em falta · Laranja = do feed · Verde = processado", "products.edit.feedSource": "Origem do feed", - "products.edit.updatedRelative": "· atualizado {when}", + "products.edit.updatedRelative": "· atualizado {when}", "products.edit.viewAllFeedFields": "Ver all feed fields ({filled}/{total})", "products.edit.productIdentity": "Produto identity", "products.edit.aiProcessedName": "Nome processado com AI", @@ -4226,28 +4227,28 @@ export const pt: MessageDict = { "products.edit.productIdSku": "Produto ID / SKU", "products.edit.rowUpdated": "Linha do produto atualizada {when}", "products.edit.noRawUpdateTime": "No raw produto update time", - "products.edit.feedSyncLabel": "· sincronização do feed {when}", + "products.edit.feedSyncLabel": "· sincronização do feed {when}", "products.edit.neverRecorded": "nunca registado", - "products.edit.feedFilledCount": "{filled} preenchidos · {total} campos", + "products.edit.feedFilledCount": "{filled} preenchidos · {total} campos", "products.edit.noMappedFeedFields": "No mapped feed fields on this produto.", "products.edit.fieldCol": "Campo", "products.edit.valueFromFeed": "Valor from feed", - "products.edit.core": "Núcleo", - "products.edit.aiProcessedDescription": "AI-Processed Descrição", - "products.edit.originalDescription": "Descrição original", + "products.edit.core": "Núcleo", + "products.edit.aiProcessedDescription": "AI-Processed Descrição", + "products.edit.originalDescription": "Descrição original", "products.edit.noAttrsYet": "No atributo or specification data on this produto yet.", "products.edit.fromFeed": "Do feed", - "products.edit.feedAttrsHelp": "Valores analisados do feed (especificações HTML, garantia, dimensões, EPREL). As chaves são ligadas a attribute_key quando possível.", + "products.edit.feedAttrsHelp": "Valores analisados do feed (especificações HTML, garantia, dimensões, EPREL). As chaves são ligadas a attribute_key quando possível.", "products.edit.fieldsCount": "{count} campos", "products.edit.originalAttributes": "Atributos originais", "products.edit.aiAttributes": "Atributos IA / enriquecidos", - "products.edit.editableAttributes": "Atributos editáveis", - "products.edit.editableAttributesHelp": "As alterações guardam-se no mapa de atributos do produto. As linhas de feed e IA abaixo ficam como referência quando diferem.", + "products.edit.editableAttributes": "Atributos editáveis", + "products.edit.editableAttributesHelp": "As alterações guardam-se no mapa de atributos do produto. As linhas de feed e IA abaixo ficam como referência quando diferem.", "products.edit.addAttribute": "Adicionar atributo", "products.edit.attrKeyPlaceholder": "Chave", "products.edit.attrValuePlaceholder": "Valor", "products.edit.removeAttribute": "Remover {key}", - "products.edit.noEditableAttrs": "Ainda sem atributos editáveis. Adicione um par chave/valor.", + "products.edit.noEditableAttrs": "Ainda sem atributos editáveis. Adicione um par chave/valor.", "products.edit.reject": "Rejeitar", "products.edit.accept": "Aceitar", "taskIndicator.title": "Tarefas em segundo plano", @@ -4260,391 +4261,391 @@ export const pt: MessageDict = { "taskIndicator.progressCounts": "{done} de {total} produtos", "attributes.assignBulk": "Atribuir a categorias", "products.filters.search": "Pesquisar", - "products.filters.sortAria": "Ordenação: {label}", - "products.filters.sortLabel": "Ordenação: {label}", + "products.filters.sortAria": "Ordenação: {label}", + "products.filters.sortLabel": "Ordenação: {label}", "products.table.colIdName": "ID/Nome", "products.table.colCoverage": "Cobertura", - "products.table.coverageTitle": "Cobertura: N=Nome, D=Descrição, A=Atributos, C=Categoria. Cinzento=em falta, laranja=do feed, verde=processado. EPREL mostra o id do registo de etiqueta energética.", + "products.table.coverageTitle": "Cobertura: N=Nome, D=Descrição, A=Atributos, C=Categoria. Cinzento=em falta, laranja=do feed, verde=processado. EPREL mostra o id do registo de etiqueta energética.", "products.table.colFeed": "Feed", "products.table.colCategory": "Categoria", "products.table.colStatus": "Estado", - "products.table.colUpdated": "Última atualização", - "products.table.colActions": "Ações", - "products.table.loadingDots": "A carregar produtos…", - "products.table.noneFound": "Não foram encontrados produtos.", + "products.table.colUpdated": "Última atualização", + "products.table.colActions": "Ações", + "products.table.loadingDots": "A carregar produtos…", + "products.table.noneFound": "Não foram encontrados produtos.", "products.table.selectProduct": "Selecionar produto {name}", "products.table.rename": "Mudar nome de {name}", "products.table.productNameAria": "Nome do produto para {name}", "products.table.selectPage": "Selecionar {count} on this page", - "products.table.deselectPage": "Desselecionar {count} nesta página", + "products.table.deselectPage": "Desselecionar {count} nesta página", "categories.assign": "Atribuir", - "categories.titleFormulaSubtitle": "Configure como os títulos de produto devem ser gerados para {name}", + "categories.titleFormulaSubtitle": "Configure como os títulos de produto devem ser gerados para {name}", "categories.addText": "Adicionar texto", - "categories.aboutTitleFormulas": "Sobre as fórmulas de título", - "categories.aboutTitleFormulasHelp": "Os títulos são montados da esquerda para a direita a partir dos elementos abaixo.", - "categories.variablesReplacedHelp": "As variáveis são substituídas por dados do produto quando disponíveis. Valores em falta são ignorados.", - "categories.variableTypeHelp": "Campo dinâmico dos dados do produto (exemplo: marca).", - "categories.textTypeHelp": "Texto estático que aparece sempre como escrito.", - "categories.assignTitleCopyHelp": "Use Atribuir para copiar esta fórmula para outras categorias que devam partilhar o mesmo padrão de título.", - "categories.titleFormulaInvalid": "Esta página de fórmula de título precisa de uma categoria válida. Volte a categorias e abra novamente Editar fórmula de título.", - "categories.preview.title": "Pré-visualização do título", - "categories.preview.description": "Assim serão estruturados os títulos dos seus produtos", - "categories.preview.exampleTab": "Pré-visualização de exemplo", - "categories.preview.structureTab": "Estrutura da fórmula", + "categories.aboutTitleFormulas": "Sobre as fórmulas de título", + "categories.aboutTitleFormulasHelp": "Os títulos são montados da esquerda para a direita a partir dos elementos abaixo.", + "categories.variablesReplacedHelp": "As variáveis são substituídas por dados do produto quando disponíveis. Valores em falta são ignorados.", + "categories.variableTypeHelp": "Campo dinâmico dos dados do produto (exemplo: marca).", + "categories.textTypeHelp": "Texto estático que aparece sempre como escrito.", + "categories.assignTitleCopyHelp": "Use Atribuir para copiar esta fórmula para outras categorias que devam partilhar o mesmo padrão de título.", + "categories.titleFormulaInvalid": "Esta página de fórmula de título precisa de uma categoria válida. Volte a categorias e abra novamente Editar fórmula de título.", + "categories.preview.title": "Pré-visualização do título", + "categories.preview.description": "Assim serão estruturados os títulos dos seus produtos", + "categories.preview.exampleTab": "Pré-visualização de exemplo", + "categories.preview.structureTab": "Estrutura da fórmula", "categories.preview.noElements": "Ainda sem elementos", "categories.brandTips.title": "Dicas com base na marca", - "categories.brandTips.freePlan": "O kit de marca é editável no plano Free; a aplicação com IA desbloqueia-se nos planos pagos.", + "categories.brandTips.freePlan": "O kit de marca é editável no plano Free; a aplicação com IA desbloqueia-se nos planos pagos.", "categories.brandTips.editBrandKit": "Editar kit de marca", "categories.brandTips.emptyBefore": "Adicione voz ou termos preferidos em ", "categories.brandTips.emptyAfter": " para ver dicas aqui.", "categories.brandTips.brandKit": "Kit de marca", - "categories.brandTips.descGuidanceBefore": "Orientação do seu ", - "categories.brandTips.descGuidanceAfter": " para as secções de descrição.", - "categories.formulaElementsTitle": "Elementos da fórmula", + "categories.brandTips.descGuidanceBefore": "Orientação do seu ", + "categories.brandTips.descGuidanceAfter": " para as secções de descrição.", + "categories.formulaElementsTitle": "Elementos da fórmula", "categories.formulaElementsHelp": "Arraste e largue elementos para os reordenar", "categories.noElementsAdded": "Nenhum elemento adicionado", - "categories.addElementsHint": "Adicione variáveis ou texto a partir do painel à direita", + "categories.addElementsHint": "Adicione variáveis ou texto a partir do painel à direita", "categories.editTextElementAria": "Editar elemento de texto {value}", "categories.removeElementAria": "Remover elemento {type} {value}", "categories.tab.single": "Individual", "categories.tab.bulk": "Carregamento em massa", - "categories.uniqueIdLabel": "ID único", + "categories.uniqueIdLabel": "ID único", "categories.parentLabel": "Principal", "categories.noneRoot": "Nenhum (raiz)", - "categories.descriptionLabel": "Descrição", + "categories.descriptionLabel": "Descrição", "categories.csvUploadHelp": "Carregue um CSV com as colunas name, unique_id e, opcionalmente, parent_unique_id e description.", "categories.downloadTemplate": "Descarregar modelo", "categories.variableNameKey": "Nome (chave)", "categories.displayName": "Nome a apresentar", "categories.exampleValue": "Valor de exemplo", - "categories.variableExists": "Já existe uma variável com o nome \"{name}\".", - "categories.addVariable": "Adicionar variável", - "categories.updateVariable": "Atualizar variável", + "categories.variableExists": "Já existe uma variável com o nome \"{name}\".", + "categories.addVariable": "Adicionar variável", + "categories.updateVariable": "Atualizar variável", "categories.col.displayName": "Nome a apresentar", "categories.col.key": "Chave", - "categories.col.description": "Descrição", + "categories.col.description": "Descrição", "categories.col.example": "Exemplo", - "categories.noVariablesFound": "Nenhuma variável encontrada", - "categories.availableVariables": "Variáveis disponíveis", + "categories.noVariablesFound": "Nenhuma variável encontrada", + "categories.availableVariables": "Variáveis disponíveis", "categories.manage": "Gerir", - "categories.noVariablesMatch": "Nenhuma variável corresponde a “{query}”.", - "categories.noUnusedVariables": "Não restam variáveis não usadas. Adicione uma variável personalizada ou remova um elemento para libertar uma.", + "categories.noVariablesMatch": "Nenhuma variável corresponde a “{query}”.", + "categories.noUnusedVariables": "Não restam variáveis não usadas. Adicione uma variável personalizada ou remova um elemento para libertar uma.", "categories.exampleColon": "Exemplo: {value}", "categories.editVariableAria": "Editar {label}", "categories.deleteVariableAria": "Eliminar {label}", "categories.addVariableAria": "Adicionar {label}", "categories.textLabel": "Texto", - "categories.textAppearsAsWritten": "Este texto aparecerá exatamente como escrito nos seus títulos", + "categories.textAppearsAsWritten": "Este texto aparecerá exatamente como escrito nos seus títulos", "categories.addTextButton": "Adicionar texto", "categories.updateTextButton": "Atualizar texto", - "categories.structureDescriptionsFor": "Estruture as descrições de produto para {name}", - "categories.metaInformation": "Informação meta", - "categories.metaInformationHelp": "Instruções que a IA usa para as etiquetas de título SEO e meta description.", - "categories.metaTitleFormula": "Fórmula de meta título", - "categories.metaTitleHint": "Mostrada nos resultados de pesquisa e separadores do browser (cerca de 50–60 caracteres).", - "categories.metaDescriptionFormula": "Fórmula de meta descrição", - "categories.metaDescriptionHint": "Mostrada sob o título nos resultados de pesquisa (cerca de 120–155 caracteres).", - "categories.resetToDefault": "Repor predefinição", - "categories.descriptionSections": "Secções de descrição", - "categories.descriptionSectionsHelp": "Arraste secções para definir a ordem da descrição gerada.", - "categories.noSectionsYet": "Ainda sem secções", - "categories.addSectionsHint": "Adicione um cabeçalho, parágrafo ou lista para começar.", - "categories.aiInstructions": "Instruções de IA", - "categories.exportIdOptional": "ID de exportação (opcional)", - "categories.exportIdUnique": "O ID de exportação deve ser único", - "categories.addSection": "Adicionar secção", - "categories.aboutDescriptionFormulas": "Sobre as fórmulas de descrição", - "categories.aboutDescriptionFormulasHelp": "Estas instruções dizem à IA como escrever descrições para produtos nesta categoria.", - "categories.sectionTypesHeading": "Tipos de secção", - "categories.sectionTypeHeadings": "Cabeçalhos (H1–H4):", - "categories.sectionTypeHeadingsHelp": "Títulos e subtítulos", - "categories.sectionTypeParagraphs": "Parágrafos:", - "categories.sectionTypeParagraphsHelp": "Blocos de conteúdo principais", + "categories.structureDescriptionsFor": "Estruture as descrições de produto para {name}", + "categories.metaInformation": "Informação meta", + "categories.metaInformationHelp": "Instruções que a IA usa para as etiquetas de título SEO e meta description.", + "categories.metaTitleFormula": "Fórmula de meta título", + "categories.metaTitleHint": "Mostrada nos resultados de pesquisa e separadores do browser (cerca de 50–60 caracteres).", + "categories.metaDescriptionFormula": "Fórmula de meta descrição", + "categories.metaDescriptionHint": "Mostrada sob o título nos resultados de pesquisa (cerca de 120–155 caracteres).", + "categories.resetToDefault": "Repor predefinição", + "categories.descriptionSections": "Secções de descrição", + "categories.descriptionSectionsHelp": "Arraste secções para definir a ordem da descrição gerada.", + "categories.noSectionsYet": "Ainda sem secções", + "categories.addSectionsHint": "Adicione um cabeçalho, parágrafo ou lista para começar.", + "categories.aiInstructions": "Instruções de IA", + "categories.exportIdOptional": "ID de exportação (opcional)", + "categories.exportIdUnique": "O ID de exportação deve ser único", + "categories.addSection": "Adicionar secção", + "categories.aboutDescriptionFormulas": "Sobre as fórmulas de descrição", + "categories.aboutDescriptionFormulasHelp": "Estas instruções dizem à IA como escrever descrições para produtos nesta categoria.", + "categories.sectionTypesHeading": "Tipos de secção", + "categories.sectionTypeHeadings": "Cabeçalhos (H1–H4):", + "categories.sectionTypeHeadingsHelp": "Títulos e subtítulos", + "categories.sectionTypeParagraphs": "Parágrafos:", + "categories.sectionTypeParagraphsHelp": "Blocos de conteúdo principais", "categories.sectionTypeLists": "Listas com marcadores:", - "categories.sectionTypeListsHelp": "Funcionalidades e especificações", - "categories.aiInstructionsHeading": "Instruções de IA", - "categories.aiInstructionsBody": "Escreva um objetivo claro por secção (o que cobrir, tom, extensão). Pedidos vagos produzem textos vagos.", - "categories.exportIdsHeading": "IDs de exportação", - "categories.exportIdsBody": "IDs opcionais associam uma secção a feeds de exportação (por exemplo short_description).", + "categories.sectionTypeListsHelp": "Funcionalidades e especificações", + "categories.aiInstructionsHeading": "Instruções de IA", + "categories.aiInstructionsBody": "Escreva um objetivo claro por secção (o que cobrir, tom, extensão). Pedidos vagos produzem textos vagos.", + "categories.exportIdsHeading": "IDs de exportação", + "categories.exportIdsBody": "IDs opcionais associam uma secção a feeds de exportação (por exemplo short_description).", "categories.assignDescCopyHelp": "Use Atribuir para copiar este modelo para outras categorias que devam partilhar a mesma estrutura.", - "categories.descriptionFormulaInvalid": "Esta página de fórmula de descrição precisa de uma categoria válida. Volte a categorias e abra novamente Editar fórmula de descrição.", - "categories.sectionType.h1": "Cabeçalho 1", - "categories.sectionType.h2": "Cabeçalho 2", - "categories.sectionType.h3": "Cabeçalho 3", - "categories.sectionType.h4": "Cabeçalho 4", - "categories.sectionType.p": "Parágrafo", + "categories.descriptionFormulaInvalid": "Esta página de fórmula de descrição precisa de uma categoria válida. Volte a categorias e abra novamente Editar fórmula de descrição.", + "categories.sectionType.h1": "Cabeçalho 1", + "categories.sectionType.h2": "Cabeçalho 2", + "categories.sectionType.h3": "Cabeçalho 3", + "categories.sectionType.h4": "Cabeçalho 4", + "categories.sectionType.p": "Parágrafo", "categories.sectionType.ul": "Lista com marcadores", - "categories.aiGenerationPrompt": "Prompt de geração com IA", + "categories.aiGenerationPrompt": "Prompt de geração com IA", "categories.aiPromptOverrides": "Substitui o prompt de utilizador de melhoria de produto da empresa para {name}", "categories.promptTemplate": "Modelo de prompt", - "categories.promptTemplateHelp": "Use marcadores como {{name}} e {{description}}. Deixe vazio para usar o predefinido da empresa em Integrações → IA.", + "categories.promptTemplateHelp": "Use marcadores como {{name}} e {{description}}. Deixe vazio para usar o predefinido da empresa em Integrações → IA.", "categories.clear": "Limpar", "categories.promptLabel": "Prompt", "categories.charactersCount": "{count} caracteres", - "categories.activeOverride": "· substituição ativa para esta categoria", - "categories.usingCompanyDefault": "· a usar o predefinido da empresa / incorporado", - "categories.usingCompanyDefaultForLang": "· vazio para este idioma — aplica-se o predefinido da empresa / integrado", + "categories.activeOverride": "· substituição ativa para esta categoria", + "categories.usingCompanyDefault": "· a usar o predefinido da empresa / incorporado", + "categories.usingCompanyDefaultForLang": "· vazio para este idioma — aplica-se o predefinido da empresa / integrado", "categories.aiPromptSavedLang": "Prompt IA guardado para {lang}.", "categories.aiPromptClearedLang": "Prompt IA limpo para {lang} (aplica-se o predefinido da empresa).", - "contentLang.switcherLabel": "Idioma de conteúdo", + "contentLang.switcherLabel": "Idioma de conteúdo", "contentLang.primary": "principal", "contentLang.hasOverride": "personalizado", - "contentLang.addLanguage": "Adicionar idioma…", + "contentLang.addLanguage": "Adicionar idioma…", "contentLang.add": "Adicionar", "contentLang.removeLanguage": "Remover {lang}", - "contentLang.resultsHint": "Mude de idioma para rever títulos e descrições de IA de cada idioma de conteúdo.", - "contentLang.settingsTitle": "Idiomas de conteúdo", - "contentLang.settingsHelp": "O idioma principal é usado por predefinição. Idiomas extra têm os seus próprios prompts e resultados de IA (cada passagem consome créditos).", - "ai.prompts.languageHelp": "Edite os prompts da empresa por idioma de conteúdo. Um idioma vazio usa o valor predefinido integrado para esse idioma.", - "header.accountSettingsAria": "Definições da conta de {email}", + "contentLang.resultsHint": "Mude de idioma para rever títulos e descrições de IA de cada idioma de conteúdo.", + "contentLang.settingsTitle": "Idiomas de conteúdo", + "contentLang.settingsHelp": "O idioma principal é usado por predefinição. Idiomas extra têm os seus próprios prompts e resultados de IA (cada passagem consome créditos).", + "ai.prompts.languageHelp": "Edite os prompts da empresa por idioma de conteúdo. Um idioma vazio usa o valor predefinido integrado para esse idioma.", + "header.accountSettingsAria": "Definições da conta de {email}", "switcher.switchUserAria": "Mudar de utilizador: {label}", - "switcher.unavailable": "A mudança de utilizador não está disponível neste ambiente.", - "switcher.loadFailed": "Não foi possível carregar os utilizadores.", - "support.notifications.aria": "Notificações de suporte", - "support.notifications.ariaUnread": "Notificações de suporte, {count} por ler", + "switcher.unavailable": "A mudança de utilizador não está disponível neste ambiente.", + "switcher.loadFailed": "Não foi possível carregar os utilizadores.", + "support.notifications.aria": "Notificações de suporte", + "support.notifications.ariaUnread": "Notificações de suporte, {count} por ler", "time.never": "Nunca", - "time.invalid": "Data inválida", + "time.invalid": "Data inválida", "time.unknown": "Data desconhecida", "time.justNow": "agora mesmo", "time.neverUsed": "Nunca usado", "billing.plan.enterprise": "Empresarial", - "news.heading": "Atualizações da plataforma", + "news.heading": "Atualizações da plataforma", "news.subtitle": "Funcionalidades e melhorias mais recentes", "news.keyFeatures": "Funcionalidades principais:", "news.badge.new": "Novo", - "news.footer": "É tudo por agora — volte após a próxima versão.", + "news.footer": "É tudo por agora — volte após a próxima versão.", "news.category.enhancement": "Melhoria", "news.category.feature": "Funcionalidade", - "news.category.integration": "Integração", + "news.category.integration": "Integração", "news.category.newFeature": "Nova funcionalidade", - "news.category.billing": "Faturação", - "news.uxImprovements.description": "Usabilidade melhorada com controlos do tour, melhorias de API e melhor navegação.", + "news.category.billing": "Faturação", + "news.uxImprovements.description": "Usabilidade melhorada com controlos do tour, melhorias de API e melhor navegação.", "news.uxImprovements.f1": "Ignorar/ocultar o tour", "news.uxImprovements.f2": "Melhorias de fiabilidade da API", - "news.uxImprovements.f3": "Navegação de interface melhorada", - "news.uxImprovements.f4": "Maior eficiência do fluxo de trabalho", - "news.multiselect.title": "Suporte a atributos de seleção múltipla", - "news.multiselect.description": "Os produtos podem ter vários valores em atributos do tipo lista.", - "news.multiselect.f1": "Tipo de atributo de seleção múltipla", - "news.multiselect.f2": "Seleção múltipla na edição de produtos", - "news.multiselect.f3": "Vários valores num único atributo", - "news.multiselect.f4": "Extração melhorada para campos de seleção múltipla", - "news.multiselect.f5": "Melhor compatibilidade com feeds de exportação", + "news.uxImprovements.f3": "Navegação de interface melhorada", + "news.uxImprovements.f4": "Maior eficiência do fluxo de trabalho", + "news.multiselect.title": "Suporte a atributos de seleção múltipla", + "news.multiselect.description": "Os produtos podem ter vários valores em atributos do tipo lista.", + "news.multiselect.f1": "Tipo de atributo de seleção múltipla", + "news.multiselect.f2": "Seleção múltipla na edição de produtos", + "news.multiselect.f3": "Vários valores num único atributo", + "news.multiselect.f4": "Extração melhorada para campos de seleção múltipla", + "news.multiselect.f5": "Melhor compatibilidade com feeds de exportação", "news.csvEan.title": "Carregamento CSV de EAN", - "news.csvEan.description": "Carregue CSV com códigos EAN para processar centenas de produtos de uma vez.", + "news.csvEan.description": "Carregue CSV com códigos EAN para processar centenas de produtos de uma vez.", "news.csvEan.f1": "Carregamento CSV com arrastar e largar", - "news.csvEan.f2": "Validação de formato EAN (EAN-8, EAN-13, UPC-12, GTIN-14)", - "news.csvEan.f3": "Deteção automática de duplicados", + "news.csvEan.f2": "Validação de formato EAN (EAN-8, EAN-13, UPC-12, GTIN-14)", + "news.csvEan.f3": "Deteção automática de duplicados", "news.csvEan.f4": "Processamento em massa de produtos", - "news.csvEan.f5": "Estatísticas detalhadas de processamento", - "news.brick.title": "Suporte a atributos com código BRICK", - "news.brick.description": "Sistema de atributos com códigos BRICK para classificação e exportação padronizadas.", - "news.brick.f1": "Gestão de atributos com código BRICK", - "news.brick.f2": "Formatação automática de códigos nas exportações", - "news.brick.f3": "Integração de códigos BRICK em feeds XML", - "news.brick.f4": "Melhorias de compatibilidade dos feeds de exportação", - "news.apiV1.title": "Lançamento da API v1", - "news.apiV1.description": "Novos endpoints API v1 para categorias, atributos, feeds, produtos e exportações.", + "news.csvEan.f5": "Estatísticas detalhadas de processamento", + "news.brick.title": "Suporte a atributos com código BRICK", + "news.brick.description": "Sistema de atributos com códigos BRICK para classificação e exportação padronizadas.", + "news.brick.f1": "Gestão de atributos com código BRICK", + "news.brick.f2": "Formatação automática de códigos nas exportações", + "news.brick.f3": "Integração de códigos BRICK em feeds XML", + "news.brick.f4": "Melhorias de compatibilidade dos feeds de exportação", + "news.apiV1.title": "Lançamento da API v1", + "news.apiV1.description": "Novos endpoints API v1 para categorias, atributos, feeds, produtos e exportações.", "news.apiV1.f1": "Endpoints RESTful da API v1", - "news.apiV1.f2": "Gestão de categorias e atributos", - "news.apiV1.f3": "Criação e gestão de feeds", + "news.apiV1.f2": "Gestão de categorias e atributos", + "news.apiV1.f3": "Criação e gestão de feeds", "news.apiV1.f4": "Processamento de produtos via API", - "news.apiV1.f5": "Acesso programático a feeds de exportação", - "news.apiV1.f6": "Autenticação e autorização", - "news.feedFiltering.title": "Filtragem de feeds na página de produtos", - "news.feedFiltering.description": "Página de produtos com filtragem de feeds otimizada, estados de carregamento e melhor desempenho.", + "news.apiV1.f5": "Acesso programático a feeds de exportação", + "news.apiV1.f6": "Autenticação e autorização", + "news.feedFiltering.title": "Filtragem de feeds na página de produtos", + "news.feedFiltering.description": "Página de produtos com filtragem de feeds otimizada, estados de carregamento e melhor desempenho.", "news.feedFiltering.f1": "Filtragem de feeds melhorada", "news.feedFiltering.f2": "Estados de carregamento melhorados", "news.feedFiltering.f3": "Desempenho de consultas otimizado", - "news.feedFiltering.f4": "Melhor gestão da paginação", - "news.feedFiltering.f5": "Melhorias da funcionalidade de exportação", - "news.exportFeeds.title": "Sistema de feeds de exportação", - "news.exportFeeds.description": "Sistema completo de feeds de exportação XML/CSV com configurações personalizadas.", - "news.exportFeeds.f1": "Formatos de exportação XML e CSV", + "news.feedFiltering.f4": "Melhor gestão da paginação", + "news.feedFiltering.f5": "Melhorias da funcionalidade de exportação", + "news.exportFeeds.title": "Sistema de feeds de exportação", + "news.exportFeeds.description": "Sistema completo de feeds de exportação XML/CSV com configurações personalizadas.", + "news.exportFeeds.f1": "Formatos de exportação XML e CSV", "news.exportFeeds.f2": "Mapeamento personalizado de campos", - "news.exportFeeds.f3": "Pré-visualização da exportação", - "news.exportFeeds.f4": "Exportação de produtos baseada em trabalhos", - "news.exportFeeds.f5": "Integração de dados EPREL", - "news.exportFeeds.f6": "URL públicas de feeds de exportação", - "news.woocommerce.title": "Integração WooCommerce", + "news.exportFeeds.f3": "Pré-visualização da exportação", + "news.exportFeeds.f4": "Exportação de produtos baseada em trabalhos", + "news.exportFeeds.f5": "Integração de dados EPREL", + "news.exportFeeds.f6": "URL públicas de feeds de exportação", + "news.woocommerce.title": "Integração WooCommerce", "news.woocommerce.description": "Sincronize produtos, categorias e atributos com lojas WooCommerce.", - "news.woocommerce.f1": "Configuração de credenciais da loja", + "news.woocommerce.f1": "Configuração de credenciais da loja", "news.woocommerce.f2": "Mapeamento de categorias e atributos", - "news.woocommerce.f3": "Sincronização bidirecional de produtos", - "news.woocommerce.f4": "Opções de estratégia de correspondência", - "news.eprel.title": "Integração de rótulos energéticos EPREL", - "news.eprel.description": "Integração com o registo europeu de rotulagem energética para dados de eficiência.", - "news.eprel.f1": "Processamento automático de IDs EPREL", - "news.eprel.f2": "Obtenção de imagens do rótulo energético", - "news.eprel.f3": "Downloads de fichas energéticas do produto", - "news.eprel.f4": "Extração da classe energética", + "news.woocommerce.f3": "Sincronização bidirecional de produtos", + "news.woocommerce.f4": "Opções de estratégia de correspondência", + "news.eprel.title": "Integração de rótulos energéticos EPREL", + "news.eprel.description": "Integração com o registo europeu de rotulagem energética para dados de eficiência.", + "news.eprel.f1": "Processamento automático de IDs EPREL", + "news.eprel.f2": "Obtenção de imagens do rótulo energético", + "news.eprel.f3": "Downloads de fichas energéticas do produto", + "news.eprel.f4": "Extração da classe energética", "news.eprel.f5": "Suporte multilingue", - "news.aiCategorization.title": "Categorização de produtos melhorada", - "news.aiCategorization.description": "Sistema de categorização por IA com melhor precisão e suporte hierárquico.", - "news.aiCategorization.f1": "Navegação hierárquica de categorias", - "news.aiCategorization.f2": "Pontuação de confiança", + "news.aiCategorization.title": "Categorização de produtos melhorada", + "news.aiCategorization.description": "Sistema de categorização por IA com melhor precisão e suporte hierárquico.", + "news.aiCategorization.f1": "Navegação hierárquica de categorias", + "news.aiCategorization.f2": "Pontuação de confiança", "news.aiCategorization.f3": "Suporte multilingue", - "news.aiCategorization.f4": "Gestão automática de alternativas", - "news.standardFields.title": "Gestão de campos padrão", - "news.standardFields.description": "Faça a gestão de campos de produto padrão com grupos, validação e valores predefinidos.", - "news.standardFields.f1": "Organização por grupos de campos", + "news.aiCategorization.f4": "Gestão automática de alternativas", + "news.standardFields.title": "Gestão de campos padrão", + "news.standardFields.description": "Faça a gestão de campos de produto padrão com grupos, validação e valores predefinidos.", + "news.standardFields.f1": "Organização por grupos de campos", "news.standardFields.f2": "Campos de sistema e personalizados", - "news.standardFields.f3": "Regras de validação de campos", + "news.standardFields.f3": "Regras de validação de campos", "news.standardFields.f4": "Suporte a valores predefinidos", - "news.standardFields.f5": "Configuração automática de campos", - "news.billingSystem.title": "Faturação baseada em créditos", - "news.billingSystem.description": "Novo sistema de faturação por créditos com monitorização de utilização e opções de pagamento flexíveis.", - "news.billingSystem.f1": "Processamento baseado em créditos", - "news.billingSystem.f2": "Análise de utilização", - "news.billingSystem.f3": "Ciclos de faturação flexíveis", - "news.billingSystem.f4": "Gestão de métodos de pagamento", - "news.billingSystem.f5": "Geração de faturas", - "products.pageTitle": "Gestão de produtos", - "products.pageDescriptionStoresBefore": "Faça a gestão, processe e otimize o catálogo. Ligue uma loja ou importe CSV via", - "products.pageDescriptionBasic": "Faça a gestão, processe e otimize o catálogo. Importe via Feeds ou carregue um CSV.", - "products.keyboard.esc": "— feche o painel de edição ou os diálogos", - "products.keyboard.toggle": "— alternar esta dica", + "news.standardFields.f5": "Configuração automática de campos", + "news.billingSystem.title": "Faturação baseada em créditos", + "news.billingSystem.description": "Novo sistema de faturação por créditos com monitorização de utilização e opções de pagamento flexíveis.", + "news.billingSystem.f1": "Processamento baseado em créditos", + "news.billingSystem.f2": "Análise de utilização", + "news.billingSystem.f3": "Ciclos de faturação flexíveis", + "news.billingSystem.f4": "Gestão de métodos de pagamento", + "news.billingSystem.f5": "Geração de faturas", + "products.pageTitle": "Gestão de produtos", + "products.pageDescriptionStoresBefore": "Faça a gestão, processe e otimize o catálogo. Ligue uma loja ou importe CSV via", + "products.pageDescriptionBasic": "Faça a gestão, processe e otimize o catálogo. Importe via Feeds ou carregue um CSV.", + "products.keyboard.esc": "— feche o painel de edição ou os diálogos", + "products.keyboard.toggle": "— alternar esta dica", "products.keyboard.reviewPrefix": "No painel Needs Review:", "products.keyboard.acceptAll": "aceitar tudo", "products.keyboard.rejectShort": "rejeitar", - "products.keyboard.acceptFields": "aceitar nome / descrição", + "products.keyboard.acceptFields": "aceitar nome / descrição", "products.connectStore": "Ligar loja", - "products.updating": "A atualizar…", + "products.updating": "A atualizar…", "products.needLinkedRaw": "Os produtos selecionados precisam de um produto em bruto ligado para processar.", "products.selectToProcess": "Selecione pelo menos um produto para processar.", - "products.undoResetHint": "Anular devolve o produto a não processado via reposição.", + "products.undoResetHint": "Anular devolve o produto a não processado via reposição.", "products.field.accepted": "{label} aceite no produto.", - "products.field.acceptFailed": "Não foi possível aceitar {field}", + "products.field.acceptFailed": "Não foi possível aceitar {field}", "products.field.discarded": "Enriquecimento de {label} descartado.", - "products.field.discardFailed": "Não foi possível descartar {field}", - "products.upgradeRequired": "É necessário atualizar o plano", - "products.upgradeBody": "Esta funcionalidade precisa de um plano pago ou créditos de IA.", + "products.field.discardFailed": "Não foi possível descartar {field}", + "products.upgradeRequired": "É necessário atualizar o plano", + "products.upgradeBody": "Esta funcionalidade precisa de um plano pago ou créditos de IA.", "products.enrichment.rejectTitle": "Rejeitar enriquecimento?", "products.enrichment.rejectSelectedTitle": "Rejeitar produtos selecionados?", - "products.enrichment.resetTitle": "Repor para não processado?", - "products.selectedOnPage": "{count} selecionados nesta página", - "products.selectionPageOnly": "A mostrar {shown} de {total} — a seleção é só esta página", - "products.edit.coverageHint": "Quantos de Nome, Descrição, Atributos e Categoria estão presentes (feed ou processados).", + "products.enrichment.resetTitle": "Repor para não processado?", + "products.selectedOnPage": "{count} selecionados nesta página", + "products.selectionPageOnly": "A mostrar {shown} de {total} — a seleção é só esta página", + "products.edit.coverageHint": "Quantos de Nome, Descrição, Atributos e Categoria estão presentes (feed ou processados).", "products.edit.noEprelShort": "Sem EPREL", "products.edit.specs": "Especs", - "products.edit.reviewBannerBody": "Use o separador Revisão para comparar originais vs IA. Atalhos: A aceitar · R rejeitar · Alt+1/2 campo · ⌘/Ctrl+Enter aceitar tudo.", - "products.edit.whatsFilled": "O que está preenchido", - "products.edit.legend": "Cinzento = em falta · Laranja = do feed · Verde = processado", - "products.edit.updatedAgo": "· atualizado {relative}", + "products.edit.reviewBannerBody": "Use o separador Revisão para comparar originais vs IA. Atalhos: A aceitar · R rejeitar · Alt+1/2 campo · ⌘/Ctrl+Enter aceitar tudo.", + "products.edit.whatsFilled": "O que está preenchido", + "products.edit.legend": "Cinzento = em falta · Laranja = do feed · Verde = processado", + "products.edit.updatedAgo": "· atualizado {relative}", "products.edit.status": "Estado", "products.edit.noRawUpdate": "No raw produto update time", - "products.edit.feedSyncPart": "· sync de feed", - "products.edit.filledFields": "{filled} preenchidos · {total} campos", + "products.edit.feedSyncPart": "· sync de feed", + "products.edit.filledFields": "{filled} preenchidos · {total} campos", "products.edit.noMappedFields": "No mapped feed fields on this produto.", "products.edit.emptyBadge": "Vazio", - "products.edit.coreBadge": "Núcleo", - "products.edit.feedAttrsHint": "Valores analisados do feed (especificações HTML, garantia, dimensões, EPREL). As chaves são ligadas a attribute_key quando possível.", + "products.edit.coreBadge": "Núcleo", + "products.edit.feedAttrsHint": "Valores analisados do feed (especificações HTML, garantia, dimensões, EPREL). As chaves são ligadas a attribute_key quando possível.", "products.edit.originalAttrs": "Atributos originais", "products.edit.aiAttrs": "Atributos IA / enriquecidos", "mapping.confidence.exact": "Exato", "mapping.confidence.alias": "Alias", "mapping.confidence.fuzzy": "Aproximado", - "field.group.basic": "Informação básica", - "field.group.pricing": "Preços", - "field.group.media": "Multimédia", + "field.group.basic": "Informação básica", + "field.group.pricing": "Preços", + "field.group.media": "Multimédia", "field.group.taxonomy": "Taxonomia", - "field.group.inventory": "Inventário", + "field.group.inventory": "Inventário", "field.group.attributes": "Atributos", "field.group.shipping": "Envio", "field.group.compliance": "Conformidade", "field.group.other": "Outro", "common.yes": "Sim", - "common.no": "Não", - "status.running": "Em execução", - "flash.admin.analyticsLoadFailed": "Falha ao carregar as análises", - "flash.admin.diagnosticsLoadFailed": "Falha ao carregar os diagnósticos", - "flash.admin.diagnosticsUnavailable": "Os diagnósticos não estão disponíveis neste deployment. Contacte o administrador da plataforma.", - "flash.admin.diagnosticsUnreachable": "Não foi possível alcançar a API de diagnósticos. Verifique se a API está a correr e se PUBLIC_API_URL / o proxy Vite apontam para ela.", - "admin.charts.statusEmpty": "Ainda sem linhas nesta divisão.", - "admin.charts.seriesEmpty": "Ainda sem dados neste período.", + "common.no": "Não", + "status.running": "Em execução", + "flash.admin.analyticsLoadFailed": "Falha ao carregar as análises", + "flash.admin.diagnosticsLoadFailed": "Falha ao carregar os diagnósticos", + "flash.admin.diagnosticsUnavailable": "Os diagnósticos não estão disponíveis neste deployment. Contacte o administrador da plataforma.", + "flash.admin.diagnosticsUnreachable": "Não foi possível alcançar a API de diagnósticos. Verifique se a API está a correr e se PUBLIC_API_URL / o proxy Vite apontam para ela.", + "admin.charts.statusEmpty": "Ainda sem linhas nesta divisão.", + "admin.charts.seriesEmpty": "Ainda sem dados neste período.", "admin.charts.primaryDefault": "Principal", - "admin.charts.statusAria": "Distribuição por estado", - "admin.charts.seriesAria": "Gráfico de {label}", - "admin.analytics.lastNDaysAria": "Últimos {days} dias", - "admin.analytics.overview": "Visão geral", - "admin.analytics.overviewHint": "Totais da plataforma com contexto do período dos últimos {days} dias.", - "admin.analytics.tokensInPeriod": "{tokens} no período · de produtos processados", - "admin.analytics.creditsRemainingOf": "{remaining} restantes de {allocated} atribuídos", + "admin.charts.statusAria": "Distribuição por estado", + "admin.charts.seriesAria": "Gráfico de {label}", + "admin.analytics.lastNDaysAria": "Últimos {days} dias", + "admin.analytics.overview": "Visão geral", + "admin.analytics.overviewHint": "Totais da plataforma com contexto do período dos últimos {days} dias.", + "admin.analytics.tokensInPeriod": "{tokens} no período · de produtos processados", + "admin.analytics.creditsRemainingOf": "{remaining} restantes de {allocated} atribuídos", "admin.analytics.noJobsYet": "Ainda sem trabalhos", - "admin.analytics.feedsVolume": "{input} de entrada · {export} feeds de exportação", - "admin.analytics.usersCompaniesRaw": "{users} utilizadores · {companies} empresas · {raw} em bruto", - "admin.analytics.operations": "Operações", - "admin.analytics.operationsHint": "Sinais de fiabilidade, chaves e crescimento do período selecionado.", - "admin.analytics.failedCompleted": "{failed} falhados · {completed} concluídos", - "admin.analytics.runningOver2h": "Em execução > 2 h ·", - "admin.analytics.apiKeysTotal": "{total} no total (revogadas incluídas)", - "admin.analytics.signupsDetail": "utilizadores · {companies} empresas · {tickets} tickets abertos/pendentes", + "admin.analytics.feedsVolume": "{input} de entrada · {export} feeds de exportação", + "admin.analytics.usersCompaniesRaw": "{users} utilizadores · {companies} empresas · {raw} em bruto", + "admin.analytics.operations": "Operações", + "admin.analytics.operationsHint": "Sinais de fiabilidade, chaves e crescimento do período selecionado.", + "admin.analytics.failedCompleted": "{failed} falhados · {completed} concluídos", + "admin.analytics.runningOver2h": "Em execução > 2 h ·", + "admin.analytics.apiKeysTotal": "{total} no total (revogadas incluídas)", + "admin.analytics.signupsDetail": "utilizadores · {companies} empresas · {tickets} tickets abertos/pendentes", "admin.analytics.providerMix": "Mix de fornecedores", - "admin.analytics.providerMixHint": "Consumo de tokens conforme as credenciais de IA estão configuradas.", - "admin.analytics.productsJobs": "{products} produtos · {jobs} trabalhos", - "admin.analytics.trends": "Tendências", - "admin.analytics.trendsHint": "Séries diárias de tokens, fornecedores, trabalhos e registos.", - "admin.analytics.tokensByDayHint": "Tokens do processamento de produtos concluído (secundária = produtos nesse dia)", + "admin.analytics.providerMixHint": "Consumo de tokens conforme as credenciais de IA estão configuradas.", + "admin.analytics.productsJobs": "{products} produtos · {jobs} trabalhos", + "admin.analytics.trends": "Tendências", + "admin.analytics.trendsHint": "Séries diárias de tokens, fornecedores, trabalhos e registos.", + "admin.analytics.tokensByDayHint": "Tokens do processamento de produtos concluído (secundária = produtos nesse dia)", "admin.analytics.seriesTokens": "Fichas", "admin.analytics.seriesProducts": "Produtos", - "admin.analytics.emptyTokens": "Sem produtos processados com tokens neste período.", - "admin.analytics.tokensByProviderHint": "Divisão diária: interno / popular / personalizado (por tipo de fornecedor)", - "admin.analytics.emptyProviderTokens": "Ainda sem tokens etiquetados por fornecedor neste período.", - "admin.analytics.providerDayTip": "{date}: Interno {internal} · Popular {popular} · Personalizado {custom}", + "admin.analytics.emptyTokens": "Sem produtos processados com tokens neste período.", + "admin.analytics.tokensByProviderHint": "Divisão diária: interno / popular / personalizado (por tipo de fornecedor)", + "admin.analytics.emptyProviderTokens": "Ainda sem tokens etiquetados por fornecedor neste período.", + "admin.analytics.providerDayTip": "{date}: Interno {internal} · Popular {popular} · Personalizado {custom}", "admin.analytics.seriesCreated": "Criado", "admin.analytics.seriesFailed": "Falhado", - "admin.analytics.emptyJobsSeries": "Nenhum trabalho de processamento criado neste período.", + "admin.analytics.emptyJobsSeries": "Nenhum trabalho de processamento criado neste período.", "admin.analytics.seriesUsers": "Utilizadores", "admin.analytics.seriesCompanies": "Empresas", - "admin.analytics.emptySignups": "Sem registos de utilizadores ou empresas neste período.", + "admin.analytics.emptySignups": "Sem registos de utilizadores ou empresas neste período.", "admin.analytics.statusMix": "Mix de estados", - "admin.analytics.statusMixHint": "Filas históricas de trabalhos, sync de feeds e suporte.", + "admin.analytics.statusMixHint": "Filas históricas de trabalhos, sync de feeds e suporte.", "admin.analytics.jobStatus": "Estado dos trabalhos", "admin.analytics.feedSyncQueue": "Fila de sync de feeds", "admin.analytics.supportTickets": "Tickets de suporte", "admin.analytics.emptyJobStatus": "Ainda sem trabalhos de processamento.", "admin.analytics.emptyFeedSync": "Ainda sem trabalhos de sync de feeds.", "admin.analytics.emptyTickets": "Ainda sem tickets de suporte.", - "admin.analytics.usageDetail": "Detalhe de utilização", - "admin.analytics.usageDetailHint": "Modos de fornecedor, principais empresas e resumos de ciclo de faturação.", - "admin.analytics.companyUsage": "Utilização por empresa", + "admin.analytics.usageDetail": "Detalhe de utilização", + "admin.analytics.usageDetailHint": "Modos de fornecedor, principais empresas e resumos de ciclo de faturação.", + "admin.analytics.companyUsage": "Utilização por empresa", "admin.analytics.jobsCol": "Trabalhos", - "admin.analytics.billingCycles": "Faturação cycles", - "admin.analytics.billingCyclesHint": "Resumos históricos de ciclos de faturação passados (podem atrasar em relação à subscrição ativa)", - "admin.analytics.periodCol": "Período", - "admin.analytics.creditsCol": "Créditos", + "admin.analytics.billingCycles": "Faturação cycles", + "admin.analytics.billingCyclesHint": "Resumos históricos de ciclos de faturação passados (podem atrasar em relação à subscrição ativa)", + "admin.analytics.periodCol": "Período", + "admin.analytics.creditsCol": "Créditos", "admin.analytics.dataNotes": "Notas de dados", - "admin.diagnostics.endpointNotMounted": "Endpoint não montado", - "admin.diagnostics.noPayload": "Sem payload de diagnóstico", - "admin.diagnostics.unavailableShort": "Os diagnósticos não estão disponíveis neste deployment.", + "admin.diagnostics.endpointNotMounted": "Endpoint não montado", + "admin.diagnostics.noPayload": "Sem payload de diagnóstico", + "admin.diagnostics.unavailableShort": "Os diagnósticos não estão disponíveis neste deployment.", "admin.diagnostics.fixThenRefresh": "Corrija o erro acima e depois atualize.", - "admin.diagnostics.refreshOrConfirm": "Atualize ou confirme que a API está saudável.", + "admin.diagnostics.refreshOrConfirm": "Atualize ou confirme que a API está saudável.", "admin.diagnostics.systemStatus": "Estado do sistema", - "admin.diagnostics.snapshot": "Instantâneo {when}", + "admin.diagnostics.snapshot": "Instantâneo {when}", "admin.diagnostics.queueTotal": "{total} no total", - "admin.diagnostics.queueStuck": "processing_jobs · presos em execução (>2 h):", + "admin.diagnostics.queueStuck": "processing_jobs · presos em execução (>2 h):", "admin.diagnostics.driver": "Driver: {driver}", "admin.diagnostics.openStuck": "Abrir produtos presos", - "admin.diagnostics.configPresence": "Presença de configuração", - "admin.diagnostics.configHint": "Apenas booleanos · env {env} · RPM {rpm} · lote {batch} · retries {retries}", - "admin.diagnostics.cutoverTitle": "Prontidão de cutover", - "admin.diagnostics.cutoverHint": "Apenas flags de presença — dicas goose, idade do worker, planos em falta. Sem Stripe/SMTP ao vivo.", + "admin.diagnostics.configPresence": "Presença de configuração", + "admin.diagnostics.configHint": "Apenas booleanos · env {env} · RPM {rpm} · lote {batch} · retries {retries}", + "admin.diagnostics.cutoverTitle": "Prontidão de cutover", + "admin.diagnostics.cutoverHint": "Apenas flags de presença — dicas goose, idade do worker, planos em falta. Sem Stripe/SMTP ao vivo.", "admin.diagnostics.cutoverGoose": "Goose", - "admin.diagnostics.cutoverGooseVersion": "version_max {max} · esperado ≥ {min}", - "admin.diagnostics.cutoverGooseRequired": "Migrações obrigatórias", + "admin.diagnostics.cutoverGooseVersion": "version_max {max} · esperado ≥ {min}", + "admin.diagnostics.cutoverGooseRequired": "Migrações obrigatórias", "admin.diagnostics.cutoverWorker": "Worker", - "admin.diagnostics.cutoverWorkerAge": "visto há {age}s · obsoleto após {stale}s", - "admin.diagnostics.cutoverWorkerAgeUnknown": "idade indisponível · obsoleto após {stale}s", + "admin.diagnostics.cutoverWorkerAge": "visto há {age}s · obsoleto após {stale}s", + "admin.diagnostics.cutoverWorkerAgeUnknown": "idade indisponível · obsoleto após {stale}s", "admin.diagnostics.cutoverPlansMissing": "Empresas sem plano", - "admin.diagnostics.cutoverPlansUnavailable": "Contagem de planos indisponível", + "admin.diagnostics.cutoverPlansUnavailable": "Contagem de planos indisponível", "admin.diagnostics.cutoverApiKeysMissing": "Companies without API keys", "admin.diagnostics.cutoverApiKeysUnavailable": "API key inventory unavailable", - "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", + "admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).", "admin.diagnostics.cutoverApiKeysLink": "List companies needing reissue", "admin.diagnostics.cutoverApplied": "aplicada", "admin.diagnostics.cutoverPending": "pendente", "admin.diagnostics.etlInventoryTitle": "ETL gap inventory", - "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", + "admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.", "admin.diagnostics.etlInventoryFiles": "Files metadata-only", "admin.diagnostics.etlInventoryFilesDetail": "metadata-only / total file rows", "admin.diagnostics.etlInventoryJobs": "Jobs migrated tag", @@ -4654,248 +4655,248 @@ export const pt: MessageDict = { "admin.diagnostics.etlInventoryTasksDetail": "legacy task history present in Postgres", "admin.diagnostics.recentJobs": "Tarefas recentes", "admin.diagnostics.recentAiFailures": "Falhas recentes de IA de suporte", - "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", + "admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed", "admin.diagnostics.relatedTools": "Ferramentas ops relacionadas", "admin.diagnostics.toolStuckTitle": "Produtos bloqueados", - "admin.diagnostics.toolStuckDesc": "Limpar trabalhos em execução há mais de 2 horas.", + "admin.diagnostics.toolStuckDesc": "Limpar trabalhos em execução há mais de 2 horas.", "admin.diagnostics.toolOrphanTitle": "Orphan processed", - "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", - "admin.diagnostics.toolAnalyticsTitle": "Análises", - "admin.diagnostics.toolAnalyticsDesc": "Tendências e gráficos de utilização da plataforma.", + "admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.", + "admin.diagnostics.toolAnalyticsTitle": "Análises", + "admin.diagnostics.toolAnalyticsDesc": "Tendências e gráficos de utilização da plataforma.", "admin.diagnostics.toolBootstrapTitle": "Bootstrap", "admin.diagnostics.toolBootstrapDesc": "Confirmar acesso de admin da plataforma para esta conta.", - "admin.diagnostics.toolSettingsTitle": "Definições", + "admin.diagnostics.toolSettingsTitle": "Definições", "admin.diagnostics.toolSettingsDesc": "Mail, IA e modo de sistema da plataforma.", - "admin.diagnostics.config.maintenance_mode": "Modo de manutenção", - "admin.diagnostics.config.read_only_mode": "Modo só de leitura", - "admin.diagnostics.config.session_secure": "Cookie de sessão seguro", + "admin.diagnostics.config.maintenance_mode": "Modo de manutenção", + "admin.diagnostics.config.read_only_mode": "Modo só de leitura", + "admin.diagnostics.config.session_secure": "Cookie de sessão seguro", "admin.diagnostics.config.smtp_enabled": "SMTP ativado", "admin.diagnostics.config.email_dry_run": "Email dry-run", "admin.diagnostics.config.smtp_host_set": "Host SMTP definido", "admin.diagnostics.config.stripe_mock": "Stripe mock", "admin.diagnostics.config.eprel_enabled": "EPREL ativado", - "admin.diagnostics.config.upload_dir_configured": "Diretório de upload configurado", - "admin.diagnostics.config.trusted_proxies_configured": "Proxies de confiança definidos", + "admin.diagnostics.config.upload_dir_configured": "Diretório de upload configurado", + "admin.diagnostics.config.trusted_proxies_configured": "Proxies de confiança definidos", "admin.diagnostics.config.web_origin_set": "Origem web definida", - "admin.diagnostics.config.public_api_url_set": "URL pública da API definida", + "admin.diagnostics.config.public_api_url_set": "URL pública da API definida", "admin.diagnostics.config.token_signing_secret_set": "Segredo de assinatura de tokens definido", "admin.diagnostics.config.openai_key_set": "Chave OpenAI definida", "admin.diagnostics.config.pinecone_key_set": "Chave Pinecone definida", "admin.diagnostics.config.stripe_secret_set": "Segredo Stripe definido", "admin.diagnostics.config.stripe_webhook_secret_set": "Segredo de webhook Stripe definido", - "admin.diagnostics.config.stripe_mock_rejected_in_prod": "Mock Stripe rejeitado em produção", - "admin.diagnostics.config.credentials_encryption_key_set": "Chave de encriptação de credenciais definida", + "admin.diagnostics.config.stripe_mock_rejected_in_prod": "Mock Stripe rejeitado em produção", + "admin.diagnostics.config.credentials_encryption_key_set": "Chave de encriptação de credenciais definida", "categories.selectAll": "Selecionar tudo", "categories.selectedCount": "{count} selecionados", "categories.noMatchingCategories": "Nenhuma categoria correspondente", - "categories.assigningProgress": "A atribuir… {progress}%", + "categories.assigningProgress": "A atribuir… {progress}%", "categories.assignToCount": "Atribuir a {count}", - "categories.aiPromptSavedForCategory": "Um prompt de geração com IA está guardado para esta categoria.", - "categories.titleAndDescriptionFormulasSaved": "As fórmulas de título e descrição estão guardadas para esta categoria.", - "categories.titleFormulaSavedForCategory": "Uma fórmula de título está guardada para esta categoria.", - "categories.descriptionFormulaSavedForCategory": "Uma fórmula de descrição está guardada para esta categoria.", + "categories.aiPromptSavedForCategory": "Um prompt de geração com IA está guardado para esta categoria.", + "categories.titleAndDescriptionFormulasSaved": "As fórmulas de título e descrição estão guardadas para esta categoria.", + "categories.titleFormulaSavedForCategory": "Uma fórmula de título está guardada para esta categoria.", + "categories.descriptionFormulaSavedForCategory": "Uma fórmula de descrição está guardada para esta categoria.", "site.account": "Conta", "site.goToApp": "Ir para a app", - "site.logIn": "Iniciar sessão", - "site.getStarted": "Começar", + "site.logIn": "Iniciar sessão", + "site.getStarted": "Começar", "site.nav.primary": "Principal", - "site.nav.mobile": "Telemóvel", - "site.nav.home": "Início", - "site.nav.pricing": "Preços", + "site.nav.mobile": "Telemóvel", + "site.nav.home": "Início", + "site.nav.pricing": "Preços", "site.nav.apiDocs": "Docs da API", - "seo.home.title": "Descrybe — Converta feeds de fornecedores em fichas de produto prontas", - "seo.home.description": "Ligue feeds CSV ou XML de fornecedores, associe-os às suas categorias e atributos, gere títulos e descrições segundo as suas regras e exporte ou sincronize com o WooCommerce.", - "seo.pricing.title": "Preços — Free, Starter, Growth, Business | Descrybe", - "seo.pricing.description": "Comece gratuitamente com 100 produtos e mapeamento de feeds. Os planos pagos acrescentam títulos e descrições com IA, mais SKU, feeds de exportação e sync WooCommerce — a partir de 49 $/mês. Enterprise para catálogos ilimitados.", - "seo.privacy.title": "Política de privacidade | Descrybe", - "seo.privacy.description": "Como a Descrybe recolhe, utiliza e protege os dados de conta, catálogos de produtos e feeds de fornecedores quando utiliza a nossa plataforma de dados de produto.", - "seo.terms.title": "Termos de serviço | Descrybe", - "seo.terms.description": "Termos de utilização da Descrybe: importação de feeds, enriquecimento de catálogo, conteúdo assistido por IA, exportações e sincronização com WooCommerce para o seu negócio.", - "seo.features.title": "Funcionalidades — Feeds, enriquecimento e exportação | Descrybe", - "seo.features.description": "Descubra como a Descrybe importa feeds de fornecedores, mapeia campos para a sua taxonomia, enriquece dados de produto e envia catálogos através de feeds de exportação, WooCommerce ou API.", - "pricing.page.eyebrow": "Preços", - "pricing.page.title": "Planos simples para catálogos em crescimento", - "pricing.page.lead": "Comece grátis com mapeamento de feeds e limpeza básica. Faça upgrade quando precisar de títulos e descrições com IA, mais produtos, feeds de exportação ou sync WooCommerce — de Starter a Enterprise.", - "pricing.page.subscribedBefore": "Já é subscritor? Gerir utilização em", + "seo.home.title": "Descrybe — Converta feeds de fornecedores em fichas de produto prontas", + "seo.home.description": "Ligue feeds CSV ou XML de fornecedores, associe-os às suas categorias e atributos, gere títulos e descrições segundo as suas regras e exporte ou sincronize com o WooCommerce.", + "seo.pricing.title": "Preços — Free, Starter, Growth, Business | Descrybe", + "seo.pricing.description": "Comece gratuitamente com 100 produtos e mapeamento de feeds. Os planos pagos acrescentam títulos e descrições com IA, mais SKU, feeds de exportação e sync WooCommerce — a partir de 49 $/mês. Enterprise para catálogos ilimitados.", + "seo.privacy.title": "Política de privacidade | Descrybe", + "seo.privacy.description": "Como a Descrybe recolhe, utiliza e protege os dados de conta, catálogos de produtos e feeds de fornecedores quando utiliza a nossa plataforma de dados de produto.", + "seo.terms.title": "Termos de serviço | Descrybe", + "seo.terms.description": "Termos de utilização da Descrybe: importação de feeds, enriquecimento de catálogo, conteúdo assistido por IA, exportações e sincronização com WooCommerce para o seu negócio.", + "seo.features.title": "Funcionalidades — Feeds, enriquecimento e exportação | Descrybe", + "seo.features.description": "Descubra como a Descrybe importa feeds de fornecedores, mapeia campos para a sua taxonomia, enriquece dados de produto e envia catálogos através de feeds de exportação, WooCommerce ou API.", + "pricing.page.eyebrow": "Preços", + "pricing.page.title": "Planos simples para catálogos em crescimento", + "pricing.page.lead": "Comece grátis com mapeamento de feeds e limpeza básica. Faça upgrade quando precisar de títulos e descrições com IA, mais produtos, feeds de exportação ou sync WooCommerce — de Starter a Enterprise.", + "pricing.page.subscribedBefore": "Já é subscritor? Gerir utilização em", "pricing.page.subscribedMid": "ou comparar planos em", "pricing.page.plansLink": "Planos", "pricing.page.subscribedAfter": ".", - "legal.lastUpdated": "Última atualização: {date}", - "legal.backHome": "← Voltar ao início", + "legal.lastUpdated": "Última atualização: {date}", + "legal.backHome": "← Voltar ao início", "legal.emailLabel": "E-mail:", "legal.postalLabel": "Morada postal:", - "legal.privacy.title": "Política de privacidade", - "legal.privacy.intro.h": "Introdução", - "legal.privacy.intro.p1": "Na Descrybe (\"nós\", \"nosso\" ou \"nos\"), respeitamos a sua privacidade e comprometemo-nos a proteger as suas informações pessoais. Esta Política de privacidade explica como recolhemos, utilizamos, divulgamos e protegemos as suas informações quando utiliza a plataforma de dados de produto da Descrybe e os serviços relacionados (em conjunto, os \"Serviços\").", - "legal.privacy.intro.p2": "Ao aceder ou utilizar os nossos Serviços, aceita as práticas descritas nesta Política de privacidade. Se não concordar com as políticas e práticas aqui descritas, não utilize os nossos Serviços.", - "legal.privacy.collect.h": "Informações que recolhemos", - "legal.privacy.collect.lead": "Recolhemos vários tipos de informação de e sobre os utilizadores dos nossos Serviços, incluindo:", - "legal.privacy.collect.personal.h": "Informações pessoais", - "legal.privacy.collect.personal.p": "Quando se regista para obter uma conta, recolhemos informações que poderão ser utilizadas para o identificar, como o seu nome, endereço de correio eletrónico, número de telefone, nome da empresa e informações de faturação. Recolhemos estas informações diretamente junto de si quando as faculta.", + "legal.privacy.title": "Política de privacidade", + "legal.privacy.intro.h": "Introdução", + "legal.privacy.intro.p1": "Na Descrybe (\"nós\", \"nosso\" ou \"nos\"), respeitamos a sua privacidade e comprometemo-nos a proteger as suas informações pessoais. Esta Política de privacidade explica como recolhemos, utilizamos, divulgamos e protegemos as suas informações quando utiliza a plataforma de dados de produto da Descrybe e os serviços relacionados (em conjunto, os \"Serviços\").", + "legal.privacy.intro.p2": "Ao aceder ou utilizar os nossos Serviços, aceita as práticas descritas nesta Política de privacidade. Se não concordar com as políticas e práticas aqui descritas, não utilize os nossos Serviços.", + "legal.privacy.collect.h": "Informações que recolhemos", + "legal.privacy.collect.lead": "Recolhemos vários tipos de informação de e sobre os utilizadores dos nossos Serviços, incluindo:", + "legal.privacy.collect.personal.h": "Informações pessoais", + "legal.privacy.collect.personal.p": "Quando se regista para obter uma conta, recolhemos informações que poderão ser utilizadas para o identificar, como o seu nome, endereço de correio eletrónico, número de telefone, nome da empresa e informações de faturação. Recolhemos estas informações diretamente junto de si quando as faculta.", "legal.privacy.collect.userData.h": "Dados de utilizador", - "legal.privacy.collect.userData.p": "Para prestar os nossos Serviços, recolhemos e tratamos dados de produto, feeds de fornecedores, descrições de produto e outro conteúdo que carrega, introduz ou envia de outro modo para a nossa plataforma. Isto pode incluir atributos de produto, estruturas de taxonomia, modelos e outros dados necessários ao funcionamento dos nossos Serviços.", - "legal.privacy.collect.usage.h": "Informações de utilização", - "legal.privacy.collect.usage.p": "Recolhemos automaticamente certas informações sobre o seu dispositivo e sobre a forma como interage com os nossos Serviços, incluindo o endereço IP, o tipo de dispositivo, o tipo de navegador, o sistema operativo, as horas de acesso, as páginas visualizadas, as funcionalidades utilizadas e outra atividade do sistema. Utilizamos estas informações para melhorar os nossos Serviços e a experiência do utilizador.", + "legal.privacy.collect.userData.p": "Para prestar os nossos Serviços, recolhemos e tratamos dados de produto, feeds de fornecedores, descrições de produto e outro conteúdo que carrega, introduz ou envia de outro modo para a nossa plataforma. Isto pode incluir atributos de produto, estruturas de taxonomia, modelos e outros dados necessários ao funcionamento dos nossos Serviços.", + "legal.privacy.collect.usage.h": "Informações de utilização", + "legal.privacy.collect.usage.p": "Recolhemos automaticamente certas informações sobre o seu dispositivo e sobre a forma como interage com os nossos Serviços, incluindo o endereço IP, o tipo de dispositivo, o tipo de navegador, o sistema operativo, as horas de acesso, as páginas visualizadas, as funcionalidades utilizadas e outra atividade do sistema. Utilizamos estas informações para melhorar os nossos Serviços e a experiência do utilizador.", "legal.privacy.collect.cookies.h": "Cookies e tecnologias de rastreio", - "legal.privacy.collect.cookies.p": "Utilizamos cookies, web beacons e tecnologias de rastreio semelhantes para recolher informações sobre as suas atividades de navegação no nosso sítio web. Pode controlar os cookies através das definições do seu navegador e de outras ferramentas. No entanto, se bloquear determinados cookies, poderá não conseguir utilizar todas as funcionalidades dos nossos Serviços.", - "legal.privacy.use.h": "Como utilizamos as suas informações", - "legal.privacy.use.lead": "Utilizamos as informações que recolhemos para diversos fins, incluindo:", - "legal.privacy.use.li1": "Prestar, manter e melhorar os nossos Serviços", - "legal.privacy.use.li2": "Processar transações e enviar informações relacionadas, incluindo confirmações, faturas e notificações do serviço", - "legal.privacy.use.li3": "Desenvolver novos produtos, serviços, funcionalidades e características", - "legal.privacy.use.li4": "Personalizar a sua experiência e oferecer conteúdo e funcionalidades relevantes para os seus interesses", - "legal.privacy.use.li5": "Responder aos seus pedidos, comentários e perguntas", - "legal.privacy.use.li6": "Enviar-lhe avisos técnicos, atualizações, alertas de segurança e mensagens de suporte e administração", - "legal.privacy.use.li7": "Monitorizar e analisar tendências, utilização e atividades relacionadas com os nossos Serviços", - "legal.privacy.use.li8": "Detetar, investigar e prevenir transações fraudulentas e outras atividades ilegais", - "legal.privacy.use.li9": "Proteger os nossos direitos, propriedade e segurança, bem como os direitos, a propriedade e a segurança dos nossos utilizadores ou de outras pessoas", - "legal.privacy.use.li10": "Cumprir obrigações legais e fazer cumprir os nossos termos de serviço", - "legal.privacy.ai.h": "IA e aprendizagem automática", - "legal.privacy.ai.p1": "Os nossos Serviços utilizam tecnologias de inteligência artificial e aprendizagem automática para processar dados de produto, gerar conteúdo e oferecer outras funcionalidades automatizadas. Os dados que fornece aos nossos Serviços podem ser utilizados para treinar e melhorar os nossos modelos de IA. No entanto, aplicamos salvaguardas adequadas para proteger os seus dados e manter a sua confidencialidade.", - "legal.privacy.ai.p2": "Não utilizamos informações de identificação pessoal para treinar os nossos modelos gerais de IA sem o seu consentimento explícito. Os dados de produto utilizados para o treino de IA são anonimizados e agregados sempre que possível.", - "legal.privacy.share.h": "Como partilhamos as suas informações", - "legal.privacy.share.lead": "Podemos partilhar as suas informações nas seguintes circunstâncias:", - "legal.privacy.share.providers.h": "Prestadores de serviços", - "legal.privacy.share.providers.p": "Podemos partilhar as suas informações com fornecedores externos, prestadores de serviços, contratantes ou agentes que realizam serviços em nosso nome, como o processamento de pagamentos, a análise de dados, o envio de correio eletrónico, o alojamento, o apoio ao cliente e a assistência de marketing.", - "legal.privacy.share.transfers.h": "Transferências empresariais", - "legal.privacy.share.transfers.p": "Se participarmos numa fusão, aquisição, financiamento, reorganização, insolvência ou venda de ativos da empresa, as suas informações podem ser transferidas como parte dessa operação. Informá-lo-emos de qualquer alteração deste tipo na titularidade ou no controlo das suas informações pessoais.", + "legal.privacy.collect.cookies.p": "Utilizamos cookies, web beacons e tecnologias de rastreio semelhantes para recolher informações sobre as suas atividades de navegação no nosso sítio web. Pode controlar os cookies através das definições do seu navegador e de outras ferramentas. No entanto, se bloquear determinados cookies, poderá não conseguir utilizar todas as funcionalidades dos nossos Serviços.", + "legal.privacy.use.h": "Como utilizamos as suas informações", + "legal.privacy.use.lead": "Utilizamos as informações que recolhemos para diversos fins, incluindo:", + "legal.privacy.use.li1": "Prestar, manter e melhorar os nossos Serviços", + "legal.privacy.use.li2": "Processar transações e enviar informações relacionadas, incluindo confirmações, faturas e notificações do serviço", + "legal.privacy.use.li3": "Desenvolver novos produtos, serviços, funcionalidades e características", + "legal.privacy.use.li4": "Personalizar a sua experiência e oferecer conteúdo e funcionalidades relevantes para os seus interesses", + "legal.privacy.use.li5": "Responder aos seus pedidos, comentários e perguntas", + "legal.privacy.use.li6": "Enviar-lhe avisos técnicos, atualizações, alertas de segurança e mensagens de suporte e administração", + "legal.privacy.use.li7": "Monitorizar e analisar tendências, utilização e atividades relacionadas com os nossos Serviços", + "legal.privacy.use.li8": "Detetar, investigar e prevenir transações fraudulentas e outras atividades ilegais", + "legal.privacy.use.li9": "Proteger os nossos direitos, propriedade e segurança, bem como os direitos, a propriedade e a segurança dos nossos utilizadores ou de outras pessoas", + "legal.privacy.use.li10": "Cumprir obrigações legais e fazer cumprir os nossos termos de serviço", + "legal.privacy.ai.h": "IA e aprendizagem automática", + "legal.privacy.ai.p1": "Os nossos Serviços utilizam tecnologias de inteligência artificial e aprendizagem automática para processar dados de produto, gerar conteúdo e oferecer outras funcionalidades automatizadas. Os dados que fornece aos nossos Serviços podem ser utilizados para treinar e melhorar os nossos modelos de IA. No entanto, aplicamos salvaguardas adequadas para proteger os seus dados e manter a sua confidencialidade.", + "legal.privacy.ai.p2": "Não utilizamos informações de identificação pessoal para treinar os nossos modelos gerais de IA sem o seu consentimento explícito. Os dados de produto utilizados para o treino de IA são anonimizados e agregados sempre que possível.", + "legal.privacy.share.h": "Como partilhamos as suas informações", + "legal.privacy.share.lead": "Podemos partilhar as suas informações nas seguintes circunstâncias:", + "legal.privacy.share.providers.h": "Prestadores de serviços", + "legal.privacy.share.providers.p": "Podemos partilhar as suas informações com fornecedores externos, prestadores de serviços, contratantes ou agentes que realizam serviços em nosso nome, como o processamento de pagamentos, a análise de dados, o envio de correio eletrónico, o alojamento, o apoio ao cliente e a assistência de marketing.", + "legal.privacy.share.transfers.h": "Transferências empresariais", + "legal.privacy.share.transfers.p": "Se participarmos numa fusão, aquisição, financiamento, reorganização, insolvência ou venda de ativos da empresa, as suas informações podem ser transferidas como parte dessa operação. Informá-lo-emos de qualquer alteração deste tipo na titularidade ou no controlo das suas informações pessoais.", "legal.privacy.share.legal.h": "Requisitos legais", - "legal.privacy.share.legal.p": "Podemos divulgar as suas informações se a lei o exigir ou em resposta a pedidos válidos de autoridades públicas (p. ex., um tribunal ou um organismo governamental). Também podemos divulgar as suas informações para fazer cumprir os nossos termos de serviço, proteger os nossos direitos, privacidade, segurança ou propriedade, e/ou os das nossas afiliadas, utilizadores ou outras pessoas.", + "legal.privacy.share.legal.p": "Podemos divulgar as suas informações se a lei o exigir ou em resposta a pedidos válidos de autoridades públicas (p. ex., um tribunal ou um organismo governamental). Também podemos divulgar as suas informações para fazer cumprir os nossos termos de serviço, proteger os nossos direitos, privacidade, segurança ou propriedade, e/ou os das nossas afiliadas, utilizadores ou outras pessoas.", "legal.privacy.share.consent.h": "Com o seu consentimento", - "legal.privacy.share.consent.p": "Podemos partilhar as suas informações com terceiros quando nos tiver dado o seu consentimento para tal.", - "legal.privacy.security.h": "Segurança dos dados", - "legal.privacy.security.p1": "Implementámos medidas técnicas e organizativas adequadas concebidas para proteger as suas informações pessoais contra a perda acidental e contra o acesso, utilização, alteração e divulgação não autorizados. Toda a informação que nos faculta é armazenada em servidores seguros atrás de firewalls.", - "legal.privacy.security.p2": "A segurança das suas informações também depende de si. Quando lhe tivermos facultado (ou quando tiver escolhido) uma palavra-passe para aceder a determinadas partes dos nossos Serviços, é responsável por manter essa palavra-passe em confidencialidade. Pedimos-lhe que não partilhe a sua palavra-passe com ninguém.", - "legal.privacy.security.p3": "Infelizmente, a transmissão de informações através da Internet não é completamente segura. Embora façamos tudo o que está ao nosso alcance para proteger as suas informações pessoais, não podemos garantir a segurança das informações pessoais transmitidas aos nossos Serviços. Qualquer transmissão de informações pessoais é efetuada por sua conta e risco.", - "legal.privacy.rights.h": "Os seus direitos e opções", - "legal.privacy.rights.lead": "Esforçamo-nos por lhe oferecer opções relativamente às informações pessoais que nos faculta. Consoante a sua localização, pode ter determinados direitos sobre as suas informações pessoais, incluindo:", - "legal.privacy.rights.li1": "Aceder e atualizar as suas informações pessoais", - "legal.privacy.rights.li2": "Solicitar a eliminação das suas informações pessoais", - "legal.privacy.rights.li3": "Opor-se ou restringir o tratamento das suas informações pessoais", + "legal.privacy.share.consent.p": "Podemos partilhar as suas informações com terceiros quando nos tiver dado o seu consentimento para tal.", + "legal.privacy.security.h": "Segurança dos dados", + "legal.privacy.security.p1": "Implementámos medidas técnicas e organizativas adequadas concebidas para proteger as suas informações pessoais contra a perda acidental e contra o acesso, utilização, alteração e divulgação não autorizados. Toda a informação que nos faculta é armazenada em servidores seguros atrás de firewalls.", + "legal.privacy.security.p2": "A segurança das suas informações também depende de si. Quando lhe tivermos facultado (ou quando tiver escolhido) uma palavra-passe para aceder a determinadas partes dos nossos Serviços, é responsável por manter essa palavra-passe em confidencialidade. Pedimos-lhe que não partilhe a sua palavra-passe com ninguém.", + "legal.privacy.security.p3": "Infelizmente, a transmissão de informações através da Internet não é completamente segura. Embora façamos tudo o que está ao nosso alcance para proteger as suas informações pessoais, não podemos garantir a segurança das informações pessoais transmitidas aos nossos Serviços. Qualquer transmissão de informações pessoais é efetuada por sua conta e risco.", + "legal.privacy.rights.h": "Os seus direitos e opções", + "legal.privacy.rights.lead": "Esforçamo-nos por lhe oferecer opções relativamente às informações pessoais que nos faculta. Consoante a sua localização, pode ter determinados direitos sobre as suas informações pessoais, incluindo:", + "legal.privacy.rights.li1": "Aceder e atualizar as suas informações pessoais", + "legal.privacy.rights.li2": "Solicitar a eliminação das suas informações pessoais", + "legal.privacy.rights.li3": "Opor-se ou restringir o tratamento das suas informações pessoais", "legal.privacy.rights.li4": "Portabilidade dos dados", - "legal.privacy.rights.li5": "Retirar o consentimento (quando aplicável)", - "legal.privacy.rights.footer": "Para exercer os seus direitos, contacte-nos utilizando as informações de contacto que figuram no final desta Política de privacidade. Tenha em atenção que alguns destes direitos podem estar limitados ou não ser aplicáveis consoante a sua localização e as circunstâncias concretas.", - "legal.privacy.retention.h": "Conservação de dados", - "legal.privacy.retention.p1": "Conservaremos as suas informações pessoais durante o tempo necessário para cumprir os fins descritos nesta Política de privacidade, salvo se a lei exigir ou permitir um prazo de conservação mais longo. Ao determinar durante quanto tempo conservar as suas informações, consideramos a quantidade, a natureza e a sensibilidade das informações, o risco potencial de dano por utilização ou divulgação não autorizadas, os fins do tratamento e os requisitos legais aplicáveis.", - "legal.privacy.retention.p2": "Podemos conservar certas informações após o encerramento da sua conta, entre outros fins para cumprir as nossas obrigações legais, resolver litígios e fazer cumprir os nossos acordos.", - "legal.privacy.intl.h": "Transferências internacionais de dados", - "legal.privacy.intl.p1": "As suas informações pessoais podem ser transferidas e tratadas em países diferentes do país em que reside. Esses países podem ter leis de proteção de dados diferentes das do seu país.", - "legal.privacy.intl.p2": "Se transferirmos as suas informações pessoais para países fora do Espaço Económico Europeu ou de outras regiões com leis abrangentes de proteção de dados, asseguraremos que existem salvaguardas adequadas para proteger as suas informações pessoais e que a transferência cumpre a regulamentação aplicável em matéria de proteção de dados.", + "legal.privacy.rights.li5": "Retirar o consentimento (quando aplicável)", + "legal.privacy.rights.footer": "Para exercer os seus direitos, contacte-nos utilizando as informações de contacto que figuram no final desta Política de privacidade. Tenha em atenção que alguns destes direitos podem estar limitados ou não ser aplicáveis consoante a sua localização e as circunstâncias concretas.", + "legal.privacy.retention.h": "Conservação de dados", + "legal.privacy.retention.p1": "Conservaremos as suas informações pessoais durante o tempo necessário para cumprir os fins descritos nesta Política de privacidade, salvo se a lei exigir ou permitir um prazo de conservação mais longo. Ao determinar durante quanto tempo conservar as suas informações, consideramos a quantidade, a natureza e a sensibilidade das informações, o risco potencial de dano por utilização ou divulgação não autorizadas, os fins do tratamento e os requisitos legais aplicáveis.", + "legal.privacy.retention.p2": "Podemos conservar certas informações após o encerramento da sua conta, entre outros fins para cumprir as nossas obrigações legais, resolver litígios e fazer cumprir os nossos acordos.", + "legal.privacy.intl.h": "Transferências internacionais de dados", + "legal.privacy.intl.p1": "As suas informações pessoais podem ser transferidas e tratadas em países diferentes do país em que reside. Esses países podem ter leis de proteção de dados diferentes das do seu país.", + "legal.privacy.intl.p2": "Se transferirmos as suas informações pessoais para países fora do Espaço Económico Europeu ou de outras regiões com leis abrangentes de proteção de dados, asseguraremos que existem salvaguardas adequadas para proteger as suas informações pessoais e que a transferência cumpre a regulamentação aplicável em matéria de proteção de dados.", "legal.privacy.children.h": "Privacidade dos menores", - "legal.privacy.children.p": "Os nossos Serviços não se destinam a menores de 16 anos, e não recolhemos conscientemente informações pessoais de menores de 16 anos. Se descobrirmos que recolhemos ou recebemos informações pessoais de um menor de 16 anos sem verificação do consentimento parental, eliminaremos essas informações. Se acredita que poderemos ter informações de ou sobre um menor de 16 anos, contacte-nos.", - "legal.privacy.changes.h": "Alterações à nossa Política de privacidade", - "legal.privacy.changes.p1": "Podemos atualizar a nossa Política de privacidade periodicamente. Se efetuarmos alterações substanciais na forma como tratamos as informações pessoais dos utilizadores, notificá-lo-emos por correio eletrónico para o endereço indicado na sua conta e/ou através de um aviso no nosso sítio web.", - "legal.privacy.changes.p2": "A data da última revisão da Política de privacidade é indicada na parte superior da página. É responsável por assegurar que dispomos de um endereço de correio eletrónico atualizado, ativo e suscetível de entrega, e por visitar periodicamente o nosso sítio web e esta Política de privacidade para verificar se existem alterações.", + "legal.privacy.children.p": "Os nossos Serviços não se destinam a menores de 16 anos, e não recolhemos conscientemente informações pessoais de menores de 16 anos. Se descobrirmos que recolhemos ou recebemos informações pessoais de um menor de 16 anos sem verificação do consentimento parental, eliminaremos essas informações. Se acredita que poderemos ter informações de ou sobre um menor de 16 anos, contacte-nos.", + "legal.privacy.changes.h": "Alterações à nossa Política de privacidade", + "legal.privacy.changes.p1": "Podemos atualizar a nossa Política de privacidade periodicamente. Se efetuarmos alterações substanciais na forma como tratamos as informações pessoais dos utilizadores, notificá-lo-emos por correio eletrónico para o endereço indicado na sua conta e/ou através de um aviso no nosso sítio web.", + "legal.privacy.changes.p2": "A data da última revisão da Política de privacidade é indicada na parte superior da página. É responsável por assegurar que dispomos de um endereço de correio eletrónico atualizado, ativo e suscetível de entrega, e por visitar periodicamente o nosso sítio web e esta Política de privacidade para verificar se existem alterações.", "legal.privacy.contact.h": "Contacto", - "legal.privacy.contact.lead": "Se tiver perguntas ou preocupações sobre a nossa Política de privacidade ou as nossas práticas de dados, contacte-nos em:", - "legal.terms.title": "Termos de serviço", - "legal.terms.s1.h": "1. Aceitação dos termos", - "legal.terms.s1.p": "Ao aceder ou utilizar a plataforma de dados de produto da Descrybe e os serviços relacionados (em conjunto, os \"Serviços\"), aceita ficar vinculado a estes Termos de serviço e a todas as leis e regulamentações aplicáveis. Se não concordar com algum destes termos, está proibido de utilizar ou aceder aos Serviços.", - "legal.terms.s2.h": "2. Licença de utilização", - "legal.terms.s2.p1": "Sob reserva do cumprimento destes Termos de serviço, a Descrybe concede-lhe uma licença limitada, não exclusiva, intransmissível e revogável para aceder e utilizar os Serviços para fins empresariais.", - "legal.terms.s2.lead": "Esta licença não inclui:", - "legal.terms.s2.li1": "Modificar ou copiar os Serviços nem qualquer conteúdo dos mesmos", - "legal.terms.s2.li2": "Utilizar os Serviços para qualquer fim comercial distinto da utilização empresarial autorizada", - "legal.terms.s2.li3": "Tentar descompilar ou realizar engenharia inversa de qualquer software contido nos Serviços", + "legal.privacy.contact.lead": "Se tiver perguntas ou preocupações sobre a nossa Política de privacidade ou as nossas práticas de dados, contacte-nos em:", + "legal.terms.title": "Termos de serviço", + "legal.terms.s1.h": "1. Aceitação dos termos", + "legal.terms.s1.p": "Ao aceder ou utilizar a plataforma de dados de produto da Descrybe e os serviços relacionados (em conjunto, os \"Serviços\"), aceita ficar vinculado a estes Termos de serviço e a todas as leis e regulamentações aplicáveis. Se não concordar com algum destes termos, está proibido de utilizar ou aceder aos Serviços.", + "legal.terms.s2.h": "2. Licença de utilização", + "legal.terms.s2.p1": "Sob reserva do cumprimento destes Termos de serviço, a Descrybe concede-lhe uma licença limitada, não exclusiva, intransmissível e revogável para aceder e utilizar os Serviços para fins empresariais.", + "legal.terms.s2.lead": "Esta licença não inclui:", + "legal.terms.s2.li1": "Modificar ou copiar os Serviços nem qualquer conteúdo dos mesmos", + "legal.terms.s2.li2": "Utilizar os Serviços para qualquer fim comercial distinto da utilização empresarial autorizada", + "legal.terms.s2.li3": "Tentar descompilar ou realizar engenharia inversa de qualquer software contido nos Serviços", "legal.terms.s2.li4": "Eliminar qualquer aviso de direitos de autor ou de propriedade dos materiais", "legal.terms.s2.li5": "Transferir os materiais para outra pessoa ou \"espelhar\" os materiais em qualquer outro servidor", - "legal.terms.s2.p2": "Esta licença extinguir-se-á automaticamente se incumprir qualquer uma destas restrições e poderá ser terminada pela Descrybe a qualquer momento.", - "legal.terms.s3.h": "3. Subscrição e pagamento", - "legal.terms.s3.p1": "O acesso aos Serviços pode exigir uma subscrição paga. Os termos de pagamento serão especificados durante o processo de subscrição. Todos os pagamentos são não reembolsáveis salvo se a Descrybe o especificar por escrito.", - "legal.terms.s3.p2": "A Descrybe reserva-se o direito de modificar as tarifas de subscrição com um pré-aviso razoável. A utilização continuada dos Serviços após uma alteração de tarifa constitui a aceitação das novas tarifas.", - "legal.terms.s4.h": "4. Conteúdo do utilizador", - "legal.terms.s4.p1": "Conserva todos os direitos sobre qualquer conteúdo que envie, publique ou apresente em ou através dos Serviços (\"Conteúdo do utilizador\"). Ao fornecer Conteúdo do utilizador à Descrybe, concede à Descrybe uma licença mundial, não exclusiva e isenta de royalties para utilizar, reproduzir, modificar, adaptar, publicar, traduzir e distribuir esse conteúdo em relação à prestação dos Serviços.", + "legal.terms.s2.p2": "Esta licença extinguir-se-á automaticamente se incumprir qualquer uma destas restrições e poderá ser terminada pela Descrybe a qualquer momento.", + "legal.terms.s3.h": "3. Subscrição e pagamento", + "legal.terms.s3.p1": "O acesso aos Serviços pode exigir uma subscrição paga. Os termos de pagamento serão especificados durante o processo de subscrição. Todos os pagamentos são não reembolsáveis salvo se a Descrybe o especificar por escrito.", + "legal.terms.s3.p2": "A Descrybe reserva-se o direito de modificar as tarifas de subscrição com um pré-aviso razoável. A utilização continuada dos Serviços após uma alteração de tarifa constitui a aceitação das novas tarifas.", + "legal.terms.s4.h": "4. Conteúdo do utilizador", + "legal.terms.s4.p1": "Conserva todos os direitos sobre qualquer conteúdo que envie, publique ou apresente em ou através dos Serviços (\"Conteúdo do utilizador\"). Ao fornecer Conteúdo do utilizador à Descrybe, concede à Descrybe uma licença mundial, não exclusiva e isenta de royalties para utilizar, reproduzir, modificar, adaptar, publicar, traduzir e distribuir esse conteúdo em relação à prestação dos Serviços.", "legal.terms.s4.lead": "Declara e garante que:", - "legal.terms.s4.li1": "Possui ou controla todos os direitos sobre o Conteúdo do utilizador que fornece", - "legal.terms.s4.li2": "O Conteúdo do utilizador não viola estes Termos de serviço", - "legal.terms.s4.li3": "O Conteúdo do utilizador não causará dano a nenhuma pessoa ou entidade", - "legal.terms.s5.h": "5. Inteligência artificial", - "legal.terms.s5.p1": "Os Serviços utilizam tecnologias de inteligência artificial e aprendizagem automática. Reconhece que o conteúdo gerado por IA pode não ser perfeito e aceita rever todo o conteúdo gerado por IA antes de o utilizar nas suas operações empresariais.", - "legal.terms.s5.p2": "A Descrybe pode utilizar Conteúdo do utilizador anonimizado e agregado para treinar e melhorar os nossos modelos de IA, sob reserva da nossa Política de privacidade. Pode optar por não permitir que os seus dados sejam utilizados para o treino de IA contactando-nos.", + "legal.terms.s4.li1": "Possui ou controla todos os direitos sobre o Conteúdo do utilizador que fornece", + "legal.terms.s4.li2": "O Conteúdo do utilizador não viola estes Termos de serviço", + "legal.terms.s4.li3": "O Conteúdo do utilizador não causará dano a nenhuma pessoa ou entidade", + "legal.terms.s5.h": "5. Inteligência artificial", + "legal.terms.s5.p1": "Os Serviços utilizam tecnologias de inteligência artificial e aprendizagem automática. Reconhece que o conteúdo gerado por IA pode não ser perfeito e aceita rever todo o conteúdo gerado por IA antes de o utilizar nas suas operações empresariais.", + "legal.terms.s5.p2": "A Descrybe pode utilizar Conteúdo do utilizador anonimizado e agregado para treinar e melhorar os nossos modelos de IA, sob reserva da nossa Política de privacidade. Pode optar por não permitir que os seus dados sejam utilizados para o treino de IA contactando-nos.", "legal.terms.s6.h": "6. Propriedade intelectual", - "legal.terms.s6.p": "Os Serviços e o seu conteúdo, funcionalidades e funcionalidade originais são propriedade da Descrybe e estão protegidos pelas leis internacionais de direitos de autor, marcas, patentes, segredos comerciais e outros direitos de propriedade intelectual ou de propriedade.", - "legal.terms.s7.h": "7. Exclusão de garantias", - "legal.terms.s7.p1": "Os Serviços são fornecidos \"tal como estão\" e \"conforme disponíveis\". A Descrybe não formula garantias, expressas ou implícitas, e renuncia desde já a todas as garantias, incluindo, sem limitação, as garantias implícitas de comercialização, adequação a um fim determinado, não infração ou curso de execução.", - "legal.terms.s7.p2": "A Descrybe não garante que os Serviços funcionem de forma ininterrupta, segura ou disponível num momento ou local concretos, nem que sejam corrigidos erros ou defeitos.", - "legal.terms.s8.h": "8. Limitação de responsabilidade", - "legal.terms.s8.lead": "Em caso algum a Descrybe será responsável por danos indiretos, incidentais, especiais, consequentes ou punitivos, incluindo, sem limitação, a perda de lucros, dados, utilização, fundo de comércio ou outras perdas intangíveis, decorrentes de:", - "legal.terms.s8.li1": "O seu acesso ou utilização, ou a impossibilidade de aceder ou utilizar, os Serviços", - "legal.terms.s8.li2": "Qualquer conduta ou conteúdo de terceiros nos Serviços", - "legal.terms.s8.li3": "Qualquer conteúdo obtido dos Serviços", - "legal.terms.s8.li4": "O acesso, utilização ou alteração não autorizados das suas transmissões ou conteúdo", - "legal.terms.s9.h": "9. Rescisão", - "legal.terms.s9.p1": "A Descrybe pode terminar ou suspender o seu acesso aos Serviços imediatamente, sem prévio aviso nem responsabilidade, por qualquer motivo, incluindo, sem limitação, se incumprir estes Termos de serviço.", - "legal.terms.s9.p2": "Após a rescisão, o seu direito de utilizar os Serviços cessará imediatamente. Se desejar terminar a sua conta, pode simplesmente deixar de utilizar os Serviços ou contactar-nos para solicitar a eliminação da conta.", - "legal.terms.s10.h": "10. Lei aplicável", - "legal.terms.s10.p": "Estes Termos reger-se-ão e serão interpretados de acordo com as leis da Eslovénia, sem ter em conta os seus princípios sobre conflito de leis.", - "legal.terms.s11.h": "11. Alterações aos termos", - "legal.terms.s11.p": "A Descrybe reserva-se o direito de modificar ou substituir estes Termos de serviço a qualquer momento. É da sua responsabilidade rever periodicamente estes Termos para verificar se existem alterações. A utilização continuada dos Serviços após a publicação de qualquer alteração constitui a aceitação dessas alterações.", + "legal.terms.s6.p": "Os Serviços e o seu conteúdo, funcionalidades e funcionalidade originais são propriedade da Descrybe e estão protegidos pelas leis internacionais de direitos de autor, marcas, patentes, segredos comerciais e outros direitos de propriedade intelectual ou de propriedade.", + "legal.terms.s7.h": "7. Exclusão de garantias", + "legal.terms.s7.p1": "Os Serviços são fornecidos \"tal como estão\" e \"conforme disponíveis\". A Descrybe não formula garantias, expressas ou implícitas, e renuncia desde já a todas as garantias, incluindo, sem limitação, as garantias implícitas de comercialização, adequação a um fim determinado, não infração ou curso de execução.", + "legal.terms.s7.p2": "A Descrybe não garante que os Serviços funcionem de forma ininterrupta, segura ou disponível num momento ou local concretos, nem que sejam corrigidos erros ou defeitos.", + "legal.terms.s8.h": "8. Limitação de responsabilidade", + "legal.terms.s8.lead": "Em caso algum a Descrybe será responsável por danos indiretos, incidentais, especiais, consequentes ou punitivos, incluindo, sem limitação, a perda de lucros, dados, utilização, fundo de comércio ou outras perdas intangíveis, decorrentes de:", + "legal.terms.s8.li1": "O seu acesso ou utilização, ou a impossibilidade de aceder ou utilizar, os Serviços", + "legal.terms.s8.li2": "Qualquer conduta ou conteúdo de terceiros nos Serviços", + "legal.terms.s8.li3": "Qualquer conteúdo obtido dos Serviços", + "legal.terms.s8.li4": "O acesso, utilização ou alteração não autorizados das suas transmissões ou conteúdo", + "legal.terms.s9.h": "9. Rescisão", + "legal.terms.s9.p1": "A Descrybe pode terminar ou suspender o seu acesso aos Serviços imediatamente, sem prévio aviso nem responsabilidade, por qualquer motivo, incluindo, sem limitação, se incumprir estes Termos de serviço.", + "legal.terms.s9.p2": "Após a rescisão, o seu direito de utilizar os Serviços cessará imediatamente. Se desejar terminar a sua conta, pode simplesmente deixar de utilizar os Serviços ou contactar-nos para solicitar a eliminação da conta.", + "legal.terms.s10.h": "10. Lei aplicável", + "legal.terms.s10.p": "Estes Termos reger-se-ão e serão interpretados de acordo com as leis da Eslovénia, sem ter em conta os seus princípios sobre conflito de leis.", + "legal.terms.s11.h": "11. Alterações aos termos", + "legal.terms.s11.p": "A Descrybe reserva-se o direito de modificar ou substituir estes Termos de serviço a qualquer momento. É da sua responsabilidade rever periodicamente estes Termos para verificar se existem alterações. A utilização continuada dos Serviços após a publicação de qualquer alteração constitui a aceitação dessas alterações.", "legal.terms.s12.h": "12. Contacto", - "legal.terms.s12.lead": "Se tiver perguntas sobre estes Termos de serviço, contacte-nos em:", - "plans.loadFailed": "Não foi possível carregar os planos", - "plans.loading": "A carregar planos…", - "plans.apiUnavailable": "A API de planos ainda não está disponível neste backend. A mostrar a comparação pública de preços.", + "legal.terms.s12.lead": "Se tiver perguntas sobre estes Termos de serviço, contacte-nos em:", + "plans.loadFailed": "Não foi possível carregar os planos", + "plans.loading": "A carregar planos…", + "plans.apiUnavailable": "A API de planos ainda não está disponível neste backend. A mostrar a comparação pública de preços.", "plans.title": "Escolha o seu plano", - "plans.sub.onPrefix": "Está no", - "plans.sub.enterpriseSuffix": "— produtos e IA ilimitados. Não é necessário um upgrade de autosserviço.", - "plans.sub.paygSuffix": "— pagamento por utilização. Compare os planos públicos abaixo ou fale com as vendas para Enterprise.", - "plans.sub.creditsMid": "com {remaining} créditos de IA restantes.", - "plans.sub.creditsSuffix": "Melhore Starter → Growth → Business com Checkout, ou fale com as vendas para Enterprise.", - "plans.sub.none": "Ainda não há um plano atribuído (por exemplo após uma migração omitida). Escolha um plano abaixo — a capacidade não é Ilimitada até que o Checkout ou um administrador atribua um.", - "plans.stripeHint": "Os upgrades de autosserviço utilizam o Stripe Checkout.", + "plans.sub.onPrefix": "Está no", + "plans.sub.enterpriseSuffix": "— produtos e IA ilimitados. Não é necessário um upgrade de autosserviço.", + "plans.sub.paygSuffix": "— pagamento por utilização. Compare os planos públicos abaixo ou fale com as vendas para Enterprise.", + "plans.sub.creditsMid": "com {remaining} créditos de IA restantes.", + "plans.sub.creditsSuffix": "Melhore Starter → Growth → Business com Checkout, ou fale com as vendas para Enterprise.", + "plans.sub.none": "Ainda não há um plano atribuído (por exemplo após uma migração omitida). Escolha um plano abaixo — a capacidade não é Ilimitada até que o Checkout ou um administrador atribua um.", + "plans.stripeHint": "Os upgrades de autosserviço utilizam o Stripe Checkout.", "plans.checkoutUnavailable": "O checkout self-service nao esta disponivel ate o Stripe ser configurado. Contacte as vendas para um plano.", "plans.fallbackName": "Plano", - "plans.fallbackDescription": "Capacidade para o seu catálogo", + "plans.fallbackDescription": "Capacidade para o seu catálogo", "plans.badge.current": "Atual", "plans.badge.popular": "Mais popular", "plans.price.custom": "Personalizado", "plans.price.forever": "para sempre", - "plans.price.perMonth": "/mês", - "plans.price.seePricing": "Ver preços", + "plans.price.perMonth": "/mês", + "plans.price.seePricing": "Ver preços", "plans.capacity.unlimitedSkus": "SKU ilimitados", - "plans.capacity.unlimitedAi": "Créditos de IA ilimitados", - "plans.capacity.upToProducts": "Até {count} produtos", - "plans.capacity.creditsPerMonth": "{count} créditos de IA / mês", + "plans.capacity.unlimitedAi": "Créditos de IA ilimitados", + "plans.capacity.upToProducts": "Até {count} produtos", + "plans.capacity.creditsPerMonth": "{count} créditos de IA / mês", "plans.cta.requestUpgrade": "Solicitar melhoria", "plans.cta.current": "Plano atual", "plans.cta.contactSales": "Contactar vendas", - "plans.cta.switchInBilling": "Mudar na faturação", + "plans.cta.switchInBilling": "Mudar na faturação", "plans.cta.upgradeTo": "Melhorar para {name}", - "plans.cta.startingCheckout": "A iniciar checkout…", - "plans.planApplied": "Plano {plan} aplicado. Os seus créditos estão prontos.", + "plans.cta.startingCheckout": "A iniciar checkout…", + "plans.planApplied": "Plano {plan} aplicado. Os seus créditos estão prontos.", "plans.faq.title": "Perguntas frequentes", "plans.faq.limit.q": "O que acontece se atingir um limite?", - "plans.faq.limit.a": "Primeiro verá avisos suaves. Quando ficar sem créditos de IA ou atingir o limite de SKU, os trabalhos que necessitem dessa capacidade são bloqueados até libertar espaço, aguardar o próximo ciclo ou melhorar o plano.", - "plans.faq.selfServe.q": "Posso melhorar o plano eu próprio?", - "plans.faq.selfServe.a": "Os administradores da empresa podem contratar Starter, Growth e Business por autosserviço através do Checkout no cartão do plano. Os membros devem pedir a um administrador — o Checkout requer o papel de administrador. Enterprise passa sempre pelas vendas. Os administradores da plataforma ainda podem atribuir planos no Billing Admin.", - "plans.faq.enterprise.q": "Enterprise e milhões de SKU", - "plans.faq.enterprise.a": "A capacidade personalizada, a chave de IA própria (BYOK), o SLA e a gestão de conta passam pelas vendas. Reserve tempo no Calendly — Enterprise não é autosserviço à escala de milhões de SKU. A app mostra Ilimitado para capacidade de SKU e IA.", - "plans.faq.pricing.q": "Onde está o preço público?", - "plans.faq.pricing.aBefore": "Consulte a comparação de marketing na", - "plans.faq.pricing.pricingPage": "página de Preços", - "plans.faq.pricing.aMid": "— os CTA são Começar (registo) ou Contactar vendas. Faça a gestão da utilização a qualquer momento em", + "plans.faq.limit.a": "Primeiro verá avisos suaves. Quando ficar sem créditos de IA ou atingir o limite de SKU, os trabalhos que necessitem dessa capacidade são bloqueados até libertar espaço, aguardar o próximo ciclo ou melhorar o plano.", + "plans.faq.selfServe.q": "Posso melhorar o plano eu próprio?", + "plans.faq.selfServe.a": "Os administradores da empresa podem contratar Starter, Growth e Business por autosserviço através do Checkout no cartão do plano. Os membros devem pedir a um administrador — o Checkout requer o papel de administrador. Enterprise passa sempre pelas vendas. Os administradores da plataforma ainda podem atribuir planos no Billing Admin.", + "plans.faq.enterprise.q": "Enterprise e milhões de SKU", + "plans.faq.enterprise.a": "A capacidade personalizada, a chave de IA própria (BYOK), o SLA e a gestão de conta passam pelas vendas. Reserve tempo no Calendly — Enterprise não é autosserviço à escala de milhões de SKU. A app mostra Ilimitado para capacidade de SKU e IA.", + "plans.faq.pricing.q": "Onde está o preço público?", + "plans.faq.pricing.aBefore": "Consulte a comparação de marketing na", + "plans.faq.pricing.pricingPage": "página de Preços", + "plans.faq.pricing.aMid": "— os CTA são Começar (registo) ou Contactar vendas. Faça a gestão da utilização a qualquer momento em", "plans.faq.pricing.aAfter": ".", "plans.custom.title": "Precisa de um plano personalizado?", - "plans.custom.body": "A capacidade Enterprise, a chave de IA própria e os SLA são geridos com a nossa equipa.", - "plans.custom.looking": "Procura detalhes dos planos públicos?", - "ai.title": "Integrações de IA", - "ai.description": "Escolha créditos da plataforma ou a sua própria chave e personalize prompts com variáveis.", - "ai.crumb": "Integrações de IA", - "ai.adminOnly": "Apenas administradores da empresa podem alterar as definições de IA. Pode ver a configuração atual.", - "ai.badge.ownKey": "A sua própria chave", - "ai.badge.platform": "Créditos / chave da plataforma", + "plans.custom.body": "A capacidade Enterprise, a chave de IA própria e os SLA são geridos com a nossa equipa.", + "plans.custom.looking": "Procura detalhes dos planos públicos?", + "ai.title": "Integrações de IA", + "ai.description": "Escolha créditos da plataforma ou a sua própria chave e personalize prompts com variáveis.", + "ai.crumb": "Integrações de IA", + "ai.adminOnly": "Apenas administradores da empresa podem alterar as definições de IA. Pode ver a configuração atual.", + "ai.badge.ownKey": "A sua própria chave", + "ai.badge.platform": "Créditos / chave da plataforma", "ai.badge.active": "Ativo: {label}", - "ai.badge.platformKeyAvailable": "Chave da plataforma disponível", - "ai.badge.lastTest": "Último teste: {status}", + "ai.badge.platformKeyAvailable": "Chave da plataforma disponível", + "ai.badge.lastTest": "Último teste: {status}", "ai.providerMode.title": "Modo do fornecedor", - "ai.providerMode.desc": "A plataforma usa créditos Descrybe e a nossa chave. Popular ou Personalizado usa a sua chave compatível com OpenAI (a chamada ao fornecedor em si não gasta créditos da plataforma; as regras de créditos das funcionalidades continuam a aplicar-se).", + "ai.providerMode.desc": "A plataforma usa créditos Descrybe e a nossa chave. Popular ou Personalizado usa a sua chave compatível com OpenAI (a chamada ao fornecedor em si não gasta créditos da plataforma; as regras de créditos das funcionalidades continuam a aplicar-se).", "ai.whoPays": "Quem paga o modelo?", - "ai.mode.internal": "Plataforma (créditos / chave Descrybe)", - "ai.mode.popular": "A sua chave — fornecedor popular", - "ai.mode.custom": "A sua chave — endpoint personalizado", + "ai.mode.internal": "Plataforma (créditos / chave Descrybe)", + "ai.mode.popular": "A sua chave — fornecedor popular", + "ai.mode.custom": "A sua chave — endpoint personalizado", "ai.useCompanyKey": "Usar esta chave da empresa para processamento, SEO com IA e campanhas com IA", "ai.popular.title": "Fornecedor popular", - "ai.popular.desc": "Endpoints compatíveis com OpenAI. Anthropic via OpenRouter.", + "ai.popular.desc": "Endpoints compatíveis com OpenAI. Anthropic via OpenRouter.", "ai.field.provider": "Fornecedor", "ai.field.model": "Modelo", "ai.placeholder.modelId": "id do modelo", @@ -4904,359 +4905,359 @@ export const pt: MessageDict = { "ai.custom.desc": "Introduza o URL base HTTPS do seu fornecedor de IA.", "ai.field.baseUrl": "URL base", "ai.apiKey.title": "Chave API", - "ai.apiKey.desc": "Deixe em branco para manter a chave existente. Segredos em bruto nunca são devolvidos — apenas um last4 mascarado.", + "ai.apiKey.desc": "Deixe em branco para manter a chave existente. Segredos em bruto nunca são devolvidos — apenas um last4 mascarado.", "ai.storedKey": "Chave guardada: {masked}", "ai.field.apiKey": "Chave API", - "ai.placeholder.keepKey": "•••• deixe em branco para manter", + "ai.placeholder.keepKey": "•••• deixe em branco para manter", "ai.clearStoredKey": "Limpar chave API guardada", "ai.saveProvider": "Guardar fornecedor", - "ai.testConnection": "Testar ligação", + "ai.testConnection": "Testar ligação", "ai.prompts.title": "Modelos de prompt", - "ai.prompts.descBefore": "Personalize prompts de sistema e de utilizador para textos de produto, meta SEO e emails de campanha. Insira variáveis como", - "ai.prompts.descMid": "— são preenchidas em tempo de execução. A voz do kit de marca está disponível como", + "ai.prompts.descBefore": "Personalize prompts de sistema e de utilizador para textos de produto, meta SEO e emails de campanha. Insira variáveis como", + "ai.prompts.descMid": "— são preenchidas em tempo de execução. A voz do kit de marca está disponível como", "ai.prompts.descAfter": ".", "ai.field.feature": "Funcionalidade", "ai.badge.custom": "Personalizado", - "ai.badge.builtin": "Predefinição integrada", - "ai.badge.disabledDefault": "Desativado → a usar a predefinição", - "ai.useCustomPrompt": "Usar este prompt personalizado (desligado = predefinição integrada)", - "ai.insertVariableInto": "Inserir variável em", + "ai.badge.builtin": "Predefinição integrada", + "ai.badge.disabledDefault": "Desativado → a usar a predefinição", + "ai.useCustomPrompt": "Usar este prompt personalizado (desligado = predefinição integrada)", + "ai.insertVariableInto": "Inserir variável em", "ai.insert.system": "Sistema", "ai.insert.user": "Utilizador", "ai.field.systemPrompt": "Prompt de sistema", "ai.field.userPrompt": "Prompt de utilizador", "ai.savePrompts": "Guardar prompts", - "ai.resetDefault": "Repor predefinição", + "ai.resetDefault": "Repor predefinição", "ai.editBrandVoice": "Editar voz da marca", - "ai.flash.loadFailed": "Falha ao carregar as definições de IA", - "ai.flash.usingPlatform": "A usar a IA da plataforma (créditos / chave Descrybe quando configurados).", - "ai.flash.providerSaved": "Fornecedor de IA guardado. As chaves são encriptadas e nunca são mostradas novamente.", - "ai.flash.saveFailed": "Não foi possível guardar", - "ai.flash.savePromptsFailed": "Não foi possível guardar os prompts", - "ai.flash.resetFailed": "Não foi possível repor o prompt", - "ai.flash.connectionFailed": "Falha na ligação", + "ai.flash.loadFailed": "Falha ao carregar as definições de IA", + "ai.flash.usingPlatform": "A usar a IA da plataforma (créditos / chave Descrybe quando configurados).", + "ai.flash.providerSaved": "Fornecedor de IA guardado. As chaves são encriptadas e nunca são mostradas novamente.", + "ai.flash.saveFailed": "Não foi possível guardar", + "ai.flash.savePromptsFailed": "Não foi possível guardar os prompts", + "ai.flash.resetFailed": "Não foi possível repor o prompt", + "ai.flash.connectionFailed": "Falha na ligação", "ai.flash.testFailed": "Falha no teste", - "ai.action.changeSettings": "alterar as definições do fornecedor de IA", + "ai.action.changeSettings": "alterar as definições do fornecedor de IA", "ai.action.changePrompts": "alterar os prompts de IA", "ai.action.testProvider": "testar o fornecedor de IA", "email.title": "Envio de email", "email.description": "Resend ou SMTP para campanhas de marketing. Segredos encriptados em repouso.", - "email.adminOnly": "Apenas administradores da empresa podem alterar as definições do fornecedor de email. Pode ver a configuração atual.", - "email.crumb": "Integração de email", - "email.dryRunForced": "O dry-run está forçado ({reason}). Planos Free e EMAIL_DRY_RUN nunca enviam envios em massa reais.", - "email.dryRunPolicy": "política", + "email.adminOnly": "Apenas administradores da empresa podem alterar as definições do fornecedor de email. Pode ver a configuração atual.", + "email.crumb": "Integração de email", + "email.dryRunForced": "O dry-run está forçado ({reason}). Planos Free e EMAIL_DRY_RUN nunca enviam envios em massa reais.", + "email.dryRunPolicy": "política", "email.badge.verified": "Verificado", - "email.badge.notVerified": "Não verificado", + "email.badge.notVerified": "Não verificado", "email.badge.canSendReal": "Pode enviar real", "email.badge.realBlocked": "Envio real bloqueado", - "email.badge.lastTest": "Último teste: {status}", + "email.badge.lastTest": "Último teste: {status}", "email.provider.title": "Fornecedor", - "email.provider.desc": "Configuração por empresa. O SMTP/Resend de ambiente da plataforma é apenas fallback quando faltam segredos.", + "email.provider.desc": "Configuração por empresa. O SMTP/Resend de ambiente da plataforma é apenas fallback quando faltam segredos.", "email.field.provider": "Fornecedor", "email.provider.resend": "Resend", "email.provider.smtp": "SMTP", "email.field.fromEmail": "Email do remetente", - "email.field.domain": "Domínio", + "email.field.domain": "Domínio", "email.field.from": "De", "email.field.fromName": "Nome do remetente", "email.field.replyTo": "Reply-To", - "email.resendKeySaved": "Chave API Resend (guardada — deixe em branco para manter)", + "email.resendKeySaved": "Chave API Resend (guardada — deixe em branco para manter)", "email.resendKey": "Chave API Resend", "email.field.smtpHost": "Host SMTP", "email.field.port": "Porta", "email.field.username": "Nome de utilizador", "email.field.passwordSaved": "Palavra-passe (guardada)", "email.field.password": "Palavra-passe", - "email.verifyDomain": "Verificar domínio", + "email.verifyDomain": "Verificar domínio", "email.testGate.title": "Teste e controlo de envios", - "email.testGate.desc": "Os envios de teste verificam o endereço do remetente. Envios em massa reais exigem escrever “I understand”.", - "email.field.recipient": "Destinatário", + "email.testGate.desc": "Os envios de teste verificam o endereço do remetente. Envios em massa reais exigem escrever “I understand”.", + "email.field.recipient": "Destinatário", "email.sendTest": "Enviar teste", - "email.confirmBlast": "Confirmar envio em massa…", - "email.flash.loadFailed": "Falha ao carregar as definições de email", - "email.flash.saveFailed": "Não foi possível guardar", - "email.flash.verifyUpdated": "Verificação atualizada.", - "email.flash.verifyFailed": "Falha na verificação", + "email.confirmBlast": "Confirmar envio em massa…", + "email.flash.loadFailed": "Falha ao carregar as definições de email", + "email.flash.saveFailed": "Não foi possível guardar", + "email.flash.verifyUpdated": "Verificação atualizada.", + "email.flash.verifyFailed": "Falha na verificação", "email.flash.testFailed": "Falha no envio de teste", - "email.flash.blastDryRun": "Verificação de entrega registada em modo dry-run — nenhum email foi enviado.", - "email.flash.blastDone": "Verificação de entrega concluída: {sent} enviados, {failed} falhados.", + "email.flash.blastDryRun": "Verificação de entrega registada em modo dry-run — nenhum email foi enviado.", + "email.flash.blastDone": "Verificação de entrega concluída: {sent} enviados, {failed} falhados.", "email.flash.blastFailed": "Falha no envio em massa", - "email.blast.subject": "Verificação de entrega de email Descrybe", - "email.blast.body": "Esta é uma verificação de entrega a um único endereço da Descrybe para confirmar que a sua integração de email pode enviar. Destinatário: {recipient}", - "email.action.changeSettings": "alterar as definições do fornecedor de email", - "email.action.verifyDomain": "verificar o domínio de email", + "email.blast.subject": "Verificação de entrega de email Descrybe", + "email.blast.body": "Esta é uma verificação de entrega a um único endereço da Descrybe para confirmar que a sua integração de email pode enviar. Destinatário: {recipient}", + "email.action.changeSettings": "alterar as definições do fornecedor de email", + "email.action.verifyDomain": "verificar o domínio de email", "email.action.sendTest": "enviar email de teste", "email.action.sendBlasts": "enviar envios em massa de email", - "seo.title": "Recomendações SEO", - "seo.description": "Pontuações de checklist para meta do catálogo, títulos, imagens e palavras-chave. O preenchimento por modelo é gratuito; a reescrita com IA é paga.", - "seo.upgradeTitle": "A reescrita com IA é uma funcionalidade paga", - "seo.upgradeMessage": "Planos Free ainda podem corrigir meta em falta com modelos baseados em regras. Faça upgrade ou adicione créditos para usar reescritas com IA.", + "seo.title": "Recomendações SEO", + "seo.description": "Pontuações de checklist para meta do catálogo, títulos, imagens e palavras-chave. O preenchimento por modelo é gratuito; a reescrita com IA é paga.", + "seo.upgradeTitle": "A reescrita com IA é uma funcionalidade paga", + "seo.upgradeMessage": "Planos Free ainda podem corrigir meta em falta com modelos baseados em regras. Faça upgrade ou adicione créditos para usar reescritas com IA.", "seo.comparePlans": "Comparar planos", "seo.openProducts": "Abrir produtos", - "seo.overallScore": "Pontuação SEO global", - "seo.overallScoreHint": "Média dos itens da checklist", + "seo.overallScore": "Pontuação SEO global", + "seo.overallScoreHint": "Média dos itens da checklist", "seo.productsScanned": "Produtos analisados", "seo.productsScannedHint": "Produtos processados na empresa", "seo.categoriesScanned": "Categorias analisadas", - "seo.categoriesScannedHint": "Inclui verificações de fórmulas meta", + "seo.categoriesScannedHint": "Inclui verificações de fórmulas meta", "seo.aiRewrite": "Reescrita com IA", - "seo.available": "Disponível", + "seo.available": "Disponível", "seo.gated": "Restrito", "seo.templateFree": "O preenchimento por modelo continua gratuito em todos os planos", "seo.checklist": "Checklist", - "seo.affectedFindings": "{affected} afetados · {count} resultados", - "seo.fixable": "Corrigível", + "seo.affectedFindings": "{affected} afetados · {count} resultados", + "seo.fixable": "Corrigível", "seo.clearFilter": "Limpar filtro", "seo.findings": "Resultados", - "seo.noFindings": "Sem resultados para este filtro — bom trabalho.", + "seo.noFindings": "Sem resultados para este filtro — bom trabalho.", "seo.col.issue": "Problema", "seo.col.entity": "Entidade", "seo.col.severity": "Gravidade", - "seo.col.actions": "Ações", - "seo.filling": "A preencher…", + "seo.col.actions": "Ações", + "seo.filling": "A preencher…", "seo.templateFill": "Preenchimento por modelo", - "seo.aiTitleAllowed": "Reescrever com IA (usa créditos)", - "seo.aiTitleGated": "Requer plano pago ou créditos", - "seo.rewriting": "A reescrever…", + "seo.aiTitleAllowed": "Reescrever com IA (usa créditos)", + "seo.aiTitleGated": "Requer plano pago ou créditos", + "seo.rewriting": "A reescrever…", "seo.aiRewriteBtn": "Reescrita com IA", "seo.viewProduct": "Ver produto", - "seo.flash.loadFailed": "Falha ao carregar recomendações SEO", - "seo.flash.aiPaid": "A reescrita com IA requer um plano pago ou créditos.", - "seo.flash.applyFailed": "Falha ao aplicar a correção", + "seo.flash.loadFailed": "Falha ao carregar recomendações SEO", + "seo.flash.aiPaid": "A reescrita com IA requer um plano pago ou créditos.", + "seo.flash.applyFailed": "Falha ao aplicar a correção", "brand.title": "Kit de marca", - "brand.description": "Defina voz, diretrizes e cores para que títulos e descrições de produto se mantenham alinhados com a marca.", - "brand.loading": "A carregar kit de marca…", - "brand.adminOnly": "Apenas administradores da empresa podem editar o kit de marca. Pode ver a voz, as cores e o logótipo atuais.", - "brand.aiApplyFreeAdmin": "Pode editar o seu kit de marca no Free. A aplicação com IA (injetar a voz da marca nos prompts de enhance) desbloqueia a partir do Starter.", - "brand.aiApplyGated": "A aplicação com IA (injetar a voz da marca nos prompts de enhance) desbloqueia a partir do Starter.", - "brand.aiEnhanceUses": "O enhance com IA usará esta voz de marca ao processar produtos.", + "brand.description": "Defina voz, diretrizes e cores para que títulos e descrições de produto se mantenham alinhados com a marca.", + "brand.loading": "A carregar kit de marca…", + "brand.adminOnly": "Apenas administradores da empresa podem editar o kit de marca. Pode ver a voz, as cores e o logótipo atuais.", + "brand.aiApplyFreeAdmin": "Pode editar o seu kit de marca no Free. A aplicação com IA (injetar a voz da marca nos prompts de enhance) desbloqueia a partir do Starter.", + "brand.aiApplyGated": "A aplicação com IA (injetar a voz da marca nos prompts de enhance) desbloqueia a partir do Starter.", + "brand.aiEnhanceUses": "O enhance com IA usará esta voz de marca ao processar produtos.", "brand.comparePlans": "Comparar planos", "brand.voice.title": "Voz e diretrizes", - "brand.voice.desc": "Tom, regras do/don’t e redação preferida", + "brand.voice.desc": "Tom, regras do/don’t e redação preferida", "brand.field.voiceTone": "Voz / tom", - "brand.placeholder.voiceTone": "ex. Confiante, conciso, técnico mas acessível", + "brand.placeholder.voiceTone": "ex. Confiante, conciso, técnico mas acessível", "brand.field.dos": "Fazer (um por linha)", - "brand.placeholder.dos": "Comece pelo benefício principal\nMantenha títulos com menos de 80 caracteres", - "brand.field.donts": "Não fazer (um por linha)", - "brand.placeholder.donts": "Sem MAIÚSCULAS\nEvite superlativos sem prova", - "brand.field.preferredTerms": "Termos preferidos (um por linha ou separados por vírgulas)", - "brand.placeholder.preferredTerms": "sem fios, premium, classe energética", + "brand.placeholder.dos": "Comece pelo benefício principal\nMantenha títulos com menos de 80 caracteres", + "brand.field.donts": "Não fazer (um por linha)", + "brand.placeholder.donts": "Sem MAIÚSCULAS\nEvite superlativos sem prova", + "brand.field.preferredTerms": "Termos preferidos (um por linha ou separados por vírgulas)", + "brand.placeholder.preferredTerms": "sem fios, premium, classe energética", "brand.visual.title": "Identidade visual", - "brand.visual.desc": "Cores e logótipo usados em dicas e campanhas conscientes da marca", - "brand.field.primaryColor": "Cor primária", - "brand.field.secondaryColor": "Cor secundária", - "brand.field.logoImage": "Imagem do logótipo", - "brand.logoHint": "PNG, JPEG ou WebP até 2 MiB. Guardado nos uploads da sua empresa.", - "brand.uploading": "A carregar…", - "brand.uploadLogo": "Carregar logótipo", + "brand.visual.desc": "Cores e logótipo usados em dicas e campanhas conscientes da marca", + "brand.field.primaryColor": "Cor primária", + "brand.field.secondaryColor": "Cor secundária", + "brand.field.logoImage": "Imagem do logótipo", + "brand.logoHint": "PNG, JPEG ou WebP até 2 MiB. Guardado nos uploads da sua empresa.", + "brand.uploading": "A carregar…", + "brand.uploadLogo": "Carregar logótipo", "brand.clear": "Limpar", - "brand.field.logoUrl": "URL do logótipo", - "brand.placeholder.logoUrl": "https://… ou carregado /api/brand/logo/files/…", - "brand.logoAlt": "Pré-visualização do logótipo da marca", - "brand.tipsTitle": "Dicas de fórmula / pré-visualização", - "brand.saving": "A guardar…", + "brand.field.logoUrl": "URL do logótipo", + "brand.placeholder.logoUrl": "https://… ou carregado /api/brand/logo/files/…", + "brand.logoAlt": "Pré-visualização do logótipo da marca", + "brand.tipsTitle": "Dicas de fórmula / pré-visualização", + "brand.saving": "A guardar…", "brand.save": "Guardar kit de marca", "brand.flash.loadFailed": "Falha ao carregar o kit de marca", - "structured.title": "Campos de descrição estruturada", - "structured.loading": "A carregar campos de descrição estruturada…", + "structured.title": "Campos de descrição estruturada", + "structured.loading": "A carregar campos de descrição estruturada…", "structured.backDashboard": "Voltar ao painel", - "structured.categoryFormulas": "Fórmulas de categoria", - "structured.exportFeeds": "Feeds de exportação", - "structured.intro": "Estes campos são criados automaticamente quando adiciona Export IDs às secções da fórmula de descrição. Podem ser usados nos seus feeds de exportação para incluir partes específicas das descrições de produto.", + "structured.categoryFormulas": "Fórmulas de categoria", + "structured.exportFeeds": "Feeds de exportação", + "structured.intro": "Estes campos são criados automaticamente quando adiciona Export IDs às secções da fórmula de descrição. Podem ser usados nos seus feeds de exportação para incluir partes específicas das descrições de produto.", "structured.addField": "Adicionar campo", "structured.openCategories": "Abrir categorias", - "structured.tableCaption": "Estes campos estruturam partes das descrições de produto para exportação.", + "structured.tableCaption": "Estes campos estruturam partes das descrições de produto para exportação.", "structured.col.fieldKey": "Chave do campo", "structured.col.type": "Tipo", "structured.col.created": "Criado", - "structured.col.actions": "Ações", - "structured.dialogTitle": "Adicionar campo de descrição estruturada", - "structured.fieldKeyLabel": "Chave do campo (obrigatória)", + "structured.col.actions": "Ações", + "structured.dialogTitle": "Adicionar campo de descrição estruturada", + "structured.fieldKeyLabel": "Chave do campo (obrigatória)", "structured.fieldKeyPlaceholder": "ex., features, specifications", "structured.fieldTypeLabel": "Tipo de campo", "structured.type.text": "Texto", - "structured.type.number": "Número", + "structured.type.number": "Número", "structured.type.boolean": "Booleano", "structured.type.list": "Lista", "structured.adding": "A adicionar...", - "structured.flash.loadFailed": "Falha ao carregar campos de descrição estruturada", + "structured.flash.loadFailed": "Falha ao carregar campos de descrição estruturada", "assistant.ariaLabel": "Assistente do sistema", "assistant.title": "Assistente do sistema", - "assistant.subtitle": "Navegue, oriente e execute ações suportadas", + "assistant.subtitle": "Navegue, oriente e execute ações suportadas", "assistant.resetAria": "Reiniciar conversa", "assistant.resetTitle": "Reiniciar", "assistant.closeAria": "Fechar assistente", "assistant.messageLabel": "Mensagem", - "assistant.placeholder": "ex. adicionar URL de feed, chaves API, atributos, processamento…", + "assistant.placeholder": "ex. adicionar URL de feed, chaves API, atributos, processamento…", "assistant.sendAria": "Enviar", "site.bookDemo": "Agendar uma demo", "site.demoShort": "Demo", "site.allRightsReserved": "Todos os direitos reservados.", - "site.cookiePolicy": "Política de cookies", - "site.cookieSettings": "Definições de cookies", - "consent.title": "Cookies e análise", - "consent.description": "Usamos cookies necessários para o Descrybe funcionar. Cookies opcionais de análise e marketing ajudam-nos a compreender a utilização e medir campanhas. Pode alterar a escolha a qualquer momento.", + "site.cookiePolicy": "Política de cookies", + "site.cookieSettings": "Definições de cookies", + "consent.title": "Cookies e análise", + "consent.description": "Usamos cookies necessários para o Descrybe funcionar. Cookies opcionais de análise e marketing ajudam-nos a compreender a utilização e medir campanhas. Pode alterar a escolha a qualquer momento.", "consent.acceptAll": "Aceitar todos", - "consent.rejectNonEssential": "Rejeitar não essenciais", + "consent.rejectNonEssential": "Rejeitar não essenciais", "consent.customize": "Personalizar", - "consent.save": "Guardar preferências", - "consent.necessary": "Necessários", - "consent.necessaryDesc": "Obrigatórios para início de sessão, segurança (CSRF), tema, idioma e lembrar esta escolha.", + "consent.save": "Guardar preferências", + "consent.necessary": "Necessários", + "consent.necessaryDesc": "Obrigatórios para início de sessão, segurança (CSRF), tema, idioma e lembrar esta escolha.", "consent.alwaysOn": "Sempre ativos", - "consent.analytics": "Análise", - "consent.analyticsDesc": "Ajuda-nos a compreender como o produto é usado (Google Analytics via GTM).", + "consent.analytics": "Análise", + "consent.analyticsDesc": "Ajuda-nos a compreender como o produto é usado (Google Analytics via GTM).", "consent.marketing": "Marketing", - "consent.marketingDesc": "Para medição publicitária e personalização quando há tags de anúncios no GTM.", - "consent.policyLink": "Ler a Política de cookies", - "seo.cookies.title": "Política de cookies | Descrybe", - "seo.cookies.description": "Como o Descrybe usa cookies necessários, de análise e marketing, incluindo GTM e GA4, e como alterar o consentimento.", - "legal.cookies.title": "Política de cookies", - "legal.cookies.intro.h": "Visão geral", - "legal.cookies.intro.p1": "Esta Política de cookies explica como o Descrybe usa cookies e tecnologias semelhantes no site e na aplicação. Leia em conjunto com a Política de privacidade.", - "legal.cookies.intro.p2": "Quando exigido, pedimos consentimento antes de ativar cookies de análise ou marketing. Cookies necessários prestam o serviço de forma segura e não requerem consentimento.", + "consent.marketingDesc": "Para medição publicitária e personalização quando há tags de anúncios no GTM.", + "consent.policyLink": "Ler a Política de cookies", + "seo.cookies.title": "Política de cookies | Descrybe", + "seo.cookies.description": "Como o Descrybe usa cookies necessários, de análise e marketing, incluindo GTM e GA4, e como alterar o consentimento.", + "legal.cookies.title": "Política de cookies", + "legal.cookies.intro.h": "Visão geral", + "legal.cookies.intro.p1": "Esta Política de cookies explica como o Descrybe usa cookies e tecnologias semelhantes no site e na aplicação. Leia em conjunto com a Política de privacidade.", + "legal.cookies.intro.p2": "Quando exigido, pedimos consentimento antes de ativar cookies de análise ou marketing. Cookies necessários prestam o serviço de forma segura e não requerem consentimento.", "legal.cookies.types.h": "Categorias de cookies", - "legal.cookies.necessary.h": "Necessários", - "legal.cookies.necessary.p": "Mantêm a sessão, protegem formulários com CSRF, guardam tema e idioma e lembram a escolha de cookies. Sem eles o produto não funciona corretamente.", - "legal.cookies.analytics.h": "Análise", - "legal.cookies.analytics.p": "Se permitir análise, carregamos tags GTM que podem definir cookies GA4 para medir páginas e eventos. Os eventos ficam bloqueados até conceder analytics_storage.", + "legal.cookies.necessary.h": "Necessários", + "legal.cookies.necessary.p": "Mantêm a sessão, protegem formulários com CSRF, guardam tema e idioma e lembram a escolha de cookies. Sem eles o produto não funciona corretamente.", + "legal.cookies.analytics.h": "Análise", + "legal.cookies.analytics.p": "Se permitir análise, carregamos tags GTM que podem definir cookies GA4 para medir páginas e eventos. Os eventos ficam bloqueados até conceder analytics_storage.", "legal.cookies.marketing.h": "Marketing", - "legal.cookies.marketing.p": "Se permitir marketing, tags publicitárias no GTM podem usar armazenamento de anúncios e sinais relacionados para medição e personalização.", + "legal.cookies.marketing.p": "Se permitir marketing, tags publicitárias no GTM podem usar armazenamento de anúncios e sinais relacionados para medição e personalização.", "legal.cookies.gtm.h": "Google Tag Manager e GA4", - "legal.cookies.gtm.p": "Quando configurado, o Descrybe carrega um contentor GTM. O GA4 é configurado nesse contentor. O Consent Mode v2 nega por predefinição o armazenamento de análise e anúncios até aceitar as categorias.", + "legal.cookies.gtm.p": "Quando configurado, o Descrybe carrega um contentor GTM. O GA4 é configurado nesse contentor. O Consent Mode v2 nega por predefinição o armazenamento de análise e anúncios até aceitar as categorias.", "legal.cookies.third.h": "Terceiros", - "legal.cookies.third.p": "A Google (Tag Manager / Analytics) pode processar dados técnicos (URL, dispositivo/browser, nomes de eventos) com consentimento. Não enviamos intencionalmente palavras-passe, chaves API ou contactos em eventos de análise.", + "legal.cookies.third.p": "A Google (Tag Manager / Analytics) pode processar dados técnicos (URL, dispositivo/browser, nomes de eventos) com consentimento. Não enviamos intencionalmente palavras-passe, chaves API ou contactos em eventos de análise.", "legal.cookies.manage.h": "Como alterar o consentimento", - "legal.cookies.manage.p": "Use Definições de cookies no rodapé (ou o botão abaixo) para reabrir o banner. Também pode limpar os dados do site no browser.", - "site.privacyPolicy": "Política de privacidade", - "site.termsOfService": "Termos de serviço", + "legal.cookies.manage.p": "Use Definições de cookies no rodapé (ou o botão abaixo) para reabrir o banner. Também pode limpar os dados do site no browser.", + "site.privacyPolicy": "Política de privacidade", + "site.termsOfService": "Termos de serviço", "site.legalNav": "Legal", "site.footer.aria": "Site", - "site.footer.description": "A Descrybe transforma feeds de fornecedores em catálogos de produto limpos e prontos para canais — mapeie campos, enriqueça atributos e textos, depois exporte ou sincronize com o WooCommerce.", - "site.footer.rightsLine": "© {year} {name}. Todos os direitos reservados.", - "site.footer.navTitle": "Navegação", + "site.footer.description": "A Descrybe transforma feeds de fornecedores em catálogos de produto limpos e prontos para canais — mapeie campos, enriqueça atributos e textos, depois exporte ou sincronize com o WooCommerce.", + "site.footer.rightsLine": "© {year} {name}. Todos os direitos reservados.", + "site.footer.navTitle": "Navegação", "site.footer.platform": "Plataforma", - "site.footer.solutions": "Soluções", + "site.footer.solutions": "Soluções", "site.footer.contact": "Contacte-nos", "home.hero.tagline": "Dados de produto para equipas de ecommerce", - "home.hero.title": "De feeds de fornecedores a páginas de produto", - "home.hero.lead": "Ligue feeds de fornecedores, mapeie-os para as suas categorias, preencha atributos obrigatórios e escreva títulos e descrições segundo as suas regras — depois exporte ou sincronize com a sua loja.", + "home.hero.title": "De feeds de fornecedores a páginas de produto", + "home.hero.lead": "Ligue feeds de fornecedores, mapeie-os para as suas categorias, preencha atributos obrigatórios e escreva títulos e descrições segundo as suas regras — depois exporte ou sincronize com a sua loja.", "home.hero.learnMore": "Saber mais", "home.hero.apply": "Pedir acesso", "home.hero.supportedBy": "Com o apoio de", "home.hero.msAlt": "Microsoft for Startups", - "home.image.previewAlt": "Pré-visualização da plataforma Descrybe: do feed à ficha de produto", + "home.image.previewAlt": "Pré-visualização da plataforma Descrybe: do feed à ficha de produto", "home.how.title": "Veja como a Descrybe poupa tempo a colocar produtos no mercado", - "home.how.lead": "Importe dados desorganizados de fornecedores uma só vez. A Descrybe ajuda a categorizá-los, preencher atributos, redigir fichas e enviar produtos prontos para os seus canais.", + "home.how.lead": "Importe dados desorganizados de fornecedores uma só vez. A Descrybe ajuda a categorizá-los, preencher atributos, redigir fichas e enviar produtos prontos para os seus canais.", "home.how.apply": "Pedir acesso", "home.how.step1.title": "Importe a sua taxonomia", - "home.how.step1.desc": "Configure as categorias e atributos que a sua loja já usa", - "home.how.step1.f1": "Defina atributos obrigatórios por categoria", - "home.how.step1.f2": "Defina fórmulas de título por categoria", - "home.how.step1.f3": "Defina modelos de descrição e snippet de pesquisa", + "home.how.step1.desc": "Configure as categorias e atributos que a sua loja já usa", + "home.how.step1.f1": "Defina atributos obrigatórios por categoria", + "home.how.step1.f2": "Defina fórmulas de título por categoria", + "home.how.step1.f3": "Defina modelos de descrição e snippet de pesquisa", "home.how.step2.title": "Importe dados de fornecedores", "home.how.step2.desc": "Ligue um URL de feed ou carregue um ficheiro de produtos", "home.how.step2.f1": "Importe a partir de fontes CSV, XML ou API", - "home.how.step2.f2": "Agende importações automáticas dos seus fornecedores", + "home.how.step2.f2": "Agende importações automáticas dos seus fornecedores", "home.how.step2.f3": "Mapeie campos de origem com uma interface simples de arrastar e largar", - "home.how.step3.title": "Transforme e enriqueça", + "home.how.step3.title": "Transforme e enriqueça", "home.how.step3.desc": "Escolha os produtos a processar e deixe a Descrybe:", "home.how.step3.f1": "Atribuir as categorias certas", - "home.how.step3.f2": "Preencher os atributos de produto obrigatórios", - "home.how.step3.f3": "Criar títulos e descrições claros e adequados à pesquisa", + "home.how.step3.f2": "Preencher os atributos de produto obrigatórios", + "home.how.step3.f3": "Criar títulos e descrições claros e adequados à pesquisa", "home.how.step4.title": "Exporte para canais", "home.how.step4.desc": "Envie dados de produto prontos para onde vende", - "home.how.step4.f1": "Gere feeds de produto específicos por canal", + "home.how.step4.f1": "Gere feeds de produto específicos por canal", "home.how.step4.f2": "Mantenha o controlo total dos campos que exporta", "home.how.step4.f3": "Mantenha-se atualizado quando os dados do fornecedor mudarem", "home.benefits.title": "Tudo o que precisa para dados de produto mais limpos", - "home.benefits.lead": "Da importação do feed às fichas prontas para o canal — sem reconstruir cada ficheiro à mão.", + "home.benefits.lead": "Da importação do feed às fichas prontas para o canal — sem reconstruir cada ficheiro à mão.", "home.benefits.shield.title": "Detete fichas incompletas a tempo", - "home.benefits.shield.desc": "Verifique os dados face às regras de categoria para corrigir atributos em falta e textos fracos antes de publicar.", - "home.benefits.chart.title": "Fichas mais claras, conversão mais forte", - "home.benefits.chart.desc": "Títulos e descrições que destacam o que importa aos compradores — benefícios, especificações e termos de pesquisa do seu catálogo.", + "home.benefits.shield.desc": "Verifique os dados face às regras de categoria para corrigir atributos em falta e textos fracos antes de publicar.", + "home.benefits.chart.title": "Fichas mais claras, conversão mais forte", + "home.benefits.chart.desc": "Títulos e descrições que destacam o que importa aos compradores — benefícios, especificações e termos de pesquisa do seu catálogo.", "home.benefits.database.title": "Uma estrutura de produto coerente", - "home.benefits.database.desc": "Mantenha a mesma árvore de categorias e forma de atributos em exportações e canais para que os clientes encontrem produtos da mesma forma em todo o lado.", - "home.benefits.search.title": "Conteúdo de produto pensado para a pesquisa", - "home.benefits.search.desc": "Escreva títulos, descrições e meta snippets mais fáceis de compreender para compradores e motores de pesquisa.", - "home.benefits.cost.title": "Menos introdução manual de dados", - "home.benefits.cost.desc": "Automatize o mapeamento, o preenchimento de atributos e os textos das fichas para a equipa se focar no merchandising — não em limpar folhas de cálculo.", + "home.benefits.database.desc": "Mantenha a mesma árvore de categorias e forma de atributos em exportações e canais para que os clientes encontrem produtos da mesma forma em todo o lado.", + "home.benefits.search.title": "Conteúdo de produto pensado para a pesquisa", + "home.benefits.search.desc": "Escreva títulos, descrições e meta snippets mais fáceis de compreender para compradores e motores de pesquisa.", + "home.benefits.cost.title": "Menos introdução manual de dados", + "home.benefits.cost.desc": "Automatize o mapeamento, o preenchimento de atributos e os textos das fichas para a equipa se focar no merchandising — não em limpar folhas de cálculo.", "home.benefits.scale.title": "Pronto para cada canal de venda", - "home.benefits.scale.desc": "Adapte feeds de exportação e a sync WooCommerce aos formatos que cada canal espera, sem reconstruir o catálogo à mão.", + "home.benefits.scale.desc": "Adapte feeds de exportação e a sync WooCommerce aos formatos que cada canal espera, sem reconstruir o catálogo à mão.", "home.cta.titleLead": "Coloque produtos no mercado ", "home.cta.titleHighlight": "mais depressa", - "home.cta.description": "Deixe de reconstruir dados de produto em cada ficheiro de fornecedor. Mapeie uma vez, enriqueça com as suas regras e publique fichas prontas a vender.", + "home.cta.description": "Deixe de reconstruir dados de produto em cada ficheiro de fornecedor. Mapeie uma vez, enriqueça com as suas regras e publique fichas prontas a vender.", "home.cta.f1": "Demo personalizada", "home.cta.f2": "Consulta com especialistas", - "home.cta.f3": "Próximos passos claros", + "home.cta.f3": "Próximos passos claros", "home.cta.apply": "Pedir acesso", - "home.cta.imageAlt": "Páginas de produto Descrybe", + "home.cta.imageAlt": "Páginas de produto Descrybe", "home.product.eyebrow": "O que a Descrybe faz", - "home.product.title": "Feeds de fornecedor à entrada. Fichas prontas à saída — export, WooCommerce ou API.", - "home.product.description": "A Descrybe ajuda equipas de ecommerce a transformar feeds CSV e XML de fornecedores em catálogos limpos. Mapeie campos para as suas categorias, enriqueça atributos e textos e envie dados por feeds de exportação, sync WooCommerce ou a API pública.", + "home.product.title": "Feeds de fornecedor à entrada. Fichas prontas à saída — export, WooCommerce ou API.", + "home.product.description": "A Descrybe ajuda equipas de ecommerce a transformar feeds CSV e XML de fornecedores em catálogos limpos. Mapeie campos para as suas categorias, enriqueça atributos e textos e envie dados por feeds de exportação, sync WooCommerce ou a API pública.", "home.product.pipelineAria": "Pipeline de produto", "home.product.p1.label": "Feeds de entrada", "home.product.p1.detail": "CSV / XML a partir de URLs de fornecedor", "home.product.p2.label": "Mapear", "home.product.p2.detail": "Associe colunas aos seus campos", "home.product.p3.label": "Enriquecer", - "home.product.p3.detail": "Categorias, atributos, títulos", + "home.product.p3.detail": "Categorias, atributos, títulos", "home.product.p4.label": "Publicar", - "home.product.p4.detail": "Export · Woo · API", - "pricing.section.badge": "Capacidade de SKU + créditos de IA", - "pricing.section.title": "Comece grátis. Escala quando o catálogo crescer.", - "pricing.section.lead": "O Free inclui mapeamento de feeds, limpeza básica de produto e rótulos energéticos da UE (EPREL) até 100 SKUs (sem créditos de IA). Os planos pagos adicionam títulos e descrições com IA, mais capacidade e opções de exportação — Starter, Growth, Business, ou fale com as vendas para Enterprise.", - "pricing.section.billingPeriod": "Período de faturação", + "home.product.p4.detail": "Export · Woo · API", + "pricing.section.badge": "Capacidade de SKU + créditos de IA", + "pricing.section.title": "Comece grátis. Escala quando o catálogo crescer.", + "pricing.section.lead": "O Free inclui mapeamento de feeds, limpeza básica de produto e rótulos energéticos da UE (EPREL) até 100 SKUs (sem créditos de IA). Os planos pagos adicionam títulos e descrições com IA, mais capacidade e opções de exportação — Starter, Growth, Business, ou fale com as vendas para Enterprise.", + "pricing.section.billingPeriod": "Período de faturação", "pricing.section.monthly": "Mensal", "pricing.section.yearly": "Anual", "pricing.section.savePercent": "Poupe 20%", - "pricing.section.publicBefore": "Planos públicos: Free, Starter, Growth, Business e Enterprise. Crie uma conta Free e depois faça upgrade em", + "pricing.section.publicBefore": "Planos públicos: Free, Starter, Growth, Business e Enterprise. Crie uma conta Free e depois faça upgrade em", "pricing.section.publicOr": "ou", "pricing.section.publicAfter": "via Stripe Checkout. O Enterprise continua a ser gerido pelas vendas.", "pricing.section.plansLink": "Planos", - "pricing.section.billingLink": "Faturação", - "pricing.section.capabilitiesTitle": "Para que está pensado cada plano", - "pricing.section.capabilitiesLead": "Importe feeds, enriqueça o catálogo e depois exporte ou sincronize com o WooCommerce", + "pricing.section.billingLink": "Faturação", + "pricing.section.capabilitiesTitle": "Para que está pensado cada plano", + "pricing.section.capabilitiesLead": "Importe feeds, enriqueça o catálogo e depois exporte ou sincronize com o WooCommerce", "pricing.section.faqTitle": "Perguntas frequentes", "pricing.section.readyTitle": "Pronto para mapear o seu primeiro feed?", - "pricing.section.readyLead": "Crie uma conta Free — sem cartão. Já tem uma? Abra a app ou compare planos.", + "pricing.section.readyLead": "Crie uma conta Free — sem cartão. Já tem uma? Abra a app ou compare planos.", "pricing.section.contactSales": "Contactar vendas", - "pricing.cap.feeds": "De feeds a catálogo", + "pricing.cap.feeds": "De feeds a catálogo", "pricing.cap.feeds.f1": "Feeds de fornecedor CSV / XML / URL", - "pricing.cap.feeds.f2": "Mapeamento e validação de campos", - "pricing.cap.feeds.f3": "Fusão multi-fornecedor", - "pricing.cap.feeds.f4": "Sincronização agendada", - "pricing.cap.feeds.f5": "Transformações com base na categoria", + "pricing.cap.feeds.f2": "Mapeamento e validação de campos", + "pricing.cap.feeds.f3": "Fusão multi-fornecedor", + "pricing.cap.feeds.f4": "Sincronização agendada", + "pricing.cap.feeds.f5": "Transformações com base na categoria", "pricing.cap.processing": "Processamento e IA", "pricing.cap.processing.f1": "Limpeza de dados e preenchimento de atributos (todos os planos)", - "pricing.cap.processing.f2": "Títulos e descrições com IA (planos pagos)", - "pricing.cap.processing.f3": "Rótulos energéticos UE / EPREL (todos os planos)", - "pricing.cap.processing.f4": "Fórmulas, voz de marca, variáveis", - "pricing.cap.processing.f5": "Créditos geridos ou a sua própria chave de IA", - "pricing.cap.export": "Exportação e canais", - "pricing.cap.export.f1": "Feeds de exportação XML / CSV", + "pricing.cap.processing.f2": "Títulos e descrições com IA (planos pagos)", + "pricing.cap.processing.f3": "Rótulos energéticos UE / EPREL (todos os planos)", + "pricing.cap.processing.f4": "Fórmulas, voz de marca, variáveis", + "pricing.cap.processing.f5": "Créditos geridos ou a sua própria chave de IA", + "pricing.cap.export": "Exportação e canais", + "pricing.cap.export.f1": "Feeds de exportação XML / CSV", "pricing.cap.export.f2": "Sync WooCommerce / Shopify", "pricing.cap.export.f3": "API completa", - "pricing.cap.export.f4": "Formatos específicos por canal", - "pricing.cap.export.f5": "Atualizações em massa", + "pricing.cap.export.f4": "Formatos específicos por canal", + "pricing.cap.export.f5": "Atualizações em massa", "pricing.cap.limits": "Limites e controlo", "pricing.cap.limits.f1": "Limites de SKU (produtos)", - "pricing.cap.limits.f2": "Pacotes mensais de créditos de IA", - "pricing.cap.limits.f3": "Funções e convites de equipa", - "pricing.cap.limits.f4": "Opções de SLA Enterprise", - "pricing.faq.credits.q": "O que são créditos de IA?", - "pricing.faq.credits.a": "Os créditos de IA pagam passos como gerar títulos e descrições. O Free inclui 0 créditos de IA — ainda pode mapear feeds e limpar dados. Pacotes mensais pagos: Starter 150, Plus 500, Growth 1.200, Business 4.000, Scale 8.000. O Enterprise inclui um grande pacote gerido (e a sua própria chave). A partir do Growth, pode opcionalmente usar a sua chave em vez dos créditos geridos.", + "pricing.cap.limits.f2": "Pacotes mensais de créditos de IA", + "pricing.cap.limits.f3": "Funções e convites de equipa", + "pricing.cap.limits.f4": "Opções de SLA Enterprise", + "pricing.faq.credits.q": "O que são créditos de IA?", + "pricing.faq.credits.a": "Os créditos de IA pagam passos como gerar títulos e descrições. O Free inclui 0 créditos de IA — ainda pode mapear feeds e limpar dados. Pacotes mensais pagos: Starter 150, Plus 500, Growth 1.200, Business 4.000, Scale 8.000. O Enterprise inclui um grande pacote gerido (e a sua própria chave). A partir do Growth, pode opcionalmente usar a sua chave em vez dos créditos geridos.", "pricing.faq.packs.q": "Can I buy extra AI credits?", "pricing.faq.packs.a": "Yes. One-time packs: Starter $19 / 500 credits, Growth $59 / 2,000, Catalog $199 / 10,000, Scale $599 / 40,000. Buy from Billing after you have a paid plan (or Free with leftover trial credits). Packs do not change your SKU or feed limits.", - "pricing.faq.limits.q": "O que acontece se atingir o limite de produtos ou créditos?", - "pricing.faq.limits.a": "Avisamos quando se aproximar. Quando atingir o teto de produtos ou ficar sem créditos de IA, os trabalhos que precisam dessa capacidade pausam até libertar espaço, esperar o ciclo seguinte ou fazer upgrade.", + "pricing.faq.limits.q": "O que acontece se atingir o limite de produtos ou créditos?", + "pricing.faq.limits.a": "Avisamos quando se aproximar. Quando atingir o teto de produtos ou ficar sem créditos de IA, os trabalhos que precisam dessa capacidade pausam até libertar espaço, esperar o ciclo seguinte ou fazer upgrade.", "pricing.faq.change.q": "Posso fazer upgrade ou downgrade?", - "pricing.faq.change.a": "Sim. Comece no Free e depois passe para Starter, Plus, Growth, Business ou Scale em Planos ou Faturação (Stripe Checkout). O Enterprise é sempre gerido pelas vendas.", + "pricing.faq.change.a": "Sim. Comece no Free e depois passe para Starter, Plus, Growth, Business ou Scale em Planos ou Faturação (Stripe Checkout). O Enterprise é sempre gerido pelas vendas.", "pricing.faq.free.q": "O que inclui o Free?", - "pricing.faq.free.a": "Free para sempre: 50 produtos, um feed, limpeza de dados e preenchimento de atributos, rótulos energéticos UE (EPREL — dados públicos, sem créditos), mais uma exportação manual — com 0 créditos de IA. Sem cartão. Faça upgrade quando precisar de títulos e descrições com IA ou de mais capacidade.", - "pricing.faq.why.q": "Porque não pagar por produto como as ferramentas só de conteúdo?", - "pricing.faq.why.a": "A Descrybe cobre o caminho completo do feed de fornecedor ao catálogo até ao WooCommerce ou exportação — não só textos com IA. Paga pela capacidade da plataforma (produtos e feeds); a IA é uma camada de utilização por cima.", - "pricing.faq.annual.q": "Como funciona a faturação anual?", - "pricing.faq.annual.a": "A faturação anual é cerca de 20% menos do que o preço mensal. Comece grátis e escolha anual no Checkout ao fazer upgrade (ou contacte as vendas).", + "pricing.faq.free.a": "Free para sempre: 50 produtos, um feed, limpeza de dados e preenchimento de atributos, rótulos energéticos UE (EPREL — dados públicos, sem créditos), mais uma exportação manual — com 0 créditos de IA. Sem cartão. Faça upgrade quando precisar de títulos e descrições com IA ou de mais capacidade.", + "pricing.faq.why.q": "Porque não pagar por produto como as ferramentas só de conteúdo?", + "pricing.faq.why.a": "A Descrybe cobre o caminho completo do feed de fornecedor ao catálogo até ao WooCommerce ou exportação — não só textos com IA. Paga pela capacidade da plataforma (produtos e feeds); a IA é uma camada de utilização por cima.", + "pricing.faq.annual.q": "Como funciona a faturação anual?", + "pricing.faq.annual.a": "A faturação anual é cerca de 20% menos do que o preço mensal. Comece grátis e escolha anual no Checkout ao fazer upgrade (ou contacte as vendas).", "pricing.calc.badge": "Plan calculator", "pricing.calc.title": "Find the right plan", "pricing.calc.lead": "Enter feeds, catalog size, and how many products you want to enhance with AI (count each language pass).", @@ -5265,12 +5266,12 @@ export const pt: MessageDict = { "pricing.calc.skus": "Catalog products (SKUs)", "pricing.calc.skusHint": "Total products you will store and process", "pricing.calc.aiVolume": "AI process volume", - "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", + "pricing.calc.aiHint": "Roughly products × languages you want to enhance per month", "pricing.calc.recommendedLabel": "Recommended", "pricing.calc.budgetLabel": "Budget option", "pricing.calc.coversCredits": "Needs about {count} AI credits / month", "pricing.calc.aiIncluded": "Included monthly credits cover this AI volume", - "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", + "pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall", "pricing.calc.orYearly": "or ~{amount}/mo yearly", "pricing.calc.budgetNote": "Lower list price with yearly discount and/or credit packs when that still fits.", "pricing.calc.noBudget": "The recommended plan is already the leanest fit for these inputs.", @@ -5281,26 +5282,26 @@ export const pt: MessageDict = { "pricing.card.mostPopular": "Mais popular", "pricing.card.custom": "Personalizado", "pricing.card.forever": "para sempre", - "pricing.card.perMonth": "mês", + "pricing.card.perMonth": "mês", "pricing.card.perYear": "ano", - "pricing.card.savePerMonth": "Poupe ${amount}/mês", + "pricing.card.savePerMonth": "Poupe ${amount}/mês", "pricing.card.discountBadge": "-20%", "pricing.card.unlimitedSkus": "SKUs ilimitados", "pricing.card.oneMSkus": "Mais de 1M de SKUs", - "pricing.card.upToSkus": "Até {count} SKUs", - "pricing.card.unlimitedAi": "Créditos de IA ilimitados", - "pricing.card.zeroCredits": "0 créditos de IA / mês", - "pricing.card.creditsPerMonth": "{count} créditos de IA / mês", + "pricing.card.upToSkus": "Até {count} SKUs", + "pricing.card.unlimitedAi": "Créditos de IA ilimitados", + "pricing.card.zeroCredits": "0 créditos de IA / mês", + "pricing.card.creditsPerMonth": "{count} créditos de IA / mês", "pricing.card.showLess": "Mostrar menos", "pricing.card.showMoreFeature": "Mostrar mais {count} funcionalidade", "pricing.card.showMoreFeatures": "Mostrar mais {count} funcionalidades", "pricing.card.upgradeTo": "Fazer upgrade para {name}", - "pricing.plan.free.description": "Mapeie um feed de amostra e limpe dados de produto — sem cartão", - "pricing.plan.starter.description": "Catálogos pequenos que precisam de títulos e descrições com IA", - "pricing.plan.plus.description": "Mais produtos, feeds e IA para catálogos em crescimento", - "pricing.plan.growth.description": "Feeds multi-fornecedor para lojas e exportações shopping", - "pricing.plan.business.description": "Catálogos mid-market com BYOK", - "pricing.plan.scale.description": "Catálogos à escala de distribuidor com suporte prioritário", + "pricing.plan.free.description": "Mapeie um feed de amostra e limpe dados de produto — sem cartão", + "pricing.plan.starter.description": "Catálogos pequenos que precisam de títulos e descrições com IA", + "pricing.plan.plus.description": "Mais produtos, feeds e IA para catálogos em crescimento", + "pricing.plan.growth.description": "Feeds multi-fornecedor para lojas e exportações shopping", + "pricing.plan.business.description": "Catálogos mid-market com BYOK", + "pricing.plan.scale.description": "Catálogos à escala de distribuidor com suporte prioritário", "pricing.plan.enterprise.description": "Capacidade ilimitada, SLA e uma equipa de conta dedicada", "pricing.feature.credits100": "100 AI credits / month (~50% catalog cover)", "pricing.feature.credits100starter": "100 AI credits / month (~50% catalog cover)", @@ -5316,7 +5317,7 @@ export const pt: MessageDict = { "pricing.feature.upTo15kSkus": "Up to 15,000 SKUs", "pricing.feature.credits15000": "15,000 AI credits / month (~75% catalog cover)", "pricing.feature.credits60000": "60,000 AI credits / month (~75% catalog cover)", - "pricing.feature.upTo50Skus": "Até 50 SKUs", + "pricing.feature.upTo50Skus": "Até 50 SKUs", "pricing.feature.upTo100Skus": "Up to 100 SKUs", "pricing.feature.upTo400Skus": "Up to 400 SKUs", "pricing.feature.upTo1200Skus": "Up to 1,200 SKUs", @@ -5330,18 +5331,18 @@ export const pt: MessageDict = { "pricing.feature.twelveFeedSources": "12 feed sources", "pricing.feature.twentyFiveFeedSources": "25 feed sources", "pricing.feature.cleanData": "Limpe dados, analise specs e preencha campos", - "pricing.feature.eprel": "Rótulos energéticos UE (EPREL)", - "pricing.feature.zeroCredits": "0 créditos de IA / mês", - "pricing.feature.oneManualExport": "1 feed de exportação manual", + "pricing.feature.eprel": "Rótulos energéticos UE (EPREL)", + "pricing.feature.zeroCredits": "0 créditos de IA / mês", + "pricing.feature.oneManualExport": "1 feed de exportação manual", "pricing.feature.twoExports": "2 export feeds", "pricing.feature.fourExports": "4 export feeds", - "pricing.feature.wooTestOnly": "Apenas teste de ligação WooCommerce", - "pricing.feature.upTo2Seats": "Até 2 lugares", - "pricing.feature.aiTitles": "Títulos e descrições com IA", + "pricing.feature.wooTestOnly": "Apenas teste de ligação WooCommerce", + "pricing.feature.upTo2Seats": "Até 2 lugares", + "pricing.feature.aiTitles": "Títulos e descrições com IA", "pricing.feature.liveStoreSync": "Sync em direto com a loja", - "pricing.feature.apiAccess": "Acesso à API", - "pricing.feature.byok": "Traga a sua própria chave de IA", - "pricing.feature.upTo500Skus": "Até 500 SKUs", + "pricing.feature.apiAccess": "Acesso à API", + "pricing.feature.byok": "Traga a sua própria chave de IA", + "pricing.feature.upTo500Skus": "Até 500 SKUs", "pricing.feature.upTo1000Skus": "Up to 1,000 SKUs", "pricing.feature.fiveFeedSources": "5 feed sources", "pricing.feature.fiveExports": "5 export feeds", @@ -5355,14 +5356,14 @@ export const pt: MessageDict = { "pricing.feature.credits12500": "12,500 AI credits / month (~25% catalog cover)", "pricing.feature.credits30000": "30,000 AI credits / month (~20% catalog cover)", "pricing.feature.upTo75kSkus": "Up to 75,000 SKUs", - "pricing.feature.threeExports": "3 feeds de exportação", + "pricing.feature.threeExports": "3 feeds de exportação", "pricing.feature.sixExports": "6 export feeds", "pricing.feature.tenExports": "10 export feeds", "pricing.feature.fullWooSync": "Sync completa WooCommerce", - "pricing.feature.readApi": "Acesso de leitura à API", + "pricing.feature.readApi": "Acesso de leitura à API", "pricing.feature.emailSupport": "Suporte por email", "pricing.feature.creditPacks": "Buy extra AI credit packs", - "pricing.feature.upTo2500Skus": "Até 2.500 SKUs", + "pricing.feature.upTo2500Skus": "Até 2.500 SKUs", "pricing.feature.upTo1500Skus": "Up to 1,500 SKUs", "pricing.feature.upTo3500Skus": "Up to 3,500 SKUs", "pricing.feature.upTo9500Skus": "Up to 9,500 SKUs", @@ -5370,54 +5371,54 @@ export const pt: MessageDict = { "pricing.feature.upTo55kSkus": "Up to 55,000 SKUs", "pricing.feature.upTo5000Skus": "Up to 5,000 SKUs", "pricing.feature.eightFeedSources": "8 fontes de feed", - "pricing.feature.credits500": "500 créditos de IA / mês", + "pricing.feature.credits500": "500 créditos de IA / mês", "pricing.feature.credits1250": "1,250 AI credits / month (~25% catalog cover)", "pricing.feature.credits5000": "5,000 AI credits / month (~25% catalog cover)", - "pricing.feature.eightExports": "8 feeds de exportação", + "pricing.feature.eightExports": "8 feeds de exportação", "pricing.feature.fifteenExports": "15 export feeds", "pricing.feature.wooShopifySync": "Sync completa WooCommerce + Shopify", - "pricing.feature.upTo10kSkus": "Até 10.000 SKUs", + "pricing.feature.upTo10kSkus": "Até 10.000 SKUs", "pricing.feature.upTo25kSkus": "Up to 25,000 SKUs", "pricing.feature.fifteenFeedSources": "15 fontes de feed", "pricing.feature.tenFeedSources": "10 feed sources", "pricing.feature.twentyFeedSources": "20 feed sources", "pricing.feature.thirtyFeedSources": "30 feed sources", - "pricing.feature.credits1200": "1.200 créditos de IA / mês", + "pricing.feature.credits1200": "1.200 créditos de IA / mês", "pricing.feature.credits10000": "10,000 AI credits / month (~50% catalog cover)", "pricing.feature.credits25000": "25,000 AI credits / month (~50% catalog cover)", - "pricing.feature.twentyExports": "20 feeds de exportação", + "pricing.feature.twentyExports": "20 feeds de exportação", "pricing.feature.fortyExports": "40 export feeds", - "pricing.feature.fullFormulas": "Fórmulas e variáveis completas", - "pricing.feature.fullApi": "Acesso completo à API", + "pricing.feature.fullFormulas": "Fórmulas e variáveis completas", + "pricing.feature.fullApi": "Acesso completo à API", "pricing.feature.byokAddon": "Add-on bring-your-own-key", "pricing.feature.emailSupport24h": "Suporte por email (24h)", - "pricing.feature.upTo40kSkus": "Até 40.000 SKUs", + "pricing.feature.upTo40kSkus": "Até 40.000 SKUs", "pricing.feature.upTo50kSkus": "Up to 50,000 SKUs", "pricing.feature.fortyFeedSources": "40 fontes de feed", "pricing.feature.fiftyFeedSources": "50 feed sources", - "pricing.feature.credits4000": "4.000 créditos de IA / mês", + "pricing.feature.credits4000": "4.000 créditos de IA / mês", "pricing.feature.credits40000": "40,000 AI credits / month (~50% catalog cover)", "pricing.feature.credits50000half": "50,000 AI credits / month (~50% catalog cover)", - "pricing.feature.unlimitedExports": "Feeds de exportação ilimitados", + "pricing.feature.unlimitedExports": "Feeds de exportação ilimitados", "pricing.feature.fullApiWebhooks": "API completa", - "pricing.feature.byokIncluded": "A sua chave de IA incluída", - "pricing.feature.priorityEmail": "Suporte prioritário por email", - "pricing.feature.upTo100kSkus": "Até 100.000 SKUs", + "pricing.feature.byokIncluded": "A sua chave de IA incluída", + "pricing.feature.priorityEmail": "Suporte prioritário por email", + "pricing.feature.upTo100kSkus": "Até 100.000 SKUs", "pricing.feature.upTo150kSkus": "Up to 150,000 SKUs", "pricing.feature.hundredFeedSources": "100 fontes de feed", "pricing.feature.hundredFiftyFeedSources": "150 feed sources", - "pricing.feature.credits8000": "8.000 créditos de IA / mês", + "pricing.feature.credits8000": "8.000 créditos de IA / mês", "pricing.feature.credits50000": "50,000 AI credits / month (~25% catalog cover)", "pricing.feature.credits120000": "120,000 AI credits / month (~40% catalog cover)", - "pricing.feature.prioritySlack": "Suporte prioritário + Slack", + "pricing.feature.prioritySlack": "Suporte prioritário + Slack", "pricing.feature.unlimitedSkus": "SKUs ilimitados", "pricing.feature.unlimitedFeeds": "Fontes de feed ilimitadas", - "pricing.feature.unlimitedAiOwnKey": "Créditos de IA ilimitados / chave própria", + "pricing.feature.unlimitedAiOwnKey": "Créditos de IA ilimitados / chave própria", "pricing.feature.ssoWebhooksAm": "SSO, gestor de conta dedicado", - "pricing.feature.customIntegrations": "Integrações à medida", - "pricing.feature.slaPriority": "SLA e suporte prioritário", + "pricing.feature.customIntegrations": "Integrações à medida", + "pricing.feature.slaPriority": "SLA e suporte prioritário", "pricing.pack.tiny.name": "Nano pack", - "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", + "pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)", "pricing.pack.small.name": "Starter pack", "pricing.pack.small.desc": "Extra AI for fixes and tests (~250 products)", "pricing.pack.medium.name": "Growth pack", @@ -5427,98 +5428,98 @@ export const pt: MessageDict = { "pricing.pack.xl.name": "Scale pack", "pricing.pack.xl.desc": "Heavy usage / agency bursts (~20,000 products)", "pricing.pack.xxl.name": "Business pack", - "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", + "pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)", "pricing.pack.mega.name": "Scale pack", - "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", - "pricing.section.faqDescription": "Respostas diretas sobre planos, créditos e o que o Free inclui.", + "pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)", + "pricing.section.faqDescription": "Respostas diretas sobre planos, créditos e o que o Free inclui.", "billing.buyCreditPacks": "Buy AI credit packs", - "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", - "billing.packCredits": "{credits} créditos", + "billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.", + "billing.packCredits": "{credits} créditos", "billing.packApproxProducts": "~{count} AI products", "billing.buyPack": "Buy", - "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", + "billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.", "billing.packCheckoutFailed": "Could not start credit pack checkout.", "empty.default.noItems": "Nenhum item encontrado.", "settings.tabLockedHint": "Not on your plan", "stores.connectorLocked": "Not on your plan", "stores.connectorUpgrade": "Upgrade to unlock", - "plan.upgrade.title": "Esta funcionalidade não está no seu plano", - "plan.upgrade.message": "Faça upgrade para desbloquear esta parte do Descrybe.", - "plan.upgrade.defaultMessage": "O seu plano atual não inclui esta parte do Descrybe. Faça upgrade para a desbloquear, ou peça a um administrador da empresa se não puder alterar a faturação.", - "plan.upgrade.sectionOff.title": "Esta funcionalidade está temporariamente indisponível", - "plan.upgrade.sectionOff.message": "Esta parte do Descrybe está desativada na plataforma neste momento. Não é um problema de upgrade — tente mais tarde ou contacte o suporte.", + "plan.upgrade.title": "Esta funcionalidade não está no seu plano", + "plan.upgrade.message": "Faça upgrade para desbloquear esta parte do Descrybe.", + "plan.upgrade.defaultMessage": "O seu plano atual não inclui esta parte do Descrybe. Faça upgrade para a desbloquear, ou peça a um administrador da empresa se não puder alterar a faturação.", + "plan.upgrade.sectionOff.title": "Esta funcionalidade está temporariamente indisponível", + "plan.upgrade.sectionOff.message": "Esta parte do Descrybe está desativada na plataforma neste momento. Não é um problema de upgrade — tente mais tarde ou contacte o suporte.", "plan.upgrade.sectionOff.cta": "Voltar ao painel", - "plan.upgrade.stores.message": "Os conectores WooCommerce e Shopify precisam de um plano que inclua Lojas. Faça upgrade para ligar essas lojas — ou continue com feeds e a API no plano atual.", + "plan.upgrade.stores.message": "Os conectores WooCommerce e Shopify precisam de um plano que inclua Lojas. Faça upgrade para ligar essas lojas — ou continue com feeds e a API no plano atual.", "plan.upgrade.stillWorks.title": "O que ainda funciona no seu plano", "plan.upgrade.stillWorks.feeds.label": "Feeds de entrada", - "plan.upgrade.stillWorks.feeds.description": "Adicione URLs CSV ou XML e carregamentos de ficheiros para sincronizar catálogos sem conectores de loja.", - "plan.upgrade.stillWorks.export.label": "Feeds de exportação", - "plan.upgrade.stillWorks.export.description": "Gere feeds de saída para canais de compras e parceiros.", + "plan.upgrade.stillWorks.feeds.description": "Adicione URLs CSV ou XML e carregamentos de ficheiros para sincronizar catálogos sem conectores de loja.", + "plan.upgrade.stillWorks.export.label": "Feeds de exportação", + "plan.upgrade.stillWorks.export.description": "Gere feeds de saída para canais de compras e parceiros.", "plan.upgrade.stillWorks.processing.label": "Tarefas em segundo plano", - "plan.upgrade.stillWorks.processing.description": "Monitorize trabalhos de IA e catálogo em Processamento — disponíveis no seu plano mesmo sem conectores de loja.", + "plan.upgrade.stillWorks.processing.description": "Monitorize trabalhos de IA e catálogo em Processamento — disponíveis no seu plano mesmo sem conectores de loja.", "plan.upgrade.stillWorks.api.label": "Chaves API", - "plan.upgrade.stillWorks.api.description": "Crie uma chave em Definições para usar /api/v1 — o segredo só é mostrado uma vez.", + "plan.upgrade.stillWorks.api.description": "Crie uma chave em Definições para usar /api/v1 — o segredo só é mostrado uma vez.", "plan.upgrade.stillWorks.docs.label": "Docs da API", - "plan.upgrade.stillWorks.docs.description": "Leia a visão geral da API e integre sem WooCommerce nem Shopify.", + "plan.upgrade.stillWorks.docs.description": "Leia a visão geral da API e integre sem WooCommerce nem Shopify.", "plan.upgrade.feature.settings.api_keys": "As chaves API precisam de um plano pago", - "plan.upgrade.feature.catalog.products.process_ai_titles": "Títulos com IA são uma funcionalidade paga", - "plan.upgrade.feature.catalog.products.process_ai_descriptions": "Descrições com IA são uma funcionalidade paga", + "plan.upgrade.feature.catalog.products.process_ai_titles": "Títulos com IA são uma funcionalidade paga", + "plan.upgrade.feature.catalog.products.process_ai_descriptions": "Descrições com IA são uma funcionalidade paga", "plan.upgrade.feature.marketing.campaigns.generate_ai": "A IA de campanhas precisa de um plano pago", "plan.upgrade.feature.marketing.campaigns.send": "O envio real de campanhas precisa de um plano pago", "plan.upgrade.feature.marketing.brand_ai_apply": "A voz da marca na IA precisa de um plano pago", "plan.upgrade.feature.marketing.seo.ai_rewrite": "A reescrita SEO com IA precisa de um plano pago", - "plan.upgrade.feature.integrations.ai.byok": "Trazer a sua própria chave de IA começa no Growth", - "plan.upgrade.feature.capability.byok": "Trazer a sua própria chave de IA começa no Growth", - "plan.upgrade.feature.marketing.campaigns": "As campanhas não estão no seu plano", - "plan.upgrade.feature.marketing.content_calendar": "O calendário de conteúdos não está no seu plano", - "plan.upgrade.feature.marketing.seo": "As ferramentas SEO não estão no seu plano", - "plan.upgrade.feature.marketing.brand_kit": "O kit de marca não está no seu plano", - "plan.upgrade.feature.marketing.reviews": "As avaliações não estão no seu plano", - "plan.upgrade.feature.integrations.ai": "As integrações de IA não estão no seu plano", - "plan.upgrade.feature.integrations.email": "O envio de email não está no seu plano", - "plan.upgrade.feature.processing.monitor": "O processamento não está no seu plano", - "plan.upgrade.feature.stores.hub": "Os conectores de loja não estão no seu plano", - "plan.upgrade.feature.stores.woocommerce": "O WooCommerce não está no seu plano", - "plan.upgrade.feature.stores.shopify": "O Shopify não está no seu plano", - "plan.upgrade.feature.support.center": "O Centro de suporte não está no seu plano", - "plan.upgrade.feature.support.ticket_create": "Criar tickets de suporte não está no seu plano", - "plan.upgrade.feature.support.ticket_thread": "Os tópicos de tickets de suporte não estão no seu plano", - "plan.upgrade.feature.catalog.structured_descriptions": "As descrições estruturadas não estão no seu plano", - "plan.upgrade.feature.catalog.vector_categories": "As categorias vetoriais não estão no seu plano", - "plan.checkingAccess": "A verificar o acesso ao plano…", + "plan.upgrade.feature.integrations.ai.byok": "Trazer a sua própria chave de IA começa no Growth", + "plan.upgrade.feature.capability.byok": "Trazer a sua própria chave de IA começa no Growth", + "plan.upgrade.feature.marketing.campaigns": "As campanhas não estão no seu plano", + "plan.upgrade.feature.marketing.content_calendar": "O calendário de conteúdos não está no seu plano", + "plan.upgrade.feature.marketing.seo": "As ferramentas SEO não estão no seu plano", + "plan.upgrade.feature.marketing.brand_kit": "O kit de marca não está no seu plano", + "plan.upgrade.feature.marketing.reviews": "As avaliações não estão no seu plano", + "plan.upgrade.feature.integrations.ai": "As integrações de IA não estão no seu plano", + "plan.upgrade.feature.integrations.email": "O envio de email não está no seu plano", + "plan.upgrade.feature.processing.monitor": "O processamento não está no seu plano", + "plan.upgrade.feature.stores.hub": "Os conectores de loja não estão no seu plano", + "plan.upgrade.feature.stores.woocommerce": "O WooCommerce não está no seu plano", + "plan.upgrade.feature.stores.shopify": "O Shopify não está no seu plano", + "plan.upgrade.feature.support.center": "O Centro de suporte não está no seu plano", + "plan.upgrade.feature.support.ticket_create": "Criar tickets de suporte não está no seu plano", + "plan.upgrade.feature.support.ticket_thread": "Os tópicos de tickets de suporte não estão no seu plano", + "plan.upgrade.feature.catalog.structured_descriptions": "As descrições estruturadas não estão no seu plano", + "plan.upgrade.feature.catalog.vector_categories": "As categorias vetoriais não estão no seu plano", + "plan.checkingAccess": "A verificar o acesso ao plano…", "upgradeBanner.comparePlans": "Comparar planos", "upgradeBanner.talkToSales": "Falar com vendas", "commandPalette.closeAria": "Fechar pesquisa", - "commandPalette.ariaLabel": "Pesquisar páginas", - "commandPalette.placeholder": "Pesquisar páginas…", - "commandPalette.searchAria": "Pesquisar páginas", - "commandPalette.destinationsAria": "Páginas", - "commandPalette.noMatches": "Nenhuma página correspondente", - "commandPalette.announceIdleOne": "Pesquisa. {count} página.", - "commandPalette.announceIdleMany": "Pesquisa. {count} páginas.", - "commandPalette.announceNone": "Nenhuma página correspondente.", - "commandPalette.announceMatchOne": "{count} página correspondente.", - "commandPalette.announceMatchMany": "{count} páginas correspondentes.", + "commandPalette.ariaLabel": "Pesquisar páginas", + "commandPalette.placeholder": "Pesquisar páginas…", + "commandPalette.searchAria": "Pesquisar páginas", + "commandPalette.destinationsAria": "Páginas", + "commandPalette.noMatches": "Nenhuma página correspondente", + "commandPalette.announceIdleOne": "Pesquisa. {count} página.", + "commandPalette.announceIdleMany": "Pesquisa. {count} páginas.", + "commandPalette.announceNone": "Nenhuma página correspondente.", + "commandPalette.announceMatchOne": "{count} página correspondente.", + "commandPalette.announceMatchMany": "{count} páginas correspondentes.", "vector.title": "Teste de categorias vetoriais", - "vector.description": "Pesquise o índice de categorias vetoriais quando o Pinecone estiver configurado. Criar índice e inicializar ainda não estão disponíveis na v2.", - "vector.probing": "A verificar a API de categorias vetoriais…", - "vector.unavailable": "As categorias vetoriais ainda não estão neste backend. Não há nada a executar aqui até /api/vector-categories/* estar ligado.", + "vector.description": "Pesquise o índice de categorias vetoriais quando o Pinecone estiver configurado. Criar índice e inicializar ainda não estão disponíveis na v2.", + "vector.probing": "A verificar a API de categorias vetoriais…", + "vector.unavailable": "As categorias vetoriais ainda não estão neste backend. Não há nada a executar aqui até /api/vector-categories/* estar ligado.", "vector.browseCategories": "Explorar categorias", "vector.initHeading": "Inicializar base de dados vetorial", - "vector.initComingSoon": "Criar índice e Inicializar BD vetorial ainda não estão disponíveis na v2 (em breve). A pesquisa continua a funcionar quando o Pinecone está configurado.", - "vector.createIndex": "Criar índice", + "vector.initComingSoon": "Criar índice e Inicializar BD vetorial ainda não estão disponíveis na v2 (em breve). A pesquisa continua a funcionar quando o Pinecone está configurado.", + "vector.createIndex": "Criar índice", "vector.initDb": "Inicializar BD vetorial", "vector.searchHeading": "Pesquisar categorias", - "vector.searchPlaceholder": "Introduza a descrição do produto…", + "vector.searchPlaceholder": "Introduza a descrição do produto…", "vector.results": "Resultados:", "vector.categoryLabel": "Categoria:", "vector.idLabel": "ID:", - "vector.scoreLabel": "Pontuação:", - "switcher.switching": "A mudar…", + "vector.scoreLabel": "Pontuação:", + "switcher.switching": "A mudar…", "switcher.returnTo": "Voltar a {email}", "switcher.switchUser": "Mudar de utilizador", - "switcher.loadingUsers": "A carregar utilizadores…", - "switcher.empty": "Nenhum utilizador comutável encontrado.", + "switcher.loadingUsers": "A carregar utilizadores…", + "switcher.empty": "Nenhum utilizador comutável encontrado.", "switcher.noCompany": "Sem empresa", "switcher.unknownCompany": "Empresa desconhecida", "companySwitcher.select": "Selecionar empresa", @@ -5527,13 +5528,13 @@ export const pt: MessageDict = { "companySwitcher.returnTo": "Voltar para {name}", "companySwitcher.returnHome": "Voltar para a empresa de origem", "storeReconnect.primaryLabel": "Reconectar loja", - "storeReconnect.titlePlural": "Reconectar lojas após a migração", - "storeReconnect.titleChannel": "Reconectar {channel} após a migração", - "storeReconnect.titleSingular": "Reconectar loja após a migração", - "storeReconnect.messageWithItems": "As credenciais da API da loja não foram transferidas (ou não podem ser usadas) após a migração da plataforma. Isto não é uma sincronização avariada — reconecte cada loja e depois Teste a ligação antes de enfileirar uma sincronização.", - "storeReconnect.messageSingle": "As credenciais da API de {channel} não foram transferidas (ou não podem ser usadas) após a migração da plataforma. Isto não é uma sincronização avariada — cole credenciais novas, Guarde e depois Teste a ligação antes de enfileirar uma sincronização.", + "storeReconnect.titlePlural": "Reconectar lojas após a migração", + "storeReconnect.titleChannel": "Reconectar {channel} após a migração", + "storeReconnect.titleSingular": "Reconectar loja após a migração", + "storeReconnect.messageWithItems": "As credenciais da API da loja não foram transferidas (ou não podem ser usadas) após a migração da plataforma. Isto não é uma sincronização avariada — reconecte cada loja e depois Teste a ligação antes de enfileirar uma sincronização.", + "storeReconnect.messageSingle": "As credenciais da API de {channel} não foram transferidas (ou não podem ser usadas) após a migração da plataforma. Isto não é uma sincronização avariada — cole credenciais novas, Guarde e depois Teste a ligação antes de enfileirar uma sincronização.", "storeReconnect.channelFallback": "Loja", - "storeReconnect.askAdmin": "Peça a um administrador da empresa para reconectar — só os administradores podem guardar credenciais da loja.", + "storeReconnect.askAdmin": "Peça a um administrador da empresa para reconectar — só os administradores podem guardar credenciais da loja.", "storeReconnect.reconnectItem": "Reconectar {label}", "admin.storeReconnect.channel.other": "Other", "admin.storeReconnect.channel.woocommerce": "WooCommerce", @@ -5556,7 +5557,7 @@ export const pt: MessageDict = { "admin.storeReconnect.listTitle": "Connected but invalid", "admin.storeReconnect.metric.showing": "Rows shown", "admin.storeReconnect.metric.total": "Gaps total", - "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", + "admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.", "admin.storeReconnect.loadFailed": "Could not load store reconnect inventory.", "admin.storeReconnect.refresh": "Refresh", "admin.storeReconnect.description": "Companies with a connected store identity but missing or unusable API credentials (cutover credential gaps).", @@ -5564,37 +5565,37 @@ export const pt: MessageDict = { "admin.nav.storeReconnect": "Store reconnect", "storeReconnect.wizardHint": "Prefer a step-by-step flow? Open Guided setup (/stores/wizard), or reconnect the channel below and Test Connection before syncing.", "storeReconnect.wizardLabel": "Guided setup", - "storeReconnect.reviewsHint": "A importação de avaliações não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", - "storeReconnect.ordersHint": "A importação de encomendas não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", - "productSync.directionTitle": "Produtos: Descrybe → loja", - "productSync.outbound": "Descrybe → {channel}", - "productSync.outboundBody": "— envia produtos Descrybe processados para a loja (criar ou atualizar produtos remotos correspondentes). Não importa o catálogo da loja para o Descrybe.", - "productSync.firstSync": "Primeira sincronização", - "productSync.firstSyncBody": "— produtos sem correspondência são criados em {channel}. Sincronizações posteriores atualizam produtos já ligados por id ou estratégia de correspondência.", + "storeReconnect.reviewsHint": "A importação de avaliações não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", + "storeReconnect.ordersHint": "A importação de encomendas não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", + "productSync.directionTitle": "Produtos: Descrybe → loja", + "productSync.outbound": "Descrybe → {channel}", + "productSync.outboundBody": "— envia produtos Descrybe processados para a loja (criar ou atualizar produtos remotos correspondentes). Não importa o catálogo da loja para o Descrybe.", + "productSync.firstSync": "Primeira sincronização", + "productSync.firstSyncBody": "— produtos sem correspondência são criados em {channel}. Sincronizações posteriores atualizam produtos já ligados por id ou estratégia de correspondência.", "productSync.reSync": "Re-sincronizar", - "productSync.reSyncBody": "— produtos remotos correspondentes podem ser sobrescritos com conteúdo Descrybe ({count} ligados até agora).", - "productSync.queued": "Sincronização de produtos em fila", - "productSync.live.queued": "Em fila — à espera do worker", - "productSync.live.running": "Sincronização em curso", - "productSync.live.watching": "A acompanhar o estado… as contagens aparecem quando terminar.", - "productSync.live.success": "Sync concluída: {total} total · {created} criados · {updated} atualizados · {failed} falhados · {skipped} ignorados", - "productSync.live.partial": "Sync com falhas: {total} total · {created} criados · {updated} atualizados · {failed} falhados · {skipped} ignorados", + "productSync.reSyncBody": "— produtos remotos correspondentes podem ser sobrescritos com conteúdo Descrybe ({count} ligados até agora).", + "productSync.queued": "Sincronização de produtos em fila", + "productSync.live.queued": "Em fila — à espera do worker", + "productSync.live.running": "Sincronização em curso", + "productSync.live.watching": "A acompanhar o estado… as contagens aparecem quando terminar.", + "productSync.live.success": "Sync concluída: {total} total · {created} criados · {updated} atualizados · {failed} falhados · {skipped} ignorados", + "productSync.live.partial": "Sync com falhas: {total} total · {created} criados · {updated} atualizados · {failed} falhados · {skipped} ignorados", "productSync.live.failed": "Sync falhou{detail}.", - "productSync.live.timedOut": "Ainda a correr — atualize mais tarde para o estado e contagens finais.", - "productSync.live.ordersSuccess": "Sync de encomendas concluída ({status}).", - "productSync.live.reviewsSuccess": "Sync de avaliações concluída ({status}).", + "productSync.live.timedOut": "Ainda a correr — atualize mais tarde para o estado e contagens finais.", + "productSync.live.ordersSuccess": "Sync de encomendas concluída ({status}).", + "productSync.live.reviewsSuccess": "Sync de avaliações concluída ({status}).", "productSync.retry": "Repetir sync", - "productSync.lastStatus": "Última: {status}", - "productSync.dryRun": "Simulação", - "productSync.lastSyncAt": "Última sincronização de produtos: {date}", - "productSync.noneYet": "Ainda não foi concluída nenhuma sincronização de produtos.", - "productSync.lastRun": "Última execução: {total} total · {created} criados · {updated} atualizados · {failed} falhados · {skipped} ignorados", - "productSync.needsReconnect": "A sincronização de produtos não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", + "productSync.lastStatus": "Última: {status}", + "productSync.dryRun": "Simulação", + "productSync.lastSyncAt": "Última sincronização de produtos: {date}", + "productSync.noneYet": "Ainda não foi concluída nenhuma sincronização de produtos.", + "productSync.lastRun": "Última execução: {total} total · {created} criados · {updated} atualizados · {failed} falhados · {skipped} ignorados", + "productSync.needsReconnect": "A sincronização de produtos não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.", "productSync.scheduleTitle": "Automatic product sync schedule", - "productSync.scheduleHelp": "Como os intervalos dos feeds: defina com que frequência o Descrybe envia produtos para a loja, ou pause o agendamento. A fila manual continua a funcionar com pausa. Webhooks da loja não são usados — só polling/fila.", + "productSync.scheduleHelp": "Como os intervalos dos feeds: defina com que frequência o Descrybe envia produtos para a loja, ou pause o agendamento. A fila manual continua a funcionar com pausa. Webhooks da loja não são usados — só polling/fila.", "productSync.scheduleInterval": "Intervalo de sync (horas)", - "productSync.scheduleIntervalHint": "1–168 horas. O padrão é 6 horas se não estiver definido no servidor.", - "productSync.schedulePause": "Pausar sync automática", + "productSync.scheduleIntervalHint": "1–168 horas. O padrão é 6 horas se não estiver definido no servidor.", + "productSync.schedulePause": "Pausar sync automática", "productSync.schedulePauseHint": "Para apenas os envios agendados. Ainda pode colocar um sync de produtos na fila manualmente.", "productSync.scheduleSave": "Save schedule", "productSync.scheduleSaved": "Product sync schedule saved.", @@ -5604,15 +5605,15 @@ export const pt: MessageDict = { "productSync.scheduleActiveBadge": "Schedule active", "productSync.scheduleNeedsConfig": "Save store connection first", "productSync.scheduleAdminOnly": "Company admin required", - "productSync.delivery.title": "Atualizações por polling, não por webhooks da loja", - "productSync.delivery.body": "A Descrybe não recebe webhooks da Shopify ou WooCommerce. Os envios de produtos correm quando os coloca em fila ou no horário automático. Esta página acompanha o progresso ao consultar o estado da ligação — não via eventos push em direto da loja.", - "productSync.delivery.inboundNote": "Encomendas e avaliações também usam pulls em fila (agendados ou manuais), não webhooks em direto.", - "productSync.delivery.hubNote": "Os conectores de loja sincronizam por horário ou quando coloca um job em fila — não via webhooks em direto da loja.", + "productSync.delivery.title": "Atualizações por polling, não por webhooks da loja", + "productSync.delivery.body": "A Descrybe não recebe webhooks da Shopify ou WooCommerce. Os envios de produtos correm quando os coloca em fila ou no horário automático. Esta página acompanha o progresso ao consultar o estado da ligação — não via eventos push em direto da loja.", + "productSync.delivery.inboundNote": "Encomendas e avaliações também usam pulls em fila (agendados ou manuais), não webhooks em direto.", + "productSync.delivery.hubNote": "Os conectores de loja sincronizam por horário ou quando coloca um job em fila — não via webhooks em direto da loja.", "productSync.delivery.badge.manual": "Fila manual", "productSync.delivery.badge.scheduled": "Agendado a cada {hours} h", - "productSync.delivery.badge.scheduledDefault": "Agendado (predefinição do servidor)", + "productSync.delivery.badge.scheduledDefault": "Agendado (predefinição do servidor)", "productSync.delivery.badge.paused": "Agenda em pausa", - "productSync.delivery.badge.webhooksOff": "Webhooks da loja: indisponíveis", + "productSync.delivery.badge.webhooksOff": "Webhooks da loja: indisponíveis", "productSync.scope.title": "What to sync", "productSync.scope.hint": "Optional filters for this push only. Leave blank to sync the latest processed products up to the limit.", "productSync.scope.status": "Status", @@ -5627,21 +5628,21 @@ export const pt: MessageDict = { "productSync.scope.products": "Specific products", "productSync.scope.productsHint": "Optional. Search and select processed products to push only those.", "productSync.scope.productsOverrideHint": "Selected products override status, category, and max-products filters for this sync.", - "productSync.scope.productsSearch": "Search products…", - "productSync.scope.productsLoading": "Loading products…", + "productSync.scope.productsSearch": "Search products…", + "productSync.scope.productsLoading": "Loading products…", "productSync.scope.productsEmpty": "No processed products found.", "productSync.scope.productsSelected": "{count} selected", "productSync.scope.productsSelectedList": "Selected products", "productSync.scope.productsClear": "Clear selection", "productSync.scope.productsMax": "Maximum {max} products", - "store.syncingLive": "A sincronizar…", + "store.syncingLive": "A sincronizar…", "files.recentUploads": "Carregamentos recentes", "files.colFileName": "Nome do ficheiro", "files.colKind": "Tipo", "files.colUploaded": "Carregado", "files.colRows": "Linhas", - "files.loading": "A carregar carregamentos…", + "files.loading": "A carregar carregamentos…", "files.empty": "Ainda sem carregamentos.", "products.filters.sortProducts": "Ordenar produtos", - "products.table.options": "Opções", + "products.table.options": "Opções", }; diff --git a/apps/web/src/lib/i18n/messages/sl.ts b/apps/web/src/lib/i18n/messages/sl.ts index 87465b0..482c759 100644 --- a/apps/web/src/lib/i18n/messages/sl.ts +++ b/apps/web/src/lib/i18n/messages/sl.ts @@ -1,15 +1,16 @@ -import type { MessageDict } from "./types.ts"; +import type { MessageDict } from "./types.ts"; -/** Slovenian (sl) UI strings for admin Fix A1 — ready pack. Not registered in UI_LOCALES yet (avoid inventing locale switcher). */ +/** Slovenian (sl) UI strings for admin Fix A1 — ready pack. Not registered in UI_LOCALES yet (avoid inventing locale switcher). */ export const sl: MessageDict = { "admin.users.fixA1": "Popravi katalog A1", - "admin.users.fixA1Aria": "Popravi AI pozive, kategorije in zgoščevalne vrednosti za {name}", + "admin.users.fixA1Aria": "Popravi AI pozive, kategorije in zgoščevalne vrednosti za {name}", "admin.users.fixA1Title": "Popravi katalog podjetja", - "admin.users.fixA1Desc": "Ponovno uporabi popravljene AI pozive, počisti šibke enhance zgoščevalne vrednosti in dopolni kategorije iz mapped podatkov.", + "admin.users.fixA1Desc": "Ponovno uporabi popravljene AI pozive, počisti Å¡ibke enhance zgoščevalne vrednosti in dopolni kategorije iz mapped podatkov.", "admin.users.fixA1Company": "Podjetje: {name}", - "admin.users.fixA1Warning": "Raje Platform Demo ali izrecno podjetje. Ne briše feedov, mapiranj ali surovih izdelkov. Ščiti pravila prepisovanja A1 kohorte.", - "admin.users.fixA1Cancel": "Prekliči", + "admin.users.fixA1Warning": "Raje Platform Demo ali izrecno podjetje. Ne briÅ¡e feedov, mapiranj ali surovih izdelkov. Ščiti pravila prepisovanja A1 kohorte.", + "admin.users.fixA1Cancel": "Prekliči", "admin.users.fixA1Confirm": "Popravi katalog", - "flash.admin.fixA1Success": "Popravilo kataloga za {name} končano: posodobljenih pozivov {prompts}, počiščenih zgoščevalnih vrednosti {hashes}, dopolnjenih kategorij {categories}.", + "flash.admin.fixA1Success": "Popravilo kataloga za {name}: pozivi {prompts}, zgoščene {hashes}, processed←mapped {categories}, mapped←processed {mapped_backfilled}. Pokritost: {mapped_with}/{mapped_total} ({taxonomy} taksonomija).", "flash.admin.fixA1Error": "Popravilo kataloga za {name} ni uspelo.", + "flash.admin.cloneDestMissing": "Ni ciljnega sandbox podjetja. Preklopite na Platform Demo, nato klonirajte.", }; diff --git a/apps/web/src/routes/admin/users/+page.svelte b/apps/web/src/routes/admin/users/+page.svelte index da0d7ca..87f47dd 100644 --- a/apps/web/src/routes/admin/users/+page.svelte +++ b/apps/web/src/routes/admin/users/+page.svelte @@ -384,11 +384,18 @@ reprocessSampleLimit: 25 }); const r = res.result; + const mappedWith = Number(r.mapped_with_category ?? 0); + const mappedWithout = Number(r.mapped_without_category ?? 0); + const mappedTotal = mappedWith + mappedWithout; success = i18n.t("flash.admin.fixA1Success", { name: targetName, prompts: String(r.prompts ?? r.category_prompts_updated ?? 0), hashes: String(r.hashes ?? r.weak_hashes_cleared ?? 0), - categories: String(r.categories ?? r.categories_backfilled ?? 0) + categories: String(r.categories ?? r.categories_backfilled ?? 0), + mapped_backfilled: String(r.mapped_backfilled ?? r.mapped_categories_backfilled ?? 0), + mapped_with: String(mappedWith), + mapped_total: String(mappedTotal), + taxonomy: String(r.taxonomy_categories ?? 0) }); fixOpen = false; fixCompany = null; @@ -410,17 +417,23 @@ me?.staff_home_company_id?.trim() || me?.staff_home_company?.id?.trim() || undefined; + if (!destId && me?.company?.id && me.company.id === cloneCompany.id) { + error = i18n.t("flash.admin.cloneDestMissing"); + return; + } const res = await cloneAdminCompanyCatalog(cloneCompany.id, { destCompanyId: destId }); const products = Number(res.counts?.raw_products ?? 0); const categories = Number(res.counts?.categories ?? 0); + const mappedWith = Number(res.counts?.mapped_with_category ?? 0); const activeDest = (res.active_company_id || res.dest_company_id || "").trim(); success = i18n.t("flash.admin.catalogCloned", { source: cloneCompany.name, dest: cloneDestLabel, products: String(products), - categories: String(categories) + categories: String(categories), + mapped_with: String(mappedWith) }); cloneOpen = false; cloneCompany = null;