@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.
- package/package.json +1 -1
- package/src/category/i18n/de.ts +10 -10
- package/src/category/i18n/en.ts +8 -8
- package/src/category/i18n/es.ts +2 -2
- package/src/category/i18n/fr.ts +15 -15
- package/src/category/i18n/id.ts +8 -8
- package/src/category/i18n/it.ts +7 -7
- package/src/category/i18n/nl.ts +8 -8
- package/src/category/i18n/pl.ts +10 -10
- package/src/category/i18n/pt.ts +8 -8
- package/src/category/i18n/ru.ts +10 -10
- package/src/category/i18n/sv.ts +8 -8
- package/src/category/i18n/tr.ts +4 -4
- package/src/category/i18n/zh.ts +8 -8
- package/src/entries.ts +4 -1
- package/src/pages/[locale]/[slug].astro +28 -12
- package/src/tests/locale_completeness.test.ts +4 -22
- package/src/tests/no_en_dash.test.ts +70 -0
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/dewPointCalculator/bibliography.ts +10 -0
- package/src/tool/dewPointCalculator/i18n/de.ts +7 -17
- package/src/tool/dewPointCalculator/i18n/en.ts +8 -18
- package/src/tool/dewPointCalculator/i18n/es.ts +7 -17
- package/src/tool/dewPointCalculator/i18n/fr.ts +8 -18
- package/src/tool/dewPointCalculator/i18n/id.ts +7 -17
- package/src/tool/dewPointCalculator/i18n/it.ts +7 -17
- package/src/tool/dewPointCalculator/i18n/ja.ts +6 -16
- package/src/tool/dewPointCalculator/i18n/ko.ts +6 -16
- package/src/tool/dewPointCalculator/i18n/nl.ts +7 -17
- package/src/tool/dewPointCalculator/i18n/pl.ts +7 -17
- package/src/tool/dewPointCalculator/i18n/pt.ts +7 -17
- package/src/tool/dewPointCalculator/i18n/ru.ts +13 -23
- package/src/tool/dewPointCalculator/i18n/sv.ts +7 -17
- package/src/tool/dewPointCalculator/i18n/tr.ts +6 -16
- package/src/tool/dewPointCalculator/i18n/zh.ts +7 -17
- package/src/tool/dewPointCalculator/seo.astro +2 -1
- package/src/tool/heatingComparator/bibliography.ts +14 -0
- package/src/tool/heatingComparator/i18n/de.ts +10 -24
- package/src/tool/heatingComparator/i18n/en.ts +3 -13
- package/src/tool/heatingComparator/i18n/es.ts +3 -17
- package/src/tool/heatingComparator/i18n/fr.ts +9 -19
- package/src/tool/heatingComparator/i18n/id.ts +3 -17
- package/src/tool/heatingComparator/i18n/it.ts +3 -17
- package/src/tool/heatingComparator/i18n/ja.ts +296 -310
- package/src/tool/heatingComparator/i18n/ko.ts +296 -306
- package/src/tool/heatingComparator/i18n/nl.ts +3 -17
- package/src/tool/heatingComparator/i18n/pl.ts +3 -17
- package/src/tool/heatingComparator/i18n/pt.ts +3 -17
- package/src/tool/heatingComparator/i18n/ru.ts +14 -24
- package/src/tool/heatingComparator/i18n/sv.ts +6 -20
- package/src/tool/heatingComparator/i18n/tr.ts +2 -16
- package/src/tool/heatingComparator/i18n/zh.ts +296 -306
- package/src/tool/heatingComparator/seo.astro +3 -3
- package/src/tool/ledSavingCalculator/bibliography.ts +14 -0
- package/src/tool/ledSavingCalculator/i18n/de.ts +6 -16
- package/src/tool/ledSavingCalculator/i18n/en.ts +6 -20
- package/src/tool/ledSavingCalculator/i18n/es.ts +6 -20
- package/src/tool/ledSavingCalculator/i18n/fr.ts +10 -24
- package/src/tool/ledSavingCalculator/i18n/id.ts +5 -15
- package/src/tool/ledSavingCalculator/i18n/it.ts +6 -16
- package/src/tool/ledSavingCalculator/i18n/ja.ts +5 -15
- package/src/tool/ledSavingCalculator/i18n/ko.ts +4 -14
- package/src/tool/ledSavingCalculator/i18n/nl.ts +5 -15
- package/src/tool/ledSavingCalculator/i18n/pl.ts +5 -15
- package/src/tool/ledSavingCalculator/i18n/pt.ts +5 -15
- package/src/tool/ledSavingCalculator/i18n/ru.ts +8 -18
- package/src/tool/ledSavingCalculator/i18n/sv.ts +5 -15
- package/src/tool/ledSavingCalculator/i18n/tr.ts +5 -15
- package/src/tool/ledSavingCalculator/i18n/zh.ts +6 -16
- package/src/tool/ledSavingCalculator/seo.astro +2 -1
- package/src/tool/projectorCalculator/bibliography.ts +5 -0
- package/src/tool/projectorCalculator/i18n/de.ts +4 -8
- package/src/tool/projectorCalculator/i18n/en.ts +3 -8
- package/src/tool/projectorCalculator/i18n/es.ts +4 -9
- package/src/tool/projectorCalculator/i18n/fr.ts +6 -11
- package/src/tool/projectorCalculator/i18n/id.ts +4 -9
- package/src/tool/projectorCalculator/i18n/it.ts +4 -8
- package/src/tool/projectorCalculator/i18n/ja.ts +175 -179
- package/src/tool/projectorCalculator/i18n/ko.ts +175 -179
- package/src/tool/projectorCalculator/i18n/nl.ts +4 -8
- package/src/tool/projectorCalculator/i18n/pl.ts +5 -9
- package/src/tool/projectorCalculator/i18n/pt.ts +4 -8
- package/src/tool/projectorCalculator/i18n/ru.ts +7 -11
- package/src/tool/projectorCalculator/i18n/sv.ts +4 -8
- package/src/tool/projectorCalculator/i18n/tr.ts +4 -8
- package/src/tool/projectorCalculator/i18n/zh.ts +175 -179
- package/src/tool/projectorCalculator/seo.astro +2 -1
- package/src/tool/qrGenerator/bibliography.ts +14 -0
- package/src/tool/qrGenerator/i18n/de.ts +192 -202
- package/src/tool/qrGenerator/i18n/en.ts +3 -17
- package/src/tool/qrGenerator/i18n/es.ts +2 -16
- package/src/tool/qrGenerator/i18n/fr.ts +3 -17
- package/src/tool/qrGenerator/i18n/id.ts +146 -150
- package/src/tool/qrGenerator/i18n/it.ts +169 -173
- package/src/tool/qrGenerator/i18n/ja.ts +146 -150
- package/src/tool/qrGenerator/i18n/ko.ts +146 -150
- package/src/tool/qrGenerator/i18n/nl.ts +146 -150
- package/src/tool/qrGenerator/i18n/pl.ts +146 -150
- package/src/tool/qrGenerator/i18n/pt.ts +146 -150
- package/src/tool/qrGenerator/i18n/ru.ts +146 -150
- package/src/tool/qrGenerator/i18n/sv.ts +146 -150
- package/src/tool/qrGenerator/i18n/tr.ts +146 -150
- package/src/tool/qrGenerator/i18n/zh.ts +146 -150
- package/src/tool/qrGenerator/seo.astro +2 -1
- package/src/tool/solarCalculator/bibliography.ts +5 -0
- package/src/tool/solarCalculator/i18n/de.ts +141 -145
- package/src/tool/solarCalculator/i18n/en.ts +7 -12
- package/src/tool/solarCalculator/i18n/es.ts +5 -10
- package/src/tool/solarCalculator/i18n/fr.ts +8 -13
- package/src/tool/solarCalculator/i18n/id.ts +4 -8
- package/src/tool/solarCalculator/i18n/it.ts +4 -8
- package/src/tool/solarCalculator/i18n/ja.ts +121 -125
- package/src/tool/solarCalculator/i18n/ko.ts +116 -120
- package/src/tool/solarCalculator/i18n/nl.ts +4 -7
- package/src/tool/solarCalculator/i18n/pl.ts +5 -9
- package/src/tool/solarCalculator/i18n/pt.ts +4 -8
- package/src/tool/solarCalculator/i18n/ru.ts +7 -10
- package/src/tool/solarCalculator/i18n/sv.ts +4 -7
- package/src/tool/solarCalculator/i18n/tr.ts +4 -7
- package/src/tool/solarCalculator/i18n/zh.ts +116 -120
- package/src/tool/solarCalculator/seo.astro +2 -1
- package/src/tool/tariffComparator/bibliography.ts +7 -0
- package/src/tool/tariffComparator/i18n/de.ts +129 -132
- package/src/tool/tariffComparator/i18n/en.ts +5 -12
- package/src/tool/tariffComparator/i18n/es.ts +5 -12
- package/src/tool/tariffComparator/i18n/fr.ts +8 -15
- package/src/tool/tariffComparator/i18n/id.ts +2 -5
- package/src/tool/tariffComparator/i18n/it.ts +2 -5
- package/src/tool/tariffComparator/i18n/ja.ts +129 -132
- package/src/tool/tariffComparator/i18n/ko.ts +129 -132
- package/src/tool/tariffComparator/i18n/nl.ts +2 -5
- package/src/tool/tariffComparator/i18n/pl.ts +3 -6
- package/src/tool/tariffComparator/i18n/pt.ts +2 -5
- package/src/tool/tariffComparator/i18n/ru.ts +2 -5
- package/src/tool/tariffComparator/i18n/sv.ts +2 -5
- package/src/tool/tariffComparator/i18n/tr.ts +2 -5
- package/src/tool/tariffComparator/i18n/zh.ts +129 -132
- package/src/tool/tariffComparator/seo.astro +2 -1
- package/src/tool/wifiRangeSimulator/bibliography.astro +14 -0
- package/src/tool/wifiRangeSimulator/bibliography.ts +14 -0
- package/src/tool/wifiRangeSimulator/component.astro +170 -0
- package/src/tool/wifiRangeSimulator/entry.ts +29 -0
- package/src/tool/wifiRangeSimulator/i18n/de.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/en.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/es.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/fr.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/id.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/it.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/ja.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/ko.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/nl.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/pl.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/pt.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/ru.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/sv.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/tr.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n/zh.ts +477 -0
- package/src/tool/wifiRangeSimulator/i18n-utils.ts +14 -0
- package/src/tool/wifiRangeSimulator/index.ts +8 -0
- package/src/tool/wifiRangeSimulator/logic.ts +220 -0
- package/src/tool/wifiRangeSimulator/seo.astro +15 -0
- package/src/tool/wifiRangeSimulator/sketch-actions.ts +168 -0
- package/src/tool/wifiRangeSimulator/sketch-events.ts +138 -0
- package/src/tool/wifiRangeSimulator/sketch-render-dash.ts +170 -0
- package/src/tool/wifiRangeSimulator/sketch-render-device.ts +42 -0
- package/src/tool/wifiRangeSimulator/sketch-render.ts +155 -0
- package/src/tool/wifiRangeSimulator/sketch-state.ts +186 -0
- package/src/tool/wifiRangeSimulator/sketch.ts +100 -0
- package/src/tool/wifiRangeSimulator/ui.ts +69 -0
- package/src/tool/wifiRangeSimulator/wifi-range-simulator.css +583 -0
- package/src/tools.ts +2 -0
- 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
|
-
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
'@
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
'@
|
|
65
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
'@
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
'@
|
|
65
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
+
};
|