@contractspec/lib.content-gen 3.7.5 → 3.7.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +63 -32
  2. package/dist/browser/generators/blog.js +132 -132
  3. package/dist/browser/generators/email.js +132 -132
  4. package/dist/browser/generators/index.js +132 -132
  5. package/dist/browser/generators/landing-page.js +132 -132
  6. package/dist/browser/generators/social.js +132 -132
  7. package/dist/browser/i18n/catalogs/index.js +112 -112
  8. package/dist/browser/i18n/index.js +132 -132
  9. package/dist/browser/i18n/locale.js +2 -2
  10. package/dist/browser/i18n/messages.js +112 -112
  11. package/dist/browser/index.js +132 -132
  12. package/dist/browser/seo/index.js +132 -132
  13. package/dist/browser/seo/optimizer.js +132 -132
  14. package/dist/generators/blog.js +132 -132
  15. package/dist/generators/email.js +132 -132
  16. package/dist/generators/index.d.ts +1 -1
  17. package/dist/generators/index.js +132 -132
  18. package/dist/generators/landing-page.d.ts +1 -1
  19. package/dist/generators/landing-page.js +132 -132
  20. package/dist/generators/social.js +132 -132
  21. package/dist/i18n/catalogs/index.d.ts +1 -1
  22. package/dist/i18n/catalogs/index.js +112 -112
  23. package/dist/i18n/index.d.ts +7 -7
  24. package/dist/i18n/index.js +132 -132
  25. package/dist/i18n/locale.d.ts +1 -1
  26. package/dist/i18n/locale.js +2 -2
  27. package/dist/i18n/messages.js +112 -112
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.js +132 -132
  30. package/dist/node/generators/blog.js +132 -132
  31. package/dist/node/generators/email.js +132 -132
  32. package/dist/node/generators/index.js +132 -132
  33. package/dist/node/generators/landing-page.js +132 -132
  34. package/dist/node/generators/social.js +132 -132
  35. package/dist/node/i18n/catalogs/index.js +112 -112
  36. package/dist/node/i18n/index.js +132 -132
  37. package/dist/node/i18n/locale.js +2 -2
  38. package/dist/node/i18n/messages.js +112 -112
  39. package/dist/node/index.js +132 -132
  40. package/dist/node/seo/index.js +132 -132
  41. package/dist/node/seo/optimizer.js +132 -132
  42. package/dist/seo/index.js +132 -132
  43. package/dist/seo/optimizer.d.ts +1 -1
  44. package/dist/seo/optimizer.js +132 -132
  45. package/dist/types.d.ts +1 -1
  46. package/package.json +8 -8
@@ -272,38 +272,38 @@ var enMessages = defineTranslation({
272
272
  }
273
273
  });
274
274
 
275
- // src/i18n/catalogs/fr.ts
275
+ // src/i18n/catalogs/es.ts
276
276
  import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts-spec/translations";
