@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 = 'gerador-codigos-qr-offline';
6
- const title = 'Gerador de Códigos QR Offline';
7
- const description =
8
- 'Gere códigos QR para WiFi, URLs e Contactos de forma 100% segura no seu navegador. Os seus dados nunca saem do seu dispositivo.';
9
-
10
- const faqData = [
11
- {
12
- question: 'Estes códigos QR expiram?',
13
- answer:
14
- 'Não. Os códigos gerados aqui são estáticos. A informação está codificada diretamente na imagem e não depende de ligações externas. Funcionam para sempre.',
15
- },
16
- {
17
- question: 'Guardam os meus dados?',
18
- answer:
19
- 'Absolutamente não. Todo o processo ocorre no seu navegador (Client-Side). Nenhum dado é enviado para os nossos servidores.',
20
- },
21
- {
22
- question: 'Funciona no iPhone e Android?',
23
- answer:
24
- 'Sim. A maioria das câmaras modernas lê códigos QR de forma nativa e sugere a ação correspondente (ligar ao WiFi, abrir link, etc.).',
25
- },
26
- {
27
- question: 'Posso usar sem internet?',
28
- answer:
29
- 'Sim. Uma vez carregada a página, pode desligar o WiFi e o gerador continuará a funcionar perfeitamente.',
30
- },
31
- ];
32
-
33
- const howToData = [
34
- {
35
- name: 'Escolher tipo de QR',
36
- text: 'Selecione se quer um código para uma rede WiFi, um link URL ou um contacto (vCard).',
37
- },
38
- {
39
- name: 'Introduzir dados',
40
- text: 'Preencha os campos necessários, como o nome da rede e a password, ou o endereço web.',
41
- },
42
- {
43
- name: 'Gerar e verificar',
44
- text: 'O código é gerado instantaneamente. Pode testar o scan diretamente no ecrã.',
45
- },
46
- {
47
- name: 'Descarregar',
48
- text: 'Guarde o código QR como imagem para imprimir ou partilhar.',
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 = 'gerador-codigos-qr-offline';
7
+ const title = 'Gerador de Códigos QR Offline';
8
+ const description =
9
+ 'Gere códigos QR para WiFi, URLs e Contactos de forma 100% segura no seu navegador. Os seus dados nunca saem do seu dispositivo.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Estes códigos QR expiram?',
14
+ answer:
15
+ 'Não. Os códigos gerados aqui são estáticos. A informação está codificada diretamente na imagem e não depende de ligações externas. Funcionam para sempre.',
16
+ },
17
+ {
18
+ question: 'Guardam os meus dados?',
19
+ answer:
20
+ 'Absolutamente não. Todo o processo ocorre no seu navegador (Client-Side). Nenhum dado é enviado para os nossos servidores.',
21
+ },
22
+ {
23
+ question: 'Funciona no iPhone e Android?',
24
+ answer:
25
+ 'Sim. A maioria das câmaras modernas lê códigos QR de forma nativa e sugere a ação correspondente (ligar ao WiFi, abrir link, etc.).',
26
+ },
27
+ {
28
+ question: 'Posso usar sem internet?',
29
+ answer:
30
+ 'Sim. Uma vez carregada a página, pode desligar o WiFi e o gerador continuará a funcionar perfeitamente.',
31
+ },
32
+ ];
33
+
34
+ const howToData = [
35
+ {
36
+ name: 'Escolher tipo de QR',
37
+ text: 'Selecione se quer um código para uma rede WiFi, um link URL ou um contacto (vCard).',
38
+ },
39
+ {
40
+ name: 'Introduzir dados',
41
+ text: 'Preencha os campos necessários, como o nome da rede e a password, ou o endereço web.',
42
+ },
43
+ {
44
+ name: 'Gerar e verificar',
45
+ text: 'O código é gerado instantaneamente. Pode testar o scan diretamente no ecrã.',
46
+ },
47
+ {
48
+ name: 'Descarregar',
49
+ text: 'Guarde o código QR como imagem para imprimir ou partilhar.',
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: 'pt',
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: 'pt',
83
- };
84
-
85
- export const content: ToolLocaleContent<QRGeneratorUI> = {
86
- slug,
87
- title,
88
- description,
89
- faqTitle: 'Perguntas Frequentes',
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: 'Privacidade Primeiro: Geração Local',
102
- level: 2,
103
- },
104
- {
105
- type: 'paragraph',
106
- html: 'Esta ferramenta gera o código QR diretamente no seu dispositivo. Segurança total para as suas <strong>palavras-passe WiFi</strong> ou <strong>dados pessoais</strong>.',
107
- },
108
- {
109
- type: 'stats',
110
- items: [
111
- { value: '100%', label: 'Privado', icon: 'mdi:shield-lock' },
112
- { value: 'Offline', label: 'Sem Servidor', icon: 'mdi:wifi-off' },
113
- { value: 'PNG', label: 'Download', icon: 'mdi:download' },
114
- ],
115
- columns: 3,
116
- },
117
- {
118
- type: 'summary',
119
- title: 'Dicas de Utilização',
120
- items: [
121
- 'Dados processados apenas no navegador.',
122
- 'Atenção a maiúsculas/minúsculas no nome da rede.',
123
- 'QR codes estáticos: se mudar a pass, gere um novo.',
124
- 'Teste sempre o scan antes de imprimir.',
125
- ],
126
- },
127
- ],
128
- ui: {
129
- tabWifi: 'WiFi',
130
- tabUrl: 'URL',
131
- tabContact: 'Contacto',
132
- labelSsid: 'Nome da Rede (SSID)',
133
- labelPassword: 'Palavra-passe',
134
- labelEncryption: 'Segurança',
135
- labelHidden: 'Rede Oculta',
136
- labelUrl: 'Endereço Web (URL)',
137
- labelName: 'Nome',
138
- labelSurname: 'Apelido',
139
- labelPhone: 'Telefone',
140
- labelEmail: 'Email',
141
- labelOrg: 'Organização / Empresa',
142
- encWpa: 'WPA/WPA2',
143
- encWep: 'WEP',
144
- encNone: 'Nenhuma',
145
- downloadBtn: 'Descarregar PNG',
146
- privacyMsg: 'Gerado 100% no seu navegador. Dados seguros.',
147
- placeholderSsid: 'MinhaRede_5G',
148
- placeholderUrl: 'https://exemplo.pt',
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: 'Privacidade Primeiro: Geração Local',
98
+ level: 2,
99
+ },
100
+ {
101
+ type: 'paragraph',
102
+ html: 'Esta ferramenta gera o código QR diretamente no seu dispositivo. Segurança total para as suas <strong>palavras-passe WiFi</strong> ou <strong>dados pessoais</strong>.',
103
+ },
104
+ {
105
+ type: 'stats',
106
+ items: [
107
+ { value: '100%', label: 'Privado', icon: 'mdi:shield-lock' },
108
+ { value: 'Offline', label: 'Sem Servidor', icon: 'mdi:wifi-off' },
109
+ { value: 'PNG', label: 'Download', icon: 'mdi:download' },
110
+ ],
111
+ columns: 3,
112
+ },
113
+ {
114
+ type: 'summary',
115
+ title: 'Dicas de Utilização',
116
+ items: [
117
+ 'Dados processados apenas no navegador.',
118
+ 'Atenção a maiúsculas/minúsculas no nome da rede.',
119
+ 'QR codes estáticos: se mudar a pass, gere um novo.',
120
+ 'Teste sempre o scan antes de imprimir.',
121
+ ],
122
+ },
123
+ ],
124
+ ui: {
125
+ tabWifi: 'WiFi',
126
+ tabUrl: 'URL',
127
+ tabContact: 'Contacto',
128
+ labelSsid: 'Nome da Rede (SSID)',
129
+ labelPassword: 'Palavra-passe',
130
+ labelEncryption: 'Segurança',
131
+ labelHidden: 'Rede Oculta',
132
+ labelUrl: 'Endereço Web (URL)',
133
+ labelName: 'Nome',
134
+ labelSurname: 'Apelido',
135
+ labelPhone: 'Telefone',
136
+ labelEmail: 'Email',
137
+ labelOrg: 'Organização / Empresa',
138
+ encWpa: 'WPA/WPA2',
139
+ encWep: 'WEP',
140
+ encNone: 'Nenhuma',
141
+ downloadBtn: 'Descarregar PNG',
142
+ privacyMsg: 'Gerado 100% no seu navegador. Dados seguros.',
143
+ placeholderSsid: 'MinhaRede_5G',
144
+ placeholderUrl: 'https://exemplo.pt',
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 = 'oflayn-qr-kod-generator';
6
- const title = 'Оффлайн Генератор QR кодов';
7
- const description =
8
- 'Создавайте QR-коды для WiFi, URL и Контактов полностью безопасно в вашем браузере. Ваши данные никогда не покидают устройство.';
9
-
10
- const faqData = [
11
- {
12
- question: 'Имеют ли эти QR-коды срок годности?',
13
- answer:
14
- 'Нет. Сгенерированные здесь коды являются статическими. Информация закодирована прямо в изображении. Они будут работать вечно.',
15
- },
16
- {
17
- question: 'Сохраняете ли вы мои данные?',
18
- answer:
19
- 'Абсолютно нет. Весь процесс происходит в вашем браузере (Client-Side). Никакие данные не отправляются на сервер.',
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: 'Код создается мгновенно. Проверьте его, отсканировав прямо с экрана.',
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 = 'oflayn-qr-kod-generator';
7
+ const title = 'Оффлайн Генератор QR кодов';
8
+ const description =
9
+ 'Создавайте QR-коды для WiFi, URL и Контактов полностью безопасно в вашем браузере. Ваши данные никогда не покидают устройство.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Имеют ли эти QR-коды срок годности?',
14
+ answer:
15
+ 'Нет. Сгенерированные здесь коды являются статическими. Информация закодирована прямо в изображении. Они будут работать вечно.',
16
+ },
17
+ {
18
+ question: 'Сохраняете ли вы мои данные?',
19
+ answer:
20
+ 'Абсолютно нет. Весь процесс происходит в вашем браузере (Client-Side). Никакие данные не отправляются на сервер.',
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: 'Код создается мгновенно. Проверьте его, отсканировав прямо с экрана.',
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: 'RUB' },
83
+ inLanguage: 'ru',
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: 'RUB' },
82
- inLanguage: 'ru',
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: 'Offline', 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 сети.',
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: 'Email',
141
- labelOrg: 'Организация',
142
- encWpa: 'WPA/WPA2',
143
- encWep: 'WEP',
144
- encNone: 'Нет',
145
- downloadBtn: 'Скачать PNG',
146
- privacyMsg: 'Создано на 100% в браузере. Данные в безопасности.',
147
- placeholderSsid: 'MoyaSet_5G',
148
- placeholderUrl: 'https://primer.ru',
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: 'Offline', 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 сети.',
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: 'Email',
137
+ labelOrg: 'Организация',
138
+ encWpa: 'WPA/WPA2',
139
+ encWep: 'WEP',
140
+ encNone: 'Нет',
141
+ downloadBtn: 'Скачать PNG',
142
+ privacyMsg: 'Создано на 100% в браузере. Данные в безопасности.',
143
+ placeholderSsid: 'MoyaSet_5G',
144
+ placeholderUrl: 'https://primer.ru',
145
+ placeholderPassword: '••••••••',
146
+ },
147
+ };