@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 = 'excuse-generator';
6
- const title = '借口生成器';
7
- const description = '语义化的随机机器,让您有格调地摆脱承诺。瞬间生成超现实且无可辩驳的借口。';
8
-
9
- const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
- {
11
- question: '这个生成器能挽救我的婚姻吗?',
12
- answer: '虽然我们不是治疗师,但利用一个合理的\"技术故障\"来避免与姻亲的聚餐,确实能显著缓解紧张气氛。请负责任地使用。'
13
- },
14
- {
15
- question: '为什么句子这么荒诞?',
16
- answer: '策略核心是\"认知失调\"。如果你说一件平庸的事,那是可以验证的;如果你说一件荒谬的事,这种诧异感会瞬间阻断对方生气的能力。'
17
- }
18
- ];
19
-
20
- const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
- { name: '生成', text: '点击生成按钮来创建一个新的借口。' },
22
- { name: '复制', text: '点击复制按钮将生成的借口保存到剪贴板。' }
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: 'zh',
56
- };
57
-
58
- export const content: ExcuseGeneratorLocaleContent = {
59
- slug,
60
- title,
61
- description,
62
- faqTitle: '常见问题解答',
63
- ui: {
64
- title: '荒诞借口生成器',
65
- description: '下一代不在场证明计算器。',
66
- subjectLabel: '主语',
67
- actionLabel: '动作',
68
- victimLabel: '对象',
69
- generateBtn: '生成借口',
70
- copyBtn: '复制这疯狂的想法',
71
- copied: '已复制!',
72
- starts: JSON.stringify([
73
- "我家猫", "我奶奶", "总统", "外星人", "五楼的邻居",
74
- "Wifi", "我的星座运势", "一个时空旅行者", "洗衣机", "我家冰箱",
75
- "圣诞精神", "我的影子", "一个忍者", "素食警察", "Siri",
76
- "我的食肉植物", "亚马逊快递员", "我的邪恶克隆体", "一个巫师", "哥斯拉"
77
- ]),
78
- middles: JSON.stringify([
79
- "向...宣战了", "吃掉了", "绑架了", "纵火焚烧了",
80
- "正在...举办派对", "在...上面呕吐了", "拒绝离开",
81
- "黑进了", "偷走了", "爱上了", "正在对...冥想",
82
- "对...施了咒语", "正在抗议", "在...创立了教派",
83
- "在...跳桑巴舞", "在...召唤了恶魔", "封锁了去...的通道",
84
- "变成了黄金", "正试图变卖", "写了一本关于...的书"
85
- ]),
86
- ends: JSON.stringify([
87
- "我的房门钥匙。", "我的求生欲。", "车库门。",
88
- "我最喜欢的裤子。", "客厅的路由器。", "我唯一的一双鞋。",
89
- "物理定律。", "我的尊严。", "大楼的电梯。",
90
- "我的 Netflix 账号。", "我的牙刷。", "我的房产证。",
91
- "我的圆牌收藏。", "汽车手刹。", "我的社交欲望。",
92
- "我的咖啡储备。", "马桶盖。", "电视遥控器。",
93
- "我的幸运袜。", "西方文明。"
94
- ]),
95
- faqTitle: 'FAQ',
96
- bibliographyTitle: '参考资料'
97
- },
98
- seo: [
99
- { type: 'title', text: '完美借口的科学艺术', level: 2 },
100
- { type: 'paragraph', html: '我们生活在一个过度连接的时代。你的手机在震动,手表在提醒,社交日程表看起来就像一局即将败北的俄罗斯方块。对所有事情都说\"是\"的压力造成了社交疲劳的流行。' },
101
- { type: 'title', text: 'JOMO(错失的快乐)的复兴', level: 3 },
102
- { type: 'paragraph', html: '虽然 FOMO(错失恐惧症)统治了过去十年,但数字健康专家现在提倡 <strong>JOMO:错失的快乐</strong>。这关乎的不是孤立,而是有目的的选择。' },
103
- { type: 'tip', title: '无可辩驳的不在场证明公式', html: '<strong>分离主语:</strong>你永远不是罪魁祸首。它是\"Wifi\"、\"我家猫\"或\"宇宙\"。将责任推给外部实体。<br><strong>夸张的动作:</strong>情况必须足够荒诞或专业,以至于没有人会追问细节。<br><strong>物理阻断:</strong>最终结果必须是二元的:要么我去,要么我呆在家里。' },
104
- { type: 'title', text: '借口简史', level: 3 },
105
- { type: 'list', items: [
106
- '<strong>中世纪:</strong> \"我的马掉了一个马掌\"(永恒的经典)。',
107
- '<strong>工业革命:</strong> \"蒸汽机过热了\"。',
108
- '<strong>数字时代:</strong> \"我的网络在更新到一半时断了\"。'
109
- ]},
110
- { type: 'proscons', items: [
111
- { pro: '瞬间缓解社交压力', con: '过度使用会破坏信任' },
112
- { pro: '保护您的精力与边界', con: '如果使用不当可能会产生负罪感' },
113
- { pro: '创意且幽默的语调能化解紧张气氛', con: '不适合正式或职业场合' }
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 = 'excuse-generator';
6
+ const title = '借口生成器';
7
+ const description = '语义化的随机机器,让您有格调地摆脱承诺。瞬间生成超现实且无可辩驳的借口。';
8
+
9
+ const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
+ {
11
+ question: '这个生成器能挽救我的婚姻吗?',
12
+ answer: '虽然我们不是治疗师,但利用一个合理的\"技术故障\"来避免与姻亲的聚餐,确实能显著缓解紧张气氛。请负责任地使用。'
13
+ },
14
+ {
15
+ question: '为什么句子这么荒诞?',
16
+ answer: '策略核心是\"认知失调\"。如果你说一件平庸的事,那是可以验证的;如果你说一件荒谬的事,这种诧异感会瞬间阻断对方生气的能力。'
17
+ }
18
+ ];
19
+
20
+ const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
+ { name: '生成', text: '点击生成按钮来创建一个新的借口。' },
22
+ { name: '复制', text: '点击复制按钮将生成的借口保存到剪贴板。' }
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: 'zh',
56
+ };
57
+
58
+ export const content: ExcuseGeneratorLocaleContent = {
59
+ slug,
60
+ title,
61
+ description,
62
+ faqTitle: '常见问题解答',
63
+ ui: {
64
+ title: '荒诞借口生成器',
65
+ description: '下一代不在场证明计算器。',
66
+ subjectLabel: '主语',
67
+ actionLabel: '动作',
68
+ victimLabel: '对象',
69
+ generateBtn: '生成借口',
70
+ copyBtn: '复制这疯狂的想法',
71
+ copied: '已复制!',
72
+ starts: JSON.stringify([
73
+ "我家猫", "我奶奶", "总统", "外星人", "五楼的邻居",
74
+ "Wifi", "我的星座运势", "一个时空旅行者", "洗衣机", "我家冰箱",
75
+ "圣诞精神", "我的影子", "一个忍者", "素食警察", "Siri",
76
+ "我的食肉植物", "亚马逊快递员", "我的邪恶克隆体", "一个巫师", "哥斯拉"
77
+ ]),
78
+ middles: JSON.stringify([
79
+ "向...宣战了", "吃掉了", "绑架了", "纵火焚烧了",
80
+ "正在...举办派对", "在...上面呕吐了", "拒绝离开",
81
+ "黑进了", "偷走了", "爱上了", "正在对...冥想",
82
+ "对...施了咒语", "正在抗议", "在...创立了教派",
83
+ "在...跳桑巴舞", "在...召唤了恶魔", "封锁了去...的通道",
84
+ "变成了黄金", "正试图变卖", "写了一本关于...的书"
85
+ ]),
86
+ ends: JSON.stringify([
87
+ "我的房门钥匙。", "我的求生欲。", "车库门。",
88
+ "我最喜欢的裤子。", "客厅的路由器。", "我唯一的一双鞋。",
89
+ "物理定律。", "我的尊严。", "大楼的电梯。",
90
+ "我的 Netflix 账号。", "我的牙刷。", "我的房产证。",
91
+ "我的圆牌收藏。", "汽车手刹。", "我的社交欲望。",
92
+ "我的咖啡储备。", "马桶盖。", "电视遥控器。",
93
+ "我的幸运袜。", "西方文明。"
94
+ ]),
95
+ faqTitle: 'FAQ',
96
+ bibliographyTitle: '参考资料'
97
+ },
98
+ seo: [
99
+ { type: 'title', text: '完美借口的科学艺术', level: 2 },
100
+ { type: 'paragraph', html: '我们生活在一个过度连接的时代。你的手机在震动,手表在提醒,社交日程表看起来就像一局即将败北的俄罗斯方块。对所有事情都说\"是\"的压力造成了社交疲劳的流行。' },
101
+ { type: 'title', text: 'JOMO(错失的快乐)的复兴', level: 3 },
102
+ { type: 'paragraph', html: '虽然 FOMO(错失恐惧症)统治了过去十年,但数字健康专家现在提倡 <strong>JOMO:错失的快乐</strong>。这关乎的不是孤立,而是有目的的选择。' },
103
+ { type: 'tip', title: '无可辩驳的不在场证明公式', html: '<strong>分离主语:</strong>你永远不是罪魁祸首。它是\"Wifi\"、\"我家猫\"或\"宇宙\"。将责任推给外部实体。<br><strong>夸张的动作:</strong>情况必须足够荒诞或专业,以至于没有人会追问细节。<br><strong>物理阻断:</strong>最终结果必须是二元的:要么我去,要么我呆在家里。' },
104
+ { type: 'title', text: '借口简史', level: 3 },
105
+ { type: 'list', items: [
106
+ '<strong>中世纪:</strong> \"我的马掉了一个马掌\"(永恒的经典)。',
107
+ '<strong>工业革命:</strong> \"蒸汽机过热了\"。',
108
+ '<strong>数字时代:</strong> \"我的网络在更新到一半时断了\"。'
109
+ ]},
110
+ { type: 'proscons', items: [
111
+ { pro: '瞬间缓解社交压力', con: '过度使用会破坏信任' },
112
+ { pro: '保护您的精力与边界', con: '如果使用不当可能会产生负罪感' },
113
+ { pro: '创意且幽默的语调能化解紧张气氛', con: '不适合正式或职业场合' }
114
+ ]},
115
+ ],
116
+ faq,
117
+ bibliography,
118
+ howTo,
119
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
120
+ };
@@ -1,15 +1,15 @@
1
- ---
2
- import { SEORenderer } from '@jjlmoya/utils-shared';
3
- import { excuseGenerator } from './index';
4
- import type { KnownLocale } from '../../types';
5
-
6
- interface Props {
7
- locale?: KnownLocale;
8
- }
9
-
10
- const { locale = 'es' } = Astro.props;
11
- const content = await excuseGenerator.i18n[locale]?.();
12
- if (!content) return null;
13
- ---
14
-
15
- {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { excuseGenerator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await excuseGenerator.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -1,8 +1,8 @@
1
- ---
2
- import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
- import { bibliography } from './bibliography';
4
-
5
- if (!bibliography || bibliography.length === 0) return null;
6
- ---
7
-
8
- <SharedBibliography links={bibliography} />
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { bibliography } from './bibliography';
4
+
5
+ if (!bibliography || bibliography.length === 0) return null;
6
+ ---
7
+
8
+ <SharedBibliography links={bibliography} />
@@ -1,124 +1,124 @@
1
- import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
- import type { FortuneCookieLocaleContent } from '../index';
3
- import { bibliography } from '../bibliography';
4
-
5
- const slug = 'glueckskeks-online';
6
- const title = 'Glückskeks';
7
- const description = 'Prüfen Sie Ihr tägliches Schicksal und entdecken Sie Ihre Glückszahlen. Ein Keks pro Tag, enthüllt mit einem Klick.';
8
-
9
- const faq: FortuneCookieLocaleContent['faq'] = [
10
- {
11
- question: 'Kann ich mehr als einen Keks pro Tag öffnen?',
12
- answer: 'Das Schicksal spricht nur einmal am Tag. Wir speichern Ihr Ergebnis auf dem Gerät, damit es Sie durch den Tag begleitet.'
13
- },
14
- {
15
- question: 'Werden die Sprüche zufällig generiert?',
16
- answer: 'Ja - jeden Tag wird ein zufälliger Spruch ausgewählt und lokal gespeichert. Jeder der 25 Sprüche hat die gleiche Chance, ausgewählt zu werden, was für Abwechslung sorgt.'
17
- }
18
- ];
19
-
20
- const howTo: FortuneCookieLocaleContent['howTo'] = [
21
- { name: 'Keks zerbrechen', text: 'Klicken Sie wiederholt auf den Keks, um ihn aufzubrechen.' },
22
- { name: 'Botschaft lesen', text: 'Entdecken Sie die verborgene Botschaft im Inneren und Ihre heutigen Glückszahlen.' }
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: 'de',
56
- };
57
-
58
- export const content: FortuneCookieLocaleContent = {
59
- slug,
60
- title,
61
- description,
62
- faqTitle: 'Häufig gestellte Fragen',
63
- ui: {
64
- title: 'Online Glückskeks',
65
- description: 'Dein tägliches digitales Orakel.',
66
- instruction: 'Klicke auf den Keks, um dein Schicksal zu enthüllen',
67
- dailyStatus: 'Dein heutiges Schicksal wurde bereits enthüllt.',
68
- shareBtn: 'Weisheit teilen',
69
- shareTitle: 'Mein Glückskeks',
70
- shareText: 'Das Schicksal hat gesprochen: "$TEXT"\nMeine Zahlen: $NUMS\n\nEntdecke dein Schicksal hier:',
71
- copied: 'Kopiert!',
72
- fortunes: JSON.stringify([
73
- "Das Glück, das du suchst, befindet sich in einem anderen Keks.",
74
- "Zähle nicht die Tage, mache die Tage zählenswert.",
75
- "Eine Reise von tausend Meilen beginnt mit einem einzigen Schritt.",
76
- "Ein Fehler ist das Vorwort zur Entdeckung.",
77
- "Deine Lernfähigkeit ist dein größtes Kapital.",
78
- "Lächle, das Universum beobachtet dich.",
79
- "Geduld ist ein Baum mit bitterer Wurzel, aber sehr süßer Frucht.",
80
- "Fürchte dich nicht vor langsamem Wachstum, fürchte dich nur vor Stillstand.",
81
- "Heute ist das Morgen, um das du dir gestern Sorgen gemacht hast.",
82
- "Glück ist nichts Fertiges. Es entsteht durch dein eigenes Handeln.",
83
- "Wenn du die Windrichtung nicht ändern kannst, richte deine Segel neu aus.",
84
- "Was du jetzt säst, wirst du später ernten.",
85
- "Kreativität ist Intelligenz, die Spaß hat.",
86
- "Suche nicht nach Fehlern, suche nach Lösungen.",
87
- "Deine Einstellung, nicht deine Begabung, bestimmt deine Höhe.",
88
- "Erfolg ist die Summe kleiner Anstrengungen, die Tag für Tag wiederholt werden.",
89
- "Glaube daran, dass du es kannst, dann hast du schon den halben Weg geschafft.",
90
- "Der einzige Weg, großartige Arbeit zu leisten, ist zu lieben, was man tut.",
91
- "Das Leben besteht zu 10 % aus dem, was dir passiert, und zu 90 % daraus, wie du darauf reagierst.",
92
- "Sei die Veränderung, die du dir für die Welt wünschst.",
93
- "Der beste Weg, die Zukunft vorherzusagen, ist, sie selbst zu gestalten.",
94
- "Einfachheit ist die höchste Form der Raffinesse.",
95
- "Du bist der Herr deines Schicksals und der Kapitän deiner Seele.",
96
- "Bald wirst du Nachrichten erhalten, die deine Perspektive ändern werden.",
97
- "Eine unerwartete Reise wird dir große Freude bereiten."
98
- ]),
99
- faqTitle: 'FAQ',
100
- },
101
- seo: [
102
- { type: 'title', text: 'Das Geheimnis des Glückskekses', level: 2 },
103
- { type: 'paragraph', html: 'Haben Sie sich jemals gefragt, woher diese kuriosen Kekse kommen? Obwohl wir sie mit chinesischem Essen assoziieren, ist ihre Herkunft eine faszinierende Reise zwischen Japan und den Vereinigten Staaten. Der Glückskeks, wie wir ihn heute kennen, wurde wahrscheinlich Anfang des 20. Jahrhunderts in Kalifornien erfunden, nicht in China - dort sind sie praktisch unbekannt.' },
104
- { type: 'tip', title: 'So funktioniert unser Orakel', html: 'Jeden Tag können Sie einen Keks öffnen. Das System speichert Ihr Schicksal, damit Sie sich 24 Stunden lang daran erinnern können. Die Botschaft wird lokal in Ihrem Browser gespeichert - absolut privat, ohne Beteiligung eines Servers. Kommen Sie morgen für eine neue Vorhersage wieder!' },
105
- { type: 'title', text: 'Die Philosophie der Orakel', level: 3 },
106
- { type: 'paragraph', html: 'Menschen haben in unsicheren Zeiten schon immer nach Führung gesucht. Vom Orakel von Delphi bis zum I Ging erfüllen Wahrsagesysteme eine beständige psychologische Funktion: Sie geben uns die Erlaubnis, <strong>inne zu halten und zu reflektieren</strong>. Ein Glückskeks sagt nicht die Zukunft voraus - er regt dazu aus, darüber nachzudenken.' },
107
- { type: 'list', items: [
108
- '<strong>Altes China:</strong> Das I Ging (Buch der Wandlungen, ca. 1000 v. Chr.) nutzte Hexagramme, um Entscheidungen zu leiten und das Schicksal zu interpretieren.',
109
- '<strong>Klassisches Griechenland:</strong> Das Orakel von Delphi zog Herrscher und Bürger gleichermaßen mit kryptischen Aussprüchen an, die als göttliche Führung interpretiert wurden.',
110
- '<strong>Modernes Japan:</strong> Omikuji-Glückszettel an Shinto-Schreinen, die an Baumzweige gebunden werden, verbinden Schicksal mit Ritual.',
111
- '<strong>20. Jahrhundert USA:</strong> Glückskekse entstanden in japanisch-amerikanischen Gemeinschaften, bevor sie zum Synonym für die chinesisch-amerikanische Küche wurden.',
112
- ]},
113
- { type: 'stats', items: [
114
- { value: '3 Mrd.+', label: 'Glückskekse jährlich hergestellt', icon: 'mdi:cookie' },
115
- { value: '~1000 v. Chr.', label: 'Ursprung des I Ging', icon: 'mdi:book-open-variant' },
116
- { value: '25', label: 'Sprüche in diesem Orakel', icon: 'mdi:star-shooting' },
117
- { value: '1/Tag', label: 'Ein Schicksal pro Tag', icon: 'mdi:calendar-today' },
118
- ], columns: 4 },
119
- ],
120
- faq,
121
- bibliography,
122
- howTo,
123
- schemas: [faqSchema as any, howToSchema as any, appSchema],
124
- };
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { FortuneCookieLocaleContent } from '../index';
3
+ import { bibliography } from '../bibliography';
4
+
5
+ const slug = 'glueckskeks-online';
6
+ const title = 'Glückskeks';
7
+ const description = 'Prüfen Sie Ihr tägliches Schicksal und entdecken Sie Ihre Glückszahlen. Ein Keks pro Tag, enthüllt mit einem Klick.';
8
+
9
+ const faq: FortuneCookieLocaleContent['faq'] = [
10
+ {
11
+ question: 'Kann ich mehr als einen Keks pro Tag öffnen?',
12
+ answer: 'Das Schicksal spricht nur einmal am Tag. Wir speichern Ihr Ergebnis auf dem Gerät, damit es Sie durch den Tag begleitet.'
13
+ },
14
+ {
15
+ question: 'Werden die Sprüche zufällig generiert?',
16
+ answer: 'Ja - jeden Tag wird ein zufälliger Spruch ausgewählt und lokal gespeichert. Jeder der 25 Sprüche hat die gleiche Chance, ausgewählt zu werden, was für Abwechslung sorgt.'
17
+ }
18
+ ];
19
+
20
+ const howTo: FortuneCookieLocaleContent['howTo'] = [
21
+ { name: 'Keks zerbrechen', text: 'Klicken Sie wiederholt auf den Keks, um ihn aufzubrechen.' },
22
+ { name: 'Botschaft lesen', text: 'Entdecken Sie die verborgene Botschaft im Inneren und Ihre heutigen Glückszahlen.' }
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: 'de',
56
+ };
57
+
58
+ export const content: FortuneCookieLocaleContent = {
59
+ slug,
60
+ title,
61
+ description,
62
+ faqTitle: 'Häufig gestellte Fragen',
63
+ ui: {
64
+ title: 'Online Glückskeks',
65
+ description: 'Dein tägliches digitales Orakel.',
66
+ instruction: 'Klicke auf den Keks, um dein Schicksal zu enthüllen',
67
+ dailyStatus: 'Dein heutiges Schicksal wurde bereits enthüllt.',
68
+ shareBtn: 'Weisheit teilen',
69
+ shareTitle: 'Mein Glückskeks',
70
+ shareText: 'Das Schicksal hat gesprochen: "$TEXT"\nMeine Zahlen: $NUMS\n\nEntdecke dein Schicksal hier:',
71
+ copied: 'Kopiert!',
72
+ fortunes: JSON.stringify([
73
+ "Das Glück, das du suchst, befindet sich in einem anderen Keks.",
74
+ "Zähle nicht die Tage, mache die Tage zählenswert.",
75
+ "Eine Reise von tausend Meilen beginnt mit einem einzigen Schritt.",
76
+ "Ein Fehler ist das Vorwort zur Entdeckung.",
77
+ "Deine Lernfähigkeit ist dein größtes Kapital.",
78
+ "Lächle, das Universum beobachtet dich.",
79
+ "Geduld ist ein Baum mit bitterer Wurzel, aber sehr süßer Frucht.",
80
+ "Fürchte dich nicht vor langsamem Wachstum, fürchte dich nur vor Stillstand.",
81
+ "Heute ist das Morgen, um das du dir gestern Sorgen gemacht hast.",
82
+ "Glück ist nichts Fertiges. Es entsteht durch dein eigenes Handeln.",
83
+ "Wenn du die Windrichtung nicht ändern kannst, richte deine Segel neu aus.",
84
+ "Was du jetzt säst, wirst du später ernten.",
85
+ "Kreativität ist Intelligenz, die Spaß hat.",
86
+ "Suche nicht nach Fehlern, suche nach Lösungen.",
87
+ "Deine Einstellung, nicht deine Begabung, bestimmt deine Höhe.",
88
+ "Erfolg ist die Summe kleiner Anstrengungen, die Tag für Tag wiederholt werden.",
89
+ "Glaube daran, dass du es kannst, dann hast du schon den halben Weg geschafft.",
90
+ "Der einzige Weg, großartige Arbeit zu leisten, ist zu lieben, was man tut.",
91
+ "Das Leben besteht zu 10 % aus dem, was dir passiert, und zu 90 % daraus, wie du darauf reagierst.",
92
+ "Sei die Veränderung, die du dir für die Welt wünschst.",
93
+ "Der beste Weg, die Zukunft vorherzusagen, ist, sie selbst zu gestalten.",
94
+ "Einfachheit ist die höchste Form der Raffinesse.",
95
+ "Du bist der Herr deines Schicksals und der Kapitän deiner Seele.",
96
+ "Bald wirst du Nachrichten erhalten, die deine Perspektive ändern werden.",
97
+ "Eine unerwartete Reise wird dir große Freude bereiten."
98
+ ]),
99
+ faqTitle: 'FAQ',
100
+ },
101
+ seo: [
102
+ { type: 'title', text: 'Das Geheimnis des Glückskekses', level: 2 },
103
+ { type: 'paragraph', html: 'Haben Sie sich jemals gefragt, woher diese kuriosen Kekse kommen? Obwohl wir sie mit chinesischem Essen assoziieren, ist ihre Herkunft eine faszinierende Reise zwischen Japan und den Vereinigten Staaten. Der Glückskeks, wie wir ihn heute kennen, wurde wahrscheinlich Anfang des 20. Jahrhunderts in Kalifornien erfunden, nicht in China - dort sind sie praktisch unbekannt.' },
104
+ { type: 'tip', title: 'So funktioniert unser Orakel', html: 'Jeden Tag können Sie einen Keks öffnen. Das System speichert Ihr Schicksal, damit Sie sich 24 Stunden lang daran erinnern können. Die Botschaft wird lokal in Ihrem Browser gespeichert - absolut privat, ohne Beteiligung eines Servers. Kommen Sie morgen für eine neue Vorhersage wieder!' },
105
+ { type: 'title', text: 'Die Philosophie der Orakel', level: 3 },
106
+ { type: 'paragraph', html: 'Menschen haben in unsicheren Zeiten schon immer nach Führung gesucht. Vom Orakel von Delphi bis zum I Ging erfüllen Wahrsagesysteme eine beständige psychologische Funktion: Sie geben uns die Erlaubnis, <strong>inne zu halten und zu reflektieren</strong>. Ein Glückskeks sagt nicht die Zukunft voraus - er regt dazu aus, darüber nachzudenken.' },
107
+ { type: 'list', items: [
108
+ '<strong>Altes China:</strong> Das I Ging (Buch der Wandlungen, ca. 1000 v. Chr.) nutzte Hexagramme, um Entscheidungen zu leiten und das Schicksal zu interpretieren.',
109
+ '<strong>Klassisches Griechenland:</strong> Das Orakel von Delphi zog Herrscher und Bürger gleichermaßen mit kryptischen Aussprüchen an, die als göttliche Führung interpretiert wurden.',
110
+ '<strong>Modernes Japan:</strong> Omikuji-Glückszettel an Shinto-Schreinen, die an Baumzweige gebunden werden, verbinden Schicksal mit Ritual.',
111
+ '<strong>20. Jahrhundert USA:</strong> Glückskekse entstanden in japanisch-amerikanischen Gemeinschaften, bevor sie zum Synonym für die chinesisch-amerikanische Küche wurden.',
112
+ ]},
113
+ { type: 'stats', items: [
114
+ { value: '3 Mrd.+', label: 'Glückskekse jährlich hergestellt', icon: 'mdi:cookie' },
115
+ { value: '~1000 v. Chr.', label: 'Ursprung des I Ging', icon: 'mdi:book-open-variant' },
116
+ { value: '25', label: 'Sprüche in diesem Orakel', icon: 'mdi:star-shooting' },
117
+ { value: '1/Tag', label: 'Ein Schicksal pro Tag', icon: 'mdi:calendar-today' },
118
+ ], columns: 4 },
119
+ ],
120
+ faq,
121
+ bibliography,
122
+ howTo,
123
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
124
+ };