@jjlmoya/utils-creative 1.26.0 → 1.27.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.
Files changed (133) hide show
  1. package/package.json +2 -2
  2. package/src/category/i18n/de.ts +2 -2
  3. package/src/category/i18n/en.ts +2 -2
  4. package/src/category/i18n/es.ts +2 -2
  5. package/src/category/i18n/fr.ts +2 -2
  6. package/src/category/i18n/id.ts +2 -2
  7. package/src/category/i18n/it.ts +2 -2
  8. package/src/category/i18n/ja.ts +2 -2
  9. package/src/category/i18n/ko.ts +2 -2
  10. package/src/category/i18n/nl.ts +2 -2
  11. package/src/category/i18n/pl.ts +2 -2
  12. package/src/category/i18n/pt.ts +2 -2
  13. package/src/category/i18n/ru.ts +2 -2
  14. package/src/category/i18n/sv.ts +2 -2
  15. package/src/category/i18n/tr.ts +2 -2
  16. package/src/category/i18n/zh.ts +2 -2
  17. package/src/category/seo.astro +1 -1
  18. package/src/components/PreviewNavSidebar.astro +1 -1
  19. package/src/components/PreviewToolbar.astro +1 -1
  20. package/src/env.d.ts +1 -1
  21. package/src/pages/index.astro +1 -1
  22. package/src/tests/bibliography_wellformed_export.test.ts +46 -0
  23. package/src/tests/category_seo_quality.test.ts +74 -0
  24. package/src/tests/faq_count.test.ts +1 -1
  25. package/src/tests/mocks/astro_mock.js +1 -1
  26. package/src/tests/no_h1_in_components.test.ts +1 -1
  27. package/src/tests/seo_parity.test.ts +2 -2
  28. package/src/tests/seo_translation_completeness.test.ts +69 -0
  29. package/src/tests/seo_wellformed_export.test.ts +65 -0
  30. package/src/tests/tool_validation.test.ts +17 -17
  31. package/src/tool/bead-pattern-generator/bibliography.astro +8 -8
  32. package/src/tool/bead-pattern-generator/i18n/de.ts +111 -111
  33. package/src/tool/bead-pattern-generator/i18n/en.ts +111 -111
  34. package/src/tool/bead-pattern-generator/i18n/es.ts +104 -104
  35. package/src/tool/bead-pattern-generator/i18n/fr.ts +111 -111
  36. package/src/tool/bead-pattern-generator/i18n/id.ts +111 -111
  37. package/src/tool/bead-pattern-generator/i18n/it.ts +111 -111
  38. package/src/tool/bead-pattern-generator/i18n/ja.ts +111 -111
  39. package/src/tool/bead-pattern-generator/i18n/ko.ts +111 -111
  40. package/src/tool/bead-pattern-generator/i18n/nl.ts +111 -111
  41. package/src/tool/bead-pattern-generator/i18n/pl.ts +111 -111
  42. package/src/tool/bead-pattern-generator/i18n/pt.ts +111 -111
  43. package/src/tool/bead-pattern-generator/i18n/ru.ts +111 -111
  44. package/src/tool/bead-pattern-generator/i18n/sv.ts +111 -111
  45. package/src/tool/bead-pattern-generator/i18n/tr.ts +111 -111
  46. package/src/tool/bead-pattern-generator/i18n/zh.ts +111 -111
  47. package/src/tool/bead-pattern-generator/seo.astro +19 -19
  48. package/src/tool/dice-roller/bibliography.astro +8 -8
  49. package/src/tool/dice-roller/i18n/de.ts +134 -134
  50. package/src/tool/dice-roller/i18n/en.ts +134 -134
  51. package/src/tool/dice-roller/i18n/es.ts +125 -125
  52. package/src/tool/dice-roller/i18n/fr.ts +134 -134
  53. package/src/tool/dice-roller/i18n/id.ts +134 -134
  54. package/src/tool/dice-roller/i18n/it.ts +134 -134
  55. package/src/tool/dice-roller/i18n/ja.ts +134 -134
  56. package/src/tool/dice-roller/i18n/ko.ts +134 -134
  57. package/src/tool/dice-roller/i18n/nl.ts +134 -134
  58. package/src/tool/dice-roller/i18n/pl.ts +134 -134
  59. package/src/tool/dice-roller/i18n/pt.ts +134 -134
  60. package/src/tool/dice-roller/i18n/ru.ts +134 -134
  61. package/src/tool/dice-roller/i18n/sv.ts +134 -134
  62. package/src/tool/dice-roller/i18n/tr.ts +134 -134
  63. package/src/tool/dice-roller/i18n/zh.ts +134 -134
  64. package/src/tool/dice-roller/seo.astro +15 -15
  65. package/src/tool/excuse-generator/bibliography.astro +8 -8
  66. package/src/tool/excuse-generator/i18n/de.ts +120 -120
  67. package/src/tool/excuse-generator/i18n/en.ts +120 -120
  68. package/src/tool/excuse-generator/i18n/es.ts +118 -118
  69. package/src/tool/excuse-generator/i18n/fr.ts +120 -120
  70. package/src/tool/excuse-generator/i18n/id.ts +120 -120
  71. package/src/tool/excuse-generator/i18n/it.ts +120 -120
  72. package/src/tool/excuse-generator/i18n/ja.ts +120 -120
  73. package/src/tool/excuse-generator/i18n/ko.ts +120 -120
  74. package/src/tool/excuse-generator/i18n/nl.ts +120 -120
  75. package/src/tool/excuse-generator/i18n/pl.ts +120 -120
  76. package/src/tool/excuse-generator/i18n/pt.ts +120 -120
  77. package/src/tool/excuse-generator/i18n/ru.ts +120 -120
  78. package/src/tool/excuse-generator/i18n/sv.ts +120 -120
  79. package/src/tool/excuse-generator/i18n/tr.ts +120 -120
  80. package/src/tool/excuse-generator/i18n/zh.ts +120 -120
  81. package/src/tool/excuse-generator/seo.astro +15 -15
  82. package/src/tool/fortune-cookie/bibliography.astro +8 -8
  83. package/src/tool/fortune-cookie/i18n/de.ts +124 -124
  84. package/src/tool/fortune-cookie/i18n/en.ts +124 -124
  85. package/src/tool/fortune-cookie/i18n/es.ts +125 -125
  86. package/src/tool/fortune-cookie/i18n/fr.ts +124 -124
  87. package/src/tool/fortune-cookie/i18n/id.ts +124 -124
  88. package/src/tool/fortune-cookie/i18n/it.ts +124 -124
  89. package/src/tool/fortune-cookie/i18n/ja.ts +124 -124
  90. package/src/tool/fortune-cookie/i18n/ko.ts +124 -124
  91. package/src/tool/fortune-cookie/i18n/nl.ts +124 -124
  92. package/src/tool/fortune-cookie/i18n/pl.ts +124 -124
  93. package/src/tool/fortune-cookie/i18n/pt.ts +124 -124
  94. package/src/tool/fortune-cookie/i18n/ru.ts +124 -124
  95. package/src/tool/fortune-cookie/i18n/sv.ts +124 -124
  96. package/src/tool/fortune-cookie/i18n/tr.ts +124 -124
  97. package/src/tool/fortune-cookie/i18n/zh.ts +124 -124
  98. package/src/tool/fortune-cookie/seo.astro +15 -15
  99. package/src/tool/synesthesia-painter/bibliography.astro +8 -8
  100. package/src/tool/synesthesia-painter/i18n/de.ts +118 -118
  101. package/src/tool/synesthesia-painter/i18n/en.ts +118 -118
  102. package/src/tool/synesthesia-painter/i18n/es.ts +110 -110
  103. package/src/tool/synesthesia-painter/i18n/fr.ts +118 -118
  104. package/src/tool/synesthesia-painter/i18n/id.ts +118 -118
  105. package/src/tool/synesthesia-painter/i18n/it.ts +118 -118
  106. package/src/tool/synesthesia-painter/i18n/ja.ts +118 -118
  107. package/src/tool/synesthesia-painter/i18n/ko.ts +118 -118
  108. package/src/tool/synesthesia-painter/i18n/nl.ts +118 -118
  109. package/src/tool/synesthesia-painter/i18n/pl.ts +118 -118
  110. package/src/tool/synesthesia-painter/i18n/pt.ts +118 -118
  111. package/src/tool/synesthesia-painter/i18n/ru.ts +118 -118
  112. package/src/tool/synesthesia-painter/i18n/sv.ts +118 -118
  113. package/src/tool/synesthesia-painter/i18n/tr.ts +118 -118
  114. package/src/tool/synesthesia-painter/i18n/zh.ts +118 -118
  115. package/src/tool/synesthesia-painter/seo.astro +15 -15
  116. package/src/tool/zalgo-generator/bibliography.astro +8 -8
  117. package/src/tool/zalgo-generator/i18n/de.ts +109 -109
  118. package/src/tool/zalgo-generator/i18n/en.ts +109 -109
  119. package/src/tool/zalgo-generator/i18n/es.ts +109 -109
  120. package/src/tool/zalgo-generator/i18n/fr.ts +109 -109
  121. package/src/tool/zalgo-generator/i18n/id.ts +109 -109
  122. package/src/tool/zalgo-generator/i18n/it.ts +109 -109
  123. package/src/tool/zalgo-generator/i18n/ja.ts +109 -109
  124. package/src/tool/zalgo-generator/i18n/ko.ts +109 -109
  125. package/src/tool/zalgo-generator/i18n/nl.ts +109 -109
  126. package/src/tool/zalgo-generator/i18n/pl.ts +109 -109
  127. package/src/tool/zalgo-generator/i18n/pt.ts +109 -109
  128. package/src/tool/zalgo-generator/i18n/ru.ts +109 -109
  129. package/src/tool/zalgo-generator/i18n/sv.ts +109 -109
  130. package/src/tool/zalgo-generator/i18n/tr.ts +109 -109
  131. package/src/tool/zalgo-generator/i18n/zh.ts +109 -109
  132. package/src/tool/zalgo-generator/seo.astro +15 -15
  133. package/src/types.ts +1 -1
