@jjlmoya/utils-creative 1.26.0 → 1.28.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 +75 -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: 'ja',
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
- "うちの猫が", "おばあちゃんが", "大統領が", "宇宙人が", "5階の隣人が",
74
- "Wifiが", "星占いが", "タイムトラベラーが", "洗濯機が", "冷蔵庫が",
75
- "クリスマスの精霊が", "自分の影が", "忍者が", "ヴィーガン警察が", "Siriが",
76
- "食虫植物が", "Amazonの配達員が", "邪悪なクローンが", "魔法使いが", "ゴジラが"
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(Joy of Missing Out)のルネサンス', level: 3 },
102
- { type: 'paragraph', html: '過去10年間は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: 'ja',
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
+ "うちの猫が", "おばあちゃんが", "大統領が", "宇宙人が", "5階の隣人が",
74
+ "Wifiが", "星占いが", "タイムトラベラーが", "洗濯機が", "冷蔵庫が",
75
+ "クリスマスの精霊が", "自分の影が", "忍者が", "ヴィーガン警察が", "Siriが",
76
+ "食虫植物が", "Amazonの配達員が", "邪悪なクローンが", "魔法使いが", "ゴジラが"
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(Joy of Missing Out)のルネサンス', level: 3 },
102
+ { type: 'paragraph', html: '過去10年間は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,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: 'ko',
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
- "우리 집 고양이가", "할머니께서", "대통령이", "외계인이", "5층 옆집 이웃이",
74
- "와이파이가", "내 별자리가", "시간 여행자가", "세탁기가", "우리 집 냉장고가",
75
- "크리스마스의 유령이", "내 그림자가", "닌자가", "채식 경찰이", "시리가",
76
- "내 식충식물이", "아마존 배달원이", "나의 사악한 클론이", "마법사가", "고질라가"
77
- ]),
78
- middles: JSON.stringify([
79
- "에게 선전포고를 해서", "를 먹어 치워서", "를 납치해서", "에 불을 질러서",
80
- "에서 파티를 열고 있어서", "에 구토를 해서", "에서 나가기를 거부해서",
81
- "를 해킹해서", "를 훔쳐 가서", "와 사랑에 빠져서", "에 대해 명상 중이라서",
82
- "에게 주문을 걸어서", "에 반대하는 시위를 해서", "에 사이비 종교를 세워서",
83
- "에서 삼바 춤을 추고 있어서", "에서 악마를 소환해서", "의 접속을 차단해서",
84
- "가 황금으로 변해버려서", "를 팔려고 시도 중이라서", "에 대한 책을 쓰고 있어서"
85
- ]),
86
- ends: JSON.stringify([
87
- "집 열쇠를 찾을 수 없습니다.", "삶의 의욕을 잃었습니다.", "차고 문이 고장 났습니다.",
88
- "가장 아끼는 바지가 찢어졌습니다.", "거실 공유기가 폭발했습니다.", "신발 한 짝이 사라졌습니다.",
89
- "물리학의 법칙을 거스르고 있습니다.", "존엄성을 잃었습니다.", "건물 엘리베이터가 멈췄습니다.",
90
- "넷플릭스 계정이 도용당했습니다.", "칫솔이 가출했습니다.", "집 문서가 타버렸습니다.",
91
- "딱지 컬렉션이 엉망이 되었습니다.", "자동차 핸드브레이크가 풀렸습니다.", "사회적 욕구가 소진되었습니다.",
92
- "커피 원두가 떨어졌습니다.", "변기 뚜껑이 열리지 않습니다.", "TV 리모컨이 사라졌습니다.",
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(Joy of Missing Out)의 르네상스', level: 3 },
102
- { type: 'paragraph', html: '지난 10년 동안 FOMO(소외되는 것에 대한 두려움)가 지배적이었다면, 이제 디지털 웰빙 전문가들은 <strong>JOMO: 놓치는 것에 대한 즐거움</strong>을 옹호합니다. 이것은 고립이 아니라 의도적인 선택에 관한 것입니다.' },
103
- { type: 'tip', title: '반박할 수 없는 알리바이를 위한 공식', html: '<strong>주어 분리하기:</strong> 당신은 결코 가해자가 아닙니다. "와이파이", "우리 집 고양이", "우주" 등 외부 존재에게 책임을 전가하세요.<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: 'ko',
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
+ "우리 집 고양이가", "할머니께서", "대통령이", "외계인이", "5층 옆집 이웃이",
74
+ "와이파이가", "내 별자리가", "시간 여행자가", "세탁기가", "우리 집 냉장고가",
75
+ "크리스마스의 유령이", "내 그림자가", "닌자가", "채식 경찰이", "시리가",
76
+ "내 식충식물이", "아마존 배달원이", "나의 사악한 클론이", "마법사가", "고질라가"
77
+ ]),
78
+ middles: JSON.stringify([
79
+ "에게 선전포고를 해서", "를 먹어 치워서", "를 납치해서", "에 불을 질러서",
80
+ "에서 파티를 열고 있어서", "에 구토를 해서", "에서 나가기를 거부해서",
81
+ "를 해킹해서", "를 훔쳐 가서", "와 사랑에 빠져서", "에 대해 명상 중이라서",
82
+ "에게 주문을 걸어서", "에 반대하는 시위를 해서", "에 사이비 종교를 세워서",
83
+ "에서 삼바 춤을 추고 있어서", "에서 악마를 소환해서", "의 접속을 차단해서",
84
+ "가 황금으로 변해버려서", "를 팔려고 시도 중이라서", "에 대한 책을 쓰고 있어서"
85
+ ]),
86
+ ends: JSON.stringify([
87
+ "집 열쇠를 찾을 수 없습니다.", "삶의 의욕을 잃었습니다.", "차고 문이 고장 났습니다.",
88
+ "가장 아끼는 바지가 찢어졌습니다.", "거실 공유기가 폭발했습니다.", "신발 한 짝이 사라졌습니다.",
89
+ "물리학의 법칙을 거스르고 있습니다.", "존엄성을 잃었습니다.", "건물 엘리베이터가 멈췄습니다.",
90
+ "넷플릭스 계정이 도용당했습니다.", "칫솔이 가출했습니다.", "집 문서가 타버렸습니다.",
91
+ "딱지 컬렉션이 엉망이 되었습니다.", "자동차 핸드브레이크가 풀렸습니다.", "사회적 욕구가 소진되었습니다.",
92
+ "커피 원두가 떨어졌습니다.", "변기 뚜껑이 열리지 않습니다.", "TV 리모컨이 사라졌습니다.",
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(Joy of Missing Out)의 르네상스', level: 3 },
102
+ { type: 'paragraph', html: '지난 10년 동안 FOMO(소외되는 것에 대한 두려움)가 지배적이었다면, 이제 디지털 웰빙 전문가들은 <strong>JOMO: 놓치는 것에 대한 즐거움</strong>을 옹호합니다. 이것은 고립이 아니라 의도적인 선택에 관한 것입니다.' },
103
+ { type: 'tip', title: '반박할 수 없는 알리바이를 위한 공식', html: '<strong>주어 분리하기:</strong> 당신은 결코 가해자가 아닙니다. "와이파이", "우리 집 고양이", "우주" 등 외부 존재에게 책임을 전가하세요.<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
+ };