@jjlmoya/utils-home 1.16.0 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/de.ts +10 -10
  3. package/src/category/i18n/en.ts +8 -8
  4. package/src/category/i18n/es.ts +2 -2
  5. package/src/category/i18n/fr.ts +15 -15
  6. package/src/category/i18n/id.ts +8 -8
  7. package/src/category/i18n/it.ts +7 -7
  8. package/src/category/i18n/nl.ts +8 -8
  9. package/src/category/i18n/pl.ts +10 -10
  10. package/src/category/i18n/pt.ts +8 -8
  11. package/src/category/i18n/ru.ts +10 -10
  12. package/src/category/i18n/sv.ts +8 -8
  13. package/src/category/i18n/tr.ts +4 -4
  14. package/src/category/i18n/zh.ts +8 -8
  15. package/src/entries.ts +4 -1
  16. package/src/pages/[locale]/[slug].astro +28 -12
  17. package/src/tests/locale_completeness.test.ts +4 -22
  18. package/src/tests/no_en_dash.test.ts +70 -0
  19. package/src/tests/shared-test-helpers.ts +56 -0
  20. package/src/tests/tool_exports.test.ts +34 -0
  21. package/src/tests/tool_validation.test.ts +2 -2
  22. package/src/tool/dewPointCalculator/bibliography.ts +10 -0
  23. package/src/tool/dewPointCalculator/i18n/de.ts +7 -17
  24. package/src/tool/dewPointCalculator/i18n/en.ts +8 -18
  25. package/src/tool/dewPointCalculator/i18n/es.ts +7 -17
  26. package/src/tool/dewPointCalculator/i18n/fr.ts +8 -18
  27. package/src/tool/dewPointCalculator/i18n/id.ts +7 -17
  28. package/src/tool/dewPointCalculator/i18n/it.ts +7 -17
  29. package/src/tool/dewPointCalculator/i18n/ja.ts +6 -16
  30. package/src/tool/dewPointCalculator/i18n/ko.ts +6 -16
  31. package/src/tool/dewPointCalculator/i18n/nl.ts +7 -17
  32. package/src/tool/dewPointCalculator/i18n/pl.ts +7 -17
  33. package/src/tool/dewPointCalculator/i18n/pt.ts +7 -17
  34. package/src/tool/dewPointCalculator/i18n/ru.ts +13 -23
  35. package/src/tool/dewPointCalculator/i18n/sv.ts +7 -17
  36. package/src/tool/dewPointCalculator/i18n/tr.ts +6 -16
  37. package/src/tool/dewPointCalculator/i18n/zh.ts +7 -17
  38. package/src/tool/dewPointCalculator/seo.astro +2 -1
  39. package/src/tool/heatingComparator/bibliography.ts +14 -0
  40. package/src/tool/heatingComparator/i18n/de.ts +10 -24
  41. package/src/tool/heatingComparator/i18n/en.ts +3 -13
  42. package/src/tool/heatingComparator/i18n/es.ts +3 -17
  43. package/src/tool/heatingComparator/i18n/fr.ts +9 -19
  44. package/src/tool/heatingComparator/i18n/id.ts +3 -17
  45. package/src/tool/heatingComparator/i18n/it.ts +3 -17
  46. package/src/tool/heatingComparator/i18n/ja.ts +296 -310
  47. package/src/tool/heatingComparator/i18n/ko.ts +296 -306
  48. package/src/tool/heatingComparator/i18n/nl.ts +3 -17
  49. package/src/tool/heatingComparator/i18n/pl.ts +3 -17
  50. package/src/tool/heatingComparator/i18n/pt.ts +3 -17
  51. package/src/tool/heatingComparator/i18n/ru.ts +14 -24
  52. package/src/tool/heatingComparator/i18n/sv.ts +6 -20
  53. package/src/tool/heatingComparator/i18n/tr.ts +2 -16
  54. package/src/tool/heatingComparator/i18n/zh.ts +296 -306
  55. package/src/tool/heatingComparator/seo.astro +3 -3
  56. package/src/tool/ledSavingCalculator/bibliography.ts +14 -0
  57. package/src/tool/ledSavingCalculator/i18n/de.ts +6 -16
  58. package/src/tool/ledSavingCalculator/i18n/en.ts +6 -20
  59. package/src/tool/ledSavingCalculator/i18n/es.ts +6 -20
  60. package/src/tool/ledSavingCalculator/i18n/fr.ts +10 -24
  61. package/src/tool/ledSavingCalculator/i18n/id.ts +5 -15
  62. package/src/tool/ledSavingCalculator/i18n/it.ts +6 -16
  63. package/src/tool/ledSavingCalculator/i18n/ja.ts +5 -15
  64. package/src/tool/ledSavingCalculator/i18n/ko.ts +4 -14
  65. package/src/tool/ledSavingCalculator/i18n/nl.ts +5 -15
  66. package/src/tool/ledSavingCalculator/i18n/pl.ts +5 -15
  67. package/src/tool/ledSavingCalculator/i18n/pt.ts +5 -15
  68. package/src/tool/ledSavingCalculator/i18n/ru.ts +8 -18
  69. package/src/tool/ledSavingCalculator/i18n/sv.ts +5 -15
  70. package/src/tool/ledSavingCalculator/i18n/tr.ts +5 -15
  71. package/src/tool/ledSavingCalculator/i18n/zh.ts +6 -16
  72. package/src/tool/ledSavingCalculator/seo.astro +2 -1
  73. package/src/tool/projectorCalculator/bibliography.ts +5 -0
  74. package/src/tool/projectorCalculator/i18n/de.ts +4 -8
  75. package/src/tool/projectorCalculator/i18n/en.ts +3 -8
  76. package/src/tool/projectorCalculator/i18n/es.ts +4 -9
  77. package/src/tool/projectorCalculator/i18n/fr.ts +6 -11
  78. package/src/tool/projectorCalculator/i18n/id.ts +4 -9
  79. package/src/tool/projectorCalculator/i18n/it.ts +4 -8
  80. package/src/tool/projectorCalculator/i18n/ja.ts +175 -179
  81. package/src/tool/projectorCalculator/i18n/ko.ts +175 -179
  82. package/src/tool/projectorCalculator/i18n/nl.ts +4 -8
  83. package/src/tool/projectorCalculator/i18n/pl.ts +5 -9
  84. package/src/tool/projectorCalculator/i18n/pt.ts +4 -8
  85. package/src/tool/projectorCalculator/i18n/ru.ts +7 -11
  86. package/src/tool/projectorCalculator/i18n/sv.ts +4 -8
  87. package/src/tool/projectorCalculator/i18n/tr.ts +4 -8
  88. package/src/tool/projectorCalculator/i18n/zh.ts +175 -179
  89. package/src/tool/projectorCalculator/seo.astro +2 -1
  90. package/src/tool/qrGenerator/bibliography.ts +14 -0
  91. package/src/tool/qrGenerator/i18n/de.ts +192 -202
  92. package/src/tool/qrGenerator/i18n/en.ts +3 -17
  93. package/src/tool/qrGenerator/i18n/es.ts +2 -16
  94. package/src/tool/qrGenerator/i18n/fr.ts +3 -17
  95. package/src/tool/qrGenerator/i18n/id.ts +146 -150
  96. package/src/tool/qrGenerator/i18n/it.ts +169 -173
  97. package/src/tool/qrGenerator/i18n/ja.ts +146 -150
  98. package/src/tool/qrGenerator/i18n/ko.ts +146 -150
  99. package/src/tool/qrGenerator/i18n/nl.ts +146 -150
  100. package/src/tool/qrGenerator/i18n/pl.ts +146 -150
  101. package/src/tool/qrGenerator/i18n/pt.ts +146 -150
  102. package/src/tool/qrGenerator/i18n/ru.ts +146 -150
  103. package/src/tool/qrGenerator/i18n/sv.ts +146 -150
  104. package/src/tool/qrGenerator/i18n/tr.ts +146 -150
  105. package/src/tool/qrGenerator/i18n/zh.ts +146 -150
  106. package/src/tool/qrGenerator/seo.astro +2 -1
  107. package/src/tool/solarCalculator/bibliography.ts +5 -0
  108. package/src/tool/solarCalculator/i18n/de.ts +141 -145
  109. package/src/tool/solarCalculator/i18n/en.ts +7 -12
  110. package/src/tool/solarCalculator/i18n/es.ts +5 -10
  111. package/src/tool/solarCalculator/i18n/fr.ts +8 -13
  112. package/src/tool/solarCalculator/i18n/id.ts +4 -8
  113. package/src/tool/solarCalculator/i18n/it.ts +4 -8
  114. package/src/tool/solarCalculator/i18n/ja.ts +121 -125
  115. package/src/tool/solarCalculator/i18n/ko.ts +116 -120
  116. package/src/tool/solarCalculator/i18n/nl.ts +4 -7
  117. package/src/tool/solarCalculator/i18n/pl.ts +5 -9
  118. package/src/tool/solarCalculator/i18n/pt.ts +4 -8
  119. package/src/tool/solarCalculator/i18n/ru.ts +7 -10
  120. package/src/tool/solarCalculator/i18n/sv.ts +4 -7
  121. package/src/tool/solarCalculator/i18n/tr.ts +4 -7
  122. package/src/tool/solarCalculator/i18n/zh.ts +116 -120
  123. package/src/tool/solarCalculator/seo.astro +2 -1
  124. package/src/tool/tariffComparator/bibliography.ts +7 -0
  125. package/src/tool/tariffComparator/i18n/de.ts +129 -132
  126. package/src/tool/tariffComparator/i18n/en.ts +5 -12
  127. package/src/tool/tariffComparator/i18n/es.ts +5 -12
  128. package/src/tool/tariffComparator/i18n/fr.ts +8 -15
  129. package/src/tool/tariffComparator/i18n/id.ts +2 -5
  130. package/src/tool/tariffComparator/i18n/it.ts +2 -5
  131. package/src/tool/tariffComparator/i18n/ja.ts +129 -132
  132. package/src/tool/tariffComparator/i18n/ko.ts +129 -132
  133. package/src/tool/tariffComparator/i18n/nl.ts +2 -5
  134. package/src/tool/tariffComparator/i18n/pl.ts +3 -6
  135. package/src/tool/tariffComparator/i18n/pt.ts +2 -5
  136. package/src/tool/tariffComparator/i18n/ru.ts +2 -5
  137. package/src/tool/tariffComparator/i18n/sv.ts +2 -5
  138. package/src/tool/tariffComparator/i18n/tr.ts +2 -5
  139. package/src/tool/tariffComparator/i18n/zh.ts +129 -132
  140. package/src/tool/tariffComparator/seo.astro +2 -1
  141. package/src/tool/wifiRangeSimulator/bibliography.astro +14 -0
  142. package/src/tool/wifiRangeSimulator/bibliography.ts +14 -0
  143. package/src/tool/wifiRangeSimulator/component.astro +170 -0
  144. package/src/tool/wifiRangeSimulator/entry.ts +29 -0
  145. package/src/tool/wifiRangeSimulator/i18n/de.ts +477 -0
  146. package/src/tool/wifiRangeSimulator/i18n/en.ts +477 -0
  147. package/src/tool/wifiRangeSimulator/i18n/es.ts +477 -0
  148. package/src/tool/wifiRangeSimulator/i18n/fr.ts +477 -0
  149. package/src/tool/wifiRangeSimulator/i18n/id.ts +477 -0
  150. package/src/tool/wifiRangeSimulator/i18n/it.ts +477 -0
  151. package/src/tool/wifiRangeSimulator/i18n/ja.ts +477 -0
  152. package/src/tool/wifiRangeSimulator/i18n/ko.ts +477 -0
  153. package/src/tool/wifiRangeSimulator/i18n/nl.ts +477 -0
  154. package/src/tool/wifiRangeSimulator/i18n/pl.ts +477 -0
  155. package/src/tool/wifiRangeSimulator/i18n/pt.ts +477 -0
  156. package/src/tool/wifiRangeSimulator/i18n/ru.ts +477 -0
  157. package/src/tool/wifiRangeSimulator/i18n/sv.ts +477 -0
  158. package/src/tool/wifiRangeSimulator/i18n/tr.ts +477 -0
  159. package/src/tool/wifiRangeSimulator/i18n/zh.ts +477 -0
  160. package/src/tool/wifiRangeSimulator/i18n-utils.ts +14 -0
  161. package/src/tool/wifiRangeSimulator/index.ts +8 -0
  162. package/src/tool/wifiRangeSimulator/logic.ts +220 -0
  163. package/src/tool/wifiRangeSimulator/seo.astro +15 -0
  164. package/src/tool/wifiRangeSimulator/sketch-actions.ts +168 -0
  165. package/src/tool/wifiRangeSimulator/sketch-events.ts +138 -0
  166. package/src/tool/wifiRangeSimulator/sketch-render-dash.ts +170 -0
  167. package/src/tool/wifiRangeSimulator/sketch-render-device.ts +42 -0
  168. package/src/tool/wifiRangeSimulator/sketch-render.ts +155 -0
  169. package/src/tool/wifiRangeSimulator/sketch-state.ts +186 -0
  170. package/src/tool/wifiRangeSimulator/sketch.ts +100 -0
  171. package/src/tool/wifiRangeSimulator/ui.ts +69 -0
  172. package/src/tool/wifiRangeSimulator/wifi-range-simulator.css +583 -0
  173. package/src/tools.ts +2 -0
  174. package/src/types.ts +0 -2
