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