277
- var frMessages = defineTranslation2({
277
+ var esMessages = defineTranslation2({
278
278
  meta: {
279
279
  key: "content-gen.messages",
280
280
  version: "1.0.0",
281
281
  domain: "content-gen",
282
- description: "French translations for the content-gen package",
282
+ description: "Spanish translations for the content-gen package",
283
283
  owners: ["platform"],
284
284
  stability: "experimental"
285
285
  },
286
- locale: "fr",
286
+ locale: "es",
287
287
  fallback: "en",
288
288
  messages: {
289
289
  "prompt.blog.system": {
290
- value: "Vous êtes un rédacteur marketing produit. Produisez du JSON avec title, subtitle, intro, sections[].heading/body/bullets, outro.",
290
+ value: "Eres un redactor de marketing de producto. Produce JSON con title, subtitle, intro, sections[].heading/body/bullets, outro.",
291
291
  description: "Blog generator LLM system prompt"
292
292
  },
293
293
  "prompt.email.system": {
294
- value: "Rédigez un e-mail marketing produit en JSON {subject, previewText, body, cta}.",
294
+ value: "Redacta un correo de marketing de producto en JSON {subject, previewText, body, cta}.",
295
295
  description: "Email generator LLM system prompt"
296
296
  },
297
297
  "prompt.landing.system": {
298
- value: "Écrivez du JSON pour une page d'atterrissage avec hero/highlights/socialProof/faq.",
298
+ value: "Escribe JSON para una página de aterrizaje con hero/highlights/socialProof/faq.",
299
299
  description: "Landing page generator LLM system prompt"
300
300
  },
301
301
  "prompt.social.system": {
302
- value: "Créez un tableau JSON de posts sociaux pour twitter/linkedin/threads avec body, hashtags, cta.",
302
+ value: "Crea un array JSON de publicaciones sociales para twitter/linkedin/threads con body, hashtags, cta.",
303
303
  description: "Social post generator LLM system prompt"
304
304
  },
305
305
  "blog.intro": {
306
- value: "Les équipes comme {role} font face à {problems}. {title} change la donne grâce à {summary}.",
306
+ value: "Equipos como {role} enfrentan {problems}. {title} cambia eso gracias a {summary}.",
307
307
  description: "Blog post intro paragraph template",
308
308
  placeholders: [
309
309
  { name: "role", type: "string" },
@@ -313,39 +313,39 @@ var frMessages = defineTranslation2({
313
313
  ]
314
314
  },
315
315
  "blog.heading.whyNow": {
316
- value: "Pourquoi maintenant",
316
+ value: "Por qué ahora",
317
317
  description: "Blog section heading: why now"
318
318
  },
319
319
  "blog.heading.whatYouGet": {
320
- value: "Ce que vous obtenez",
320
+ value: "Lo que obtienes",
321
321
  description: "Blog section heading: what you get"
322
322
  },
323
323
  "blog.heading.proofItWorks": {
324
- value: "La preuve que ça marche",
324
+ value: "Prueba de que funciona",
325
325
  description: "Blog section heading: proof it works"
326
326
  },
327
327
  "blog.body.whatYouGet": {
328
- value: "Une pile ciblée conçue pour l'automatisation conforme aux politiques.",
328
+ value: "Una pila enfocada construida para la automatización segura con políticas.",
329
329
  description: "Blog section body: what you get"
330
330
  },
331
331
  "blog.body.proofItWorks": {
332
- value: "Les équipes utilisant le modèle rapportent des gains mesurables.",
332
+ value: "Los equipos que usan el modelo reportan logros medibles.",
333
333
  description: "Blog section body: proof it works"
334
334
  },
335
335
  "blog.metric.launchWorkflows": {
336
- value: "Lancez des workflows en quelques minutes",
336
+ value: "Lanza flujos de trabajo en minutos",
337
337
  description: "Default metric: launch workflows"
338
338
  },
339
339
  "blog.metric.cutReviewTime": {
340
- value: "Réduisez le temps de revue de 60 %",
340
+ value: "Reduce el tiempo de revisión en un 60 %",
341
341
  description: "Default metric: cut review time"
342
342
  },
343
343
  "blog.outro.default": {
344
- value: "Prêt à voir en direct ? Lancez un bac à sable en moins de 5 minutes.",
344
+ value: "¿Listo para verlo en vivo? Lanza un sandbox en menos de 5 minutos.",
345
345
  description: "Default blog outro / call to action"
346
346
  },
347
347
  "blog.whyNow": {
348
- value: "Les équipes {audience} sont bloquées par {pains}. {title} fournit des garde-fous sans ralentir les livraisons.",
348
+ value: "Los equipos de {audience} están atascados con {pains}. {title} ofrece barreras de protección sin ralentizar las entregas.",
349
349
  description: "Blog why-now section body template",
350
350
  placeholders: [
351
351
  { name: "audience", type: "string" },
@@ -354,78 +354,78 @@ var frMessages = defineTranslation2({
354
354
  ]
355
355
  },
356
356
  "blog.audience.industry": {
357
- value: " dans le secteur {industry}",
357
+ value: " en el sector {industry}",
358
358
  description: "Audience industry suffix for blog why-now",
359
359
  placeholders: [{ name: "industry", type: "string" }]
360
360
  },
361
361
  "email.subject.announcement.launch": {
362
- value: "Lancement : {title}",
362
+ value: "Lanzamiento: {title}",
363
363
  description: "Announcement email subject variant: launch",
364
364
  placeholders: [{ name: "title", type: "string" }]
365
365
  },
366
366
  "email.subject.announcement.live": {
367
- value: "{title} est en ligne",
367
+ value: "{title} ya está disponible",
368
368
  description: "Announcement email subject variant: live",
369
369
  placeholders: [{ name: "title", type: "string" }]
370
370
  },
371
371
  "email.subject.announcement.new": {
372
- value: "Nouveau : {title}",
372
+ value: "Nuevo: {title}",
373
373
  description: "Announcement email subject variant: new",
374
374
  placeholders: [{ name: "title", type: "string" }]
375
375
  },
376
376
  "email.subject.onboarding.getStarted": {
377
- value: "Démarrez avec {title}",
377
+ value: "Empieza con {title}",
378
378
  description: "Onboarding email subject variant: get started",
379
379
  placeholders: [{ name: "title", type: "string" }]
380
380
  },
381
381
  "email.subject.onboarding.guide": {
382
- value: "Votre guide {title}",
382
+ value: "Tu guía de {title}",
383
383
  description: "Onboarding email subject variant: guide",
384
384
  placeholders: [{ name: "title", type: "string" }]
385
385
  },
386
386
  "email.subject.nurture.speeds": {
387
- value: "Comment {title} accélère les opérations",
387
+ value: "Cómo {title} acelera las operaciones",
388
388
  description: "Nurture email subject variant: speeds ops",
389
389
  placeholders: [{ name: "title", type: "string" }]
390
390
  },
391
391
  "email.subject.nurture.proof": {
392
- value: "La preuve que {title} fonctionne",
392
+ value: "Prueba de que {title} funciona",
393
393
  description: "Nurture email subject variant: proof",
394
394
  placeholders: [{ name: "title", type: "string" }]
395
395
  },
396
396
  "email.subject.fallback": {
397
- value: "Mise à jour {title}",
397
+ value: "Actualización de {title}",
398
398
  description: "Fallback email subject line",
399
399
  placeholders: [{ name: "title", type: "string" }]
400
400
  },
401
401
  "email.preview.defaultWin": {
402
- value: "livrent plus vite sans lacunes de conformité",
402
+ value: "entregan más rápido sin brechas de cumplimiento",
403
403
  description: "Default win text for email preview"
404
404
  },
405
405
  "email.preview.template": {
406
- value: "Découvrez comment les équipes {win}.",
406
+ value: "Descubre cómo los equipos {win}.",
407
407
  description: "Email preview text template",
408
408
  placeholders: [{ name: "win", type: "string" }]
409
409
  },
410
410
  "email.body.greeting": {
411
- value: "Bonjour,",
411
+ value: "Hola,",
412
412
  description: "Email body greeting"
413
413
  },
414
414
  "email.body.reasons": {
415
- value: "Les principales raisons pour lesquelles les équipes adoptent {title} :",
415
+ value: "Principales razones por las que los equipos adoptan {title}:",
416
416
  description: "Email body reasons intro",
417
417
  placeholders: [{ name: "title", type: "string" }]
418
418
  },
419
419
  "email.cta.sandbox": {
420
- value: "Lancez un bac à sable",
420
+ value: "Lanza un sandbox",
421
421
  description: "Default CTA: spin up a sandbox"
422
422
  },
423
423
  "email.cta.explore": {
424
- value: "Explorez le bac à sable",
424
+ value: "Explora el sandbox",
425
425
  description: "Default CTA: explore the sandbox"
426
426
  },
427
427
  "email.hook.announcement": {
428
- value: "{title} est en ligne. {summary}",
428
+ value: "{title} ya está disponible. {summary}",
429
429
  description: "Announcement variant hook",
430
430
  placeholders: [
431
431
  { name: "title", type: "string" },
@@ -433,78 +433,78 @@ var frMessages = defineTranslation2({
433
433
  ]
434
434
  },
435
435
  "email.hook.onboarding": {
436
- value: "Voici votre prochaine étape pour débloquer {title}.",
436
+ value: "Aquí tienes tu siguiente paso para desbloquear {title}.",
437
437
  description: "Onboarding variant hook",
438
438
  placeholders: [{ name: "title", type: "string" }]
439
439
  },
440
440
  "email.hook.nurture": {
441
- value: "Les opérateurs comme {role} demandent sans cesse comment automatiser les vérifications de conformité. Voici ce qui fonctionne.",
441
+ value: "Operadores como {role} siguen preguntando cómo automatizar las verificaciones de cumplimiento. Esto es lo que funciona.",
442
442
  description: "Nurture variant hook",
443
443
  placeholders: [{ name: "role", type: "string" }]
444
444
  },
445
445
  "landing.eyebrow.defaultIndustry": {
446
- value: "Opérations",
446
+ value: "Operaciones",
447
447
  description: "Default industry for landing page eyebrow"
448
448
  },
449
449
  "landing.eyebrow.template": {
450
- value: "Équipes {industry}",
450
+ value: "Equipos de {industry}",
451
451
  description: "Landing page eyebrow template",
452
452
  placeholders: [{ name: "industry", type: "string" }]
453
453
  },
454
454
  "landing.cta.primary": {
455
- value: "Lancer un bac à sable",
455
+ value: "Lanzar un sandbox",
456
456
  description: "Landing page primary CTA"
457
457
  },
458
458
  "landing.cta.secondary": {
459
- value: "Voir la documentation",
459
+ value: "Ver documentación",
460
460
  description: "Landing page secondary CTA"
461
461
  },
462
462
  "landing.highlight.policySafe": {
463
- value: "Conforme aux politiques par défaut",
463
+ value: "Conforme a políticas por defecto",
464
464
  description: "Landing page highlight heading 1"
465
465
  },
466
466
  "landing.highlight.autoAdapts": {
467
- value: "S'adapte automatiquement par locataire",
467
+ value: "Se adapta automáticamente por inquilino",
468
468
  description: "Landing page highlight heading 2"
469
469
  },
470
470
  "landing.highlight.launchReady": {
471
- value: "Prêt au lancement en quelques jours",
471
+ value: "Listo para lanzar en días",
472
472
  description: "Landing page highlight heading 3"
473
473
  },
474
474
  "landing.highlight.fallback": {
475
- value: "Capacité clé",
475
+ value: "Capacidad clave",
476
476
  description: "Fallback highlight heading"
477
477
  },
478
478
  "landing.socialProof.heading": {
479
- value: "Équipes utilisant ContractSpec",
479
+ value: "Equipos que usan ContractSpec",
480
480
  description: "Social proof section heading"
481
481
  },
482
482
  "landing.socialProof.defaultQuote": {
483
- value: "« Nous livrons des workflows conformes 5x plus vite tout en réduisant de moitié les tâches opérationnelles. »",
483
+ value: "« Entregamos flujos de trabajo conformes 5 veces más rápido reduciendo a la mitad las tareas operativas. »",
484
484
  description: "Default social proof quote"
485
485
  },
486
486
  "landing.faq.policiesEnforced.heading": {
487
- value: "Comment les politiques restent-elles appliquées ?",
487
+ value: "¿Cómo se mantienen las políticas aplicadas?",
488
488
  description: "FAQ heading: policies enforced"
489
489
  },
490
490
  "landing.faq.policiesEnforced.body": {
491
- value: "Tous les workflows sont compilés à partir de spécifications TypeScript et passent par des vérifications PDP avant exécution, empêchant toute logique non autorisée.",
491
+ value: "Todos los flujos se compilan desde especificaciones TypeScript y pasan verificaciones PDP antes de ejecutarse, evitando lógica no autorizada.",
492
492
  description: "FAQ body: policies enforced"
493
493
  },
494
494
  "landing.faq.existingStack.heading": {
495
- value: "Est-ce compatible avec notre pile existante ?",
495
+ value: "¿Es compatible con nuestra pila existente?",
496
496
  description: "FAQ heading: existing stack"
497
497
  },
498
498
  "landing.faq.existingStack.body": {
499
- value: "Les adaptateurs se connectent à REST, GraphQL ou MCP. Les intégrations restent agnostiques vis-à-vis des fournisseurs.",
499
+ value: "Los adaptadores se conectan a REST, GraphQL o MCP. Las integraciones son agnósticas respecto al proveedor.",
500
500
  description: "FAQ body: existing stack"
501
501
  },
502
502
  "landing.faq.compliance.heading": {
503
- value: "Qu'en est-il des exigences de conformité ?",
503
+ value: "¿Qué pasa con los requisitos de cumplimiento?",
504
504
  description: "FAQ heading: compliance requirements"
505
505
  },
506
506
  "social.cta.linkedin": {
507
- value: "Réservez une démo de 15 min",
507
+ value: "Reserva una demo de 15 min",
508
508
  description: "LinkedIn post default CTA"
509
509
  },
510
510
  "social.cta.twitter": {
@@ -512,7 +512,7 @@ var frMessages = defineTranslation2({
512
512
  description: "Twitter post default CTA"
513
513
  },
514
514
  "social.body.threads": {
515
- value: "Ops + conformité peuvent avancer vite. {title} automatise les garde-fous pour que les équipes livrent quotidiennement.",
515
+ value: "Ops + cumplimiento pueden avanzar rápido. {title} automatiza las barreras para que los equipos entreguen a diario.",
516
516
  description: "Threads post body template",
517
517
  placeholders: [{ name: "title", type: "string" }]
518
518
  },
@@ -526,7 +526,7 @@ var frMessages = defineTranslation2({
526
526
  placeholders: [{ name: "title", type: "string" }]
527
527
  },
528
528
  "seo.metaDescription": {
529
- value: "{summary} — conçu pour {role}{industry}.",
529
+ value: "{summary} — diseñado para {role}{industry}.",
530
530
  description: "SEO meta description template",
531
531
  placeholders: [
532
532
  { name: "summary", type: "string" },
@@ -535,49 +535,49 @@ var frMessages = defineTranslation2({
535
535
  ]
536
536
  },
537
537
  "seo.offer.default": {
538
- value: "Commencez à construire avec ContractSpec",
538
+ value: "Empieza a construir con ContractSpec",
539
539
  description: "Default offer description for schema markup"
540
540
  },
541
541
  "seo.audience.industry": {
542
- value: " dans le secteur {industry}",
542
+ value: " en el sector {industry}",
543
543
  description: "Audience industry suffix for SEO description",
544
544
  placeholders: [{ name: "industry", type: "string" }]
545
545
  }
546
546
  }
547
547
  });
548
548
 
549
- // src/i18n/catalogs/es.ts
549
+ // src/i18n/catalogs/fr.ts
550
550
  import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts-spec/translations";
551
- var esMessages = defineTranslation3({
551
+ var frMessages = defineTranslation3({
552
552
  meta: {
553
553
  key: "content-gen.messages",
554
554
  version: "1.0.0",
555
555
  domain: "content-gen",
556
- description: "Spanish translations for the content-gen package",
556
+ description: "French translations for the content-gen package",
557
557
  owners: ["platform"],
558
558
  stability: "experimental"
559
559
  },
560
- locale: "es",
560
+ locale: "fr",
561
561
  fallback: "en",
562
562
  messages: {
563
563
  "prompt.blog.system": {
564
- value: "Eres un redactor de marketing de producto. Produce JSON con title, subtitle, intro, sections[].heading/body/bullets, outro.",
564
+ value: "Vous êtes un rédacteur marketing produit. Produisez du JSON avec title, subtitle, intro, sections[].heading/body/bullets, outro.",
565
565
  description: "Blog generator LLM system prompt"
566
566
  },
567
567
  "prompt.email.system": {
568
- value: "Redacta un correo de marketing de producto en JSON {subject, previewText, body, cta}.",
568
+ value: "Rédigez un e-mail marketing produit en JSON {subject, previewText, body, cta}.",
569
569
  description: "Email generator LLM system prompt"
570
570
  },
571
571
  "prompt.landing.system": {
572
- value: "Escribe JSON para una página de aterrizaje con hero/highlights/socialProof/faq.",
572
+ value: "Écrivez du JSON pour une page d'atterrissage avec hero/highlights/socialProof/faq.",
573
573
  description: "Landing page generator LLM system prompt"
574
574
  },
575
575
  "prompt.social.system": {
576
- value: "Crea un array JSON de publicaciones sociales para twitter/linkedin/threads con body, hashtags, cta.",
576
+ value: "Créez un tableau JSON de posts sociaux pour twitter/linkedin/threads avec body, hashtags, cta.",
577
577
  description: "Social post generator LLM system prompt"
578
578
  },
579
579
  "blog.intro": {
580
- value: "Equipos como {role} enfrentan {problems}. {title} cambia eso gracias a {summary}.",
580
+ value: "Les équipes comme {role} font face à {problems}. {title} change la donne grâce à {summary}.",
581
581
  description: "Blog post intro paragraph template",
582
582
  placeholders: [
583
583
  { name: "role", type: "string" },
@@ -587,39 +587,39 @@ var esMessages = defineTranslation3({
587
587
  ]
588
588
  },
589
589
  "blog.heading.whyNow": {
590
- value: "Por qué ahora",
590
+ value: "Pourquoi maintenant",
591
591
  description: "Blog section heading: why now"
592
592
  },
593
593
  "blog.heading.whatYouGet": {
594
- value: "Lo que obtienes",
594
+ value: "Ce que vous obtenez",
595
595
  description: "Blog section heading: what you get"
596
596
  },
597
597
  "blog.heading.proofItWorks": {
598
- value: "Prueba de que funciona",
598
+ value: "La preuve que ça marche",
599
599
  description: "Blog section heading: proof it works"
600
600
  },
601
601
  "blog.body.whatYouGet": {
602
- value: "Una pila enfocada construida para la automatización segura con políticas.",
602
+ value: "Une pile ciblée conçue pour l'automatisation conforme aux politiques.",
603
603
  description: "Blog section body: what you get"
604
604
  },
605
605
  "blog.body.proofItWorks": {
606
- value: "Los equipos que usan el modelo reportan logros medibles.",
606
+ value: "Les équipes utilisant le modèle rapportent des gains mesurables.",
607
607
  description: "Blog section body: proof it works"
608
608
  },
609
609
  "blog.metric.launchWorkflows": {
610
- value: "Lanza flujos de trabajo en minutos",
610
+ value: "Lancez des workflows en quelques minutes",
611
611
  description: "Default metric: launch workflows"
612
612
  },
613
613
  "blog.metric.cutReviewTime": {
614
- value: "Reduce el tiempo de revisión en un 60 %",
614
+ value: "Réduisez le temps de revue de 60 %",
615
615
  description: "Default metric: cut review time"
616
616
  },
617
617
  "blog.outro.default": {
618
- value: "¿Listo para verlo en vivo? Lanza un sandbox en menos de 5 minutos.",
618
+ value: "Prêt à voir en direct ? Lancez un bac à sable en moins de 5 minutes.",
619
619
  description: "Default blog outro / call to action"
620
620
  },
621
621
  "blog.whyNow": {
622
- value: "Los equipos de {audience} están atascados con {pains}. {title} ofrece barreras de protección sin ralentizar las entregas.",
622
+ value: "Les équipes {audience} sont bloquées par {pains}. {title} fournit des garde-fous sans ralentir les livraisons.",
623
623
  description: "Blog why-now section body template",
624
624
  placeholders: [
625
625
  { name: "audience", type: "string" },
@@ -628,78 +628,78 @@ var esMessages = defineTranslation3({
628
628
  ]
629
629
  },
630
630
  "blog.audience.industry": {
631
- value: " en el sector {industry}",
631
+ value: " dans le secteur {industry}",
632
632
  description: "Audience industry suffix for blog why-now",
633
633
  placeholders: [{ name: "industry", type: "string" }]
634
634
  },
635
635
  "email.subject.announcement.launch": {
636
- value: "Lanzamiento: {title}",
636
+ value: "Lancement : {title}",
637
637
  description: "Announcement email subject variant: launch",
638
638
  placeholders: [{ name: "title", type: "string" }]
639
639
  },
640
640
  "email.subject.announcement.live": {
641
- value: "{title} ya está disponible",
641
+ value: "{title} est en ligne",
642
642
  description: "Announcement email subject variant: live",
643
643
  placeholders: [{ name: "title", type: "string" }]
644
644
  },
645
645
  "email.subject.announcement.new": {
646
- value: "Nuevo: {title}",
646
+ value: "Nouveau : {title}",
647
647
  description: "Announcement email subject variant: new",
648
648
  placeholders: [{ name: "title", type: "string" }]
649
649
  },
650
650
  "email.subject.onboarding.getStarted": {
651
- value: "Empieza con {title}",
651
+ value: "Démarrez avec {title}",
652
652
  description: "Onboarding email subject variant: get started",
653
653
  placeholders: [{ name: "title", type: "string" }]
654
654
  },
655
655
  "email.subject.onboarding.guide": {
656
- value: "Tu guía de {title}",
656
+ value: "Votre guide {title}",
657
657
  description: "Onboarding email subject variant: guide",
658
658
  placeholders: [{ name: "title", type: "string" }]
659
659
  },
660
660
  "email.subject.nurture.speeds": {
661
- value: "Cómo {title} acelera las operaciones",
661
+ value: "Comment {title} accélère les opérations",
662
662
  description: "Nurture email subject variant: speeds ops",
663
663
  placeholders: [{ name: "title", type: "string" }]
664
664
  },
665
665
  "email.subject.nurture.proof": {
666
- value: "Prueba de que {title} funciona",
666
+ value: "La preuve que {title} fonctionne",
667
667
  description: "Nurture email subject variant: proof",
668
668
  placeholders: [{ name: "title", type: "string" }]
669
669
  },
670
670
  "email.subject.fallback": {
671
- value: "Actualización de {title}",
671
+ value: "Mise à jour {title}",
672
672
  description: "Fallback email subject line",
673
673
  placeholders: [{ name: "title", type: "string" }]
674
674
  },
675
675
  "email.preview.defaultWin": {
676
- value: "entregan más rápido sin brechas de cumplimiento",
676
+ value: "livrent plus vite sans lacunes de conformité",
677
677
  description: "Default win text for email preview"
678
678
  },
679
679
  "email.preview.template": {
680
- value: "Descubre cómo los equipos {win}.",
680
+ value: "Découvrez comment les équipes {win}.",
681
681
  description: "Email preview text template",
682
682
  placeholders: [{ name: "win", type: "string" }]
683
683
  },
684
684
  "email.body.greeting": {
685
- value: "Hola,",
685
+ value: "Bonjour,",
686
686
  description: "Email body greeting"
687
687
  },
688
688
  "email.body.reasons": {
689
- value: "Principales razones por las que los equipos adoptan {title}:",
689
+ value: "Les principales raisons pour lesquelles les équipes adoptent {title} :",
690
690
  description: "Email body reasons intro",
691
691
  placeholders: [{ name: "title", type: "string" }]
692
692
  },
693
693
  "email.cta.sandbox": {
694
- value: "Lanza un sandbox",
694
+ value: "Lancez un bac à sable",
695
695
  description: "Default CTA: spin up a sandbox"
696
696
  },
697
697
  "email.cta.explore": {
698
- value: "Explora el sandbox",
698
+ value: "Explorez le bac à sable",
699
699
  description: "Default CTA: explore the sandbox"
700
700
  },
701
701
  "email.hook.announcement": {
702
- value: "{title} ya está disponible. {summary}",
702
+ value: "{title} est en ligne. {summary}",
703
703
  description: "Announcement variant hook",
704
704
  placeholders: [
705
705
  { name: "title", type: "string" },
@@ -707,78 +707,78 @@ var esMessages = defineTranslation3({
707
707
  ]
708
708
  },
709
709
  "email.hook.onboarding": {
710
- value: "Aquí tienes tu siguiente paso para desbloquear {title}.",
710
+ value: "Voici votre prochaine étape pour débloquer {title}.",
711
711
  description: "Onboarding variant hook",
712
712
  placeholders: [{ name: "title", type: "string" }]
713
713
  },
714
714
  "email.hook.nurture": {
715
- value: "Operadores como {role} siguen preguntando cómo automatizar las verificaciones de cumplimiento. Esto es lo que funciona.",
715
+ value: "Les opérateurs comme {role} demandent sans cesse comment automatiser les vérifications de conformité. Voici ce qui fonctionne.",
716
716
  description: "Nurture variant hook",
717
717
  placeholders: [{ name: "role", type: "string" }]
718
718
  },
719
719
  "landing.eyebrow.defaultIndustry": {
720
- value: "Operaciones",
720
+ value: "Opérations",
721
721
  description: "Default industry for landing page eyebrow"
722
722
  },
723
723
  "landing.eyebrow.template": {
724
- value: "Equipos de {industry}",
724
+ value: "Équipes {industry}",
725
725
  description: "Landing page eyebrow template",
726
726
  placeholders: [{ name: "industry", type: "string" }]
727
727
  },
728
728
  "landing.cta.primary": {
729
- value: "Lanzar un sandbox",
729
+ value: "Lancer un bac à sable",
730
730
  description: "Landing page primary CTA"
731
731
  },
732
732
  "landing.cta.secondary": {
733
- value: "Ver documentación",
733
+ value: "Voir la documentation",
734
734
  description: "Landing page secondary CTA"
735
735
  },
736
736
  "landing.highlight.policySafe": {
737
- value: "Conforme a políticas por defecto",
737
+ value: "Conforme aux politiques par défaut",
738
738
  description: "Landing page highlight heading 1"
739
739
  },
740
740
  "landing.highlight.autoAdapts": {
741
- value: "Se adapta automáticamente por inquilino",
741
+ value: "S'adapte automatiquement par locataire",
742
742
  description: "Landing page highlight heading 2"
743
743
  },
744
744
  "landing.highlight.launchReady": {
745
- value: "Listo para lanzar en días",
745
+ value: "Prêt au lancement en quelques jours",
746
746
  description: "Landing page highlight heading 3"
747
747
  },
748
748
  "landing.highlight.fallback": {
749
- value: "Capacidad clave",
749
+ value: "Capacité clé",
750
750
  description: "Fallback highlight heading"
751
751
  },
752
752
  "landing.socialProof.heading": {
753
- value: "Equipos que usan ContractSpec",
753
+ value: "Équipes utilisant ContractSpec",
754
754
  description: "Social proof section heading"
755
755
  },
756
756
  "landing.socialProof.defaultQuote": {
757
- value: "« Entregamos flujos de trabajo conformes 5 veces más rápido reduciendo a la mitad las tareas operativas. »",
757
+ value: "« Nous livrons des workflows conformes 5x plus vite tout en réduisant de moitié les tâches opérationnelles. »",
758
758
  description: "Default social proof quote"
759
759
  },
760
760
  "landing.faq.policiesEnforced.heading": {
761
- value: "¿Cómo se mantienen las políticas aplicadas?",
761
+ value: "Comment les politiques restent-elles appliquées ?",
762
762
  description: "FAQ heading: policies enforced"
763
763
  },
764
764
  "landing.faq.policiesEnforced.body": {
765
- value: "Todos los flujos se compilan desde especificaciones TypeScript y pasan verificaciones PDP antes de ejecutarse, evitando lógica no autorizada.",
765
+ value: "Tous les workflows sont compilés à partir de spécifications TypeScript et passent par des vérifications PDP avant exécution, empêchant toute logique non autorisée.",
766
766
  description: "FAQ body: policies enforced"
767
767
  },
768
768
  "landing.faq.existingStack.heading": {
769
- value: "¿Es compatible con nuestra pila existente?",
769
+ value: "Est-ce compatible avec notre pile existante ?",
770
770
  description: "FAQ heading: existing stack"
771
771
  },
772
772
  "landing.faq.existingStack.body": {
773
- value: "Los adaptadores se conectan a REST, GraphQL o MCP. Las integraciones son agnósticas respecto al proveedor.",
773
+ value: "Les adaptateurs se connectent à REST, GraphQL ou MCP. Les intégrations restent agnostiques vis-à-vis des fournisseurs.",
774
774
  description: "FAQ body: existing stack"
775
775
  },
776
776
  "landing.faq.compliance.heading": {
777
- value: "¿Qué pasa con los requisitos de cumplimiento?",
777
+ value: "Qu'en est-il des exigences de conformité ?",
778
778
  description: "FAQ heading: compliance requirements"
779
779
  },
780
780
  "social.cta.linkedin": {
781
- value: "Reserva una demo de 15 min",
781
+ value: "Réservez une démo de 15 min",
782
782
  description: "LinkedIn post default CTA"
783
783
  },
784
784
  "social.cta.twitter": {
@@ -786,7 +786,7 @@ var esMessages = defineTranslation3({
786
786
  description: "Twitter post default CTA"
787
787
  },
788
788
  "social.body.threads": {
789
- value: "Ops + cumplimiento pueden avanzar rápido. {title} automatiza las barreras para que los equipos entreguen a diario.",
789
+ value: "Ops + conformité peuvent avancer vite. {title} automatise les garde-fous pour que les équipes livrent quotidiennement.",
790
790
  description: "Threads post body template",
791
791
  placeholders: [{ name: "title", type: "string" }]
792
792
  },
@@ -800,7 +800,7 @@ var esMessages = defineTranslation3({
800
800
  placeholders: [{ name: "title", type: "string" }]
801
801
  },
802
802
  "seo.metaDescription": {
803
- value: "{summary} — diseñado para {role}{industry}.",
803
+ value: "{summary} — conçu pour {role}{industry}.",
804
804
  description: "SEO meta description template",
805
805
  placeholders: [
806
806
  { name: "summary", type: "string" },
@@ -809,37 +809,17 @@ var esMessages = defineTranslation3({
809
809
  ]
810
810
  },
811
811
  "seo.offer.default": {
812
- value: "Empieza a construir con ContractSpec",
812
+ value: "Commencez à construire avec ContractSpec",
813
813
  description: "Default offer description for schema markup"
814
814
  },
815
815
  "seo.audience.industry": {
816
- value: " en el sector {industry}",
816
+ value: " dans le secteur {industry}",
817
817
  description: "Audience industry suffix for SEO description",
818
818
  placeholders: [{ name: "industry", type: "string" }]
819
819
  }
820
820
  }
821
821
  });
822
822
 
823
- // src/i18n/messages.ts
824
- import {
825
- createI18nFactory
826
- } from "@contractspec/lib.contracts-spec/translations";
827
- var factory = createI18nFactory({
828
- specKey: "content-gen.messages",
829
- catalogs: [enMessages, frMessages, esMessages]
830
- });
831
- var createContentGenI18n = factory.create;
832
- var getDefaultI18n = factory.getDefault;
833
- var resetI18nRegistry = factory.resetRegistry;
834
-
835
- // src/i18n/locale.ts
836
- import {
837
- DEFAULT_LOCALE,
838
- SUPPORTED_LOCALES,
839
- resolveLocale,
840
- isSupportedLocale
841
- } from "@contractspec/lib.contracts-spec/translations";
842
-
843
823
  // src/i18n/keys.ts
844
824
  var PROMPT_KEYS = {
845
825
  "prompt.blog.system": "prompt.blog.system",
@@ -916,6 +896,26 @@ var I18N_KEYS = {
916
896
  ...SOCIAL_KEYS,
917
897
  ...SEO_KEYS
918
898
  };
899
+
900
+ // src/i18n/locale.ts
901
+ import {
902
+ DEFAULT_LOCALE,
903
+ isSupportedLocale,
904
+ resolveLocale,
905
+ SUPPORTED_LOCALES
906
+ } from "@contractspec/lib.contracts-spec/translations";
907
+
908
+ // src/i18n/messages.ts
909
+ import {
910
+ createI18nFactory
911
+ } from "@contractspec/lib.contracts-spec/translations";
912
+ var factory = createI18nFactory({
913
+ specKey: "content-gen.messages",
914
+ catalogs: [enMessages, frMessages, esMessages]
915
+ });
916
+ var createContentGenI18n = factory.create;
917
+ var getDefaultI18n = factory.getDefault;
918
+ var resetI18nRegistry = factory.resetRegistry;
919
919
  // src/seo/optimizer.ts
920
920
  class SeoOptimizer {
921
921
  i18n;