@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,121 +1,117 @@
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-panel-calculator';
6
- const title = '太阳能电池板倾斜角计算器';
7
- const description =
8
- '根据您所在的地理纬度计算太阳能电池板的最佳倾斜角度。获取固定安装和季节性调整的数值。';
9
-
10
- const faqData = [
11
- {
12
- question: '如果我屋顶的倾斜度不完美怎么办?',
13
- answer:
14
- '这不是大问题。5-10 度的偏差导致的年度发电量损失通常小于 3%。比起追求精确的角度,避免局部阴影遮挡更为重要。',
15
- },
16
- {
17
- question: '全球各地的最佳角度都一样吗?',
18
- answer:
19
- '不一样。它直接取决于您所在的纬度。北京(约 39°N)的最佳角度与广州(约 23°N)或悉尼(约 34°S)的都不同。',
20
- },
21
- {
22
- question: '电池板应该朝向哪个方向?',
23
- answer:
24
- '在北半球,应始终朝南(方位角 180°)。在南半球,应朝北。偏离正南/正北可能会导致显著的效率下降。',
25
- },
26
- ];
27
-
28
- const howToData = [
29
- {
30
- name: '输入纬度',
31
- text: '输入所在位置的十进制纬度,或点击自动定位按钮检测。',
32
- },
33
- {
34
- name: '查看最佳角度',
35
- text: '“全年最佳角度”是固定安装方式的主要参考数值。',
36
- },
37
- {
38
- name: '季节性调整(可选)',
39
- text: '如果支架可调节,建议根据冬季和夏季角度进行调整以最大化产量。',
40
- },
41
- ];
42
-
43
- const faqSchema: WithContext<FAQPage> = {
44
- '@context': 'https://schema.org',
45
- '@type': 'FAQPage',
46
- mainEntity: faqData.map((item) => ({
47
- '@type': 'Question',
48
- name: item.question,
49
- acceptedAnswer: { '@type': 'Answer', text: item.answer },
50
- })),
51
- };
52
-
53
- const howToSchema: WithContext<HowTo> = {
54
- '@context': 'https://schema.org',
55
- '@type': 'HowTo',
56
- 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-panel-calculator';
7
+ const title = '太阳能电池板倾斜角计算器';
8
+ const description =
9
+ '根据您所在的地理纬度计算太阳能电池板的最佳倾斜角度。获取固定安装和季节性调整的数值。';
10
+
11
+ const faqData = [
12
+ {
13
+ question: '如果我屋顶的倾斜度不完美怎么办?',
14
+ answer:
15
+ '这不是大问题。5-10 度的偏差导致的年度发电量损失通常小于 3%。比起追求精确的角度,避免局部阴影遮挡更为重要。',
16
+ },
17
+ {
18
+ question: '全球各地的最佳角度都一样吗?',
19
+ answer:
20
+ '不一样。它直接取决于您所在的纬度。北京(约 39°N)的最佳角度与广州(约 23°N)或悉尼(约 34°S)的都不同。',
21
+ },
22
+ {
23
+ question: '电池板应该朝向哪个方向?',
24
+ answer:
25
+ '在北半球,应始终朝南(方位角 180°)。在南半球,应朝北。偏离正南/正北可能会导致显著的效率下降。',
26
+ },
27
+ ];
28
+
29
+ const howToData = [
30
+ {
31
+ name: '输入纬度',
32
+ text: '输入所在位置的十进制纬度,或点击自动定位按钮检测。',
33
+ },
34
+ {
35
+ name: '查看最佳角度',
36
+ text: '"全年最佳角度"是固定安装方式的主要参考数值。',
37
+ },
38
+ {
39
+ name: '季节性调整(可选)',
40
+ text: '如果支架可调节,建议根据冬季和夏季角度进行调整以最大化产量。',
41
+ },
42
+ ];
43
+
44
+ const faqSchema: WithContext<FAQPage> = {
45
+ '@context': 'https://schema.org',
46
+ '@type': 'FAQPage',
47
+ mainEntity: faqData.map((item) => ({
48
+ '@type': 'Question',
49
+ name: item.question,
50
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
51
+ })),
52
+ };
53
+
54
+ const howToSchema: WithContext<HowTo> = {
55
+ '@context': 'https://schema.org',
56
+ '@type': 'HowTo',
57
+ name: title,
58
+ description,
59
+ step: howToData.map((step) => ({
60
+ '@type': 'HowToStep',
61
+ name: step.name,
62
+ text: step.text,
63
+ })),
64
+ };
65
+
66
+ const appSchema: WithContext<SoftwareApplication> = {
67
+ '@context': 'https://schema.org',
68
+ '@type': 'SoftwareApplication',
69
+ name: title,
70
+ description,
71
+ applicationCategory: 'UtilityApplication',
72
+ operatingSystem: 'All',
73
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'CNY' },
74
+ inLanguage: 'zh',
75
+ };
76
+
77
+ export const content: ToolLocaleContent<SolarCalculatorUI> = {
78
+ slug,
79
+ title,
57
80
  description,
58
- step: howToData.map((step) => ({
59
- '@type': 'HowToStep',
60
- name: step.name,
61
- text: step.text,
62
- })),
63
- };
64
-
65
- const appSchema: WithContext<SoftwareApplication> = {
66
- '@context': 'https://schema.org',
67
- '@type': 'SoftwareApplication',
68
- name: title,
69
- description,
70
- applicationCategory: 'UtilityApplication',
71
- operatingSystem: 'All',
72
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'CNY' },
73
- inLanguage: 'zh',
74
- };
75
-
76
- export const content: ToolLocaleContent<SolarCalculatorUI> = {
77
- slug,
78
- title,
79
- description,
80
- faqTitle: '常见问题',
81
- faq: faqData,
82
- bibliographyTitle: '参考资料',
83
- bibliography: [
84
- { name: 'NREL PVWatts 计算器', url: 'https://pvwatts.nrel.gov/' },
85
- { name: 'PVGIS — 欧盟太阳能计算工具', url: 'https://re.jrc.ec.europa.eu/pvgis/' },
86
- ],
87
- howTo: howToData,
88
- schemas: [faqSchema, howToSchema, appSchema],
89
- seo: [
90
- {
91
- type: 'title',
92
- text: '太阳能倾斜角的科学',
93
- level: 2,
94
- },
95
- {
96
- type: 'paragraph',
97
- html: '太阳能电池板的效率取决于太阳光照射的角度。了解地理几何学是将屋顶转化为高效发电站的第一步。',
98
- },
99
- {
100
- type: 'summary',
101
- title: '高效安装关键',
102
- items: [
103
- '全年最佳角度是固定安装的主要参考。',
104
- '±5 度的偏差对年度产量的影响微乎其微。',
105
- '避免阴影遮挡比追求精准角度更重要。',
106
- '北半球应朝南安装。',
107
- ],
108
- },
109
- ],
110
- ui: {
111
- labelLatitude: '地理纬度',
112
- btnLocate: '检测我的位置',
113
- labelOptimal: '全年最佳角度',
114
- labelEfficiency: '最大效率',
115
- labelWinter: '冬季',
116
- labelSummer: '夏季',
117
- hemisphereNorth: '北半球 — 请朝向南方',
118
- hemisphereSouth: '南半球 — 请朝向北方',
119
- geoNotAvailable: '当前浏览器不支持地理定位。',
120
- },
121
- };
81
+ faq: faqData,
82
+ bibliography,
83
+ howTo: howToData,
84
+ schemas: [faqSchema, howToSchema, appSchema],
85
+ seo: [
86
+ {
87
+ type: 'title',
88
+ text: '太阳能倾斜角的科学',
89
+ level: 2,
90
+ },
91
+ {
92
+ type: 'paragraph',
93
+ html: '太阳能电池板的效率取决于太阳光照射的角度。了解地理几何学是将屋顶转化为高效发电站的第一步。',
94
+ },
95
+ {
96
+ type: 'summary',
97
+ title: '高效安装关键',
98
+ items: [
99
+ '全年最佳角度是固定安装的主要参考。',
100
+ '±5 度的偏差对年度产量的影响微乎其微。',
101
+ '避免阴影遮挡比追求精准角度更重要。',
102
+ '北半球应朝南安装。',
103
+ ],
104
+ },
105
+ ],
106
+ ui: {
107
+ labelLatitude: '地理纬度',
108
+ btnLocate: '检测我的位置',
109
+ labelOptimal: '全年最佳角度',
110
+ labelEfficiency: '最大效率',
111
+ labelWinter: '冬季',
112
+ labelSummer: '夏季',
113
+ hemisphereNorth: '北半球: 请朝向南方',
114
+ hemisphereSouth: '南半球: 请朝向北方',
115
+ geoNotAvailable: '当前浏览器不支持地理定位。',
116
+ },
117
+ };
@@ -11,4 +11,5 @@ const { locale = 'es' } = Astro.props;
11
11
  const content = await solarCalculator.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,7 @@