@@ -1,120 +1,120 @@
1
- import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
- import { bibliography } from '../bibliography';
3
- import type { ExcuseGeneratorLocaleContent } from '../index';
4
-
5
- const slug = 'ursaktsgenerator';
6
- const title = 'Ursaktsgenerator';
7
- const description = 'Semantisk slumpmaskin för att slippa åtaganden med stil. Generera surrealistiska och oemotsägliga ursäkter omedelbart.';
8
-
9
- const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
- {
11
- question: 'Kan den här generatorn rädda mitt äktenskap?',
12
- answer: 'Även om vi inte är terapeuter, kan undvikandet av den där middagen med svärföräldrarna genom en rimlig teknisk nödsituation minska spänningen avsevärt. Använd med ansvar.'
13
- },
14
- {
15
- question: 'Varför sådana surrealistiska fraser?',
16
- answer: 'Strategin bygger på kognitiv dissonans. Om du säger något tråkigt är det verifierbart. Om du säger något absurt, blockerar överraskningen förmågan till vrede.'
17
- }
18
- ];
19
-
20
- const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
- { name: 'Generera', text: 'Klicka på generera-knappen för att skapa en ny ursäkt.' },
22
- { name: 'Kopiera', text: 'Klicka på kopiera-knappen för att föra över ursäkten till ditt urklipp.' }
23
- ];
24
-
25
- const faqSchema: WithContext<FAQPage> = {
26
- '@context': 'https://schema.org',
27
- '@type': 'FAQPage',
28
- mainEntity: faq.map((item) => ({
29
- '@type': 'Question',
30
- name: item.question,
31
- acceptedAnswer: { '@type': 'Answer', text: item.answer },
32
- })),
33
- };
34
-
35
- const howToSchema: WithContext<HowTo> = {
36
- '@context': 'https://schema.org',
37
- '@type': 'HowTo',
38
- name: title,
39
- description,
40
- step: howTo.map((step) => ({
41
- '@type': 'HowToStep',
42
- name: step.name,
43
- text: step.text,
44
- })),
45
- };
46
-
47
- const appSchema: WithContext<SoftwareApplication> = {
48
- '@context': 'https://schema.org',
49
- '@type': 'SoftwareApplication',
50
- name: title,
51
- description,
52
- applicationCategory: 'UtilitiesApplication',
53
- operatingSystem: 'Web',
54
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
55
- inLanguage: 'sv',
56
- };
57
-
58
- export const content: ExcuseGeneratorLocaleContent = {
59
- slug,
60
- title,
61
- description,
62
- faqTitle: 'Vanliga frågor',
63
- ui: {
64
- title: 'Surrealistisk Ursaktsgenerator',
65
- description: 'Nästa generations alibi-kalkylator.',
66
- subjectLabel: 'Subjekt',
67
- actionLabel: 'Handling',
68
- victimLabel: 'Offer',
69
- generateBtn: 'GENERERA URSAKT',
70
- copyBtn: 'Kopiera denna galenskap',
71
- copied: 'Kopierad!',
72
- starts: JSON.stringify([
73
- "Min katt", "Min mormor", "Presidenten", "En utomjording", "Min granne från 5:e våningen",
74
- "Wifi", "Mitt horoskop", "En tidsresenär", "Tvättmaskinen", "Mitt kylskåp",
75
- "Jultomten", "Min skugga", "En ninja", "Veganpolisen", "Siri",
76
- "Min köttätande växt", "Amazon-budet", "Min onda klon", "En trollkarl", "Godzilla"
77
- ]),
78
- middles: JSON.stringify([
79
- "har förklarat krig mot", "har ätit upp", "har kidnappat", "har satt eld på",
80
- "anordnar en fest i", "har kräkts på", "vägrar lämna",
81
- "har hackat", "har stulit", "har blivit kär i", "mediterar över",
82
- "har förtrollat", "protesterar mot", "har grundat en kult i",
83
- "dansar samba i", "har frammanat en demon i", "har blockerat åtkomst till",
84
- "har förvandlats till guld", "försöker sälja", "har skrivit en bok om"
85
- ]),
86
- ends: JSON.stringify([
87
- "mina hemnycklar.", "min livslust.", "garageporten.",
88
- "mina favoritbyxor.", "routern i vardagsrummet.", "mina enda skor.",
89
- "fysikens lagar.", "min värdighet.", "byggnadens hiss.",
90
- "mitt Netflix-konto.", "min tandborste.", "mina lagfarter.",
91
- "min samling av pogs.", "bilens handbroms.", "min lust att socialisera.",
92
- "mitt kaffeförråd.", "toalettlocket.", "TV-fjärrkontrollen.",
93
- "mina lyckostrumpor.", "den västerländska civilisationen."
94
- ]),
95
- faqTitle: 'FAQ',
96
- bibliographyTitle: 'Referenser'
97
- },
98
- seo: [
99
- { type: 'title', text: 'Den vetenskapliga konsten att skapa den perfekta ursäkten', level: 2 },
100
- { type: 'paragraph', html: 'Vi lever i en era av hyperuppkoppling. Din telefon vibrerar, din klocka ger dig notiser, och din sociala agenda ser ut som ett spel Tetris som håller på att förloras. Pressen att säga "ja" till allt har skapat en epidemi av social utmattning.' },
101
- { type: 'title', text: 'Renässansen för JOMO (Joy of Missing Out)', level: 3 },
102
- { type: 'paragraph', html: 'Medan FOMO (Fear of Missing Out) dominerade det senaste decenniet, förespråkar digitala hälsoexperter nu <strong>JOMO: Glädjen i att missa saker</strong>. Det handlar inte om isolering, utan om avsiktlighet.' },
103
- { type: 'tip', title: 'Formeln för det oemotsägliga alibit', html: '<strong>Det dissocierade subjektet:</strong> Du är aldrig den skyldige. Det är "wifi", "min katt", "universum". Flytta skulden till en extern enhet.<br><strong>Den hyperboliska handlingen:</strong> Situationen måste vara tillräckligt absurd eller teknisk för att ingen ska fråga efter detaljer.<br><strong>Den fysiska blockaden:</strong> Slutresultatet måste vara binärt: antingen går jag eller så stannar jag hemma.' },
104
- { type: 'title', text: 'En kort historia om ursäkten', level: 3 },
105
- { type: 'list', items: [
106
- '<strong>Medeltiden:</strong> "Min häst har tappat en sko" (En tidlös klassiker).',
107
- '<strong>Industriella revolutionen:</strong> "Ångmaskinen blev överhettad".',
108
- '<strong>Digitala eran:</strong> "Mitt internet lade av mitt i en uppdatering".',
109
- ]},
110
- { type: 'proscons', items: [
111
- { pro: 'Lindrar omedelbart social press', con: 'Överanvändning urholkar förtroendet' },
112
- { pro: 'Skyddar din energi och dina gränser', con: 'Kan skapa skuldkänslor om den används vårdslöst' },
113
- { pro: 'Kreativ och humoristisk ton dämpar spänningen', con: 'Inte lämplig för formella eller professionella sammanhang' },
114
- ]},
115
- ],
116
- faq,
117
- bibliography,
118
- howTo,
119
- schemas: [faqSchema as any, howToSchema as any, appSchema],
120
- };
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ExcuseGeneratorLocaleContent } from '../index';
4
+
5
+ const slug = 'ursaktsgenerator';
6
+ const title = 'Ursaktsgenerator';
7
+ const description = 'Semantisk slumpmaskin för att slippa åtaganden med stil. Generera surrealistiska och oemotsägliga ursäkter omedelbart.';
8
+
9
+ const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
+ {
11
+ question: 'Kan den här generatorn rädda mitt äktenskap?',
12
+ answer: 'Även om vi inte är terapeuter, kan undvikandet av den där middagen med svärföräldrarna genom en rimlig teknisk nödsituation minska spänningen avsevärt. Använd med ansvar.'
13
+ },
14
+ {
15
+ question: 'Varför sådana surrealistiska fraser?',
16
+ answer: 'Strategin bygger på kognitiv dissonans. Om du säger något tråkigt är det verifierbart. Om du säger något absurt, blockerar överraskningen förmågan till vrede.'
17
+ }
18
+ ];
19
+
20
+ const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
+ { name: 'Generera', text: 'Klicka på generera-knappen för att skapa en ny ursäkt.' },
22
+ { name: 'Kopiera', text: 'Klicka på kopiera-knappen för att föra över ursäkten till ditt urklipp.' }
23
+ ];
24
+
25
+ const faqSchema: WithContext<FAQPage> = {
26
+ '@context': 'https://schema.org',
27
+ '@type': 'FAQPage',
28
+ mainEntity: faq.map((item) => ({
29
+ '@type': 'Question',
30
+ name: item.question,
31
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
32
+ })),
33
+ };
34
+
35
+ const howToSchema: WithContext<HowTo> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'HowTo',
38
+ name: title,
39
+ description,
40
+ step: howTo.map((step) => ({
41
+ '@type': 'HowToStep',
42
+ name: step.name,
43
+ text: step.text,
44
+ })),
45
+ };
46
+
47
+ const appSchema: WithContext<SoftwareApplication> = {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'SoftwareApplication',
50
+ name: title,
51
+ description,
52
+ applicationCategory: 'UtilitiesApplication',
53
+ operatingSystem: 'Web',
54
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
55
+ inLanguage: 'sv',
56
+ };
57
+
58
+ export const content: ExcuseGeneratorLocaleContent = {
59
+ slug,
60
+ title,
61
+ description,
62
+ faqTitle: 'Vanliga frågor',
63
+ ui: {
64
+ title: 'Surrealistisk Ursaktsgenerator',
65
+ description: 'Nästa generations alibi-kalkylator.',
66
+ subjectLabel: 'Subjekt',
67
+ actionLabel: 'Handling',
68
+ victimLabel: 'Offer',
69
+ generateBtn: 'GENERERA URSAKT',
70
+ copyBtn: 'Kopiera denna galenskap',
71
+ copied: 'Kopierad!',
72
+ starts: JSON.stringify([
73
+ "Min katt", "Min mormor", "Presidenten", "En utomjording", "Min granne från 5:e våningen",
74
+ "Wifi", "Mitt horoskop", "En tidsresenär", "Tvättmaskinen", "Mitt kylskåp",
75
+ "Jultomten", "Min skugga", "En ninja", "Veganpolisen", "Siri",
76
+ "Min köttätande växt", "Amazon-budet", "Min onda klon", "En trollkarl", "Godzilla"
77
+ ]),
78
+ middles: JSON.stringify([
79
+ "har förklarat krig mot", "har ätit upp", "har kidnappat", "har satt eld på",
80
+ "anordnar en fest i", "har kräkts på", "vägrar lämna",
81
+ "har hackat", "har stulit", "har blivit kär i", "mediterar över",
82
+ "har förtrollat", "protesterar mot", "har grundat en kult i",
83
+ "dansar samba i", "har frammanat en demon i", "har blockerat åtkomst till",
84
+ "har förvandlats till guld", "försöker sälja", "har skrivit en bok om"
85
+ ]),
86
+ ends: JSON.stringify([
87
+ "mina hemnycklar.", "min livslust.", "garageporten.",
88
+ "mina favoritbyxor.", "routern i vardagsrummet.", "mina enda skor.",
89
+ "fysikens lagar.", "min värdighet.", "byggnadens hiss.",
90
+ "mitt Netflix-konto.", "min tandborste.", "mina lagfarter.",
91
+ "min samling av pogs.", "bilens handbroms.", "min lust att socialisera.",
92
+ "mitt kaffeförråd.", "toalettlocket.", "TV-fjärrkontrollen.",
93
+ "mina lyckostrumpor.", "den västerländska civilisationen."
94
+ ]),
95
+ faqTitle: 'FAQ',
96
+ bibliographyTitle: 'Referenser'
97
+ },
98
+ seo: [
99
+ { type: 'title', text: 'Den vetenskapliga konsten att skapa den perfekta ursäkten', level: 2 },
100
+ { type: 'paragraph', html: 'Vi lever i en era av hyperuppkoppling. Din telefon vibrerar, din klocka ger dig notiser, och din sociala agenda ser ut som ett spel Tetris som håller på att förloras. Pressen att säga "ja" till allt har skapat en epidemi av social utmattning.' },
101
+ { type: 'title', text: 'Renässansen för JOMO (Joy of Missing Out)', level: 3 },
102
+ { type: 'paragraph', html: 'Medan FOMO (Fear of Missing Out) dominerade det senaste decenniet, förespråkar digitala hälsoexperter nu <strong>JOMO: Glädjen i att missa saker</strong>. Det handlar inte om isolering, utan om avsiktlighet.' },
103
+ { type: 'tip', title: 'Formeln för det oemotsägliga alibit', html: '<strong>Det dissocierade subjektet:</strong> Du är aldrig den skyldige. Det är "wifi", "min katt", "universum". Flytta skulden till en extern enhet.<br><strong>Den hyperboliska handlingen:</strong> Situationen måste vara tillräckligt absurd eller teknisk för att ingen ska fråga efter detaljer.<br><strong>Den fysiska blockaden:</strong> Slutresultatet måste vara binärt: antingen går jag eller så stannar jag hemma.' },
104
+ { type: 'title', text: 'En kort historia om ursäkten', level: 3 },
105
+ { type: 'list', items: [
106
+ '<strong>Medeltiden:</strong> "Min häst har tappat en sko" (En tidlös klassiker).',
107
+ '<strong>Industriella revolutionen:</strong> "Ångmaskinen blev överhettad".',
108
+ '<strong>Digitala eran:</strong> "Mitt internet lade av mitt i en uppdatering".',
109
+ ]},
110
+ { type: 'proscons', items: [
111
+ { pro: 'Lindrar omedelbart social press', con: 'Överanvändning urholkar förtroendet' },
112
+ { pro: 'Skyddar din energi och dina gränser', con: 'Kan skapa skuldkänslor om den används vårdslöst' },
113
+ { pro: 'Kreativ och humoristisk ton dämpar spänningen', con: 'Inte lämplig för formella eller professionella sammanhang' },
114
+ ]},
115
+ ],
116
+ faq,
117
+ bibliography,
118
+ howTo,
119
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
120
+ };
@@ -1,120 +1,120 @@
1
- import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
- import { bibliography } from '../bibliography';
3
- import type { ExcuseGeneratorLocaleContent } from '../index';
4
-
5
- const slug = 'bahane-ureteci';
6
- const title = 'Bahane Üreteci';
7
- const description = 'Sorumluluklardan şık bir şekilde kurtulmak için anlamsal bir kumar makinesi. Anında gerçeküstü ve reddedilemez bahaneler üretin.';
8
-
9
- const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
- {
11
- question: 'Bu üreteç evliliğimi kurtarabilir mi?',
12
- answer: 'Terapist olmasak da, kayınvalidenizle o akşam yemeğinden makul bir teknik acil durum bahanesiyle kaçınmak gerginliği önemli ölçüde azaltabilir. Sorumlu bir şekilde kullanın.'
13
- },
14
- {
15
- question: 'Neden bu kadar gerçeküstü cümleler?',
16
- answer: 'Strateji Bilişsel Çelişki\'ye dayanmaktadır. Sıkıcı bir şey söylerseniz doğrulanabilir. Saçma bir şey söylerseniz, şaşkınlık öfkelenme yetisini engeller.'
17
- }
18
- ];
19
-
20
- const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
- { name: 'Üret', text: 'Yeni bir bahane oluşturmak için üret düğmesine tıklayın.' },
22
- { name: 'Kopyala', text: 'Bahane panonuza kopyalamak için kopyala düğmesine tıklayın.' }
23
- ];
24
-
25
- const faqSchema: WithContext<FAQPage> = {
26
- '@context': 'https://schema.org',
27
- '@type': 'FAQPage',
28
- mainEntity: faq.map((item) => ({
29
- '@type': 'Question',
30
- name: item.question,
31
- acceptedAnswer: { '@type': 'Answer', text: item.answer },
32
- })),
33
- };
34
-
35
- const howToSchema: WithContext<HowTo> = {
36
- '@context': 'https://schema.org',
37
- '@type': 'HowTo',
38
- name: title,
39
- description,
40
- step: howTo.map((step) => ({
41
- '@type': 'HowToStep',
42
- name: step.name,
43
- text: step.text,
44
- })),
45
- };
46
-
47
- const appSchema: WithContext<SoftwareApplication> = {
48
- '@context': 'https://schema.org',
49
- '@type': 'SoftwareApplication',
50
- name: title,
51
- description,
52
- applicationCategory: 'UtilitiesApplication',
53
- operatingSystem: 'Web',
54
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
55
- inLanguage: 'tr',
56
- };
57
-
58
- export const content: ExcuseGeneratorLocaleContent = {
59
- slug,
60
- title,
61
- description,
62
- faqTitle: 'Sıkça Sorulan Sorular',
63
- ui: {
64
- title: 'Gerçeküstü Bahane Üreteci',
65
- description: 'Yeni nesil alibi hesaplayıcı.',
66
- subjectLabel: 'Özne',
67
- actionLabel: 'Eylem',
68
- victimLabel: 'Kurban',
69
- generateBtn: 'BAHANE ÜRET',
70
- copyBtn: 'Bu çılgınlığı kopyala',
71
- copied: 'Kopyalandı!',
72
- starts: JSON.stringify([
73
- "Kedim", "Büyükannem", "Başkan", "Bir uzaylı", "5. kattaki komşum",
74
- "Wifi", "Burcum", "Bir zaman yolcusu", "Çamaşır makinesi", "Buzdolabım",
75
- "Noel ruhu", "Gölgem", "Bir ninja", "Vegan polisi", "Siri",
76
- "Etobur bitkim", "Amazon kuryesi", "Kötü klonum", "Bir büyücü", "Godzilla"
77
- ]),
78
- middles: JSON.stringify([
79
- "savaş ilan etti", "yedi", "kaçırdı", "ateşe verdi",
80
- "şurada bir parti düzenliyor:", "üzerine kustu", "çıkmayı reddediyor:",
81
- "hackledi", "çaldı", "şuna aşık oldu:", "üzerine meditasyon yapıyor:",
82
- "üzerine büyü yaptı", "şunu protesto ediyor:", "şurada bir tarikat kurdu:",
83
- "samba yapıyor:", "bir iblis çağırdı:", "erişimi engelledi:",
84
- "altına dönüştü", "satmaya çalışıyor", "hakkında bir kitap yazdı:"
85
- ]),
86
- ends: JSON.stringify([
87
- "evimin anahtarlarını.", "yaşama sevincimi.", "garaj kapısını.",
88
- "en sevdiğim pantolonumu.", "oturma odasındaki yönlendiriciyi.", "tek ayakkabımı.",
89
- "fizik yasalarını.", "onurumu.", "binanın asansörünü.",
90
- "Netflix hesabımı.", "diş fırçamı.", "evimin tapularını.",
91
- "taso koleksiyonumu.", "arabanın el frenini.", "sosyalleşme isteğimi.",
92
- "kahve stoklarımı.", "klozet kapağını.", "TV kumandasını.",
93
- "şanslı çoraplarımı.", "Batı medeniyetini."
94
- ]),
95
- faqTitle: 'FAQ',
96
- bibliographyTitle: 'Referanslar'
97
- },
98
- seo: [
99
- { type: 'title', text: 'Mükemmel Bahanenin Bilimsel Sanatı', level: 2 },
100
- { type: 'paragraph', html: 'Hiper-bağlantılılık çağında yaşıyoruz. Telefonunuz titriyor, saatiniz bildirim gönderiyor ve sosyal ajandanız kaybedilmek üzere olan bir Tetris oyunu gibi görünüyor. Her şeye "evet" deme baskısı bir sosyal tükenmişlik salgını yarattı.' },
101
- { type: 'title', text: 'JOMO\'nun (Joy of Missing Out) Rönesansı', level: 3 },
102
- { type: 'paragraph', html: 'Geçtiğimiz on yıla FOMO (Kaçırma Korkusu) hakim olsa da, dijital sağlık uzmanları artık <strong>JOMO: Kaçırmanın Keyfi</strong>\'ni savunuyor. Bu izolasyonla ilgili değil, niyetlilikle ilgili.' },
103
- { type: 'tip', title: 'Reddedilemez Alibi Formülü', html: '<strong>Ayrışmış Özne:</strong> Suçlu asla siz değilsiniz. Bu "wifi", "kedim", "evren". Suçu dış bir varlığa kaydırın.<br><strong>Hiperbolik Eylem:</strong> Durum, kimsenin ayrıntı sormayacağı kadar saçma veya teknik olmalıdır.<br><strong>Fiziksel Blok:</strong> Nihai sonuç ikili olmalıdır: ya giderim ya da evde kalırım.' },
104
- { type: 'title', text: 'Bahanenin Kısa Tarihi', level: 3 },
105
- { type: 'list', items: [
106
- '<strong>Orta Çağ:</strong> "Atım nalını kaybetti" (Zamansız bir klasik).',
107
- '<strong>Sanayi Devrimi:</strong> "Buhar makinesi aşırı ısındı".',
108
- '<strong>Dijital Çağ:</strong> "İnternetim tam bir güncellemenin ortasında koptu".',
109
- ]},
110
- { type: 'proscons', items: [
111
- { pro: 'Sosyal baskıyı anında hafifletir', con: 'Aşırı kullanım güveni sarsar' },
112
- { pro: 'Enerjinizi ve sınırlarınızı korur', con: 'Dikkatsizce kullanılırsa suçluluk duygusu yaratabilir' },
113
- { pro: 'Yaratıcı ve esprili ton gerginliği dağıtır', con: 'Resmi veya profesyonel bağlamlar için uygun değildir' },
114
- ]},
115
- ],
116
- faq,
117
- bibliography,
118
- howTo,
119
- schemas: [faqSchema as any, howToSchema as any, appSchema],
120
- };
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ExcuseGeneratorLocaleContent } from '../index';
4
+
5
+ const slug = 'bahane-ureteci';
6
+ const title = 'Bahane Üreteci';
7
+ const description = 'Sorumluluklardan şık bir şekilde kurtulmak için anlamsal bir kumar makinesi. Anında gerçeküstü ve reddedilemez bahaneler üretin.';
8
+
9
+ const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
+ {
11
+ question: 'Bu üreteç evliliğimi kurtarabilir mi?',
12
+ answer: 'Terapist olmasak da, kayınvalidenizle o akşam yemeğinden makul bir teknik acil durum bahanesiyle kaçınmak gerginliği önemli ölçüde azaltabilir. Sorumlu bir şekilde kullanın.'
13
+ },
14
+ {
15
+ question: 'Neden bu kadar gerçeküstü cümleler?',
16
+ answer: 'Strateji Bilişsel Çelişki\'ye dayanmaktadır. Sıkıcı bir şey söylerseniz doğrulanabilir. Saçma bir şey söylerseniz, şaşkınlık öfkelenme yetisini engeller.'
17
+ }
18
+ ];
19
+
20
+ const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
+ { name: 'Üret', text: 'Yeni bir bahane oluşturmak için üret düğmesine tıklayın.' },
22
+ { name: 'Kopyala', text: 'Bahane panonuza kopyalamak için kopyala düğmesine tıklayın.' }
23
+ ];
24
+
25
+ const faqSchema: WithContext<FAQPage> = {
26
+ '@context': 'https://schema.org',
27
+ '@type': 'FAQPage',
28
+ mainEntity: faq.map((item) => ({
29
+ '@type': 'Question',
30
+ name: item.question,
31
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
32
+ })),
33
+ };
34
+
35
+ const howToSchema: WithContext<HowTo> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'HowTo',
38
+ name: title,
39
+ description,
40
+ step: howTo.map((step) => ({
41
+ '@type': 'HowToStep',
42
+ name: step.name,
43
+ text: step.text,
44
+ })),
45
+ };
46
+
47
+ const appSchema: WithContext<SoftwareApplication> = {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'SoftwareApplication',
50
+ name: title,
51
+ description,
52
+ applicationCategory: 'UtilitiesApplication',
53
+ operatingSystem: 'Web',
54
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
55
+ inLanguage: 'tr',
56
+ };
57
+
58
+ export const content: ExcuseGeneratorLocaleContent = {
59
+ slug,
60
+ title,
61
+ description,
62
+ faqTitle: 'Sıkça Sorulan Sorular',
63
+ ui: {
64
+ title: 'Gerçeküstü Bahane Üreteci',
65
+ description: 'Yeni nesil alibi hesaplayıcı.',
66
+ subjectLabel: 'Özne',
67
+ actionLabel: 'Eylem',
68
+ victimLabel: 'Kurban',
69
+ generateBtn: 'BAHANE ÜRET',
70
+ copyBtn: 'Bu çılgınlığı kopyala',
71
+ copied: 'Kopyalandı!',
72
+ starts: JSON.stringify([
73
+ "Kedim", "Büyükannem", "Başkan", "Bir uzaylı", "5. kattaki komşum",
74
+ "Wifi", "Burcum", "Bir zaman yolcusu", "Çamaşır makinesi", "Buzdolabım",
75
+ "Noel ruhu", "Gölgem", "Bir ninja", "Vegan polisi", "Siri",
76
+ "Etobur bitkim", "Amazon kuryesi", "Kötü klonum", "Bir büyücü", "Godzilla"
77
+ ]),
78
+ middles: JSON.stringify([
79
+ "savaş ilan etti", "yedi", "kaçırdı", "ateşe verdi",
80
+ "şurada bir parti düzenliyor:", "üzerine kustu", "çıkmayı reddediyor:",
81
+ "hackledi", "çaldı", "şuna aşık oldu:", "üzerine meditasyon yapıyor:",
82
+ "üzerine büyü yaptı", "şunu protesto ediyor:", "şurada bir tarikat kurdu:",
83
+ "samba yapıyor:", "bir iblis çağırdı:", "erişimi engelledi:",
84
+ "altına dönüştü", "satmaya çalışıyor", "hakkında bir kitap yazdı:"
85
+ ]),
86
+ ends: JSON.stringify([
87
+ "evimin anahtarlarını.", "yaşama sevincimi.", "garaj kapısını.",
88
+ "en sevdiğim pantolonumu.", "oturma odasındaki yönlendiriciyi.", "tek ayakkabımı.",
89
+ "fizik yasalarını.", "onurumu.", "binanın asansörünü.",
90
+ "Netflix hesabımı.", "diş fırçamı.", "evimin tapularını.",
91
+ "taso koleksiyonumu.", "arabanın el frenini.", "sosyalleşme isteğimi.",
92
+ "kahve stoklarımı.", "klozet kapağını.", "TV kumandasını.",
93
+ "şanslı çoraplarımı.", "Batı medeniyetini."
94
+ ]),
95
+ faqTitle: 'FAQ',
96
+ bibliographyTitle: 'Referanslar'
97
+ },
98
+ seo: [
99
+ { type: 'title', text: 'Mükemmel Bahanenin Bilimsel Sanatı', level: 2 },
100
+ { type: 'paragraph', html: 'Hiper-bağlantılılık çağında yaşıyoruz. Telefonunuz titriyor, saatiniz bildirim gönderiyor ve sosyal ajandanız kaybedilmek üzere olan bir Tetris oyunu gibi görünüyor. Her şeye "evet" deme baskısı bir sosyal tükenmişlik salgını yarattı.' },
101
+ { type: 'title', text: 'JOMO\'nun (Joy of Missing Out) Rönesansı', level: 3 },
102
+ { type: 'paragraph', html: 'Geçtiğimiz on yıla FOMO (Kaçırma Korkusu) hakim olsa da, dijital sağlık uzmanları artık <strong>JOMO: Kaçırmanın Keyfi</strong>\'ni savunuyor. Bu izolasyonla ilgili değil, niyetlilikle ilgili.' },
103
+ { type: 'tip', title: 'Reddedilemez Alibi Formülü', html: '<strong>Ayrışmış Özne:</strong> Suçlu asla siz değilsiniz. Bu "wifi", "kedim", "evren". Suçu dış bir varlığa kaydırın.<br><strong>Hiperbolik Eylem:</strong> Durum, kimsenin ayrıntı sormayacağı kadar saçma veya teknik olmalıdır.<br><strong>Fiziksel Blok:</strong> Nihai sonuç ikili olmalıdır: ya giderim ya da evde kalırım.' },
104
+ { type: 'title', text: 'Bahanenin Kısa Tarihi', level: 3 },
105
+ { type: 'list', items: [
106
+ '<strong>Orta Çağ:</strong> "Atım nalını kaybetti" (Zamansız bir klasik).',
107
+ '<strong>Sanayi Devrimi:</strong> "Buhar makinesi aşırı ısındı".',
108
+ '<strong>Dijital Çağ:</strong> "İnternetim tam bir güncellemenin ortasında koptu".',
109
+ ]},
110
+ { type: 'proscons', items: [
111
+ { pro: 'Sosyal baskıyı anında hafifletir', con: 'Aşırı kullanım güveni sarsar' },
112
+ { pro: 'Enerjinizi ve sınırlarınızı korur', con: 'Dikkatsizce kullanılırsa suçluluk duygusu yaratabilir' },
113
+ { pro: 'Yaratıcı ve esprili ton gerginliği dağıtır', con: 'Resmi veya profesyonel bağlamlar için uygun değildir' },
114
+ ]},
115
+ ],
116
+ faq,
117
+ bibliography,
118
+ howTo,
119
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
120
+ };