@jjlmoya/utils-home 1.5.0 → 1.7.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 +61 -60
- package/src/tests/i18n_coverage.test.ts +36 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tool/dewPointCalculator/i18n/de.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/en.ts +1 -1
- package/src/tool/dewPointCalculator/i18n/es.ts +1 -1
- package/src/tool/dewPointCalculator/i18n/fr.ts +1 -1
- package/src/tool/dewPointCalculator/i18n/id.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/it.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/ja.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/ko.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/nl.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/pl.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/pt.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/ru.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/sv.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/tr.ts +178 -0
- package/src/tool/dewPointCalculator/i18n/zh.ts +178 -0
- package/src/tool/dewPointCalculator/index.ts +16 -6
- package/src/tool/heatingComparator/i18n/de.ts +340 -0
- package/src/tool/heatingComparator/i18n/es.ts +1 -1
- package/src/tool/heatingComparator/i18n/id.ts +324 -0
- package/src/tool/heatingComparator/i18n/it.ts +336 -0
- package/src/tool/heatingComparator/i18n/ja.ts +311 -0
- package/src/tool/heatingComparator/i18n/ko.ts +307 -0
- package/src/tool/heatingComparator/i18n/nl.ts +336 -0
- package/src/tool/heatingComparator/i18n/pl.ts +311 -0
- package/src/tool/heatingComparator/i18n/pt.ts +336 -0
- package/src/tool/heatingComparator/i18n/ru.ts +307 -0
- package/src/tool/heatingComparator/i18n/sv.ts +311 -0
- package/src/tool/heatingComparator/i18n/tr.ts +324 -0
- package/src/tool/heatingComparator/i18n/zh.ts +307 -0
- package/src/tool/heatingComparator/index.ts +13 -1
- package/src/tool/ledSavingCalculator/i18n/de.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/fr.ts +1 -1
- package/src/tool/ledSavingCalculator/i18n/id.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/it.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/ja.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/ko.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/nl.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/pl.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/pt.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/ru.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/sv.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/tr.ts +208 -0
- package/src/tool/ledSavingCalculator/i18n/zh.ts +208 -0
- package/src/tool/ledSavingCalculator/index.ts +16 -7
- package/src/tool/projectorCalculator/i18n/de.ts +180 -0
- package/src/tool/projectorCalculator/i18n/fr.ts +1 -1
- package/src/tool/projectorCalculator/i18n/id.ts +181 -0
- package/src/tool/projectorCalculator/i18n/it.ts +180 -0
- package/src/tool/projectorCalculator/i18n/ja.ts +180 -0
- package/src/tool/projectorCalculator/i18n/ko.ts +180 -0
- package/src/tool/projectorCalculator/i18n/nl.ts +180 -0
- package/src/tool/projectorCalculator/i18n/pl.ts +180 -0
- package/src/tool/projectorCalculator/i18n/pt.ts +180 -0
- package/src/tool/projectorCalculator/i18n/ru.ts +180 -0
- package/src/tool/projectorCalculator/i18n/sv.ts +180 -0
- package/src/tool/projectorCalculator/i18n/tr.ts +180 -0
- package/src/tool/projectorCalculator/i18n/zh.ts +180 -0
- package/src/tool/projectorCalculator/index.ts +15 -6
- package/src/tool/qrGenerator/i18n/de.ts +203 -0
- package/src/tool/qrGenerator/i18n/id.ts +151 -0
- package/src/tool/qrGenerator/i18n/it.ts +174 -0
- package/src/tool/qrGenerator/i18n/ja.ts +151 -0
- package/src/tool/qrGenerator/i18n/ko.ts +151 -0
- package/src/tool/qrGenerator/i18n/nl.ts +151 -0
- package/src/tool/qrGenerator/i18n/pl.ts +151 -0
- package/src/tool/qrGenerator/i18n/pt.ts +151 -0
- package/src/tool/qrGenerator/i18n/ru.ts +151 -0
- package/src/tool/qrGenerator/i18n/sv.ts +151 -0
- package/src/tool/qrGenerator/i18n/tr.ts +151 -0
- package/src/tool/qrGenerator/i18n/zh.ts +151 -0
- package/src/tool/qrGenerator/index.ts +17 -9
- package/src/tool/solarCalculator/i18n/de.ts +146 -0
- package/src/tool/solarCalculator/i18n/id.ts +126 -0
- package/src/tool/solarCalculator/i18n/it.ts +126 -0
- package/src/tool/solarCalculator/i18n/ja.ts +126 -0
- package/src/tool/solarCalculator/i18n/ko.ts +121 -0
- package/src/tool/solarCalculator/i18n/nl.ts +120 -0
- package/src/tool/solarCalculator/i18n/pl.ts +121 -0
- package/src/tool/solarCalculator/i18n/pt.ts +126 -0
- package/src/tool/solarCalculator/i18n/ru.ts +110 -0
- package/src/tool/solarCalculator/i18n/sv.ts +110 -0
- package/src/tool/solarCalculator/i18n/tr.ts +120 -0
- package/src/tool/solarCalculator/i18n/zh.ts +121 -0
- package/src/tool/solarCalculator/index.ts +17 -9
- package/src/tool/tariffComparator/i18n/de.ts +133 -0
- package/src/tool/tariffComparator/i18n/id.ts +133 -0
- package/src/tool/tariffComparator/i18n/it.ts +133 -0
- package/src/tool/tariffComparator/i18n/ja.ts +133 -0
- package/src/tool/tariffComparator/i18n/ko.ts +133 -0
- package/src/tool/tariffComparator/i18n/nl.ts +133 -0
- package/src/tool/tariffComparator/i18n/pl.ts +133 -0
- package/src/tool/tariffComparator/i18n/pt.ts +133 -0
- package/src/tool/tariffComparator/i18n/ru.ts +106 -0
- package/src/tool/tariffComparator/i18n/sv.ts +111 -0
- package/src/tool/tariffComparator/i18n/tr.ts +133 -0
- package/src/tool/tariffComparator/i18n/zh.ts +133 -0
- package/src/tool/tariffComparator/index.ts +16 -7
- package/src/types.ts +1 -1
|
@@ -0,0 +1,203 @@
|
|
|
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 = 'offline-qr-code-generator-de';
|
|
6
|
+
const title = 'Offline QR Code Generator';
|
|
7
|
+
const description =
|
|
8
|
+
'Erstellen Sie QR-Codes für WLAN, URLs und Kontakte 100 % sicher in Ihrem Browser. Ihre Daten verlassen niemals Ihr Gerät.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Laufen diese QR-Codes ab?',
|
|
13
|
+
answer:
|
|
14
|
+
'Nein. Die hier generierten Codes sind statisch. Die Informationen sind direkt im Bild kodiert und hängen nicht von externen Links ab. Sie funktionieren für immer.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Werden meine Daten gespeichert?',
|
|
18
|
+
answer:
|
|
19
|
+
'Absolut nicht. Der gesamte Prozess findet in Ihrem Browser statt (Client-Side). Es werden keine Daten an unsere Server gesendet. Es ist 100 % privat und sicher.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Funktioniert es auf iPhone und Android?',
|
|
23
|
+
answer:
|
|
24
|
+
'Ja. Die meisten modernen Kameras von iOS und Android lesen QR-Codes nativ und schlagen die entsprechende Aktion vor (WLAN verbinden, Link öffnen etc.).',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Kann ich es ohne Internet verwenden?',
|
|
28
|
+
answer:
|
|
29
|
+
'Ja. Sobald die Seite geladen ist, können Sie das Internet trennen. Der Generator arbeitet vollständig lokal in Ihrem Browser.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Typ wählen',
|
|
36
|
+
text: 'Wählen Sie, ob Sie einen Code für WLAN, eine URL oder einen Kontakt (vCard) erstellen möchten.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Daten eingeben',
|
|
40
|
+
text: 'Füllen Sie die Felder aus, wie z. B. Netzwerkname und Passwort oder die Webadresse.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Generieren und prüfen',
|
|
44
|
+
text: 'Der Code wird sofort erstellt. Testen Sie ihn direkt durch Scannen vom Bildschirm.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Herunterladen',
|
|
48
|
+
text: 'Speichern Sie den QR-Code als Bilddatei (.webp), um ihn zu drucken oder digital zu teilen.',
|
|
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,
|
|
66
|
+
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: 'EUR' },
|
|
82
|
+
inLanguage: 'de',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent<QRGeneratorUI> = {
|
|
86
|
+
slug,
|
|
87
|
+
title,
|
|
88
|
+
description,
|
|
89
|
+
faqTitle: 'Häufig gestellte Fragen',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliographyTitle: 'Quellen',
|
|
92
|
+
bibliography: [
|
|
93
|
+
{
|
|
94
|
+
name: 'node-qrcode: QR-Code Generator Bibliothek',
|
|
95
|
+
url: 'https://github.com/soldair/node-qrcode',
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'RFC 6350: vCard Format Spezifikation',
|
|
99
|
+
url: 'https://www.rfc-editor.org/rfc/rfc6350',
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
howTo: howToData,
|
|
103
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
104
|
+
seo: [
|
|
105
|
+
{
|
|
106
|
+
type: 'title',
|
|
107
|
+
text: 'Warum Offline? Datenschutz an erster Stelle',
|
|
108
|
+
level: 2,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'paragraph',
|
|
112
|
+
html: 'Die meisten Online-QR-Generatoren senden Ihre Daten an einen Server. Dies ist ein Risiko, besonders bei <strong>WLAN-Passwörtern</strong> oder <strong>persönlichen Daten</strong>. Dieses Tool nutzt JavaScript, um den Code direkt auf Ihrem Gerät zu erzeugen.',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: 'stats',
|
|
116
|
+
items: [
|
|
117
|
+
{ value: '100%', label: 'Privat', icon: 'mdi:shield-lock' },
|
|
118
|
+
{ value: 'Offline', label: 'Kein Server', icon: 'mdi:wifi-off' },
|
|
119
|
+
{ value: 'WebP', label: 'Download', icon: 'mdi:download' },
|
|
120
|
+
],
|
|
121
|
+
columns: 3,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
type: 'diagnostic',
|
|
125
|
+
variant: 'success',
|
|
126
|
+
title: 'Open Source und Transparent',
|
|
127
|
+
icon: 'mdi:github',
|
|
128
|
+
badge: 'Open Source',
|
|
129
|
+
html: '<p>Der Code dieses Tools ist zu 100 % Open Source. Sie können prüfen, wie er funktioniert, oder ihn herunterladen, um ihn ohne Internet auszuführen.</p>',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
type: 'title',
|
|
133
|
+
text: 'Anwendungsfälle',
|
|
134
|
+
level: 3,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
type: 'comparative',
|
|
138
|
+
items: [
|
|
139
|
+
{
|
|
140
|
+
title: 'WLAN QR',
|
|
141
|
+
description: 'Teilen Sie Ihr WLAN mit Gästen, ohne das Passwort diktieren zu müssen.',
|
|
142
|
+
icon: 'mdi:wifi',
|
|
143
|
+
points: ['Kompatibel mit iOS und Android', 'Unterstützt WPA2, WEP und offene Netze'],
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
title: 'URL QR',
|
|
147
|
+
description: 'Wandeln Sie Web Links in scanbare Codes um. Ideal für Flyer oder Visitenkarten.',
|
|
148
|
+
icon: 'mdi:link',
|
|
149
|
+
points: ['Jede gültige URL', 'Kein Ablaufdatum'],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
title: 'vCard QR',
|
|
153
|
+
description: 'Digitale Visitenkarte. Beim Scannen wird der Kontakt direkt im Adressbuch vorgeschlagen.',
|
|
154
|
+
icon: 'mdi:card-account-details',
|
|
155
|
+
points: ['Name, Nummer, E Mail, Firma', 'vCard 3.0 Standard'],
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
columns: 3,
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
type: 'glossary',
|
|
162
|
+
items: [
|
|
163
|
+
{ term: 'QR-Code', definition: '2D-Barcode, der bis zu 4.296 Zeichen speichern kann.' },
|
|
164
|
+
{ term: 'vCard', definition: 'Standardformat für digitale Visitenkarten.' },
|
|
165
|
+
{ term: 'SSID', definition: 'Der sichtbare Name eines WLAN-Netzwerks.' },
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
type: 'summary',
|
|
170
|
+
title: 'Tipps für die Nutzung',
|
|
171
|
+
items: [
|
|
172
|
+
'Alle Daten werden lokal in Ihrem Browser verarbeitet.',
|
|
173
|
+
'Achten Sie bei WLAN-Daten auf Groß- und Kleinschreibung.',
|
|
174
|
+
'Statische QR-Codes: Bei Passwortänderung neuen Code erstellen.',
|
|
175
|
+
'Laden Sie das Bild für beste Druckqualität herunter.',
|
|
176
|
+
'Testen Sie den Code vor dem Ausdrucken auf dem Bildschirm.',
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
],
|
|
180
|
+
ui: {
|
|
181
|
+
tabWifi: 'WLAN',
|
|
182
|
+
tabUrl: 'URL',
|
|
183
|
+
tabContact: 'Kontakt',
|
|
184
|
+
labelSsid: 'Netzwerkname (SSID)',
|
|
185
|
+
labelPassword: 'Passwort',
|
|
186
|
+
labelEncryption: 'Verschlüsselung',
|
|
187
|
+
labelHidden: 'Verstecktes Netz',
|
|
188
|
+
labelUrl: 'Web-Adresse (URL)',
|
|
189
|
+
labelName: 'Vorname',
|
|
190
|
+
labelSurname: 'Nachname',
|
|
191
|
+
labelPhone: 'Telefon',
|
|
192
|
+
labelEmail: 'E-Mail',
|
|
193
|
+
labelOrg: 'Organisation / Firma',
|
|
194
|
+
encWpa: 'WPA/WPA2',
|
|
195
|
+
encWep: 'WEP',
|
|
196
|
+
encNone: 'Keine',
|
|
197
|
+
downloadBtn: 'PNG herunterladen',
|
|
198
|
+
privacyMsg: 'Zu 100 % im Browser generiert. Ihre Daten bleiben bei Ihnen.',
|
|
199
|
+
placeholderSsid: 'MeinWLAN_5G',
|
|
200
|
+
placeholderUrl: 'https://beispiel.de',
|
|
201
|
+
placeholderPassword: '••••••••',
|
|
202
|
+
},
|
|
203
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
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 = 'pembuat-kode-qr-offline';
|
|
6
|
+
const title = 'Pembuat Kode QR Offline';
|
|
7
|
+
const description =
|
|
8
|
+
'Buat kode QR untuk WiFi, URL, dan Kontak secara 100% aman di browser Anda. Data Anda tidak pernah meninggalkan perangkat Anda.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Apakah kode QR ini akan kedaluwarsa?',
|
|
13
|
+
answer:
|
|
14
|
+
'Tidak. Kode yang dihasilkan di sini bersifat statis. Informasi tersebut dikodekan langsung ke dalam gambar. Kode tersebut akan berfungsi selamanya.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Apakah Anda menyimpan data saya?',
|
|
18
|
+
answer:
|
|
19
|
+
'Sama sekali tidak. Seluruh proses terjadi di browser Anda (Client-Side). Tidak ada data yang dikirim ke server kami.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Apakah ini berfungsi di iPhone dan Android?',
|
|
23
|
+
answer:
|
|
24
|
+
'Ya. Sebagian besar kamera modern di iOS dan Android membaca kode QR secara asli dan menyarankan tindakan yang sesuai (sambungkan ke WiFi, buka tautan, dll.).',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Bisakah saya menggunakannya tanpa internet?',
|
|
28
|
+
answer:
|
|
29
|
+
'Ya. Setelah halaman dimuat, Anda dapat mematikan internet dan pembuat kode QR tetap akan berfungsi dengan sempurna.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Pilih tipe QR',
|
|
36
|
+
text: 'Pilih apakah Anda ingin membuat kode untuk jaringan WiFi, tautan URL, atau kontak (vCard).',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Masukkan data',
|
|
40
|
+
text: 'Isi bidang yang diperlukan, seperti nama jaringan dan kata sandi, atau alamat web.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Buat dan periksa',
|
|
44
|
+
text: 'Kode akan dibuat secara instan. Anda dapat mencobanya dengan memindai langsung dari layar.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Unduh',
|
|
48
|
+
text: 'Simpan kode QR sebagai gambar untuk dicetak atau dibagikan secara digital.',
|
|
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,
|
|
66
|
+
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: 'IDR' },
|
|
82
|
+
inLanguage: 'id',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent<QRGeneratorUI> = {
|
|
86
|
+
slug,
|
|
87
|
+
title,
|
|
88
|
+
description,
|
|
89
|
+
faqTitle: 'Pertanyaan Umum',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliographyTitle: 'Daftar Pustaka',
|
|
92
|
+
bibliography: [
|
|
93
|
+
{ name: 'node-qrcode library', url: 'https://github.com/soldair/node-qrcode' },
|
|
94
|
+
{ name: 'RFC 6350: vCard specification', 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: 'Privasi Utama: Pembuatan Lokal',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: 'Alat ini menghasilkan kode QR langsung di perangkat Anda. Keamanan total untuk <strong>kata sandi WiFi</strong> atau <strong>data pribadi</strong> Anda.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'stats',
|
|
110
|
+
items: [
|
|
111
|
+
{ value: '100%', label: 'Privat', icon: 'mdi:shield-lock' },
|
|
112
|
+
{ value: 'Offline', label: 'Tanpa Server', icon: 'mdi:wifi-off' },
|
|
113
|
+
{ value: 'PNG', label: 'Unduh', icon: 'mdi:download' },
|
|
114
|
+
],
|
|
115
|
+
columns: 3,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'summary',
|
|
119
|
+
title: 'Tips Penggunaan',
|
|
120
|
+
items: [
|
|
121
|
+
'Data hanya diproses di browser Anda.',
|
|
122
|
+
'Perhatikan huruf besar/kecil pada nama jaringan WiFi.',
|
|
123
|
+
'Kode QR statis: jika kata sandi diubah, buat kode baru.',
|
|
124
|
+
'Selalu uji pemindaian sebelum mencetak.',
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
ui: {
|
|
129
|
+
tabWifi: 'WiFi',
|
|
130
|
+
tabUrl: 'URL',
|
|
131
|
+
tabContact: 'Kontak',
|
|
132
|
+
labelSsid: 'Nama Jaringan (SSID)',
|
|
133
|
+
labelPassword: 'Kata Sandi',
|
|
134
|
+
labelEncryption: 'Keamanan',
|
|
135
|
+
labelHidden: 'Jaringan Tersembunyi',
|
|
136
|
+
labelUrl: 'Alamat Web (URL)',
|
|
137
|
+
labelName: 'Nama Depan',
|
|
138
|
+
labelSurname: 'Nama Belakang',
|
|
139
|
+
labelPhone: 'Telepon',
|
|
140
|
+
labelEmail: 'Email',
|
|
141
|
+
labelOrg: 'Organisasi / Perusahaan',
|
|
142
|
+
encWpa: 'WPA/WPA2',
|
|
143
|
+
encWep: 'WEP',
|
|
144
|
+
encNone: 'Tidak ada',
|
|
145
|
+
downloadBtn: 'Unduh PNG',
|
|
146
|
+
privacyMsg: 'Dibuat 100% di browser Anda. Data Anda aman.',
|
|
147
|
+
placeholderSsid: 'WiFiSaya_5G',
|
|
148
|
+
placeholderUrl: 'https://contoh.com',
|
|
149
|
+
placeholderPassword: '••••••••',
|
|
150
|
+
},
|
|
151
|
+
};
|
|
@@ -0,0 +1,174 @@
|
|
|
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 = 'generatore-codici-qr-offline';
|
|
6
|
+
const title = 'Generatore di Codici QR Offline';
|
|
7
|
+
const description =
|
|
8
|
+
'Genera codici QR per WiFi, URL e Contatti in modo sicuro al 100% nel tuo browser. I tuoi dati non lasciano mai il tuo dispositivo.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Questi codici QR scadono?',
|
|
13
|
+
answer:
|
|
14
|
+
'No. I codici generati qui sono statici. Le informazioni sono codificate direttamente nell\'immagine. Funzioneranno per sempre.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Salvate i miei dati?',
|
|
18
|
+
answer:
|
|
19
|
+
'Assolutamente no. Tutto il processo avviene nel tuo browser (Client-Side). Nessun dato viene inviato ai nostri server.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Funziona su iPhone e Android?',
|
|
23
|
+
answer:
|
|
24
|
+
'Sì. La maggior parte delle fotocamere moderne di iOS e Android leggono i QR in modo nativo e suggeriscono l\'azione (connessione WiFi, apertura link, ecc.).',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Posso usarlo senza internet?',
|
|
28
|
+
answer:
|
|
29
|
+
'Sì. Una volta caricata la pagina, puoi disconnetterti e il generatore continuerà a funzionare perfettamente.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Scegli il tipo di QR',
|
|
36
|
+
text: 'Seleziona se vuoi un codice per una rete WiFi, un link URL o un contatto (vCard).',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Inserisci i dati',
|
|
40
|
+
text: 'Compila i campi necessari, come il nome della rete e la password, o l\'indirizzo web.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Genera e controlla',
|
|
44
|
+
text: 'Il codice viene generato all\'istante. Prova a scansionarlo direttamente dallo schermo.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Scarica',
|
|
48
|
+
text: 'Salva il codice QR come immagine per stamparlo o condividerlo.',
|
|
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,
|
|
66
|
+
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: 'EUR' },
|
|
82
|
+
inLanguage: 'it',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent<QRGeneratorUI> = {
|
|
86
|
+
slug,
|
|
87
|
+
title,
|
|
88
|
+
description,
|
|
89
|
+
faqTitle: 'Domande Frequenti',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliographyTitle: 'Bibliografia',
|
|
92
|
+
bibliography: [
|
|
93
|
+
{ name: 'node-qrcode library', url: 'https://github.com/soldair/node-qrcode' },
|
|
94
|
+
{ name: 'RFC 6350: vCard Specification', 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: 'Privacy al Primo Posto: Generazione Locale',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: 'A differenza di altri sistemi, questa utility genera il QR direttamente sul tuo PC o smartphone utilizzando JavaScript. 0 rischi per le tue <strong>chiavi WiFi</strong> o <strong>contatti personali</strong>.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'stats',
|
|
110
|
+
items: [
|
|
111
|
+
{ value: '100%', label: 'Privato', icon: 'mdi:shield-lock' },
|
|
112
|
+
{ value: 'Offline', label: 'No Server', icon: 'mdi:wifi-off' },
|
|
113
|
+
{ value: 'PNG', label: 'Download', icon: 'mdi:download' },
|
|
114
|
+
],
|
|
115
|
+
columns: 3,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'title',
|
|
119
|
+
text: 'Casi d\'Uso',
|
|
120
|
+
level: 3,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
type: 'comparative',
|
|
124
|
+
items: [
|
|
125
|
+
{
|
|
126
|
+
title: 'WiFi QR',
|
|
127
|
+
description: 'Condividi la tua rete con gli ospiti senza dettare la password.',
|
|
128
|
+
icon: 'mdi:wifi',
|
|
129
|
+
points: ['Compatibile con iOS/Android', 'Supporta WPA2 e WEP'],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
title: 'vCard QR',
|
|
133
|
+
description: 'Biglietto da visita digitale che si salva subito in rubrica.',
|
|
134
|
+
icon: 'mdi:card-account-details',
|
|
135
|
+
points: ['Nome, Tel, Email', 'Formato standard internazionale'],
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
columns: 2,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'summary',
|
|
142
|
+
title: 'Consigli per l\'uso',
|
|
143
|
+
items: [
|
|
144
|
+
'Dati processati solo localmente.',
|
|
145
|
+
'I nomi delle reti distinguono tra maiuscole e minuscole.',
|
|
146
|
+
'I QR sono statici: se cambi dati, rigenera il codice.',
|
|
147
|
+
'Testa il codice prima di stamparlo.',
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
ui: {
|
|
152
|
+
tabWifi: 'WiFi',
|
|
153
|
+
tabUrl: 'URL',
|
|
154
|
+
tabContact: 'Contatto',
|
|
155
|
+
labelSsid: 'Nome Rete (SSID)',
|
|
156
|
+
labelPassword: 'Password',
|
|
157
|
+
labelEncryption: 'Sicurezza',
|
|
158
|
+
labelHidden: 'Rete Nascosta',
|
|
159
|
+
labelUrl: 'Indirizzo Web (URL)',
|
|
160
|
+
labelName: 'Nome',
|
|
161
|
+
labelSurname: 'Cognome',
|
|
162
|
+
labelPhone: 'Telefono',
|
|
163
|
+
labelEmail: 'Email',
|
|
164
|
+
labelOrg: 'Azienda',
|
|
165
|
+
encWpa: 'WPA/WPA2',
|
|
166
|
+
encWep: 'WEP',
|
|
167
|
+
encNone: 'Nessuna',
|
|
168
|
+
downloadBtn: 'Scarica PNG',
|
|
169
|
+
privacyMsg: 'Generato 100% nel browser. Dati sicuri.',
|
|
170
|
+
placeholderSsid: 'MiaRete_5G',
|
|
171
|
+
placeholderUrl: 'https://esempio.it',
|
|
172
|
+
placeholderPassword: '••••••••',
|
|
173
|
+
},
|
|
174
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
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,
|
|
66
|
+
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
|
+
};
|