1
+ export const bibliography = [
2
+ { name: 'Red Eléctrica de España (REE): ESIOS: Seguimiento del PVPC', url: 'https://www.esios.ree.es/es' },
3
+ { name: 'CNMC: Portal de comparación de ofertas de energía', url: 'https://comparador.cnmc.gob.es/' },
4
+ { name: 'MITECO: Bono Social y legislación energética', url: 'https://www.miteco.gob.es/' },
5
+ { name: 'IDAE: Guías prácticas de ahorro y autoconsumo', url: 'https://www.idae.es/' },
6
+ { name: 'OMIE: Precios horarios del mercado diario de electricidad', url: 'https://www.omie.es/' },
7
+ ];
@@ -1,133 +1,130 @@
1
- import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
- import type { ToolLocaleContent } from '../../../types';
3
- import type { TariffComparatorUI } from '../ui';
4
-
5
- const slug = 'stromtarif-vergleich';
6
- const title = 'Stromtarif Vergleich: Festpreis vs. Dynamisch';
7
- const description =
8
- 'Finden Sie heraus, welcher Stromtarif am besten zu Ihnen passt. Vergleichen Sie Festpreise mit dynamischen Tarifen basierend auf Ihrem Verbrauch.';
9
-
10
- const faqData = [
11
- {
12
- question: 'Was ist besser, ein Festpreis oder ein dynamischer Tarif?',
13
- answer:
14
- 'Festpreise bieten Planbarkeit. Dynamische Tarife (wie PVPC in Spanien) nutzen günstige Börsenpreise, sind aber volatil. Unser Rechner hilft Ihnen bei der Entscheidung.',
15
- },
16
- {
17
- question: 'Wie finde ich meinen Jahresverbrauch heraus?',
18
- answer:
19
- 'Diesen Wert finden Sie auf Ihrer letzten Jahresabrechnung, angegeben in kWh.',
20
- },
21
- {
22
- question: 'Was ist die vertraglich vereinbarte Leistung?',
23
- answer:
24
- 'Das ist die maximale Last (kW), die Sie gleichzeitig nutzen können. Zu hohe Werte kosten unnötig Geld, zu niedrige lassen die Sicherung rausfliegen.',
25
- },
26
- ];
27
-
28
- const howToData = [
29
- {
30
- name: 'Abrechnung prüfen',
31
- text: 'Suchen Sie Ihren Jahresverbrauch in kWh und Ihre Leistung in kW.',
32
- },
33
- {
34
- name: 'Werte einstellen',
35
- text: 'Passen Sie die Schieberegler an Ihre realen Daten an.',
36
- },
37
- {
38
- name: 'Ergebnisse vergleichen',
39
- text: 'Sehen Sie die geschätzten Jahreskosten für beide Tarifmodelle.',
40
- },
41
- ];
42
-
43
- const faqSchema: WithContext<FAQPage> = {
44
- '@context': 'https://schema.org',
45
- '@type': 'FAQPage',
46
- mainEntity: faqData.map((item) => ({
47
- '@type': 'Question',
48
- name: item.question,
49
- acceptedAnswer: { '@type': 'Answer', text: item.answer },
50
- })),
51
- };
52
-
53
- const howToSchema: WithContext<HowTo> = {
54
- '@context': 'https://schema.org',
55
- '@type': 'HowTo',
56
- name: title,
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { TariffComparatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'stromtarif-vergleich';
7
+ const title = 'Stromtarif Vergleich: Festpreis vs. Dynamisch';
8
+ const description =
9
+ 'Finden Sie heraus, welcher Stromtarif am besten zu Ihnen passt. Vergleichen Sie Festpreise mit dynamischen Tarifen basierend auf Ihrem Verbrauch.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Was ist besser, ein Festpreis oder ein dynamischer Tarif?',
14
+ answer:
15
+ 'Festpreise bieten Planbarkeit. Dynamische Tarife (wie PVPC in Spanien) nutzen günstige Börsenpreise, sind aber volatil. Unser Rechner hilft Ihnen bei der Entscheidung.',
16
+ },
17
+ {
18
+ question: 'Wie finde ich meinen Jahresverbrauch heraus?',
19
+ answer:
20
+ 'Diesen Wert finden Sie auf Ihrer letzten Jahresabrechnung, angegeben in kWh.',
21
+ },
22
+ {
23
+ question: 'Was ist die vertraglich vereinbarte Leistung?',
24
+ answer:
25
+ 'Das ist die maximale Last (kW), die Sie gleichzeitig nutzen können. Zu hohe Werte kosten unnötig Geld, zu niedrige lassen die Sicherung rausfliegen.',
26
+ },
27
+ ];
28
+
29
+ const howToData = [
30
+ {
31
+ name: 'Abrechnung prüfen',
32
+ text: 'Suchen Sie Ihren Jahresverbrauch in kWh und Ihre Leistung in kW.',
33
+ },
34
+ {
35
+ name: 'Werte einstellen',
36
+ text: 'Passen Sie die Schieberegler an Ihre realen Daten an.',
37
+ },
38
+ {
39
+ name: 'Ergebnisse vergleichen',
40
+ text: 'Sehen Sie die geschätzten Jahreskosten für beide Tarifmodelle.',
41
+ },
42
+ ];
43
+
44
+ const faqSchema: WithContext<FAQPage> = {
45
+ '@context': 'https://schema.org',
46
+ '@type': 'FAQPage',
47
+ mainEntity: faqData.map((item) => ({
48
+ '@type': 'Question',
49
+ name: item.question,
50
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
51
+ })),
52
+ };
53
+
54
+ const howToSchema: WithContext<HowTo> = {
55
+ '@context': 'https://schema.org',
56
+ '@type': 'HowTo',
57
+ name: title,
58
+ description,
59
+ step: howToData.map((step) => ({
60
+ '@type': 'HowToStep',
61
+ name: step.name,
62
+ text: step.text,
63
+ })),
64
+ };
65
+
66
+ const appSchema: WithContext<SoftwareApplication> = {
67
+ '@context': 'https://schema.org',
68
+ '@type': 'SoftwareApplication',
69
+ name: title,
70
+ description,
71
+ applicationCategory: 'UtilityApplication',
72
+ operatingSystem: 'All',
73
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
74
+ inLanguage: 'de',
75
+ };
76
+
77
+ export const content: ToolLocaleContent<TariffComparatorUI> = {
78
+ slug,
79
+ title,
57
80
  description,
58
- step: howToData.map((step) => ({
59
- '@type': 'HowToStep',
60
- name: step.name,
61
- text: step.text,
62
- })),
63
- };
64
-
65
- const appSchema: WithContext<SoftwareApplication> = {
66
- '@context': 'https://schema.org',
67
- '@type': 'SoftwareApplication',
68
- name: title,
69
- description,
70
- applicationCategory: 'UtilityApplication',
71
- operatingSystem: 'All',
72
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
73
- inLanguage: 'de',
74
- };
75
-
76
- export const content: ToolLocaleContent<TariffComparatorUI> = {
77
- slug,
78
- title,
79
- description,
80
- faqTitle: 'Häufig gestellte Fragen',
81
- faq: faqData,
82
- bibliographyTitle: 'Quellen',
83
- bibliography: [
84
- { name: 'Bundesnetzagentur — Stromtarife', url: 'https://www.bundesnetzagentur.de' },
85
- ],
86
- howTo: howToData,
87
- schemas: [faqSchema, howToSchema, appSchema],
88
- seo: [
89
- {
90
- type: 'title',
91
- text: 'Stromkosten verstehen und sparen',
92
- level: 2,
93
- },
94
- {
95
- type: 'paragraph',
96
- html: 'Die Wahl des richtigen Tarifs kann Hunderte von Euro im Jahr sparen. Vergleichen Sie basierend auf Ihrem individuellen Profil.',
97
- },
98
- {
99
- type: 'summary',
100
- title: 'Entscheidungshilfen',
101
- items: [
102
- 'Dynamische Tarife lohnen sich bei flexiblem Verbrauch.',
103
- 'Festpreise schützen vor Preissprüngen.',
104
- 'Die Leistungskostensenkung ist oft der schnellste Weg zum Sparen.',
105
- ],
106
- },
107
- ],
108
- ui: {
109
- labelConsumption: 'Jahresverbrauch',
110
- unitKwhYear: 'kWh/Jahr',
111
- labelPower: 'Vertragsleistung',
112
- unitKw: 'kW',
113
- labelMarket: 'Dynamischer Tarif',
114
- labelFree: 'Festpreis-Tarif',
115
- labelAnnualEst: 'Geschätzte Jahreskosten',
116
- labelPowerTerm: 'Grundpreis (Leistung)',
117
- labelEnergyTerm: 'Arbeitspreis (Verbrauch)',
118
- labelDashboard: 'Energie-Dashboard',
119
- labelMaxPower: 'Spitzenlast',
120
- labelMaxPowerEst: 'Geschätzte Spitze',
121
- labelCo2: 'CO₂-Fußabdruck',
122
- labelCo2Est: 'Jährliche Schätzung',
123
- labelSimulator: 'Szenario-Simulator',
124
- labelSolar: 'Solar-Eigenverbrauch',
125
- labelSolarDesc: 'Ersparnis mit Photovoltaik simulieren (30 % Reduktion)',
126
- labelShift: 'Lastverschiebung',
127
- labelShiftDesc: 'In günstige Zeiten verschoben:',
128
- badgeBetter: 'Günstigste Option',
129
- badgeWorseYear: 'Jahr',
130
- currencySign: '€',
131
- monthLabels: 'Jan,Feb,Mär,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez',
132
- },
133
- };
81
+ faq: faqData,
82
+ bibliography,
83
+ howTo: howToData,
84
+ schemas: [faqSchema, howToSchema, appSchema],
85
+ seo: [
86
+ {
87
+ type: 'title',
88
+ text: 'Stromkosten verstehen und sparen',
89
+ level: 2,
90
+ },
91
+ {
92
+ type: 'paragraph',
93
+ html: 'Die Wahl des richtigen Tarifs kann Hunderte von Euro im Jahr sparen. Vergleichen Sie basierend auf Ihrem individuellen Profil.',
94
+ },
95
+ {
96
+ type: 'summary',
97
+ title: 'Entscheidungshilfen',
98
+ items: [
99
+ 'Dynamische Tarife lohnen sich bei flexiblem Verbrauch.',
100
+ 'Festpreise schützen vor Preissprüngen.',
101
+ 'Die Leistungskostensenkung ist oft der schnellste Weg zum Sparen.',
102
+ ],
103
+ },
104
+ ],
105
+ ui: {
106
+ labelConsumption: 'Jahresverbrauch',
107
+ unitKwhYear: 'kWh/Jahr',
108
+ labelPower: 'Vertragsleistung',
109
+ unitKw: 'kW',
110
+ labelMarket: 'Dynamischer Tarif',
111
+ labelFree: 'Festpreis-Tarif',
112
+ labelAnnualEst: 'Geschätzte Jahreskosten',
113
+ labelPowerTerm: 'Grundpreis (Leistung)',
114
+ labelEnergyTerm: 'Arbeitspreis (Verbrauch)',
115
+ labelDashboard: 'Energie-Dashboard',
116
+ labelMaxPower: 'Spitzenlast',
117
+ labelMaxPowerEst: 'Geschätzte Spitze',
118
+ labelCo2: 'CO₂-Fußabdruck',
119
+ labelCo2Est: 'Jährliche Schätzung',
120
+ labelSimulator: 'Szenario-Simulator',
121
+ labelSolar: 'Solar-Eigenverbrauch',
122
+ labelSolarDesc: 'Ersparnis mit Photovoltaik simulieren (30 % Reduktion)',
123
+ labelShift: 'Lastverschiebung',
124
+ labelShiftDesc: 'In günstige Zeiten verschoben:',
125
+ badgeBetter: 'Günstigste Option',
126
+ badgeWorseYear: 'Jahr',
127
+ currencySign: '€',
128
+ monthLabels: 'Jan,Feb,Mär,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez',
129
+ },
130
+ };
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { TariffComparatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'electricity-tariff-comparator';
6
7
  const title = 'Electricity Tariff Comparator: Fixed vs Variable Price';
@@ -86,16 +87,8 @@ export const content: ToolLocaleContent<TariffComparatorUI> = {
86
87
  slug,
87
88
  title,
88
89
  description,
89
- faqTitle: 'Frequently Asked Questions',
90
90
  faq: faqData,
91
- bibliographyTitle: 'Bibliography',
92
- bibliography: [
93
- { name: 'Red Eléctrica de España (REE) — ESIOS: PVPC tracking', url: 'https://www.esios.ree.es/es' },
94
- { name: 'CNMC: Energy offers comparison portal', url: 'https://comparador.cnmc.gob.es/' },
95
- { name: 'MITECO: Social Bonus and energy legislation', url: 'https://www.miteco.gob.es/' },
96
- { name: 'IDAE: Practical guides on savings and self-consumption', url: 'https://www.idae.es/' },
97
- { name: 'OMIE: Hourly prices of the daily electricity market', url: 'https://www.omie.es/' },
98
- ],
91
+ bibliography,
99
92
  howTo: howToData,
100
93
  schemas: [faqSchema, howToSchema, appSchema],
101
94
  seo: [
@@ -121,13 +114,13 @@ export const content: ToolLocaleContent<TariffComparatorUI> = {
121
114
  type: 'comparative',
122
115
  items: [
123
116
  {
124
- title: 'PVPC Regulated Market',
117
+ title: 'PVPC: Regulated Market',
125
118
  description: 'The energy price changes every hour according to the wholesale market. On days with high renewable generation, it can drop to very low levels.',
126
119
  icon: 'mdi:lightning-bolt',
127
120
  points: ['No lock-in, free to switch', 'Access to Social Bonus for vulnerable consumers', 'Peak/Off-peak/Valley time-of-use pricing'],
128
121
  },
129
122
  {
130
- title: 'Free Market Fixed Price',
123
+ title: 'Free Market: Fixed Price',
131
124
  description: 'Energy suppliers set a price per kWh that remains stable throughout the year, regardless of the wholesale market.',
132
125
  icon: 'mdi:tag-outline',
133
126
  points: ['Stability and predictability', 'No surprises on the bill', 'May include additional services'],
@@ -142,7 +135,7 @@ export const content: ToolLocaleContent<TariffComparatorUI> = {
142
135
  },
143
136
  {
144
137
  type: 'paragraph',
145
- html: '<strong>Peak (most expensive):</strong> MonFri 10:0014:00 and 18:0022:00. <strong>Standard (mid-price):</strong> MonFri 08:0010:00, 14:0018:00 and 22:0000:00. <strong>Off-peak (cheapest):</strong> MonFri 00:0008:00 and all day on Saturdays, Sundays and public holidays. Scheduling washing machines, dishwashers and electric car charging during off-peak hours is the key to extreme savings.',
138
+ html: '<strong>Peak (most expensive):</strong> Mon-Fri 10:00-14:00 and 18:00-22:00. <strong>Standard (mid-price):</strong> Mon-Fri 08:00-10:00, 14:00-18:00 and 22:00-00:00. <strong>Off-peak (cheapest):</strong> Mon-Fri 00:00-08:00 and all day on Saturdays, Sundays and public holidays. Scheduling washing machines, dishwashers and electric car charging during off-peak hours is the key to extreme savings.',
146
139
  },
147
140
  {
148
141
  type: 'diagnostic',
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { TariffComparatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'comparador-tarifas-luz';
6
7
  const title = 'Comparador de Tarifas de Luz: Mercado Libre vs PVPC';
@@ -86,16 +87,8 @@ export const content: ToolLocaleContent<TariffComparatorUI> = {
86
87
  slug,
87
88
  title,
88
89
  description,
89
- faqTitle: 'Preguntas Frecuentes',
90
90
  faq: faqData,
91
- bibliographyTitle: 'Bibliografía',
92
- bibliography: [
93
- { name: 'Red Eléctrica de España (REE) — ESIOS: Seguimiento del PVPC', url: 'https://www.esios.ree.es/es' },
94
- { name: 'CNMC: Portal de comparación de ofertas de energía', url: 'https://comparador.cnmc.gob.es/' },
95
- { name: 'MITECO: Bono Social y legislación energética', url: 'https://www.miteco.gob.es/' },
96
- { name: 'IDAE: Guías prácticas de ahorro y autoconsumo', url: 'https://www.idae.es/' },
97
- { name: 'OMIE: Precios horarios del mercado diario de electricidad', url: 'https://www.omie.es/' },
98
- ],
91
+ bibliography,
99
92
  howTo: howToData,
100
93
  schemas: [faqSchema, howToSchema, appSchema],
101
94
  seo: [
@@ -121,13 +114,13 @@ export const content: ToolLocaleContent<TariffComparatorUI> = {
121
114
  type: 'comparative',
122
115
  items: [
123
116
  {
124
- title: 'PVPC Mercado Regulado',
117
+ title: 'PVPC: Mercado Regulado',
125
118
  description: 'El precio de la energía cambia cada hora según el mercado mayorista. En días de mucha generación renovable, puede caer a niveles muy bajos.',
126
119
  icon: 'mdi:lightning-bolt',
127
120
  points: ['Sin permanencia, cambio libre', 'Acceso al Bono Social para vulnerables', 'Discriminación horaria Punta/Llano/Valle'],
128
121
  },
129
122
  {
130
- title: 'Mercado Libre Precio Fijo',
123
+ title: 'Mercado Libre: Precio Fijo',
131
124
  description: 'Las comercializadoras fijan un precio por kWh que se mantiene durante el año, independientemente del mercado mayorista.',
132
125
  icon: 'mdi:tag-outline',
133
126
  points: ['Estabilidad y previsibilidad', 'Sin sorpresas en la factura', 'Puede incluir servicios adicionales'],
@@ -142,7 +135,7 @@ export const content: ToolLocaleContent<TariffComparatorUI> = {
142
135
  },
143
136
  {
144
137
  type: 'paragraph',
145
- html: '<strong>Punta (más caro):</strong> L-V de 10:0014:00 y 18:0022:00. <strong>Llano (intermedio):</strong> L-V de 08:0010:00, 14:0018:00 y 22:0000:00. <strong>Valle (más barato):</strong> L-V de 00:0008:00 y las 24h de sábados, domingos y festivos. Planificar lavadoras, lavavajillas y carga del coche eléctrico en horas valle es la clave del ahorro extremo.',
138
+ html: '<strong>Punta (más caro):</strong> L-V de 10:00-14:00 y 18:00-22:00. <strong>Llano (intermedio):</strong> L-V de 08:00-10:00, 14:00-18:00 y 22:00-00:00. <strong>Valle (más barato):</strong> L-V de 00:00-08:00 y las 24h de sábados, domingos y festivos. Planificar lavadoras, lavavajillas y carga del coche eléctrico en horas valle es la clave del ahorro extremo.',
146
139
  },
147
140
  {
148
141
  type: 'diagnostic',