@jjlmoya/utils-home 1.16.0 → 1.23.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 (174) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/de.ts +10 -10
  3. package/src/category/i18n/en.ts +8 -8
  4. package/src/category/i18n/es.ts +2 -2
  5. package/src/category/i18n/fr.ts +15 -15
  6. package/src/category/i18n/id.ts +8 -8
  7. package/src/category/i18n/it.ts +7 -7
  8. package/src/category/i18n/nl.ts +8 -8
  9. package/src/category/i18n/pl.ts +10 -10
  10. package/src/category/i18n/pt.ts +8 -8
  11. package/src/category/i18n/ru.ts +10 -10
  12. package/src/category/i18n/sv.ts +8 -8
  13. package/src/category/i18n/tr.ts +4 -4
  14. package/src/category/i18n/zh.ts +8 -8
  15. package/src/entries.ts +4 -1
  16. package/src/pages/[locale]/[slug].astro +28 -12
  17. package/src/tests/locale_completeness.test.ts +4 -22
  18. package/src/tests/no_en_dash.test.ts +70 -0
  19. package/src/tests/shared-test-helpers.ts +56 -0
  20. package/src/tests/tool_exports.test.ts +34 -0
  21. package/src/tests/tool_validation.test.ts +2 -2
  22. package/src/tool/dewPointCalculator/bibliography.ts +10 -0
  23. package/src/tool/dewPointCalculator/i18n/de.ts +7 -17
  24. package/src/tool/dewPointCalculator/i18n/en.ts +8 -18
  25. package/src/tool/dewPointCalculator/i18n/es.ts +7 -17
  26. package/src/tool/dewPointCalculator/i18n/fr.ts +8 -18
  27. package/src/tool/dewPointCalculator/i18n/id.ts +7 -17
  28. package/src/tool/dewPointCalculator/i18n/it.ts +7 -17
  29. package/src/tool/dewPointCalculator/i18n/ja.ts +6 -16
  30. package/src/tool/dewPointCalculator/i18n/ko.ts +6 -16
  31. package/src/tool/dewPointCalculator/i18n/nl.ts +7 -17
  32. package/src/tool/dewPointCalculator/i18n/pl.ts +7 -17
  33. package/src/tool/dewPointCalculator/i18n/pt.ts +7 -17
  34. package/src/tool/dewPointCalculator/i18n/ru.ts +13 -23
  35. package/src/tool/dewPointCalculator/i18n/sv.ts +7 -17
  36. package/src/tool/dewPointCalculator/i18n/tr.ts +6 -16
  37. package/src/tool/dewPointCalculator/i18n/zh.ts +7 -17
  38. package/src/tool/dewPointCalculator/seo.astro +2 -1
  39. package/src/tool/heatingComparator/bibliography.ts +14 -0
  40. package/src/tool/heatingComparator/i18n/de.ts +10 -24
  41. package/src/tool/heatingComparator/i18n/en.ts +3 -13
  42. package/src/tool/heatingComparator/i18n/es.ts +3 -17
  43. package/src/tool/heatingComparator/i18n/fr.ts +9 -19
  44. package/src/tool/heatingComparator/i18n/id.ts +3 -17
  45. package/src/tool/heatingComparator/i18n/it.ts +3 -17
  46. package/src/tool/heatingComparator/i18n/ja.ts +296 -310
  47. package/src/tool/heatingComparator/i18n/ko.ts +296 -306
  48. package/src/tool/heatingComparator/i18n/nl.ts +3 -17
  49. package/src/tool/heatingComparator/i18n/pl.ts +3 -17
  50. package/src/tool/heatingComparator/i18n/pt.ts +3 -17
  51. package/src/tool/heatingComparator/i18n/ru.ts +14 -24
  52. package/src/tool/heatingComparator/i18n/sv.ts +6 -20
  53. package/src/tool/heatingComparator/i18n/tr.ts +2 -16
  54. package/src/tool/heatingComparator/i18n/zh.ts +296 -306
  55. package/src/tool/heatingComparator/seo.astro +3 -3
  56. package/src/tool/ledSavingCalculator/bibliography.ts +14 -0
  57. package/src/tool/ledSavingCalculator/i18n/de.ts +6 -16
  58. package/src/tool/ledSavingCalculator/i18n/en.ts +6 -20
  59. package/src/tool/ledSavingCalculator/i18n/es.ts +6 -20
  60. package/src/tool/ledSavingCalculator/i18n/fr.ts +10 -24
  61. package/src/tool/ledSavingCalculator/i18n/id.ts +5 -15
  62. package/src/tool/ledSavingCalculator/i18n/it.ts +6 -16
  63. package/src/tool/ledSavingCalculator/i18n/ja.ts +5 -15
  64. package/src/tool/ledSavingCalculator/i18n/ko.ts +4 -14
  65. package/src/tool/ledSavingCalculator/i18n/nl.ts +5 -15
  66. package/src/tool/ledSavingCalculator/i18n/pl.ts +5 -15
  67. package/src/tool/ledSavingCalculator/i18n/pt.ts +5 -15
  68. package/src/tool/ledSavingCalculator/i18n/ru.ts +8 -18
  69. package/src/tool/ledSavingCalculator/i18n/sv.ts +5 -15
  70. package/src/tool/ledSavingCalculator/i18n/tr.ts +5 -15
  71. package/src/tool/ledSavingCalculator/i18n/zh.ts +6 -16
  72. package/src/tool/ledSavingCalculator/seo.astro +2 -1
  73. package/src/tool/projectorCalculator/bibliography.ts +5 -0
  74. package/src/tool/projectorCalculator/i18n/de.ts +4 -8
  75. package/src/tool/projectorCalculator/i18n/en.ts +3 -8
  76. package/src/tool/projectorCalculator/i18n/es.ts +4 -9
  77. package/src/tool/projectorCalculator/i18n/fr.ts +6 -11
  78. package/src/tool/projectorCalculator/i18n/id.ts +4 -9
  79. package/src/tool/projectorCalculator/i18n/it.ts +4 -8
  80. package/src/tool/projectorCalculator/i18n/ja.ts +175 -179
  81. package/src/tool/projectorCalculator/i18n/ko.ts +175 -179
  82. package/src/tool/projectorCalculator/i18n/nl.ts +4 -8
  83. package/src/tool/projectorCalculator/i18n/pl.ts +5 -9
  84. package/src/tool/projectorCalculator/i18n/pt.ts +4 -8
  85. package/src/tool/projectorCalculator/i18n/ru.ts +7 -11
  86. package/src/tool/projectorCalculator/i18n/sv.ts +4 -8
  87. package/src/tool/projectorCalculator/i18n/tr.ts +4 -8
  88. package/src/tool/projectorCalculator/i18n/zh.ts +175 -179
  89. package/src/tool/projectorCalculator/seo.astro +2 -1
  90. package/src/tool/qrGenerator/bibliography.ts +14 -0
  91. package/src/tool/qrGenerator/i18n/de.ts +192 -202
  92. package/src/tool/qrGenerator/i18n/en.ts +3 -17
  93. package/src/tool/qrGenerator/i18n/es.ts +2 -16
  94. package/src/tool/qrGenerator/i18n/fr.ts +3 -17
  95. package/src/tool/qrGenerator/i18n/id.ts +146 -150
  96. package/src/tool/qrGenerator/i18n/it.ts +169 -173
  97. package/src/tool/qrGenerator/i18n/ja.ts +146 -150
  98. package/src/tool/qrGenerator/i18n/ko.ts +146 -150
  99. package/src/tool/qrGenerator/i18n/nl.ts +146 -150
  100. package/src/tool/qrGenerator/i18n/pl.ts +146 -150
  101. package/src/tool/qrGenerator/i18n/pt.ts +146 -150
  102. package/src/tool/qrGenerator/i18n/ru.ts +146 -150
  103. package/src/tool/qrGenerator/i18n/sv.ts +146 -150
  104. package/src/tool/qrGenerator/i18n/tr.ts +146 -150
  105. package/src/tool/qrGenerator/i18n/zh.ts +146 -150
  106. package/src/tool/qrGenerator/seo.astro +2 -1
  107. package/src/tool/solarCalculator/bibliography.ts +5 -0
  108. package/src/tool/solarCalculator/i18n/de.ts +141 -145
  109. package/src/tool/solarCalculator/i18n/en.ts +7 -12
  110. package/src/tool/solarCalculator/i18n/es.ts +5 -10
  111. package/src/tool/solarCalculator/i18n/fr.ts +8 -13
  112. package/src/tool/solarCalculator/i18n/id.ts +4 -8
  113. package/src/tool/solarCalculator/i18n/it.ts +4 -8
  114. package/src/tool/solarCalculator/i18n/ja.ts +121 -125
  115. package/src/tool/solarCalculator/i18n/ko.ts +116 -120
  116. package/src/tool/solarCalculator/i18n/nl.ts +4 -7
  117. package/src/tool/solarCalculator/i18n/pl.ts +5 -9
  118. package/src/tool/solarCalculator/i18n/pt.ts +4 -8
  119. package/src/tool/solarCalculator/i18n/ru.ts +7 -10
  120. package/src/tool/solarCalculator/i18n/sv.ts +4 -7
  121. package/src/tool/solarCalculator/i18n/tr.ts +4 -7
  122. package/src/tool/solarCalculator/i18n/zh.ts +116 -120
  123. package/src/tool/solarCalculator/seo.astro +2 -1
  124. package/src/tool/tariffComparator/bibliography.ts +7 -0
  125. package/src/tool/tariffComparator/i18n/de.ts +129 -132
  126. package/src/tool/tariffComparator/i18n/en.ts +5 -12
  127. package/src/tool/tariffComparator/i18n/es.ts +5 -12
  128. package/src/tool/tariffComparator/i18n/fr.ts +8 -15
  129. package/src/tool/tariffComparator/i18n/id.ts +2 -5
  130. package/src/tool/tariffComparator/i18n/it.ts +2 -5
  131. package/src/tool/tariffComparator/i18n/ja.ts +129 -132
  132. package/src/tool/tariffComparator/i18n/ko.ts +129 -132
  133. package/src/tool/tariffComparator/i18n/nl.ts +2 -5
  134. package/src/tool/tariffComparator/i18n/pl.ts +3 -6
  135. package/src/tool/tariffComparator/i18n/pt.ts +2 -5
  136. package/src/tool/tariffComparator/i18n/ru.ts +2 -5
  137. package/src/tool/tariffComparator/i18n/sv.ts +2 -5
  138. package/src/tool/tariffComparator/i18n/tr.ts +2 -5
  139. package/src/tool/tariffComparator/i18n/zh.ts +129 -132
  140. package/src/tool/tariffComparator/seo.astro +2 -1
  141. package/src/tool/wifiRangeSimulator/bibliography.astro +14 -0
  142. package/src/tool/wifiRangeSimulator/bibliography.ts +14 -0
  143. package/src/tool/wifiRangeSimulator/component.astro +170 -0
  144. package/src/tool/wifiRangeSimulator/entry.ts +29 -0
  145. package/src/tool/wifiRangeSimulator/i18n/de.ts +477 -0
  146. package/src/tool/wifiRangeSimulator/i18n/en.ts +477 -0
  147. package/src/tool/wifiRangeSimulator/i18n/es.ts +477 -0
  148. package/src/tool/wifiRangeSimulator/i18n/fr.ts +477 -0
  149. package/src/tool/wifiRangeSimulator/i18n/id.ts +477 -0
  150. package/src/tool/wifiRangeSimulator/i18n/it.ts +477 -0
  151. package/src/tool/wifiRangeSimulator/i18n/ja.ts +477 -0
  152. package/src/tool/wifiRangeSimulator/i18n/ko.ts +477 -0
  153. package/src/tool/wifiRangeSimulator/i18n/nl.ts +477 -0
  154. package/src/tool/wifiRangeSimulator/i18n/pl.ts +477 -0
  155. package/src/tool/wifiRangeSimulator/i18n/pt.ts +477 -0
  156. package/src/tool/wifiRangeSimulator/i18n/ru.ts +477 -0
  157. package/src/tool/wifiRangeSimulator/i18n/sv.ts +477 -0
  158. package/src/tool/wifiRangeSimulator/i18n/tr.ts +477 -0
  159. package/src/tool/wifiRangeSimulator/i18n/zh.ts +477 -0
  160. package/src/tool/wifiRangeSimulator/i18n-utils.ts +14 -0
  161. package/src/tool/wifiRangeSimulator/index.ts +8 -0
  162. package/src/tool/wifiRangeSimulator/logic.ts +220 -0
  163. package/src/tool/wifiRangeSimulator/seo.astro +15 -0
  164. package/src/tool/wifiRangeSimulator/sketch-actions.ts +168 -0
  165. package/src/tool/wifiRangeSimulator/sketch-events.ts +138 -0
  166. package/src/tool/wifiRangeSimulator/sketch-render-dash.ts +170 -0
  167. package/src/tool/wifiRangeSimulator/sketch-render-device.ts +42 -0
  168. package/src/tool/wifiRangeSimulator/sketch-render.ts +155 -0
  169. package/src/tool/wifiRangeSimulator/sketch-state.ts +186 -0
  170. package/src/tool/wifiRangeSimulator/sketch.ts +100 -0
  171. package/src/tool/wifiRangeSimulator/ui.ts +69 -0
  172. package/src/tool/wifiRangeSimulator/wifi-range-simulator.css +583 -0
  173. package/src/tools.ts +2 -0
  174. package/src/types.ts +0 -2
