@jjlmoya/utils-creative 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +62 -62
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/bead-pattern-generator/i18n/en.ts +58 -16
- package/src/tool/bead-pattern-generator/i18n/es.ts +58 -16
- package/src/tool/bead-pattern-generator/i18n/fr.ts +58 -16
- package/src/tool/dice-roller/i18n/en.ts +74 -32
- package/src/tool/dice-roller/i18n/es.ts +74 -32
- package/src/tool/dice-roller/i18n/fr.ts +74 -32
- package/src/tool/excuse-generator/i18n/en.ts +60 -18
- package/src/tool/excuse-generator/i18n/es.ts +60 -18
- package/src/tool/excuse-generator/i18n/fr.ts +60 -18
- package/src/tool/fortune-cookie/i18n/en.ts +60 -18
- package/src/tool/fortune-cookie/i18n/es.ts +60 -18
- package/src/tool/fortune-cookie/i18n/fr.ts +60 -18
- package/src/tool/synesthesia-painter/i18n/en.ts +74 -32
- package/src/tool/synesthesia-painter/i18n/es.ts +74 -32
- package/src/tool/synesthesia-painter/i18n/fr.ts +74 -32
- package/src/tool/zalgo-generator/i18n/en.ts +58 -16
- package/src/tool/zalgo-generator/i18n/es.ts +58 -16
- package/src/tool/zalgo-generator/i18n/fr.ts +58 -16
- package/src/tools.ts +14 -1
|
@@ -1,9 +1,77 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
1
2
|
import type { DiceRollerLocaleContent } from '../index';
|
|
2
3
|
|
|
4
|
+
const slug = 'lanzador-dados';
|
|
5
|
+
const title = 'Tirador de Dados';
|
|
6
|
+
const description = 'Simulador de dados virtual con bolsa personalizable, modificadores y historial de tiradas para tus juegos de rol y tablero.';
|
|
7
|
+
|
|
8
|
+
const faq: DiceRollerLocaleContent['faq'] = [
|
|
9
|
+
{
|
|
10
|
+
question: '¿Cómo puedo simular una tirada con ventaja (D&D)?',
|
|
11
|
+
answer: 'Añade dos dados d20 a la bolsa haciendo clic dos veces en el botón d20. Al lanzar, observa los dos resultados individuales y quédate con el mayor. El total mostrado será la suma, pero puedes ver cada dado por separado en el desglose de resultados.',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: '¿Qué significa el color verde o rojo en los resultados?',
|
|
15
|
+
answer: 'Los resultados en verde indican que ese dado ha sacado su valor máximo posible (un "crítico"). Los resultados en rojo indican el valor mínimo (un "1", el peor resultado posible). Esto facilita identificar críticos y pifias de un vistazo.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
question: '¿Puedo añadir varios dados del mismo tipo?',
|
|
19
|
+
answer: 'Sí. Cada clic en un dado lo añade a la bolsa. Si haces clic tres veces en d6, la bolsa mostrará "3d6". Para reducir la cantidad, haz clic en el botón "−" que aparece junto a cada grupo de dados en la bolsa.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: '¿Los dados digitales son tan aleatorios como los físicos?',
|
|
23
|
+
answer: 'Estadísticamente, sí. Los motores JavaScript modernos usan algoritmos pseudoaleatorios (xorshift128+) con distribución uniforme de muy alta calidad. Un dado físico real puede tener pequeñas imperfecciones de fabricación que sesguen los resultados; el dado digital no tiene ese problema.',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
question: '¿Qué es el d100 y cómo se usa?',
|
|
27
|
+
answer: 'El d100 (o d%) genera un número del 1 al 100 y se usa en sistemas de juego basados en porcentajes, como Call of Cthulhu o Warhammer Fantasy Roleplay. Representa "probabilidad directa": si tu habilidad de Sigilo es 65%, necesitas sacar 65 o menos para tener éxito.',
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const howTo: DiceRollerLocaleContent['howTo'] = [
|
|
32
|
+
{ name: 'Construir la bolsa de dados', text: 'Haz clic en los botones de dado (d4, d6, d8...) para añadirlos a tu bolsa. Cada clic añade un dado del tipo seleccionado. Puedes mezclar tipos distintos en la misma tirada.' },
|
|
33
|
+
{ name: 'Ajustar el modificador', text: 'Usa los botones "+" y "−" junto al modificador para aplicar bonificaciones o penalizaciones (como el modificador de habilidad en D&D). El modificador se suma automáticamente al total.' },
|
|
34
|
+
{ name: 'Lanzar los dados', text: 'Pulsa el botón "Lanzar dados". El panel derecho muestra el total final y el desglose de cada dado individual, con los críticos (máximo) en verde y las pifias (mínimo) en rojo.' },
|
|
35
|
+
{ name: 'Consultar el historial', text: 'Cada tirada queda registrada en el historial con la expresión de dados usada, el resultado total y la hora exacta. Puedes limpiar el historial con el botón correspondiente.' },
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
39
|
+
'@context': 'https://schema.org',
|
|
40
|
+
'@type': 'FAQPage',
|
|
41
|
+
mainEntity: faq.map((item) => ({
|
|
42
|
+
'@type': 'Question',
|
|
43
|
+
name: item.question,
|
|
44
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
45
|
+
})),
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const howToSchema: WithContext<HowTo> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'HowTo',
|
|
51
|
+
name: title,
|
|
52
|
+
description,
|
|
53
|
+
step: howTo.map((step) => ({
|
|
54
|
+
'@type': 'HowToStep',
|
|
55
|
+
name: step.name,
|
|
56
|
+
text: step.text,
|
|
57
|
+
})),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
61
|
+
'@context': 'https://schema.org',
|
|
62
|
+
'@type': 'SoftwareApplication',
|
|
63
|
+
name: title,
|
|
64
|
+
description,
|
|
65
|
+
applicationCategory: 'UtilitiesApplication',
|
|
66
|
+
operatingSystem: 'Web',
|
|
67
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
68
|
+
inLanguage: 'es',
|
|
69
|
+
};
|
|
70
|
+
|
|
3
71
|
export const content: DiceRollerLocaleContent = {
|
|
4
|
-
slug
|
|
5
|
-
title
|
|
6
|
-
description
|
|
72
|
+
slug,
|
|
73
|
+
title,
|
|
74
|
+
description,
|
|
7
75
|
faqTitle: 'Preguntas Frecuentes',
|
|
8
76
|
bibliographyTitle: 'Bibliografía del Azar',
|
|
9
77
|
ui: {
|
|
@@ -61,38 +129,12 @@ export const content: DiceRollerLocaleContent = {
|
|
|
61
129
|
{ term: 'Tirada percentil', definition: 'Tirada usando dos d10 para producir un resultado del 1 al 100, usada en sistemas de habilidades basados en porcentajes.' },
|
|
62
130
|
]},
|
|
63
131
|
],
|
|
64
|
-
faq
|
|
65
|
-
{
|
|
66
|
-
question: '¿Cómo puedo simular una tirada con ventaja (D&D)?',
|
|
67
|
-
answer: 'Añade dos dados d20 a la bolsa haciendo clic dos veces en el botón d20. Al lanzar, observa los dos resultados individuales y quédate con el mayor. El total mostrado será la suma, pero puedes ver cada dado por separado en el desglose de resultados.',
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
question: '¿Qué significa el color verde o rojo en los resultados?',
|
|
71
|
-
answer: 'Los resultados en verde indican que ese dado ha sacado su valor máximo posible (un "crítico"). Los resultados en rojo indican el valor mínimo (un "1", el peor resultado posible). Esto facilita identificar críticos y pifias de un vistazo.',
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
question: '¿Puedo añadir varios dados del mismo tipo?',
|
|
75
|
-
answer: 'Sí. Cada clic en un dado lo añade a la bolsa. Si haces clic tres veces en d6, la bolsa mostrará "3d6". Para reducir la cantidad, haz clic en el botón "−" que aparece junto a cada grupo de dados en la bolsa.',
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
question: '¿Los dados digitales son tan aleatorios como los físicos?',
|
|
79
|
-
answer: 'Estadísticamente, sí. Los motores JavaScript modernos usan algoritmos pseudoaleatorios (xorshift128+) con distribución uniforme de muy alta calidad. Un dado físico real puede tener pequeñas imperfecciones de fabricación que sesguen los resultados; el dado digital no tiene ese problema.',
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
question: '¿Qué es el d100 y cómo se usa?',
|
|
83
|
-
answer: 'El d100 (o d%) genera un número del 1 al 100 y se usa en sistemas de juego basados en porcentajes, como Call of Cthulhu o Warhammer Fantasy Roleplay. Representa "probabilidad directa": si tu habilidad de Sigilo es 65%, necesitas sacar 65 o menos para tener éxito.',
|
|
84
|
-
},
|
|
85
|
-
],
|
|
132
|
+
faq,
|
|
86
133
|
bibliography: [
|
|
87
134
|
{ name: 'D&D Beyond – Reglas de mecánicas de dados', url: 'https://www.dndbeyond.com/sources/basic-rules/using-ability-scores' },
|
|
88
135
|
{ name: 'Roll20 – Virtual tabletop y sistemas de dados', url: 'https://roll20.net/' },
|
|
89
136
|
{ name: 'Pathfinder – Sistema d20 de referencia', url: 'https://paizo.com/pathfinder' },
|
|
90
137
|
],
|
|
91
|
-
howTo
|
|
92
|
-
|
|
93
|
-
{ name: 'Ajustar el modificador', text: 'Usa los botones "+" y "−" junto al modificador para aplicar bonificaciones o penalizaciones (como el modificador de habilidad en D&D). El modificador se suma automáticamente al total.' },
|
|
94
|
-
{ name: 'Lanzar los dados', text: 'Pulsa el botón "Lanzar dados". El panel derecho muestra el total final y el desglose de cada dado individual, con los críticos (máximo) en verde y las pifias (mínimo) en rojo.' },
|
|
95
|
-
{ name: 'Consultar el historial', text: 'Cada tirada queda registrada en el historial con la expresión de dados usada, el resultado total y la hora exacta. Puedes limpiar el historial con el botón correspondiente.' },
|
|
96
|
-
],
|
|
97
|
-
schemas: []
|
|
138
|
+
howTo,
|
|
139
|
+
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
98
140
|
};
|
|
@@ -1,9 +1,77 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
1
2
|
import type { DiceRollerLocaleContent } from '../index';
|
|
2
3
|
|
|
4
|
+
const slug = 'lanceur-de-des';
|
|
5
|
+
const title = 'Lanceur de Dés';
|
|
6
|
+
const description = 'Un simulateur de dés complet pour vos JdR et jeux de société. Lancez des d4, d6, d8, d10, d12, d20 et d100 avec modificateurs et historique.';
|
|
7
|
+
|
|
8
|
+
const faq: DiceRollerLocaleContent['faq'] = [
|
|
9
|
+
{
|
|
10
|
+
question: 'Comment simuler un lancer avec avantage (D&D) ?',
|
|
11
|
+
answer: 'Ajoutez deux dés d20 à votre réserve en cliquant deux fois sur le bouton d20. Lors du lancer, observez les deux résultats individuels et gardez le plus élevé. Le total affiché sera la somme, mais vous pouvez voir chaque dé séparément dans le détail du résultat.',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: 'Que signifient les couleurs verte ou rouge sur les résultats ?',
|
|
15
|
+
answer: 'Les résultats en vert indiquent que le dé a obtenu sa valeur maximale possible (un "critique"). Les résultats en rouge indiquent la valeur minimale (un "1", le pire résultat possible). Cela permet de repérer les critiques et les échecs d\'un coup d\'œil.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
question: 'Puis-je ajouter plusieurs dés du même type ?',
|
|
19
|
+
answer: 'Oui. Chaque clic sur un dé l\'ajoute à votre réserve. Si vous cliquez trois fois sur le d6, la réserve affichera "3d6". Pour réduire le nombre, cliquez sur le bouton "−" qui apparaît à côté de chaque groupe de dés.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Les dés numériques sont-ils aussi aléatoires que les physiques ?',
|
|
23
|
+
answer: 'Statistiquement, oui. Les moteurs JavaScript modernes utilisent des algorithmes pseudo-aléatoires (xorshift128+) avec une distribution uniforme de très haute qualité. Un vrai dé physique peut présenter de petites imperfections de fabrication qui biaisent les résultats ; le dé numérique n\'a pas ce problème.',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
question: 'Qu\'est-ce que le d100 et comment est-il utilisé ?',
|
|
27
|
+
answer: 'Le d100 (ou d%) génère un nombre de 1 à 100 et est utilisé dans les systèmes de jeu basés sur les pourcentages, tels que l\'Appel de Cthulhu ou Warhammer Fantasy. Il représente une "probabilité directe" : si votre compétence en Discrétion est de 65 %, vous devez obtenir 65 ou moins pour réussir.',
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const howTo: DiceRollerLocaleContent['howTo'] = [
|
|
32
|
+
{ name: 'Composer la réserve de dés', text: 'Cliquez sur les boutons des dés (d4, d6, d8...) pour les ajouter à votre réserve. Chaque clic ajoute un dé du type sélectionné. Vous pouvez mélanger différents types dans le même lancer.' },
|
|
33
|
+
{ name: 'Ajuster le modificateur', text: 'Utilisez les boutons "+" et "−" à côté du modificateur pour appliquer des bonus ou des pénalités (comme le modificateur de caractéristique dans D&D). Le modificateur est automatiquement ajouté au total.' },
|
|
34
|
+
{ name: 'Lancer les dés', text: 'Appuyez sur le bouton "Lancer les dés". Le panneau de droite affiche le total final et le détail de chaque dé individuel, avec les critiques (maximum) en vert et les échecs (minimum) en rouge.' },
|
|
35
|
+
{ name: 'Consulter l\'historique', text: 'Chaque lancer est enregistré dans l\'historique avec l\'expression de dés utilisée, le résultat total et l\'heure exacte. Vous pouvez effacer l\'historique avec le bouton correspondant.' },
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
39
|
+
'@context': 'https://schema.org',
|
|
40
|
+
'@type': 'FAQPage',
|
|
41
|
+
mainEntity: faq.map((item) => ({
|
|
42
|
+
'@type': 'Question',
|
|
43
|
+
name: item.question,
|
|
44
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
45
|
+
})),
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const howToSchema: WithContext<HowTo> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'HowTo',
|
|
51
|
+
name: title,
|
|
52
|
+
description,
|
|
53
|
+
step: howTo.map((step) => ({
|
|
54
|
+
'@type': 'HowToStep',
|
|
55
|
+
name: step.name,
|
|
56
|
+
text: step.text,
|
|
57
|
+
})),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
61
|
+
'@context': 'https://schema.org',
|
|
62
|
+
'@type': 'SoftwareApplication',
|
|
63
|
+
name: title,
|
|
64
|
+
description,
|
|
65
|
+
applicationCategory: 'UtilitiesApplication',
|
|
66
|
+
operatingSystem: 'Web',
|
|
67
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
68
|
+
inLanguage: 'fr',
|
|
69
|
+
};
|
|
70
|
+
|
|
3
71
|
export const content: DiceRollerLocaleContent = {
|
|
4
|
-
slug
|
|
5
|
-
title
|
|
6
|
-
description
|
|
72
|
+
slug,
|
|
73
|
+
title,
|
|
74
|
+
description,
|
|
7
75
|
faqTitle: 'Questions Fréquemment Posées',
|
|
8
76
|
bibliographyTitle: 'Bibliographie du Hasard',
|
|
9
77
|
ui: {
|
|
@@ -59,38 +127,12 @@ export const content: DiceRollerLocaleContent = {
|
|
|
59
127
|
{ term: 'Lancer Centile', definition: 'Un lancer utilisant deux d10 pour produire un résultat de 1 à 100, utilisé dans les systèmes basés sur les compétences où les capacités sont mesurées en pourcentages.' },
|
|
60
128
|
]},
|
|
61
129
|
],
|
|
62
|
-
faq
|
|
63
|
-
{
|
|
64
|
-
question: 'Comment simuler un lancer avec avantage (D&D) ?',
|
|
65
|
-
answer: 'Ajoutez deux dés d20 à votre réserve en cliquant deux fois sur le bouton d20. Lors du lancer, observez les deux résultats individuels et gardez le plus élevé. Le total affiché sera la somme, mais vous pouvez voir chaque dé séparément dans le détail du résultat.',
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
question: 'Que signifient les couleurs verte ou rouge sur les résultats ?',
|
|
69
|
-
answer: 'Les résultats en vert indiquent que le dé a obtenu sa valeur maximale possible (un "critique"). Les résultats en rouge indiquent la valeur minimale (un "1", le pire résultat possible). Cela permet de repérer les critiques et les échecs d\'un coup d\'œil.',
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
question: 'Puis-je ajouter plusieurs dés du même type ?',
|
|
73
|
-
answer: 'Oui. Chaque clic sur un dé l\'ajoute à votre réserve. Si vous cliquez trois fois sur le d6, la réserve affichera "3d6". Pour réduire le nombre, cliquez sur le bouton "−" qui apparaît à côté de chaque groupe de dés.',
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
question: 'Les dés numériques sont-ils aussi aléatoires que les physiques ?',
|
|
77
|
-
answer: 'Statistiquement, oui. Les moteurs JavaScript modernes utilisent des algorithmes pseudo-aléatoires (xorshift128+) avec une distribution uniforme de très haute qualité. Un vrai dé physique peut présenter de petites imperfections de fabrication qui biaisent les résultats ; le dé numérique n\'a pas ce problème.',
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
question: 'Qu\'est-ce que le d100 et comment est-il utilisé ?',
|
|
81
|
-
answer: 'Le d100 (ou d%) génère un nombre de 1 à 100 et est utilisé dans les systèmes de jeu basés sur les pourcentages, tels que l\'Appel de Cthulhu ou Warhammer Fantasy. Il représente une "probabilité directe" : si votre compétence en Discrétion est de 65 %, vous devez obtenir 65 ou moins pour réussir.',
|
|
82
|
-
},
|
|
83
|
-
],
|
|
130
|
+
faq,
|
|
84
131
|
bibliography: [
|
|
85
132
|
{ name: 'D&D Beyond – Règles des mécaniques de dés', url: 'https://www.dndbeyond.com/sources/basic-rules/using-ability-scores' },
|
|
86
133
|
{ name: 'Roll20 – Table de jeu virtuelle et systèmes de dés', url: 'https://roll20.net/' },
|
|
87
134
|
{ name: 'Pathfinder – Référence du système d20', url: 'https://paizo.com/pathfinder' },
|
|
88
135
|
],
|
|
89
|
-
howTo
|
|
90
|
-
|
|
91
|
-
{ name: 'Ajuster le modificateur', text: 'Utilisez les boutons "+" et "−" à côté du modificateur pour appliquer des bonus ou des pénalités (comme le modificateur de caractéristique dans D&D). Le modificateur est automatiquement ajouté au total.' },
|
|
92
|
-
{ name: 'Lancer les dés', text: 'Appuyez sur le bouton "Lancer les dés". Le panneau de droite affiche le total final et le détail de chaque dé individuel, avec les critiques (maximum) en vert et les échecs (minimum) en rouge.' },
|
|
93
|
-
{ name: 'Consulter l\'historique', text: 'Chaque lancer est enregistré dans l\'historique avec l\'expression de dés utilisée, le résultat total et l\'heure exacte. Vous pouvez effacer l\'historique avec le bouton correspondant.' },
|
|
94
|
-
],
|
|
95
|
-
schemas: []
|
|
136
|
+
howTo,
|
|
137
|
+
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
96
138
|
};
|
|
@@ -1,9 +1,63 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
1
2
|
import type { ExcuseGeneratorLocaleContent } from '../index';
|
|
2
3
|
|
|
4
|
+
const slug = 'excuse-generator';
|
|
5
|
+
const title = 'Excuse Generator';
|
|
6
|
+
const description = 'Semantic gambling machine to get rid of commitments with style. Generate surreal and irrefutable excuses instantly.';
|
|
7
|
+
|
|
8
|
+
const faq: ExcuseGeneratorLocaleContent['faq'] = [
|
|
9
|
+
{
|
|
10
|
+
question: 'Can this generator save my marriage?',
|
|
11
|
+
answer: 'While we are not therapists, avoiding that dinner with the in-laws using a plausible technical emergency can significantly reduce tension. Use responsibly.'
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: 'Why such surreal phrases?',
|
|
15
|
+
answer: 'The strategy is based on Cognitive Dissonance. If you say something boring it is verifiable. If you say something absurd, the surprise blocks the capacity for anger.'
|
|
16
|
+
}
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
|
|
20
|
+
{ name: 'Generate', text: 'Click the generate button to create a new excuse.' },
|
|
21
|
+
{ name: 'Copy', text: 'Click the copy button to bring the excuse to your clipboard.' }
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
25
|
+
'@context': 'https://schema.org',
|
|
26
|
+
'@type': 'FAQPage',
|
|
27
|
+
mainEntity: faq.map((item) => ({
|
|
28
|
+
'@type': 'Question',
|
|
29
|
+
name: item.question,
|
|
30
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
31
|
+
})),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const howToSchema: WithContext<HowTo> = {
|
|
35
|
+
'@context': 'https://schema.org',
|
|
36
|
+
'@type': 'HowTo',
|
|
37
|
+
name: title,
|
|
38
|
+
description,
|
|
39
|
+
step: howTo.map((step) => ({
|
|
40
|
+
'@type': 'HowToStep',
|
|
41
|
+
name: step.name,
|
|
42
|
+
text: step.text,
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
47
|
+
'@context': 'https://schema.org',
|
|
48
|
+
'@type': 'SoftwareApplication',
|
|
49
|
+
name: title,
|
|
50
|
+
description,
|
|
51
|
+
applicationCategory: 'UtilitiesApplication',
|
|
52
|
+
operatingSystem: 'Web',
|
|
53
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
54
|
+
inLanguage: 'en',
|
|
55
|
+
};
|
|
56
|
+
|
|
3
57
|
export const content: ExcuseGeneratorLocaleContent = {
|
|
4
|
-
slug
|
|
5
|
-
title
|
|
6
|
-
description
|
|
58
|
+
slug,
|
|
59
|
+
title,
|
|
60
|
+
description,
|
|
7
61
|
faqTitle: 'Frequently Asked Questions',
|
|
8
62
|
bibliographyTitle: 'Leisure Bibliography',
|
|
9
63
|
ui: {
|
|
@@ -59,22 +113,10 @@ export const content: ExcuseGeneratorLocaleContent = {
|
|
|
59
113
|
{ pro: 'Creative and humorous tone defuses tension', con: 'Not suitable for formal or professional contexts' },
|
|
60
114
|
]},
|
|
61
115
|
],
|
|
62
|
-
faq
|
|
63
|
-
{
|
|
64
|
-
question: 'Can this generator save my marriage?',
|
|
65
|
-
answer: 'While we are not therapists, avoiding that dinner with the in-laws using a plausible technical emergency can significantly reduce tension. Use responsibly.'
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
question: 'Why such surreal phrases?',
|
|
69
|
-
answer: 'The strategy is based on Cognitive Dissonance. If you say something boring it is verifiable. If you say something absurd, the surprise blocks the capacity for anger.'
|
|
70
|
-
}
|
|
71
|
-
],
|
|
116
|
+
faq,
|
|
72
117
|
bibliography: [
|
|
73
118
|
{ name: 'Procrastinator\'s Manifesto', url: 'https://example.com/manifesto' }
|
|
74
119
|
],
|
|
75
|
-
howTo
|
|
76
|
-
|
|
77
|
-
{ name: 'Copy', text: 'Click the copy button to bring the excuse to your clipboard.' }
|
|
78
|
-
],
|
|
79
|
-
schemas: []
|
|
120
|
+
howTo,
|
|
121
|
+
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
80
122
|
};
|
|
@@ -1,9 +1,63 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
1
2
|
import type { ExcuseGeneratorLocaleContent } from '../index';
|
|
2
3
|
|
|
4
|
+
const slug = 'generador-excusas';
|
|
5
|
+
const title = 'Generador de Excusas';
|
|
6
|
+
const description = 'Máquina de azar semántica para librarte de compromisos con estilo.';
|
|
7
|
+
|
|
8
|
+
const faq: ExcuseGeneratorLocaleContent['faq'] = [
|
|
9
|
+
{
|
|
10
|
+
question: '¿Puede este generador salvar mi matrimonio?',
|
|
11
|
+
answer: 'Aunque no somos terapeutas, evitar esa cena con los suegros utilizando una emergencia técnica plausible puede reducir la tensión significativamente.'
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: '¿Por qué frases tan surrealistas?',
|
|
15
|
+
answer: 'La estrategia se basa en la Disonancia Cognitiva. Si dices algo aburrido es comprobable. Si dices algo absurdo, la sorpresa bloquea la capacidad de enfado.'
|
|
16
|
+
}
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
|
|
20
|
+
{ name: 'Generar', text: 'Pulsa el botón de generar para crear una nueva excusa.' },
|
|
21
|
+
{ name: 'Copiar', text: 'Haz clic en el botón de copiar para llevar la excusa a tu portapapeles.' }
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
25
|
+
'@context': 'https://schema.org',
|
|
26
|
+
'@type': 'FAQPage',
|
|
27
|
+
mainEntity: faq.map((item) => ({
|
|
28
|
+
'@type': 'Question',
|
|
29
|
+
name: item.question,
|
|
30
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
31
|
+
})),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const howToSchema: WithContext<HowTo> = {
|
|
35
|
+
'@context': 'https://schema.org',
|
|
36
|
+
'@type': 'HowTo',
|
|
37
|
+
name: title,
|
|
38
|
+
description,
|
|
39
|
+
step: howTo.map((step) => ({
|
|
40
|
+
'@type': 'HowToStep',
|
|
41
|
+
name: step.name,
|
|
42
|
+
text: step.text,
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
47
|
+
'@context': 'https://schema.org',
|
|
48
|
+
'@type': 'SoftwareApplication',
|
|
49
|
+
name: title,
|
|
50
|
+
description,
|
|
51
|
+
applicationCategory: 'UtilitiesApplication',
|
|
52
|
+
operatingSystem: 'Web',
|
|
53
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
54
|
+
inLanguage: 'es',
|
|
55
|
+
};
|
|
56
|
+
|
|
3
57
|
export const content: ExcuseGeneratorLocaleContent = {
|
|
4
|
-
slug
|
|
5
|
-
title
|
|
6
|
-
description
|
|
58
|
+
slug,
|
|
59
|
+
title,
|
|
60
|
+
description,
|
|
7
61
|
faqTitle: 'Preguntas Frecuentes',
|
|
8
62
|
bibliographyTitle: 'Bibliografía del Ocio',
|
|
9
63
|
ui: {
|
|
@@ -63,22 +117,10 @@ export const content: ExcuseGeneratorLocaleContent = {
|
|
|
63
117
|
{ pro: 'El tono creativo y humorístico difunde la tensión', con: 'No apta para contextos formales o profesionales' },
|
|
64
118
|
]},
|
|
65
119
|
],
|
|
66
|
-
faq
|
|
67
|
-
{
|
|
68
|
-
question: '¿Puede este generador salvar mi matrimonio?',
|
|
69
|
-
answer: 'Aunque no somos terapeutas, evitar esa cena con los suegros utilizando una emergencia técnica plausible puede reducir la tensión significativamente.'
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
question: '¿Por qué frases tan surrealistas?',
|
|
73
|
-
answer: 'La estrategia se basa en la Disonancia Cognitiva. Si dices algo aburrido es comprobable. Si dices algo absurdo, la sorpresa bloquea la capacidad de enfado.'
|
|
74
|
-
}
|
|
75
|
-
],
|
|
120
|
+
faq,
|
|
76
121
|
bibliography: [
|
|
77
122
|
{ name: 'Manifesto del Procrastinador', url: 'https://example.com/manifesto' }
|
|
78
123
|
],
|
|
79
|
-
howTo
|
|
80
|
-
|
|
81
|
-
{ name: 'Copiar', text: 'Haz clic en el botón de copiar para llevar la excusa a tu portapapeles.' }
|
|
82
|
-
],
|
|
83
|
-
schemas: []
|
|
124
|
+
howTo,
|
|
125
|
+
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
84
126
|
};
|
|
@@ -1,9 +1,63 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
1
2
|
import type { ExcuseGeneratorLocaleContent } from '../index';
|
|
2
3
|
|
|
4
|
+
const slug = 'generateur-d-excuses';
|
|
5
|
+
const title = 'Générateur d\'Excuses';
|
|
6
|
+
const description = 'Une machine à sous sémantique pour vous débarrasser de vos engagements avec style. Générez des excuses surréalistes et irréfutables instantanément.';
|
|
7
|
+
|
|
8
|
+
const faq: ExcuseGeneratorLocaleContent['faq'] = [
|
|
9
|
+
{
|
|
10
|
+
question: 'Ce générateur peut-il sauver mon mariage ?',
|
|
11
|
+
answer: 'Bien que nous ne soyons pas thérapeutes, éviter ce dîner chez les beaux-parents grâce à une urgence technique plausible peut considérablement réduire les tensions. À utiliser avec parcimonie.'
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: 'Pourquoi des phrases aussi surréalistes ?',
|
|
15
|
+
answer: 'La stratégie repose sur la Dissonance Cognitive. Si vous dites quelque chose d\'ennuyeux, c\'est vérifiable. Si vous dites quelque chose d\'absurde, la surprise paralyse la capacité de colère.'
|
|
16
|
+
}
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
|
|
20
|
+
{ name: 'Générer', text: 'Cliquez sur le bouton pour créer une nouvelle excuse.' },
|
|
21
|
+
{ name: 'Copier', text: 'Cliquez sur le bouton de copie pour mettre l\'excuse dans votre presse-papiers.' }
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
25
|
+
'@context': 'https://schema.org',
|
|
26
|
+
'@type': 'FAQPage',
|
|
27
|
+
mainEntity: faq.map((item) => ({
|
|
28
|
+
'@type': 'Question',
|
|
29
|
+
name: item.question,
|
|
30
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
31
|
+
})),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const howToSchema: WithContext<HowTo> = {
|
|
35
|
+
'@context': 'https://schema.org',
|
|
36
|
+
'@type': 'HowTo',
|
|
37
|
+
name: title,
|
|
38
|
+
description,
|
|
39
|
+
step: howTo.map((step) => ({
|
|
40
|
+
'@type': 'HowToStep',
|
|
41
|
+
name: step.name,
|
|
42
|
+
text: step.text,
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
47
|
+
'@context': 'https://schema.org',
|
|
48
|
+
'@type': 'SoftwareApplication',
|
|
49
|
+
name: title,
|
|
50
|
+
description,
|
|
51
|
+
applicationCategory: 'UtilitiesApplication',
|
|
52
|
+
operatingSystem: 'Web',
|
|
53
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
54
|
+
inLanguage: 'fr',
|
|
55
|
+
};
|
|
56
|
+
|
|
3
57
|
export const content: ExcuseGeneratorLocaleContent = {
|
|
4
|
-
slug
|
|
5
|
-
title
|
|
6
|
-
description
|
|
58
|
+
slug,
|
|
59
|
+
title,
|
|
60
|
+
description,
|
|
7
61
|
faqTitle: 'Questions Fréquemment Posées',
|
|
8
62
|
bibliographyTitle: 'Bibliographie du Temps Libre',
|
|
9
63
|
ui: {
|
|
@@ -59,22 +113,10 @@ export const content: ExcuseGeneratorLocaleContent = {
|
|
|
59
113
|
{ pro: 'Le ton créatif et humoristique désamorce la tension', con: 'Inapproprié dans un contexte formel ou professionnel' },
|
|
60
114
|
]},
|
|
61
115
|
],
|
|
62
|
-
faq
|
|
63
|
-
{
|
|
64
|
-
question: 'Ce générateur peut-il sauver mon mariage ?',
|
|
65
|
-
answer: 'Bien que nous ne soyons pas thérapeutes, éviter ce dîner chez les beaux-parents grâce à une urgence technique plausible peut considérablement réduire les tensions. À utiliser avec parcimonie.'
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
question: 'Pourquoi des phrases aussi surréalistes ?',
|
|
69
|
-
answer: 'La stratégie repose sur la Dissonance Cognitive. Si vous dites quelque chose d\'ennuyeux, c\'est vérifiable. Si vous dites quelque chose d\'absurde, la surprise paralyse la capacité de colère.'
|
|
70
|
-
}
|
|
71
|
-
],
|
|
116
|
+
faq,
|
|
72
117
|
bibliography: [
|
|
73
118
|
{ name: 'Manifeste du Procrastinateur', url: 'https://example.com/manifesto' }
|
|
74
119
|
],
|
|
75
|
-
howTo
|
|
76
|
-
|
|
77
|
-
{ name: 'Copier', text: 'Cliquez sur le bouton de copie pour mettre l\'excuse dans votre presse-papiers.' }
|
|
78
|
-
],
|
|
79
|
-
schemas: []
|
|
120
|
+
howTo,
|
|
121
|
+
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
80
122
|
};
|
|
@@ -1,9 +1,63 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
1
2
|
import type { FortuneCookieLocaleContent } from '../index';
|
|
2
3
|
|
|
4
|
+
const slug = 'fortune-cookie';
|
|
5
|
+
const title = 'Fortune Cookie';
|
|
6
|
+
const description = 'Check your daily destiny and discover your lucky numbers. One fortune per day, revealed with a click.';
|
|
7
|
+
|
|
8
|
+
const faq: FortuneCookieLocaleContent['faq'] = [
|
|
9
|
+
{
|
|
10
|
+
question: 'Can I open more than one cookie per day?',
|
|
11
|
+
answer: 'Destiny only speaks once a day. We save your fortune on the device so it guides you throughout the day.'
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: 'Are the fortunes randomly generated?',
|
|
15
|
+
answer: 'Yes — a random fortune is selected each day and saved locally. Each of the 25 fortunes has an equal chance of being chosen, ensuring variety over time.'
|
|
16
|
+
}
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
const howTo: FortuneCookieLocaleContent['howTo'] = [
|
|
20
|
+
{ name: 'Break the cookie', text: 'Click repeatedly on the cookie to crack it open.' },
|
|
21
|
+
{ name: 'Read your fortune', text: 'Discover the hidden message inside and your lucky numbers for the day.' }
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
25
|
+
'@context': 'https://schema.org',
|
|
26
|
+
'@type': 'FAQPage',
|
|
27
|
+
mainEntity: faq.map((item) => ({
|
|
28
|
+
'@type': 'Question',
|
|
29
|
+
name: item.question,
|
|
30
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
31
|
+
})),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const howToSchema: WithContext<HowTo> = {
|
|
35
|
+
'@context': 'https://schema.org',
|
|
36
|
+
'@type': 'HowTo',
|
|
37
|
+
name: title,
|
|
38
|
+
description,
|
|
39
|
+
step: howTo.map((step) => ({
|
|
40
|
+
'@type': 'HowToStep',
|
|
41
|
+
name: step.name,
|
|
42
|
+
text: step.text,
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
47
|
+
'@context': 'https://schema.org',
|
|
48
|
+
'@type': 'SoftwareApplication',
|
|
49
|
+
name: title,
|
|
50
|
+
description,
|
|
51
|
+
applicationCategory: 'UtilitiesApplication',
|
|
52
|
+
operatingSystem: 'Web',
|
|
53
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
54
|
+
inLanguage: 'en',
|
|
55
|
+
};
|
|
56
|
+
|
|
3
57
|
export const content: FortuneCookieLocaleContent = {
|
|
4
|
-
slug
|
|
5
|
-
title
|
|
6
|
-
description
|
|
58
|
+
slug,
|
|
59
|
+
title,
|
|
60
|
+
description,
|
|
7
61
|
faqTitle: 'Frequently Asked Questions',
|
|
8
62
|
bibliographyTitle: 'Destiny Bibliography',
|
|
9
63
|
ui: {
|
|
@@ -64,22 +118,10 @@ export const content: FortuneCookieLocaleContent = {
|
|
|
64
118
|
{ value: '1/day', label: 'One destiny per day', icon: 'mdi:calendar-today' },
|
|
65
119
|
], columns: 4 },
|
|
66
120
|
],
|
|
67
|
-
faq
|
|
68
|
-
{
|
|
69
|
-
question: 'Can I open more than one cookie per day?',
|
|
70
|
-
answer: 'Destiny only speaks once a day. We save your fortune on the device so it guides you throughout the day.'
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
question: 'Are the fortunes randomly generated?',
|
|
74
|
-
answer: 'Yes — a random fortune is selected each day and saved locally. Each of the 25 fortunes has an equal chance of being chosen, ensuring variety over time.'
|
|
75
|
-
}
|
|
76
|
-
],
|
|
121
|
+
faq,
|
|
77
122
|
bibliography: [
|
|
78
123
|
{ name: 'History of the Fortune Cookie', url: 'https://en.wikipedia.org/wiki/Fortune_cookie' }
|
|
79
124
|
],
|
|
80
|
-
howTo
|
|
81
|
-
|
|
82
|
-
{ name: 'Read your fortune', text: 'Discover the hidden message inside and your lucky numbers for the day.' }
|
|
83
|
-
],
|
|
84
|
-
schemas: []
|
|
125
|
+
howTo,
|
|
126
|
+
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
85
127
|
};
|