@jjlmoya/utils-home 1.16.0 → 1.17.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 (125) hide show
  1. package/package.json +1 -1
  2. package/src/pages/[locale]/[slug].astro +28 -12
  3. package/src/tests/locale_completeness.test.ts +2 -20
  4. package/src/tests/shared-test-helpers.ts +56 -0
  5. package/src/tests/tool_exports.test.ts +34 -0
  6. package/src/tool/dewPointCalculator/bibliography.ts +10 -0
  7. package/src/tool/dewPointCalculator/i18n/de.ts +2 -12
  8. package/src/tool/dewPointCalculator/i18n/en.ts +2 -12
  9. package/src/tool/dewPointCalculator/i18n/es.ts +2 -12
  10. package/src/tool/dewPointCalculator/i18n/fr.ts +2 -12
  11. package/src/tool/dewPointCalculator/i18n/id.ts +2 -12
  12. package/src/tool/dewPointCalculator/i18n/it.ts +2 -12
  13. package/src/tool/dewPointCalculator/i18n/ja.ts +2 -12
  14. package/src/tool/dewPointCalculator/i18n/ko.ts +2 -12
  15. package/src/tool/dewPointCalculator/i18n/nl.ts +2 -12
  16. package/src/tool/dewPointCalculator/i18n/pl.ts +2 -12
  17. package/src/tool/dewPointCalculator/i18n/pt.ts +2 -12
  18. package/src/tool/dewPointCalculator/i18n/ru.ts +2 -12
  19. package/src/tool/dewPointCalculator/i18n/sv.ts +2 -12
  20. package/src/tool/dewPointCalculator/i18n/tr.ts +2 -12
  21. package/src/tool/dewPointCalculator/i18n/zh.ts +2 -12
  22. package/src/tool/dewPointCalculator/seo.astro +2 -1
  23. package/src/tool/heatingComparator/bibliography.ts +14 -0
  24. package/src/tool/heatingComparator/i18n/de.ts +2 -16
  25. package/src/tool/heatingComparator/i18n/en.ts +2 -12
  26. package/src/tool/heatingComparator/i18n/es.ts +2 -16
  27. package/src/tool/heatingComparator/i18n/fr.ts +2 -12
  28. package/src/tool/heatingComparator/i18n/id.ts +2 -16
  29. package/src/tool/heatingComparator/i18n/it.ts +2 -16
  30. package/src/tool/heatingComparator/i18n/ja.ts +296 -310
  31. package/src/tool/heatingComparator/i18n/ko.ts +296 -306
  32. package/src/tool/heatingComparator/i18n/nl.ts +2 -16
  33. package/src/tool/heatingComparator/i18n/pl.ts +2 -16
  34. package/src/tool/heatingComparator/i18n/pt.ts +2 -16
  35. package/src/tool/heatingComparator/i18n/ru.ts +2 -12
  36. package/src/tool/heatingComparator/i18n/sv.ts +2 -16
  37. package/src/tool/heatingComparator/i18n/tr.ts +2 -16
  38. package/src/tool/heatingComparator/i18n/zh.ts +296 -306
  39. package/src/tool/heatingComparator/seo.astro +3 -3
  40. package/src/tool/ledSavingCalculator/bibliography.ts +14 -0
  41. package/src/tool/ledSavingCalculator/i18n/de.ts +2 -12
  42. package/src/tool/ledSavingCalculator/i18n/en.ts +2 -16
  43. package/src/tool/ledSavingCalculator/i18n/es.ts +2 -16
  44. package/src/tool/ledSavingCalculator/i18n/fr.ts +2 -16
  45. package/src/tool/ledSavingCalculator/i18n/id.ts +2 -12
  46. package/src/tool/ledSavingCalculator/i18n/it.ts +2 -12
  47. package/src/tool/ledSavingCalculator/i18n/ja.ts +2 -12
  48. package/src/tool/ledSavingCalculator/i18n/ko.ts +2 -12
  49. package/src/tool/ledSavingCalculator/i18n/nl.ts +2 -12
  50. package/src/tool/ledSavingCalculator/i18n/pl.ts +2 -12
  51. package/src/tool/ledSavingCalculator/i18n/pt.ts +2 -12
  52. package/src/tool/ledSavingCalculator/i18n/ru.ts +2 -12
  53. package/src/tool/ledSavingCalculator/i18n/sv.ts +2 -12
  54. package/src/tool/ledSavingCalculator/i18n/tr.ts +2 -12
  55. package/src/tool/ledSavingCalculator/i18n/zh.ts +2 -12
  56. package/src/tool/ledSavingCalculator/seo.astro +2 -1
  57. package/src/tool/projectorCalculator/bibliography.ts +5 -0
  58. package/src/tool/projectorCalculator/i18n/de.ts +2 -6
  59. package/src/tool/projectorCalculator/i18n/en.ts +2 -7
  60. package/src/tool/projectorCalculator/i18n/es.ts +2 -7
  61. package/src/tool/projectorCalculator/i18n/fr.ts +2 -7
  62. package/src/tool/projectorCalculator/i18n/id.ts +2 -7
  63. package/src/tool/projectorCalculator/i18n/it.ts +2 -6
  64. package/src/tool/projectorCalculator/i18n/ja.ts +175 -179
  65. package/src/tool/projectorCalculator/i18n/ko.ts +175 -179
  66. package/src/tool/projectorCalculator/i18n/nl.ts +2 -6
  67. package/src/tool/projectorCalculator/i18n/pl.ts +2 -6
  68. package/src/tool/projectorCalculator/i18n/pt.ts +2 -6
  69. package/src/tool/projectorCalculator/i18n/ru.ts +2 -6
  70. package/src/tool/projectorCalculator/i18n/sv.ts +2 -6
  71. package/src/tool/projectorCalculator/i18n/tr.ts +2 -6
  72. package/src/tool/projectorCalculator/i18n/zh.ts +175 -179
  73. package/src/tool/projectorCalculator/seo.astro +2 -1
  74. package/src/tool/qrGenerator/bibliography.ts +14 -0
  75. package/src/tool/qrGenerator/i18n/de.ts +192 -202
  76. package/src/tool/qrGenerator/i18n/en.ts +2 -16
  77. package/src/tool/qrGenerator/i18n/es.ts +2 -16
  78. package/src/tool/qrGenerator/i18n/fr.ts +2 -16
  79. package/src/tool/qrGenerator/i18n/id.ts +146 -150
  80. package/src/tool/qrGenerator/i18n/it.ts +169 -173
  81. package/src/tool/qrGenerator/i18n/ja.ts +146 -150
  82. package/src/tool/qrGenerator/i18n/ko.ts +146 -150
  83. package/src/tool/qrGenerator/i18n/nl.ts +146 -150
  84. package/src/tool/qrGenerator/i18n/pl.ts +146 -150
  85. package/src/tool/qrGenerator/i18n/pt.ts +146 -150
  86. package/src/tool/qrGenerator/i18n/ru.ts +146 -150
  87. package/src/tool/qrGenerator/i18n/sv.ts +146 -150
  88. package/src/tool/qrGenerator/i18n/tr.ts +146 -150
  89. package/src/tool/qrGenerator/i18n/zh.ts +146 -150
  90. package/src/tool/qrGenerator/seo.astro +2 -1
  91. package/src/tool/solarCalculator/bibliography.ts +5 -0
  92. package/src/tool/solarCalculator/i18n/de.ts +141 -145
  93. package/src/tool/solarCalculator/i18n/en.ts +2 -7
  94. package/src/tool/solarCalculator/i18n/es.ts +2 -7
  95. package/src/tool/solarCalculator/i18n/fr.ts +2 -7
  96. package/src/tool/solarCalculator/i18n/id.ts +2 -6
  97. package/src/tool/solarCalculator/i18n/it.ts +2 -6
  98. package/src/tool/solarCalculator/i18n/ja.ts +121 -125
  99. package/src/tool/solarCalculator/i18n/ko.ts +116 -120
  100. package/src/tool/solarCalculator/i18n/nl.ts +2 -5
  101. package/src/tool/solarCalculator/i18n/pl.ts +2 -6
  102. package/src/tool/solarCalculator/i18n/pt.ts +2 -6
  103. package/src/tool/solarCalculator/i18n/ru.ts +2 -5
  104. package/src/tool/solarCalculator/i18n/sv.ts +2 -5
  105. package/src/tool/solarCalculator/i18n/tr.ts +2 -5
  106. package/src/tool/solarCalculator/i18n/zh.ts +116 -120
  107. package/src/tool/solarCalculator/seo.astro +2 -1
  108. package/src/tool/tariffComparator/bibliography.ts +7 -0
  109. package/src/tool/tariffComparator/i18n/de.ts +129 -132
  110. package/src/tool/tariffComparator/i18n/en.ts +2 -9
  111. package/src/tool/tariffComparator/i18n/es.ts +2 -9
  112. package/src/tool/tariffComparator/i18n/fr.ts +2 -9
  113. package/src/tool/tariffComparator/i18n/id.ts +2 -5
  114. package/src/tool/tariffComparator/i18n/it.ts +2 -5
  115. package/src/tool/tariffComparator/i18n/ja.ts +129 -132
  116. package/src/tool/tariffComparator/i18n/ko.ts +129 -132
  117. package/src/tool/tariffComparator/i18n/nl.ts +2 -5
  118. package/src/tool/tariffComparator/i18n/pl.ts +2 -5
  119. package/src/tool/tariffComparator/i18n/pt.ts +2 -5
  120. package/src/tool/tariffComparator/i18n/ru.ts +2 -5
  121. package/src/tool/tariffComparator/i18n/sv.ts +2 -5
  122. package/src/tool/tariffComparator/i18n/tr.ts +2 -5
  123. package/src/tool/tariffComparator/i18n/zh.ts +129 -132
  124. package/src/tool/tariffComparator/seo.astro +2 -1
  125. 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 = '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,
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 = 'pembuat-kode-qr-offline';
7
+ const title = 'Pembuat Kode QR Offline';
8
+ const description =
9
+ 'Buat kode QR untuk WiFi, URL, dan Kontak secara 100% aman di browser Anda. Data Anda tidak pernah meninggalkan perangkat Anda.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Apakah kode QR ini akan kedaluwarsa?',
14
+ answer:
15
+ 'Tidak. Kode yang dihasilkan di sini bersifat statis. Informasi tersebut dikodekan langsung ke dalam gambar. Kode tersebut akan berfungsi selamanya.',
16
+ },
17
+ {
18
+ question: 'Apakah Anda menyimpan data saya?',
19
+ answer:
20
+ 'Sama sekali tidak. Seluruh proses terjadi di browser Anda (Client-Side). Tidak ada data yang dikirim ke server kami.',
21
+ },
22
+ {
23
+ question: 'Apakah ini berfungsi di iPhone dan Android?',
24
+ answer:
25
+ '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.).',
26
+ },
27
+ {
28
+ question: 'Bisakah saya menggunakannya tanpa internet?',
29
+ answer:
30
+ 'Ya. Setelah halaman dimuat, Anda dapat mematikan internet dan pembuat kode QR tetap akan berfungsi dengan sempurna.',
31
+ },
32
+ ];
33
+
34
+ const howToData = [
35
+ {
36
+ name: 'Pilih tipe QR',
37
+ text: 'Pilih apakah Anda ingin membuat kode untuk jaringan WiFi, tautan URL, atau kontak (vCard).',
38
+ },
39
+ {
40
+ name: 'Masukkan data',
41
+ text: 'Isi bidang yang diperlukan, seperti nama jaringan dan kata sandi, atau alamat web.',
42
+ },
43
+ {
44
+ name: 'Buat dan periksa',
45
+ text: 'Kode akan dibuat secara instan. Anda dapat mencobanya dengan memindai langsung dari layar.',
46
+ },
47
+ {
48
+ name: 'Unduh',
49
+ text: 'Simpan kode QR sebagai gambar untuk dicetak atau dibagikan secara digital.',
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: 'IDR' },
83
+ inLanguage: 'id',
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: '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
- };
90
+ faq: faqData,
91
+ bibliography,
92
+ howTo: howToData,
93
+ schemas: [faqSchema, howToSchema, appSchema],
94
+ seo: [
95
+ {
96
+ type: 'title',
97
+ text: 'Privasi Utama: Pembuatan Lokal',
98
+ level: 2,
99
+ },
100
+ {
101
+ type: 'paragraph',
102
+ html: 'Alat ini menghasilkan kode QR langsung di perangkat Anda. Keamanan total untuk <strong>kata sandi WiFi</strong> atau <strong>data pribadi</strong> Anda.',
103
+ },
104
+ {
105
+ type: 'stats',
106
+ items: [
107
+ { value: '100%', label: 'Privat', icon: 'mdi:shield-lock' },
108
+ { value: 'Offline', label: 'Tanpa Server', icon: 'mdi:wifi-off' },
109
+ { value: 'PNG', label: 'Unduh', icon: 'mdi:download' },
110
+ ],
111
+ columns: 3,
112
+ },
113
+ {
114
+ type: 'summary',
115
+ title: 'Tips Penggunaan',
116
+ items: [
117
+ 'Data hanya diproses di browser Anda.',
118
+ 'Perhatikan huruf besar/kecil pada nama jaringan WiFi.',
119
+ 'Kode QR statis: jika kata sandi diubah, buat kode baru.',
120
+ 'Selalu uji pemindaian sebelum mencetak.',
121
+ ],
122
+ },
123
+ ],
124
+ ui: {
125
+ tabWifi: 'WiFi',
126
+ tabUrl: 'URL',
127
+ tabContact: 'Kontak',
128
+ labelSsid: 'Nama Jaringan (SSID)',
129
+ labelPassword: 'Kata Sandi',
130
+ labelEncryption: 'Keamanan',
131
+ labelHidden: 'Jaringan Tersembunyi',
132
+ labelUrl: 'Alamat Web (URL)',
133
+ labelName: 'Nama Depan',
134
+ labelSurname: 'Nama Belakang',
135
+ labelPhone: 'Telepon',
136
+ labelEmail: 'Email',
137
+ labelOrg: 'Organisasi / Perusahaan',
138
+ encWpa: 'WPA/WPA2',
139
+ encWep: 'WEP',
140
+ encNone: 'Tidak ada',
141
+ downloadBtn: 'Unduh PNG',
142
+ privacyMsg: 'Dibuat 100% di browser Anda. Data Anda aman.',
143
+ placeholderSsid: 'WiFiSaya_5G',
144
+ placeholderUrl: 'https://contoh.com',
145
+ placeholderPassword: '••••••••',
146
+ },
147
+ };
@@ -1,174 +1,170 @@
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,
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 = 'generatore-codici-qr-offline';
7
+ const title = 'Generatore di Codici QR Offline';
8
+ const description =
9
+ '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.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Questi codici QR scadono?',
14
+ answer:
15
+ 'No. I codici generati qui sono statici. Le informazioni sono codificate direttamente nell\'immagine. Funzioneranno per sempre.',
16
+ },
17
+ {
18
+ question: 'Salvate i miei dati?',
19
+ answer:
20
+ 'Assolutamente no. Tutto il processo avviene nel tuo browser (Client-Side). Nessun dato viene inviato ai nostri server.',
21
+ },
22
+ {
23
+ question: 'Funziona su iPhone e Android?',
24
+ answer:
25
+ '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.).',
26
+ },
27
+ {
28
+ question: 'Posso usarlo senza internet?',
29
+ answer:
30
+ 'Sì. Una volta caricata la pagina, puoi disconnetterti e il generatore continuerà a funzionare perfettamente.',
31
+ },
32
+ ];
33
+
34
+ const howToData = [
35
+ {
36
+ name: 'Scegli il tipo di QR',
37
+ text: 'Seleziona se vuoi un codice per una rete WiFi, un link URL o un contatto (vCard).',
38
+ },
39
+ {
40
+ name: 'Inserisci i dati',
41
+ text: 'Compila i campi necessari, come il nome della rete e la password, o l\'indirizzo web.',
42
+ },
43
+ {
44
+ name: 'Genera e controlla',
45
+ text: 'Il codice viene generato all\'istante. Prova a scansionarlo direttamente dallo schermo.',
46
+ },
47
+ {
48
+ name: 'Scarica',
49
+ text: 'Salva il codice QR come immagine per stamparlo o condividerlo.',
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: 'EUR' },
83
+ inLanguage: 'it',
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: '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
- };
90
+ faq: faqData,
91
+ bibliography,
92
+ howTo: howToData,
93
+ schemas: [faqSchema, howToSchema, appSchema],
94
+ seo: [
95
+ {
96
+ type: 'title',
97
+ text: 'Privacy al Primo Posto: Generazione Locale',
98
+ level: 2,
99
+ },
100
+ {
101
+ type: 'paragraph',
102
+ 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>.',
103
+ },
104
+ {
105
+ type: 'stats',
106
+ items: [
107
+ { value: '100%', label: 'Privato', icon: 'mdi:shield-lock' },
108
+ { value: 'Offline', label: 'No Server', icon: 'mdi:wifi-off' },
109
+ { value: 'PNG', label: 'Download', icon: 'mdi:download' },
110
+ ],
111
+ columns: 3,
112
+ },
113
+ {
114
+ type: 'title',
115
+ text: 'Casi d\'Uso',
116
+ level: 3,
117
+ },
118
+ {
119
+ type: 'comparative',
120
+ items: [
121
+ {
122
+ title: 'WiFi QR',
123
+ description: 'Condividi la tua rete con gli ospiti senza dettare la password.',
124
+ icon: 'mdi:wifi',
125
+ points: ['Compatibile con iOS/Android', 'Supporta WPA2 e WEP'],
126
+ },
127
+ {
128
+ title: 'vCard QR',
129
+ description: 'Biglietto da visita digitale che si salva subito in rubrica.',
130
+ icon: 'mdi:card-account-details',
131
+ points: ['Nome, Tel, Email', 'Formato standard internazionale'],
132
+ },
133
+ ],
134
+ columns: 2,
135
+ },
136
+ {
137
+ type: 'summary',
138
+ title: 'Consigli per l\'uso',
139
+ items: [
140
+ 'Dati processati solo localmente.',
141
+ 'I nomi delle reti distinguono tra maiuscole e minuscole.',
142
+ 'I QR sono statici: se cambi dati, rigenera il codice.',
143
+ 'Testa il codice prima di stamparlo.',
144
+ ],
145
+ },
146
+ ],
147
+ ui: {
148
+ tabWifi: 'WiFi',
149
+ tabUrl: 'URL',
150
+ tabContact: 'Contatto',
151
+ labelSsid: 'Nome Rete (SSID)',
152
+ labelPassword: 'Password',
153
+ labelEncryption: 'Sicurezza',
154
+ labelHidden: 'Rete Nascosta',
155
+ labelUrl: 'Indirizzo Web (URL)',
156
+ labelName: 'Nome',
157
+ labelSurname: 'Cognome',
158
+ labelPhone: 'Telefono',
159
+ labelEmail: 'Email',
160
+ labelOrg: 'Azienda',
161
+ encWpa: 'WPA/WPA2',
162
+ encWep: 'WEP',
163
+ encNone: 'Nessuna',
164
+ downloadBtn: 'Scarica PNG',
165
+ privacyMsg: 'Generato 100% nel browser. Dati sicuri.',
166
+ placeholderSsid: 'MiaRete_5G',
167
+ placeholderUrl: 'https://esempio.it',
168
+ placeholderPassword: '••••••••',
169
+ },
170
+ };