@@ -1,151 +1,147 @@
1
- import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
- import type { ToolLocaleContent } from '../../../types';
3
- import type { QRGeneratorUI } from '../ui';
4
-
5
- const slug = 'qr-generator';
6
- const title = '离线 QR 码生成器';
7
- const description =
8
- '在您的浏览器中 100% 安全地生成 WiFi、URL 和联系人的 QR 码。您的数据绝不会离开您的设备。';
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 的大多数现代相机都原生支持读取 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 = 'qr-generator';
7
+ const title = '离线 QR 码生成器';
8
+ const description =
9
+ '在您的浏览器中 100% 安全地生成 WiFi、URL 和联系人的 QR 码。您的数据绝不会离开您的设备。';
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 的大多数现代相机都原生支持读取 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: 'CNY' },
83
+ inLanguage: 'zh',
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: 'CNY' },
82
- inLanguage: 'zh',
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 格式规范', 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 名称的大小写。',
123
- '静态 QR:如果更改了密码,请生成新的 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: '我的网络_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 名称的大小写。',
119
+ '静态 QR:如果更改了密码,请生成新的 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: '我的网络_5G',
144
+ placeholderUrl: 'https://example.com',
145
+ placeholderPassword: '••••••••',
146
+ },
147
+ };
@@ -11,4 +11,5 @@ const { locale = 'es' } = Astro.props;
11
11
  const content = await qrGenerator.i18n[locale]?.();