@@ -1,151 +1,147 @@
1
- import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
- import type { ToolLocaleContent } from '../../../types';
3
- import type { QRGeneratorUI } from '../ui';
4
-
5
- const slug = 'qr-generator';
6
- const title = 'オフラインQRコード作成';
7
- const description =
8
- 'WiFi、URL、連絡先用のQRコードをブラウザ内で100%安全に作成。データがデバイスの外に送信されることはありません。';
9
-
10
- const faqData = [
11
- {
12
- question: 'QRコードに有効期限はありますか?',
13
- answer:
14
- 'いいえ。ここで作成されるコードは静的です。情報は画像内に直接埋め込まれているため、外部サーバーに依存せず、永久に機能します。',
15
- },
16
- {
17
- question: '入力したデータは保存されますか?',
18
- answer:
19
- 'いいえ、一切保存されません。すべての処理はブラウザ内(クライアントサイド)で行われ、当社のサーバーに送信されることはありません。',
20
- },
21
- {
22
- question: 'iPhoneやAndroidで使えますか?',
23
- answer:
24
- 'はい。最近のiOSやAndroidの標準カメラで読み取ることができ、WiFi接続やリンクを開くなどのアクションが自動的に提案されます。',
25
- },
26
- {
27
- question: 'オフラインでも使えますか?',
28
- answer:
29
- 'はい。一度ページを読み込めば、インターネットを切断した状態でも問題なくQRコードを作成できます。',
30
- },
31
- ];
32
-
33
- const howToData = [
34
- {
35
- name: '作成するタイプを選ぶ',
36
- text: 'WiFi、URL、連絡先(vCard)の中から作成したいものを選択します。',
37
- },
38
- {
39
- name: '情報を入力する',
40
- text: 'ネットワーク名やパスワード、ウェブアドレスなどの必要事項を入力します。',
41
- },
42
- {
43
- name: '作成・確認',
44
- text: 'QRコードが即座に生成されます。画面を直接スマホで読み取ってテストしてください。',
45
- },
46
- {
47
- name: 'ダウンロード',
48
- text: '作成したQRコードを画像として保存し、印刷や共有に利用します。',
49
- },
50
- ];
51
-
52
- const faqSchema: WithContext<FAQPage> = {
53
- '@context': 'https://schema.org',
54
- '@type': 'FAQPage',
55
- mainEntity: faqData.map((item) => ({
56
- '@type': 'Question',
57
- name: item.question,
58
- acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
- })),
60
- };
61
-
62
- const howToSchema: WithContext<HowTo> = {
63
- '@context': 'https://schema.org',
64
- '@type': 'HowTo',
65
- name: title,
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { QRGeneratorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'qr-generator';
7
+ const title = 'オフラインQRコード作成';
8
+ const description =
9
+ 'WiFi、URL、連絡先用のQRコードをブラウザ内で100%安全に作成。データがデバイスの外に送信されることはありません。';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'QRコードに有効期限はありますか?',
14
+ answer:
15
+ 'いいえ。ここで作成されるコードは静的です。情報は画像内に直接埋め込まれているため、外部サーバーに依存せず、永久に機能します。',
16
+ },
17
+ {
18
+ question: '入力したデータは保存されますか?',
19
+ answer:
20
+ 'いいえ、一切保存されません。すべての処理はブラウザ内(クライアントサイド)で行われ、当社のサーバーに送信されることはありません。',
21
+ },
22
+ {
23
+ question: 'iPhoneやAndroidで使えますか?',
24
+ answer:
25
+ 'はい。最近のiOSやAndroidの標準カメラで読み取ることができ、WiFi接続やリンクを開くなどのアクションが自動的に提案されます。',
26
+ },
27
+ {
28
+ question: 'オフラインでも使えますか?',
29
+ answer:
30
+ 'はい。一度ページを読み込めば、インターネットを切断した状態でも問題なくQRコードを作成できます。',
31
+ },
32
+ ];
33
+
34
+ const howToData = [
35
+ {
36
+ name: '作成するタイプを選ぶ',
37
+ text: 'WiFi、URL、連絡先(vCard)の中から作成したいものを選択します。',
38
+ },
39
+ {
40
+ name: '情報を入力する',
41
+ text: 'ネットワーク名やパスワード、ウェブアドレスなどの必要事項を入力します。',
42
+ },
43
+ {
44
+ name: '作成・確認',
45
+ text: 'QRコードが即座に生成されます。画面を直接スマホで読み取ってテストしてください。',
46
+ },
47
+ {
48
+ name: 'ダウンロード',
49
+ text: '作成したQRコードを画像として保存し、印刷や共有に利用します。',
50
+ },
51
+ ];
52
+
53
+ const faqSchema: WithContext<FAQPage> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'FAQPage',
56
+ mainEntity: faqData.map((item) => ({
57
+ '@type': 'Question',
58
+ name: item.question,
59
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
60
+ })),
61
+ };
62
+
63
+ const howToSchema: WithContext<HowTo> = {
64
+ '@context': 'https://schema.org',
65
+ '@type': 'HowTo',
66
+ name: title,
67
+ description,
68
+ step: howToData.map((step) => ({
69
+ '@type': 'HowToStep',
70
+ name: step.name,
71
+ text: step.text,
72
+ })),
73
+ };
74
+
75
+ const appSchema: WithContext<SoftwareApplication> = {
76
+ '@context': 'https://schema.org',
77
+ '@type': 'SoftwareApplication',
78
+ name: title,
79
+ description,
80
+ applicationCategory: 'UtilityApplication',
81
+ operatingSystem: 'All',
82
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'JPY' },
83
+ inLanguage: 'ja',
84
+ };
85
+
86
+ export const content: ToolLocaleContent<QRGeneratorUI> = {
87
+ slug,
88
+ title,
66
89
  description,
67
- step: howToData.map((step) => ({
68
- '@type': 'HowToStep',
69
- name: step.name,
70
- text: step.text,
71
- })),
72
- };
73
-
74
- const appSchema: WithContext<SoftwareApplication> = {
75
- '@context': 'https://schema.org',
76
- '@type': 'SoftwareApplication',
77
- name: title,
78
- description,
79
- applicationCategory: 'UtilityApplication',
80
- operatingSystem: 'All',
81
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'JPY' },
82
- inLanguage: 'ja',
83
- };
84
-
85
- export const content: ToolLocaleContent<QRGeneratorUI> = {
86
- slug,
87
- title,
88
- description,
89
- faqTitle: 'よくある質問',
90
- faq: faqData,
91
- bibliographyTitle: '参考文献',
92
- bibliography: [
93
- { name: 'node-qrcode ライブラリ', url: 'https://github.com/soldair/node-qrcode' },
94
- { name: 'RFC 6350: vCard 形式仕様', url: 'https://www.rfc-editor.org/rfc/rfc6350' },
95
- ],
96
- howTo: howToData,
97
- schemas: [faqSchema, howToSchema, appSchema],
98
- seo: [
99
- {
100
- type: 'title',
101
- text: 'プライバシー重視:ローカル生成',
102
- level: 2,
103
- },
104
- {
105
- type: 'paragraph',
106
- html: 'このツールはQRコードをデバイス上で直接作成します。<strong>WiFiパスワード</strong>や<strong>個人情報</strong>がネットに流れる心配はありません。',
107
- },
108
- {
109
- type: 'stats',
110
- items: [
111
- { value: '100%', label: 'プライベート', icon: 'mdi:shield-lock' },
112
- { value: 'オフライン', label: 'サーバー通信なし', icon: 'mdi:wifi-off' },
113
- { value: 'PNG', label: '画像保存', icon: 'mdi:download' },
114
- ],
115
- columns: 3,
116
- },
117
- {
118
- type: 'summary',
119
- title: '利用のコツ',
120
- items: [
121
- 'データはブラウザ内でのみ処理されます。',
122
- 'WiFiのSSIDやパスワードは大文字・小文字を区別します。',
123
- '静的QRのため、パスワードを変えたら新しく作成してください。',
124
- '印刷する前に必ず読み取りテストを行ってください。',
125
- ],
126
- },
127
- ],
128
- ui: {
129
- tabWifi: 'WiFi',
130
- tabUrl: 'URL',
131
- tabContact: '連絡先',
132
- labelSsid: 'ネットワーク名(SSID)',
133
- labelPassword: 'パスワード',
134
- labelEncryption: '暗号化',
135
- labelHidden: '非公開ネットワーク',
136
- labelUrl: 'ウェブサイトURL',
137
- labelName: '名前',
138
- labelSurname: '姓',
139
- labelPhone: '電話番号',
140
- labelEmail: 'メールアドレス',
141
- labelOrg: '会社・組織名',
142
- encWpa: 'WPA/WPA2',
143
- encWep: 'WEP',
144
- encNone: 'なし',
145
- downloadBtn: 'PNG保存',
146
- privacyMsg: 'ブラウザ内で100%生成。データは安全です。',
147
- placeholderSsid: 'MyWiFi_5G',
148
- placeholderUrl: 'https://example.jp',
149
- placeholderPassword: '••••••••',
150
- },
151
- };
90
+ faq: faqData,
91
+ bibliography,
92
+ howTo: howToData,
93
+ schemas: [faqSchema, howToSchema, appSchema],
94
+ seo: [
95
+ {
96
+ type: 'title',
97
+ text: 'プライバシー重視:ローカル生成',
98
+ level: 2,
99
+ },
100
+ {
101
+ type: 'paragraph',
102
+ html: 'このツールはQRコードをデバイス上で直接作成します。<strong>WiFiパスワード</strong>や<strong>個人情報</strong>がネットに流れる心配はありません。',
103
+ },
104
+ {
105
+ type: 'stats',
106
+ items: [
107
+ { value: '100%', label: 'プライベート', icon: 'mdi:shield-lock' },
108
+ { value: 'オフライン', label: 'サーバー通信なし', icon: 'mdi:wifi-off' },
109
+ { value: 'PNG', label: '画像保存', icon: 'mdi:download' },
110
+ ],
111
+ columns: 3,
112
+ },
113
+ {
114
+ type: 'summary',
115
+ title: '利用のコツ',
116
+ items: [
117
+ 'データはブラウザ内でのみ処理されます。',
118
+ 'WiFiのSSIDやパスワードは大文字・小文字を区別します。',
119
+ '静的QRのため、パスワードを変えたら新しく作成してください。',
120
+ '印刷する前に必ず読み取りテストを行ってください。',
121
+ ],
122
+ },
123
+ ],
124
+ ui: {
125
+ tabWifi: 'WiFi',
126
+ tabUrl: 'URL',
127
+ tabContact: '連絡先',
128
+ labelSsid: 'ネットワーク名(SSID)',
129
+ labelPassword: 'パスワード',
130
+ labelEncryption: '暗号化',
131
+ labelHidden: '非公開ネットワーク',
132
+ labelUrl: 'ウェブサイトURL',
133
+ labelName: '名前',
134
+ labelSurname: '',
135
+ labelPhone: '電話番号',
136
+ labelEmail: 'メールアドレス',
137
+ labelOrg: '会社・組織名',
138
+ encWpa: 'WPA/WPA2',
139
+ encWep: 'WEP',
140
+ encNone: 'なし',
141
+ downloadBtn: 'PNG保存',
142
+ privacyMsg: 'ブラウザ内で100%生成。データは安全です。',
143
+ placeholderSsid: 'MyWiFi_5G',
144
+ placeholderUrl: 'https://example.jp',
145
+ placeholderPassword: '••••••••',
146
+ },
147
+ };
@@ -1,151 +1,147 @@
1
- import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
- import type { ToolLocaleContent } from '../../../types';
3
- import type { QRGeneratorUI } from '../ui';
4
-
5
- const slug = 'qr-generator';
6
- const title = '오프라인 QR 코드 생성기';
7
- const description =
8
- 'WiFi, URL, 연락처용 QR 코드를 웹 브라우저에서 100% 안전하게 생성하세요. 데이터가 기기 외부로 유출되지 않습니다.';
9
-
10
- const faqData = [
11
- {
12
- question: 'QR 코드에 유효 기간이 있나요?',
13
- answer:
14
- '아니요. 여기서 생성되는 코드는 정적(static)입니다. 코드가 이미지 내에 직접 포함되어 있어 외부 링크에 의존하지 않으며 영구적으로 작동합니다.',
15
- },
16
- {
17
- question: '입력한 데이터가 저장되나요?',
18
- answer:
19
- '절대 저장되지 않습니다. 모든 과정은 브라우저(클라이언트) 내에서 이루어지며, 서버로 데이터를 전송하지 않아 100% 개인정보가 보호됩니다.',
20
- },
21
- {
22
- question: 'iPhone이나 Android에서 사용할 수 있나요?',
23
- answer:
24
- '네. 대부분의 최신 스마트폰 카메라는 QR 코드를 기본적으로 인식하며, 해당 액션(WiFi 연결, 링크 열기 등)을 바로 제안합니다.',
25
- },
26
- {
27
- question: '인터넷 없이도 사용할 수 있나요?',
28
- answer:
29
- '네. 일단 페이지가 로드되면, 인터넷 연결을 끊어도 생성기는 문제없이 작동합니다.',
30
- },
31
- ];
32
-
33
- const howToData = [
34
- {
35
- name: 'QR 타입 선택',
36
- text: 'WiFi 네트워크, URL 링크, 또는 연락처(vCard) 중 원하는 타입을 선택합니다.',
37
- },
38
- {
39
- name: '정보 입력',
40
- text: '네트워크 이름, 비밀번호, 웹 주소 등 필요한 정보를 입력합니다.',
41
- },
42
- {
43
- name: '생성 및 확인',
44
- text: 'QR 코드가 즉시 생성됩니다. 화면을 직접 스캔하여 제대로 작동하는지 확인하세요.',
45
- },
46
- {
47
- name: '다운로드',
48
- text: '인쇄하거나 디지털로 공유하기 위해 QR 코드를 이미지 파일로 저장합니다.',
49
- },
50
- ];
51
-
52
- const faqSchema: WithContext<FAQPage> = {
53
- '@context': 'https://schema.org',
54
- '@type': 'FAQPage',
55
- mainEntity: faqData.map((item) => ({
56
- '@type': 'Question',
57
- name: item.question,
58
- acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
- })),
60
- };
61
-
62
- const howToSchema: WithContext<HowTo> = {
63
- '@context': 'https://schema.org',
64
- '@type': 'HowTo',
65
- name: title,
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { QRGeneratorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'qr-generator';
7
+ const title = '오프라인 QR 코드 생성기';
8
+ const description =
9
+ 'WiFi, URL, 연락처용 QR 코드를 웹 브라우저에서 100% 안전하게 생성하세요. 데이터가 기기 외부로 유출되지 않습니다.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'QR 코드에 유효 기간이 있나요?',
14
+ answer:
15
+ '아니요. 여기서 생성되는 코드는 정적(static)입니다. 코드가 이미지 내에 직접 포함되어 있어 외부 링크에 의존하지 않으며 영구적으로 작동합니다.',
16
+ },
17
+ {
18
+ question: '입력한 데이터가 저장되나요?',
19
+ answer:
20
+ '절대 저장되지 않습니다. 모든 과정은 브라우저(클라이언트) 내에서 이루어지며, 서버로 데이터를 전송하지 않아 100% 개인정보가 보호됩니다.',
21
+ },
22
+ {
23
+ question: 'iPhone이나 Android에서 사용할 수 있나요?',
24
+ answer:
25
+ '네. 대부분의 최신 스마트폰 카메라는 QR 코드를 기본적으로 인식하며, 해당 액션(WiFi 연결, 링크 열기 등)을 바로 제안합니다.',
26
+ },
27
+ {
28
+ question: '인터넷 없이도 사용할 수 있나요?',
29
+ answer:
30
+ '네. 일단 페이지가 로드되면, 인터넷 연결을 끊어도 생성기는 문제없이 작동합니다.',
31
+ },
32
+ ];
33
+
34
+ const howToData = [
35
+ {
36
+ name: 'QR 타입 선택',
37
+ text: 'WiFi 네트워크, URL 링크, 또는 연락처(vCard) 중 원하는 타입을 선택합니다.',
38
+ },
39
+ {
40
+ name: '정보 입력',
41
+ text: '네트워크 이름, 비밀번호, 웹 주소 등 필요한 정보를 입력합니다.',
42
+ },
43
+ {
44
+ name: '생성 확인',
45
+ text: 'QR 코드가 즉시 생성됩니다. 화면을 직접 스캔하여 제대로 작동하는지 확인하세요.',
46
+ },
47
+ {
48
+ name: '다운로드',
49
+ text: '인쇄하거나 디지털로 공유하기 위해 QR 코드를 이미지 파일로 저장합니다.',
50
+ },
51
+ ];
52
+
53
+ const faqSchema: WithContext<FAQPage> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'FAQPage',
56
+ mainEntity: faqData.map((item) => ({
57
+ '@type': 'Question',
58
+ name: item.question,
59
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
60
+ })),
61
+ };
62
+
63
+ const howToSchema: WithContext<HowTo> = {
64
+ '@context': 'https://schema.org',
65
+ '@type': 'HowTo',
66
+ name: title,
67
+ description,
68
+ step: howToData.map((step) => ({
69
+ '@type': 'HowToStep',
70
+ name: step.name,
71
+ text: step.text,
72
+ })),
73
+ };
74
+
75
+ const appSchema: WithContext<SoftwareApplication> = {
76
+ '@context': 'https://schema.org',
77
+ '@type': 'SoftwareApplication',
78
+ name: title,
79
+ description,
80
+ applicationCategory: 'UtilityApplication',
81
+ operatingSystem: 'All',
82
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'KRW' },
83
+ inLanguage: 'ko',
84
+ };
85
+
86
+ export const content: ToolLocaleContent<QRGeneratorUI> = {
87
+ slug,
88
+ title,
66
89
  description,
67
- step: howToData.map((step) => ({
68
- '@type': 'HowToStep',
69
- name: step.name,
70
- text: step.text,
71
- })),
72
- };
73
-
74
- const appSchema: WithContext<SoftwareApplication> = {
75
- '@context': 'https://schema.org',
76
- '@type': 'SoftwareApplication',
77
- name: title,
78
- description,
79
- applicationCategory: 'UtilityApplication',
80
- operatingSystem: 'All',
81
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'KRW' },
82
- inLanguage: 'ko',
83
- };
84
-
85
- export const content: ToolLocaleContent<QRGeneratorUI> = {
86
- slug,
87
- title,
88
- description,
89
- faqTitle: '자주 묻는 질문',
90
- faq: faqData,
91
- bibliographyTitle: '참고 자료',
92
- bibliography: [
93
- { name: 'node-qrcode 라이브러리', url: 'https://github.com/soldair/node-qrcode' },
94
- { name: 'vCard 표준 규격 (RFC 6350)', url: 'https://www.rfc-editor.org/rfc/rfc6350' },
95
- ],
96
- howTo: howToData,
97
- schemas: [faqSchema, howToSchema, appSchema],
98
- seo: [
99
- {
100
- type: 'title',
101
- text: '개인정보 보호 최우선: 로컬에서 생성',
102
- level: 2,
103
- },
104
- {
105
- type: 'paragraph',
106
- html: '이 도구는 기기 내에서 직접 QR 코드를 생성합니다. <strong>WiFi 비밀번호</strong>나 <strong>개인 정보</strong>가 외부로 유출될 걱정이 없습니다.',
107
- },
108
- {
109
- type: 'stats',
110
- items: [
111
- { value: '100%', label: '보안 완벽', icon: 'mdi:shield-lock' },
112
- { value: '오프라인', label: '서버 무관', icon: 'mdi:wifi-off' },
113
- { value: 'PNG', label: '이미지 저장', icon: 'mdi:download' },
114
- ],
115
- columns: 3,
116
- },
117
- {
118
- type: 'summary',
119
- title: '사용 ',
120
- items: [
121
- '모든 데이터는 브라우저 안에서만 처리됩니다.',
122
- 'WiFi 이름(SSID)과 비밀번호는 대소문자를 구분합니다.',
123
- '정적 QR은 비밀번호가 바뀌면 새로 생성해야 합니다.',
124
- '인쇄하기 전에 항상 화면을 직접 스캔하여 테스트하세요.',
125
- ],
126
- },
127
- ],
128
- ui: {
129
- tabWifi: 'WiFi',
130
- tabUrl: 'URL',
131
- tabContact: '연락처',
132
- labelSsid: '네트워크 이름(SSID)',
133
- labelPassword: '비밀번호',
134
- labelEncryption: '보안 방식',
135
- labelHidden: '숨겨진 네트워크',
136
- labelUrl: '웹사이트 주소(URL)',
137
- labelName: '이름',
138
- labelSurname: '성',
139
- labelPhone: '전화번호',
140
- labelEmail: '이메일',
141
- labelOrg: '조직/회사명',
142
- encWpa: 'WPA/WPA2',
143
- encWep: 'WEP',
144
- encNone: '없음',
145
- downloadBtn: 'PNG 저장',
146
- privacyMsg: '브라우저 내에서 100% 생성. 데이터는 안전합니다.',
147
- placeholderSsid: '우리집WiFi_5G',
148
- placeholderUrl: 'https://example.com',
149
- placeholderPassword: '••••••••',
150
- },
151
- };
90
+ faq: faqData,
91
+ bibliography,
92
+ howTo: howToData,
93
+ schemas: [faqSchema, howToSchema, appSchema],
94
+ seo: [
95
+ {
96
+ type: 'title',
97
+ text: '개인정보 보호 최우선: 로컬에서 생성',
98
+ level: 2,
99
+ },
100
+ {
101
+ type: 'paragraph',
102
+ html: '이 도구는 기기 내에서 직접 QR 코드를 생성합니다. <strong>WiFi 비밀번호</strong>나 <strong>개인 정보</strong>가 외부로 유출될 걱정이 없습니다.',
103
+ },
104
+ {
105
+ type: 'stats',
106
+ items: [
107
+ { value: '100%', label: '보안 완벽', icon: 'mdi:shield-lock' },
108
+ { value: '오프라인', label: '서버 무관', icon: 'mdi:wifi-off' },
109
+ { value: 'PNG', label: '이미지 저장', icon: 'mdi:download' },
110
+ ],
111
+ columns: 3,
112
+ },
113
+ {
114
+ type: 'summary',
115
+ title: '사용 팁',
116
+ items: [
117
+ '모든 데이터는 브라우저 안에서만 처리됩니다.',
118
+ 'WiFi 이름(SSID)과 비밀번호는 대소문자를 구분합니다.',
119
+ '정적 QR은 비밀번호가 바뀌면 새로 생성해야 합니다.',
120
+ '인쇄하기 전에 항상 화면을 직접 스캔하여 테스트하세요.',
121
+ ],
122
+ },
123
+ ],
124
+ ui: {
125
+ tabWifi: 'WiFi',
126
+ tabUrl: 'URL',
127
+ tabContact: '연락처',
128
+ labelSsid: '네트워크 이름(SSID)',
129
+ labelPassword: '비밀번호',
130
+ labelEncryption: '보안 방식',
131
+ labelHidden: '숨겨진 네트워크',
132
+ labelUrl: '웹사이트 주소(URL)',
133
+ labelName: '이름',
134
+ labelSurname: '',
135
+ labelPhone: '전화번호',
136
+ labelEmail: '이메일',
137
+ labelOrg: '조직/회사명',
138
+ encWpa: 'WPA/WPA2',
139
+ encWep: 'WEP',
140
+ encNone: '없음',
141
+ downloadBtn: 'PNG 저장',
142
+ privacyMsg: '브라우저 내에서 100% 생성. 데이터는 안전합니다.',
143
+ placeholderSsid: '우리집WiFi_5G',
144
+ placeholderUrl: 'https://example.com',
145
+ placeholderPassword: '••••••••',
146
+ },
147
+ };