diff --git a/apps/api/cmd/_a1_enhance_examples_A_20260816_tmp/main.go b/apps/api/cmd/_a1_enhance_examples_A_20260816_tmp/main.go
new file mode 100644
index 0000000..577ce87
--- /dev/null
+++ b/apps/api/cmd/_a1_enhance_examples_A_20260816_tmp/main.go
@@ -0,0 +1,662 @@
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "io"
+ "log"
+ "net/http"
+ "os"
+ "os/signal"
+ "path/filepath"
+ "regexp"
+ "strings"
+ "syscall"
+ "time"
+ "unicode/utf8"
+
+ "github.com/descrybe/descrybe-v2/apps/api/internal/aiprompts"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/aiprovider"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/config"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/db"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/eprel"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/logredact"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/platformsettings"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/processing"
+ "github.com/google/uuid"
+ "github.com/jackc/pgx/v5/pgxpool"
+)
+
+// Batch A: rich h1/h2/p/ul category formulas (incl. Slusalke/48).
+var eans = []string{
+ "195348253666", // 7 Gaming monitorji
+ "4548736132597", // 48 Slusalke
+ "3045380024786", // 36 Pecice
+ "3838782459856", // 38 Pomivalni stroji
+ "1200130000638", // 3 Bluetooth zvocniki
+}
+
+var eanLabels = map[string]string{
+ "195348253666": "Gaming monitorji (rich formula)",
+ "4548736132597": "Slusalke cat48 (rich formula)",
+ "3045380024786": "Pecice (rich formula)",
+ "3838782459856": "Pomivalni stroji (rich formula)",
+ "1200130000638": "Bluetooth zvocniki (rich formula)",
+}
+
+var poisonMeta = regexp.MustCompile(`\|\s*\d+\s*$`)
+var brandOnlyish = regexp.MustCompile(`(?i)^(bosch|gorenje|gigabyte|xiaomi|lenovo|samsung|lg|anker|jbl|vogels|ostalo)$`)
+
+type dbProduct struct {
+ EAN string `json:"ean"`
+ Label string `json:"label"`
+ ProductID string `json:"product_id"`
+ Title string `json:"title"`
+ Description string `json:"description"`
+ Category string `json:"category"`
+ CategoryName string `json:"category_name"`
+ MetaTitle string `json:"meta_title"`
+ MetaDescription string `json:"meta_description"`
+ Attributes json.RawMessage `json:"attributes"`
+ AIProviderMode string `json:"ai_provider_mode"`
+ DescTemplate any `json:"description_template"`
+ TitleTemplate any `json:"title_template"`
+ FormulaConstraint string `json:"formula_constraint"`
+ FieldSources json.RawMessage `json:"field_sources"`
+}
+
+func main() {
+ out := os.Getenv("PROBE_OUT_DIR")
+ if out == "" {
+ out = `F:\laragon\www\_MY\descrybe-v2\.codehelper\_a1_enhance_examples_A_20260816`
+ }
+ _ = os.MkdirAll(out, 0o755)
+
+ logPath := filepath.Join(out, "inproc_run.log")
+ logFile, err := os.Create(logPath)
+ if err != nil {
+ log.Fatalf("log file: %v", err)
+ }
+ defer logFile.Close()
+ log.SetOutput(logredact.Writer(io.MultiWriter(os.Stderr, logFile)))
+
+ companyID := uuid.MustParse("2b3159b0-fc08-415b-b248-35ed02a6baab")
+ userID := uuid.MustParse("0ce3305c-d810-4b56-b1d4-3c1ed510db76")
+
+ cfg, err := config.Load()
+ if err != nil {
+ log.Fatalf("config: %v", err)
+ }
+ ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
+ defer cancel()
+
+ pool, err := db.NewPool(ctx, cfg.DatabaseURL, db.PoolOptions{
+ MaxConns: int32(cfg.DBMaxConns),
+ MinConns: int32(cfg.DBMinConns),
+ MaxConnLifetime: cfg.DBMaxConnLifetime,
+ MaxConnLifetimeJitter: cfg.DBMaxConnLifetimeJitter,
+ MaxConnIdleTime: cfg.DBMaxConnIdleTime,
+ HealthCheckPeriod: cfg.DBHealthCheckPeriod,
+ StatementTimeout: cfg.DBStatementTimeout,
+ })
+ if err != nil {
+ log.Fatalf("db: %v", err)
+ }
+ defer pool.Close()
+
+ waitForeignJobs(ctx, pool, companyID)
+
+ platEnv := platformsettings.EnvConfig{
+ AppEncryptionKey: cfg.AppEncryptionKey,
+ CredentialsEncryptionKey: cfg.CredentialsEncryptionKey,
+ TokenSigningSecret: cfg.TokenSigningSecret,
+ DatabaseURL: cfg.DatabaseURL,
+ OpenAIAPIKey: cfg.OpenAIAPIKey,
+ OpenAIBaseURL: cfg.OpenAIBaseURL,
+ OpenAIModel: cfg.OpenAIModel,
+ OpenAIEmbeddingAPIKey: cfg.OpenAIEmbeddingAPIKey,
+ OpenAIEmbeddingBaseURL: cfg.OpenAIEmbeddingBaseURL,
+ OpenAIEmbeddingModel: cfg.OpenAIEmbeddingModel,
+ }
+ platSettings := platformsettings.NewService(pool, platEnv)
+ aiSvc := aiprovider.NewService(pool, aiprovider.EnvConfig{
+ AppEncryptionKey: cfg.AppEncryptionKey,
+ CredentialsEncryptionKey: cfg.CredentialsEncryptionKey,
+ TokenSigningSecret: cfg.TokenSigningSecret,
+ DatabaseURL: cfg.DatabaseURL,
+ OpenAIAPIKey: cfg.OpenAIAPIKey,
+ OpenAIBaseURL: cfg.OpenAIBaseURL,
+ OpenAIModel: cfg.OpenAIModel,
+ ProcessingRPM: cfg.ProcessingRPM,
+ ProcessingMaxRetries: cfg.ProcessingMaxRetries,
+ })
+ aiSvc.Platform = platSettings
+
+ roleCfg, rerr := platSettings.ResolveAIConfig(ctx, platformsettings.AIRoleProcessing)
+ if rerr != nil {
+ failResolve(out, fmt.Sprintf("ResolveAIConfig: %v", rerr))
+ }
+ completer, modeLabel, byok, cerr := aiSvc.ResolveCompleterForRole(ctx, companyID, aiprovider.RoleProcessing)
+ if cerr != nil {
+ failResolve(out, fmt.Sprintf("ResolveCompleterForRole: %v", cerr))
+ }
+ if completer == nil {
+ failResolve(out, "nil completer")
+ }
+ client, ok := completer.(*processing.OpenAIClient)
+ if !ok {
+ failResolve(out, fmt.Sprintf("completer type %T", completer))
+ }
+ base := strings.TrimSpace(client.BaseURL)
+ model := strings.TrimSpace(client.Model)
+ resolveInfo := map[string]any{
+ "batch": "A",
+ "eans": eans,
+ "role_source": roleCfg.Source,
+ "role_provider": roleCfg.Provider,
+ "role_base_url": roleCfg.BaseURL,
+ "role_model": roleCfg.Model,
+ "role_enabled": roleCfg.Enabled,
+ "completer_base": base,
+ "completer_model": model,
+ "mode_label": modeLabel,
+ "byok": byok,
+ "env_base_url": cfg.OpenAIBaseURL,
+ "env_model": cfg.OpenAIModel,
+ "live": true,
+ }
+ if processing.IsMockOrLoopbackBaseURL(base) || strings.Contains(strings.ToLower(base), "18767") {
+ resolveInfo["live"] = false
+ resolveInfo["fail_reason"] = "resolved completer is mock/loopback — refuse silent mock fallback"
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatalf("LIVE LLM REQUIRED: resolved base=%s model=%s — refuse mock", base, model)
+ }
+ if strings.TrimSpace(client.APIKey) == "" {
+ resolveInfo["live"] = false
+ resolveInfo["fail_reason"] = "empty API key"
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatal("LIVE LLM REQUIRED: API key empty")
+ }
+ keyHint := ""
+ if k := strings.TrimSpace(client.APIKey); len(k) > 8 {
+ keyHint = k[:4] + "…" + k[len(k)-4:]
+ }
+ resolveInfo["api_key_hint"] = keyHint
+
+ modelsURL := strings.TrimRight(base, "/") + "/models"
+ modelsCtx, modelsCancel := context.WithTimeout(ctx, 30*time.Second)
+ defer modelsCancel()
+ modelsReq, merr := http.NewRequestWithContext(modelsCtx, http.MethodGet, modelsURL, nil)
+ if merr != nil {
+ failResolve(out, "models req: "+merr.Error())
+ }
+ modelsReq.Header.Set("Authorization", "Bearer "+client.APIKey)
+ modelsReq.Header.Set("Accept", "application/json")
+ modelsStart := time.Now()
+ modelsResp, merr := http.DefaultClient.Do(modelsReq)
+ modelsElapsed := time.Since(modelsStart).Round(time.Millisecond)
+ if merr != nil {
+ resolveInfo["probe_ok"] = false
+ resolveInfo["models_error"] = processing.TruncateError(merr)
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatalf("LIVE LLM CONNECTION ERROR: GET models: %v", merr)
+ }
+ modelsBody, _ := io.ReadAll(io.LimitReader(modelsResp.Body, 2048))
+ _ = modelsResp.Body.Close()
+ resolveInfo["models_url"] = modelsURL
+ resolveInfo["models_http_status"] = modelsResp.StatusCode
+ resolveInfo["models_elapsed"] = modelsElapsed.String()
+ snippet := strings.TrimSpace(string(modelsBody))
+ if len(snippet) > 200 {
+ snippet = snippet[:200] + "…"
+ }
+ resolveInfo["models_body_snippet"] = snippet
+ if modelsResp.StatusCode != http.StatusOK {
+ resolveInfo["probe_ok"] = false
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatalf("LIVE LLM CONNECTION ERROR: models HTTP %d", modelsResp.StatusCode)
+ }
+
+ probeCtx, probeCancel := context.WithTimeout(ctx, 3*time.Minute)
+ defer probeCancel()
+ probeStart := time.Now()
+ comp, perr := client.Complete(probeCtx, "Reply with exactly: PONG", "Say PONG")
+ probeElapsed := time.Since(probeStart).Round(time.Millisecond)
+ if perr != nil {
+ // One soft retry — OverloadedBot often needs a cool-down after a prior batch.
+ log.Printf("chat probe first attempt failed elapsed=%s err=%s — retrying once after 20s", probeElapsed, processing.TruncateError(perr))
+ select {
+ case <-ctx.Done():
+ resolveInfo["probe_ok"] = false
+ resolveInfo["probe_error"] = processing.TruncateError(perr)
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatalf("LIVE LLM CONNECTION ERROR: chat probe: %v", perr)
+ case <-time.After(20 * time.Second):
+ }
+ probeCtx2, probeCancel2 := context.WithTimeout(ctx, 3*time.Minute)
+ defer probeCancel2()
+ probeStart = time.Now()
+ comp, perr = client.Complete(probeCtx2, "Reply with exactly: PONG", "Say PONG")
+ probeElapsed = time.Since(probeStart).Round(time.Millisecond)
+ if perr != nil {
+ resolveInfo["probe_ok"] = false
+ resolveInfo["probe_error"] = processing.TruncateError(perr)
+ resolveInfo["models_http_status"] = modelsResp.StatusCode
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatalf("LIVE LLM CONNECTION ERROR: chat probe (after retry): %v", perr)
+ }
+ }
+ resolveInfo["probe_ok"] = true
+ resolveInfo["probe_elapsed"] = probeElapsed.String()
+ resolveInfo["probe_response_len"] = len(comp.Text)
+ resolveInfo["started_at_utc"] = time.Now().UTC().Format(time.RFC3339)
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Printf("live resolve ok source=%s base=%s model=%s mode=%s byok=%v", roleCfg.Source, base, model, modeLabel, byok)
+
+ pipeline := processing.NewPipeline(pool)
+ pipeline.BatchSize = cfg.ProcessingBatchSize
+ pipeline.AI = aiSvc
+ pipeline.Prompts = aiprompts.NewService(pool)
+ eprelClient := eprel.NewClient(eprel.Options{Enabled: true, Timeout: 20 * time.Second})
+ pipeline.Engine = &processing.Engine{
+ Completer: nil,
+ Vector: processing.NoopVectorCategorizer{},
+ EPREL: eprelClient,
+ ProviderMode: processing.AIProviderInternal,
+ }
+
+ rawIDs := make([]uuid.UUID, 0, len(eans))
+ for _, ean := range eans {
+ var id uuid.UUID
+ if err := pool.QueryRow(ctx, `
+ SELECT id FROM raw_products
+ WHERE company_id = $1 AND gtin = $2`, companyID, ean).Scan(&id); err != nil {
+ log.Fatalf("raw product %s: %v", ean, err)
+ }
+ rawIDs = append(rawIDs, id)
+ log.Printf("ean=%s raw_id=%s label=%s", ean, id, eanLabels[ean])
+ }
+
+ tag, cerr2 := pool.Exec(ctx, `
+ UPDATE processed_products pp
+ SET field_sources = COALESCE(field_sources, '{}'::jsonb) - 'enhance_input_hash',
+ localized_content = CASE
+ WHEN localized_content IS NULL OR localized_content = '{}'::jsonb THEN localized_content
+ ELSE (
+ SELECT COALESCE(jsonb_object_agg(lang, val - 'enhance_input_hash'), '{}'::jsonb)
+ FROM jsonb_each(localized_content) AS t(lang, val)
+ )
+ END,
+ updated_at = now()
+ FROM raw_products rp
+ WHERE pp.company_id = $1
+ AND pp.raw_product_id = rp.id
+ AND rp.gtin = ANY($2::text[])`, companyID, eans)
+ if cerr2 != nil {
+ log.Printf("clear enhance hash: %v", cerr2)
+ } else {
+ log.Printf("cleared enhance_input_hash rows=%d", tag.RowsAffected())
+ }
+
+ if n, err := processing.BackfillMissingMeta(ctx, pool, companyID); err != nil {
+ log.Printf("BackfillMissingMeta: %v", err)
+ } else {
+ log.Printf("BackfillMissingMeta updated=%d", n)
+ }
+
+ _, _ = pool.Exec(ctx, `
+ UPDATE processing_jobs
+ SET status = 'failed', error = 'yielded to live enhance examples batch A', updated_at = now()
+ WHERE company_id = $1 AND status IN ('pending','running','processing')`, companyID)
+
+ jobs, err := pipeline.StartJob(ctx, companyID, userID, rawIDs, "full")
+ if err != nil {
+ log.Fatalf("StartJob: %v", err)
+ }
+ if len(jobs) == 0 {
+ log.Fatal("StartJob returned no jobs")
+ }
+ jobID := jobs[0].ID
+ log.Printf("job_id=%s chunks=%d", jobID, len(jobs))
+ _ = os.WriteFile(filepath.Join(out, "process_id.txt"), []byte(jobID.String()+"\n"), 0o644)
+
+ defend := make(chan struct{})
+ go func() {
+ t := time.NewTicker(500 * time.Millisecond)
+ defer t.Stop()
+ for {
+ select {
+ case <-defend:
+ return
+ case <-ctx.Done():
+ return
+ case <-t.C:
+ _, _ = pool.Exec(context.Background(), `
+ UPDATE processing_jobs
+ SET status = 'failed', error = 'yielded to live enhance examples batch A', updated_at = now()
+ WHERE company_id = $1 AND status IN ('pending','running','processing') AND id <> $2`, companyID, jobID)
+ _, _ = pool.Exec(context.Background(), `
+ UPDATE processing_jobs
+ SET status = 'running', error = NULL, updated_at = now()
+ WHERE id = $1 AND status IN ('failed','cancelled')
+ AND (error ILIKE '%yield%' OR error ILIKE '%parked%' OR error ILIKE '%reclaim%'
+ OR error ILIKE '%batch_%' OR error ILIKE '%enhance examples%' OR error ILIKE '%formula%')`, jobID)
+ _, _ = pool.Exec(context.Background(), `
+ UPDATE processing_job_products
+ SET status = 'pending', error = NULL, updated_at = now()
+ WHERE job_id = $1 AND status IN ('failed','cancelled')
+ AND processed_product_id IS NULL
+ AND (error ILIKE '%yield%' OR error ILIKE '%parked%' OR error ILIKE '%reclaim%'
+ OR error ILIKE '%batch_%' OR error ILIKE '%enhance examples%' OR error ILIKE '%formula%')`, jobID)
+ }
+ }
+ }()
+
+ _, _ = pool.Exec(ctx, `
+ UPDATE processing_jobs
+ SET status = 'running', started_at = COALESCE(started_at, now()), updated_at = now()
+ WHERE id = $1`, jobID)
+
+ runCtx, runCancel := context.WithTimeout(ctx, 25*time.Minute)
+ defer runCancel()
+ if err := pipeline.ProcessJob(runCtx, jobID); err != nil {
+ close(defend)
+ log.Fatalf("ProcessJob: %v", err)
+ }
+ close(defend)
+
+ items, err := pipeline.LoadV1ProcessJobItems(ctx, companyID, jobID, "full")
+ if err != nil {
+ log.Fatalf("LoadV1ProcessJobItems: %v", err)
+ }
+ writeJSON(out, "final.json", map[string]any{
+ "data": map[string]any{
+ "process_id": jobID.String(),
+ "status": "COMPLETED",
+ "processing_type": "full",
+ "total_items": len(items),
+ "items": items,
+ "llm": map[string]any{
+ "base": base,
+ "model": model,
+ "source": roleCfg.Source,
+ "mode": modeLabel,
+ "byok": byok,
+ },
+ },
+ })
+
+ rows, err := pool.Query(ctx, `
+ SELECT rp.gtin,
+ COALESCE(pp.processed_name, pp.name, ''),
+ COALESCE(NULLIF(pp.processed_description, ''), pp.description, ''),
+ COALESCE(pp.category, ''),
+ COALESCE(c.name, ''),
+ COALESCE(pp.meta_title, ''),
+ COALESCE(pp.meta_description, ''),
+ COALESCE(pp.processed_attributes, pp.attributes, '{}'::jsonb),
+ COALESCE(pp.ai_provider_mode, ''),
+ c.description_template,
+ c.title_template,
+ pp.id,
+ COALESCE(pp.field_sources, '{}'::jsonb)
+ FROM processing_job_products pjp
+ JOIN raw_products rp ON rp.id = pjp.raw_product_id
+ LEFT JOIN processed_products pp ON pp.id = pjp.processed_product_id
+ LEFT JOIN categories c ON c.company_id = pp.company_id AND c.unique_id = pp.category
+ WHERE pjp.job_id = $1
+ ORDER BY rp.gtin`, jobID)
+ if err != nil {
+ log.Fatalf("db products: %v", err)
+ }
+ defer rows.Close()
+
+ dbProducts := make([]dbProduct, 0)
+ for rows.Next() {
+ var p dbProduct
+ var ppID *uuid.UUID
+ var attrs, sources []byte
+ if err := rows.Scan(&p.EAN, &p.Title, &p.Description, &p.Category, &p.CategoryName,
+ &p.MetaTitle, &p.MetaDescription, &attrs, &p.AIProviderMode,
+ &p.DescTemplate, &p.TitleTemplate, &ppID, &sources); err != nil {
+ log.Fatal(err)
+ }
+ if ppID != nil {
+ p.ProductID = ppID.String()
+ }
+ p.Label = eanLabels[p.EAN]
+ p.Attributes = attrs
+ p.FieldSources = sources
+ p.FormulaConstraint = processing.FormatDescriptionFormulaConstraint(p.DescTemplate)
+ dbProducts = append(dbProducts, p)
+ }
+ writeJSON(out, "db_products.json", dbProducts)
+ scoreAndWrite(out, jobID.String(), resolveInfo, dbProducts)
+ fmt.Printf("BATCH_A JOB %s products=%d live_base=%s model=%s\n", jobID, len(dbProducts), base, model)
+}
+
+func waitForeignJobs(ctx context.Context, pool *pgxpool.Pool, companyID uuid.UUID) {
+ deadline := time.Now().Add(18 * time.Minute)
+ for time.Now().Before(deadline) {
+ var n int
+ err := pool.QueryRow(ctx, `
+ SELECT count(*) FROM processing_jobs
+ WHERE company_id = $1 AND status IN ('pending','running','processing')`, companyID).Scan(&n)
+ if err != nil {
+ log.Printf("wait foreign jobs: %v", err)
+ return
+ }
+ if n == 0 {
+ log.Printf("queue clear — starting batch A")
+ return
+ }
+ log.Printf("waiting for %d foreign Demo job(s) before batch A…", n)
+ select {
+ case <-ctx.Done():
+ return
+ case <-time.After(15 * time.Second):
+ }
+ }
+ log.Printf("wait deadline reached — proceeding (will yield foreign jobs)")
+}
+
+func scoreAndWrite(out, jobID string, resolve map[string]any, products []dbProduct) {
+ scored := make([]map[string]any, 0, len(products))
+ pass, fail := 0, 0
+ var md strings.Builder
+ md.WriteString("# A1 enhance examples — batch A (rich category formulas; includes Slusalke/48)\n\n")
+ md.WriteString(fmt.Sprintf("- scored_at_utc: `%s`\n", time.Now().UTC().Format(time.RFC3339)))
+ md.WriteString(fmt.Sprintf("- job_id: `%s`\n", jobID))
+ md.WriteString(fmt.Sprintf("- live_base: `%v` model: `%v` source: `%v`\n", resolve["completer_base"], resolve["completer_model"], resolve["role_source"]))
+ md.WriteString(fmt.Sprintf("- mock_fallback: **false** (env mock ignored when DB admin AI resolves)\n\n"))
+ md.WriteString("Scoring: title quality · HTML formula tags (h1/h2/p/ul) · meta · attrs\n\n")
+
+ for _, p := range products {
+ title := strings.TrimSpace(p.Title)
+ desc := p.Description
+ metaT := strings.TrimSpace(p.MetaTitle)
+ metaD := strings.TrimSpace(p.MetaDescription)
+
+ has := map[string]bool{
+ "h1": strings.Contains(strings.ToLower(desc), "
= 8 && !brandOnlyish.MatchString(title)
+ titleNotes := []string{}
+ if title == "" {
+ titleNotes = append(titleNotes, "empty")
+ } else if brandOnlyish.MatchString(title) {
+ titleNotes = append(titleNotes, "brand_only")
+ } else if utf8.RuneCountInString(title) < 8 {
+ titleNotes = append(titleNotes, "too_short")
+ }
+ if strings.Contains(strings.ToLower(title), "title formula") || strings.Contains(strings.ToLower(title), "category:") {
+ titleOK = false
+ titleNotes = append(titleNotes, "prompt_leakage")
+ }
+
+ metaOK := metaT != "" && metaD != "" && !poisonMeta.MatchString(metaT) &&
+ !strings.Contains(strings.ToLower(metaT), "short retail title")
+ metaNotes := []string{}
+ if metaT == "" {
+ metaNotes = append(metaNotes, "empty_meta_title")
+ }
+ if metaD == "" {
+ metaNotes = append(metaNotes, "empty_meta_description")
+ }
+ if poisonMeta.MatchString(metaT) {
+ metaNotes = append(metaNotes, "poison_|digits")
+ }
+
+ attrMap := map[string]any{}
+ _ = json.Unmarshal(p.Attributes, &attrMap)
+ attrKeys := make([]string, 0, len(attrMap))
+ dirty := []string{}
+ for k, v := range attrMap {
+ attrKeys = append(attrKeys, k)
+ sv := strings.TrimSpace(fmt.Sprint(v))
+ if sv == "" || strings.EqualFold(sv, "null") || strings.EqualFold(sv, "n/a") {
+ dirty = append(dirty, k+":empty")
+ }
+ if strings.Contains(strings.ToLower(k), "ean") || strings.Contains(strings.ToLower(k), "gtin") {
+ dirty = append(dirty, k+":id_like_key")
+ }
+ }
+ attrsOK := len(attrKeys) > 0 && len(dirty) == 0
+
+ checks := map[string]string{
+ "title": passFail(titleOK),
+ "html_tags": passFail(htmlOK),
+ "meta": passFail(metaOK),
+ "attrs": passFail(attrsOK),
+ "category": passFail(p.Category != "" && p.CategoryName != ""),
+ "desc_ne_title": passFail(strings.TrimSpace(stripTags(desc)) != "" && strings.TrimSpace(stripTags(desc)) != title),
+ "ai_internal": passFail(strings.EqualFold(p.AIProviderMode, "internal") || p.AIProviderMode == ""),
+ }
+ failFlags := []string{}
+ for k, v := range checks {
+ if v == "FAIL" {
+ failFlags = append(failFlags, k)
+ }
+ }
+ verdict := "PASS"
+ if len(failFlags) > 0 {
+ verdict = "FAIL"
+ fail++
+ } else {
+ pass++
+ }
+
+ row := map[string]any{
+ "ean": p.EAN,
+ "label": p.Label,
+ "product_id": p.ProductID,
+ "title": title,
+ "category": p.Category,
+ "category_name": p.CategoryName,
+ "desc_len": len(desc),
+ "desc_preview": truncate(stripTags(desc), 140),
+ "meta_title": metaT,
+ "meta_description": truncate(metaD, 160),
+ "attr_keys": attrKeys,
+ "dirty_attrs": dirty,
+ "attributes": attrMap,
+ "has_tags": has,
+ "formula_constraint": p.FormulaConstraint,
+ "formula_override_hint": strings.Contains(strings.ToLower(fmt.Sprint(p.FieldSources)), "formula"),
+ "ai_provider_mode": p.AIProviderMode,
+ "title_notes": titleNotes,
+ "meta_notes": metaNotes,
+ "checks": checks,
+ "fail_flags": failFlags,
+ "verdict": verdict,
+ }
+ scored = append(scored, row)
+
+ md.WriteString(fmt.Sprintf("## %s — %s (`%s`)\n\n", p.EAN, p.Label, verdict))
+ md.WriteString(fmt.Sprintf("- **title:** %s\n", title))
+ md.WriteString(fmt.Sprintf("- **category:** %s / %s\n", p.Category, p.CategoryName))
+ md.WriteString(fmt.Sprintf("- **meta_title:** %s\n", metaT))
+ md.WriteString(fmt.Sprintf("- **meta_description:** %s\n", truncate(metaD, 200)))
+ md.WriteString(fmt.Sprintf("- **attrs:** %s\n", strings.Join(attrKeys, ", ")))
+ md.WriteString(fmt.Sprintf("- **HTML tags:** h1=%v h2=%v p=%v ul=%v\n", has["h1"], has["h2"], has["p"], has["ul"]))
+ md.WriteString(fmt.Sprintf("- **checks:** title=%s html=%s meta=%s attrs=%s\n\n", checks["title"], checks["html_tags"], checks["meta"], checks["attrs"]))
+ md.WriteString("### Description HTML (raw)\n\n```html\n")
+ if len(desc) > 4096 {
+ md.WriteString(desc[:4096])
+ md.WriteString("\n\n")
+ } else {
+ md.WriteString(desc)
+ md.WriteString("\n")
+ }
+ md.WriteString("```\n\n")
+ }
+
+ total := len(products)
+ rate := 0
+ if total > 0 {
+ rate = (pass * 100) / total
+ }
+ scorecard := map[string]any{
+ "batch": "A",
+ "date": "2026-08-16",
+ "scored_at_utc": time.Now().UTC().Format(time.RFC3339),
+ "company_id": "2b3159b0-fc08-415b-b248-35ed02a6baab",
+ "company_name": "Platform Demo",
+ "job_id": jobID,
+ "selection": eanLabels,
+ "live_llm": resolve,
+ "mock_as_live": false,
+ "asserts": []string{"title_quality", "html_h1_h2_p_ul", "meta", "attrs", "category", "desc_ne_title"},
+ "summary": map[string]any{"pass": pass, "fail": fail, "total": total, "pass_rate": rate},
+ "verdict": map[bool]string{true: "PASS", false: "FAIL"}[fail == 0 && total > 0],
+ "products": scored,
+ "max_tokens_note": fmt.Sprintf("MaxTokensEnhance=%d MaxTokensEnhanceRetry=%d", processing.MaxTokensEnhance, processing.MaxTokensEnhanceRetry),
+ }
+ writeJSON(out, "scorecard.json", scorecard)
+ _ = os.WriteFile(filepath.Join(out, "examples.md"), []byte(md.String()), 0o644)
+
+ summary := fmt.Sprintf("# Batch A summary\n\n- verdict: **%s** (%d/%d)\n- live: `%v` / `%v`\n- mock_as_live: false\n- artifacts: scorecard.json, examples.md, db_products.json, final.json, resolve.json\n",
+ scorecard["verdict"], pass, total, resolve["completer_base"], resolve["completer_model"])
+ _ = os.WriteFile(filepath.Join(out, "summary.md"), []byte(summary), 0o644)
+}
+
+func passFail(ok bool) string {
+ if ok {
+ return "PASS"
+ }
+ return "FAIL"
+}
+
+func stripTags(s string) string {
+ re := regexp.MustCompile(`<[^>]+>`)
+ return strings.TrimSpace(re.ReplaceAllString(s, " "))
+}
+
+func truncate(s string, n int) string {
+ r := []rune(strings.TrimSpace(s))
+ if len(r) <= n {
+ return string(r)
+ }
+ return string(r[:n]) + "…"
+}
+
+func failResolve(out, msg string) {
+ writeJSON(out, "resolve.json", map[string]any{"live": false, "fail_reason": msg, "batch": "A"})
+ log.Fatalf("LIVE LLM REQUIRED: %s", msg)
+}
+
+func writeJSON(out, name string, v any) {
+ raw, err := json.MarshalIndent(v, "", " ")
+ if err != nil {
+ log.Fatalf("marshal %s: %v", name, err)
+ }
+ if err := os.WriteFile(filepath.Join(out, name), raw, 0o644); err != nil {
+ log.Fatalf("write %s: %v", name, err)
+ }
+}
diff --git a/apps/api/cmd/_a1_enhance_examples_B_20260816_tmp/main.go b/apps/api/cmd/_a1_enhance_examples_B_20260816_tmp/main.go
new file mode 100644
index 0000000..84f5bcc
--- /dev/null
+++ b/apps/api/cmd/_a1_enhance_examples_B_20260816_tmp/main.go
@@ -0,0 +1,664 @@
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "io"
+ "log"
+ "net/http"
+ "os"
+ "os/signal"
+ "path/filepath"
+ "regexp"
+ "strings"
+ "syscall"
+ "time"
+ "unicode/utf8"
+
+ "github.com/descrybe/descrybe-v2/apps/api/internal/aiprompts"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/aiprovider"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/config"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/db"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/eprel"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/logredact"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/platformsettings"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/processing"
+ "github.com/google/uuid"
+ "github.com/jackc/pgx/v5/pgxpool"
+)
+
+// Batch B: appliances + monitors + mounts — independent of batch A.
+var eans = []string{
+ "4242005342488", // 41 washer-dryer
+ "4242005382330", // 38 dishwasher
+ "4242005327065", // 36 oven
+ "4719331854218", // 7 monitor GIGABYTE
+ "6941948703193", // 7 monitor Xiaomi
+ "8712285326882", // 28 TV mount
+}
+
+var eanLabels = map[string]string{
+ "4242005342488": "appliance washer-dryer",
+ "4242005382330": "appliance dishwasher",
+ "4242005327065": "appliance oven",
+ "4719331854218": "monitor GIGABYTE",
+ "6941948703193": "monitor Xiaomi",
+ "8712285326882": "mount Vogels",
+}
+
+var poisonMeta = regexp.MustCompile(`\|\s*\d+\s*$`)
+var brandOnlyish = regexp.MustCompile(`(?i)^(bosch|gorenje|gigabyte|xiaomi|lenovo|samsung|lg|anker|jbl|vogels|ostalo)$`)
+
+type dbProduct struct {
+ EAN string `json:"ean"`
+ Label string `json:"label"`
+ ProductID string `json:"product_id"`
+ Title string `json:"title"`
+ Description string `json:"description"`
+ Category string `json:"category"`
+ CategoryName string `json:"category_name"`
+ MetaTitle string `json:"meta_title"`
+ MetaDescription string `json:"meta_description"`
+ Attributes json.RawMessage `json:"attributes"`
+ AIProviderMode string `json:"ai_provider_mode"`
+ DescTemplate any `json:"description_template"`
+ TitleTemplate any `json:"title_template"`
+ FormulaConstraint string `json:"formula_constraint"`
+ FieldSources json.RawMessage `json:"field_sources"`
+}
+
+func main() {
+ out := os.Getenv("PROBE_OUT_DIR")
+ if out == "" {
+ out = `F:\laragon\www\_MY\descrybe-v2\.codehelper\_a1_enhance_examples_B_20260816`
+ }
+ _ = os.MkdirAll(out, 0o755)
+
+ logPath := filepath.Join(out, "inproc_run.log")
+ logFile, err := os.Create(logPath)
+ if err != nil {
+ log.Fatalf("log file: %v", err)
+ }
+ defer logFile.Close()
+ log.SetOutput(logredact.Writer(io.MultiWriter(os.Stderr, logFile)))
+
+ companyID := uuid.MustParse("2b3159b0-fc08-415b-b248-35ed02a6baab")
+ userID := uuid.MustParse("0ce3305c-d810-4b56-b1d4-3c1ed510db76")
+
+ cfg, err := config.Load()
+ if err != nil {
+ log.Fatalf("config: %v", err)
+ }
+ ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
+ defer cancel()
+
+ pool, err := db.NewPool(ctx, cfg.DatabaseURL, db.PoolOptions{
+ MaxConns: int32(cfg.DBMaxConns),
+ MinConns: int32(cfg.DBMinConns),
+ MaxConnLifetime: cfg.DBMaxConnLifetime,
+ MaxConnLifetimeJitter: cfg.DBMaxConnLifetimeJitter,
+ MaxConnIdleTime: cfg.DBMaxConnIdleTime,
+ HealthCheckPeriod: cfg.DBHealthCheckPeriod,
+ StatementTimeout: cfg.DBStatementTimeout,
+ })
+ if err != nil {
+ log.Fatalf("db: %v", err)
+ }
+ defer pool.Close()
+
+ waitForeignJobs(ctx, pool, companyID)
+
+ platEnv := platformsettings.EnvConfig{
+ AppEncryptionKey: cfg.AppEncryptionKey,
+ CredentialsEncryptionKey: cfg.CredentialsEncryptionKey,
+ TokenSigningSecret: cfg.TokenSigningSecret,
+ DatabaseURL: cfg.DatabaseURL,
+ OpenAIAPIKey: cfg.OpenAIAPIKey,
+ OpenAIBaseURL: cfg.OpenAIBaseURL,
+ OpenAIModel: cfg.OpenAIModel,
+ OpenAIEmbeddingAPIKey: cfg.OpenAIEmbeddingAPIKey,
+ OpenAIEmbeddingBaseURL: cfg.OpenAIEmbeddingBaseURL,
+ OpenAIEmbeddingModel: cfg.OpenAIEmbeddingModel,
+ }
+ platSettings := platformsettings.NewService(pool, platEnv)
+ aiSvc := aiprovider.NewService(pool, aiprovider.EnvConfig{
+ AppEncryptionKey: cfg.AppEncryptionKey,
+ CredentialsEncryptionKey: cfg.CredentialsEncryptionKey,
+ TokenSigningSecret: cfg.TokenSigningSecret,
+ DatabaseURL: cfg.DatabaseURL,
+ OpenAIAPIKey: cfg.OpenAIAPIKey,
+ OpenAIBaseURL: cfg.OpenAIBaseURL,
+ OpenAIModel: cfg.OpenAIModel,
+ ProcessingRPM: cfg.ProcessingRPM,
+ ProcessingMaxRetries: cfg.ProcessingMaxRetries,
+ })
+ aiSvc.Platform = platSettings
+
+ roleCfg, rerr := platSettings.ResolveAIConfig(ctx, platformsettings.AIRoleProcessing)
+ if rerr != nil {
+ failResolve(out, fmt.Sprintf("ResolveAIConfig: %v", rerr))
+ }
+ completer, modeLabel, byok, cerr := aiSvc.ResolveCompleterForRole(ctx, companyID, aiprovider.RoleProcessing)
+ if cerr != nil {
+ failResolve(out, fmt.Sprintf("ResolveCompleterForRole: %v", cerr))
+ }
+ if completer == nil {
+ failResolve(out, "nil completer")
+ }
+ client, ok := completer.(*processing.OpenAIClient)
+ if !ok {
+ failResolve(out, fmt.Sprintf("completer type %T", completer))
+ }
+ base := strings.TrimSpace(client.BaseURL)
+ model := strings.TrimSpace(client.Model)
+ resolveInfo := map[string]any{
+ "batch": "B",
+ "eans": eans,
+ "role_source": roleCfg.Source,
+ "role_provider": roleCfg.Provider,
+ "role_base_url": roleCfg.BaseURL,
+ "role_model": roleCfg.Model,
+ "role_enabled": roleCfg.Enabled,
+ "completer_base": base,
+ "completer_model": model,
+ "mode_label": modeLabel,
+ "byok": byok,
+ "env_base_url": cfg.OpenAIBaseURL,
+ "env_model": cfg.OpenAIModel,
+ "live": true,
+ }
+ if processing.IsMockOrLoopbackBaseURL(base) || strings.Contains(strings.ToLower(base), "18767") {
+ resolveInfo["live"] = false
+ resolveInfo["fail_reason"] = "resolved completer is mock/loopback — refuse silent mock fallback"
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatalf("LIVE LLM REQUIRED: resolved base=%s model=%s — refuse mock", base, model)
+ }
+ if strings.TrimSpace(client.APIKey) == "" {
+ resolveInfo["live"] = false
+ resolveInfo["fail_reason"] = "empty API key"
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatal("LIVE LLM REQUIRED: API key empty")
+ }
+ keyHint := ""
+ if k := strings.TrimSpace(client.APIKey); len(k) > 8 {
+ keyHint = k[:4] + "…" + k[len(k)-4:]
+ }
+ resolveInfo["api_key_hint"] = keyHint
+
+ modelsURL := strings.TrimRight(base, "/") + "/models"
+ modelsCtx, modelsCancel := context.WithTimeout(ctx, 30*time.Second)
+ defer modelsCancel()
+ modelsReq, merr := http.NewRequestWithContext(modelsCtx, http.MethodGet, modelsURL, nil)
+ if merr != nil {
+ failResolve(out, "models req: "+merr.Error())
+ }
+ modelsReq.Header.Set("Authorization", "Bearer "+client.APIKey)
+ modelsReq.Header.Set("Accept", "application/json")
+ modelsStart := time.Now()
+ modelsResp, merr := http.DefaultClient.Do(modelsReq)
+ modelsElapsed := time.Since(modelsStart).Round(time.Millisecond)
+ if merr != nil {
+ resolveInfo["probe_ok"] = false
+ resolveInfo["models_error"] = processing.TruncateError(merr)
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatalf("LIVE LLM CONNECTION ERROR: GET models: %v", merr)
+ }
+ modelsBody, _ := io.ReadAll(io.LimitReader(modelsResp.Body, 2048))
+ _ = modelsResp.Body.Close()
+ resolveInfo["models_url"] = modelsURL
+ resolveInfo["models_http_status"] = modelsResp.StatusCode
+ resolveInfo["models_elapsed"] = modelsElapsed.String()
+ snippet := strings.TrimSpace(string(modelsBody))
+ if len(snippet) > 200 {
+ snippet = snippet[:200] + "…"
+ }
+ resolveInfo["models_body_snippet"] = snippet
+ if modelsResp.StatusCode != http.StatusOK {
+ resolveInfo["probe_ok"] = false
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatalf("LIVE LLM CONNECTION ERROR: models HTTP %d", modelsResp.StatusCode)
+ }
+
+ probeCtx, probeCancel := context.WithTimeout(ctx, 3*time.Minute)
+ defer probeCancel()
+ probeStart := time.Now()
+ comp, perr := client.Complete(probeCtx, "Reply with exactly: PONG", "Say PONG")
+ probeElapsed := time.Since(probeStart).Round(time.Millisecond)
+ if perr != nil {
+ // One soft retry — OverloadedBot often needs a cool-down after a prior batch.
+ log.Printf("chat probe first attempt failed elapsed=%s err=%s — retrying once after 20s", probeElapsed, processing.TruncateError(perr))
+ select {
+ case <-ctx.Done():
+ resolveInfo["probe_ok"] = false
+ resolveInfo["probe_error"] = processing.TruncateError(perr)
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatalf("LIVE LLM CONNECTION ERROR: chat probe: %v", perr)
+ case <-time.After(20 * time.Second):
+ }
+ probeCtx2, probeCancel2 := context.WithTimeout(ctx, 3*time.Minute)
+ defer probeCancel2()
+ probeStart = time.Now()
+ comp, perr = client.Complete(probeCtx2, "Reply with exactly: PONG", "Say PONG")
+ probeElapsed = time.Since(probeStart).Round(time.Millisecond)
+ if perr != nil {
+ resolveInfo["probe_ok"] = false
+ resolveInfo["probe_error"] = processing.TruncateError(perr)
+ resolveInfo["models_http_status"] = modelsResp.StatusCode
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Fatalf("LIVE LLM CONNECTION ERROR: chat probe (after retry): %v", perr)
+ }
+ }
+ resolveInfo["probe_ok"] = true
+ resolveInfo["probe_elapsed"] = probeElapsed.String()
+ resolveInfo["probe_response_len"] = len(comp.Text)
+ resolveInfo["started_at_utc"] = time.Now().UTC().Format(time.RFC3339)
+ writeJSON(out, "resolve.json", resolveInfo)
+ log.Printf("live resolve ok source=%s base=%s model=%s mode=%s byok=%v", roleCfg.Source, base, model, modeLabel, byok)
+
+ pipeline := processing.NewPipeline(pool)
+ pipeline.BatchSize = cfg.ProcessingBatchSize
+ pipeline.AI = aiSvc
+ pipeline.Prompts = aiprompts.NewService(pool)
+ eprelClient := eprel.NewClient(eprel.Options{Enabled: true, Timeout: 20 * time.Second})
+ pipeline.Engine = &processing.Engine{
+ Completer: nil,
+ Vector: processing.NoopVectorCategorizer{},
+ EPREL: eprelClient,
+ ProviderMode: processing.AIProviderInternal,
+ }
+
+ rawIDs := make([]uuid.UUID, 0, len(eans))
+ for _, ean := range eans {
+ var id uuid.UUID
+ if err := pool.QueryRow(ctx, `
+ SELECT id FROM raw_products
+ WHERE company_id = $1 AND gtin = $2`, companyID, ean).Scan(&id); err != nil {
+ log.Fatalf("raw product %s: %v", ean, err)
+ }
+ rawIDs = append(rawIDs, id)
+ log.Printf("ean=%s raw_id=%s label=%s", ean, id, eanLabels[ean])
+ }
+
+ tag, cerr2 := pool.Exec(ctx, `
+ UPDATE processed_products pp
+ SET field_sources = COALESCE(field_sources, '{}'::jsonb) - 'enhance_input_hash',
+ localized_content = CASE
+ WHEN localized_content IS NULL OR localized_content = '{}'::jsonb THEN localized_content
+ ELSE (
+ SELECT COALESCE(jsonb_object_agg(lang, val - 'enhance_input_hash'), '{}'::jsonb)
+ FROM jsonb_each(localized_content) AS t(lang, val)
+ )
+ END,
+ updated_at = now()
+ FROM raw_products rp
+ WHERE pp.company_id = $1
+ AND pp.raw_product_id = rp.id
+ AND rp.gtin = ANY($2::text[])`, companyID, eans)
+ if cerr2 != nil {
+ log.Printf("clear enhance hash: %v", cerr2)
+ } else {
+ log.Printf("cleared enhance_input_hash rows=%d", tag.RowsAffected())
+ }
+
+ if n, err := processing.BackfillMissingMeta(ctx, pool, companyID); err != nil {
+ log.Printf("BackfillMissingMeta: %v", err)
+ } else {
+ log.Printf("BackfillMissingMeta updated=%d", n)
+ }
+
+ _, _ = pool.Exec(ctx, `
+ UPDATE processing_jobs
+ SET status = 'failed', error = 'yielded to live enhance examples batch B', updated_at = now()
+ WHERE company_id = $1 AND status IN ('pending','running','processing')`, companyID)
+
+ jobs, err := pipeline.StartJob(ctx, companyID, userID, rawIDs, "full")
+ if err != nil {
+ log.Fatalf("StartJob: %v", err)
+ }
+ if len(jobs) == 0 {
+ log.Fatal("StartJob returned no jobs")
+ }
+ jobID := jobs[0].ID
+ log.Printf("job_id=%s chunks=%d", jobID, len(jobs))
+ _ = os.WriteFile(filepath.Join(out, "process_id.txt"), []byte(jobID.String()+"\n"), 0o644)
+
+ defend := make(chan struct{})
+ go func() {
+ t := time.NewTicker(500 * time.Millisecond)
+ defer t.Stop()
+ for {
+ select {
+ case <-defend:
+ return
+ case <-ctx.Done():
+ return
+ case <-t.C:
+ _, _ = pool.Exec(context.Background(), `
+ UPDATE processing_jobs
+ SET status = 'failed', error = 'yielded to live enhance examples batch B', updated_at = now()
+ WHERE company_id = $1 AND status IN ('pending','running','processing') AND id <> $2`, companyID, jobID)
+ _, _ = pool.Exec(context.Background(), `
+ UPDATE processing_jobs
+ SET status = 'running', error = NULL, updated_at = now()
+ WHERE id = $1 AND status IN ('failed','cancelled')
+ AND (error ILIKE '%yield%' OR error ILIKE '%parked%' OR error ILIKE '%reclaim%'
+ OR error ILIKE '%batch_%' OR error ILIKE '%enhance examples%' OR error ILIKE '%formula%')`, jobID)
+ _, _ = pool.Exec(context.Background(), `
+ UPDATE processing_job_products
+ SET status = 'pending', error = NULL, updated_at = now()
+ WHERE job_id = $1 AND status IN ('failed','cancelled')
+ AND processed_product_id IS NULL
+ AND (error ILIKE '%yield%' OR error ILIKE '%parked%' OR error ILIKE '%reclaim%'
+ OR error ILIKE '%batch_%' OR error ILIKE '%enhance examples%' OR error ILIKE '%formula%')`, jobID)
+ }
+ }
+ }()
+
+ _, _ = pool.Exec(ctx, `
+ UPDATE processing_jobs
+ SET status = 'running', started_at = COALESCE(started_at, now()), updated_at = now()
+ WHERE id = $1`, jobID)
+
+ runCtx, runCancel := context.WithTimeout(ctx, 25*time.Minute)
+ defer runCancel()
+ if err := pipeline.ProcessJob(runCtx, jobID); err != nil {
+ close(defend)
+ log.Fatalf("ProcessJob: %v", err)
+ }
+ close(defend)
+
+ items, err := pipeline.LoadV1ProcessJobItems(ctx, companyID, jobID, "full")
+ if err != nil {
+ log.Fatalf("LoadV1ProcessJobItems: %v", err)
+ }
+ writeJSON(out, "final.json", map[string]any{
+ "data": map[string]any{
+ "process_id": jobID.String(),
+ "status": "COMPLETED",
+ "processing_type": "full",
+ "total_items": len(items),
+ "items": items,
+ "llm": map[string]any{
+ "base": base,
+ "model": model,
+ "source": roleCfg.Source,
+ "mode": modeLabel,
+ "byok": byok,
+ },
+ },
+ })
+
+ rows, err := pool.Query(ctx, `
+ SELECT rp.gtin,
+ COALESCE(pp.processed_name, pp.name, ''),
+ COALESCE(NULLIF(pp.processed_description, ''), pp.description, ''),
+ COALESCE(pp.category, ''),
+ COALESCE(c.name, ''),
+ COALESCE(pp.meta_title, ''),
+ COALESCE(pp.meta_description, ''),
+ COALESCE(pp.processed_attributes, pp.attributes, '{}'::jsonb),
+ COALESCE(pp.ai_provider_mode, ''),
+ c.description_template,
+ c.title_template,
+ pp.id,
+ COALESCE(pp.field_sources, '{}'::jsonb)
+ FROM processing_job_products pjp
+ JOIN raw_products rp ON rp.id = pjp.raw_product_id
+ LEFT JOIN processed_products pp ON pp.id = pjp.processed_product_id
+ LEFT JOIN categories c ON c.company_id = pp.company_id AND c.unique_id = pp.category
+ WHERE pjp.job_id = $1
+ ORDER BY rp.gtin`, jobID)
+ if err != nil {
+ log.Fatalf("db products: %v", err)
+ }
+ defer rows.Close()
+
+ dbProducts := make([]dbProduct, 0)
+ for rows.Next() {
+ var p dbProduct
+ var ppID *uuid.UUID
+ var attrs, sources []byte
+ if err := rows.Scan(&p.EAN, &p.Title, &p.Description, &p.Category, &p.CategoryName,
+ &p.MetaTitle, &p.MetaDescription, &attrs, &p.AIProviderMode,
+ &p.DescTemplate, &p.TitleTemplate, &ppID, &sources); err != nil {
+ log.Fatal(err)
+ }
+ if ppID != nil {
+ p.ProductID = ppID.String()
+ }
+ p.Label = eanLabels[p.EAN]
+ p.Attributes = attrs
+ p.FieldSources = sources
+ p.FormulaConstraint = processing.FormatDescriptionFormulaConstraint(p.DescTemplate)
+ dbProducts = append(dbProducts, p)
+ }
+ writeJSON(out, "db_products.json", dbProducts)
+ scoreAndWrite(out, jobID.String(), resolveInfo, dbProducts)
+ fmt.Printf("BATCH_B JOB %s products=%d live_base=%s model=%s\n", jobID, len(dbProducts), base, model)
+}
+
+func waitForeignJobs(ctx context.Context, pool *pgxpool.Pool, companyID uuid.UUID) {
+ deadline := time.Now().Add(18 * time.Minute)
+ for time.Now().Before(deadline) {
+ var n int
+ err := pool.QueryRow(ctx, `
+ SELECT count(*) FROM processing_jobs
+ WHERE company_id = $1 AND status IN ('pending','running','processing')`, companyID).Scan(&n)
+ if err != nil {
+ log.Printf("wait foreign jobs: %v", err)
+ return
+ }
+ if n == 0 {
+ log.Printf("queue clear — starting batch B")
+ return
+ }
+ log.Printf("waiting for %d foreign Demo job(s) before batch B…", n)
+ select {
+ case <-ctx.Done():
+ return
+ case <-time.After(15 * time.Second):
+ }
+ }
+ log.Printf("wait deadline reached — proceeding (will yield foreign jobs)")
+}
+
+func scoreAndWrite(out, jobID string, resolve map[string]any, products []dbProduct) {
+ scored := make([]map[string]any, 0, len(products))
+ pass, fail := 0, 0
+ var md strings.Builder
+ md.WriteString("# A1 enhance examples — batch B (appliances / monitors / mounts)\n\n")
+ md.WriteString(fmt.Sprintf("- scored_at_utc: `%s`\n", time.Now().UTC().Format(time.RFC3339)))
+ md.WriteString(fmt.Sprintf("- job_id: `%s`\n", jobID))
+ md.WriteString(fmt.Sprintf("- live_base: `%v` model: `%v` source: `%v`\n", resolve["completer_base"], resolve["completer_model"], resolve["role_source"]))
+ md.WriteString(fmt.Sprintf("- mock_fallback: **false** (env mock ignored when DB admin AI resolves)\n\n"))
+ md.WriteString("Scoring: title quality · HTML formula tags (h1/h2/p/ul) · meta · attrs\n\n")
+
+ for _, p := range products {
+ title := strings.TrimSpace(p.Title)
+ desc := p.Description
+ metaT := strings.TrimSpace(p.MetaTitle)
+ metaD := strings.TrimSpace(p.MetaDescription)
+
+ has := map[string]bool{
+ "h1": strings.Contains(strings.ToLower(desc), "= 8 && !brandOnlyish.MatchString(title)
+ titleNotes := []string{}
+ if title == "" {
+ titleNotes = append(titleNotes, "empty")
+ } else if brandOnlyish.MatchString(title) {
+ titleNotes = append(titleNotes, "brand_only")
+ } else if utf8.RuneCountInString(title) < 8 {
+ titleNotes = append(titleNotes, "too_short")
+ }
+ if strings.Contains(strings.ToLower(title), "title formula") || strings.Contains(strings.ToLower(title), "category:") {
+ titleOK = false
+ titleNotes = append(titleNotes, "prompt_leakage")
+ }
+
+ metaOK := metaT != "" && metaD != "" && !poisonMeta.MatchString(metaT) &&
+ !strings.Contains(strings.ToLower(metaT), "short retail title")
+ metaNotes := []string{}
+ if metaT == "" {
+ metaNotes = append(metaNotes, "empty_meta_title")
+ }
+ if metaD == "" {
+ metaNotes = append(metaNotes, "empty_meta_description")
+ }
+ if poisonMeta.MatchString(metaT) {
+ metaNotes = append(metaNotes, "poison_|digits")
+ }
+
+ attrMap := map[string]any{}
+ _ = json.Unmarshal(p.Attributes, &attrMap)
+ attrKeys := make([]string, 0, len(attrMap))
+ dirty := []string{}
+ for k, v := range attrMap {
+ attrKeys = append(attrKeys, k)
+ sv := strings.TrimSpace(fmt.Sprint(v))
+ if sv == "" || strings.EqualFold(sv, "null") || strings.EqualFold(sv, "n/a") {
+ dirty = append(dirty, k+":empty")
+ }
+ if strings.Contains(strings.ToLower(k), "ean") || strings.Contains(strings.ToLower(k), "gtin") {
+ dirty = append(dirty, k+":id_like_key")
+ }
+ }
+ attrsOK := len(attrKeys) > 0 && len(dirty) == 0
+
+ checks := map[string]string{
+ "title": passFail(titleOK),
+ "html_tags": passFail(htmlOK),
+ "meta": passFail(metaOK),
+ "attrs": passFail(attrsOK),
+ "category": passFail(p.Category != "" && p.CategoryName != ""),
+ "desc_ne_title": passFail(strings.TrimSpace(stripTags(desc)) != "" && strings.TrimSpace(stripTags(desc)) != title),
+ "ai_internal": passFail(strings.EqualFold(p.AIProviderMode, "internal") || p.AIProviderMode == ""),
+ }
+ failFlags := []string{}
+ for k, v := range checks {
+ if v == "FAIL" {
+ failFlags = append(failFlags, k)
+ }
+ }
+ verdict := "PASS"
+ if len(failFlags) > 0 {
+ verdict = "FAIL"
+ fail++
+ } else {
+ pass++
+ }
+
+ row := map[string]any{
+ "ean": p.EAN,
+ "label": p.Label,
+ "product_id": p.ProductID,
+ "title": title,
+ "category": p.Category,
+ "category_name": p.CategoryName,
+ "desc_len": len(desc),
+ "desc_preview": truncate(stripTags(desc), 140),
+ "meta_title": metaT,
+ "meta_description": truncate(metaD, 160),
+ "attr_keys": attrKeys,
+ "dirty_attrs": dirty,
+ "attributes": attrMap,
+ "has_tags": has,
+ "formula_constraint": p.FormulaConstraint,
+ "formula_override_hint": strings.Contains(strings.ToLower(fmt.Sprint(p.FieldSources)), "formula"),
+ "ai_provider_mode": p.AIProviderMode,
+ "title_notes": titleNotes,
+ "meta_notes": metaNotes,
+ "checks": checks,
+ "fail_flags": failFlags,
+ "verdict": verdict,
+ }
+ scored = append(scored, row)
+
+ md.WriteString(fmt.Sprintf("## %s — %s (`%s`)\n\n", p.EAN, p.Label, verdict))
+ md.WriteString(fmt.Sprintf("- **title:** %s\n", title))
+ md.WriteString(fmt.Sprintf("- **category:** %s / %s\n", p.Category, p.CategoryName))
+ md.WriteString(fmt.Sprintf("- **meta_title:** %s\n", metaT))
+ md.WriteString(fmt.Sprintf("- **meta_description:** %s\n", truncate(metaD, 200)))
+ md.WriteString(fmt.Sprintf("- **attrs:** %s\n", strings.Join(attrKeys, ", ")))
+ md.WriteString(fmt.Sprintf("- **HTML tags:** h1=%v h2=%v p=%v ul=%v\n", has["h1"], has["h2"], has["p"], has["ul"]))
+ md.WriteString(fmt.Sprintf("- **checks:** title=%s html=%s meta=%s attrs=%s\n\n", checks["title"], checks["html_tags"], checks["meta"], checks["attrs"]))
+ md.WriteString("### Description HTML (raw)\n\n```html\n")
+ if len(desc) > 4096 {
+ md.WriteString(desc[:4096])
+ md.WriteString("\n\n")
+ } else {
+ md.WriteString(desc)
+ md.WriteString("\n")
+ }
+ md.WriteString("```\n\n")
+ }
+
+ total := len(products)
+ rate := 0
+ if total > 0 {
+ rate = (pass * 100) / total
+ }
+ scorecard := map[string]any{
+ "batch": "B",
+ "date": "2026-08-16",
+ "scored_at_utc": time.Now().UTC().Format(time.RFC3339),
+ "company_id": "2b3159b0-fc08-415b-b248-35ed02a6baab",
+ "company_name": "Platform Demo",
+ "job_id": jobID,
+ "selection": eanLabels,
+ "live_llm": resolve,
+ "mock_as_live": false,
+ "asserts": []string{"title_quality", "html_h1_h2_p_ul", "meta", "attrs", "category", "desc_ne_title"},
+ "summary": map[string]any{"pass": pass, "fail": fail, "total": total, "pass_rate": rate},
+ "verdict": map[bool]string{true: "PASS", false: "FAIL"}[fail == 0 && total > 0],
+ "products": scored,
+ "max_tokens_note": fmt.Sprintf("MaxTokensEnhance=%d MaxTokensEnhanceRetry=%d", processing.MaxTokensEnhance, processing.MaxTokensEnhanceRetry),
+ }
+ writeJSON(out, "scorecard.json", scorecard)
+ _ = os.WriteFile(filepath.Join(out, "examples.md"), []byte(md.String()), 0o644)
+
+ summary := fmt.Sprintf("# Batch B summary\n\n- verdict: **%s** (%d/%d)\n- live: `%v` / `%v`\n- mock_as_live: false\n- artifacts: scorecard.json, examples.md, db_products.json, final.json, resolve.json\n",
+ scorecard["verdict"], pass, total, resolve["completer_base"], resolve["completer_model"])
+ _ = os.WriteFile(filepath.Join(out, "summary.md"), []byte(summary), 0o644)
+}
+
+func passFail(ok bool) string {
+ if ok {
+ return "PASS"
+ }
+ return "FAIL"
+}
+
+func stripTags(s string) string {
+ re := regexp.MustCompile(`<[^>]+>`)
+ return strings.TrimSpace(re.ReplaceAllString(s, " "))
+}
+
+func truncate(s string, n int) string {
+ r := []rune(strings.TrimSpace(s))
+ if len(r) <= n {
+ return string(r)
+ }
+ return string(r[:n]) + "…"
+}
+
+func failResolve(out, msg string) {
+ writeJSON(out, "resolve.json", map[string]any{"live": false, "fail_reason": msg, "batch": "B"})
+ log.Fatalf("LIVE LLM REQUIRED: %s", msg)
+}
+
+func writeJSON(out, name string, v any) {
+ raw, err := json.MarshalIndent(v, "", " ")
+ if err != nil {
+ log.Fatalf("marshal %s: %v", name, err)
+ }
+ if err := os.WriteFile(filepath.Join(out, name), raw, 0o644); err != nil {
+ log.Fatalf("write %s: %v", name, err)
+ }
+}
diff --git a/apps/api/cmd/repair-category-prompts/main.go b/apps/api/cmd/repair-category-prompts/main.go
index 6656124..dc0afb4 100644
--- a/apps/api/cmd/repair-category-prompts/main.go
+++ b/apps/api/cmd/repair-category-prompts/main.go
@@ -1,13 +1,18 @@
-// Command repair-category-prompts replaces legacy A1 / Platform Demo categories.prompt
-// HTML marketing formulas with aiprompts.CategoryEnhanceUserTemplate (JSON-compatible
-// user overlay: {{name}} {{description}} {{attrs}} {{category}} {{language}}; stores
-// both prompt->>'sl' and "*"). Does not touch title_template / description_template
-// (formulas are appended as plain-text instructions at enhance render time).
+// Command repair-category-prompts rewrites A1 / Platform Demo categories.prompt
+// values into aiprompts role-sectioned overlays (Title / Description / Meta /
+// Attributes). Prefers wp_product_categories.sql (SEED_A1_WP_CATEGORIES /
+// Downloads) as source of truth, else a1-category-prompts.json. Legacy combined
+// Slovenian name+description blobs are split so naming rules land under Title
+// and HTML under Description; otherwise CategoryEnhanceUserTemplate is used.
+// Also repairs empty or brand-only title_template and empty description_template
+// from legacy / HTML / meta rules (never brand-only).
//
// Usage (from apps/api):
//
// go run ./cmd/repair-category-prompts -dry-run
// go run ./cmd/repair-category-prompts -apply
+// go run ./cmd/repair-category-prompts -apply -wp-categories "D:/Users/.../Downloads/wp_product_categories.sql"
+// go run ./cmd/repair-category-prompts -apply -prompts ../../scripts/seed/a1-category-prompts.json
//
// DATABASE_URL / -postgres required. Default is dry-run (count only).
package main
@@ -30,6 +35,8 @@ func main() {
postgresURL := flag.String("postgres", os.Getenv("DATABASE_URL"), "Postgres URL (DATABASE_URL)")
dryRun := flag.Bool("dry-run", true, "count rows that would update (default true)")
apply := flag.Bool("apply", false, "write updates (implies not dry-run)")
+ promptsPath := flag.String("prompts", "", "path to a1-category-prompts.json (optional fallback)")
+ wpPath := flag.String("wp-categories", os.Getenv("SEED_A1_WP_CATEGORIES"), "path to wp_product_categories.sql (preferred source of truth)")
flag.Parse()
if strings.TrimSpace(*postgresURL) == "" {
@@ -49,8 +56,13 @@ func main() {
}
defer pg.Close()
+ opts := catalog.RepairA1DemoOptions{
+ SeedPromptsPath: strings.TrimSpace(*promptsPath),
+ WPCategoriesPath: strings.TrimSpace(*wpPath),
+ }
+
// Always print dry-run counts first when applying, so operators see the delta.
- preview, err := catalog.RepairA1DemoCategoryEnhancePrompts(ctx, pg, true)
+ preview, err := catalog.RepairA1DemoCategoryEnhancePromptsWithOptions(ctx, pg, true, opts)
if err != nil {
log.Fatalf("dry-run: %v", err)
}
@@ -60,7 +72,7 @@ func main() {
return
}
- res, err := catalog.RepairA1DemoCategoryEnhancePrompts(ctx, pg, false)
+ res, err := catalog.RepairA1DemoCategoryEnhancePromptsWithOptions(ctx, pg, false, opts)
if err != nil {
log.Fatalf("apply: %v", err)
}
diff --git a/apps/api/cmd/seed-a1-teammate/main.go b/apps/api/cmd/seed-a1-teammate/main.go
new file mode 100644
index 0000000..b768fe6
--- /dev/null
+++ b/apps/api/cmd/seed-a1-teammate/main.go
@@ -0,0 +1,136 @@
+// Command seed-a1-teammate upserts a second A1 company member (not the owner)
+// with must_set_password=true and prints a one-time accept-invite URL.
+//
+// Usage:
+//
+// go run ./cmd/seed-a1-teammate -postgres "$DATABASE_URL"
+// go run ./cmd/seed-a1-teammate -email a1-other@descrybe.local -role member
+package main
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "log"
+ "os"
+ "strings"
+ "time"
+
+ "github.com/descrybe/descrybe-v2/apps/api/internal/auth"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/billing"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/mail"
+ "github.com/google/uuid"
+ "github.com/jackc/pgx/v5/pgxpool"
+)
+
+func main() {
+ postgresURL := flag.String("postgres", os.Getenv("DATABASE_URL"), "Postgres URL")
+ email := flag.String("email", "a1-other@descrybe.local", "Teammate email to upsert")
+ name := flag.String("name", "A1 teammate", "Display name")
+ role := flag.String("role", "member", "Membership role: member|admin")
+ webOrigin := flag.String("web-origin", firstNonEmpty(os.Getenv("WEB_ORIGIN"), "http://localhost:28472"), "Web origin for accept-invite URL")
+ flag.Parse()
+
+ if strings.TrimSpace(*postgresURL) == "" {
+ log.Fatal("-postgres / DATABASE_URL is required")
+ }
+ emailNorm := strings.ToLower(strings.TrimSpace(*email))
+ if emailNorm == "" {
+ log.Fatal("-email is required")
+ }
+ if emailNorm == "a1-primary@descrybe.local" {
+ log.Fatal("-email must not be a1-primary@descrybe.local (that user remains the company owner)")
+ }
+ memRole := auth.NormalizeMembershipRole(*role)
+
+ ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
+ defer cancel()
+
+ pg, err := pgxpool.New(ctx, *postgresURL)
+ if err != nil {
+ log.Fatalf("postgres: %v", err)
+ }
+ defer pg.Close()
+
+ var companyID uuid.UUID
+ var companyName string
+ err = pg.QueryRow(ctx, `
+ SELECT id, name FROM companies
+ WHERE legacy_company_id = $1
+ ORDER BY created_at ASC
+ LIMIT 1`, billing.A1LegacyCompanyID).Scan(&companyID, &companyName)
+ if err != nil {
+ log.Fatalf("find A1 company (legacy_company_id=%s): %v", billing.A1LegacyCompanyID, err)
+ }
+
+ tx, err := pg.Begin(ctx)
+ if err != nil {
+ log.Fatalf("begin: %v", err)
+ }
+ defer tx.Rollback(ctx)
+
+ var userID uuid.UUID
+ err = tx.QueryRow(ctx, `
+ INSERT INTO users (email, name, must_set_password, is_platform_admin, is_active, updated_at)
+ VALUES ($1, $2, true, false, true, now())
+ ON CONFLICT (email) DO UPDATE SET
+ name = EXCLUDED.name,
+ must_set_password = true,
+ password_hash = NULL,
+ is_active = true,
+ updated_at = now()
+ RETURNING id`, emailNorm, strings.TrimSpace(*name)).Scan(&userID)
+ if err != nil {
+ log.Fatalf("upsert user: %v", err)
+ }
+
+ _, err = tx.Exec(ctx, `
+ INSERT INTO memberships (company_id, user_id, role, status)
+ VALUES ($1, $2, $3, 'active')
+ ON CONFLICT (company_id, user_id) DO UPDATE SET
+ role = EXCLUDED.role,
+ status = 'active',
+ updated_at = now()`, companyID, userID, memRole)
+ if err != nil {
+ log.Fatalf("upsert membership: %v", err)
+ }
+
+ // Ensure a1-primary remains owner when present.
+ _, _ = tx.Exec(ctx, `
+ UPDATE companies c
+ SET owner_user_id = u.id, updated_at = now()
+ FROM users u
+ JOIN memberships m ON m.user_id = u.id AND m.company_id = c.id AND m.status = 'active'
+ WHERE c.id = $1
+ AND lower(u.email) = 'a1-primary@descrybe.local'`, companyID)
+
+ if err := tx.Commit(ctx); err != nil {
+ log.Fatalf("commit: %v", err)
+ }
+
+ svc := &auth.Service{Pool: pg}
+ inv, err := svc.ReissueSetPasswordInvite(ctx, userID, 0)
+ if err != nil {
+ log.Fatalf("issue set-password invite: %v", err)
+ }
+ acceptURL := mail.AcceptInviteURL(strings.TrimSpace(*webOrigin), inv.Token)
+
+ fmt.Printf("A1 teammate ready\n")
+ fmt.Printf(" company: %s (%s)\n", companyName, companyID)
+ fmt.Printf(" email: %s\n", emailNorm)
+ fmt.Printf(" user_id: %s\n", userID)
+ fmt.Printf(" role: %s\n", memRole)
+ fmt.Printf(" expires_at: %s\n", inv.ExpiresAt.UTC().Format(time.RFC3339))
+ fmt.Printf(" accept_url: %s\n", acceptURL)
+ fmt.Printf("\nShare accept_url with the teammate (or Admin → Users → Send set-password for this user).\n")
+ fmt.Printf("While impersonating a1-primary, Settings → Team → Invite also returns a copyable link when SMTP is off.\n")
+}
+
+func firstNonEmpty(vals ...string) string {
+ for _, v := range vals {
+ if strings.TrimSpace(v) != "" {
+ return strings.TrimSpace(v)
+ }
+ }
+ return ""
+}
diff --git a/apps/api/cmd/seed-a1/category_prompts.go b/apps/api/cmd/seed-a1/category_prompts.go
index dc625fe..c6243b7 100644
--- a/apps/api/cmd/seed-a1/category_prompts.go
+++ b/apps/api/cmd/seed-a1/category_prompts.go
@@ -13,6 +13,7 @@ import (
"unicode"
"github.com/descrybe/descrybe-v2/apps/api/internal/aiprompts"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/catalog"
"github.com/descrybe/descrybe-v2/apps/api/internal/security"
"github.com/google/uuid"
"github.com/jackc/pgx/v5/pgxpool"
@@ -41,6 +42,10 @@ var (
)
func defaultCategoryPromptsPath(archivePath string) string {
+ // Prefer live WP dump when present (Sync A1 / seed share the same source of truth).
+ if p := catalog.ResolveWPCategoryPromptsPath(""); p != "" {
+ return p
+ }
if strings.TrimSpace(archivePath) != "" {
return filepath.Join(filepath.Dir(archivePath), "a1-category-prompts.json")
}
@@ -52,6 +57,10 @@ func loadCategoryPromptsFile(path string) (categoryPromptsFile, error) {
if path == "" || path == "." {
return categoryPromptsFile{}, fmt.Errorf("category prompts path is empty")
}
+ base := strings.ToLower(filepath.Base(path))
+ if strings.HasPrefix(base, "wp_product_categories") && strings.HasSuffix(base, ".sql") {
+ return loadCategoryPromptsFromWPSQL(path)
+ }
// Allowlist the committed seed filename (blocks accidental reads of unrelated dumps).
if filepath.Base(path) != "a1-category-prompts.json" {
return categoryPromptsFile{}, fmt.Errorf("refusing unexpected category prompts file name %q", filepath.Base(path))
@@ -76,6 +85,36 @@ func loadCategoryPromptsFile(path string) (categoryPromptsFile, error) {
return f, nil
}
+func loadCategoryPromptsFromWPSQL(path string) (categoryPromptsFile, error) {
+ raw, err := os.ReadFile(path)
+ if err != nil {
+ return categoryPromptsFile{}, fmt.Errorf("read wp category prompts: %w", err)
+ }
+ if len(raw) > 16<<20 {
+ return categoryPromptsFile{}, fmt.Errorf("wp category prompts file too large (%d bytes)", len(raw))
+ }
+ parsed, err := catalog.ParseWPProductCategoriesSQL(string(raw))
+ if err != nil {
+ return categoryPromptsFile{}, err
+ }
+ entries := make([]categoryPromptEntry, 0, len(parsed))
+ for _, e := range parsed {
+ entries = append(entries, categoryPromptEntry{
+ Name: e.Name,
+ UniqueID: e.UniqueID,
+ Prompt: e.Prompt,
+ })
+ }
+ if len(entries) == 0 {
+ return categoryPromptsFile{}, fmt.Errorf("wp category prompts file has no entries")
+ }
+ return categoryPromptsFile{
+ Version: 1,
+ Source: filepath.Base(path),
+ Entries: entries,
+ }, nil
+}
+
// modernizeLegacyPromptPlaceholders rewrites v1 {""OPIS IZDELKA""} tokens to {{description}} / {{name}}.
func modernizeLegacyPromptPlaceholders(prompt string) string {
prompt = reLegacyDesc.ReplaceAllString(prompt, "{{description}}")
@@ -148,16 +187,11 @@ func applyCategoryPrompts(ctx context.Context, pg *pgxpool.Pool, companyID uuid.
byNorm := make(map[string]string, len(file.Entries))
byUnique := make(map[string]string, len(file.Entries))
- // Overlay sets the shared role-sectioned enhance user template
- // (aiprompts.CategoryEnhanceUserTemplate — title/description/meta/attributes).
- // Seed JSON selects which categories get a prompt (prefer unique_id, else name).
- // Unique title/description/meta formulas stay in title_template / description_template.
+ // Overlay: split each legacy combined Name+Description prompt into role-sectioned
+ // enhance USER text (Title / Description / Meta / Attributes). Unique title /
+ // description / meta formulas stay in title_template / description_template.
// Stored under "sl" + "*" so prompt->>'sl' and LangPromptAny both resolve;
// language stays via {{language}}.
- canonical := prepareCategoryPrompt(aiprompts.CategoryEnhanceUserTemplate)
- if canonical == "" {
- return out, fmt.Errorf("CategoryEnhanceUserTemplate sanitized to empty")
- }
for _, e := range file.Entries {
uid := strings.TrimSpace(e.UniqueID)
name := strings.TrimSpace(e.Name)
@@ -165,6 +199,23 @@ func applyCategoryPrompts(ctx context.Context, pg *pgxpool.Pool, companyID uuid.
out.Skipped++
continue
}
+ raw := strings.TrimSpace(e.Prompt)
+ var canonical string
+ if raw == "" {
+ out.Skipped++
+ continue
+ }
+ if aiprompts.IsLegacyCombinedEnhancePrompt(raw) {
+ canonical = prepareCategoryPrompt(aiprompts.SplitLegacyCombinedEnhancePrompt(raw))
+ } else if aiprompts.CategoryEnhanceHasRoleSections(raw) {
+ canonical = prepareCategoryPrompt(raw)
+ } else {
+ canonical = prepareCategoryPrompt(aiprompts.CategoryEnhanceUserTemplate)
+ }
+ if canonical == "" {
+ out.Skipped++
+ continue
+ }
if uid != "" {
byUnique[strings.ToLower(uid)] = canonical
}
diff --git a/apps/api/internal/aiprompts/description_formula.go b/apps/api/internal/aiprompts/description_formula.go
new file mode 100644
index 0000000..bc76221
--- /dev/null
+++ b/apps/api/internal/aiprompts/description_formula.go
@@ -0,0 +1,152 @@
+package aiprompts
+
+import (
+ "encoding/json"
+ "regexp"
+ "strings"
+)
+
+var (
+ reLegacyHTMLBlock = regexp.MustCompile(`(?is)<\s*(h[1-4]|p|ul|ol|li|b|strong)\s*>\s*\{?\s*(.*?)\s*\}?\s*<\s*/\s*(?:h[1-4]|p|ul|ol|li|b|strong)\s*>`)
+ reLegacyBoldUL = regexp.MustCompile(`(?is)<\s*b\s*>\s*\{?\s*(.*?)\s*\}?\s*<\s*/\s*b\s*>\s*<\s*ul\s*>\s*<\s*li\s*>\s*\{?\s*(.*?)\s*\}?\s*<\s*/\s*li\s*>\s*<\s*/\s*ul\s*>`)
+)
+
+// DescriptionFormulaSection is one ordered block in categories.description_template.
+type DescriptionFormulaSection struct {
+ Type string `json:"type"`
+ Instructions string `json:"instructions"`
+}
+
+// DescriptionFormula is the JSON shape stored in categories.description_template
+// (sections + optional SEO meta instruction strings).
+type DescriptionFormula struct {
+ Sections []DescriptionFormulaSection `json:"sections,omitempty"`
+ MetaTitle string `json:"metaTitle,omitempty"`
+ MetaDescription string `json:"metaDescription,omitempty"`
+}
+
+// DescriptionTemplateNeedsRepair is true when template is missing or has no sections
+// (and no usable meta instructions).
+func DescriptionTemplateNeedsRepair(template any) bool {
+ f, ok := parseDescriptionFormula(template)
+ if !ok {
+ return true
+ }
+ if len(f.Sections) > 0 {
+ return false
+ }
+ return strings.TrimSpace(f.MetaTitle) == "" && strings.TrimSpace(f.MetaDescription) == ""
+}
+
+// DeriveDescriptionFormulaFromLegacyParts builds description_template from split
+// legacy DescriptionRules HTML + MetaRules.
+func DeriveDescriptionFormulaFromLegacyParts(parts LegacyEnhanceParts) DescriptionFormula {
+ out := DescriptionFormula{
+ MetaDescription: strings.TrimSpace(parts.MetaRules),
+ }
+ body := strings.TrimSpace(parts.DescriptionRules)
+ if body == "" {
+ return out
+ }
+
+ // Walk left-to-right so section order matches the legacy HTML template.
+ remaining := body
+ for remaining != "" {
+ boldUL := reLegacyBoldUL.FindStringSubmatchIndex(remaining)
+ block := reLegacyHTMLBlock.FindStringSubmatchIndex(remaining)
+ switch {
+ case boldUL != nil && (block == nil || boldUL[0] <= block[0]):
+ m := reLegacyBoldUL.FindStringSubmatch(remaining[boldUL[0]:boldUL[1]])
+ heading, instr := "", ""
+ if len(m) >= 3 {
+ heading = cleanLegacyInstruction(m[1])
+ instr = cleanLegacyInstruction(m[2])
+ }
+ if heading != "" && instr != "" && !strings.Contains(strings.ToLower(instr), strings.ToLower(heading)) {
+ instr = heading + ": " + instr
+ } else if instr == "" {
+ instr = heading
+ }
+ if strings.TrimSpace(instr) != "" {
+ out.Sections = append(out.Sections, DescriptionFormulaSection{Type: "ul", Instructions: instr})
+ }
+ remaining = remaining[boldUL[1]:]
+ case block != nil:
+ m := reLegacyHTMLBlock.FindStringSubmatch(remaining[block[0]:block[1]])
+ if len(m) >= 3 {
+ typ := strings.ToLower(strings.TrimSpace(m[1]))
+ instr := cleanLegacyInstruction(m[2])
+ if instr != "" {
+ switch typ {
+ case "b", "strong":
+ typ = "h2"
+ case "li", "ol":
+ typ = "ul"
+ }
+ out.Sections = append(out.Sections, DescriptionFormulaSection{Type: typ, Instructions: instr})
+ }
+ }
+ remaining = remaining[block[1]:]
+ default:
+ return out
+ }
+ }
+ return out
+}
+
+// DeriveDescriptionTemplateJSON encodes DeriveDescriptionFormulaFromLegacyParts for DB write.
+func DeriveDescriptionTemplateJSON(parts LegacyEnhanceParts) string {
+ f := DeriveDescriptionFormulaFromLegacyParts(parts)
+ if len(f.Sections) == 0 && strings.TrimSpace(f.MetaTitle) == "" && strings.TrimSpace(f.MetaDescription) == "" {
+ return ""
+ }
+ b, err := json.Marshal(f)
+ if err != nil {
+ return ""
+ }
+ return string(b)
+}
+
+func parseDescriptionFormula(template any) (DescriptionFormula, bool) {
+ if template == nil {
+ return DescriptionFormula{}, false
+ }
+ switch t := template.(type) {
+ case DescriptionFormula:
+ return t, true
+ case *DescriptionFormula:
+ if t == nil {
+ return DescriptionFormula{}, false
+ }
+ return *t, true
+ case []byte:
+ if len(t) == 0 {
+ return DescriptionFormula{}, false
+ }
+ var f DescriptionFormula
+ if err := json.Unmarshal(t, &f); err != nil {
+ return DescriptionFormula{}, false
+ }
+ return f, true
+ case string:
+ s := strings.TrimSpace(t)
+ if s == "" || s == "null" || s == "{}" {
+ return DescriptionFormula{}, false
+ }
+ var f DescriptionFormula
+ if err := json.Unmarshal([]byte(s), &f); err != nil {
+ return DescriptionFormula{}, false
+ }
+ return f, true
+ default:
+ b, err := json.Marshal(t)
+ if err != nil {
+ return DescriptionFormula{}, false
+ }
+ var f DescriptionFormula
+ if err := json.Unmarshal(b, &f); err != nil {
+ return DescriptionFormula{}, false
+ }
+ return f, true
+ }
+}
diff --git a/apps/api/internal/aiprompts/description_formula_test.go b/apps/api/internal/aiprompts/description_formula_test.go
new file mode 100644
index 0000000..82c8e5f
--- /dev/null
+++ b/apps/api/internal/aiprompts/description_formula_test.go
@@ -0,0 +1,56 @@
+package aiprompts
+
+import (
+ "strings"
+ "testing"
+)
+
+func TestDeriveDescriptionFormulaFromLegacyParts(t *testing.T) {
+ t.Parallel()
+ legacy := `Ustvari nov opis
+
+GPT predloga:
+{Napiši novo ime izdelka po formuli: "znamka", "tip izdelka lowercase". Ne uporabljaj vejic.}
+{Najprej napiši Novo_ime_izdelka in potem nadaljuj dokler nisi zapisal 140 znakov}
+
+{Napiši Novo ime izdelka in izpostavi en benefit}
+{Napiši odstavek, ki je dolg 100 besed.}
+{Tehnične specifikacije} {Napiši 3-10 tehničnih specifikacij v alinejah} `
+
+ parts := ParseLegacyCombinedEnhancePrompt(legacy)
+ if !parts.WasLegacy {
+ t.Fatal("expected legacy parse")
+ }
+ f := DeriveDescriptionFormulaFromLegacyParts(parts)
+ if strings.TrimSpace(f.MetaDescription) == "" || !strings.Contains(f.MetaDescription, "140") {
+ t.Fatalf("metaDescription=%q", f.MetaDescription)
+ }
+ if len(f.Sections) < 3 {
+ t.Fatalf("want >=3 sections, got %#v", f.Sections)
+ }
+ if f.Sections[0].Type != "h2" {
+ t.Fatalf("first section should be h2 (document order), got %#v", f.Sections[0])
+ }
+ last := f.Sections[len(f.Sections)-1]
+ if last.Type != "ul" {
+ t.Fatalf("last section should be ul specs, got %#v", last)
+ }
+ var sawH2, sawP, sawUL bool
+ for _, s := range f.Sections {
+ switch s.Type {
+ case "h2":
+ sawH2 = true
+ case "p":
+ sawP = true
+ case "ul":
+ sawUL = true
+ }
+ }
+ if !sawH2 || !sawP || !sawUL {
+ t.Fatalf("missing section types: %#v", f.Sections)
+ }
+ raw := DeriveDescriptionTemplateJSON(parts)
+ if raw == "" || DescriptionTemplateNeedsRepair([]byte(raw)) {
+ t.Fatalf("derived template should be OK: %s", raw)
+ }
+}
diff --git a/apps/api/internal/aiprompts/kinds.go b/apps/api/internal/aiprompts/kinds.go
index bdae133..2ab40d4 100644
--- a/apps/api/internal/aiprompts/kinds.go
+++ b/apps/api/internal/aiprompts/kinds.go
@@ -64,7 +64,7 @@ type DefaultTemplate struct {
const CategoryEnhanceUserTemplate = `Your reply is parsed as JSON {"name":"string","description":"string","meta_title":"string","meta_description":"string","attrs":{}} only (system schema). Write all string fields in {{language}} (do not hardcode a language).
--- Title ---
-Role: title. Build JSON "name": short retail title; follow any Title formula constraints that follow; use Attrs.
+` + TitleRoleInstruction + `
Name: {{name}}
--- End Title ---
@@ -84,13 +84,22 @@ Attrs: {{attrs}}
--- End Attributes ---`
// CategoryEnhancePromptNeedsRepair reports whether a stored categories.prompt value
-// should be replaced by CategoryEnhanceUserTemplate (idempotent equality check).
+// should be rewritten into role-sectioned enhance overlay form. Empty prompts are
+// left alone. Canonical CategoryEnhanceUserTemplate and per-category overlays that
+// already carry Title/Description/Meta/Attributes markers (+ {{attrs}}) are OK —
+// equality with the shared template is not required (legacy splits keep Slovenian rules).
func CategoryEnhancePromptNeedsRepair(prompt string) bool {
p := strings.TrimSpace(prompt)
if p == "" {
return false
}
- return p != strings.TrimSpace(CategoryEnhanceUserTemplate)
+ if IsLegacyCombinedEnhancePrompt(p) {
+ return true
+ }
+ if CategoryEnhanceHasRoleSections(p) && strings.Contains(p, "{{attrs}}") {
+ return false
+ }
+ return true
}
// BuiltInDefaults match the previous hardcoded system prompts, with structured user templates.
@@ -103,7 +112,7 @@ var BuiltInDefaults = []DefaultTemplate{
Rules:
- Reply with ONLY JSON (no markdown)
- Schema: {"name":"string","description":"string","meta_title":"string","meta_description":"string","attrs":{}}
-- name: short retail title
+- name: short retail title — never brand-only; follow any Title formula (type + brand + model); use Attrs
- description: product body HTML only — follow any Description formula in the user message (structured HTML sections); otherwise 1-3 factual paragraphs; never copy name as description; never put SEO meta here
- meta_title: plain SEO title 50-60 chars (follow any SEO meta formula)
- meta_description: plain SEO snippet 120-155 chars (follow any SEO meta formula); never HTML
diff --git a/apps/api/internal/aiprompts/kinds_test.go b/apps/api/internal/aiprompts/kinds_test.go
index c5e945a..f8152c7 100644
--- a/apps/api/internal/aiprompts/kinds_test.go
+++ b/apps/api/internal/aiprompts/kinds_test.go
@@ -51,6 +51,14 @@ func TestCategoryEnhancePromptNeedsRepair(t *testing.T) {
if !CategoryEnhancePromptNeedsRepair(legacy) {
t.Fatal("legacy HTML prompt should need repair")
}
+ // Per-category sectioned overlay (Slovenian rules) must not force re-repair.
+ split := SplitLegacyCombinedEnhancePrompt(`GPT predloga:
+{Napiši tip izdelka}
+{140 znakov}
+{benefit} `)
+ if CategoryEnhancePromptNeedsRepair(split) {
+ t.Fatal("sectioned split overlay should be idempotent")
+ }
}
func TestBuiltInProductEnhanceUsesSharedUserTemplate(t *testing.T) {
diff --git a/apps/api/internal/aiprompts/legacy_split.go b/apps/api/internal/aiprompts/legacy_split.go
new file mode 100644
index 0000000..f39ab7f
--- /dev/null
+++ b/apps/api/internal/aiprompts/legacy_split.go
@@ -0,0 +1,177 @@
+package aiprompts
+
+import (
+ "regexp"
+ "strings"
+)
+
+var (
+ reLegacyNameTag = regexp.MustCompile(`(?is)<\s*name\s*>\s*\{?\s*(.*?)\s*\}?\s*<\s*/\s*name\s*>`)
+ reLegacyMetaTag = regexp.MustCompile(`(?is)<\s*metaDescription\s*>\s*\{?\s*(.*?)\s*\}?\s*<\s*/\s*metaDescription\s*>`)
+ reLegacyDescPH = regexp.MustCompile(`(?i)\{\s*""?\s*OPIS\s+IZDELKA\s*""?\s*\}`)
+ reLegacyNamePH = regexp.MustCompile(`(?i)\{\s*""?\s*STARO\s+IME\s+IZDELKA\s*""?\s*\}`)
+ reDoubledQuotes = regexp.MustCompile(`"{2,}`)
+)
+
+// LegacyEnhanceParts holds extracted role content from a combined PHP/A1 category Prompt.
+type LegacyEnhanceParts struct {
+ TitleRules string
+ DescriptionRules string
+ MetaRules string
+ WasLegacy bool
+}
+
+// IsLegacyCombinedEnhancePrompt reports whether prompt looks like the old A1/PHP
+// combined name+description(+meta) marketing blob (//GPT predloga).
+func IsLegacyCombinedEnhancePrompt(prompt string) bool {
+ p := strings.TrimSpace(prompt)
+ if p == "" {
+ return false
+ }
+ // Require real tag wrappers — not instructional mentions like
+ // `do NOT … / tags` in CategoryEnhanceUserTemplate.
+ hasNameTag := reLegacyNameTag.MatchString(p)
+ hasMetaTag := reLegacyMetaTag.MatchString(p)
+ if hasNameTag && (hasMetaTag || strings.Contains(strings.ToLower(p), "gpt predloga")) {
+ return true
+ }
+ if hasNameTag && (strings.Contains(p, "STARO IME IZDELKA") || strings.Contains(p, "OPIS IZDELKA")) {
+ return true
+ }
+ if strings.Contains(p, "STARO IME IZDELKA") && strings.Contains(p, "OPIS IZDELKA") && strings.Contains(strings.ToLower(p), "gpt predloga") {
+ return true
+ }
+ return false
+}
+
+// ParseLegacyCombinedEnhancePrompt extracts title / description / meta instruction
+// blobs from a legacy combined prompt. Placeholders are modernized to {{name}} /
+// {{description}}. WasLegacy is false when no combined markers are found.
+func ParseLegacyCombinedEnhancePrompt(prompt string) LegacyEnhanceParts {
+ raw := strings.TrimSpace(prompt)
+ out := LegacyEnhanceParts{}
+ if raw == "" || !IsLegacyCombinedEnhancePrompt(raw) {
+ return out
+ }
+ out.WasLegacy = true
+
+ if m := reLegacyNameTag.FindStringSubmatch(raw); len(m) == 2 {
+ out.TitleRules = cleanLegacyInstruction(m[1])
+ }
+ if m := reLegacyMetaTag.FindStringSubmatch(raw); len(m) == 2 {
+ out.MetaRules = cleanLegacyInstruction(m[1])
+ }
+
+ rest := reLegacyNameTag.ReplaceAllString(raw, "")
+ rest = reLegacyMetaTag.ReplaceAllString(rest, "")
+ if idx := strings.Index(strings.ToLower(rest), "gpt predloga:"); idx >= 0 {
+ rest = rest[idx+len("gpt predloga:"):]
+ }
+ // Drop Slovenian boilerplate intro lines that are not body structure.
+ rest = stripLegacyIntroNoise(rest)
+ out.DescriptionRules = cleanLegacyInstruction(rest)
+ return out
+}
+
+// SplitLegacyCombinedEnhancePrompt rewrites a legacy combined name+description(+meta)
+// prompt into CategoryEnhanceUserTemplate role sections, preserving Slovenian
+// naming / HTML / meta intent as category-specific rules under Title / Description / Meta.
+// Non-legacy input returns CategoryEnhanceUserTemplate (canonical shared overlay).
+func SplitLegacyCombinedEnhancePrompt(prompt string) string {
+ parts := ParseLegacyCombinedEnhancePrompt(prompt)
+ if !parts.WasLegacy {
+ return strings.TrimSpace(CategoryEnhanceUserTemplate)
+ }
+ return BuildCategoryEnhanceOverlay(parts)
+}
+
+// BuildCategoryEnhanceOverlay composes a role-sectioned enhance USER overlay from
+// extracted legacy parts (or empty parts → canonical template text with no extra rules).
+func BuildCategoryEnhanceOverlay(parts LegacyEnhanceParts) string {
+ var b strings.Builder
+ b.WriteString(`Your reply is parsed as JSON {"name":"string","description":"string","meta_title":"string","meta_description":"string","attrs":{}} only (system schema). Write all string fields in {{language}} (do not hardcode a language).`)
+ b.WriteString("\n\n")
+
+ b.WriteString(SectionTitleStart)
+ b.WriteByte('\n')
+ b.WriteString(TitleRoleInstruction)
+ b.WriteByte('\n')
+ if rules := strings.TrimSpace(parts.TitleRules); rules != "" {
+ b.WriteString("Category naming rules (preserve intent): ")
+ b.WriteString(rules)
+ b.WriteByte('\n')
+ }
+ b.WriteString("Name: {{name}}\n")
+ b.WriteString(SectionTitleEnd)
+ b.WriteString("\n\n")
+
+ b.WriteString(SectionDescriptionStart)
+ b.WriteString("\nRole: description. Build JSON \"description\": product body HTML only (not SEO meta). When a Description formula follows, emit ONE HTML string covering each section in order (tags matching type: h1/h2/h3/h4, p, ul); otherwise prefer 1-3 factual paragraphs as ONE string with limited HTML (
) — do NOT emit a competing full HTML document or wrap the whole reply in / tags.\n")
+ if rules := strings.TrimSpace(parts.DescriptionRules); rules != "" {
+ b.WriteString("Category HTML structure (preserve intent; emit as ONE description HTML string, not tagged name/meta blocks):\n")
+ b.WriteString(rules)
+ b.WriteByte('\n')
+ }
+ b.WriteString("Description: {{description}}\n")
+ b.WriteString(SectionDescriptionEnd)
+ b.WriteString("\n\n")
+
+ b.WriteString(SectionMetaStart)
+ b.WriteString("\nRole: meta. Build JSON \"meta_title\" and \"meta_description\" as plain SEO text (never HTML). meta_title: 50-60 chars; meta_description: 120-155 chars; follow any SEO meta formula that follows; never copy the full description HTML into meta_description.\n")
+ if rules := strings.TrimSpace(parts.MetaRules); rules != "" {
+ b.WriteString("Category SEO rules (preserve intent; plain text only): ")
+ b.WriteString(rules)
+ b.WriteByte('\n')
+ }
+ b.WriteString(SectionMetaEnd)
+ b.WriteString("\n\n")
+
+ b.WriteString(SectionAttributesStart)
+ b.WriteString("\nRole: attributes. Build JSON \"attrs\" as an object of attribute_key → value strings. Prefer Allowed attribute keys / Title formula attr slots that follow; remap near-miss labels onto those keys; fill missing keys only from Name/Description/Category/Attrs evidence; never invent specs; omit unknown keys; never invent dimensions.\n")
+ b.WriteString("Category: {{category}}\n")
+ b.WriteString("Attrs: {{attrs}}\n")
+ b.WriteString(SectionAttributesEnd)
+ return strings.TrimSpace(b.String())
+}
+
+func cleanLegacyInstruction(s string) string {
+ s = modernizeLegacyPlaceholders(s)
+ s = reDoubledQuotes.ReplaceAllString(s, `"`)
+ s = strings.ReplaceAll(s, "\r\n", "\n")
+ s = strings.TrimSpace(s)
+ // Collapse excessive blank lines.
+ for strings.Contains(s, "\n\n\n") {
+ s = strings.ReplaceAll(s, "\n\n\n", "\n\n")
+ }
+ return s
+}
+
+func modernizeLegacyPlaceholders(prompt string) string {
+ prompt = reLegacyDescPH.ReplaceAllString(prompt, "{{description}}")
+ prompt = reLegacyNamePH.ReplaceAllString(prompt, "{{name}}")
+ return prompt
+}
+
+func stripLegacyIntroNoise(s string) string {
+ lines := strings.Split(s, "\n")
+ out := make([]string, 0, len(lines))
+ for _, line := range lines {
+ trim := strings.TrimSpace(line)
+ lower := strings.ToLower(trim)
+ switch {
+ case trim == "":
+ if len(out) > 0 {
+ out = append(out, "")
+ }
+ case strings.HasPrefix(lower, "ustvari nov opis"),
+ strings.HasPrefix(lower, "star_opis_izdelka"),
+ strings.HasPrefix(lower, "staro_ime_izdelka"),
+ strings.HasPrefix(lower, "uporabi spodnjo gpt"),
+ strings.HasPrefix(lower, "sledi tej gpt"):
+ continue
+ default:
+ out = append(out, trim)
+ }
+ }
+ return strings.TrimSpace(strings.Join(out, "\n"))
+}
diff --git a/apps/api/internal/aiprompts/legacy_split_test.go b/apps/api/internal/aiprompts/legacy_split_test.go
new file mode 100644
index 0000000..a6aac37
--- /dev/null
+++ b/apps/api/internal/aiprompts/legacy_split_test.go
@@ -0,0 +1,71 @@
+package aiprompts
+
+import (
+ "strings"
+ "testing"
+)
+
+func TestSplitLegacyCombinedEnhancePrompt(t *testing.T) {
+ t.Parallel()
+ legacy := `Ustvari nov opis izdelka v Slovenščini z naslednjimi spremenljivkami:
+
+Star_opis_izdelka: {""OPIS IZDELKA""};
+Staro_ime_izdelka: {""STARO IME IZDELKA""};
+
+Uporabi spodnjo GPT predlogo.
+
+Sledi tej GPT predlogi stavek po stavek in sestavi nov opis izdelka:
+
+GPT predloga:
+
+
+{Napiši novo ime izdelka po formuli: ""tip izdelka sentence case"", ""znamka s pravilno kapitalizacijo"". Ne uporabljaj vejic.}
+{Najprej napiši Novo_ime_izdelka in potem nadaljuj dokler nisi zapisal 140 znakov vključno s presledki}
+
+{Napiši Novo ime izdelka in izpostavi en benefit}
+{Napiši odstavek, ki je dolg 100 besed, ki NE vsebuje Novo ime izdelka.}
{Tehnične specifikacije} {Napiši 3-10 tehničnih specifikacij v alinejah} `
+
+ got := SplitLegacyCombinedEnhancePrompt(legacy)
+ if !CategoryEnhanceHasRoleSections(got) {
+ t.Fatal("split output must be role-sectioned")
+ }
+ if CategoryEnhancePromptNeedsRepair(got) {
+ t.Fatal("split output should not need further repair")
+ }
+ if reLegacyNameTag.MatchString(got) || reLegacyMetaTag.MatchString(got) {
+ t.Fatal("split must not keep legacy / wrapper tags")
+ }
+ if !strings.Contains(got, "tip izdelka sentence case") {
+ t.Fatal("title section must preserve Slovenian naming formula intent")
+ }
+ if !strings.Contains(got, "140 znakov") {
+ t.Fatal("meta section must preserve Slovenian SEO intent")
+ }
+ if !strings.Contains(got, "Tehnične specifikacije") && !strings.Contains(got, "tehničnih specifikacij") {
+ t.Fatal("description section must preserve HTML body intent")
+ }
+ if !strings.Contains(got, "{{attrs}}") || !strings.Contains(got, "{{language}}") {
+ t.Fatal("overlay must keep {{attrs}} and {{language}}")
+ }
+ if strings.Contains(got, "OPIS IZDELKA") || strings.Contains(got, "STARO IME IZDELKA") {
+ t.Fatal("legacy placeholders must be modernized")
+ }
+}
+
+func TestSplitLegacyNonLegacyFallsBackToTemplate(t *testing.T) {
+ t.Parallel()
+ got := SplitLegacyCombinedEnhancePrompt("short retail overlay")
+ if strings.TrimSpace(got) != strings.TrimSpace(CategoryEnhanceUserTemplate) {
+ t.Fatalf("non-legacy should fall back to canonical template")
+ }
+}
+
+func TestIsLegacyCombinedEnhancePrompt(t *testing.T) {
+ t.Parallel()
+ if IsLegacyCombinedEnhancePrompt(CategoryEnhanceUserTemplate) {
+ t.Fatal("canonical template is not legacy combined")
+ }
+ if !IsLegacyCombinedEnhancePrompt("GPT predloga:\n{x} {y} ") {
+ t.Fatal("expected legacy detection")
+ }
+}
diff --git a/apps/api/internal/aiprompts/title_formula.go b/apps/api/internal/aiprompts/title_formula.go
new file mode 100644
index 0000000..644c47f
--- /dev/null
+++ b/apps/api/internal/aiprompts/title_formula.go
@@ -0,0 +1,298 @@
+package aiprompts
+
+import (
+ "encoding/json"
+ "fmt"
+ "regexp"
+ "strings"
+)
+
+var (
+ reQuotedNameSlot = regexp.MustCompile(`"([^"]+)"`)
+ reNameFormulaTail = regexp.MustCompile(`(?is)formuli\s*:\s*(.*?)(?:\.?\s*Ne uporabljaj|\.?$)`)
+)
+
+// TitleFormulaElement is one ordered slot in categories.title_template.
+type TitleFormulaElement struct {
+ ID string `json:"id"`
+ Type string `json:"type"` // "text" | "variable"
+ Label string `json:"label,omitempty"`
+ Value string `json:"value"`
+ Description string `json:"description,omitempty"`
+ Example string `json:"example,omitempty"`
+}
+
+// TitleFormula is the JSON shape stored in categories.title_template.
+type TitleFormula struct {
+ Separator string `json:"separator"`
+ Elements []TitleFormulaElement `json:"elements"`
+}
+
+// DefaultRetailTitleFormula matches the dominant old A1/PHP pattern:
+// product type + brand + full model (never brand alone).
+func DefaultRetailTitleFormula() TitleFormula {
+ return TitleFormula{
+ Separator: " ",
+ Elements: []TitleFormulaElement{
+ {ID: "0-variable-product_type", Type: "variable", Label: "Product type", Value: "product_type", Description: "Specific product type (sentence case)", Example: "Gaming monitor"},
+ {ID: "1-variable-brand", Type: "variable", Label: "Brand", Value: "brand", Description: "Brand with correct capitalization", Example: "Samsung"},
+ {ID: "2-variable-product_model", Type: "variable", Label: "Model", Value: "product_model", Description: "Full product model / ID", Example: "Odyssey G5"},
+ },
+ }
+}
+
+// TitleRoleInstruction is the shared Title-section body (CategoryEnhanceUserTemplate
+// and BuildCategoryEnhanceOverlay). Drives enhance JSON "name"; never brand-only.
+const TitleRoleInstruction = `Role: title. Build JSON "name": short retail title from Title formula + Attrs — never brand-only. Include product type and full model when evidence exists; follow any Title formula constraints that follow; use Attrs.`
+
+// TitleTemplateIsBrandOnly reports stubs that only encode brand (the migrated A1
+// default) so enhance collapses to brand-only names.
+func TitleTemplateIsBrandOnly(template any) bool {
+ els, ok := titleFormulaElements(template)
+ if !ok || len(els) == 0 {
+ return false
+ }
+ vars := 0
+ brandOnly := true
+ for _, el := range els {
+ switch strings.ToLower(strings.TrimSpace(el.Type)) {
+ case "variable":
+ vars++
+ v := strings.ToLower(strings.TrimSpace(el.Value))
+ v = strings.ReplaceAll(v, "-", "_")
+ if v != "brand" && v != "znamka" {
+ brandOnly = false
+ }
+ case "text":
+ // Free-form naming-rule blobs are not brand-only stubs.
+ if strings.TrimSpace(el.Value) != "" {
+ brandOnly = false
+ }
+ }
+ }
+ return vars > 0 && brandOnly
+}
+
+// TitleTemplateNeedsRepair is true when template is missing, unparseable, or
+// brand-only (insufficient vs old name/title rules).
+func TitleTemplateNeedsRepair(template any) bool {
+ els, ok := titleFormulaElements(template)
+ if !ok || len(els) == 0 {
+ return true
+ }
+ return TitleTemplateIsBrandOnly(template)
+}
+
+// DeriveTitleFormulaFromLegacyNameRules turns PHP/A1 formula text
+// (e.g. "tip izdelka …", "znamka …", "poln model …") into a structured
+// title_template. Falls back to DefaultRetailTitleFormula when parsing yields
+// fewer than two variable slots.
+func DeriveTitleFormulaFromLegacyNameRules(titleRules string) TitleFormula {
+ slots := extractLegacyNameSlots(titleRules)
+ out := TitleFormula{Separator: " ", Elements: make([]TitleFormulaElement, 0, len(slots))}
+ seen := map[string]struct{}{}
+ for _, slot := range slots {
+ el, ok := mapLegacyNameSlot(slot)
+ if !ok {
+ continue
+ }
+ key := el.Type + ":" + strings.ToLower(el.Value)
+ if _, dup := seen[key]; dup {
+ continue
+ }
+ seen[key] = struct{}{}
+ el.ID = fmt.Sprintf("%d-%s-%s", len(out.Elements), el.Type, sanitizeFormulaID(el.Value))
+ out.Elements = append(out.Elements, el)
+ }
+ if countFormulaVariables(out) < 2 {
+ return ensureRetailTitleCoverage(out)
+ }
+ return ensureRetailTitleCoverage(out)
+}
+
+// DeriveTitleTemplateJSON is the JSON encoding used when repairing categories.title_template.
+func DeriveTitleTemplateJSON(titleRules string) string {
+ f := DeriveTitleFormulaFromLegacyNameRules(titleRules)
+ b, err := json.Marshal(f)
+ if err != nil {
+ def := DefaultRetailTitleFormula()
+ b, _ = json.Marshal(def)
+ }
+ return string(b)
+}
+
+func titleFormulaElements(template any) ([]TitleFormulaElement, bool) {
+ if template == nil {
+ return nil, false
+ }
+ switch t := template.(type) {
+ case TitleFormula:
+ return t.Elements, len(t.Elements) > 0
+ case *TitleFormula:
+ if t == nil {
+ return nil, false
+ }
+ return t.Elements, len(t.Elements) > 0
+ case []byte:
+ if len(t) == 0 {
+ return nil, false
+ }
+ var f TitleFormula
+ if err := json.Unmarshal(t, &f); err != nil {
+ return nil, false
+ }
+ return f.Elements, len(f.Elements) > 0
+ case string:
+ s := strings.TrimSpace(t)
+ if s == "" || s == "null" || s == "{}" {
+ return nil, false
+ }
+ var f TitleFormula
+ if err := json.Unmarshal([]byte(s), &f); err != nil {
+ return nil, false
+ }
+ return f.Elements, len(f.Elements) > 0
+ case map[string]any:
+ b, err := json.Marshal(t)
+ if err != nil {
+ return nil, false
+ }
+ var f TitleFormula
+ if err := json.Unmarshal(b, &f); err != nil {
+ return nil, false
+ }
+ return f.Elements, len(f.Elements) > 0
+ default:
+ b, err := json.Marshal(t)
+ if err != nil {
+ return nil, false
+ }
+ var f TitleFormula
+ if err := json.Unmarshal(b, &f); err != nil {
+ return nil, false
+ }
+ return f.Elements, len(f.Elements) > 0
+ }
+}
+
+func extractLegacyNameSlots(rules string) []string {
+ rules = strings.TrimSpace(rules)
+ if rules == "" {
+ return nil
+ }
+ body := rules
+ if m := reNameFormulaTail.FindStringSubmatch(rules); len(m) == 2 {
+ body = m[1]
+ }
+ raw := reQuotedNameSlot.FindAllStringSubmatch(body, -1)
+ out := make([]string, 0, len(raw))
+ for _, m := range raw {
+ s := strings.TrimSpace(m[1])
+ s = strings.Trim(s, `",. `)
+ if s == "" || s == "," {
+ continue
+ }
+ out = append(out, s)
+ }
+ return out
+}
+
+func mapLegacyNameSlot(slot string) (TitleFormulaElement, bool) {
+ s := strings.TrimSpace(slot)
+ if s == "" {
+ return TitleFormulaElement{}, false
+ }
+ low := strings.ToLower(s)
+ switch {
+ case strings.Contains(low, "znamka"):
+ return TitleFormulaElement{Type: "variable", Label: "Brand", Value: "brand", Description: s, Example: "Samsung"}, true
+ case strings.Contains(low, "poln model"), strings.Contains(low, "model izdelka"),
+ strings.HasPrefix(low, "model "), low == "model", strings.Contains(low, "model uppercase"):
+ return TitleFormulaElement{Type: "variable", Label: "Model", Value: "product_model", Description: s, Example: "EHT6020"}, true
+ case strings.Contains(low, "tip izdelka"):
+ return TitleFormulaElement{Type: "variable", Label: "Product type", Value: "product_type", Description: s, Example: "Bluetooth speaker"}, true
+ case strings.HasPrefix(low, "barva"):
+ return TitleFormulaElement{Type: "variable", Label: "Color", Value: "barva", Description: s}, true
+ case strings.Contains(low, "dimenzij"):
+ return TitleFormulaElement{Type: "variable", Label: "Dimensions", Value: "dimensions", Description: s}, true
+ case strings.Contains(low, "diagonala"):
+ return TitleFormulaElement{Type: "variable", Label: "Diagonal", Value: "diagonala_zaslona", Description: s}, true
+ case strings.Contains(low, "pomnilnik"):
+ return TitleFormulaElement{Type: "variable", Label: "Memory", Value: "kapaciteta_ram_pomnilnika", Description: s}, true
+ case strings.Contains(low, "procesor"):
+ return TitleFormulaElement{Type: "variable", Label: "CPU", Value: "procesor", Description: s}, true
+ case strings.Contains(low, "grafi"):
+ return TitleFormulaElement{Type: "variable", Label: "GPU", Value: "graficna_kartica", Description: s}, true
+ case strings.Contains(low, "kapaciteta"):
+ return TitleFormulaElement{Type: "variable", Label: "Capacity", Value: "kapaciteta", Description: s}, true
+ case strings.Contains(low, "skupina po te") || strings.Contains(low, "teži") || strings.Contains(low, "tezi"):
+ return TitleFormulaElement{Type: "variable", Label: "Weight group", Value: "weight_group", Description: s}, true
+ case strings.Contains(low, "priklju"):
+ return TitleFormulaElement{Type: "variable", Label: "Connector", Value: "connector", Description: s}, true
+ case strings.Contains(low, "osvež") || strings.Contains(low, "osvez") || strings.Contains(low, "hz"):
+ return TitleFormulaElement{Type: "variable", Label: "Refresh rate", Value: "refresh_rate", Description: s}, true
+ case strings.Contains(low, "lowercase") || strings.Contains(low, "sentence case") || strings.Contains(low, "uppercase"):
+ // Category-specific type word ("cvrtnik lowercase", "monitor lowercase").
+ return TitleFormulaElement{Type: "variable", Label: "Product type", Value: "product_type", Description: s}, true
+ default:
+ // Keep unrecognized instructional slots as text so order/intent survive.
+ if len([]rune(s)) > 80 {
+ s = string([]rune(s)[:80])
+ }
+ return TitleFormulaElement{Type: "text", Label: "Naming detail", Value: s, Description: "Legacy name-formula slot"}, true
+ }
+}
+
+func countFormulaVariables(f TitleFormula) int {
+ n := 0
+ for _, el := range f.Elements {
+ if el.Type == "variable" {
+ n++
+ }
+ }
+ return n
+}
+
+func ensureRetailTitleCoverage(f TitleFormula) TitleFormula {
+ has := map[string]bool{}
+ for _, el := range f.Elements {
+ if el.Type != "variable" {
+ continue
+ }
+ k := strings.ToLower(strings.ReplaceAll(strings.TrimSpace(el.Value), "-", "_"))
+ has[k] = true
+ }
+ def := DefaultRetailTitleFormula()
+ for _, el := range def.Elements {
+ k := strings.ToLower(el.Value)
+ if has[k] {
+ continue
+ }
+ // Only inject core retail slots when missing.
+ if k == "brand" || k == "product_model" || (k == "product_type" && countFormulaVariables(f) < 2) {
+ el.ID = fmt.Sprintf("%d-%s-%s", len(f.Elements), el.Type, el.Value)
+ f.Elements = append(f.Elements, el)
+ has[k] = true
+ }
+ }
+ if countFormulaVariables(f) < 2 {
+ return def
+ }
+ if f.Separator == "" {
+ f.Separator = " "
+ }
+ return f
+}
+
+func sanitizeFormulaID(v string) string {
+ v = strings.ToLower(strings.TrimSpace(v))
+ v = strings.ReplaceAll(v, " ", "_")
+ v = strings.ReplaceAll(v, "-", "_")
+ if v == "" {
+ return "slot"
+ }
+ if len(v) > 40 {
+ v = v[:40]
+ }
+ return v
+}
diff --git a/apps/api/internal/aiprompts/title_formula_test.go b/apps/api/internal/aiprompts/title_formula_test.go
new file mode 100644
index 0000000..5ec7213
--- /dev/null
+++ b/apps/api/internal/aiprompts/title_formula_test.go
@@ -0,0 +1,107 @@
+package aiprompts
+
+import (
+ "strings"
+ "testing"
+)
+
+func TestDeriveTitleFormulaFromLegacyNameRules_Agregati(t *testing.T) {
+ t.Parallel()
+ rules := `Napiši novo ime izdelka po formuli: "tip izdelka sentence case", "znamka s pravilno kapitalizacijo", "poln model izdelka, če lahko z besedo in ID uppercase". Ne uporabljaj vejic.`
+ f := DeriveTitleFormulaFromLegacyNameRules(rules)
+ if len(f.Elements) < 3 {
+ t.Fatalf("want >=3 elements, got %#v", f.Elements)
+ }
+ vals := make([]string, 0, len(f.Elements))
+ for _, el := range f.Elements {
+ if el.Type == "variable" {
+ vals = append(vals, el.Value)
+ }
+ }
+ wantOrder := []string{"product_type", "brand", "product_model"}
+ for i, w := range wantOrder {
+ if i >= len(vals) || vals[i] != w {
+ t.Fatalf("vars=%v want prefix %v", vals, wantOrder)
+ }
+ }
+ if TitleTemplateIsBrandOnly(f) {
+ t.Fatal("derived formula must not be brand-only")
+ }
+}
+
+func TestDeriveTitleFormulaFromLegacyNameRules_CarSeatOrder(t *testing.T) {
+ t.Parallel()
+ rules := `Napiši novo ime izdelka po formuli: "znamka s pravilno kapitalizacijo", "tip izdelka lowercase", "poln model izdelka, če lahko z besedo in ID uppercase", "skupina po teži [kg]". Ne uporabljaj vejic.`
+ f := DeriveTitleFormulaFromLegacyNameRules(rules)
+ vars := []string{}
+ for _, el := range f.Elements {
+ if el.Type == "variable" {
+ vars = append(vars, el.Value)
+ }
+ }
+ if len(vars) < 3 || vars[0] != "brand" || vars[1] != "product_type" || vars[2] != "product_model" {
+ t.Fatalf("unexpected order: %v", vars)
+ }
+ foundWeight := false
+ for _, v := range vars {
+ if v == "weight_group" {
+ foundWeight = true
+ }
+ }
+ if !foundWeight {
+ t.Fatalf("missing weight_group in %v", vars)
+ }
+}
+
+func TestTitleTemplateIsBrandOnly(t *testing.T) {
+ t.Parallel()
+ brandOnly := map[string]any{
+ "separator": " ",
+ "elements": []any{
+ map[string]any{"type": "variable", "value": "brand", "label": "Znamka"},
+ },
+ }
+ if !TitleTemplateIsBrandOnly(brandOnly) {
+ t.Fatal("single brand variable should be brand-only")
+ }
+ if !TitleTemplateNeedsRepair(brandOnly) {
+ t.Fatal("brand-only needs repair")
+ }
+ if TitleTemplateIsBrandOnly(DefaultRetailTitleFormula()) {
+ t.Fatal("default retail must not be brand-only")
+ }
+ if TitleTemplateNeedsRepair(DefaultRetailTitleFormula()) {
+ t.Fatal("default retail must not need repair")
+ }
+ if !TitleTemplateNeedsRepair(nil) {
+ t.Fatal("nil needs repair")
+ }
+}
+
+func TestTitleRoleInstructionNeverBrandOnly(t *testing.T) {
+ t.Parallel()
+ if !strings.Contains(strings.ToLower(TitleRoleInstruction), "never brand-only") {
+ t.Fatal("TitleRoleInstruction must forbid brand-only names")
+ }
+ if !strings.Contains(CategoryEnhanceUserTemplate, TitleRoleInstruction) {
+ t.Fatal("CategoryEnhanceUserTemplate must embed TitleRoleInstruction")
+ }
+ split := SplitLegacyCombinedEnhancePrompt(`GPT predloga:
+{Napiši tip izdelka, znamka, poln model}
+{140 znakov}
+{benefit} `)
+ if !strings.Contains(split, "never brand-only") {
+ t.Fatalf("split Title section missing never brand-only: %s", split)
+ }
+}
+
+func TestDeriveTitleTemplateJSON_roundTrip(t *testing.T) {
+ t.Parallel()
+ raw := DeriveTitleTemplateJSON(`formuli: "tip izdelka sentence case", "znamka s pravilno kapitalizacijo", "poln model izdelka"`)
+ if TitleTemplateNeedsRepair(raw) {
+ t.Fatalf("derived JSON should be OK: %s", raw)
+ }
+ if !strings.Contains(raw, `"product_type"`) || !strings.Contains(raw, `"brand"`) || !strings.Contains(raw, `"product_model"`) {
+ t.Fatalf("missing core vars: %s", raw)
+ }
+}
diff --git a/apps/api/internal/auth/errors.go b/apps/api/internal/auth/errors.go
index e774f4a..b4111fc 100644
--- a/apps/api/internal/auth/errors.go
+++ b/apps/api/internal/auth/errors.go
@@ -34,7 +34,11 @@ func ClientError(err error) (msg string, ok bool) {
errors.Is(err, ErrEmailRequired),
errors.Is(err, ErrSyntheticEmail),
errors.Is(err, ErrNotEligibleSetPassword),
- errors.Is(err, ErrEmailMismatch):
+ errors.Is(err, ErrEmailMismatch),
+ errors.Is(err, ErrNotCompanyOwner),
+ errors.Is(err, ErrCannotRemoveOwner),
+ errors.Is(err, ErrTransferSelf),
+ errors.Is(err, ErrOwnerRequired):
return err.Error(), true
default:
return "", false
diff --git a/apps/api/internal/auth/ownership.go b/apps/api/internal/auth/ownership.go
new file mode 100644
index 0000000..0a520ba
--- /dev/null
+++ b/apps/api/internal/auth/ownership.go
@@ -0,0 +1,95 @@
+package auth
+
+import (
+ "context"
+ "errors"
+
+ "github.com/google/uuid"
+ "github.com/jackc/pgx/v5"
+)
+
+var (
+ ErrNotCompanyOwner = errors.New("company owner required")
+ ErrCannotRemoveOwner = errors.New("transfer ownership before removing the company owner")
+ ErrTransferSelf = errors.New("user is already the company owner")
+ ErrOwnerRequired = errors.New("new owner must be an active company member")
+)
+
+// CompanyOwnerID returns the billing representative for the company, if set.
+func (s *Service) CompanyOwnerID(ctx context.Context, companyID uuid.UUID) (uuid.UUID, bool, error) {
+ var owner *uuid.UUID
+ err := s.Pool.QueryRow(ctx, `SELECT owner_user_id FROM companies WHERE id = $1`, companyID).Scan(&owner)
+ if errors.Is(err, pgx.ErrNoRows) {
+ return uuid.Nil, false, ErrCompanyNotFound
+ }
+ if err != nil {
+ return uuid.Nil, false, err
+ }
+ if owner == nil || *owner == uuid.Nil {
+ return uuid.Nil, false, nil
+ }
+ return *owner, true, nil
+}
+
+// IsCompanyOwner reports whether userID is the company's owner_user_id.
+func (s *Service) IsCompanyOwner(ctx context.Context, companyID, userID uuid.UUID) (bool, error) {
+ ownerID, ok, err := s.CompanyOwnerID(ctx, companyID)
+ if err != nil {
+ return false, err
+ }
+ return ok && ownerID == userID, nil
+}
+
+// TransferOwnership sets a new company owner. The target must be an active member.
+// The new owner is promoted to membership admin so they retain team powers.
+func (s *Service) TransferOwnership(ctx context.Context, companyID, newOwnerID uuid.UUID) error {
+ tx, err := s.Pool.Begin(ctx)
+ if err != nil {
+ return err
+ }
+ defer tx.Rollback(ctx)
+
+ var current *uuid.UUID
+ err = tx.QueryRow(ctx, `SELECT owner_user_id FROM companies WHERE id = $1 FOR UPDATE`, companyID).Scan(¤t)
+ if errors.Is(err, pgx.ErrNoRows) {
+ return ErrCompanyNotFound
+ }
+ if err != nil {
+ return err
+ }
+ if current != nil && *current == newOwnerID {
+ return ErrTransferSelf
+ }
+
+ var status string
+ err = tx.QueryRow(ctx, `
+ SELECT status FROM memberships
+ WHERE company_id = $1 AND user_id = $2`, companyID, newOwnerID).Scan(&status)
+ if errors.Is(err, pgx.ErrNoRows) {
+ return ErrOwnerRequired
+ }
+ if err != nil {
+ return err
+ }
+ if status != "active" {
+ return ErrOwnerRequired
+ }
+
+ _, err = tx.Exec(ctx, `
+ UPDATE memberships
+ SET role = 'admin', status = 'active', updated_at = now()
+ WHERE company_id = $1 AND user_id = $2`, companyID, newOwnerID)
+ if err != nil {
+ return err
+ }
+
+ tag, err := tx.Exec(ctx, `
+ UPDATE companies SET owner_user_id = $2, updated_at = now() WHERE id = $1`, companyID, newOwnerID)
+ if err != nil {
+ return err
+ }
+ if tag.RowsAffected() == 0 {
+ return ErrCompanyNotFound
+ }
+ return tx.Commit(ctx)
+}
diff --git a/apps/api/internal/auth/ownership_test.go b/apps/api/internal/auth/ownership_test.go
new file mode 100644
index 0000000..5db633d
--- /dev/null
+++ b/apps/api/internal/auth/ownership_test.go
@@ -0,0 +1,20 @@
+package auth
+
+import (
+ "testing"
+)
+
+func TestOwnershipErrorClientFacing(t *testing.T) {
+ t.Parallel()
+ for _, err := range []error{
+ ErrNotCompanyOwner,
+ ErrCannotRemoveOwner,
+ ErrTransferSelf,
+ ErrOwnerRequired,
+ } {
+ msg, ok := ClientError(err)
+ if !ok || msg == "" {
+ t.Fatalf("expected client error for %v", err)
+ }
+ }
+}
diff --git a/apps/api/internal/auth/service.go b/apps/api/internal/auth/service.go
index 0f9939b..2d3f3a5 100644
--- a/apps/api/internal/auth/service.go
+++ b/apps/api/internal/auth/service.go
@@ -102,7 +102,8 @@ func (s *Service) Register(ctx context.Context, in RegisterInput) (LoginResult,
var companyID uuid.UUID
err = tx.QueryRow(ctx, `
- INSERT INTO companies (name) VALUES ($1) RETURNING id`, strings.TrimSpace(in.CompanyName)).Scan(&companyID)
+ INSERT INTO companies (name, owner_user_id) VALUES ($1, $2) RETURNING id`,
+ strings.TrimSpace(in.CompanyName), userID).Scan(&companyID)
if err != nil {
return LoginResult{}, err
}
diff --git a/apps/api/internal/catalog/fix_catalog.go b/apps/api/internal/catalog/fix_catalog.go
index 68e02cb..0ef8b98 100644
--- a/apps/api/internal/catalog/fix_catalog.go
+++ b/apps/api/internal/catalog/fix_catalog.go
@@ -41,22 +41,46 @@ func EnsureCategoryAttributeLinks(ctx context.Context, pool *pgxpool.Pool, compa
}
// RepairCompanyCategoryEnhancePrompts is the company-scoped variant of
-// RepairA1DemoCategoryEnhancePrompts: same repairedCategoryEnhancePromptMap
-// (sl + "*" with CategoryEnhanceUserTemplate / {{attrs}}), applied to one company.
-// Idempotent — already-OK categories count as already_ok, not updated.
+// RepairA1DemoCategoryEnhancePrompts: loads wp_product_categories.sql when
+// available (upload bytes, SEED_A1_WP_CATEGORIES / Downloads), else
+// a1-category-prompts.json, splits legacy combined overlays into role sections,
+// and force-applies WP dump matches. Falls back to CategoryEnhanceUserTemplate.
+// Idempotent when unchanged.
func RepairCompanyCategoryEnhancePrompts(ctx context.Context, pool *pgxpool.Pool, companyID uuid.UUID) (updated, alreadyOK, emptySkipped int, err error) {
- if pool == nil {
- return 0, 0, 0, fmt.Errorf("nil pool")
- }
- want, err := repairedCategoryEnhancePromptMap()
+ res, err := RepairCompanyCategoryEnhancePromptsWithOptions(ctx, pool, companyID, RepairA1DemoOptions{})
if err != nil {
return 0, 0, 0, err
}
- summary := &RepairCategoryEnhancePromptsResult{ByCompany: map[string]int{}}
- if _, err := repairCompanyCategoryEnhancePrompts(ctx, pool, companyID, companyID.String(), want, false, summary); err != nil {
- return 0, 0, 0, err
+ return res.Updated, res.AlreadyOK, res.EmptySkipped, nil
+}
+
+// RepairCompanyCategoryEnhancePromptsWithOptions applies category enhance prompt
+// repair for one company. Pass WPCategoriesSQL to force-apply an uploaded dump
+// (Admin Sync A1); empty opts keep auto-detect fallback.
+func RepairCompanyCategoryEnhancePromptsWithOptions(ctx context.Context, pool *pgxpool.Pool, companyID uuid.UUID, opts RepairA1DemoOptions) (RepairCategoryEnhancePromptsResult, error) {
+ out := RepairCategoryEnhancePromptsResult{
+ ByCompany: map[string]int{},
}
- return summary.Updated, summary.AlreadyOK, summary.EmptySkipped, nil
+ if pool == nil {
+ return out, fmt.Errorf("nil pool")
+ }
+ if len(opts.WPCategoriesSQL) > 0 {
+ if _, _, err := LoadWPCategoryPromptOverlaysFromBytes(opts.WPCategoriesSQL); err != nil {
+ return out, fmt.Errorf("wp_product_categories upload: %w", err)
+ }
+ }
+ seedByNorm, seedByUID, seedMeta := resolveCategoryPromptOverlays(opts)
+ out.SeedPath = seedMeta.Path
+ out.WPCategoriesPath = seedMeta.WPPath
+ out.SeedEntries = seedMeta.Entries
+ forceFromSeed := seedMeta.ForceFromSeed
+ if opts.ForceFromSeed != nil {
+ forceFromSeed = *opts.ForceFromSeed
+ }
+ if _, err := repairCompanyCategoryEnhancePrompts(ctx, pool, companyID, companyID.String(), seedByNorm, seedByUID, false, forceFromSeed, &out); err != nil {
+ return out, err
+ }
+ return out, nil
}
// ResolvePlatformDemoCompanyID finds the Platform Demo sandbox (never A1 cohort).
diff --git a/apps/api/internal/catalog/fix_catalog_test.go b/apps/api/internal/catalog/fix_catalog_test.go
index 2696d92..a94b4f6 100644
--- a/apps/api/internal/catalog/fix_catalog_test.go
+++ b/apps/api/internal/catalog/fix_catalog_test.go
@@ -46,3 +46,54 @@ func TestRepairedCategoryEnhancePromptMapMatchesA1Demo(t *testing.T) {
t.Fatal("template must include {{attrs}}")
}
}
+
+func TestCategoryEnhancePromptMapOKAcceptsSplitOverlay(t *testing.T) {
+ t.Parallel()
+ legacy := `GPT predloga:
+{Napiši tip izdelka sentence case}
+{140 znakov}
+{benefit} `
+ split := aiprompts.SplitLegacyCombinedEnhancePrompt(legacy)
+ m := company.LangPromptMap{"sl": split, company.LangPromptAny: split}
+ if !categoryEnhancePromptMapOK(m) {
+ t.Fatal("split overlay should count as OK")
+ }
+}
+
+func TestJsonbTemplatePresent(t *testing.T) {
+ t.Parallel()
+ if jsonbTemplatePresent(nil) || jsonbTemplatePresent([]byte("null")) || jsonbTemplatePresent([]byte("{}")) {
+ t.Fatal("empty templates must be absent")
+ }
+ if !jsonbTemplatePresent([]byte(`{"elements":[{"type":"variable","value":"brand"}]}`)) {
+ t.Fatal("title elements should count")
+ }
+ if !jsonbTemplatePresent([]byte(`{"sections":[{"type":"p","instructions":"x"}]}`)) {
+ t.Fatal("description sections should count")
+ }
+}
+
+func TestDeriveTitleTemplateJSON(t *testing.T) {
+ t.Parallel()
+ got := aiprompts.DeriveTitleTemplateJSON(`Napiši novo ime po formuli: "tip izdelka sentence case", "znamka s pravilno kapitalizacijo", "poln model izdelka"`)
+ if aiprompts.TitleTemplateNeedsRepair(got) {
+ t.Fatalf("derived formula still needs repair: %s", got)
+ }
+ if !strings.Contains(got, "product_type") || !strings.Contains(got, "brand") || !strings.Contains(got, "product_model") {
+ t.Fatalf("expected type+brand+model: %s", got)
+ }
+ fallback := aiprompts.DeriveTitleTemplateJSON("")
+ if !strings.Contains(fallback, "brand") || !strings.Contains(fallback, "product_model") {
+ t.Fatalf("fallback title template: %s", fallback)
+ }
+ if aiprompts.TitleTemplateIsBrandOnly([]byte(`{"elements":[{"type":"variable","value":"brand"}]}`)) != true {
+ t.Fatal("single brand stub must be brand-only")
+ }
+}
+
+func TestNormalizeCategoryPromptName(t *testing.T) {
+ t.Parallel()
+ if got := normalizeCategoryPromptName(" Avtosedeži in lupinice "); got != "avtosedezi in lupinice" {
+ t.Fatalf("got %q", got)
+ }
+}
diff --git a/apps/api/internal/catalog/prompt_repair.go b/apps/api/internal/catalog/prompt_repair.go
index 87707a4..ca9a730 100644
--- a/apps/api/internal/catalog/prompt_repair.go
+++ b/apps/api/internal/catalog/prompt_repair.go
@@ -2,12 +2,17 @@ package catalog
import (
"context"
+ "encoding/json"
"fmt"
+ "os"
+ "path/filepath"
"strings"
+ "unicode"
"github.com/descrybe/descrybe-v2/apps/api/internal/aiprompts"
"github.com/descrybe/descrybe-v2/apps/api/internal/billing"
"github.com/descrybe/descrybe-v2/apps/api/internal/company"
+ "github.com/descrybe/descrybe-v2/apps/api/internal/security"
"github.com/google/uuid"
"github.com/jackc/pgx/v5/pgxpool"
)
@@ -21,30 +26,63 @@ const platformDemoCompanyName = "Platform Demo"
// RepairCategoryEnhancePromptsResult is the dry-run / apply summary for
// RepairA1DemoCategoryEnhancePrompts.
type RepairCategoryEnhancePromptsResult struct {
- CompaniesScanned int `json:"companies_scanned"`
- CategoriesSeen int `json:"categories_seen"`
- WouldUpdate int `json:"would_update"`
- Updated int `json:"updated"`
- AlreadyOK int `json:"already_ok"`
- EmptySkipped int `json:"empty_skipped"`
- ByCompany map[string]int `json:"by_company"`
- DryRun bool `json:"dry_run"`
+ CompaniesScanned int `json:"companies_scanned"`
+ CategoriesSeen int `json:"categories_seen"`
+ WouldUpdate int `json:"would_update"`
+ Updated int `json:"updated"`
+ AlreadyOK int `json:"already_ok"`
+ EmptySkipped int `json:"empty_skipped"`
+ SeedMatched int `json:"seed_matched"`
+ SplitFromLegacy int `json:"split_from_legacy"`
+ FallbackTemplate int `json:"fallback_template"`
+ TitleTemplateBackfill int `json:"title_template_backfill"`
+ DescTemplateBackfill int `json:"description_template_backfill"`
+ ByCompany map[string]int `json:"by_company"`
+ DryRun bool `json:"dry_run"`
+ SeedPath string `json:"seed_path,omitempty"`
+ // WPCategoriesPath is set when overlays came from wp_product_categories.sql.
+ WPCategoriesPath string `json:"wp_categories_path,omitempty"`
+ SeedEntries int `json:"seed_entries,omitempty"`
}
-// RepairA1DemoCategoryEnhancePrompts replaces legacy HTML marketing categories.prompt
-// values for A1 Slovenija + Platform Demo with aiprompts.CategoryEnhanceUserTemplate
-// (role-sectioned title/description/meta/attributes USER overlay).
+// RepairA1DemoOptions configures optional seed overlay path for legacy splits.
+type RepairA1DemoOptions struct {
+ // SeedPromptsPath points at a1-category-prompts.json OR wp_product_categories.sql.
+ // Empty → auto-detect WP SQL (SEED_A1_WP_CATEGORIES / Downloads), else JSON seed.
+ SeedPromptsPath string
+ // WPCategoriesPath forces wp_product_categories.sql (overrides SeedPromptsPath when set).
+ WPCategoriesPath string
+ // WPCategoriesSQL is uploaded dump bytes (primary for Admin Sync A1 in prod).
+ // When non-empty, takes precedence over filesystem auto-detect / path options.
+ WPCategoriesSQL []byte
+ // ForceFromSeed overwrites already-sectioned prompts when a seed match exists
+ // (WP dump / JSON is source of truth). Default true when WP SQL is resolved.
+ ForceFromSeed *bool
+}
+
+// RepairA1DemoCategoryEnhancePrompts replaces non-sectioned / legacy combined
+// categories.prompt values for A1 Slovenija + Platform Demo with role-sectioned
+// overlays (Title / Description / Meta / Attributes). Prefers wp_product_categories.sql
+// (SEED_A1_WP_CATEGORIES / Downloads) as source of truth, then a1-category-prompts.json,
+// splitting combined Name+Description prompts so naming rules land under Title and
+// HTML body under Description; otherwise fall back to CategoryEnhanceUserTemplate.
//
-// LOCAL repair only (idempotent):
+// Also repairs empty or brand-only title_template and empty description_template
+// from legacy / HTML / meta blocks so enhance uses real A1 formulas.
+//
+// LOCAL repair only (idempotent when seed unchanged):
// - Writes JSON-compatible user overlays under both "sl" (prompt->>'sl') and "*"
-// (LangPromptAny) so language stays via {{language}}, not hardcoded-only copy.
-// - Touches ONLY categories.prompt — never title_template / description_template
-// (unique name/description/meta formulas stay intact; AppendFormulaConstraints
-// encodes them as plain-text instructions at enhance render time).
+// (LangPromptAny) so language stays via {{language}}.
// - dryRun=true: count WouldUpdate only; dryRun=false: apply and set Updated.
//
// Entrypoint: go run ./cmd/repair-category-prompts (-dry-run | -apply).
func RepairA1DemoCategoryEnhancePrompts(ctx context.Context, pool *pgxpool.Pool, dryRun bool) (RepairCategoryEnhancePromptsResult, error) {
+ return RepairA1DemoCategoryEnhancePromptsWithOptions(ctx, pool, dryRun, RepairA1DemoOptions{})
+}
+
+// RepairA1DemoCategoryEnhancePromptsWithOptions is RepairA1DemoCategoryEnhancePrompts
+// with an explicit seed / WP dump path.
+func RepairA1DemoCategoryEnhancePromptsWithOptions(ctx context.Context, pool *pgxpool.Pool, dryRun bool, opts RepairA1DemoOptions) (RepairCategoryEnhancePromptsResult, error) {
out := RepairCategoryEnhancePromptsResult{
DryRun: dryRun,
ByCompany: map[string]int{},
@@ -53,6 +91,12 @@ func RepairA1DemoCategoryEnhancePrompts(ctx context.Context, pool *pgxpool.Pool,
return out, fmt.Errorf("postgres pool is required")
}
+ if len(opts.WPCategoriesSQL) > 0 {
+ if _, _, err := LoadWPCategoryPromptOverlaysFromBytes(opts.WPCategoriesSQL); err != nil {
+ return out, fmt.Errorf("wp_product_categories upload: %w", err)
+ }
+ }
+
a1ID, err := uuid.Parse(a1CompanyID)
if err != nil {
return out, fmt.Errorf("a1 company id: %w", err)
@@ -90,13 +134,17 @@ func RepairA1DemoCategoryEnhancePrompts(ctx context.Context, pool *pgxpool.Pool,
return out, fmt.Errorf("no A1 / Platform Demo companies found")
}
- want, err := repairedCategoryEnhancePromptMap()
- if err != nil {
- return out, err
+ seedByNorm, seedByUID, seedMeta := resolveCategoryPromptOverlays(opts)
+ out.SeedPath = seedMeta.Path
+ out.WPCategoriesPath = seedMeta.WPPath
+ out.SeedEntries = seedMeta.Entries
+ forceFromSeed := seedMeta.ForceFromSeed
+ if opts.ForceFromSeed != nil {
+ forceFromSeed = *opts.ForceFromSeed
}
for _, c := range companies {
- n, err := repairCompanyCategoryEnhancePrompts(ctx, pool, c.id, c.name, want, dryRun, &out)
+ n, err := repairCompanyCategoryEnhancePrompts(ctx, pool, c.id, c.name, seedByNorm, seedByUID, dryRun, forceFromSeed, &out)
if err != nil {
return out, err
}
@@ -107,9 +155,190 @@ func RepairA1DemoCategoryEnhancePrompts(ctx context.Context, pool *pgxpool.Pool,
return out, nil
}
-// repairedCategoryEnhancePromptMap is the canonical stored shape: "sl" (prompt->>'sl'
-// for A1/Demo) plus LangPromptAny ("*") so PromptForLanguage resolves for any content
-// language. Copy stays language-agnostic via {{language}} — not hardcoded Slovenian.
+type categoryPromptOverlayMeta struct {
+ Path string
+ WPPath string
+ Entries int
+ ForceFromSeed bool
+}
+
+func resolveCategoryPromptOverlays(opts RepairA1DemoOptions) (byNorm, byUID map[string]string, meta categoryPromptOverlayMeta) {
+ byNorm = map[string]string{}
+ byUID = map[string]string{}
+
+ if len(opts.WPCategoriesSQL) > 0 {
+ n, u, err := LoadWPCategoryPromptOverlaysFromBytes(opts.WPCategoriesSQL)
+ if err == nil {
+ meta.Path = "upload:wp_product_categories.sql"
+ meta.WPPath = "upload:wp_product_categories.sql"
+ meta.Entries = len(n)
+ meta.ForceFromSeed = true
+ return n, u, meta
+ }
+ }
+
+ wpPath := strings.TrimSpace(opts.WPCategoriesPath)
+ if wpPath == "" {
+ wpPath = ResolveWPCategoryPromptsPath("")
+ } else {
+ wpPath = ResolveWPCategoryPromptsPath(wpPath)
+ }
+ if wpPath != "" {
+ n, u, err := loadWPCategoryPromptOverlays(wpPath)
+ if err == nil {
+ meta.Path = wpPath
+ meta.WPPath = wpPath
+ meta.Entries = len(n)
+ meta.ForceFromSeed = true
+ return n, u, meta
+ }
+ }
+
+ seedPath := strings.TrimSpace(opts.SeedPromptsPath)
+ if seedPath == "" {
+ seedPath = resolveA1CategoryPromptsPath()
+ }
+ if seedPath != "" && isWPCategoryPromptsSQLPath(seedPath) {
+ n, u, err := loadWPCategoryPromptOverlays(seedPath)
+ if err == nil {
+ meta.Path = seedPath
+ meta.WPPath = seedPath
+ meta.Entries = len(n)
+ meta.ForceFromSeed = true
+ return n, u, meta
+ }
+ }
+ if seedPath != "" {
+ n, u, err := loadA1CategoryPromptOverlays(seedPath)
+ if err == nil {
+ meta.Path = seedPath
+ meta.Entries = len(n)
+ meta.ForceFromSeed = false
+ return n, u, meta
+ }
+ }
+ return byNorm, byUID, meta
+}
+
+func resolveA1CategoryPromptsPath() string {
+ candidates := []string{
+ filepath.Join("scripts", "seed", "a1-category-prompts.json"),
+ filepath.Join("..", "..", "scripts", "seed", "a1-category-prompts.json"),
+ filepath.Join("..", "..", "..", "scripts", "seed", "a1-category-prompts.json"),
+ }
+ // Walk up from cwd looking for scripts/seed/a1-category-prompts.json.
+ if wd, err := os.Getwd(); err == nil {
+ dir := wd
+ for i := 0; i < 8; i++ {
+ candidates = append(candidates, filepath.Join(dir, "scripts", "seed", "a1-category-prompts.json"))
+ parent := filepath.Dir(dir)
+ if parent == dir {
+ break
+ }
+ dir = parent
+ }
+ }
+ for _, p := range candidates {
+ if st, err := os.Stat(p); err == nil && !st.IsDir() {
+ return p
+ }
+ }
+ return ""
+}
+
+type a1CategoryPromptFile struct {
+ Entries []a1CategoryPromptEntry `json:"entries"`
+}
+
+type a1CategoryPromptEntry struct {
+ Name string `json:"name"`
+ UniqueID string `json:"unique_id,omitempty"`
+ Prompt string `json:"prompt"`
+}
+
+func loadA1CategoryPromptOverlays(path string) (byNorm map[string]string, byUID map[string]string, err error) {
+ byNorm = map[string]string{}
+ byUID = map[string]string{}
+ path = filepath.Clean(strings.TrimSpace(path))
+ if path == "" || path == "." {
+ return byNorm, byUID, fmt.Errorf("seed prompts path empty")
+ }
+ if filepath.Base(path) != "a1-category-prompts.json" {
+ return byNorm, byUID, fmt.Errorf("refusing unexpected category prompts file name %q", filepath.Base(path))
+ }
+ raw, err := os.ReadFile(path)
+ if err != nil {
+ return byNorm, byUID, err
+ }
+ if len(raw) > 8<<20 {
+ return byNorm, byUID, fmt.Errorf("category prompts file too large (%d bytes)", len(raw))
+ }
+ var f a1CategoryPromptFile
+ if err := json.Unmarshal(raw, &f); err != nil {
+ return byNorm, byUID, err
+ }
+ for _, e := range f.Entries {
+ p := strings.TrimSpace(e.Prompt)
+ if p == "" {
+ continue
+ }
+ if uid := strings.ToLower(strings.TrimSpace(e.UniqueID)); uid != "" {
+ byUID[uid] = p
+ }
+ if key := normalizeCategoryPromptName(e.Name); key != "" {
+ byNorm[key] = p
+ }
+ }
+ if len(byNorm) == 0 && len(byUID) == 0 {
+ return byNorm, byUID, fmt.Errorf("no usable seed prompt entries")
+ }
+ return byNorm, byUID, nil
+}
+
+func normalizeCategoryPromptName(s string) string {
+ s = strings.TrimSpace(s)
+ if s == "" {
+ return ""
+ }
+ s = strings.ToLower(s)
+ var b strings.Builder
+ b.Grow(len(s))
+ prevSpace := false
+ for _, r := range s {
+ r = foldSlovenePromptRune(r)
+ if unicode.IsSpace(r) {
+ if prevSpace || b.Len() == 0 {
+ continue
+ }
+ b.WriteByte(' ')
+ prevSpace = true
+ continue
+ }
+ prevSpace = false
+ if unicode.IsLetter(r) || unicode.IsDigit(r) || r == '-' || r == '/' || r == '&' || r == '+' {
+ b.WriteRune(r)
+ }
+ }
+ return strings.TrimSpace(b.String())
+}
+
+func foldSlovenePromptRune(r rune) rune {
+ switch r {
+ case 'č', 'ć':
+ return 'c'
+ case 'š':
+ return 's'
+ case 'ž':
+ return 'z'
+ case 'đ':
+ return 'd'
+ default:
+ return r
+ }
+}
+
+// repairedCategoryEnhancePromptMap is the shared fallback overlay (no per-category
+// Slovenian rules): "sl" + LangPromptAny ("*").
func repairedCategoryEnhancePromptMap() (company.LangPromptMap, error) {
tpl := strings.TrimSpace(aiprompts.CategoryEnhanceUserTemplate)
if tpl == "" {
@@ -121,33 +350,96 @@ func repairedCategoryEnhancePromptMap() (company.LangPromptMap, error) {
}, nil
}
-func categoryEnhancePromptMapOK(m company.LangPromptMap, want company.LangPromptMap) bool {
- if !company.HasAnyPrompt(m) || !company.HasAnyPrompt(want) {
+func categoryEnhancePromptValueOK(p string) bool {
+ p = strings.TrimSpace(p)
+ if p == "" {
return false
}
- tpl := strings.TrimSpace(want[company.LangPromptAny])
- if tpl == "" {
- tpl = strings.TrimSpace(want["sl"])
- }
- if tpl == "" {
+ return !aiprompts.CategoryEnhancePromptNeedsRepair(p)
+}
+
+func categoryEnhancePromptMapOK(m company.LangPromptMap) bool {
+ if !company.HasAnyPrompt(m) {
return false
}
- // Accept already-repaired maps: every non-empty value equals the shared template
- // and LangPromptAny (or legacy sl-only) is present.
- hasKey := false
- for lang, p := range m {
+ for _, p := range m {
p = strings.TrimSpace(p)
if p == "" {
continue
}
- if p != tpl {
+ if !categoryEnhancePromptValueOK(p) {
return false
}
- if lang == company.LangPromptAny || lang == "sl" {
- hasKey = true
+ }
+ // Require sl or * present.
+ if strings.TrimSpace(m[company.LangPromptAny]) == "" && strings.TrimSpace(m["sl"]) == "" {
+ return false
+ }
+ return true
+}
+
+func pickSeedPrompt(uniqueID, name string, byNorm, byUID map[string]string) string {
+ if uid := strings.ToLower(strings.TrimSpace(uniqueID)); uid != "" {
+ if p, ok := byUID[uid]; ok {
+ return p
}
}
- return hasKey
+ if key := normalizeCategoryPromptName(name); key != "" {
+ if p, ok := byNorm[key]; ok {
+ return p
+ }
+ }
+ return ""
+}
+
+func resolveRepairedEnhancePrompt(current company.LangPromptMap, seedLegacy string, preferSeed bool, out *RepairCategoryEnhancePromptsResult) string {
+ prompt, fromSeed, fromLegacy, fallback := computeRepairedEnhancePrompt(current, seedLegacy, preferSeed)
+ if fromSeed {
+ out.SeedMatched++
+ }
+ if fromLegacy {
+ out.SplitFromLegacy++
+ }
+ if fallback {
+ out.FallbackTemplate++
+ }
+ return prompt
+}
+
+func computeRepairedEnhancePrompt(current company.LangPromptMap, seedLegacy string, preferSeed bool) (prompt string, fromSeed, fromLegacy, fallback bool) {
+ trySeed := func(raw string) (string, bool, bool) {
+ raw = strings.TrimSpace(raw)
+ if raw == "" {
+ return "", false, false
+ }
+ if aiprompts.IsLegacyCombinedEnhancePrompt(raw) {
+ return aiprompts.SplitLegacyCombinedEnhancePrompt(raw), true, false
+ }
+ if aiprompts.CategoryEnhanceHasRoleSections(raw) {
+ return security.SanitizePrompt(raw, MaxCategoryPromptRunes), false, false
+ }
+ return strings.TrimSpace(aiprompts.CategoryEnhanceUserTemplate), false, true
+ }
+
+ if preferSeed && seedLegacy != "" {
+ p, leg, fb := trySeed(seedLegacy)
+ return p, true, leg, fb
+ }
+ for _, lang := range []string{"sl", company.LangPromptAny} {
+ if cur := strings.TrimSpace(current[lang]); aiprompts.IsLegacyCombinedEnhancePrompt(cur) {
+ return aiprompts.SplitLegacyCombinedEnhancePrompt(cur), false, true, false
+ }
+ }
+ for _, cur := range current {
+ if aiprompts.IsLegacyCombinedEnhancePrompt(cur) {
+ return aiprompts.SplitLegacyCombinedEnhancePrompt(cur), false, true, false
+ }
+ }
+ if seedLegacy != "" {
+ p, leg, fb := trySeed(seedLegacy)
+ return p, true, leg, fb
+ }
+ return strings.TrimSpace(aiprompts.CategoryEnhanceUserTemplate), false, false, true
}
func repairCompanyCategoryEnhancePrompts(
@@ -155,12 +447,19 @@ func repairCompanyCategoryEnhancePrompts(
pool *pgxpool.Pool,
companyID uuid.UUID,
companyName string,
- want company.LangPromptMap,
+ seedByNorm map[string]string,
+ seedByUID map[string]string,
dryRun bool,
+ forceFromSeed bool,
out *RepairCategoryEnhancePromptsResult,
) (int, error) {
rows, err := pool.Query(ctx, `
- SELECT id, COALESCE(prompt, '{}'::jsonb)
+ SELECT id,
+ COALESCE(unique_id, ''),
+ name,
+ COALESCE(prompt, '{}'::jsonb),
+ title_template,
+ description_template
FROM categories
WHERE company_id = $1`, companyID)
if err != nil {
@@ -171,8 +470,10 @@ func repairCompanyCategoryEnhancePrompts(
updatedHere := 0
for rows.Next() {
var id uuid.UUID
+ var uniqueID, name string
var raw []byte
- if err := rows.Scan(&id, &raw); err != nil {
+ var titleTpl, descTpl []byte
+ if err := rows.Scan(&id, &uniqueID, &name, &raw, &titleTpl, &descTpl); err != nil {
return updatedHere, err
}
out.CategoriesSeen++
@@ -181,41 +482,268 @@ func repairCompanyCategoryEnhancePrompts(
if err != nil {
return updatedHere, fmt.Errorf("decode prompt category=%s company=%s: %w", id, companyName, err)
}
+
+ seedLegacy := pickSeedPrompt(uniqueID, name, seedByNorm, seedByUID)
+ needPrompt := company.HasAnyPrompt(m) && !categoryEnhancePromptMapOK(m)
+ // Empty prompt → write sectioned overlay (seed split when available, else shared template).
if !company.HasAnyPrompt(m) {
- out.EmptySkipped++
+ needPrompt = true
+ }
+
+ var wantPrompt string
+ if seedLegacy != "" && (forceFromSeed || needPrompt) {
+ wantPrompt, _, _, _ = computeRepairedEnhancePrompt(m, seedLegacy, forceFromSeed)
+ wantPrompt = security.SanitizePrompt(wantPrompt, MaxCategoryPromptRunes)
+ if cur := currentEnhancePrompt(m); forceFromSeed && cur != "" && cur == wantPrompt && categoryEnhancePromptMapOK(m) {
+ needPrompt = false
+ wantPrompt = ""
+ } else if wantPrompt != "" {
+ needPrompt = true
+ }
+ }
+
+ titleRules := legacyTitleRules(m, seedLegacy)
+ needTitle := aiprompts.TitleTemplateNeedsRepair(titleTpl)
+ legacyParts := legacyEnhanceParts(m, seedLegacy)
+ needDesc := aiprompts.DescriptionTemplateNeedsRepair(descTpl)
+ var wantTitleTpl, wantDescTpl string
+ if forceFromSeed && seedLegacy != "" {
+ if strings.TrimSpace(titleRules) != "" {
+ wantTitleTpl = aiprompts.DeriveTitleTemplateJSON(titleRules)
+ if !jsonbEqual(titleTpl, []byte(wantTitleTpl)) {
+ needTitle = true
+ } else {
+ needTitle = false
+ wantTitleTpl = ""
+ }
+ }
+ if legacyParts.WasLegacy && (strings.TrimSpace(legacyParts.DescriptionRules) != "" || strings.TrimSpace(legacyParts.MetaRules) != "") {
+ wantDescTpl = aiprompts.DeriveDescriptionTemplateJSON(legacyParts)
+ if strings.TrimSpace(wantDescTpl) != "" && !jsonbEqual(descTpl, []byte(wantDescTpl)) {
+ needDesc = true
+ } else if strings.TrimSpace(wantDescTpl) == "" || jsonbEqual(descTpl, []byte(wantDescTpl)) {
+ needDesc = false
+ wantDescTpl = ""
+ }
+ }
+ }
+ if needDesc && strings.TrimSpace(legacyParts.DescriptionRules) == "" && strings.TrimSpace(legacyParts.MetaRules) == "" {
+ needDesc = false
+ }
+ if !needPrompt && !needTitle && !needDesc {
+ if company.HasAnyPrompt(m) {
+ out.AlreadyOK++
+ } else {
+ out.EmptySkipped++
+ }
continue
}
- if categoryEnhancePromptMapOK(m, want) {
- out.AlreadyOK++
- continue
+
+ if needPrompt && wantPrompt == "" {
+ wantPrompt = resolveRepairedEnhancePrompt(m, seedLegacy, forceFromSeed && seedLegacy != "", out)
+ wantPrompt = security.SanitizePrompt(wantPrompt, MaxCategoryPromptRunes)
+ if wantPrompt == "" {
+ return updatedHere, fmt.Errorf("repaired prompt empty category=%s", id)
+ }
+ } else if needPrompt {
+ // Record seed/split stats for the prompt we already computed.
+ _, fromSeed, fromLegacy, fallback := computeRepairedEnhancePrompt(m, seedLegacy, forceFromSeed && seedLegacy != "")
+ if fromSeed {
+ out.SeedMatched++
+ }
+ if fromLegacy {
+ out.SplitFromLegacy++
+ }
+ if fallback {
+ out.FallbackTemplate++
+ }
}
out.WouldUpdate++
if dryRun {
+ if needTitle {
+ out.TitleTemplateBackfill++
+ }
+ if needDesc {
+ out.DescTemplateBackfill++
+ }
updatedHere++
continue
}
- cleaned, err := company.SanitizeLangPromptMap(want, MaxCategoryPromptRunes)
- if err != nil {
- return updatedHere, fmt.Errorf("sanitize prompt category=%s: %w", id, err)
+ if needPrompt {
+ want := company.LangPromptMap{
+ "sl": wantPrompt,
+ company.LangPromptAny: wantPrompt,
+ }
+ cleaned, err := company.SanitizeLangPromptMap(want, MaxCategoryPromptRunes)
+ if err != nil {
+ return updatedHere, fmt.Errorf("sanitize prompt category=%s: %w", id, err)
+ }
+ encoded, err := company.EncodeLangPromptMap(cleaned)
+ if err != nil {
+ return updatedHere, err
+ }
+ ct, err := pool.Exec(ctx, `
+ UPDATE categories
+ SET prompt = $3::jsonb, updated_at = now()
+ WHERE id = $1 AND company_id = $2`, id, companyID, string(encoded))
+ if err != nil {
+ return updatedHere, fmt.Errorf("update prompt category=%s: %w", id, err)
+ }
+ if ct.RowsAffected() == 0 {
+ return updatedHere, fmt.Errorf("category %s not updated (company mismatch?)", id)
+ }
}
- encoded, err := company.EncodeLangPromptMap(cleaned)
- if err != nil {
- return updatedHere, err
+
+ if needTitle {
+ tpl := wantTitleTpl
+ if tpl == "" {
+ tpl = aiprompts.DeriveTitleTemplateJSON(titleRules)
+ }
+ ct, err := pool.Exec(ctx, `
+ UPDATE categories
+ SET title_template = $3::jsonb, updated_at = now()
+ WHERE id = $1 AND company_id = $2`, id, companyID, tpl)
+ if err != nil {
+ return updatedHere, fmt.Errorf("backfill title_template category=%s: %w", id, err)
+ }
+ if ct.RowsAffected() > 0 {
+ out.TitleTemplateBackfill++
+ }
}
- ct, err := pool.Exec(ctx, `
- UPDATE categories
- SET prompt = $3::jsonb, updated_at = now()
- WHERE id = $1 AND company_id = $2`, id, companyID, string(encoded))
- if err != nil {
- return updatedHere, fmt.Errorf("update prompt category=%s: %w", id, err)
- }
- if ct.RowsAffected() == 0 {
- return updatedHere, fmt.Errorf("category %s not updated (company mismatch?)", id)
+
+ if needDesc {
+ tpl := wantDescTpl
+ if tpl == "" {
+ tpl = aiprompts.DeriveDescriptionTemplateJSON(legacyParts)
+ }
+ if strings.TrimSpace(tpl) != "" {
+ ct, err := pool.Exec(ctx, `
+ UPDATE categories
+ SET description_template = $3::jsonb, updated_at = now()
+ WHERE id = $1 AND company_id = $2`, id, companyID, tpl)
+ if err != nil {
+ return updatedHere, fmt.Errorf("backfill description_template category=%s: %w", id, err)
+ }
+ if ct.RowsAffected() > 0 {
+ out.DescTemplateBackfill++
+ }
+ }
}
+
out.Updated++
updatedHere++
}
return updatedHere, rows.Err()
}
+
+func currentEnhancePrompt(m company.LangPromptMap) string {
+ for _, lang := range []string{"sl", company.LangPromptAny} {
+ if p := strings.TrimSpace(m[lang]); p != "" {
+ return p
+ }
+ }
+ for _, p := range m {
+ if t := strings.TrimSpace(p); t != "" {
+ return t
+ }
+ }
+ return ""
+}
+
+func legacyEnhanceParts(current company.LangPromptMap, seedLegacy string) aiprompts.LegacyEnhanceParts {
+ if seedLegacy != "" {
+ parts := aiprompts.ParseLegacyCombinedEnhancePrompt(seedLegacy)
+ if parts.WasLegacy {
+ return parts
+ }
+ }
+ for _, lang := range []string{"sl", company.LangPromptAny} {
+ parts := aiprompts.ParseLegacyCombinedEnhancePrompt(current[lang])
+ if parts.WasLegacy {
+ return parts
+ }
+ }
+ for _, cur := range current {
+ parts := aiprompts.ParseLegacyCombinedEnhancePrompt(cur)
+ if parts.WasLegacy {
+ return parts
+ }
+ }
+ return aiprompts.LegacyEnhanceParts{}
+}
+
+func jsonbTemplatePresent(raw []byte) bool {
+ s := strings.TrimSpace(string(raw))
+ if s == "" || s == "null" || s == "{}" || s == "[]" {
+ return false
+ }
+ var obj map[string]any
+ if err := json.Unmarshal(raw, &obj); err != nil {
+ return true // non-empty non-object still counts as present
+ }
+ if elems, ok := obj["elements"].([]any); ok && len(elems) > 0 {
+ return true
+ }
+ if sections, ok := obj["sections"].([]any); ok && len(sections) > 0 {
+ return true
+ }
+ if mt, ok := obj["metaTitle"].(string); ok && strings.TrimSpace(mt) != "" {
+ return true
+ }
+ if md, ok := obj["metaDescription"].(string); ok && strings.TrimSpace(md) != "" {
+ return true
+ }
+ // Any other non-empty keys.
+ return len(obj) > 0
+}
+
+func jsonbEqual(a, b []byte) bool {
+ as := strings.TrimSpace(string(a))
+ bs := strings.TrimSpace(string(b))
+ if as == "" || as == "null" {
+ as = ""
+ }
+ if bs == "" || bs == "null" {
+ bs = ""
+ }
+ if as == bs {
+ return true
+ }
+ var ao, bo any
+ if err := json.Unmarshal([]byte(as), &ao); err != nil {
+ return false
+ }
+ if err := json.Unmarshal([]byte(bs), &bo); err != nil {
+ return false
+ }
+ ab, err1 := json.Marshal(ao)
+ bb, err2 := json.Marshal(bo)
+ if err1 != nil || err2 != nil {
+ return false
+ }
+ return string(ab) == string(bb)
+}
+
+func legacyTitleRules(current company.LangPromptMap, seedLegacy string) string {
+ if seedLegacy != "" {
+ parts := aiprompts.ParseLegacyCombinedEnhancePrompt(seedLegacy)
+ if parts.WasLegacy && strings.TrimSpace(parts.TitleRules) != "" {
+ return parts.TitleRules
+ }
+ }
+ for _, lang := range []string{"sl", company.LangPromptAny} {
+ parts := aiprompts.ParseLegacyCombinedEnhancePrompt(current[lang])
+ if parts.WasLegacy && strings.TrimSpace(parts.TitleRules) != "" {
+ return parts.TitleRules
+ }
+ }
+ for _, cur := range current {
+ parts := aiprompts.ParseLegacyCombinedEnhancePrompt(cur)
+ if parts.WasLegacy && strings.TrimSpace(parts.TitleRules) != "" {
+ return parts.TitleRules
+ }
+ }
+ return ""
+}
diff --git a/apps/api/internal/catalog/prompt_repair_test.go b/apps/api/internal/catalog/prompt_repair_test.go
index 4cb8f07..32b2df3 100644
--- a/apps/api/internal/catalog/prompt_repair_test.go
+++ b/apps/api/internal/catalog/prompt_repair_test.go
@@ -21,19 +21,19 @@ func TestRepairedCategoryEnhancePromptMap(t *testing.T) {
if want[company.LangPromptAny] != tpl {
t.Fatalf("want * = shared template")
}
- if !categoryEnhancePromptMapOK(want, want) {
+ if !categoryEnhancePromptMapOK(want) {
t.Fatal("canonical map should be OK")
}
legacy := company.LangPromptMap{"sl": "legacy HTML marketing "}
- if categoryEnhancePromptMapOK(legacy, want) {
+ if categoryEnhancePromptMapOK(legacy) {
t.Fatal("legacy HTML must need repair")
}
slOnly := company.LangPromptMap{"sl": tpl}
- if !categoryEnhancePromptMapOK(slOnly, want) {
+ if !categoryEnhancePromptMapOK(slOnly) {
t.Fatal("sl-only repaired map should be OK (idempotent)")
}
starOnly := company.LangPromptMap{company.LangPromptAny: tpl}
- if !categoryEnhancePromptMapOK(starOnly, want) {
+ if !categoryEnhancePromptMapOK(starOnly) {
t.Fatal("*-only repaired map should be OK (idempotent)")
}
}
@@ -46,7 +46,28 @@ func TestRepairTargetsUseSharedTemplate(t *testing.T) {
t.Fatalf("shared template missing {{%s}}", v)
}
}
+ if !strings.Contains(strings.ToLower(tpl), "never brand-only") {
+ t.Fatal("Title section must forbid brand-only names")
+ }
if a1CompanyID == "" || platformDemoCompanyName == "" {
t.Fatal("missing company target constants")
}
}
+
+func TestLegacyTitleRulesFromSeedShape(t *testing.T) {
+ t.Parallel()
+ seed := `Ustvari nov opis
+
+GPT predloga:
+{Napiši novo ime izdelka po formuli: "tip izdelka sentence case", "znamka s pravilno kapitalizacijo", "poln model izdelka". Ne uporabljaj vejic.}
+{140 znakov}
+{benefit} `
+ rules := legacyTitleRules(nil, seed)
+ if !strings.Contains(strings.ToLower(rules), "znamka") {
+ t.Fatalf("expected title rules from seed, got %q", rules)
+ }
+ raw := aiprompts.DeriveTitleTemplateJSON(rules)
+ if aiprompts.TitleTemplateNeedsRepair(raw) {
+ t.Fatalf("derived title_template still needs repair: %s", raw)
+ }
+}
diff --git a/apps/api/internal/catalog/wp_category_prompts.go b/apps/api/internal/catalog/wp_category_prompts.go
new file mode 100644
index 0000000..87ae222
--- /dev/null
+++ b/apps/api/internal/catalog/wp_category_prompts.go
@@ -0,0 +1,313 @@
+package catalog
+
+import (
+ "fmt"
+ "io"
+ "log"
+ "os"
+ "path/filepath"
+ "strings"
+ "unicode/utf8"
+)
+
+const (
+ wpProductCategoriesFile = "wp_product_categories.sql"
+ envSeedA1WPCategories = "SEED_A1_WP_CATEGORIES"
+ // MaxWPCategorySQLBytes caps uploaded / on-disk wp_product_categories.sql size (16 MiB).
+ MaxWPCategorySQLBytes = 16 << 20
+)
+
+// ResolveWPCategoryPromptsPath picks an explicit path, else the first readable
+// wp_product_categories.sql candidate (SEED_A1_WP_CATEGORIES + Downloads + scripts/seed).
+// Used by Sync A1 / RepairCompanyCategoryEnhancePrompts as the A1 prompt source of truth.
+func ResolveWPCategoryPromptsPath(explicit string) string {
+ if p := strings.TrimSpace(explicit); p != "" {
+ if st, err := os.Stat(p); err == nil && !st.IsDir() {
+ return p
+ }
+ log.Printf("warning: wp category prompts not found at %q — trying auto-detect", p)
+ }
+ if v := strings.TrimSpace(os.Getenv(envSeedA1WPCategories)); v != "" {
+ if st, err := os.Stat(v); err == nil && !st.IsDir() {
+ return v
+ }
+ log.Printf("warning: %s=%q not readable — trying Downloads / scripts/seed", envSeedA1WPCategories, v)
+ }
+ for _, c := range WPCategoryPromptsCandidates() {
+ if st, err := os.Stat(c); err == nil && !st.IsDir() {
+ return c
+ }
+ }
+ return ""
+}
+
+// WPCategoryPromptsCandidates lists local paths Sync A1 / repair try when
+// SEED_A1_WP_CATEGORIES is unset. First readable file wins via ResolveWPCategoryPromptsPath.
+func WPCategoryPromptsCandidates() []string {
+ var out []string
+ if v := strings.TrimSpace(os.Getenv(envSeedA1WPCategories)); v != "" {
+ out = append(out, v)
+ }
+ names := []string{
+ wpProductCategoriesFile,
+ "wp_product_categories (1).sql",
+ "wp_product_categories(1).sql",
+ }
+ home, _ := os.UserHomeDir()
+ if home != "" {
+ for _, n := range names {
+ out = append(out, filepath.Join(home, "Downloads", n))
+ out = append(out, filepath.Join(home, "downloads", n))
+ }
+ // Windows secondary profile Downloads (e.g. D:\Users\…\Downloads).
+ for _, driveRoot := range []string{`D:\`, `C:\`} {
+ alt := filepath.Join(driveRoot, "Users", filepath.Base(home), "Downloads")
+ for _, n := range names {
+ out = append(out, filepath.Join(alt, n))
+ }
+ }
+ }
+ for _, n := range names {
+ out = append(out,
+ n,
+ filepath.Join("..", "..", n),
+ filepath.Join("scripts", "seed", n),
+ filepath.Join("..", "..", "scripts", "seed", n),
+ )
+ }
+ if root, ok := findMonorepoRootFromCwd(); ok {
+ for _, n := range names {
+ out = append(out, filepath.Join(root, "scripts", "seed", n))
+ }
+ }
+ return out
+}
+
+func findMonorepoRootFromCwd() (string, bool) {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return "", false
+ }
+ dir := cwd
+ for {
+ api := filepath.Join(dir, "apps", "api")
+ web := filepath.Join(dir, "apps", "web")
+ if st, err := os.Stat(api); err == nil && st.IsDir() {
+ if st, err := os.Stat(web); err == nil && st.IsDir() {
+ return dir, true
+ }
+ }
+ parent := filepath.Dir(dir)
+ if parent == dir {
+ return "", false
+ }
+ dir = parent
+ }
+}
+
+func isWPCategoryPromptsSQLPath(path string) bool {
+ base := strings.ToLower(filepath.Base(strings.TrimSpace(path)))
+ if base == "" {
+ return false
+ }
+ if base == wpProductCategoriesFile {
+ return true
+ }
+ return strings.HasPrefix(base, "wp_product_categories") && strings.HasSuffix(base, ".sql")
+}
+
+// loadWPCategoryPromptOverlays parses Name→Prompt pairs from a wp_product_categories.sql dump.
+func loadWPCategoryPromptOverlays(path string) (byNorm map[string]string, byUID map[string]string, err error) {
+ byNorm = map[string]string{}
+ byUID = map[string]string{}
+ path = filepath.Clean(strings.TrimSpace(path))
+ if path == "" || path == "." {
+ return byNorm, byUID, fmt.Errorf("wp category prompts path empty")
+ }
+ if !isWPCategoryPromptsSQLPath(path) {
+ return byNorm, byUID, fmt.Errorf("refusing unexpected wp category prompts file name %q", filepath.Base(path))
+ }
+ raw, err := os.ReadFile(path)
+ if err != nil {
+ return byNorm, byUID, err
+ }
+ return LoadWPCategoryPromptOverlaysFromBytes(raw)
+}
+
+// LoadWPCategoryPromptOverlaysFromBytes parses an uploaded or in-memory
+// wp_product_categories.sql dump. Enforces MaxWPCategorySQLBytes and UTF-8.
+func LoadWPCategoryPromptOverlaysFromBytes(raw []byte) (byNorm map[string]string, byUID map[string]string, err error) {
+ byNorm = map[string]string{}
+ byUID = map[string]string{}
+ if len(raw) == 0 {
+ return byNorm, byUID, fmt.Errorf("empty wp_product_categories sql")
+ }
+ if len(raw) > MaxWPCategorySQLBytes {
+ return byNorm, byUID, fmt.Errorf("wp category prompts file too large (%d bytes)", len(raw))
+ }
+ if !utf8.Valid(raw) {
+ return byNorm, byUID, fmt.Errorf("wp category prompts file is not valid UTF-8")
+ }
+ entries, err := ParseWPProductCategoriesSQL(string(raw))
+ if err != nil {
+ return byNorm, byUID, err
+ }
+ for _, e := range entries {
+ p := strings.TrimSpace(e.Prompt)
+ if p == "" {
+ continue
+ }
+ if uid := strings.ToLower(strings.TrimSpace(e.UniqueID)); uid != "" {
+ byUID[uid] = p
+ }
+ if key := normalizeCategoryPromptName(e.Name); key != "" {
+ byNorm[key] = p
+ }
+ }
+ if len(byNorm) == 0 && len(byUID) == 0 {
+ return byNorm, byUID, fmt.Errorf("no usable wp_product_categories prompt entries")
+ }
+ return byNorm, byUID, nil
+}
+
+// ParseWPProductCategoriesSQL extracts (Name, Prompt) rows from a mysqldump-style
+// INSERT INTO `wp_product_categories` (`Name`, `Prompt`) VALUES … statement.
+func ParseWPProductCategoriesSQL(sql string) ([]a1CategoryPromptEntry, error) {
+ sql = strings.TrimSpace(sql)
+ if sql == "" {
+ return nil, fmt.Errorf("empty wp_product_categories sql")
+ }
+ lower := strings.ToLower(sql)
+ if !strings.Contains(lower, "wp_product_categories") {
+ return nil, fmt.Errorf("sql does not reference wp_product_categories")
+ }
+
+ out := make([]a1CategoryPromptEntry, 0, 128)
+ i := 0
+ for i < len(sql) {
+ name, prompt, next, ok := scanWPCategoryRow(sql, i)
+ if !ok {
+ break
+ }
+ i = next
+ name = strings.TrimSpace(name)
+ prompt = strings.TrimSpace(prompt)
+ if name == "" || prompt == "" {
+ continue
+ }
+ out = append(out, a1CategoryPromptEntry{Name: name, Prompt: prompt})
+ }
+ if len(out) == 0 {
+ return nil, fmt.Errorf("no Name/Prompt rows parsed from wp_product_categories sql")
+ }
+ if len(out) > 5000 {
+ return nil, fmt.Errorf("too many wp_product_categories rows (%d)", len(out))
+ }
+ return out, nil
+}
+
+// scanWPCategoryRow finds the next ('Name', 'Prompt') tuple starting at from.
+func scanWPCategoryRow(sql string, from int) (name, prompt string, next int, ok bool) {
+ // Locate opening (' after from.
+ i := from
+ for i < len(sql) {
+ if sql[i] == '(' && i+1 < len(sql) && sql[i+1] == '\'' {
+ break
+ }
+ i++
+ }
+ if i >= len(sql) {
+ return "", "", from, false
+ }
+ i += 2 // past ('
+ nameRaw, i2, err := scanMySQLQuotedString(sql, i)
+ if err != nil {
+ return "", "", from, false
+ }
+ i = i2
+ // Expect , then optional whitespace then '
+ for i < len(sql) && (sql[i] == ' ' || sql[i] == '\t' || sql[i] == '\n' || sql[i] == '\r') {
+ i++
+ }
+ if i >= len(sql) || sql[i] != ',' {
+ return "", "", from, false
+ }
+ i++
+ for i < len(sql) && (sql[i] == ' ' || sql[i] == '\t' || sql[i] == '\n' || sql[i] == '\r') {
+ i++
+ }
+ if i >= len(sql) || sql[i] != '\'' {
+ return "", "", from, false
+ }
+ i++
+ promptRaw, i3, err := scanMySQLQuotedString(sql, i)
+ if err != nil {
+ return "", "", from, false
+ }
+ return nameRaw, promptRaw, i3, true
+}
+
+// scanMySQLQuotedString reads a mysqldump string whose opening quote was already consumed.
+// Handles ”, \', \", \\, \n, \r, \t, \0, and leaves the index after the closing quote.
+func scanMySQLQuotedString(s string, start int) (string, int, error) {
+ var b strings.Builder
+ b.Grow(256)
+ i := start
+ for i < len(s) {
+ c := s[i]
+ if c == '\\' && i+1 < len(s) {
+ n := s[i+1]
+ switch n {
+ case 'n':
+ b.WriteByte('\n')
+ case 'r':
+ b.WriteByte('\r')
+ case 't':
+ b.WriteByte('\t')
+ case '0':
+ b.WriteByte(0)
+ case 'b':
+ b.WriteByte('\b')
+ case 'Z':
+ b.WriteByte(0x1a)
+ case '\'', '"', '\\':
+ b.WriteByte(n)
+ default:
+ // MySQL keeps the second char for unknown escapes.
+ b.WriteByte(n)
+ }
+ i += 2
+ continue
+ }
+ if c == '\'' {
+ if i+1 < len(s) && s[i+1] == '\'' {
+ b.WriteByte('\'')
+ i += 2
+ continue
+ }
+ return b.String(), i + 1, nil
+ }
+ b.WriteByte(c)
+ i++
+ }
+ return "", start, fmt.Errorf("unterminated mysql string")
+}
+
+// ReadWPCategoryPromptOverlaysFromReader is a test helper around ParseWPProductCategoriesSQL.
+func ReadWPCategoryPromptOverlaysFromReader(r io.Reader) (byNorm map[string]string, err error) {
+ raw, err := io.ReadAll(r)
+ if err != nil {
+ return nil, err
+ }
+ entries, err := ParseWPProductCategoriesSQL(string(raw))
+ if err != nil {
+ return nil, err
+ }
+ byNorm = map[string]string{}
+ for _, e := range entries {
+ if key := normalizeCategoryPromptName(e.Name); key != "" && strings.TrimSpace(e.Prompt) != "" {
+ byNorm[key] = e.Prompt
+ }
+ }
+ return byNorm, nil
+}
diff --git a/apps/api/internal/catalog/wp_category_prompts_test.go b/apps/api/internal/catalog/wp_category_prompts_test.go
new file mode 100644
index 0000000..59de3be
--- /dev/null
+++ b/apps/api/internal/catalog/wp_category_prompts_test.go
@@ -0,0 +1,166 @@
+package catalog
+
+import (
+ "os"
+ "path/filepath"
+ "strings"
+ "testing"
+
+ "github.com/descrybe/descrybe-v2/apps/api/internal/aiprompts"
+)
+
+func TestParseWPProductCategoriesSQL_SlusalkeSplit(t *testing.T) {
+ t.Parallel()
+ sql := "SET NAMES utf8mb4;\n\n" +
+ "INSERT INTO `wp_product_categories` (`Name`, `Prompt`) VALUES\n" +
+ "('Slušalke',\t'Ustvari nov opis izdelka v Slovenščini z naslednjimi spremenljivkami:\\n\\n" +
+ "Star_opis_izdelka: {\\\"\\\"OPIS IZDELKA\\\"\\\"};\\n" +
+ "Staro_ime_izdelka: {\\\"\\\"STARO IME IZDELKA\\\"\\\"};\\n\\n" +
+ "Uporabi spodnjo GPT predlogo. \\n\\n" +
+ "Sledi tej GPT predlogi stavek po stavek in sestavi nov opis izdelka:\\n\\n" +
+ "GPT predloga:\\n\\n\\n" +
+ "{Napiši novo ime izdelka po formuli: \\\"\\\"znamka s pravilno kapitalizacijo\\\"\\\", \\\"\\\"tip izdelka lowercase\\\"\\\", \\\"\\\"\\\"poln model izdelka, če lahko z besedo in ID uppercase\\\"\\\"\\\". Ne uporabljaj vejic.} \\n" +
+ "{Najprej napiši Novo_ime_izdelka in potem nadaljuj dokler nisi zapisal 140 znakov vključno s presledki} \\n\\n" +
+ "{Napiši Novo ime izdelka in izpostavi en benefit} \\n" +
+ "{Napiši odstavek, ki je dolg 100 besed, ki NE vsebuje Novo ime izdelka.}
\\n" +
+ "{Izpostavi en benefit, in NE napiši Novo ime izdelka} \\n" +
+ "{Napiši odstavek, ki je dolg 100 besed in VKLJUČI tudi Novo ime izdelka.}
" +
+ "{Tehnične specifikacije} {Napiši 3-10 tehničnih specifikacij v alinejah} ');\n"
+
+ entries, err := ParseWPProductCategoriesSQL(sql)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if len(entries) != 1 {
+ t.Fatalf("want 1 entry, got %d", len(entries))
+ }
+ if entries[0].Name != "Slušalke" {
+ t.Fatalf("name=%q", entries[0].Name)
+ }
+ raw := entries[0].Prompt
+ if strings.Contains(raw, `\"`) {
+ t.Fatalf("mysql escapes should be unescaped, still has backslash-quote: %q", raw[:80])
+ }
+ if !aiprompts.IsLegacyCombinedEnhancePrompt(raw) {
+ t.Fatal("parsed prompt should look like legacy combined enhance")
+ }
+
+ split := aiprompts.SplitLegacyCombinedEnhancePrompt(raw)
+ if !aiprompts.CategoryEnhanceHasRoleSections(split) {
+ t.Fatal("split must produce role sections")
+ }
+ if !strings.Contains(split, aiprompts.SectionTitleStart) || !strings.Contains(split, aiprompts.SectionDescriptionStart) {
+ t.Fatal("split missing Title/Description section markers")
+ }
+ if !strings.Contains(split, "znamka s pravilno kapitalizacijo") {
+ t.Fatal("Title section must keep naming formula")
+ }
+ if !strings.Contains(split, "Tehnične specifikacije") && !strings.Contains(split, "tehničnih specifikacij") {
+ t.Fatal("Description section must keep HTML body intent")
+ }
+ if !strings.Contains(split, "140 znakov") {
+ t.Fatal("Meta section must keep SEO intent")
+ }
+ if aiprompts.IsLegacyCombinedEnhancePrompt(split) {
+ t.Fatal("split output must not still look like legacy combined prompt")
+ }
+ if strings.Contains(split, "{") || strings.Contains(split, "{") {
+ t.Fatal("split must not keep legacy wrapper tag bodies")
+ }
+
+ parts := aiprompts.ParseLegacyCombinedEnhancePrompt(raw)
+ descJSON := aiprompts.DeriveDescriptionTemplateJSON(parts)
+ if descJSON == "" {
+ t.Fatal("expected description_template JSON from legacy HTML")
+ }
+ if !strings.Contains(descJSON, `"type":"h2"`) && !strings.Contains(descJSON, `"type":"p"`) {
+ t.Fatalf("description_template should include h2/p sections: %s", descJSON)
+ }
+ if !strings.Contains(descJSON, "140 znakov") {
+ t.Fatalf("description_template should carry metaDescription: %s", descJSON)
+ }
+}
+
+func TestParseWPProductCategoriesSQL_RealDownloadsFile(t *testing.T) {
+ path := ResolveWPCategoryPromptsPath(`d:\Users\Green Eclipse\Downloads\wp_product_categories.sql`)
+ if path == "" {
+ // Also try env / auto-detect without failing CI machines that lack the dump.
+ path = ResolveWPCategoryPromptsPath("")
+ }
+ if path == "" {
+ t.Skip("wp_product_categories.sql not available on this machine")
+ }
+ byNorm, _, err := loadWPCategoryPromptOverlays(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if len(byNorm) < 50 {
+ t.Fatalf("expected dozens of categories, got %d from %s", len(byNorm), path)
+ }
+ key := normalizeCategoryPromptName("Slušalke")
+ raw, ok := byNorm[key]
+ if !ok {
+ t.Fatalf("Slušalke missing from %s (keys=%d)", path, len(byNorm))
+ }
+ split := aiprompts.SplitLegacyCombinedEnhancePrompt(raw)
+ if aiprompts.CategoryEnhancePromptNeedsRepair(split) {
+ t.Fatal("split of real dump Slušalke should not need repair")
+ }
+ if !strings.Contains(split, "tip izdelka lowercase") && !strings.Contains(split, "znamka") {
+ t.Fatalf("unexpected Title rules in split: %s", split[:min(400, len(split))])
+ }
+}
+
+func TestResolveWPCategoryPromptsPath_Explicit(t *testing.T) {
+ t.Parallel()
+ dir := t.TempDir()
+ p := filepath.Join(dir, "wp_product_categories.sql")
+ if err := os.WriteFile(p, []byte("INSERT INTO `wp_product_categories` (`Name`, `Prompt`) VALUES\n('X','GPT predloga:\\n{a} {b} ');\n"), 0o644); err != nil {
+ t.Fatal(err)
+ }
+ got := ResolveWPCategoryPromptsPath(p)
+ if got != p {
+ t.Fatalf("got %q want %q", got, p)
+ }
+}
+
+func min(a, b int) int {
+ if a < b {
+ return a
+ }
+ return b
+}
+
+func TestLoadWPCategoryPromptOverlaysFromBytes(t *testing.T) {
+ t.Parallel()
+ sql := "INSERT INTO `wp_product_categories` (`Name`, `Prompt`) VALUES\n('Slusalke','GPT predloga:\\n{tip} {140} {benefit} ');\n"
+ byNorm, _, err := LoadWPCategoryPromptOverlaysFromBytes([]byte(sql))
+ if err != nil {
+ t.Fatal(err)
+ }
+ if len(byNorm) != 1 {
+ t.Fatalf("entries=%d", len(byNorm))
+ }
+ if _, _, err := LoadWPCategoryPromptOverlaysFromBytes(nil); err == nil {
+ t.Fatal("expected empty error")
+ }
+ huge := make([]byte, MaxWPCategorySQLBytes+1)
+ if _, _, err := LoadWPCategoryPromptOverlaysFromBytes(huge); err == nil {
+ t.Fatal("expected too-large error")
+ }
+}
+
+func TestResolveCategoryPromptOverlaysPrefersUploadBytes(t *testing.T) {
+ t.Parallel()
+ sql := "INSERT INTO `wp_product_categories` (`Name`, `Prompt`) VALUES\n('UploadCat','GPT predloga:\\n{a} {b} ');\n"
+ byNorm, _, meta := resolveCategoryPromptOverlays(RepairA1DemoOptions{WPCategoriesSQL: []byte(sql)})
+ if meta.WPPath != "upload:wp_product_categories.sql" {
+ t.Fatalf("WPPath=%q", meta.WPPath)
+ }
+ if !meta.ForceFromSeed {
+ t.Fatal("upload must force from seed")
+ }
+ if byNorm[normalizeCategoryPromptName("UploadCat")] == "" {
+ t.Fatal("missing upload category")
+ }
+}
diff --git a/apps/api/internal/httpapi/accept_invite_url_test.go b/apps/api/internal/httpapi/accept_invite_url_test.go
new file mode 100644
index 0000000..bcce610
--- /dev/null
+++ b/apps/api/internal/httpapi/accept_invite_url_test.go
@@ -0,0 +1,16 @@
+package httpapi
+
+import (
+ "testing"
+
+ "github.com/descrybe/descrybe-v2/apps/api/internal/mail"
+)
+
+func TestAcceptInviteURL(t *testing.T) {
+ t.Parallel()
+ got := mail.AcceptInviteURL("http://localhost:28472/", "abc123")
+ want := "http://localhost:28472/accept-invite?token=abc123"
+ if got != want {
+ t.Fatalf("AcceptInviteURL = %q want %q", got, want)
+ }
+}
diff --git a/apps/api/internal/httpapi/admin_fix_catalog_handlers.go b/apps/api/internal/httpapi/admin_fix_catalog_handlers.go
index 855c998..2ee4931 100644
--- a/apps/api/internal/httpapi/admin_fix_catalog_handlers.go
+++ b/apps/api/internal/httpapi/admin_fix_catalog_handlers.go
@@ -1,7 +1,10 @@
package httpapi
import (
+ "encoding/base64"
+ "io"
"net/http"
+ "strconv"
"strings"
"github.com/descrybe/descrybe-v2/apps/api/internal/billing"
@@ -12,6 +15,10 @@ import (
"github.com/google/uuid"
)
+// syncA1MaxBodyBytes caps JSON or multipart Sync A1 payloads (dump + form fields).
+// Slightly above MaxWPCategorySQLBytes for multipart overhead / base64 inflation.
+const syncA1MaxBodyBytes = catalog.MaxWPCategorySQLBytes + (2 << 20)
+
// handleAdminSyncCompanyA1 runs dump category backfill (when dump is on the API
// host filesystem) plus FixCompanyCatalog hygiene. Does not wipe/reimport.
//
@@ -20,9 +27,13 @@ import (
// POST /api/admin/companies/{id}/sync-a1
// POST /api/admin/companies/{id}/fix-catalog (compat alias)
//
-// Body: confirm=true required; backfill_categories (default true);
+// Body (JSON): confirm=true required; backfill_categories (default true);
// reprocess_sample_limit (default 25, max 200); mysql_dump optional path;
-// skip_dump_backfill (default false).
+// skip_dump_backfill (default false); wp_product_categories_sql_b64 optional
+// base64 of wp_product_categories.sql (primary for category prompts).
+//
+// Body (multipart/form-data): same fields as form values; file field
+// wp_product_categories or wp_categories_sql for the SQL dump upload.
//
// Flash (UI): result → flash.admin.syncA1Success.
func (s *Server) handleAdminSyncCompanyA1(w http.ResponseWriter, r *http.Request) {
@@ -37,18 +48,14 @@ func (s *Server) handleAdminSyncCompanyA1(w http.ResponseWriter, r *http.Request
return
}
- var body struct {
- Confirm bool `json:"confirm"`
- BackfillCategories *bool `json:"backfill_categories"`
- ReprocessSampleLimit *int `json:"reprocess_sample_limit"`
- MySQLDump string `json:"mysql_dump"`
- SkipDumpBackfill bool `json:"skip_dump_backfill"`
- }
- if err := DecodeJSON(r, &body); err != nil {
- Error(w, http.StatusBadRequest, "invalid json")
+ r.Body = http.MaxBytesReader(w, r.Body, syncA1MaxBodyBytes)
+
+ parsed, err := parseSyncA1Request(r)
+ if err != nil {
+ Error(w, http.StatusBadRequest, err.Error())
return
}
- if !body.Confirm {
+ if !parsed.Confirm {
Error(w, http.StatusBadRequest, "confirm must be true")
return
}
@@ -67,12 +74,12 @@ func (s *Server) handleAdminSyncCompanyA1(w http.ResponseWriter, r *http.Request
}
backfill := true
- if body.BackfillCategories != nil {
- backfill = *body.BackfillCategories
+ if parsed.BackfillCategories != nil {
+ backfill = *parsed.BackfillCategories
}
sampleLimit := 25
- if body.ReprocessSampleLimit != nil {
- sampleLimit = *body.ReprocessSampleLimit
+ if parsed.ReprocessSampleLimit != nil {
+ sampleLimit = *parsed.ReprocessSampleLimit
}
if sampleLimit < 0 {
sampleLimit = 0
@@ -92,9 +99,10 @@ func (s *Server) handleAdminSyncCompanyA1(w http.ResponseWriter, r *http.Request
BackfillCategories: backfill,
ReprocessSampleLimit: sampleLimit,
AIPrompts: s.AIPrompts,
+ WPCategoriesSQL: parsed.WPCategoriesSQL,
},
- MySQLDumpPath: strings.TrimSpace(body.MySQLDump),
- SkipDumpBackfill: body.SkipDumpBackfill,
+ MySQLDumpPath: strings.TrimSpace(parsed.MySQLDump),
+ SkipDumpBackfill: parsed.SkipDumpBackfill,
},
)
if err != nil {
@@ -104,7 +112,12 @@ func (s *Server) handleAdminSyncCompanyA1(w http.ResponseWriter, r *http.Request
note := "Synced in place (dump categories when available + hygiene); reprocess recommended products manually (no mass reprocess)."
if !result.DumpFound {
- note = "Hygiene completed without dump backfill. Place descrybe_new.sql on the API host (scripts/seed/ or SEED_A1_MYSQL_DUMP) for mapped category coverage from the legacy dump."
+ note = "Hygiene completed without product-dump category backfill. Place descrybe_new.sql on the API host (scripts/seed/ or SEED_A1_MYSQL_DUMP) for mapped category coverage from the legacy product dump."
+ }
+ if len(parsed.WPCategoriesSQL) > 0 {
+ note = "Applied uploaded wp_product_categories.sql (Title/Description/Meta/Attributes sections) + catalog hygiene. Reprocess recommended products manually (no mass reprocess)."
+ } else if strings.TrimSpace(result.WPCategoriesPath) == "" {
+ note += " Upload wp_product_categories.sql on Sync A1 for force-applied category prompts when the dump is not on the API host."
}
JSON(w, http.StatusOK, map[string]any{
@@ -118,3 +131,135 @@ func (s *Server) handleAdminSyncCompanyA1(w http.ResponseWriter, r *http.Request
func (s *Server) handleAdminFixCompanyCatalog(w http.ResponseWriter, r *http.Request) {
s.handleAdminSyncCompanyA1(w, r)
}
+
+type syncA1Request struct {
+ Confirm bool
+ BackfillCategories *bool
+ ReprocessSampleLimit *int
+ MySQLDump string
+ SkipDumpBackfill bool
+ WPCategoriesSQL []byte
+}
+
+func parseSyncA1Request(r *http.Request) (syncA1Request, error) {
+ ct := strings.ToLower(strings.TrimSpace(r.Header.Get("Content-Type")))
+ if strings.HasPrefix(ct, "multipart/form-data") {
+ return parseSyncA1Multipart(r)
+ }
+ return parseSyncA1JSON(r)
+}
+
+func parseSyncA1JSON(r *http.Request) (syncA1Request, error) {
+ var body struct {
+ Confirm bool `json:"confirm"`
+ BackfillCategories *bool `json:"backfill_categories"`
+ ReprocessSampleLimit *int `json:"reprocess_sample_limit"`
+ MySQLDump string `json:"mysql_dump"`
+ SkipDumpBackfill bool `json:"skip_dump_backfill"`
+ WPProductCategoriesB64 string `json:"wp_product_categories_sql_b64"`
+ WPProductCategoriesPath string `json:"wp_product_categories"` // path-only; ignored for apply (upload required in prod)
+ }
+ if err := DecodeJSON(r, &body); err != nil {
+ return syncA1Request{}, errInvalidJSON
+ }
+ out := syncA1Request{
+ Confirm: body.Confirm,
+ BackfillCategories: body.BackfillCategories,
+ ReprocessSampleLimit: body.ReprocessSampleLimit,
+ MySQLDump: body.MySQLDump,
+ SkipDumpBackfill: body.SkipDumpBackfill,
+ }
+ _ = body.WPProductCategoriesPath // path paste is not enough for prod — ignore
+ b64 := strings.TrimSpace(body.WPProductCategoriesB64)
+ if b64 == "" {
+ return out, nil
+ }
+ raw, err := base64.StdEncoding.DecodeString(b64)
+ if err != nil {
+ // Allow URL-safe / raw without padding for convenience.
+ raw, err = base64.RawStdEncoding.DecodeString(b64)
+ if err != nil {
+ raw, err = base64.URLEncoding.DecodeString(b64)
+ }
+ if err != nil {
+ return syncA1Request{}, errWPCategoriesB64
+ }
+ }
+ if len(raw) > catalog.MaxWPCategorySQLBytes {
+ return syncA1Request{}, errWPCategoriesTooLarge
+ }
+ out.WPCategoriesSQL = raw
+ return out, nil
+}
+
+func parseSyncA1Multipart(r *http.Request) (syncA1Request, error) {
+ if err := r.ParseMultipartForm(syncA1MaxBodyBytes); err != nil {
+ return syncA1Request{}, errInvalidMultipart
+ }
+ out := syncA1Request{
+ Confirm: parseFormBool(r.FormValue("confirm")),
+ MySQLDump: strings.TrimSpace(r.FormValue("mysql_dump")),
+ SkipDumpBackfill: parseFormBool(r.FormValue("skip_dump_backfill")),
+ }
+ if v := strings.TrimSpace(r.FormValue("backfill_categories")); v != "" {
+ b := parseFormBool(v)
+ out.BackfillCategories = &b
+ }
+ if v := strings.TrimSpace(r.FormValue("reprocess_sample_limit")); v != "" {
+ n, err := strconv.Atoi(v)
+ if err != nil {
+ return syncA1Request{}, errInvalidSampleLimit
+ }
+ out.ReprocessSampleLimit = &n
+ }
+
+ file, _, err := r.FormFile("wp_product_categories")
+ if err != nil {
+ file, _, err = r.FormFile("wp_categories_sql")
+ }
+ if err == nil {
+ defer file.Close()
+ raw, readErr := io.ReadAll(io.LimitReader(file, int64(catalog.MaxWPCategorySQLBytes)+1))
+ if readErr != nil {
+ return syncA1Request{}, errWPCategoriesRead
+ }
+ if len(raw) > catalog.MaxWPCategorySQLBytes {
+ return syncA1Request{}, errWPCategoriesTooLarge
+ }
+ out.WPCategoriesSQL = raw
+ }
+
+ if b64 := strings.TrimSpace(r.FormValue("wp_product_categories_sql_b64")); b64 != "" && len(out.WPCategoriesSQL) == 0 {
+ raw, decErr := base64.StdEncoding.DecodeString(b64)
+ if decErr != nil {
+ return syncA1Request{}, errWPCategoriesB64
+ }
+ if len(raw) > catalog.MaxWPCategorySQLBytes {
+ return syncA1Request{}, errWPCategoriesTooLarge
+ }
+ out.WPCategoriesSQL = raw
+ }
+ return out, nil
+}
+
+func parseFormBool(v string) bool {
+ switch strings.ToLower(strings.TrimSpace(v)) {
+ case "1", "true", "yes", "on":
+ return true
+ default:
+ return false
+ }
+}
+
+type syncA1ParseError string
+
+func (e syncA1ParseError) Error() string { return string(e) }
+
+var (
+ errInvalidJSON = syncA1ParseError("invalid json")
+ errInvalidMultipart = syncA1ParseError("invalid multipart form")
+ errInvalidSampleLimit = syncA1ParseError("invalid reprocess_sample_limit")
+ errWPCategoriesB64 = syncA1ParseError("invalid wp_product_categories_sql_b64")
+ errWPCategoriesTooLarge = syncA1ParseError("wp_product_categories.sql too large")
+ errWPCategoriesRead = syncA1ParseError("could not read wp_product_categories upload")
+)
diff --git a/apps/api/internal/httpapi/admin_handlers.go b/apps/api/internal/httpapi/admin_handlers.go
index f704561..eec002c 100644
--- a/apps/api/internal/httpapi/admin_handlers.go
+++ b/apps/api/internal/httpapi/admin_handlers.go
@@ -216,6 +216,7 @@ func (s *Server) handleAdminSendSetPasswordEmails(w http.ResponseWriter, r *http
skippedRateLimited := 0
skippedSend := 0
var singleToken string
+ var singleMode string
singleUser := body.UserID != nil
for _, uid := range targets {
@@ -251,6 +252,11 @@ func (s *Server) handleAdminSendSetPasswordEmails(w http.ResponseWriter, r *http
if err := s.Mail.Send(msg); err != nil {
log.Printf("admin set-password send failed user_id=%s", uid)
skippedSend++
+ if singleUser {
+ // Still return the one-time link so admins can share it while impersonating / offline SMTP.
+ singleToken = token
+ singleMode = mode
+ }
continue
}
if smtpOn {
@@ -258,6 +264,7 @@ func (s *Server) handleAdminSendSetPasswordEmails(w http.ResponseWriter, r *http
} else if singleUser {
// Share token only for single-user reissue when SMTP is off (no email in response).
singleToken = token
+ singleMode = mode
}
}
@@ -275,6 +282,11 @@ func (s *Server) handleAdminSendSetPasswordEmails(w http.ResponseWriter, r *http
}
if singleToken != "" {
resp["token"] = singleToken
+ if singleMode == "hmac" {
+ resp["accept_url"] = mail.SetPasswordURL(s.Config.WebOrigin, singleToken)
+ } else {
+ resp["accept_url"] = mail.AcceptInviteURL(s.Config.WebOrigin, singleToken)
+ }
}
JSON(w, http.StatusOK, resp)
}
diff --git a/apps/api/internal/httpapi/admin_sync_a1_upload_test.go b/apps/api/internal/httpapi/admin_sync_a1_upload_test.go
new file mode 100644
index 0000000..4159f8e
--- /dev/null
+++ b/apps/api/internal/httpapi/admin_sync_a1_upload_test.go
@@ -0,0 +1,78 @@
+package httpapi
+
+import (
+ "bytes"
+ "encoding/base64"
+ "mime/multipart"
+ "net/http"
+ "net/http/httptest"
+ "strings"
+ "testing"
+
+ "github.com/descrybe/descrybe-v2/apps/api/internal/catalog"
+)
+
+func TestParseSyncA1JSON_Base64Upload(t *testing.T) {
+ t.Parallel()
+ sql := "INSERT INTO `wp_product_categories` (`Name`, `Prompt`) VALUES\n('A','GPT predloga:\\n{x} {y} ');\n"
+ b64 := base64.StdEncoding.EncodeToString([]byte(sql))
+ body := `{"confirm":true,"wp_product_categories_sql_b64":"` + b64 + `"}`
+ req := httptest.NewRequest(http.MethodPost, "/sync", strings.NewReader(body))
+ req.Header.Set("Content-Type", "application/json")
+ parsed, err := parseSyncA1JSON(req)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !parsed.Confirm {
+ t.Fatal("confirm")
+ }
+ if string(parsed.WPCategoriesSQL) != sql {
+ t.Fatalf("sql mismatch len=%d", len(parsed.WPCategoriesSQL))
+ }
+}
+
+func TestParseSyncA1JSON_RejectsOversizedBase64(t *testing.T) {
+ t.Parallel()
+ raw := make([]byte, catalog.MaxWPCategorySQLBytes+1)
+ b64 := base64.StdEncoding.EncodeToString(raw)
+ body := `{"confirm":true,"wp_product_categories_sql_b64":"` + b64 + `"}`
+ req := httptest.NewRequest(http.MethodPost, "/sync", strings.NewReader(body))
+ req.Header.Set("Content-Type", "application/json")
+ _, err := parseSyncA1JSON(req)
+ if err == nil {
+ t.Fatal("expected too-large error")
+ }
+}
+
+func TestParseSyncA1Multipart_FileUpload(t *testing.T) {
+ t.Parallel()
+ sql := "INSERT INTO `wp_product_categories` (`Name`, `Prompt`) VALUES\n('B','GPT predloga:\\n{x} {y} ');\n"
+ var buf bytes.Buffer
+ w := multipart.NewWriter(&buf)
+ if err := w.WriteField("confirm", "true"); err != nil {
+ t.Fatal(err)
+ }
+ part, err := w.CreateFormFile("wp_product_categories", "wp_product_categories.sql")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := part.Write([]byte(sql)); err != nil {
+ t.Fatal(err)
+ }
+ ct := w.FormDataContentType()
+ if err := w.Close(); err != nil {
+ t.Fatal(err)
+ }
+ req := httptest.NewRequest(http.MethodPost, "/sync", bytes.NewReader(buf.Bytes()))
+ req.Header.Set("Content-Type", ct)
+ parsed, err := parseSyncA1Multipart(req)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !parsed.Confirm {
+ t.Fatal("confirm")
+ }
+ if string(parsed.WPCategoriesSQL) != sql {
+ t.Fatalf("sql mismatch len=%d", len(parsed.WPCategoriesSQL))
+ }
+}
diff --git a/apps/api/internal/httpapi/auth_handlers.go b/apps/api/internal/httpapi/auth_handlers.go
index f75adae..33ab82c 100644
--- a/apps/api/internal/httpapi/auth_handlers.go
+++ b/apps/api/internal/httpapi/auth_handlers.go
@@ -347,9 +347,13 @@ func (s *Server) handleMe(w http.ResponseWriter, r *http.Request) {
}
if m, err := s.Auth.EnsureMembership(r.Context(), uid, cid); err == nil {
out["membership"] = map[string]string{"role": m.Role, "status": m.Status}
+ if isOwner, oerr := s.Auth.IsCompanyOwner(r.Context(), cid, uid); oerr == nil {
+ out["is_owner"] = isOwner
+ }
} else if staffTenantSwitch && errors.Is(err, auth.ErrNotCompanyMember) {
staffOverride = true
out["membership"] = map[string]any{"role": "admin", "status": "active", "staff_override": true}
+ out["is_owner"] = false
}
}
if staffTenantSwitch && homeStr != "" {
diff --git a/apps/api/internal/httpapi/company_handlers.go b/apps/api/internal/httpapi/company_handlers.go
index cf52695..2d9419f 100644
--- a/apps/api/internal/httpapi/company_handlers.go
+++ b/apps/api/internal/httpapi/company_handlers.go
@@ -20,20 +20,25 @@ func (s *Server) handleGetCompany(w http.ResponseWriter, r *http.Request) {
name, language string
merge bool
contentLangs []string
+ ownerUserID *uuid.UUID
)
err := s.Pool.QueryRow(r.Context(), `
- SELECT id, name, language, merge_products_by_gtin, COALESCE(content_languages, '{}')
+ SELECT id, name, language, merge_products_by_gtin, COALESCE(content_languages, '{}'), owner_user_id
FROM companies WHERE id = $1`, cid).
- Scan(&id, &name, &language, &merge, &contentLangs)
+ Scan(&id, &name, &language, &merge, &contentLangs, &ownerUserID)
if err != nil {
Error(w, http.StatusNotFound, "company not found")
return
}
parsed, _ := company.ParseContentLanguages(contentLangs, language)
- JSON(w, http.StatusOK, map[string]any{
+ out := map[string]any{
"id": id, "name": name, "language": language,
"content_languages": parsed, "merge_products_by_gtin": merge,
- })
+ }
+ if ownerUserID != nil {
+ out["owner_user_id"] = *ownerUserID
+ }
+ JSON(w, http.StatusOK, out)
}
func (s *Server) handleUpdateCompany(w http.ResponseWriter, r *http.Request) {
@@ -150,6 +155,8 @@ func (s *Server) handlePutCompanySettings(w http.ResponseWriter, r *http.Request
func (s *Server) handleListTeam(w http.ResponseWriter, r *http.Request) {
cid, _ := CompanyIDFromContext(r.Context())
limit, offset := ParseLimitOffset(r)
+ var ownerUserID *uuid.UUID
+ _ = s.Pool.QueryRow(r.Context(), `SELECT owner_user_id FROM companies WHERE id = $1`, cid).Scan(&ownerUserID)
var total int64
if err := s.Pool.QueryRow(r.Context(), `
SELECT count(*) FROM memberships m WHERE m.company_id = $1 AND m.status = 'active'`, cid).Scan(&total); err != nil {
@@ -166,12 +173,13 @@ func (s *Server) handleListTeam(w http.ResponseWriter, r *http.Request) {
}
defer rows.Close()
type member struct {
- ID uuid.UUID `json:"id"`
- UserID uuid.UUID `json:"user_id"`
- Role string `json:"role"`
- Status string `json:"status"`
- Email string `json:"email"`
- Name *string `json:"name"`
+ ID uuid.UUID `json:"id"`
+ UserID uuid.UUID `json:"user_id"`
+ Role string `json:"role"`
+ Status string `json:"status"`
+ Email string `json:"email"`
+ Name *string `json:"name"`
+ IsOwner bool `json:"is_owner"`
}
out := make([]member, 0)
for rows.Next() {
@@ -180,9 +188,14 @@ func (s *Server) handleListTeam(w http.ResponseWriter, r *http.Request) {
Error(w, http.StatusInternalServerError, "scan failed")
return
}
+ m.IsOwner = ownerUserID != nil && *ownerUserID == m.UserID
out = append(out, m)
}
- JSON(w, http.StatusOK, map[string]any{"members": out, "total": total, "limit": limit, "offset": offset})
+ resp := map[string]any{"members": out, "total": total, "limit": limit, "offset": offset}
+ if ownerUserID != nil {
+ resp["owner_user_id"] = *ownerUserID
+ }
+ JSON(w, http.StatusOK, resp)
}
func (s *Server) handleCreateInvite(w http.ResponseWriter, r *http.Request) {
@@ -222,6 +235,7 @@ func (s *Server) handleCreateInvite(w http.ResponseWriter, r *http.Request) {
// Token returned when email was not delivered so operators can share the accept link.
if includeToken {
resp["token"] = token
+ resp["accept_url"] = mail.AcceptInviteURL(s.Config.WebOrigin, token)
}
JSON(w, http.StatusCreated, resp)
}
@@ -243,6 +257,13 @@ func (s *Server) handleRemoveMember(w http.ResponseWriter, r *http.Request) {
Error(w, http.StatusBadRequest, "invalid user id")
return
}
+ if ownerID, hasOwner, oerr := s.Auth.CompanyOwnerID(r.Context(), cid); oerr != nil {
+ Error(w, http.StatusInternalServerError, "lookup failed")
+ return
+ } else if hasOwner && ownerID == userID {
+ Error(w, http.StatusConflict, auth.ErrCannotRemoveOwner.Error())
+ return
+ }
var currentRole, status string
err = s.Pool.QueryRow(r.Context(), `
SELECT role, status FROM memberships
@@ -361,3 +382,49 @@ func (s *Server) handleUpdateMemberRole(w http.ResponseWriter, r *http.Request)
}
JSON(w, http.StatusOK, map[string]any{"status": "ok", "role": newRole, "user_id": userID})
}
+
+func (s *Server) handleTransferOwnership(w http.ResponseWriter, r *http.Request) {
+ cid, _ := CompanyIDFromContext(r.Context())
+ uid, ok := UserIDFromContext(r.Context())
+ if !ok {
+ Error(w, http.StatusUnauthorized, "unauthorized")
+ return
+ }
+ platformAdmin, err := s.checkPlatformAdmin(r.Context(), uid)
+ if err != nil {
+ Error(w, http.StatusInternalServerError, "authorization check failed")
+ return
+ }
+ if !platformAdmin {
+ isOwner, oerr := s.Auth.IsCompanyOwner(r.Context(), cid, uid)
+ if oerr != nil {
+ Error(w, http.StatusInternalServerError, "authorization check failed")
+ return
+ }
+ if !isOwner {
+ Error(w, http.StatusForbidden, auth.ErrNotCompanyOwner.Error())
+ return
+ }
+ }
+ var body struct {
+ UserID uuid.UUID `json:"user_id"`
+ }
+ if err := DecodeJSON(r, &body); err != nil || body.UserID == uuid.Nil {
+ Error(w, http.StatusBadRequest, "invalid json")
+ return
+ }
+ if err := s.Auth.TransferOwnership(r.Context(), cid, body.UserID); err != nil {
+ switch {
+ case errors.Is(err, auth.ErrTransferSelf):
+ JSON(w, http.StatusOK, map[string]any{"status": "ok", "owner_user_id": body.UserID})
+ case errors.Is(err, auth.ErrOwnerRequired), errors.Is(err, auth.ErrNotCompanyMember):
+ Error(w, http.StatusBadRequest, err.Error())
+ case errors.Is(err, auth.ErrCompanyNotFound):
+ Error(w, http.StatusNotFound, err.Error())
+ default:
+ ClientOrLog(w, http.StatusBadRequest, "could not transfer ownership", err, auth.ClientError)
+ }
+ return
+ }
+ JSON(w, http.StatusOK, map[string]any{"status": "ok", "owner_user_id": body.UserID})
+}
diff --git a/apps/api/internal/httpapi/middleware.go b/apps/api/internal/httpapi/middleware.go
index 8580d5b..a14d12f 100644
--- a/apps/api/internal/httpapi/middleware.go
+++ b/apps/api/internal/httpapi/middleware.go
@@ -89,6 +89,49 @@ func (s *Server) allowCompanyAdminOrPlatform(w http.ResponseWriter, r *http.Requ
return false
}
+// allowCompanyOwnerOrPlatform allows the company billing owner or a platform admin.
+// When owner_user_id is unset (pre-backfill), falls back to company admin so billing is not locked out.
+func (s *Server) allowCompanyOwnerOrPlatform(w http.ResponseWriter, r *http.Request) bool {
+ uid, ok := UserIDFromContext(r.Context())
+ if !ok {
+ Error(w, http.StatusUnauthorized, "unauthorized")
+ return false
+ }
+ isAdmin, err := s.checkPlatformAdmin(r.Context(), uid)
+ if err != nil {
+ Error(w, http.StatusInternalServerError, "authorization check failed")
+ return false
+ }
+ if isAdmin {
+ return true
+ }
+ cid, ok := CompanyIDFromContext(r.Context())
+ if !ok {
+ Error(w, http.StatusForbidden, "company required")
+ return false
+ }
+ if s.Auth != nil {
+ ownerID, hasOwner, err := s.Auth.CompanyOwnerID(r.Context(), cid)
+ if err != nil {
+ Error(w, http.StatusInternalServerError, "authorization check failed")
+ return false
+ }
+ if hasOwner {
+ if ownerID == uid {
+ return true
+ }
+ Error(w, http.StatusForbidden, "company owner required")
+ return false
+ }
+ }
+ // Legacy fallback before owner backfill, or unit tests without Auth wired.
+ if CompanyAdminAllowed(r.Context()) {
+ return true
+ }
+ Error(w, http.StatusForbidden, "company owner required")
+ return false
+}
+
func (s *Server) RequireSession(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
uidStr := s.Sessions.GetString(r.Context(), auth.SessionUserIDKey)
diff --git a/apps/api/internal/httpapi/server.go b/apps/api/internal/httpapi/server.go
index 028df54..9da6466 100644
--- a/apps/api/internal/httpapi/server.go
+++ b/apps/api/internal/httpapi/server.go
@@ -447,6 +447,7 @@ func (s *Server) Router() http.Handler {
r.Post("/team/invites", s.handleCreateInvite)
r.Get("/team/invites", s.handleListInvites)
r.Delete("/team/invites/{inviteID}", s.handleRevokeInvite)
+ r.Post("/team/transfer-ownership", s.handleTransferOwnership)
r.Patch("/team/{userID}", s.handleUpdateMemberRole)
r.Delete("/team/{userID}", s.handleRemoveMember)
diff --git a/apps/api/internal/httpapi/stripe_handlers.go b/apps/api/internal/httpapi/stripe_handlers.go
index 2dc2f39..048fe17 100644
--- a/apps/api/internal/httpapi/stripe_handlers.go
+++ b/apps/api/internal/httpapi/stripe_handlers.go
@@ -40,9 +40,7 @@ func (s *Server) handleStripeStatus(w http.ResponseWriter, r *http.Request) {
func (s *Server) handleStripeCheckout(w http.ResponseWriter, r *http.Request) {
cid, _ := CompanyIDFromContext(r.Context())
uid, _ := UserIDFromContext(r.Context())
- role, _ := RoleFromContext(r.Context())
- if role != "admin" {
- Error(w, http.StatusForbidden, "admin required")
+ if !s.allowCompanyOwnerOrPlatform(w, r) {
return
}
platformAdmin, err := s.checkPlatformAdmin(r.Context(), uid)
@@ -73,9 +71,7 @@ func (s *Server) handleStripeCheckout(w http.ResponseWriter, r *http.Request) {
func (s *Server) handleStripePortal(w http.ResponseWriter, r *http.Request) {
cid, _ := CompanyIDFromContext(r.Context())
- role, _ := RoleFromContext(r.Context())
- if role != "admin" {
- Error(w, http.StatusForbidden, "admin required")
+ if !s.allowCompanyOwnerOrPlatform(w, r) {
return
}
res, err := s.stripeSvc().CreatePortalSession(r.Context(), cid)
diff --git a/apps/api/internal/mail/mailer.go b/apps/api/internal/mail/mailer.go
index 0dc338e..ad5a83d 100644
--- a/apps/api/internal/mail/mailer.go
+++ b/apps/api/internal/mail/mailer.go
@@ -107,7 +107,7 @@ func hasHeaderBreak(v string) bool {
}
func InviteMessage(webOrigin, email, token, companyName string) Message {
- link := strings.TrimRight(webOrigin, "/") + "/accept-invite?token=" + token
+ link := AcceptInviteURL(webOrigin, token)
text := fmt.Sprintf("You have been invited to %s on Descrybe.\n\nAccept: %s\n", companyName, link)
html := fmt.Sprintf(
`You have been invited to %s on Descrybe.
Accept invite
`,
@@ -116,6 +116,11 @@ func InviteMessage(webOrigin, email, token, companyName string) Message {
return Message{To: email, Subject: "You are invited to Descrybe", Text: text, HTML: html}
}
+// AcceptInviteURL builds the durable invite / set-password accept link (hashed invite tokens).
+func AcceptInviteURL(webOrigin, token string) string {
+ return strings.TrimRight(webOrigin, "/") + "/accept-invite?token=" + token
+}
+
// SetPasswordURL builds the HMAC set-password accept-invite link.
func SetPasswordURL(webOrigin, token string) string {
return strings.TrimRight(webOrigin, "/") + "/accept-invite?token=" + token + "&mode=set-password"
@@ -133,7 +138,7 @@ func SetPasswordMessage(webOrigin, email, token string) Message {
// MigratedSetPasswordMessage uses migrator invite tokens (accept-invite flow).
func MigratedSetPasswordMessage(webOrigin, email, token string) Message {
- link := strings.TrimRight(webOrigin, "/") + "/accept-invite?token=" + token
+ link := AcceptInviteURL(webOrigin, token)
text := fmt.Sprintf(
"Your Descrybe account was migrated. Set your password here:\n\n%s\n\nIf you did not expect this email, ignore it.\n",
link,
diff --git a/apps/api/internal/processing/fix_company_catalog.go b/apps/api/internal/processing/fix_company_catalog.go
index 237dce4..0f3b4f3 100644
--- a/apps/api/internal/processing/fix_company_catalog.go
+++ b/apps/api/internal/processing/fix_company_catalog.go
@@ -20,6 +20,10 @@ type FixCompanyCatalogOpts struct {
ReprocessSampleLimit int
// AIPrompts optionally re-applies BuiltInDefaults product_enhance per content language.
AIPrompts *aiprompts.Service
+ // WPCategoriesSQL is an uploaded wp_product_categories.sql dump. When set,
+ // RepairCompanyCategoryEnhancePrompts force-applies overlays from these bytes
+ // (Admin Sync A1 primary path). Empty keeps filesystem auto-detect fallback.
+ WPCategoriesSQL []byte
}
// FixCompanyCatalogResult is the idempotent admin Fix A1 report.
@@ -36,6 +40,10 @@ type FixCompanyCatalogResult struct {
CategoryPromptsEmpty int `json:"category_prompts_empty_skipped"`
// Prompts aliases category_prompts_updated for flash.admin.fixA1Success {prompts}.
Prompts int `json:"prompts"`
+ // WPCategoriesPath is set when prompts came from wp_product_categories.sql
+ // (upload:… or a resolved filesystem path).
+ WPCategoriesPath string `json:"wp_categories_path,omitempty"`
+ WPCategoriesEntries int `json:"wp_categories_entries,omitempty"`
ProductEnhanceLanguages int `json:"product_enhance_languages"`
@@ -88,13 +96,17 @@ func FixCompanyCatalog(ctx context.Context, pool *pgxpool.Pool, companyID uuid.U
out.CategoryAttributeOrphansRemoved = orphans
out.CategoryAttributeLinks = links
- updated, alreadyOK, emptySkipped, err := catalog.RepairCompanyCategoryEnhancePrompts(ctx, pool, companyID)
+ updatedRes, err := catalog.RepairCompanyCategoryEnhancePromptsWithOptions(ctx, pool, companyID, catalog.RepairA1DemoOptions{
+ WPCategoriesSQL: opts.WPCategoriesSQL,
+ })
if err != nil {
return out, err
}
- out.CategoryPromptsUpdated = updated
- out.CategoryPromptsAlreadyOK = alreadyOK
- out.CategoryPromptsEmpty = emptySkipped
+ out.CategoryPromptsUpdated = updatedRes.Updated
+ out.CategoryPromptsAlreadyOK = updatedRes.AlreadyOK
+ out.CategoryPromptsEmpty = updatedRes.EmptySkipped
+ out.WPCategoriesPath = updatedRes.WPCategoriesPath
+ out.WPCategoriesEntries = updatedRes.SeedEntries
if opts.AIPrompts != nil {
n, err := opts.AIPrompts.ApplyBuiltInProductEnhance(ctx, companyID)
diff --git a/apps/api/internal/processing/formula_prompt.go b/apps/api/internal/processing/formula_prompt.go
index 9d19f7c..299d181 100644
--- a/apps/api/internal/processing/formula_prompt.go
+++ b/apps/api/internal/processing/formula_prompt.go
@@ -174,7 +174,7 @@ func FormatTitleFormulaConstraint(template any) string {
continue
}
}
- b.WriteString("Prefer Attrs values for [attr] slots; keep literal text as written; write name in {{language}}.")
+ b.WriteString("Prefer Attrs values for [attr] slots; keep literal text as written; write name in {{language}}; never emit brand-only when product_type or product_model slots exist.")
return strings.TrimSpace(b.String())
}
@@ -255,7 +255,7 @@ func AppendDescriptionFormulaSystemOverride(systemTpl string, descriptionTemplat
// titleFormulaSystemOverride is appended to the enhance system template when a
// category title_template is present so company/built-in "short retail title"
// rules cannot ignore the Title formula (mirrors description formula override).
-const titleFormulaSystemOverride = `When the user message includes a "Title formula", obey that structure for "name" over any shorter "short retail title" guidance: build name from Attrs in the given element order, keep literal text as written, write name in {{language}}. Never ignore the Title formula.`
+const titleFormulaSystemOverride = `When the user message includes a "Title formula", obey that structure for "name" over any shorter "short retail title" guidance: build name from Attrs in the given element order, keep literal text as written, write name in {{language}}. Never ignore the Title formula. Never emit brand-only when the formula includes product_type or product_model.`
// AppendTitleFormulaSystemOverride strengthens the system prompt when a title
// formula is active. No-op when template is empty/unparseable.
diff --git a/apps/api/sql/schema/043_company_owner.sql b/apps/api/sql/schema/043_company_owner.sql
new file mode 100644
index 0000000..2ecda11
--- /dev/null
+++ b/apps/api/sql/schema/043_company_owner.sql
@@ -0,0 +1,35 @@
+-- +goose Up
+-- Company owner is the billing representative (distinct from membership admin|member).
+-- Platform staff remain above all tenants.
+
+ALTER TABLE companies
+ ADD COLUMN IF NOT EXISTS owner_user_id UUID REFERENCES users(id) ON DELETE SET NULL;
+
+CREATE INDEX IF NOT EXISTS companies_owner_user_id_idx ON companies(owner_user_id);
+
+-- Backfill: prefer earliest active admin, else earliest active member.
+UPDATE companies c
+SET owner_user_id = sub.user_id
+FROM (
+ SELECT DISTINCT ON (m.company_id) m.company_id, m.user_id
+ FROM memberships m
+ WHERE m.status = 'active'
+ ORDER BY m.company_id,
+ CASE WHEN m.role = 'admin' THEN 0 ELSE 1 END,
+ m.created_at ASC,
+ m.user_id ASC
+) sub
+WHERE c.id = sub.company_id
+ AND c.owner_user_id IS NULL;
+
+-- Prefer a1-primary as owner on the A1 cohort tenant when present.
+UPDATE companies c
+SET owner_user_id = u.id
+FROM users u
+JOIN memberships m ON m.user_id = u.id AND m.company_id = c.id AND m.status = 'active'
+WHERE c.legacy_company_id = '97e1a309-3d23-4aa2-b518-8e8d7afdfec7'
+ AND lower(u.email) = 'a1-primary@descrybe.local';
+
+-- +goose Down
+DROP INDEX IF EXISTS companies_owner_user_id_idx;
+ALTER TABLE companies DROP COLUMN IF EXISTS owner_user_id;
diff --git a/apps/web/src/lib/admin-orgs.ts b/apps/web/src/lib/admin-orgs.ts
index 9d4fc3c..00eb7a4 100644
--- a/apps/web/src/lib/admin-orgs.ts
+++ b/apps/web/src/lib/admin-orgs.ts
@@ -270,6 +270,8 @@ export type SyncA1Result = {
dump_mapped_updated?: number;
dump_processed_updated?: number;
dump_status?: string;
+ wp_categories_path?: string;
+ wp_categories_entries?: number;
};
export type SyncA1Response = {
@@ -283,11 +285,36 @@ export type FixCatalogResult = SyncA1Result;
/** @deprecated Use SyncA1Response */
export type FixCatalogResponse = SyncA1Response;
-/** Sync A1: dump category backfill (when dump on API host) + Fix hygiene. No mass reprocess. */
+/** Sync A1: optional wp_product_categories.sql upload + dump category backfill + Fix hygiene. */
export async function syncAdminCompanyA1(
companyId: string,
- opts?: { backfillCategories?: boolean; reprocessSampleLimit?: number; skipDumpBackfill?: boolean }
+ opts?: {
+ backfillCategories?: boolean;
+ reprocessSampleLimit?: number;
+ skipDumpBackfill?: boolean;
+ wpProductCategoriesFile?: File | null;
+ }
): Promise {
+ const file = opts?.wpProductCategoriesFile ?? null;
+ if (file) {
+ const body = new FormData();
+ body.append("confirm", "true");
+ if (opts?.backfillCategories === false) {
+ body.append("backfill_categories", "false");
+ }
+ if (typeof opts?.reprocessSampleLimit === "number") {
+ body.append("reprocess_sample_limit", String(opts.reprocessSampleLimit));
+ }
+ if (opts?.skipDumpBackfill) {
+ body.append("skip_dump_backfill", "true");
+ }
+ body.append("wp_product_categories", file, file.name || "wp_product_categories.sql");
+ return api(ADMIN_SYNC_A1_PATH(companyId), {
+ method: "POST",
+ body
+ });
+ }
+
const body: {
confirm: true;
backfill_categories?: boolean;
diff --git a/apps/web/src/lib/categories/prompt-sections.ts b/apps/web/src/lib/categories/prompt-sections.ts
new file mode 100644
index 0000000..abb2987
--- /dev/null
+++ b/apps/web/src/lib/categories/prompt-sections.ts
@@ -0,0 +1,203 @@
+/**
+ * Parse / compose category enhance USER prompts that use role section markers
+ * (mirrors apps/api/internal/aiprompts/roles.go Section* constants).
+ *
+ * Storage remains a single language string with --- Title --- markers so
+ * enhance one-shot JSON parse (name, description, meta_*, attrs) keeps working.
+ */
+
+export type EnhancePromptSectionId = "title" | "description" | "meta" | "attributes";
+
+export const ENHANCE_PROMPT_SECTIONS: readonly EnhancePromptSectionId[] = [
+ "title",
+ "description",
+ "meta",
+ "attributes"
+] as const;
+
+/** Markers must stay in sync with aiprompts.Section* constants. */
+export const SECTION_MARKERS: Record<
+ EnhancePromptSectionId,
+ { start: string; end: string }
+> = {
+ title: { start: "--- Title ---", end: "--- End Title ---" },
+ description: { start: "--- Description ---", end: "--- End Description ---" },
+ meta: { start: "--- Meta ---", end: "--- End Meta ---" },
+ attributes: { start: "--- Attributes ---", end: "--- End Attributes ---" }
+};
+
+/** Canonical shared intro (same idea as CategoryEnhanceUserTemplate preamble). */
+export const DEFAULT_ENHANCE_PREAMBLE =
+ 'Your reply is parsed as JSON {"name":"string","description":"string","meta_title":"string","meta_description":"string","attrs":{}} only (system schema). Write all string fields in {{language}} (do not hardcode a language).';
+
+/** Minimal role bodies used when a section is empty on compose (keeps markers valid). */
+export const DEFAULT_SECTION_BODIES: Record = {
+ title:
+ 'Role: title. Build JSON "name": short retail title from Title formula + Attrs — never brand-only. Include product type and full model when evidence exists; follow any Title formula constraints that follow; use Attrs.\nName: {{name}}',
+ description:
+ 'Role: description. Build JSON "description": product body HTML only (not SEO meta). When a Description formula follows, emit ONE HTML string covering each section in order; otherwise prefer 1-3 factual paragraphs as ONE string with limited HTML (
).\nDescription: {{description}}',
+ meta: 'Role: meta. Build JSON "meta_title" and "meta_description" as plain SEO text (never HTML). meta_title: 50-60 chars; meta_description: 120-155 chars; follow any SEO meta formula that follows; never copy the full description HTML into meta_description.',
+ attributes:
+ 'Role: attributes. Build JSON "attrs" as an object of attribute_key → value strings. Prefer Allowed attribute keys / Title formula attr slots that follow; remap near-miss labels onto those keys; fill missing keys only from Name/Description/Category/Attrs evidence; never invent specs; omit unknown keys; never invent dimensions.\nCategory: {{category}}\nAttrs: {{attrs}}'
+};
+
+export type SectionSchemaHint = {
+ /** JSON keys this section is responsible for in the one-shot enhance reply. */
+ jsonKeys: string[];
+ /** Short example fragment for the UI. */
+ example: string;
+ /** Vars that are most useful in this section. */
+ suggestedVars: readonly string[];
+};
+
+export const SECTION_SCHEMA_HINTS: Record = {
+ title: {
+ jsonKeys: ["name"],
+ example: '{"name":"Acme Widget Pro"}',
+ suggestedVars: ["name", "attrs", "brand_voice", "language"]
+ },
+ description: {
+ jsonKeys: ["description"],
+ example: '{"description":"…
"}',
+ suggestedVars: ["description", "name", "category", "attrs", "brand_voice", "language"]
+ },
+ meta: {
+ jsonKeys: ["meta_title", "meta_description"],
+ example: '{"meta_title":"…","meta_description":"…"}',
+ suggestedVars: ["name", "description", "category", "brand_voice", "language"]
+ },
+ attributes: {
+ jsonKeys: ["attrs"],
+ example: '{"attrs":{"brand":"Acme","product_model":"Widget Pro"}}',
+ suggestedVars: ["attrs", "category", "name", "description", "gtin", "language"]
+ }
+};
+
+export type ParsedEnhancePrompt = {
+ /** True when all four role markers were present. */
+ hasRoleSections: boolean;
+ /** Text above the first --- Section --- (JSON schema intro). */
+ preamble: string;
+ sections: Record;
+};
+
+function normalizeNewlines(s: string): string {
+ return s.replaceAll("\r\n", "\n").replaceAll("\r", "\n");
+}
+
+function findMarkerIndex(haystackLower: string, marker: string): number {
+ return haystackLower.indexOf(marker.toLowerCase());
+}
+
+/** Extract body between start/end markers (case-insensitive markers, body preserved). */
+export function extractSectionBody(prompt: string, id: EnhancePromptSectionId): string | null {
+ const raw = normalizeNewlines(prompt);
+ const lower = raw.toLowerCase();
+ const { start, end } = SECTION_MARKERS[id];
+ const startIdx = findMarkerIndex(lower, start);
+ if (startIdx < 0) return null;
+ const bodyStart = startIdx + start.length;
+ const endIdx = findMarkerIndex(lower.slice(bodyStart), end);
+ if (endIdx < 0) {
+ return raw.slice(bodyStart).replace(/^\n+/, "").trimEnd();
+ }
+ return raw
+ .slice(bodyStart, bodyStart + endIdx)
+ .replace(/^\n+/, "")
+ .replace(/\n+$/, "");
+}
+
+export function hasEnhanceRoleSections(prompt: string): boolean {
+ const lower = normalizeNewlines(prompt).toLowerCase();
+ return (
+ lower.includes(SECTION_MARKERS.title.start.toLowerCase()) &&
+ lower.includes(SECTION_MARKERS.description.start.toLowerCase()) &&
+ lower.includes(SECTION_MARKERS.meta.start.toLowerCase()) &&
+ lower.includes(SECTION_MARKERS.attributes.start.toLowerCase())
+ );
+}
+
+function extractPreamble(prompt: string): string {
+ const raw = normalizeNewlines(prompt);
+ const lower = raw.toLowerCase();
+ let first = -1;
+ for (const id of ENHANCE_PROMPT_SECTIONS) {
+ const idx = findMarkerIndex(lower, SECTION_MARKERS[id].start);
+ if (idx >= 0 && (first < 0 || idx < first)) first = idx;
+ }
+ if (first <= 0) return "";
+ return raw.slice(0, first).trim();
+}
+
+/**
+ * Decompose a stored categories.prompt string into preamble + per-role bodies.
+ * Unstructured blobs land in description so content is not lost on first save.
+ */
+export function parseEnhancePrompt(prompt: string): ParsedEnhancePrompt {
+ const raw = normalizeNewlines(prompt).trim();
+ if (!raw) {
+ return {
+ hasRoleSections: false,
+ preamble: DEFAULT_ENHANCE_PREAMBLE,
+ sections: {
+ title: "",
+ description: "",
+ meta: "",
+ attributes: ""
+ }
+ };
+ }
+
+ const structured = hasEnhanceRoleSections(raw);
+ if (!structured) {
+ return {
+ hasRoleSections: false,
+ preamble: DEFAULT_ENHANCE_PREAMBLE,
+ sections: {
+ title: "",
+ description: raw,
+ meta: "",
+ attributes: ""
+ }
+ };
+ }
+
+ const sections = {} as Record;
+ for (const id of ENHANCE_PROMPT_SECTIONS) {
+ sections[id] = extractSectionBody(raw, id) ?? "";
+ }
+
+ const preamble = extractPreamble(raw) || DEFAULT_ENHANCE_PREAMBLE;
+ return { hasRoleSections: true, preamble, sections };
+}
+
+/**
+ * Compose preamble + section bodies back into the stored enhance USER template shape.
+ * Empty section bodies fall back to DEFAULT_SECTION_BODIES so markers stay valid.
+ */
+export function composeEnhancePrompt(
+ preamble: string,
+ sections: Partial>
+): string {
+ const intro = (preamble.trim() || DEFAULT_ENHANCE_PREAMBLE).trim();
+ const parts: string[] = [intro, ""];
+
+ for (const id of ENHANCE_PROMPT_SECTIONS) {
+ const { start, end } = SECTION_MARKERS[id];
+ const body = (sections[id] ?? "").trim() || DEFAULT_SECTION_BODIES[id];
+ parts.push(start, body, end, "");
+ }
+
+ return parts.join("\n").trim();
+}
+
+/** True when every section (and optional preamble) is empty / default-cleared. */
+export function isEnhancePromptEmpty(
+ preamble: string,
+ sections: Partial>
+): boolean {
+ const hasCustomPreamble =
+ preamble.trim() !== "" && preamble.trim() !== DEFAULT_ENHANCE_PREAMBLE.trim();
+ if (hasCustomPreamble) return false;
+ return ENHANCE_PROMPT_SECTIONS.every((id) => !(sections[id] ?? "").trim());
+}
\ No newline at end of file
diff --git a/apps/web/src/lib/category-prompt-sections.test.ts b/apps/web/src/lib/category-prompt-sections.test.ts
new file mode 100644
index 0000000..364d25c
--- /dev/null
+++ b/apps/web/src/lib/category-prompt-sections.test.ts
@@ -0,0 +1,82 @@
+import assert from "node:assert/strict";
+import { describe, it } from "node:test";
+import {
+ composeEnhancePrompt,
+ DEFAULT_ENHANCE_PREAMBLE,
+ hasEnhanceRoleSections,
+ isEnhancePromptEmpty,
+ parseEnhancePrompt,
+ SECTION_MARKERS
+} from "./categories/prompt-sections.ts";
+
+const sample = [
+ DEFAULT_ENHANCE_PREAMBLE,
+ "",
+ SECTION_MARKERS.title.start,
+ "Title body with {{name}}",
+ SECTION_MARKERS.title.end,
+ "",
+ SECTION_MARKERS.description.start,
+ "Desc body with {{description}}",
+ SECTION_MARKERS.description.end,
+ "",
+ SECTION_MARKERS.meta.start,
+ "Meta body",
+ SECTION_MARKERS.meta.end,
+ "",
+ SECTION_MARKERS.attributes.start,
+ "Attrs body {{attrs}}",
+ SECTION_MARKERS.attributes.end
+].join("\n");
+
+describe("category prompt sections", () => {
+ it("detects role section markers", () => {
+ assert.equal(hasEnhanceRoleSections(sample), true);
+ assert.equal(hasEnhanceRoleSections("plain marketing blob"), false);
+ });
+
+ it("parses and round-trips structured prompts", () => {
+ const parsed = parseEnhancePrompt(sample);
+ assert.equal(parsed.hasRoleSections, true);
+ assert.match(parsed.preamble, /meta_title/);
+ assert.equal(parsed.sections.title, "Title body with {{name}}");
+ assert.equal(parsed.sections.description, "Desc body with {{description}}");
+ assert.equal(parsed.sections.meta, "Meta body");
+ assert.equal(parsed.sections.attributes, "Attrs body {{attrs}}");
+
+ const again = composeEnhancePrompt(parsed.preamble, parsed.sections);
+ assert.equal(hasEnhanceRoleSections(again), true);
+ const reparsed = parseEnhancePrompt(again);
+ assert.equal(reparsed.sections.title, parsed.sections.title);
+ assert.equal(reparsed.sections.attributes, parsed.sections.attributes);
+ });
+
+ it("keeps unstructured prompts in description", () => {
+ const legacy = "Ustvari nov opis… {{description}}";
+ const parsed = parseEnhancePrompt(legacy);
+ assert.equal(parsed.hasRoleSections, false);
+ assert.equal(parsed.sections.description, legacy);
+ assert.equal(parsed.sections.title, "");
+ });
+
+ it("compose fills empty sections with defaults so markers remain", () => {
+ const out = composeEnhancePrompt(DEFAULT_ENHANCE_PREAMBLE, {
+ title: "Custom title rules",
+ description: "",
+ meta: "",
+ attributes: ""
+ });
+ assert.equal(hasEnhanceRoleSections(out), true);
+ assert.match(out, /Custom title rules/);
+ assert.match(out, /Role: description/);
+ assert.match(out, /\{\{attrs\}\}/);
+ });
+
+ it("isEnhancePromptEmpty ignores default preamble", () => {
+ assert.equal(isEnhancePromptEmpty(DEFAULT_ENHANCE_PREAMBLE, {}), true);
+ assert.equal(
+ isEnhancePromptEmpty(DEFAULT_ENHANCE_PREAMBLE, { title: "x" }),
+ false
+ );
+ });
+});
\ No newline at end of file
diff --git a/apps/web/src/lib/i18n/messages/de.ts b/apps/web/src/lib/i18n/messages/de.ts
index b5233e5..2a2c66f 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";
-/** 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",
@@ -191,18 +191,25 @@ export const de: MessageDict = {
"settings.profileUpdateFailed": "Profil konnte nicht aktualisiert werden",
"settings.role.member": "Mitglied",
"settings.role.admin": "Admin",
+ "settings.cannotRemoveOwner": "Transfer ownership before removing the company owner.",
+ "settings.transferFailed": "Could not transfer ownership",
+ "settings.ownershipTransferred": "{email} is now the company owner.",
+ "settings.transferOwnershipConfirm": "Make {email} the company owner? They will handle billing for this company.",
+ "settings.transferOwnership": "Transfer ownership",
+ "settings.ownerBadge": "Owner",
+ "settings.role.owner": "Owner",
"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 +220,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 +235,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 +254,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 +287,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 +304,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 +313,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 +397,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 +452,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 +497,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 +592,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 +650,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 +660,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 +698,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 +715,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 +761,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 +783,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",
@@ -796,6 +803,10 @@ export const de: MessageDict = {
"admin.users.inactive": "Inaktiv",
"admin.users.reissueInvite": "Einladung neu ausstellen",
"admin.users.setLocalPassword": "Lokales Passwort festlegen",
+ "admin.users.inviteLinkReady": "Copy the set-password link below and share it securely.",
+ "admin.users.inviteLinkCopied": "Set-password link copied.",
+ "admin.users.inviteLinkLabel": "One-time set-password / accept invite link",
+ "admin.users.copyInviteLink": "Copy link",
"admin.users.switchToUser": "Zu Benutzer wechseln",
"admin.users.colCompany": "Unternehmen",
"admin.users.colPlan": "Tarifplan",
@@ -805,10 +816,10 @@ 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",
@@ -818,11 +829,14 @@ export const de: MessageDict = {
"admin.users.syncA1": "A1 synchronisieren",
"admin.users.syncA1Aria": "Sync A1 categories from dump and repair catalog hygiene for {name}",
"admin.users.syncA1Title": "A1-Katalog synchronisieren",
- "admin.users.syncA1Desc": "Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
+ "admin.users.syncA1Desc": "Uploads wp_product_categories.sql to force-apply Title/Description/Meta/Attributes category prompts, optionally backfills mapped categories from a MySQL product dump on the API host, then runs catalog hygiene. Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company": "Company: {name}",
- "admin.users.syncA1Warning": "Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
+ "admin.users.syncA1Warning": "Upload wp_product_categories.sql below (primary). Auto-detect on the API host is a fallback when no file is chosen. Optional: place descrybe_new.sql on the API server for product-dump category coverage. No mass reprocess.",
"admin.users.syncA1Cancel": "Abbrechen",
"admin.users.syncA1Confirm": "A1 synchronisieren",
+ "admin.users.syncA1WpUpload": "wp_product_categories.sql",
+ "admin.users.syncA1WpUploadHint": "Choose the WordPress category prompts dump. Max 16 MiB. When uploaded, Sync A1 force-applies sectioned prompts for title and description enhance.",
+ "admin.users.syncA1WpUploadClear": "Datei entfernen",
"admin.users.noUsers": "Keine Benutzer entsprechen diesem Filter.",
"admin.users.noCompanies": "Keine Unternehmen entsprechen diesem Filter.",
"admin.users.assignRoleTitle": "Mitarbeiterrolle zuweisen",
@@ -830,14 +844,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",
@@ -845,26 +859,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",
@@ -882,7 +896,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.",
@@ -891,36 +905,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",
@@ -929,17 +943,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",
@@ -950,7 +964,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",
@@ -966,22 +980,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",
@@ -989,13 +1003,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",
@@ -1006,7 +1020,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",
@@ -1016,30 +1030,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",
@@ -1048,23 +1062,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",
@@ -1075,11 +1089,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",
@@ -1087,7 +1101,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",
@@ -1099,17 +1113,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",
@@ -1118,15 +1132,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",
@@ -1134,7 +1148,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",
@@ -1149,8 +1163,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",
@@ -1158,24 +1172,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",
@@ -1195,12 +1209,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",
@@ -1222,26 +1236,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",
@@ -1249,7 +1263,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",
@@ -1260,9 +1274,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",
@@ -1274,11 +1288,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",
@@ -1292,8 +1306,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",
@@ -1302,76 +1316,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",
@@ -1380,89 +1394,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",
@@ -1472,109 +1486,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",
@@ -1584,10 +1598,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.",
@@ -1605,46 +1619,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",
@@ -1659,18 +1673,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",
@@ -1678,127 +1692,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})",
@@ -1806,33 +1820,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",
@@ -1841,25 +1855,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.",
@@ -1871,121 +1885,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",
@@ -1997,200 +2011,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",
@@ -2208,152 +2222,152 @@ 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": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.",
- "flash.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processed←mapped {categories}, mapped←processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
- "flash.admin.syncA1Error": "A1-Sync für {name} fehlgeschlagen.",
+ "flash.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processedâ†mapped {categories}, mappedâ†processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
+ "flash.admin.syncA1Error": "A1-Sync für {name} fehlgeschlagen.",
"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",
@@ -2361,24 +2375,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",
@@ -2386,40 +2400,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",
@@ -2427,15 +2441,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",
@@ -2443,66 +2457,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",
@@ -2514,31 +2528,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.",
@@ -2546,21 +2560,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",
@@ -2570,33 +2584,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)",
@@ -2607,59 +2621,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",
@@ -2669,47 +2683,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",
@@ -2720,37 +2734,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)",
@@ -2762,81 +2776,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",
@@ -2844,16 +2858,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",
@@ -2873,29 +2887,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",
@@ -2905,8 +2919,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",
@@ -2914,23 +2928,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",
@@ -2939,51 +2953,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",
@@ -2993,7 +3007,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",
@@ -3001,20 +3015,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",
@@ -3022,22 +3036,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",
@@ -3050,62 +3064,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)",
@@ -3120,71 +3134,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",
@@ -3205,63 +3219,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",
@@ -3271,7 +3285,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",
@@ -3286,52 +3300,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.",
@@ -3339,45 +3353,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",
@@ -3389,64 +3403,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",
@@ -3458,57 +3472,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.",
@@ -3518,106 +3532,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",
@@ -3625,87 +3639,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}",
@@ -3721,41 +3735,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",
@@ -3784,12 +3798,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",
@@ -3806,33 +3820,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:",
@@ -3844,56 +3858,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",
@@ -3902,97 +3916,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",
@@ -4008,21 +4022,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",
@@ -4030,8 +4044,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",
@@ -4043,11 +4057,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",
@@ -4067,30 +4081,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",
@@ -4098,9 +4112,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",
@@ -4109,92 +4123,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).",
@@ -4202,15 +4216,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",
@@ -4218,10 +4232,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",
@@ -4229,9 +4243,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",
@@ -4240,21 +4254,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",
@@ -4267,146 +4281,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",
@@ -4415,24 +4429,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",
@@ -4440,35 +4454,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",
@@ -4476,24 +4490,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.",
@@ -4503,45 +4517,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",
@@ -4558,42 +4572,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.",
@@ -4601,7 +4615,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",
@@ -4613,41 +4627,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",
@@ -4655,18 +4669,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",
@@ -4678,181 +4692,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",
@@ -4864,41 +4878,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",
@@ -4906,51 +4920,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",
@@ -4963,8 +4977,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",
@@ -4972,55 +4986,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",
@@ -5028,69 +5042,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",
@@ -5098,104 +5112,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",
@@ -5204,24 +5218,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",
@@ -5230,12 +5244,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",
@@ -5247,19 +5261,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).",
@@ -5268,12 +5282,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.",
@@ -5283,7 +5297,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",
@@ -5298,13 +5312,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)",
@@ -5332,7 +5346,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",
@@ -5343,7 +5357,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",
@@ -5403,7 +5417,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",
@@ -5415,12 +5429,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",
@@ -5430,48 +5444,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",
@@ -5488,12 +5502,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",
@@ -5503,40 +5517,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",
@@ -5559,7 +5573,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).",
@@ -5569,21 +5583,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",
@@ -5591,14 +5605,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.",
@@ -5608,14 +5622,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",
@@ -5630,20 +5644,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 6125ba9..21ce8de 100644
--- a/apps/web/src/lib/i18n/messages/en.ts
+++ b/apps/web/src/lib/i18n/messages/en.ts
@@ -211,6 +211,13 @@ export const en: MessageDict = {
"settings.walletRemainingHint": "remaining",
"settings.role.member": "Member",
"settings.role.admin": "Admin",
+ "settings.cannotRemoveOwner": "Transfer ownership before removing the company owner.",
+ "settings.transferFailed": "Could not transfer ownership",
+ "settings.ownershipTransferred": "{email} is now the company owner.",
+ "settings.transferOwnershipConfirm": "Make {email} the company owner? They will handle billing for this company.",
+ "settings.transferOwnership": "Transfer ownership",
+ "settings.ownerBadge": "Owner",
+ "settings.role.owner": "Owner",
"settings.teamHeading": "Team Members",
"settings.inviteUser": "Invite user",
"settings.teamAdminOnly": "Only company admins can invite, promote, demote, or remove teammates.",
@@ -820,6 +827,10 @@ export const en: MessageDict = {
"admin.users.reissueInvite": "Re-issue invite",
"admin.users.setLocalPassword": "Set password",
"admin.users.setPasswordTitle": "Set password",
+ "admin.users.copyInviteLink": "Copy link",
+ "admin.users.inviteLinkLabel": "One-time set-password / accept invite link",
+ "admin.users.inviteLinkCopied": "Set-password link copied.",
+ "admin.users.inviteLinkReady": "Copy the set-password link below and share it securely.",
"admin.users.setPasswordDesc": "Force-set a login password for this user (works for legacy or fake emails that cannot receive invites).",
"admin.users.newPassword": "New password",
"admin.users.setPasswordSubmit": "Set password",
@@ -845,11 +856,14 @@ export const en: MessageDict = {
"admin.users.syncA1": "Sync A1",
"admin.users.syncA1Aria": "Sync A1 categories from dump and repair catalog hygiene for {name}",
"admin.users.syncA1Title": "Sync A1 catalog",
- "admin.users.syncA1Desc": "Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
+ "admin.users.syncA1Desc": "Uploads wp_product_categories.sql to force-apply Title/Description/Meta/Attributes category prompts, optionally backfills mapped categories from a MySQL product dump on the API host, then runs catalog hygiene. Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company": "Company: {name}",
- "admin.users.syncA1Warning": "Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
+ "admin.users.syncA1Warning": "Upload wp_product_categories.sql below (primary). Auto-detect on the API host is a fallback when no file is chosen. Optional: place descrybe_new.sql on the API server for product-dump category coverage. No mass reprocess.",
"admin.users.syncA1Cancel": "Cancel",
"admin.users.syncA1Confirm": "Sync A1",
+ "admin.users.syncA1WpUpload": "wp_product_categories.sql",
+ "admin.users.syncA1WpUploadHint": "Choose the WordPress category prompts dump. Max 16 MiB. When uploaded, Sync A1 force-applies sectioned prompts for title and description enhance.",
+ "admin.users.syncA1WpUploadClear": "Clear file",
"admin.users.noUsers": "No users match this filter.",
"admin.users.noCompanies": "No companies match this filter.",
"admin.users.assignRoleTitle": "Assign staff role",
@@ -4422,6 +4436,30 @@ export const en: MessageDict = {
"categories.usingCompanyDefaultForLang": "· empty for this language — company / built-in default applies",
"categories.aiPromptSavedLang": "AI prompt saved for {lang}.",
"categories.aiPromptClearedLang": "AI prompt cleared for {lang} (company default will apply).",
+ "categories.promptSection.navLabel": "Prompt sections",
+ "categories.promptSection.navHeading": "Sections",
+ "categories.promptSection.navHint": "Edit one part of the enhance reply at a time.",
+ "categories.promptSection.title": "Title",
+ "categories.promptSection.titleHelp": "Instructions for the product title (JSON name).",
+ "categories.promptSection.titleFormulaNote": "Title formula slots (type + brand + model) are appended automatically when set on this category.",
+ "categories.promptSection.description": "Description",
+ "categories.promptSection.descriptionHelp": "Instructions for the HTML product body (JSON description - not SEO meta).",
+ "categories.promptSection.descriptionFormulaNote": "Description formula sections are appended at render time when configured.",
+ "categories.promptSection.meta": "Meta",
+ "categories.promptSection.metaHelp": "Instructions for SEO meta_title and meta_description (plain text).",
+ "categories.promptSection.metaFormulaNote": "SEO meta formulas from the description template are appended when present.",
+ "categories.promptSection.attributes": "Attributes",
+ "categories.promptSection.attributesHelp": "Instructions for the attrs object (allowlisted keys).",
+ "categories.promptSection.attributesFormulaNote": "Allowed attribute keys and title-formula attr slots are appended at render time.",
+ "categories.promptSection.schemaHeading": "One-shot JSON",
+ "categories.promptSection.schemaHelp": "Enhance returns a single JSON object. This section owns the keys below.",
+ "categories.promptSection.contentLabel": "Section instructions",
+ "categories.promptSection.contentPlaceholder": "Role guidance and placeholders for this section...",
+ "categories.promptSection.preambleToggle": "Shared intro (all sections)",
+ "categories.promptSection.preambleHelp": "Shown once above the section markers. Keep the JSON schema reminder so the model replies correctly.",
+ "categories.promptSection.clearLanguage": "Clear language override",
+ "categories.promptSection.unstructuredHint": "This prompt is not sectioned yet. Content is shown under Description - edit the sections you need and save to store the standard Title / Description / Meta / Attributes layout.",
+ "categories.promptSection.categorizeNote": "Categorize (taxonomy pick) is a separate pipeline step - not part of this enhance prompt.",
"contentLang.switcherLabel": "Content language",
"contentLang.primary": "primary",
"contentLang.hasOverride": "custom",
diff --git a/apps/web/src/lib/i18n/messages/es.ts b/apps/web/src/lib/i18n/messages/es.ts
index d70e91e..e23688b 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";
-/** 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,216 @@ 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.cannotRemoveOwner": "Transfer ownership before removing the company owner.",
+ "settings.transferFailed": "Could not transfer ownership",
+ "settings.ownershipTransferred": "{email} is now the company owner.",
+ "settings.transferOwnershipConfirm": "Make {email} the company owner? They will handle billing for this company.",
+ "settings.transferOwnership": "Transfer ownership",
+ "settings.ownerBadge": "Owner",
+ "settings.role.owner": "Owner",
"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 +266,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 +291,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 +301,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 +317,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 +444,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 +497,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 +565,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 +587,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 +650,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 +660,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 +688,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 +751,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 +776,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,63 +799,70 @@ 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.inviteLinkReady": "Copy the set-password link below and share it securely.",
+ "admin.users.inviteLinkCopied": "Set-password link copied.",
+ "admin.users.inviteLinkLabel": "One-time set-password / accept invite link",
+ "admin.users.copyInviteLink": "Copy link",
"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.cloneDestLabel": "Destination company",
"admin.users.cloneDestSelect": "Select destination",
"admin.users.cloneDestRequired": "Choose a destination company different from the source.",
"admin.users.syncA1": "Sincronizar A1",
"admin.users.syncA1Aria": "Sync A1 categories from dump and repair catalog hygiene for {name}",
- "admin.users.syncA1Title": "Sincronizar catálogo A1",
- "admin.users.syncA1Desc": "Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
+ "admin.users.syncA1Title": "Sincronizar catálogo A1",
+ "admin.users.syncA1Desc": "Uploads wp_product_categories.sql to force-apply Title/Description/Meta/Attributes category prompts, optionally backfills mapped categories from a MySQL product dump on the API host, then runs catalog hygiene. Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company": "Company: {name}",
- "admin.users.syncA1Warning": "Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
+ "admin.users.syncA1Warning": "Upload wp_product_categories.sql below (primary). Auto-detect on the API host is a fallback when no file is chosen. Optional: place descrybe_new.sql on the API server for product-dump category coverage. No mass reprocess.",
"admin.users.syncA1Cancel": "Cancelar",
"admin.users.syncA1Confirm": "Sincronizar A1",
- "admin.users.noUsers": "Ningún usuario coincide con este filtro.",
+ "admin.users.syncA1WpUpload": "wp_product_categories.sql",
+ "admin.users.syncA1WpUploadHint": "Choose the WordPress category prompts dump. Max 16 MiB. When uploaded, Sync A1 force-applies sectioned prompts for title and description enhance.",
+ "admin.users.syncA1WpUploadClear": "Quitar archivo",
+ "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",
@@ -857,7 +871,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",
@@ -882,7 +896,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.",
@@ -897,30 +911,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",
@@ -928,18 +942,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",
@@ -950,7 +964,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",
@@ -965,48 +979,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",
@@ -1018,9 +1032,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",
@@ -1028,8 +1042,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",
@@ -1037,10 +1051,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",
@@ -1059,9 +1073,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.",
@@ -1069,26 +1083,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",
@@ -1096,20 +1110,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",
@@ -1119,22 +1133,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",
@@ -1142,106 +1156,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",
@@ -1249,7 +1263,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",
@@ -1259,26 +1273,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",
@@ -1289,17 +1303,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",
@@ -1316,13 +1330,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",
@@ -1330,35 +1344,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",
@@ -1370,121 +1384,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",
@@ -1497,30 +1511,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",
@@ -1544,37 +1558,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",
@@ -1582,22 +1596,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",
@@ -1605,47 +1619,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",
@@ -1654,21 +1668,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",
@@ -1682,30 +1696,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",
@@ -1713,37 +1727,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",
@@ -1751,8 +1765,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.",
@@ -1761,12 +1775,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",
@@ -1777,45 +1791,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",
@@ -1824,15 +1838,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",
@@ -1841,98 +1855,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",
@@ -1942,136 +1956,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",
@@ -2079,30 +2093,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",
@@ -2110,47 +2124,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",
@@ -2158,17 +2172,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",
@@ -2176,37 +2190,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",
@@ -2214,12 +2228,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",
@@ -2227,32 +2241,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.",
@@ -2262,39 +2276,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",
@@ -2302,186 +2316,186 @@ 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.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.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processed←mapped {categories}, mapped←processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
- "flash.admin.syncA1Error": "Falló la sincronización A1 de {name}.",
+ "flash.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processedâ†mapped {categories}, mappedâ†processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
+ "flash.admin.syncA1Error": "Falló la sincronización A1 de {name}.",
"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",
@@ -2492,143 +2506,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",
@@ -2637,77 +2651,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.",
@@ -2718,251 +2732,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",
@@ -2975,69 +2989,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",
@@ -3050,62 +3064,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)",
@@ -3115,61 +3129,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",
@@ -3178,17 +3192,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",
@@ -3202,7 +3216,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",
@@ -3213,16 +3227,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",
@@ -3232,10 +3246,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",
@@ -3243,45 +3257,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",
@@ -3289,165 +3303,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}",
@@ -3457,71 +3471,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",
@@ -3529,95 +3543,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",
@@ -3625,214 +3639,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:",
@@ -3844,366 +3858,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",
@@ -4215,13 +4229,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",
@@ -4229,28 +4243,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",
@@ -4261,258 +4275,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.",
@@ -4521,79 +4535,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.",
@@ -4601,53 +4615,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",
@@ -4657,21 +4671,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",
@@ -4680,225 +4694,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",
@@ -4907,21 +4921,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",
@@ -4931,30 +4945,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",
@@ -4963,51 +4977,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",
@@ -5016,250 +5030,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).",
@@ -5268,12 +5282,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.",
@@ -5281,29 +5295,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)",
@@ -5333,14 +5347,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",
@@ -5358,7 +5372,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",
@@ -5373,10 +5387,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",
@@ -5385,12 +5399,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)",
@@ -5398,10 +5412,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",
@@ -5409,18 +5423,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",
@@ -5430,97 +5444,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",
@@ -5530,11 +5544,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}",
@@ -5559,7 +5573,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).",
@@ -5567,50 +5581,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)",
@@ -5630,21 +5644,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 9c0a10a..dc8ac4c 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";
-/** 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,212 @@ 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.cannotRemoveOwner": "Transfer ownership before removing the company owner.",
+ "settings.transferFailed": "Could not transfer ownership",
+ "settings.ownershipTransferred": "{email} is now the company owner.",
+ "settings.transferOwnershipConfirm": "Make {email} the company owner? They will handle billing for this company.",
+ "settings.transferOwnership": "Transfer ownership",
+ "settings.ownerBadge": "Owner",
+ "settings.role.owner": "Owner",
+ "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 +291,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 +497,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 +650,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 +660,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,27 +795,31 @@ 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.inviteLinkReady": "Copy the set-password link below and share it securely.",
+ "admin.users.inviteLinkCopied": "Set-password link copied.",
+ "admin.users.inviteLinkLabel": "One-time set-password / accept invite link",
+ "admin.users.copyInviteLink": "Copy link",
"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",
@@ -818,56 +829,59 @@ export const fr: MessageDict = {
"admin.users.syncA1": "Synchroniser A1",
"admin.users.syncA1Aria": "Sync A1 categories from dump and repair catalog hygiene for {name}",
"admin.users.syncA1Title": "Synchroniser le catalogue A1",
- "admin.users.syncA1Desc": "Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
+ "admin.users.syncA1Desc": "Uploads wp_product_categories.sql to force-apply Title/Description/Meta/Attributes category prompts, optionally backfills mapped categories from a MySQL product dump on the API host, then runs catalog hygiene. Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company": "Company: {name}",
- "admin.users.syncA1Warning": "Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
+ "admin.users.syncA1Warning": "Upload wp_product_categories.sql below (primary). Auto-detect on the API host is a fallback when no file is chosen. Optional: place descrybe_new.sql on the API server for product-dump category coverage. No mass reprocess.",
"admin.users.syncA1Cancel": "Annuler",
"admin.users.syncA1Confirm": "Synchroniser A1",
- "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.syncA1WpUpload": "wp_product_categories.sql",
+ "admin.users.syncA1WpUploadHint": "Choose the WordPress category prompts dump. Max 16 MiB. When uploaded, Sync A1 force-applies sectioned prompts for title and description enhance.",
+ "admin.users.syncA1WpUploadClear": "Effacer le fichier",
+ "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",
@@ -882,7 +896,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.",
@@ -891,55 +905,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",
@@ -950,7 +964,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",
@@ -966,164 +980,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",
@@ -1134,7 +1148,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",
@@ -1142,441 +1156,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",
@@ -1584,95 +1598,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",
@@ -1682,314 +1696,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.",
@@ -1998,1308 +2012,1308 @@ 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.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.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processed←mapped {categories}, mapped←processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
- "flash.admin.syncA1Error": "Échec de la synchronisation A1 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.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processedâ†mapped {categories}, mappedâ†processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
+ "flash.admin.syncA1Error": "Échec de la synchronisation A1 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.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",
@@ -3307,78 +3321,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",
@@ -3388,355 +3402,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",
@@ -3744,95 +3758,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:",
@@ -3844,151 +3858,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",
@@ -3998,218 +4012,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",
@@ -4217,437 +4231,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",
@@ -4655,50 +4669,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",
@@ -4706,560 +4720,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).",
@@ -5268,12 +5282,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.",
@@ -5286,25 +5300,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)",
@@ -5319,7 +5333,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",
@@ -5332,19 +5346,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",
@@ -5358,14 +5372,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",
@@ -5373,54 +5387,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",
@@ -5430,70 +5444,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",
@@ -5502,41 +5516,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",
@@ -5559,7 +5573,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).",
@@ -5567,53 +5581,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",
@@ -5630,21 +5644,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 8fed8ce..3c1d8d8 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";
-/** 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",
@@ -191,11 +191,18 @@ export const it: MessageDict = {
"settings.profileUpdateFailed": "Impossibile aggiornare il profilo",
"settings.role.member": "Membro",
"settings.role.admin": "Admin",
+ "settings.cannotRemoveOwner": "Transfer ownership before removing the company owner.",
+ "settings.transferFailed": "Could not transfer ownership",
+ "settings.ownershipTransferred": "{email} is now the company owner.",
+ "settings.transferOwnershipConfirm": "Make {email} the company owner? They will handle billing for this company.",
+ "settings.transferOwnership": "Transfer ownership",
+ "settings.ownerBadge": "Owner",
+ "settings.role.owner": "Owner",
"settings.teamHeading": "Membri del team",
"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 +223,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 +233,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 +266,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 +292,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 +317,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 +397,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 +419,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 +452,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 +481,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 +497,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 +602,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 +650,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 +660,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 +699,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 +725,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 +751,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 +768,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 +776,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",
@@ -796,6 +803,10 @@ export const it: MessageDict = {
"admin.users.inactive": "Inattivo",
"admin.users.reissueInvite": "Riemetti invito",
"admin.users.setLocalPassword": "Imposta password locale",
+ "admin.users.inviteLinkReady": "Copy the set-password link below and share it securely.",
+ "admin.users.inviteLinkCopied": "Set-password link copied.",
+ "admin.users.inviteLinkLabel": "One-time set-password / accept invite link",
+ "admin.users.copyInviteLink": "Copy link",
"admin.users.switchToUser": "Passa a utente",
"admin.users.colCompany": "Azienda",
"admin.users.colPlan": "Piano",
@@ -818,11 +829,14 @@ export const it: MessageDict = {
"admin.users.syncA1": "Sincronizza A1",
"admin.users.syncA1Aria": "Sync A1 categories from dump and repair catalog hygiene for {name}",
"admin.users.syncA1Title": "Sincronizza catalogo A1",
- "admin.users.syncA1Desc": "Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
+ "admin.users.syncA1Desc": "Uploads wp_product_categories.sql to force-apply Title/Description/Meta/Attributes category prompts, optionally backfills mapped categories from a MySQL product dump on the API host, then runs catalog hygiene. Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company": "Company: {name}",
- "admin.users.syncA1Warning": "Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
+ "admin.users.syncA1Warning": "Upload wp_product_categories.sql below (primary). Auto-detect on the API host is a fallback when no file is chosen. Optional: place descrybe_new.sql on the API server for product-dump category coverage. No mass reprocess.",
"admin.users.syncA1Cancel": "Annulla",
"admin.users.syncA1Confirm": "Sincronizza A1",
+ "admin.users.syncA1WpUpload": "wp_product_categories.sql",
+ "admin.users.syncA1WpUploadHint": "Choose the WordPress category prompts dump. Max 16 MiB. When uploaded, Sync A1 force-applies sectioned prompts for title and description enhance.",
+ "admin.users.syncA1WpUploadClear": "Rimuovi file",
"admin.users.noUsers": "Nessun utente corrisponde a questo filtro.",
"admin.users.noCompanies": "Nessuna azienda corrisponde a questo filtro.",
"admin.users.assignRoleTitle": "Assegna ruolo staff",
@@ -845,7 +859,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",
@@ -882,7 +896,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.",
@@ -916,11 +930,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",
@@ -931,15 +945,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",
@@ -950,7 +964,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",
@@ -966,21 +980,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",
@@ -991,9 +1005,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",
@@ -1001,7 +1015,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",
@@ -1018,9 +1032,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",
@@ -1029,7 +1043,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",
@@ -1037,9 +1051,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",
@@ -1061,7 +1075,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.",
@@ -1077,39 +1091,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",
@@ -1119,7 +1133,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",
@@ -1134,7 +1148,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",
@@ -1154,7 +1168,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",
@@ -1167,11 +1181,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",
@@ -1206,10 +1220,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",
@@ -1222,7 +1236,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)",
@@ -1231,16 +1245,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",
@@ -1249,7 +1263,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",
@@ -1260,9 +1274,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",
@@ -1276,7 +1290,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",
@@ -1292,8 +1306,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",
@@ -1307,7 +1321,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",
@@ -1321,7 +1335,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",
@@ -1341,25 +1355,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",
@@ -1375,27 +1389,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",
@@ -1407,20 +1421,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",
@@ -1429,40 +1443,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",
@@ -1472,16 +1486,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",
@@ -1503,33 +1517,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",
@@ -1544,35 +1558,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",
@@ -1582,10 +1596,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...",
@@ -1605,12 +1619,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",
@@ -1626,12 +1640,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.",
@@ -1641,10 +1655,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",
@@ -1659,14 +1673,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",
@@ -1682,30 +1696,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",
@@ -1718,7 +1732,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",
@@ -1727,32 +1741,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.",
@@ -1761,14 +1775,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",
@@ -1779,7 +1793,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",
@@ -1789,16 +1803,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})",
@@ -1808,14 +1822,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",
@@ -1824,15 +1838,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",
@@ -1851,15 +1865,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.",
@@ -1874,53 +1888,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",
@@ -1929,9 +1943,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",
@@ -1942,29 +1956,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",
@@ -1977,7 +1991,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",
@@ -2008,9 +2022,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",
@@ -2023,38 +2037,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.",
@@ -2064,82 +2078,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",
@@ -2183,12 +2197,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",
@@ -2211,10 +2225,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.",
@@ -2225,7 +2239,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.",
@@ -2240,21 +2254,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.",
@@ -2263,17 +2277,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.",
@@ -2281,7 +2295,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.",
@@ -2292,9 +2306,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",
@@ -2302,12 +2316,12 @@ 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": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.",
- "flash.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processed←mapped {categories}, mapped←processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
+ "flash.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processedâ†mapped {categories}, mappedâ†processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
"flash.admin.syncA1Error": "Sincronizzazione A1 per {name} non riuscita.",
"flash.admin.planAssigned": "Piano assegnato a {name}.",
"flash.admin.planAssignedShort": "Piano assegnato.",
@@ -2318,14 +2332,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.",
@@ -2340,20 +2354,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",
@@ -2368,21 +2382,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",
@@ -2392,23 +2406,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",
@@ -2425,65 +2439,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",
@@ -2499,9 +2513,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.",
@@ -2510,35 +2524,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.",
@@ -2555,12 +2569,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",
@@ -2576,27 +2590,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)",
@@ -2608,11 +2622,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",
@@ -2639,11 +2653,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",
@@ -2676,22 +2690,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",
@@ -2707,7 +2721,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.",
@@ -2718,10 +2732,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",
@@ -2731,8 +2745,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",
@@ -2740,8 +2754,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",
@@ -2767,8 +2781,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",
@@ -2784,16 +2798,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",
@@ -2802,7 +2816,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",
@@ -2818,17 +2832,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.",
@@ -2836,22 +2850,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.",
@@ -2869,7 +2883,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.",
@@ -2878,7 +2892,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",
@@ -2891,11 +2905,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",
@@ -2905,8 +2919,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",
@@ -2919,14 +2933,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",
@@ -2934,12 +2948,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",
@@ -2972,19 +2986,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",
@@ -2993,7 +3007,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",
@@ -3002,19 +3016,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",
@@ -3034,10 +3048,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",
@@ -3047,21 +3061,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",
@@ -3074,9 +3088,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",
@@ -3091,7 +3105,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.",
@@ -3104,9 +3118,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",
@@ -3117,16 +3131,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",
@@ -3135,7 +3149,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",
@@ -3143,29 +3157,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",
@@ -3175,14 +3189,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...",
@@ -3199,7 +3213,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",
@@ -3231,9 +3245,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",
@@ -3253,16 +3267,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",
@@ -3271,7 +3285,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",
@@ -3295,7 +3309,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",
@@ -3303,7 +3317,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",
@@ -3311,10 +3325,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.",
@@ -3325,11 +3339,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.",
@@ -3340,9 +3354,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.",
@@ -3354,12 +3368,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",
@@ -3376,8 +3390,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",
@@ -3389,11 +3403,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",
@@ -3401,52 +3415,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",
@@ -3461,41 +3475,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}",
@@ -3503,12 +3517,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.",
@@ -3519,7 +3533,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",
@@ -3529,12 +3543,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",
@@ -3550,7 +3564,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.",
@@ -3576,18 +3590,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",
@@ -3600,61 +3614,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",
@@ -3673,31 +3687,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.",
@@ -3705,7 +3719,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}",
@@ -3720,23 +3734,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",
@@ -3745,14 +3759,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",
@@ -3787,9 +3801,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",
@@ -3806,33 +3820,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:",
@@ -3844,47 +3858,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,",
@@ -3892,7 +3906,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",
@@ -3902,65 +3916,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.",
@@ -3980,13 +3994,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",
@@ -4002,7 +4016,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",
@@ -4112,7 +4126,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",
@@ -4124,9 +4138,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",
@@ -4135,7 +4149,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.",
@@ -4155,30 +4169,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",
@@ -4186,24 +4200,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",
@@ -4218,20 +4232,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",
@@ -4253,12 +4267,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",
@@ -4267,13 +4281,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}",
@@ -4296,7 +4310,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.",
@@ -4320,7 +4334,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",
@@ -4330,41 +4344,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",
@@ -4380,28 +4394,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",
@@ -4412,27 +4426,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",
@@ -4445,7 +4459,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",
@@ -4460,7 +4474,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",
@@ -4483,7 +4497,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",
@@ -4496,23 +4510,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.",
@@ -4526,18 +4540,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",
@@ -4554,15 +4568,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",
@@ -4571,29 +4585,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.",
@@ -4609,45 +4623,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",
@@ -4657,20 +4671,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",
@@ -4691,14 +4705,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",
@@ -4706,25 +4720,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",
@@ -4736,50 +4750,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.",
@@ -4788,69 +4802,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",
@@ -4864,38 +4878,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.",
@@ -4904,24 +4918,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",
@@ -4932,8 +4946,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",
@@ -4944,17 +4958,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",
@@ -4963,7 +4977,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",
@@ -4972,34 +4986,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",
@@ -5007,68 +5021,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",
@@ -5090,7 +5104,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",
@@ -5098,7 +5112,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",
@@ -5110,24 +5124,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",
@@ -5135,15 +5149,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",
@@ -5152,7 +5166,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",
@@ -5171,22 +5185,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",
@@ -5194,7 +5208,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",
@@ -5204,10 +5218,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",
@@ -5217,11 +5231,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",
@@ -5247,19 +5261,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).",
@@ -5268,12 +5282,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.",
@@ -5281,7 +5295,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",
@@ -5298,13 +5312,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)",
@@ -5420,7 +5434,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",
@@ -5430,70 +5444,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",
@@ -5503,24 +5517,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",
@@ -5528,15 +5542,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",
@@ -5559,7 +5573,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).",
@@ -5567,23 +5581,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",
@@ -5591,12 +5605,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",
@@ -5608,9 +5622,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)",
@@ -5630,20 +5644,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 9bb9082..db59e4c 100644
--- a/apps/web/src/lib/i18n/messages/ja.ts
+++ b/apps/web/src/lib/i18n/messages/ja.ts
@@ -1,486 +1,493 @@
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.cannotRemoveOwner": "Transfer ownership before removing the company owner.",
+ "settings.transferFailed": "Could not transfer ownership",
+ "settings.ownershipTransferred": "{email} is now the company owner.",
+ "settings.transferOwnershipConfirm": "Make {email} the company owner? They will handle billing for this company.",
+ "settings.transferOwnership": "Transfer ownership",
+ "settings.ownerBadge": "Owner",
+ "settings.role.owner": "Owner",
+ "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 +496,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 +650,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,236 +660,243 @@ 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.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.inviteLinkReady": "Copy the set-password link below and share it securely.",
+ "admin.users.inviteLinkCopied": "Set-password link copied.",
+ "admin.users.inviteLinkLabel": "One-time set-password / accept invite link",
+ "admin.users.copyInviteLink": "Copy link",
+ "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.cloneDestLabel": "Destination company",
"admin.users.cloneDestSelect": "Select destination",
"admin.users.cloneDestRequired": "Choose a destination company different from the source.",
- "admin.users.syncA1": "A1を同期",
+ "admin.users.syncA1": "A1ã‚’åŒæœŸ",
"admin.users.syncA1Aria": "Sync A1 categories from dump and repair catalog hygiene for {name}",
- "admin.users.syncA1Title": "A1カタログを同期",
- "admin.users.syncA1Desc": "Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
+ "admin.users.syncA1Title": "A1ã‚«ã‚¿ãƒã‚°ã‚’åŒæœŸ",
+ "admin.users.syncA1Desc": "Uploads wp_product_categories.sql to force-apply Title/Description/Meta/Attributes category prompts, optionally backfills mapped categories from a MySQL product dump on the API host, then runs catalog hygiene. Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company": "Company: {name}",
- "admin.users.syncA1Warning": "Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
- "admin.users.syncA1Cancel": "キャンセル",
- "admin.users.syncA1Confirm": "A1を同期",
- "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.syncA1Warning": "Upload wp_product_categories.sql below (primary). Auto-detect on the API host is a fallback when no file is chosen. Optional: place descrybe_new.sql on the API server for product-dump category coverage. No mass reprocess.",
+ "admin.users.syncA1Cancel": "ã‚ャンセル",
+ "admin.users.syncA1Confirm": "A1ã‚’åŒæœŸ",
+ "admin.users.syncA1WpUpload": "wp_product_categories.sql",
+ "admin.users.syncA1WpUploadHint": "Choose the WordPress category prompts dump. Max 16 MiB. When uploaded, Sync A1 force-applies sectioned prompts for title and description enhance.",
+ "admin.users.syncA1WpUploadClear": "ファイルをクリア",
+ "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.",
@@ -891,55 +905,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",
@@ -950,7 +964,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",
@@ -965,2876 +979,2876 @@ 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": "ã“ã®ã‚µãƒ¼ãƒãƒ¼ã§ã¯ã‚¹ã‚¿ãƒƒãƒ•ãƒãƒ¼ãƒ«ã®æ›´æ–°ã¯ã¾ã 利用ã§ãã¾ã›ã‚“。",
+ "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.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processed←mapped {categories}, mapped←processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
- "flash.admin.syncA1Error": "{name} のA1同期に失敗しました。",
- "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.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processedâ†mapped {categories}, mappedâ†processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
+ "flash.admin.syncA1Error": "{name} ã®A1åŒæœŸã«å¤±æ•—ã—ã¾ã—ãŸã€‚",
+ "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",
@@ -3844,810 +3858,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",
@@ -4655,611 +4669,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).",
@@ -5268,12 +5282,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.",
@@ -5281,30 +5295,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)",
@@ -5319,32 +5333,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",
@@ -5358,69 +5372,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",
@@ -5430,114 +5444,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",
@@ -5559,7 +5573,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).",
@@ -5567,38 +5581,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.",
@@ -5607,15 +5621,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",
@@ -5630,21 +5644,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 8767aed..b433ac1 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";
-/** 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",
@@ -191,13 +191,20 @@ export const nl: MessageDict = {
"settings.profileUpdateFailed": "Profiel kon niet worden bijgewerkt",
"settings.role.member": "Lid",
"settings.role.admin": "Admin",
+ "settings.cannotRemoveOwner": "Transfer ownership before removing the company owner.",
+ "settings.transferFailed": "Could not transfer ownership",
+ "settings.ownershipTransferred": "{email} is now the company owner.",
+ "settings.transferOwnershipConfirm": "Make {email} the company owner? They will handle billing for this company.",
+ "settings.transferOwnership": "Transfer ownership",
+ "settings.ownerBadge": "Owner",
+ "settings.role.owner": "Owner",
"settings.teamHeading": "Teamleden",
"settings.inviteUser": "Gebruiker uitnodigen",
"settings.teamAdminOnly": "Alleen bedrijfsbeheerders kunnen teamleden uitnodigen, promoveren, degraderen of verwijderen.",
"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 +220,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 +266,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 +276,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 +292,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 +317,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 +336,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 +351,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 +360,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 +374,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 +397,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 +406,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 +456,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 +481,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 +497,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 +602,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 +650,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 +660,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 +702,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 +725,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 +751,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",
@@ -796,21 +803,25 @@ export const nl: MessageDict = {
"admin.users.inactive": "Inactief",
"admin.users.reissueInvite": "Uitnodiging opnieuw uitgeven",
"admin.users.setLocalPassword": "Lokaal wachtwoord instellen",
+ "admin.users.inviteLinkReady": "Copy the set-password link below and share it securely.",
+ "admin.users.inviteLinkCopied": "Set-password link copied.",
+ "admin.users.inviteLinkLabel": "One-time set-password / accept invite link",
+ "admin.users.copyInviteLink": "Copy link",
"admin.users.switchToUser": "Overschakelen naar gebruiker",
"admin.users.colCompany": "Bedrijf",
"admin.users.colPlan": "Abonnement",
"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.cloneDestLabel": "Destination company",
"admin.users.cloneDestSelect": "Select destination",
@@ -818,11 +829,14 @@ export const nl: MessageDict = {
"admin.users.syncA1": "A1 synchroniseren",
"admin.users.syncA1Aria": "Sync A1 categories from dump and repair catalog hygiene for {name}",
"admin.users.syncA1Title": "A1-catalogus synchroniseren",
- "admin.users.syncA1Desc": "Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
+ "admin.users.syncA1Desc": "Uploads wp_product_categories.sql to force-apply Title/Description/Meta/Attributes category prompts, optionally backfills mapped categories from a MySQL product dump on the API host, then runs catalog hygiene. Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company": "Company: {name}",
- "admin.users.syncA1Warning": "Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
+ "admin.users.syncA1Warning": "Upload wp_product_categories.sql below (primary). Auto-detect on the API host is a fallback when no file is chosen. Optional: place descrybe_new.sql on the API server for product-dump category coverage. No mass reprocess.",
"admin.users.syncA1Cancel": "Annuleren",
"admin.users.syncA1Confirm": "A1 synchroniseren",
+ "admin.users.syncA1WpUpload": "wp_product_categories.sql",
+ "admin.users.syncA1WpUploadHint": "Choose the WordPress category prompts dump. Max 16 MiB. When uploaded, Sync A1 force-applies sectioned prompts for title and description enhance.",
+ "admin.users.syncA1WpUploadClear": "Bestand wissen",
"admin.users.noUsers": "Geen gebruikers komen overeen met dit filter.",
"admin.users.noCompanies": "Geen bedrijven komen overeen met dit filter.",
"admin.users.assignRoleTitle": "Medewerkerrol toewijzen",
@@ -845,7 +859,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",
@@ -882,7 +896,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.",
@@ -891,7 +905,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",
@@ -904,7 +918,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",
@@ -920,7 +934,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",
@@ -935,11 +949,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",
@@ -950,7 +964,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",
@@ -973,15 +987,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",
@@ -991,7 +1005,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",
@@ -1018,9 +1032,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",
@@ -1029,7 +1043,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",
@@ -1037,9 +1051,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",
@@ -1077,9 +1091,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",
@@ -1104,7 +1118,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",
@@ -1119,7 +1133,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",
@@ -1134,7 +1148,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",
@@ -1167,11 +1181,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",
@@ -1197,7 +1211,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",
@@ -1222,7 +1236,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)",
@@ -1231,16 +1245,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",
@@ -1249,7 +1263,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",
@@ -1260,9 +1274,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",
@@ -1276,7 +1290,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",
@@ -1292,8 +1306,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",
@@ -1321,7 +1335,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",
@@ -1341,13 +1355,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",
@@ -1381,21 +1395,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",
@@ -1407,11 +1421,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.",
@@ -1420,11 +1434,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.",
@@ -1434,14 +1448,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",
@@ -1449,16 +1463,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.",
@@ -1472,16 +1486,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",
@@ -1497,22 +1511,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",
@@ -1544,7 +1558,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",
@@ -1567,12 +1581,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",
@@ -1584,8 +1598,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...",
@@ -1598,17 +1612,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",
@@ -1626,25 +1640,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",
@@ -1659,7 +1673,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",
@@ -1682,40 +1696,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.",
@@ -1727,7 +1741,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",
@@ -1735,15 +1749,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",
@@ -1751,8 +1765,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.",
@@ -1761,9 +1775,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",
@@ -1779,27 +1793,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.",
@@ -1808,14 +1822,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",
@@ -1823,16 +1837,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",
@@ -1851,50 +1865,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",
@@ -1904,15 +1918,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",
@@ -1920,7 +1934,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",
@@ -1929,8 +1943,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.",
@@ -1942,31 +1956,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",
@@ -1977,7 +1991,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",
@@ -1992,7 +2006,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",
@@ -2003,8 +2017,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",
@@ -2024,7 +2038,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",
@@ -2033,14 +2047,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",
@@ -2051,7 +2065,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.",
@@ -2064,33 +2078,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",
@@ -2119,17 +2133,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",
@@ -2149,7 +2163,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",
@@ -2192,14 +2206,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",
@@ -2239,13 +2253,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.",
@@ -2254,7 +2268,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.",
@@ -2269,10 +2283,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.",
@@ -2281,18 +2295,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",
@@ -2307,7 +2321,7 @@ export const nl: MessageDict = {
"flash.admin.staffRoleUpdated": "Personeelsrol bijgewerkt voor {email}.",
"flash.admin.staffRoleUnavailable": "Personeelsrolupdates zijn op deze server nog niet beschikbaar.",
"flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.",
- "flash.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processed←mapped {categories}, mapped←processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
+ "flash.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processedâ†mapped {categories}, mappedâ†processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
"flash.admin.syncA1Error": "A1-synchronisatie voor {name} mislukt.",
"flash.admin.planAssigned": "Plan toegewezen aan {name}.",
"flash.admin.planAssignedShort": "Plan toegewezen.",
@@ -2318,14 +2332,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.",
@@ -2334,13 +2348,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.",
@@ -2353,7 +2367,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",
@@ -2368,21 +2382,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",
@@ -2396,14 +2410,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.",
@@ -2453,26 +2467,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",
@@ -2501,7 +2515,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.",
@@ -2514,27 +2528,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.",
@@ -2555,12 +2569,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",
@@ -2576,15 +2590,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",
@@ -2594,9 +2608,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)",
@@ -2608,11 +2622,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",
@@ -2639,7 +2653,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",
@@ -2676,7 +2690,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.",
@@ -2686,12 +2700,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",
@@ -2707,7 +2721,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.",
@@ -2721,7 +2735,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",
@@ -2731,8 +2745,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",
@@ -2751,7 +2765,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)",
@@ -2767,12 +2781,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",
@@ -2793,7 +2807,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",
@@ -2809,30 +2823,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",
@@ -2847,19 +2861,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",
@@ -2877,36 +2891,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",
@@ -2919,7 +2933,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",
@@ -2927,7 +2941,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.",
@@ -2939,7 +2953,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",
@@ -2981,7 +2995,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",
@@ -3008,25 +3022,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.",
@@ -3034,10 +3048,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",
@@ -3054,15 +3068,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",
@@ -3074,7 +3088,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",
@@ -3087,11 +3101,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.",
@@ -3104,7 +3118,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.",
@@ -3138,34 +3152,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",
@@ -3182,7 +3196,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...",
@@ -3232,7 +3246,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",
@@ -3259,7 +3273,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",
@@ -3291,7 +3305,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",
@@ -3311,7 +3325,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.",
@@ -3325,8 +3339,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.",
@@ -3340,9 +3354,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.",
@@ -3359,7 +3373,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",
@@ -3377,7 +3391,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",
@@ -3395,14 +3409,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}",
@@ -3415,38 +3429,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",
@@ -3467,48 +3481,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.",
@@ -3519,8 +3533,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",
@@ -3529,12 +3543,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",
@@ -3549,15 +3563,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",
@@ -3576,18 +3590,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",
@@ -3603,7 +3617,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",
@@ -3612,12 +3626,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",
@@ -3625,36 +3639,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",
@@ -3667,13 +3681,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.",
@@ -3686,10 +3700,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.",
@@ -3697,7 +3711,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.",
@@ -3705,7 +3719,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}",
@@ -3725,18 +3739,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",
@@ -3751,8 +3765,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",
@@ -3764,7 +3778,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",
@@ -3787,12 +3801,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.",
@@ -3806,7 +3820,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",
@@ -3825,14 +3839,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:",
@@ -3844,53 +3858,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.",
@@ -3902,55 +3916,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?",
@@ -3958,7 +3972,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",
@@ -3968,25 +3982,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",
@@ -4026,14 +4040,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",
@@ -4041,7 +4055,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",
@@ -4056,7 +4070,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",
@@ -4112,7 +4126,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",
@@ -4124,9 +4138,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",
@@ -4135,8 +4149,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}",
@@ -4160,25 +4174,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",
@@ -4186,15 +4200,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).",
@@ -4202,8 +4216,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",
@@ -4219,9 +4233,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",
@@ -4229,9 +4243,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",
@@ -4261,7 +4275,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}",
@@ -4273,7 +4287,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",
@@ -4288,8 +4302,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",
@@ -4330,7 +4344,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",
@@ -4344,9 +4358,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.",
@@ -4359,18 +4373,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",
@@ -4380,19 +4394,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.",
@@ -4415,7 +4429,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",
@@ -4425,12 +4439,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",
@@ -4447,9 +4461,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",
@@ -4468,23 +4482,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",
@@ -4505,16 +4519,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",
@@ -4526,18 +4540,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",
@@ -4571,20 +4585,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)",
@@ -4593,7 +4607,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.",
@@ -4625,29 +4639,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",
@@ -4657,12 +4671,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",
@@ -4690,8 +4704,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.",
@@ -4706,25 +4720,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",
@@ -4739,8 +4753,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",
@@ -4767,7 +4781,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",
@@ -4779,7 +4793,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.",
@@ -4797,12 +4811,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.",
@@ -4821,30 +4835,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",
@@ -4864,19 +4878,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.",
@@ -4894,8 +4908,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.",
@@ -4907,21 +4921,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",
@@ -4963,31 +4977,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",
@@ -5000,27 +5014,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",
@@ -5028,21 +5042,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",
@@ -5050,24 +5064,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",
@@ -5090,7 +5104,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",
@@ -5115,44 +5129,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",
@@ -5163,7 +5177,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",
@@ -5172,42 +5186,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",
@@ -5221,7 +5235,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",
@@ -5247,7 +5261,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?",
@@ -5255,9 +5269,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",
@@ -5268,12 +5282,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.",
@@ -5298,7 +5312,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",
@@ -5420,7 +5434,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",
@@ -5430,16 +5444,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",
@@ -5449,18 +5463,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",
@@ -5487,13 +5501,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",
@@ -5502,25 +5516,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",
@@ -5533,10 +5547,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",
@@ -5559,7 +5573,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).",
@@ -5569,21 +5583,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",
@@ -5591,12 +5605,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",
@@ -5608,9 +5622,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)",
@@ -5630,20 +5644,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 7a22c07..5bc3058 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";
-/** 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,196 @@ 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.cannotRemoveOwner": "Transfer ownership before removing the company owner.",
+ "settings.transferFailed": "Could not transfer ownership",
+ "settings.ownershipTransferred": "{email} is now the company owner.",
+ "settings.transferOwnershipConfirm": "Make {email} the company owner? They will handle billing for this company.",
+ "settings.transferOwnership": "Transfer ownership",
+ "settings.ownerBadge": "Owner",
+ "settings.role.owner": "Owner",
+ "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 +261,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 +497,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 +588,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 +650,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 +660,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 +691,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,23 +799,27 @@ 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.inviteLinkReady": "Copy the set-password link below and share it securely.",
+ "admin.users.inviteLinkCopied": "Set-password link copied.",
+ "admin.users.inviteLinkLabel": "One-time set-password / accept invite link",
+ "admin.users.copyInviteLink": "Copy link",
+ "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",
@@ -818,34 +829,37 @@ export const pl: MessageDict = {
"admin.users.syncA1": "Synchronizuj A1",
"admin.users.syncA1Aria": "Sync A1 categories from dump and repair catalog hygiene for {name}",
"admin.users.syncA1Title": "Synchronizuj katalog A1",
- "admin.users.syncA1Desc": "Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
+ "admin.users.syncA1Desc": "Uploads wp_product_categories.sql to force-apply Title/Description/Meta/Attributes category prompts, optionally backfills mapped categories from a MySQL product dump on the API host, then runs catalog hygiene. Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company": "Company: {name}",
- "admin.users.syncA1Warning": "Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
+ "admin.users.syncA1Warning": "Upload wp_product_categories.sql below (primary). Auto-detect on the API host is a fallback when no file is chosen. Optional: place descrybe_new.sql on the API server for product-dump category coverage. No mass reprocess.",
"admin.users.syncA1Cancel": "Anuluj",
"admin.users.syncA1Confirm": "Synchronizuj A1",
- "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.syncA1WpUpload": "wp_product_categories.sql",
+ "admin.users.syncA1WpUploadHint": "Choose the WordPress category prompts dump. Max 16 MiB. When uploaded, Sync A1 force-applies sectioned prompts for title and description enhance.",
+ "admin.users.syncA1WpUploadClear": "Wyczyść plik",
+ "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",
@@ -856,33 +870,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.",
@@ -891,55 +905,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",
@@ -950,7 +964,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",
@@ -965,35 +979,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",
@@ -1001,9 +1015,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",
@@ -1016,110 +1030,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",
@@ -1128,13 +1142,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",
@@ -1142,36 +1156,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",
@@ -1179,40 +1193,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",
@@ -1220,89 +1234,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",
@@ -1312,1262 +1326,1262 @@ 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.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.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processed←mapped {categories}, mapped←processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
- "flash.admin.syncA1Error": "Synchronizacja A1 dla {name} nie powiodła się.",
+ "flash.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processedâ†mapped {categories}, mappedâ†processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
+ "flash.admin.syncA1Error": "Synchronizacja A1 dla {name} nie powiodła się.",
"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.",
@@ -2576,184 +2590,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",
@@ -2761,231 +2775,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",
@@ -2993,70 +3007,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",
@@ -3065,205 +3079,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",
@@ -3271,9 +3285,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",
@@ -3288,230 +3302,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",
@@ -3519,320 +3533,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:",
@@ -3844,154 +3858,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",
@@ -4002,143 +4016,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.",
@@ -4146,82 +4160,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",
@@ -4229,425 +4243,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",
@@ -4656,199 +4670,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",
@@ -4857,104 +4871,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",
@@ -4963,112 +4977,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",
@@ -5082,184 +5096,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).",
@@ -5268,12 +5282,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.",
@@ -5284,27 +5298,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)",
@@ -5325,25 +5339,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",
@@ -5361,8 +5375,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",
@@ -5372,55 +5386,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",
@@ -5430,114 +5444,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",
@@ -5559,7 +5573,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).",
@@ -5567,38 +5581,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.",
@@ -5608,14 +5622,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",
@@ -5630,21 +5644,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 56f3613..997dd2d 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";
-/** 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,215 @@ 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.cannotRemoveOwner": "Transfer ownership before removing the company owner.",
+ "settings.transferFailed": "Could not transfer ownership",
+ "settings.ownershipTransferred": "{email} is now the company owner.",
+ "settings.transferOwnershipConfirm": "Make {email} the company owner? They will handle billing for this company.",
+ "settings.transferOwnership": "Transfer ownership",
+ "settings.ownerBadge": "Owner",
+ "settings.role.owner": "Owner",
"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 +266,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 +443,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 +497,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 +650,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 +660,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 +749,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 +761,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 +774,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,78 +795,85 @@ 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",
"admin.users.setLocalPassword": "Definir palavra-passe local",
+ "admin.users.inviteLinkReady": "Copy the set-password link below and share it securely.",
+ "admin.users.inviteLinkCopied": "Set-password link copied.",
+ "admin.users.inviteLinkLabel": "One-time set-password / accept invite link",
+ "admin.users.copyInviteLink": "Copy link",
"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.cloneDestLabel": "Destination company",
"admin.users.cloneDestSelect": "Select destination",
"admin.users.cloneDestRequired": "Choose a destination company different from the source.",
"admin.users.syncA1": "Sincronizar A1",
"admin.users.syncA1Aria": "Sync A1 categories from dump and repair catalog hygiene for {name}",
- "admin.users.syncA1Title": "Sincronizar catálogo A1",
- "admin.users.syncA1Desc": "Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
+ "admin.users.syncA1Title": "Sincronizar catálogo A1",
+ "admin.users.syncA1Desc": "Uploads wp_product_categories.sql to force-apply Title/Description/Meta/Attributes category prompts, optionally backfills mapped categories from a MySQL product dump on the API host, then runs catalog hygiene. Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company": "Company: {name}",
- "admin.users.syncA1Warning": "Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
+ "admin.users.syncA1Warning": "Upload wp_product_categories.sql below (primary). Auto-detect on the API host is a fallback when no file is chosen. Optional: place descrybe_new.sql on the API server for product-dump category coverage. No mass reprocess.",
"admin.users.syncA1Cancel": "Cancelar",
"admin.users.syncA1Confirm": "Sincronizar A1",
+ "admin.users.syncA1WpUpload": "wp_product_categories.sql",
+ "admin.users.syncA1WpUploadHint": "Choose the WordPress category prompts dump. Max 16 MiB. When uploaded, Sync A1 force-applies sectioned prompts for title and description enhance.",
+ "admin.users.syncA1WpUploadClear": "Limpar ficheiro",
"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",
@@ -871,18 +885,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.",
@@ -891,36 +905,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",
@@ -929,17 +943,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",
@@ -950,7 +964,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",
@@ -965,48 +979,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",
@@ -1014,34 +1028,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",
@@ -1057,59 +1071,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",
@@ -1119,22 +1133,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",
@@ -1142,14 +1156,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",
@@ -1157,43 +1171,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",
@@ -1204,53 +1218,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",
@@ -1260,28 +1274,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",
@@ -1290,17 +1304,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",
@@ -1308,94 +1322,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",
@@ -1407,83 +1421,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",
@@ -1498,23 +1512,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",
@@ -1522,12 +1536,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",
@@ -1536,137 +1550,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",
@@ -1677,44 +1691,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}",
@@ -1727,112 +1741,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",
@@ -1842,27 +1856,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",
@@ -1872,332 +1886,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",
@@ -2206,95 +2220,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",
@@ -2304,28 +2318,28 @@ 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.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.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processed←mapped {categories}, mapped←processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
- "flash.admin.syncA1Error": "Falha na sincronização A1 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.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processedâ†mapped {categories}, mappedâ†processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
+ "flash.admin.syncA1Error": "Falha na sincronização A1 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.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.",
@@ -2333,152 +2347,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",
@@ -2501,49 +2515,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",
@@ -2553,73 +2567,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",
@@ -2627,7 +2641,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",
@@ -2639,307 +2653,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",
@@ -2948,21 +2962,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",
@@ -2975,69 +2989,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",
@@ -3054,7 +3068,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",
@@ -3063,49 +3077,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)",
@@ -3115,57 +3129,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",
@@ -3178,17 +3192,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",
@@ -3202,7 +3216,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",
@@ -3214,529 +3228,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",
@@ -3745,33 +3759,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",
@@ -3779,62 +3793,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",
@@ -3844,289 +3858,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",
@@ -4135,26 +4149,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)",
@@ -4162,51 +4176,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",
@@ -4215,13 +4229,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",
@@ -4229,28 +4243,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",
@@ -4263,391 +4277,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",
@@ -4657,248 +4671,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",
@@ -4907,359 +4921,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).",
@@ -5268,12 +5282,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.",
@@ -5284,26 +5298,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)",
@@ -5319,7 +5333,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",
@@ -5333,18 +5347,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",
@@ -5358,14 +5372,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",
@@ -5373,54 +5387,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",
@@ -5430,98 +5444,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",
@@ -5530,13 +5544,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",
@@ -5559,7 +5573,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).",
@@ -5567,37 +5581,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.",
@@ -5607,15 +5621,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",
@@ -5630,21 +5644,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 5186b50..6891301 100644
--- a/apps/web/src/lib/i18n/messages/sl.ts
+++ b/apps/web/src/lib/i18n/messages/sl.ts
@@ -1,6 +1,6 @@
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.cloneCatalog": "Copy to my company",
"admin.users.cloneCatalogAria": "Copy {name} catalog into your sandbox company",
@@ -18,12 +18,15 @@ export const sl: MessageDict = {
"admin.users.syncA1": "Sinhroniziraj A1",
"admin.users.syncA1Aria": "Sync A1 categories from dump and repair catalog hygiene for {name}",
"admin.users.syncA1Title": "Sinhroniziraj katalog A1",
- "admin.users.syncA1Desc": "Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
+ "admin.users.syncA1Desc": "Uploads wp_product_categories.sql to force-apply Title/Description/Meta/Attributes category prompts, optionally backfills mapped categories from a MySQL product dump on the API host, then runs catalog hygiene. Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company": "Company: {name}",
- "admin.users.syncA1Warning": "Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
- "admin.users.syncA1Cancel": "Prekliči",
+ "admin.users.syncA1Warning": "Upload wp_product_categories.sql below (primary). Auto-detect on the API host is a fallback when no file is chosen. Optional: place descrybe_new.sql on the API server for product-dump category coverage. No mass reprocess.",
+ "admin.users.syncA1Cancel": "PrekliÄi",
"admin.users.syncA1Confirm": "Sinhroniziraj A1",
+ "admin.users.syncA1WpUpload": "wp_product_categories.sql",
+ "admin.users.syncA1WpUploadHint": "Choose the WordPress category prompts dump. Max 16 MiB. When uploaded, Sync A1 force-applies sectioned prompts for title and description enhance.",
+ "admin.users.syncA1WpUploadClear": "Počisti datoteko",
"flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.",
- "flash.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processed←mapped {categories}, mapped←processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
+ "flash.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processedâ†mapped {categories}, mappedâ†processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
"flash.admin.syncA1Error": "Sinhronizacija A1 za {name} ni uspela.",
};
diff --git a/apps/web/src/lib/i18n/sync-a1-keys.test.ts b/apps/web/src/lib/i18n/sync-a1-keys.test.ts
index dd113f4..34e8088 100644
--- a/apps/web/src/lib/i18n/sync-a1-keys.test.ts
+++ b/apps/web/src/lib/i18n/sync-a1-keys.test.ts
@@ -1,4 +1,4 @@
-/**
+/**
* Focused check: admin Sync A1 i18n keys exist in every UI_LOCALES pack.
*/
import assert from "node:assert/strict";
@@ -16,6 +16,9 @@ const SYNC_A1_KEYS = [
"admin.users.syncA1Desc",
"admin.users.syncA1Company",
"admin.users.syncA1Warning",
+ "admin.users.syncA1WpUpload",
+ "admin.users.syncA1WpUploadHint",
+ "admin.users.syncA1WpUploadClear",
"admin.users.syncA1Cancel",
"admin.users.syncA1Confirm",
"flash.admin.syncA1Success",
diff --git a/apps/web/src/lib/types.ts b/apps/web/src/lib/types.ts
index 15a822e..46d36c8 100644
--- a/apps/web/src/lib/types.ts
+++ b/apps/web/src/lib/types.ts
@@ -20,6 +20,7 @@ export type Company = {
language?: string;
content_languages?: string[];
merge_products_by_gtin?: boolean;
+ owner_user_id?: string | null;
};
export type CreditBalance = {
@@ -94,6 +95,8 @@ export type MeResponse = {
companies?: Company[];
active_company_id?: string;
membership?: { role: string; status: string; staff_override?: boolean } | null;
+ /** True when the signed-in user is companies.owner_user_id for the active company. */
+ is_owner?: boolean;
credits?: CreditBalance | null;
staff_access?: StaffAccess | null;
staff_capabilities?: string[];
@@ -234,6 +237,7 @@ export type TeamMember = {
role?: string | null;
status?: string | null;
created_at?: string | null;
+ is_owner?: boolean;
};
export type ChannelSyncSummary = {
diff --git a/apps/web/src/routes/admin/users/+page.svelte b/apps/web/src/routes/admin/users/+page.svelte
index 66f4de8..1db4b8a 100644
--- a/apps/web/src/routes/admin/users/+page.svelte
+++ b/apps/web/src/routes/admin/users/+page.svelte
@@ -66,6 +66,7 @@
let busyUserId = $state(null);
let error = $state("");
let success = $state("");
+ let inviteAcceptLink = $state(null);
let tab = $state("users");
let search = $state("");
let staffOnly = $state(false);
@@ -99,6 +100,7 @@
let syncOpen = $state(false);
let syncCompany = $state(null);
+ let syncWpCategoriesFile = $state(null);
const cloneDestLabel = $derived.by(() => {
const selected = cloneDestOptions.find((c) => c.id === cloneDestId);
@@ -407,6 +409,7 @@
function openSyncDialog(company: AdminOrgCompany) {
syncCompany = company;
+ syncWpCategoriesFile = null;
syncOpen = true;
error = "";
success = "";
@@ -468,7 +471,8 @@
const targetName = syncCompany.name;
try {
const res = await syncAdminCompanyA1(syncCompany.id, {
- reprocessSampleLimit: 25
+ reprocessSampleLimit: 25,
+ wpProductCategoriesFile: syncWpCategoriesFile
});
const r = res.result;
const mappedWith = Number(r.mapped_with_category ?? 0);
@@ -489,6 +493,7 @@
});
syncOpen = false;
syncCompany = null;
+ syncWpCategoriesFile = null;
} catch (err) {
error = failureMessage(err, i18n.t("flash.admin.syncA1Error", { name: targetName }));
} finally {
@@ -500,6 +505,7 @@
busy = true;
error = "";
success = "";
+ inviteAcceptLink = null;
try {
const body = userId ? { user_id: userId } : {};
const res = await api<{
@@ -510,6 +516,7 @@
skipped_rate_limited?: number;
smtp_enabled: boolean;
token?: string;
+ accept_url?: string;
}>("/api/admin/emails/set-password", { method: "POST", body });
const parts = [
`sent ${res.sent}`,
@@ -518,9 +525,18 @@
];
if (res.skipped_synthetic) parts.push(`skipped test accounts ${res.skipped_synthetic}`);
if (res.skipped_rate_limited) parts.push(`rate-limited ${res.skipped_rate_limited}`);
- success = i18n.t("flash.admin.invitesSummary", { parts: parts.join(", "), smtp: res.smtp_enabled ? i18n.t("flash.admin.smtpOn") : i18n.t("flash.admin.smtpOff") });
- if (res.token) {
- success += " Invite link available — copy and share it securely (email delivery is off).";
+ success = i18n.t("flash.admin.invitesSummary", {
+ parts: parts.join(", "),
+ smtp: res.smtp_enabled ? i18n.t("flash.admin.smtpOn") : i18n.t("flash.admin.smtpOff")
+ });
+ const link =
+ res.accept_url?.trim() ||
+ (res.token
+ ? `${window.location.origin}/accept-invite?token=${encodeURIComponent(res.token)}`
+ : "");
+ if (link) {
+ inviteAcceptLink = link;
+ success += " " + i18n.t("admin.users.inviteLinkReady");
}
} catch (err) {
error = failureMessage(err, "Send failed");
@@ -529,6 +545,17 @@
}
}
+ async function copyInviteLink() {
+ if (!inviteAcceptLink) return;
+ try {
+ await navigator.clipboard.writeText(inviteAcceptLink);
+ success = i18n.t("admin.users.inviteLinkCopied");
+ error = "";
+ } catch {
+ error = i18n.t("flash.settings.copyFailed");
+ }
+ }
+
function openPasswordDialog(user: AdminOrgUser) {
passwordUser = user;
passwordValue = "";
@@ -613,6 +640,22 @@
{:else}
+ {#if inviteAcceptLink}
+
+
+ copyInviteLink()}>
+
+ {i18n.t("admin.users.copyInviteLink")}
+
+
+ {/if}
{#if !staffRoleApiOk}
{/if}
+
+
+ {i18n.t("admin.users.syncA1WpUpload")}
+
+
{
+ const input = e.currentTarget;
+ syncWpCategoriesFile = input.files?.[0] ?? null;
+ }}
+ />
+
{i18n.t("admin.users.syncA1WpUploadHint")}
+ {#if syncWpCategoriesFile}
+
+ {syncWpCategoriesFile.name}
+ {
+ syncWpCategoriesFile = null;
+ }}
+ >
+ {i18n.t("admin.users.syncA1WpUploadClear")}
+
+
+ {/if}
+
{i18n.t("admin.users.syncA1Warning")}
@@ -1098,6 +1174,7 @@
onclick={() => {
syncOpen = false;
syncCompany = null;
+ syncWpCategoriesFile = null;
}}
>
{i18n.t("admin.users.syncA1Cancel")}
diff --git a/apps/web/src/routes/categories/[categoryId]/prompt/+page.svelte b/apps/web/src/routes/categories/[categoryId]/prompt/+page.svelte
index 9b15682..b01452c 100644
--- a/apps/web/src/routes/categories/[categoryId]/prompt/+page.svelte
+++ b/apps/web/src/routes/categories/[categoryId]/prompt/+page.svelte
@@ -6,11 +6,21 @@
import { api, ApiError, failureMessage } from "$lib/api";
import type { Cat } from "$lib/categories/types";
import { findCategoryIdByUniqueId, listAllCategories, resolveCategory } from "$lib/categories/resolve";
+ import {
+ composeEnhancePrompt,
+ DEFAULT_ENHANCE_PREAMBLE,
+ ENHANCE_PROMPT_SECTIONS,
+ isEnhancePromptEmpty,
+ parseEnhancePrompt,
+ SECTION_SCHEMA_HINTS,
+ type EnhancePromptSectionId
+ } from "$lib/categories/prompt-sections";
import PageShell from "$lib/components/PageShell.svelte";
import Alert from "$lib/components/Alert.svelte";
import Spinner from "$lib/components/Spinner.svelte";
import ContentLanguageSwitcher from "$lib/components/ContentLanguageSwitcher.svelte";
import {
+ Badge,
Button,
Card,
CardContent,
@@ -20,7 +30,16 @@
Label,
Textarea
} from "$lib/components/ui";
- import { ArrowLeft, Share2, Sparkles, X } from "@lucide/svelte";
+ import {
+ ArrowLeft,
+ FileText,
+ Search,
+ Share2,
+ Sparkles,
+ Tags,
+ Type,
+ X
+ } from "@lucide/svelte";
import TreeSelectDialog from "$lib/components/categories/TreeSelectDialog.svelte";
import {
CONTENT_LANGUAGES,
@@ -31,16 +50,42 @@
const categoryParam = $derived(String(page.params.categoryId ?? ""));
- const PROMPT_VARS = [
- { name: "name", label: i18n.t("categories.productName") },
- { name: "description", label: i18n.t("products.enrichment.piece.description") },
- { name: "category", label: i18n.t("products.enrichment.piece.category") },
- { name: "attrs", label: i18n.t("products.enrichment.piece.attributes") },
- { name: "gtin", label: i18n.t("categories.gtin") },
- { name: "brand_voice", label: i18n.t("categories.brandVoice") },
- { name: "language", label: i18n.t("settings.contentLanguage") }
+ const ALL_PROMPT_VARS = [
+ { name: "name", labelKey: "categories.productName" },
+ { name: "description", labelKey: "products.enrichment.piece.description" },
+ { name: "category", labelKey: "products.enrichment.piece.category" },
+ { name: "attrs", labelKey: "products.enrichment.piece.attributes" },
+ { name: "gtin", labelKey: "categories.gtin" },
+ { name: "brand_voice", labelKey: "categories.brandVoice" },
+ { name: "language", labelKey: "settings.contentLanguage" }
] as const;
+ const SECTION_META: Record<
+ EnhancePromptSectionId,
+ { labelKey: string; helpKey: string; formulaNoteKey: string }
+ > = {
+ title: {
+ labelKey: "categories.promptSection.title",
+ helpKey: "categories.promptSection.titleHelp",
+ formulaNoteKey: "categories.promptSection.titleFormulaNote"
+ },
+ description: {
+ labelKey: "categories.promptSection.description",
+ helpKey: "categories.promptSection.descriptionHelp",
+ formulaNoteKey: "categories.promptSection.descriptionFormulaNote"
+ },
+ meta: {
+ labelKey: "categories.promptSection.meta",
+ helpKey: "categories.promptSection.metaHelp",
+ formulaNoteKey: "categories.promptSection.metaFormulaNote"
+ },
+ attributes: {
+ labelKey: "categories.promptSection.attributes",
+ helpKey: "categories.promptSection.attributesHelp",
+ formulaNoteKey: "categories.promptSection.attributesFormulaNote"
+ }
+ };
+
let loading = $state(true);
let saving = $state(false);
let assigning = $state(false);
@@ -49,6 +94,7 @@
let success = $state("");
let category = $state(null);
let allCategories = $state([]);
+ /** Stored combined prompt per language (API shape). */
let promptsByLang = $state>({});
let selectedLang = $state(DEFAULT_CONTENT_LANGUAGE);
let extraLangs = $state([]);
@@ -56,11 +102,28 @@
let primaryLang = $state(DEFAULT_CONTENT_LANGUAGE);
let assignOpen = $state(false);
- const prompt = $derived(promptsByLang[selectedLang] ?? "");
+ let activeSection = $state("title");
+ let preamble = $state(DEFAULT_ENHANCE_PREAMBLE);
+ let sectionBodies = $state>({
+ title: "",
+ description: "",
+ meta: "",
+ attributes: ""
+ });
+ let unstructuredHint = $state(false);
+
const langLabel = $derived(
CONTENT_LANGUAGES.find((l) => l.value === selectedLang)?.label ?? selectedLang
);
+ const schemaHint = $derived(SECTION_SCHEMA_HINTS[activeSection]);
+ const sectionMeta = $derived(SECTION_META[activeSection]);
+ const sectionBody = $derived(sectionBodies[activeSection] ?? "");
+
+ const sectionVars = $derived(
+ ALL_PROMPT_VARS.filter((v) => schemaHint.suggestedVars.includes(v.name))
+ );
+
const matchingUniqueIds = $derived.by(() => {
if (!category) return [] as string[];
const uid = String(category.unique_id ?? "");
@@ -73,6 +136,29 @@
return [];
});
+ function syncEditorFromStored(raw: string) {
+ const parsed = parseEnhancePrompt(raw);
+ preamble = parsed.preamble || DEFAULT_ENHANCE_PREAMBLE;
+ sectionBodies = { ...parsed.sections };
+ unstructuredHint = Boolean(raw.trim()) && !parsed.hasRoleSections;
+ }
+
+ function currentCombined(): string {
+ if (isEnhancePromptEmpty(preamble, sectionBodies)) return "";
+ return composeEnhancePrompt(preamble, sectionBodies);
+ }
+
+ function flushEditorToLang() {
+ const combined = currentCombined();
+ if (combined) {
+ promptsByLang = { ...promptsByLang, [selectedLang]: combined };
+ } else {
+ const next = { ...promptsByLang };
+ delete next[selectedLang];
+ promptsByLang = next;
+ }
+ }
+
function applyCategory(cat: Cat) {
category = cat;
const map: Record = {};
@@ -90,6 +176,14 @@
if (!selectedLang || (!(selectedLang in map) && !contentLanguages.includes(selectedLang))) {
selectedLang = primaryLang;
}
+ syncEditorFromStored(map[selectedLang] ?? "");
+ }
+
+ function onLangChange(code: string) {
+ if (code === selectedLang) return;
+ flushEditorToLang();
+ selectedLang = code;
+ syncEditorFromStored(promptsByLang[code] ?? "");
}
async function load() {
@@ -125,21 +219,22 @@
void load();
});
- function setPrompt(next: string) {
- promptsByLang = { ...promptsByLang, [selectedLang]: next };
+ function setSectionBody(next: string) {
+ sectionBodies = { ...sectionBodies, [activeSection]: next };
+ unstructuredHint = false;
}
function insertVariable(name: string) {
const token = `{{${name}}}`;
- const el = document.getElementById("category-prompt") as HTMLTextAreaElement | null;
- const current = promptsByLang[selectedLang] ?? "";
+ const el = document.getElementById("category-prompt-section") as HTMLTextAreaElement | null;
+ const current = sectionBodies[activeSection] ?? "";
if (!el) {
- setPrompt(`${current}${token}`);
+ setSectionBody(`${current}${token}`);
return;
}
const start = el.selectionStart ?? current.length;
const end = el.selectionEnd ?? current.length;
- setPrompt(`${current.slice(0, start)}${token}${current.slice(end)}`);
+ setSectionBody(`${current.slice(0, start)}${token}${current.slice(end)}`);
queueMicrotask(() => {
el.focus();
const pos = start + token.length;
@@ -147,12 +242,27 @@
});
}
+ function clearActiveSection() {
+ setSectionBody("");
+ }
+
+ function clearLanguageOverride() {
+ preamble = DEFAULT_ENHANCE_PREAMBLE;
+ sectionBodies = { title: "", description: "", meta: "", attributes: "" };
+ unstructuredHint = false;
+ const next = { ...promptsByLang };
+ delete next[selectedLang];
+ promptsByLang = next;
+ }
+
+
async function savePrompt() {
if (!category) return;
saving = true;
error = "";
success = "";
try {
+ flushEditorToLang();
const bodyPrompts: Record = {};
for (const [k, v] of Object.entries(promptsByLang)) {
if (v.trim()) bodyPrompts[k] = v;
@@ -177,6 +287,7 @@
}
async function openAssignDialog() {
+ flushEditorToLang();
assignOpen = true;
if (allCategories.length > 0) return;
try {
@@ -193,6 +304,7 @@
error = "";
success = "";
try {
+ flushEditorToLang();
const bodyPrompts: Record = {};
for (const [k, v] of Object.entries(promptsByLang)) {
if (v.trim()) bodyPrompts[k] = v;
@@ -225,6 +337,10 @@
assignProgress = 0;
}
}
+
+ function sectionFilled(id: EnhancePromptSectionId): boolean {
+ return Boolean((sectionBodies[id] ?? "").trim());
+ }
{:else if category}
-
+
-
+
-
+
void goto("/categories")}>
{i18n.t("common.back")}
@@ -251,12 +367,14 @@
{i18n.t("categories.aiPromptOverrides", { name: category.name ?? "" })}
-
+
void openAssignDialog()}>
{i18n.t("categories.assign")}
- void goto("/categories")}>{i18n.t("common.cancel")}
+ void goto("/categories")}
+ >{i18n.t("common.cancel")}
{saving ? i18n.t("catalog.saving") : i18n.t("catalog.saveChanges")}
@@ -264,61 +382,168 @@
-
-
- {i18n.t("categories.promptTemplate")}
-
- {i18n.t("categories.promptTemplateHelp")}
-
-
-
- Boolean((promptsByLang[code] ?? "").trim())}
- />
-
- {#each PROMPT_VARS as v}
- insertVariable(v.name)}>
- {v.label}
- {"{{"}{v.name}{"}}"}
-
- {/each}
- {#if prompt.trim()}
- setPrompt("")}
- >
-
- {i18n.t("categories.clear")}
-
- {/if}
-
-
-
{i18n.t("categories.promptLabel")} ({langLabel})
-
{/if}
-
+
\ No newline at end of file
diff --git a/apps/web/src/routes/settings/+page.svelte b/apps/web/src/routes/settings/+page.svelte
index f051f77..5ca7513 100644
--- a/apps/web/src/routes/settings/+page.svelte
+++ b/apps/web/src/routes/settings/+page.svelte
@@ -185,6 +185,7 @@
let apiKeys = $state([]);
let pendingInvites = $state([]);
let canAdmin = $state(false);
+ let canOwner = $state(false);
let accessDenied = $state(false);
let teamForbidden = $state(false);
let apiKeysForbidden = $state(false);
@@ -261,6 +262,7 @@
if (ac.signal.aborted) return;
authSession.setMe(me);
canAdmin = canManageCompany(me);
+ canOwner = Boolean(me.is_owner) || Boolean(me.staff_access?.full_admin);
user = me.user;
company = me.company ?? null;
credits = me.credits ?? null;
@@ -573,6 +575,7 @@
id: string;
email: string;
token?: string;
+ accept_url?: string;
mail_sent?: boolean;
smtp_enabled?: boolean;
}>("/api/team/invites", {
@@ -591,7 +594,7 @@
mail_sent: Boolean(created.mail_sent)
});
if (created.token) {
- inviteAcceptLink = `${window.location.origin}/accept-invite?token=${encodeURIComponent(created.token)}`;
+ inviteAcceptLink = created.accept_url?.trim() || `${window.location.origin}/accept-invite?token=${encodeURIComponent(created.token)}`;
inviteOpen = false;
success = i18n.t("settings.inviteCreatedNoMail", { email: emailed, role: roleName });
} else {
@@ -727,6 +730,35 @@
}
}
+
+ async function transferOwnership(member: TeamMember) {
+ const userId = member.user_id ?? member.id;
+ if (!userId) return;
+ if (!confirm(i18n.t("settings.transferOwnershipConfirm", { email: member.email }))) {
+ return;
+ }
+ saving = true;
+ clearFormFeedback();
+ try {
+ await api("/api/team/transfer-ownership", {
+ method: "POST",
+ body: { user_id: userId }
+ });
+ team = team.map((m) => ({
+ ...m,
+ is_owner: (m.user_id ?? m.id) === userId,
+ role: (m.user_id ?? m.id) === userId ? "admin" : m.role
+ }));
+ canOwner = Boolean(user && user.id === userId);
+ success = i18n.t("settings.ownershipTransferred", { email: member.email });
+ notifySuccess(success);
+ } catch (err) {
+ error = applyApiFormError(err, i18n.t("settings.transferFailed"), "transfer ownership");
+ } finally {
+ saving = false;
+ }
+ }
+
async function copyText(text: string, okMessage = i18n.t("common.copied")) {
try {
await navigator.clipboard.writeText(text);
@@ -1528,7 +1560,14 @@
{#each team as member}
{member.email}
- {roleLabel(member.role)}
+
+
+ {roleLabel(member.role)}
+ {#if member.is_owner}
+ {i18n.t("settings.ownerBadge")}
+ {/if}
+
+
{i18n.t("common.active")}
@@ -1581,9 +1620,18 @@
{i18n.t("settings.makeAdmin")}
{/if}
+ {#if canOwner && !member.is_owner}
+ transferOwnership(member)}
+ >
+ {i18n.t("settings.transferOwnership")}
+
+ {/if}
removeMember(member)}
>
{i18n.t("settings.removeMember")}