12
12
  if (!content) return null;
13
13
  ---
14
- <SEORenderer content={{ locale: locale as string, sections: content.seo }} />
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,5 @@
1
+ export const bibliography = [
2
+ { name: 'NREL PVWatts Calculator', url: 'https://pvwatts.nrel.gov/' },
3
+ { name: 'PVGIS: European Commission Solar Tool', url: 'https://re.jrc.ec.europa.eu/pvgis/' },
4
+ { name: 'SEIA: Solar Energy Industry Research Data', url: 'https://www.seia.org/solar-industry-research-data' },
5
+ ];
@@ -1,146 +1,142 @@
1
- import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
- import type { ToolLocaleContent } from '../../../types';
3
- import type { SolarCalculatorUI } from '../ui';
4
-
5
- const slug = 'solar-neigung-rechner';
6
- const title = 'Solarpanel Neigungsrechner';
7
- const description =
8
- 'Berechnen Sie den optimalen Neigungswinkel für Ihre Solarmodule basierend auf Ihrem Breitengrad. Für feste Installationen und saisonale Anpassungen.';
9
-
10
- const faqData = [
11
- {
12
- question: 'Was passiert, wenn mein Dach nicht die perfekte Neigung hat?',
13
- answer:
14
- 'Das ist kein großes Problem. Verluste durch Abweichungen von 5-10° liegen bei weniger als 3 % der Jahresproduktion. Es ist wichtiger, Schatten zu vermeiden, als den exakten Winkel zu jagen.',
15
- },
16
- {
17
- question: 'Ist der optimale Winkel überall auf der Welt gleich?',
18
- answer:
19
- 'Nein. Er hängt direkt von Ihrem Breitengrad ab. In Madrid (~40°N) ist der Winkel anders als in Oslo (~60°N) oder Sydney (~34°S).',
20
- },
21
- {
22
- question: 'In welche Richtung sollten die Paneele zeigen?',
23
- answer:
24
- 'Auf der Nordhalbkugel immer nach Süden (Azimut 180°). Auf der Südhalbkugel nach Norden. Eine Ost-West-Ausrichtung kann 15-20 % Verlust gegenüber dem Optimum bedeuten.',
25
- },
26
- {
27
- question: 'Funktioniert das auch für Solarthermie (Warmwasser)?',
28
- answer:
29
- 'Ja. Die Formeln für die Neigung sind für thermische Kollektoren und Photovoltaik identisch, da beide auf dem gleichen geometrischen Prinzip basieren.',
30
- },
31
- ];
32
-
33
- const howToData = [
34
- {
35
- name: 'Breitengrad eingeben',
36
- text: 'Geben Sie Ihren Breitengrad in Dezimalgrad ein oder nutzen Sie die automatische Standorterkennung.',
37
- },
38
- {
39
- name: 'Optimalen Winkel prüfen',
40
- text: 'Der optimale Ganzjahreswinkel ist der Hauptwert für feste Installationen.',
41
- },
42
- {
43
- name: 'Saisonal anpassen (optional)',
44
- text: 'Wenn Ihre Halterung verstellbar ist, nutzen Sie die Winter- und Sommerwinkel für maximale Erträge.',
45
- },
46
- ];
47
-
48
- const faqSchema: WithContext<FAQPage> = {
49
- '@context': 'https://schema.org',
50
- '@type': 'FAQPage',
51
- mainEntity: faqData.map((item) => ({
52
- '@type': 'Question',
53
- name: item.question,
54
- acceptedAnswer: { '@type': 'Answer', text: item.answer },
55
- })),
56
- };
57
-
58
- const howToSchema: WithContext<HowTo> = {
59
- '@context': 'https://schema.org',
60
- '@type': 'HowTo',
61
- name: title,
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { SolarCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'solar-neigung-rechner';
7
+ const title = 'Solarpanel Neigungsrechner';
8
+ const description =
9
+ 'Berechnen Sie den optimalen Neigungswinkel für Ihre Solarmodule basierend auf Ihrem Breitengrad. Für feste Installationen und saisonale Anpassungen.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Was passiert, wenn mein Dach nicht die perfekte Neigung hat?',
14
+ answer:
15
+ 'Das ist kein großes Problem. Verluste durch Abweichungen von 5-10° liegen bei weniger als 3 % der Jahresproduktion. Es ist wichtiger, Schatten zu vermeiden, als den exakten Winkel zu jagen.',
16
+ },
17
+ {
18
+ question: 'Ist der optimale Winkel überall auf der Welt gleich?',
19
+ answer:
20
+ 'Nein. Er hängt direkt von Ihrem Breitengrad ab. In Madrid (~40°N) ist der Winkel anders als in Oslo (~60°N) oder Sydney (~34°S).',
21
+ },
22
+ {
23
+ question: 'In welche Richtung sollten die Paneele zeigen?',
24
+ answer:
25
+ 'Auf der Nordhalbkugel immer nach Süden (Azimut 180°). Auf der Südhalbkugel nach Norden. Eine Ost-West-Ausrichtung kann 15-20 % Verlust gegenüber dem Optimum bedeuten.',
26
+ },
27
+ {
28
+ question: 'Funktioniert das auch für Solarthermie (Warmwasser)?',
29
+ answer:
30
+ 'Ja. Die Formeln für die Neigung sind für thermische Kollektoren und Photovoltaik identisch, da beide auf dem gleichen geometrischen Prinzip basieren.',
31
+ },
32
+ ];
33
+
34
+ const howToData = [
35
+ {
36
+ name: 'Breitengrad eingeben',
37
+ text: 'Geben Sie Ihren Breitengrad in Dezimalgrad ein oder nutzen Sie die automatische Standorterkennung.',
38
+ },
39
+ {
40
+ name: 'Optimalen Winkel prüfen',
41
+ text: 'Der optimale Ganzjahreswinkel ist der Hauptwert für feste Installationen.',
42
+ },
43
+ {
44
+ name: 'Saisonal anpassen (optional)',
45
+ text: 'Wenn Ihre Halterung verstellbar ist, nutzen Sie die Winter- und Sommerwinkel für maximale Erträge.',
46
+ },
47
+ ];
48
+
49
+ const faqSchema: WithContext<FAQPage> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'FAQPage',
52
+ mainEntity: faqData.map((item) => ({
53
+ '@type': 'Question',
54
+ name: item.question,
55
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
56
+ })),
57
+ };
58
+
59
+ const howToSchema: WithContext<HowTo> = {
60
+ '@context': 'https://schema.org',
61
+ '@type': 'HowTo',
62
+ name: title,
63
+ description,
64
+ step: howToData.map((step) => ({
65
+ '@type': 'HowToStep',
66
+ name: step.name,
67
+ text: step.text,
68
+ })),
69
+ };
70
+
71
+ const appSchema: WithContext<SoftwareApplication> = {
72
+ '@context': 'https://schema.org',
73
+ '@type': 'SoftwareApplication',
74
+ name: title,
75
+ description,
76
+ applicationCategory: 'UtilityApplication',
77
+ operatingSystem: 'All',
78
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
79
+ inLanguage: 'de',
80
+ };
81
+
82
+ export const content: ToolLocaleContent<SolarCalculatorUI> = {
83
+ slug,
84
+ title,
62
85
  description,
63
- step: howToData.map((step) => ({
64
- '@type': 'HowToStep',
65
- name: step.name,
66
- text: step.text,
67
- })),
68
- };
69
-
70
- const appSchema: WithContext<SoftwareApplication> = {
71
- '@context': 'https://schema.org',
72
- '@type': 'SoftwareApplication',
73
- name: title,
74
- description,
75
- applicationCategory: 'UtilityApplication',
76
- operatingSystem: 'All',
77
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
78
- inLanguage: 'de',
79
- };
80
-
81
- export const content: ToolLocaleContent<SolarCalculatorUI> = {
82
- slug,
83
- title,
84
- description,
85
- faqTitle: 'Häufig gestellte Fragen',
86
- faq: faqData,
87
- bibliographyTitle: 'Quellen',
88
- bibliography: [
89
- { name: 'NREL PVWatts Rechner', url: 'https://pvwatts.nrel.gov/' },
90
- { name: 'PVGIS Europäisches Solar-Tool', url: 'https://re.jrc.ec.europa.eu/pvgis/' },
91
- ],
92
- howTo: howToData,
93
- schemas: [faqSchema, howToSchema, appSchema],
94
- seo: [
95
- {
96
- type: 'title',
97
- text: 'Die Wissenschaft der Solar-Neigung',
98
- level: 2,
99
- },
100
- {
101
- type: 'paragraph',
102
- html: 'Der Unterschied zwischen einer hohen Stromersparnis und einer suboptimalen Anlage liegt oft im Winkel. Die Sonnenstrahlung ist dynamisch und ändert sich mit der Uhrzeit und Jahreszeit.',
103
- },
104
- {
105
- type: 'stats',
106
- items: [
107
- { value: 'Breite × 0,87', label: 'Faustformel', icon: 'mdi:angle-acute' },
108
- { value: '± 15°', label: 'Saisonaler Abgleich', icon: 'mdi:calendar-sync' },
109
- ],
110
- columns: 2,
111
- },
112
- {
113
- type: 'comparative',
114
- items: [
115
- {
116
- title: 'Das Prinzip der Rechtwinkligkeit',
117
- description: 'Ein Solarpanel arbeitet am effektivsten, wenn die Sonnenstrahlen im 90°-Winkel auftreffen.',
118
- icon: 'mdi:solar-panel',
119
- points: ['Maximiert die Energieausbeute', 'Basis aller Neigungsberechnungen'],
120
- },
121
- ],
122
- columns: 1,
123
- },
124
- {
125
- type: 'summary',
126
- title: 'Tipps für eine effiziente Installation',
127
- items: [
128
- 'Der Ganzjahreswinkel ist ideal für feste Montagen.',
129
- 'Abweichungen von ±5° sind vernachlässigbar.',
130
- 'Verschattung vermeiden ist wichtiger als der exakte Winkel.',
131
- 'Auf der Nordhalbkugel nach Süden ausrichten.',
132
- ],
133
- },
134
- ],
135
- ui: {
136
- labelLatitude: 'Geographische Breite',
137
- btnLocate: 'Meinen Standort finden',
138
- labelOptimal: 'Optimaler Ganzjahreswinkel',
139
- labelEfficiency: 'Maximale Effizienz',
140
- labelWinter: 'Winter',
141
- labelSummer: 'Sommer',
142
- hemisphereNorth: 'Nordhalbkugel — Nach SÜDEN ausrichten',
143
- hemisphereSouth: 'Südhalbkugel — Nach NORDEN ausrichten',
144
- geoNotAvailable: 'Geolokalisierung wird nicht unterstützt.',
145
- },
146
- };
86
+ faq: faqData,
87
+ bibliography,
88
+ howTo: howToData,
89
+ schemas: [faqSchema, howToSchema, appSchema],
90
+ seo: [
91
+ {
92
+ type: 'title',
93
+ text: 'Die Wissenschaft der Solar-Neigung',
94
+ level: 2,
95
+ },
96
+ {
97
+ type: 'paragraph',
98
+ html: 'Der Unterschied zwischen einer hohen Stromersparnis und einer suboptimalen Anlage liegt oft im Winkel. Die Sonnenstrahlung ist dynamisch und ändert sich mit der Uhrzeit und Jahreszeit.',
99
+ },
100
+ {
101
+ type: 'stats',
102
+ items: [
103
+ { value: 'Breite × 0,87', label: 'Faustformel', icon: 'mdi:angle-acute' },
104
+ { value: '± 15°', label: 'Saisonaler Abgleich', icon: 'mdi:calendar-sync' },
105
+ ],
106
+ columns: 2,
107
+ },
108
+ {
109
+ type: 'comparative',
110
+ items: [
111
+ {
112
+ title: 'Das Prinzip der Rechtwinkligkeit',
113
+ description: 'Ein Solarpanel arbeitet am effektivsten, wenn die Sonnenstrahlen im 90°-Winkel auftreffen.',
114
+ icon: 'mdi:solar-panel',
115
+ points: ['Maximiert die Energieausbeute', 'Basis aller Neigungsberechnungen'],
116
+ },
117
+ ],
118
+ columns: 1,
119
+ },
120
+ {
121
+ type: 'summary',
122
+ title: 'Tipps für eine effiziente Installation',
123
+ items: [
124
+ 'Der Ganzjahreswinkel ist ideal für feste Montagen.',
125
+ 'Abweichungen von ±5° sind vernachlässigbar.',
126
+ 'Verschattung vermeiden ist wichtiger als der exakte Winkel.',
127
+ 'Auf der Nordhalbkugel nach Süden ausrichten.',
128
+ ],
129
+ },
130
+ ],
131
+ ui: {
132
+ labelLatitude: 'Geographische Breite',
133
+ btnLocate: 'Meinen Standort finden',
134
+ labelOptimal: 'Optimaler Ganzjahreswinkel',
135
+ labelEfficiency: 'Maximale Effizienz',
136
+ labelWinter: 'Winter',
137
+ labelSummer: 'Sommer',
138
+ hemisphereNorth: 'Nordhalbkugel: Nach SÜDEN ausrichten',
139
+ hemisphereSouth: 'Südhalbkugel: Nach NORDEN ausrichten',
140
+ geoNotAvailable: 'Geolokalisierung wird nicht unterstützt.',
141
+ },
142
+ };