@jjlmoya/utils-nature 1.3.0 → 1.5.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 (70) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +110 -0
  3. package/src/category/i18n/id.ts +110 -0
  4. package/src/category/i18n/it.ts +110 -0
  5. package/src/category/i18n/ja.ts +110 -0
  6. package/src/category/i18n/ko.ts +110 -0
  7. package/src/category/i18n/nl.ts +110 -0
  8. package/src/category/i18n/pl.ts +110 -0
  9. package/src/category/i18n/pt.ts +110 -0
  10. package/src/category/i18n/ru.ts +110 -0
  11. package/src/category/i18n/sv.ts +110 -0
  12. package/src/category/i18n/tr.ts +110 -0
  13. package/src/category/i18n/zh.ts +110 -0
  14. package/src/category/index.ts +13 -1
  15. package/src/tests/i18n_coverage.test.ts +36 -0
  16. package/src/tests/slug_language_code_format.test.ts +23 -0
  17. package/src/tests/slug_uniqueness.test.ts +81 -0
  18. package/src/tests/tool_validation.test.ts +1 -2
  19. package/src/tool/cricketThermometer/i18n/de.ts +181 -0
  20. package/src/tool/cricketThermometer/i18n/id.ts +181 -0
  21. package/src/tool/cricketThermometer/i18n/it.ts +181 -0
  22. package/src/tool/cricketThermometer/i18n/ja.ts +181 -0
  23. package/src/tool/cricketThermometer/i18n/ko.ts +181 -0
  24. package/src/tool/cricketThermometer/i18n/nl.ts +181 -0
  25. package/src/tool/cricketThermometer/i18n/pl.ts +181 -0
  26. package/src/tool/cricketThermometer/i18n/pt.ts +181 -0
  27. package/src/tool/cricketThermometer/i18n/ru.ts +181 -0
  28. package/src/tool/cricketThermometer/i18n/sv.ts +181 -0
  29. package/src/tool/cricketThermometer/i18n/tr.ts +181 -0
  30. package/src/tool/cricketThermometer/i18n/zh.ts +181 -0
  31. package/src/tool/cricketThermometer/index.ts +15 -7
  32. package/src/tool/digitalCarbon/i18n/de.ts +235 -0
  33. package/src/tool/digitalCarbon/i18n/id.ts +235 -0
  34. package/src/tool/digitalCarbon/i18n/it.ts +235 -0
  35. package/src/tool/digitalCarbon/i18n/ja.ts +235 -0
  36. package/src/tool/digitalCarbon/i18n/ko.ts +235 -0
  37. package/src/tool/digitalCarbon/i18n/nl.ts +235 -0
  38. package/src/tool/digitalCarbon/i18n/pl.ts +235 -0
  39. package/src/tool/digitalCarbon/i18n/pt.ts +235 -0
  40. package/src/tool/digitalCarbon/i18n/ru.ts +235 -0
  41. package/src/tool/digitalCarbon/i18n/sv.ts +235 -0
  42. package/src/tool/digitalCarbon/i18n/tr.ts +235 -0
  43. package/src/tool/digitalCarbon/i18n/zh.ts +235 -0
  44. package/src/tool/digitalCarbon/index.ts +15 -7
  45. package/src/tool/rainHarvester/i18n/de.ts +185 -0
  46. package/src/tool/rainHarvester/i18n/id.ts +185 -0
  47. package/src/tool/rainHarvester/i18n/it.ts +185 -0
  48. package/src/tool/rainHarvester/i18n/ja.ts +185 -0
  49. package/src/tool/rainHarvester/i18n/ko.ts +185 -0
  50. package/src/tool/rainHarvester/i18n/nl.ts +185 -0
  51. package/src/tool/rainHarvester/i18n/pl.ts +185 -0
  52. package/src/tool/rainHarvester/i18n/pt.ts +185 -0
  53. package/src/tool/rainHarvester/i18n/ru.ts +185 -0
  54. package/src/tool/rainHarvester/i18n/sv.ts +185 -0
  55. package/src/tool/rainHarvester/i18n/tr.ts +185 -0
  56. package/src/tool/rainHarvester/i18n/zh.ts +185 -0
  57. package/src/tool/rainHarvester/index.ts +15 -7
  58. package/src/tool/seedCalculator/i18n/de.ts +213 -0
  59. package/src/tool/seedCalculator/i18n/id.ts +213 -0
  60. package/src/tool/seedCalculator/i18n/it.ts +213 -0
  61. package/src/tool/seedCalculator/i18n/ja.ts +213 -0
  62. package/src/tool/seedCalculator/i18n/ko.ts +213 -0
  63. package/src/tool/seedCalculator/i18n/nl.ts +213 -0
  64. package/src/tool/seedCalculator/i18n/pl.ts +213 -0
  65. package/src/tool/seedCalculator/i18n/pt.ts +213 -0
  66. package/src/tool/seedCalculator/i18n/ru.ts +213 -0
  67. package/src/tool/seedCalculator/i18n/sv.ts +213 -0
  68. package/src/tool/seedCalculator/i18n/tr.ts +213 -0
  69. package/src/tool/seedCalculator/i18n/zh.ts +213 -0
  70. package/src/tool/seedCalculator/index.ts +15 -7
@@ -0,0 +1,235 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { DigitalCarbonLocaleContent } from '../index';
3
+
4
+ const slug = 'digital-carbon-footprint-calculator';
5
+ const title = '数字碳足迹计算器';
6
+ const description = '分析任何网页对环境的影响。估算每次访问的能耗和 CO₂ 排放量。';
7
+
8
+ const faqData = [
9
+ {
10
+ question: '什么是网站的碳足迹?',
11
+ answer: '它是指由于服务器、传输网络和用户设备为加载和呈现网页而消耗能量,从而排放到大气中的温室气体(主要是 CO₂)的总量。',
12
+ },
13
+ {
14
+ question: '如何衡量网站的影响?',
15
+ answer: '通常以每次访问的二氧化碳当量克数 (gCO₂e) 来衡量。高效的网站每次访问排放的 CO₂ 少于 0.2 克,而未经优化的页面每次加载可能超过 2 克或 3 克。',
16
+ },
17
+ {
18
+ question: '为什么互联网会造成污染?',
19
+ answer: '因为所有必要的基础设施(数据中心、海底光缆、WiFi 路由器、智能手机)都依靠电力运行,而世界上大部分地区的电力仍然来自燃煤或燃气。',
20
+ },
21
+ {
22
+ question: '如何减少我网站的 CO₂ 排放?',
23
+ answer: '最有效的方法是减轻页面重量:优化图像 (WebP)、压缩 CSS 和 JS 文件、使用懒加载 (lazy loading),并选择使用可再生能源的托管服务商。',
24
+ },
25
+ ];
26
+
27
+ const howToData = [
28
+ {
29
+ name: '输入 URL',
30
+ text: '在输入框中键入您要分析的网页地址。',
31
+ },
32
+ {
33
+ name: '开始分析',
34
+ text: '点击分析按钮,让我们的工具估算页面资源的重量。',
35
+ },
36
+ {
37
+ name: '查看您的评级',
38
+ text: '根据所分析网站的能源效率获得 A+ 到 F 的评分。',
39
+ },
40
+ {
41
+ name: '应用改进',
42
+ text: '参考个性化提示列表来减轻您的网站重量并降低环境影响。',
43
+ },
44
+ ];
45
+
46
+ const faqSchema: WithContext<FAQPage> = {
47
+ '@context': 'https://schema.org',
48
+ '@type': 'FAQPage',
49
+ mainEntity: faqData.map((item) => ({
50
+ '@type': 'Question',
51
+ name: item.question,
52
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
53
+ })),
54
+ };
55
+
56
+ const howToSchema: WithContext<HowToThing> = {
57
+ '@context': 'https://schema.org',
58
+ '@type': 'HowTo',
59
+ name: title,
60
+ description,
61
+ step: howToData.map((step, i) => ({
62
+ '@type': 'HowToStep',
63
+ position: i + 1,
64
+ name: step.name,
65
+ text: step.text,
66
+ })),
67
+ };
68
+
69
+ const appSchema: WithContext<SoftwareApplication> = {
70
+ '@context': 'https://schema.org',
71
+ '@type': 'SoftwareApplication',
72
+ name: title,
73
+ description,
74
+ applicationCategory: 'UtilityApplication',
75
+ operatingSystem: 'All',
76
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
77
+ inLanguage: 'zh',
78
+ };
79
+
80
+ export const content: DigitalCarbonLocaleContent = {
81
+ slug,
82
+ title,
83
+ description,
84
+ ui: {
85
+ headInputs: 'URL 分析器',
86
+ headResults: '影响结果',
87
+ headTips: '优化提示',
88
+ labelUrl: '页面 URL',
89
+ btnAnalyze: '分析网站',
90
+ btnAnalyzing: '分析中...',
91
+ placeholderUrl: 'https://example.cn',
92
+ errorInvalidUrl: '请输入有效的 URL。',
93
+ errorFetchFailed: '无法分析该网站。请尝试其他 URL。',
94
+
95
+ resultTitle: '数字碳足迹',
96
+ resultSubtitle: '估算的页面效率',
97
+ co2PerVisit: '每次访问生成的 CO₂',
98
+ energyPerVisit: '消耗的能量',
99
+ co2Annual: '年度 CO₂ 排放量 (10万次访问)',
100
+ impactTitle: '实际年度影响',
101
+ impactTrees: '所需树木数量',
102
+ impactKm: '汽车行驶里程换算 (约 km)',
103
+ treesLabel: '棵树',
104
+ kmLabel: '公里',
105
+
106
+ ratingExcellent: '非常出色。与全球平均水平相比,该页面的能耗非常低。',
107
+ ratingVeryGood: '效率极高。页面经过良好优化,环境影响极小。',
108
+ ratingGood: '效率尚可。虽然还有改进空间,但已优于平均水平。',
109
+ ratingAverage: '中等水平。该页面的能耗符合当前网页的平均预期。',
110
+ ratingPoor: '高于平均水平。建议优化图像、脚本和字体。',
111
+ ratingVeryPoor: '影响较大。页面重量显著,应当予以减轻。',
112
+ ratingCritical: '影响非常大。减少页面大小的空间非常可观。',
113
+
114
+ tipImages: '将图像转换为 WebP 或 AVIF 格式,可减轻高达 70% 的重量。',
115
+ tipCompression: '在服务器上启用 Brotli 或 GZIP 以压缩资源。',
116
+ tipLazyLoading: '对视口外的图像和视频使用懒加载。',
117
+ tipHosting: '选择使用可再生能源的托管服务(如 Cloudflare, Netlify, Vercel)。',
118
+ tipThirdParty: '删除不必要的分析脚本和第三方微件。',
119
+ tipFonts: '仅加载您实际使用的字体粗细。',
120
+ tipCache: '配置 HTTP 缓存标头以避免重复下载。',
121
+ },
122
+ faqTitle: '常见问题',
123
+ faq: faqData,
124
+ howTo: howToData,
125
+ bibliographyTitle: '网页可持续性参考资料',
126
+ seo: [
127
+ {
128
+ type: 'title',
129
+ text: '数字碳足迹计算器:您的网站产生了多少 CO₂',
130
+ level: 2,
131
+ },
132
+ {
133
+ type: 'paragraph',
134
+ html: '探索任何网页对环境的真实影响。分析其重量,估算每次访问生成的二氧化碳克数,并学习如何减少项目的数字污染。',
135
+ },
136
+ {
137
+ type: 'title',
138
+ text: '什么是网站的数字碳足迹?',
139
+ level: 2,
140
+ },
141
+ {
142
+ type: 'paragraph',
143
+ html: '每当您打开一个网页,您的设备、家用路由器、海底光缆以及世界另一端的服务器都会消耗电力。而这些电力在很大程度上仍然是通过燃烧化石燃料产生的。结果是:<strong>每次访问都会向大气中排放真实数量的 CO₂</strong>。',
144
+ },
145
+ {
146
+ type: 'paragraph',
147
+ html: '网站的<strong>数字碳足迹</strong>以每次访问的二氧化碳当量克数 (gCO₂e) 来衡量。一个平均水平的网站每次加载产生约 0.5 克 CO₂。虽然看起来微不足道,但一个每月访问量达 10 万次的网站每年排放的 CO₂ 可超过 600 公斤,相当于驾驶一辆燃油车行驶 3,000 多公里。',
148
+ },
149
+ {
150
+ type: 'title',
151
+ text: '如何计算网站的 CO₂ 排放量?',
152
+ level: 2,
153
+ },
154
+ {
155
+ type: 'paragraph',
156
+ html: '所使用的计算模型基于<strong>可持续网页设计模型 (Sustainable Web Design Model)</strong> 标准,该标准将能耗分为四个主要部分:',
157
+ },
158
+ {
159
+ type: 'card',
160
+ title: '数据传输',
161
+ html: '页面的总重量决定了传输量。网络基础设施的标准值为 <code>0.81 kWh/GB</code>。',
162
+ },
163
+ {
164
+ type: 'card',
165
+ title: '用户设备',
166
+ html: '接收页面的电脑或手机会消耗能量,处理每 GB 数据的能耗估算为 <code>0.52 kWh</code>。',
167
+ },
168
+ {
169
+ type: 'card',
170
+ title: '碳强度',
171
+ html: '使用全球参考值 <code>442 gCO₂/kWh</code> 将能耗转换为真实的碳排放量。',
172
+ },
173
+ {
174
+ type: 'card',
175
+ title: '缓存因子',
176
+ html: '该模型假定 25% 的用户已有缓存资源,因此应用了 <code>0.75</code> 的修正因子。',
177
+ },
178
+ {
179
+ type: 'title',
180
+ text: '效率评级意味着什么?',
181
+ level: 2,
182
+ },
183
+ {
184
+ type: 'list',
185
+ items: [
186
+ '<strong>A+ 和 A:</strong> 少于 0.2 克 CO₂。非常轻量且经过优化的网站。',
187
+ '<strong>B:</strong> 介于 0.2 和 0.5 克之间。低于全球平均水平。',
188
+ '<strong>C:</strong> 介于 0.5 和 1 克之间。当前网页的平均水平。',
189
+ '<strong>D 和 E:</strong> 介于 1 和 4 克之间。较重的页面,有明显的影响。',
190
+ '<strong>F:</strong> 每次访问超过 4 克。影响非常大。',
191
+ ],
192
+ },
193
+ {
194
+ type: 'title',
195
+ text: '如何减少网站的碳足迹',
196
+ level: 2,
197
+ },
198
+ {
199
+ type: 'card',
200
+ title: '图像优化',
201
+ html: '使用 <strong>WebP 或 AVIF</strong> 格式,可在不明显损失质量的情况下将大小减少多达 80%。',
202
+ },
203
+ {
204
+ type: 'card',
205
+ title: '服务器压缩',
206
+ html: '启用 <strong>Brotli 或 GZIP</strong> 可将文本文件的大小减少多达 70%。',
207
+ },
208
+ {
209
+ type: 'card',
210
+ title: '可持续托管',
211
+ html: '选择拥有<strong>认证可再生能源</strong>的托管商可将影响降低近 100%。',
212
+ },
213
+ {
214
+ type: 'card',
215
+ title: '缓存和 CDN',
216
+ html: '配置<strong>长效缓存标头</strong>以避免不必要的重复下载。',
217
+ },
218
+ {
219
+ type: 'title',
220
+ text: '互联网对气候的真实影响',
221
+ level: 2,
222
+ },
223
+ {
224
+ type: 'paragraph',
225
+ html: '互联网约占<strong>全球 CO₂ 排放量的 2% 到 4%</strong>,这一数字可与航空业相提并论。您消除的每一个字节不仅让网站变快,更在实实在在地减少数字污染。',
226
+ },
227
+ ],
228
+ bibliography: [
229
+ { name: 'Sustainable Web Design Model', url: 'https://sustainablewebdesign.org/' },
230
+ { name: 'Website Carbon Calculator', url: 'https://www.websitecarbon.com/' },
231
+ { name: 'The Green Web Foundation', url: 'https://www.thegreenwebfoundation.org/' },
232
+ { name: 'W3C - Web Sustainability Guidelines', url: 'https://w3c.github.io/sustyweb/' },
233
+ ],
234
+ schemas: [faqSchema, howToSchema, appSchema],
235
+ };
@@ -6,10 +6,6 @@ import type { DigitalCarbonUI } from './ui';
6
6
 
7
7
  export type DigitalCarbonLocaleContent = ToolLocaleContent<DigitalCarbonUI>;
8
8
 
9
- import { content as es } from './i18n/es';
10
- import { content as en } from './i18n/en';
11
- import { content as fr } from './i18n/fr';
12
-
13
9
  export const digitalCarbon: NatureToolEntry<DigitalCarbonUI> = {
14
10
  id: 'digital-carbon',
15
11
  icons: {
@@ -17,9 +13,21 @@ export const digitalCarbon: NatureToolEntry<DigitalCarbonUI> = {
17
13
  fg: 'mdi:monitor',
18
14
  },
19
15
  i18n: {
20
- es: async () => es,
21
- en: async () => en,
22
- fr: async () => fr,
16
+ de: async () => (await import('./i18n/de')).content,
17
+ en: async () => (await import('./i18n/en')).content,
18
+ es: async () => (await import('./i18n/es')).content,
19
+ fr: async () => (await import('./i18n/fr')).content,
20
+ id: async () => (await import('./i18n/id')).content,
21
+ it: async () => (await import('./i18n/it')).content,
22
+ ja: async () => (await import('./i18n/ja')).content,
23
+ ko: async () => (await import('./i18n/ko')).content,
24
+ nl: async () => (await import('./i18n/nl')).content,
25
+ pl: async () => (await import('./i18n/pl')).content,
26
+ pt: async () => (await import('./i18n/pt')).content,
27
+ ru: async () => (await import('./i18n/ru')).content,
28
+ sv: async () => (await import('./i18n/sv')).content,
29
+ tr: async () => (await import('./i18n/tr')).content,
30
+ zh: async () => (await import('./i18n/zh')).content,
23
31
  },
24
32
  };
25
33
 
@@ -0,0 +1,185 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { RainHarvesterLocaleContent } from '../index';
3
+
4
+ const slug = 'regenwasser-ernte-rechner';
5
+ const title = 'Regenwasser Ernte Rechner';
6
+ const description = 'Berechnen Sie, wie viel Regenwasser Sie von Ihrem Dach sammeln können, und dimensionieren Sie Ihren Speichertank.';
7
+
8
+ const faqData = [
9
+ {
10
+ question: 'Wie viel Wasser kann ich tatsächlich von meinem Dach sammeln?',
11
+ answer: 'Als Faustregel gilt: Pro Quadratmeter Dachfläche und Millimeter Regen können Sie etwa 1 Liter Wasser sammeln. Es entstehen jedoch Verluste durch Verdunstung und Filtration, die mit dem „Abflussbeiwert“ angepasst werden.',
12
+ },
13
+ {
14
+ question: 'Was ist der Abflussbeiwert?',
15
+ answer: 'Dies ist ein Prozentsatz, der angibt, wie viel Wasser je nach Dachmaterial verloren geht. Ein Metall- oder Ziegeldach ist sehr effizient (0,85-0,95), während ein Kies- oder Erddach viel weniger effizient ist (0,1-0,3).',
16
+ },
17
+ {
18
+ question: 'Wie dimensioniere ich den Speichertank?',
19
+ answer: 'Sie sollten das maximal erwartete Regenvolumen in einem Monat berechnen und es mit Ihrem geschätzten monatlichen Verbrauch abgleichen. Ein zu kleiner Tank läuft bei Stürmen über, und ein zu großer Tank ist unnötig teuer.',
20
+ },
21
+ {
22
+ question: 'Ist gesammeltes Regenwasser als Trinkwasser sicher?',
23
+ answer: 'Nicht direkt. Wasser führt Staub, Vogelkot und Partikel aus der Luft mit sich. Für den menschlichen Verzehr muss es Sedimentfilter, Aktivkohle und eine Desinfektion mittels UV-Licht oder Chlor durchlaufen.',
24
+ },
25
+ ];
26
+
27
+ const howToData = [
28
+ {
29
+ name: 'Horizontale Fläche messen',
30
+ text: 'Messen Sie die Länge und Breite Ihrer Dachbasis (nicht die geneigte Fläche, sondern die Fläche, die Schatten auf den Boden wirft).',
31
+ },
32
+ {
33
+ name: 'Lokalen Niederschlag prüfen',
34
+ text: 'Suchen Sie beim nationalen Wetterdienst nach dem durchschnittlichen jährlichen oder monatlichen Niederschlag in Ihrer Region in Millimetern (mm).',
35
+ },
36
+ {
37
+ name: 'Materialeffizienz anwenden',
38
+ text: 'Wählen Sie Ihr Dachmaterial in unserem Rechner aus, um das Wasser abzuziehen, das durch Absorption oder Hitze verloren geht.',
39
+ },
40
+ {
41
+ name: 'Benötigtes Volumen berechnen',
42
+ text: 'Nutzen Sie das Ergebnis des jährlichen Ertrags in Litern, um einen Tank zu wählen, der für Trockenperioden mindestens 20-30 % der Gesamternte speichern kann.',
43
+ },
44
+ ];
45
+
46
+ const faqSchema: WithContext<FAQPage> = {
47
+ '@context': 'https://schema.org',
48
+ '@type': 'FAQPage',
49
+ mainEntity: faqData.map((item) => ({
50
+ '@type': 'Question',
51
+ name: item.question,
52
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
53
+ })),
54
+ };
55
+
56
+ const howToSchema: WithContext<HowToThing> = {
57
+ '@context': 'https://schema.org',
58
+ '@type': 'HowTo',
59
+ name: title,
60
+ description,
61
+ step: howToData.map((step, i) => ({
62
+ '@type': 'HowToStep',
63
+ position: i + 1,
64
+ name: step.name,
65
+ text: step.text,
66
+ })),
67
+ };
68
+
69
+ const appSchema: WithContext<SoftwareApplication> = {
70
+ '@context': 'https://schema.org',
71
+ '@type': 'SoftwareApplication',
72
+ name: title,
73
+ description,
74
+ applicationCategory: 'UtilityApplication',
75
+ operatingSystem: 'All',
76
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
77
+ inLanguage: 'de',
78
+ };
79
+
80
+ export const content: RainHarvesterLocaleContent = {
81
+ slug,
82
+ title,
83
+ description,
84
+ ui: {
85
+ headInputs: 'Dach-Einstellungen',
86
+ headResults: 'Ernte-Potenzial',
87
+ labelArea: 'Dachfläche',
88
+ labelRainfall: 'Jährlicher Niederschlag',
89
+ labelMaterial: 'Dachmaterial',
90
+ unitM2: 'm²',
91
+ unitMm: 'mm',
92
+ unitLiters: 'Liter',
93
+ helpRainfall: 'Unbekannt? Suchen Sie bei Google nach „durchschnittlicher jährlicher Niederschlag [Ihre Stadt]“.',
94
+ efficiencyTitle: 'Effizienzfaktor',
95
+ efficiencyNote: 'Für Filter und Verdunstung wird ein Verlust von 10 % angesetzt.',
96
+ resultTitle: 'Jährliches Erntepotenzial',
97
+ equivalenciesTitle: 'Praktische Entsprechungen',
98
+ labelFlushes: 'Toilettenspülungen',
99
+ labelShowers: 'Duschen (10 Min.)',
100
+ labelGarden: 'Gartenbewässerung',
101
+ gardenArea: '(50m²)',
102
+ materialMetal: 'Metall / Glasierte Ziegel',
103
+ materialClay: 'Dachziegel / Ton',
104
+ materialConcrete: 'Beton / Asphalt',
105
+ materialGravel: 'Kies / Gründach',
106
+ },
107
+ seo: [
108
+ {
109
+ type: 'title',
110
+ text: 'Regenwassernutzung: Autonomie und Nachhaltigkeit',
111
+ level: 2,
112
+ },
113
+ {
114
+ type: 'paragraph',
115
+ html: 'Die meisten Hausbesitzer sind sich des Potenzials ihres eigenen Daches nicht bewusst. Ein Standarddach kann jedes Jahr Tausende Liter kostenloses Wasser auffangen. Dieses Tool quantifiziert dieses Potenzial, sodass Sie genau berechnen können, wie viel Wasser Sie „ernten“ können, und die ideale Tankgröße für die Speicherung bestimmen können.',
116
+ },
117
+ {
118
+ type: 'title',
119
+ text: 'Berechnungslogik',
120
+ level: 3,
121
+ },
122
+ {
123
+ type: 'paragraph',
124
+ html: 'Die Grundformel für die Regenwassersammlung ist einfach, aber wirkungsvoll:',
125
+ },
126
+ {
127
+ type: 'paragraph',
128
+ html: '<code style="display:block;padding:1rem;background:var(--bg-alt);border-radius:0.5rem;margin:1rem 0;font-family:monospace;">Volumen = Fläche × Niederschlag × Abflussbeiwert × Filtereffizienz</code>',
129
+ },
130
+ {
131
+ type: 'list',
132
+ items: [
133
+ '<strong>Fläche:</strong> Ihre Dachgrundfläche (projizierte Länge × Breite).',
134
+ '<strong>Niederschlag:</strong> Fallender Regen in Millimetern.',
135
+ '<strong>Beiwert:</strong> Wie viel Wasser Ihr Dach verliert (z. B. Absorption).',
136
+ '<strong>Effizienz:</strong> Verluste in Vor-Tank-Filtern (~10 %).',
137
+ ],
138
+ },
139
+ {
140
+ type: 'title',
141
+ text: 'Warum Regenwasser sammeln?',
142
+ level: 3,
143
+ },
144
+ {
145
+ type: 'list',
146
+ items: [
147
+ '<strong>Ersparnis:</strong> Reduzieren Sie Ihre Wasserrechnung erheblich.',
148
+ '<strong>Gartenarbeit:</strong> Pflanzen lieben Wasser ohne Chlor oder Kalk.',
149
+ '<strong>Resilienz:</strong> Behalten Sie eine Notreserve für den Fall von Unterbrechungen.',
150
+ ],
151
+ },
152
+ {
153
+ type: 'title',
154
+ text: 'Dimensionierung des Tanks',
155
+ level: 2,
156
+ },
157
+ {
158
+ type: 'paragraph',
159
+ html: 'Der häufigste Fehler ist der Kauf eines Tanks, der nur auf dem Budget basiert. Wenn er zu klein ist, verschwenden Sie Tausende Liter durch Überlauf. Wenn er zu groß ist, geben Sie unnötig Geld aus. Eine allgemeine Regel ist, eine Kapazität für die Speicherung von <strong>3 Monaten</strong> des durchschnittlichen Niederschlags in Ihrer Region zu haben, um Trockenperioden zu überbrücken.',
160
+ },
161
+ ],
162
+ faqTitle: 'Häufig gestellte Fragen',
163
+ faq: faqData,
164
+ howTo: howToData,
165
+ bibliographyTitle: 'Wissenschaftliche Referenzen',
166
+ bibliography: [
167
+ {
168
+ name: 'FAO - Rainwater Harvesting and Storage',
169
+ url: 'https://www.fao.org/3/a1348s/a1348s.pdf',
170
+ },
171
+ {
172
+ name: 'Texas A&M AgriLife Extension - Rainwater Harvesting',
173
+ url: 'https://rainwaterharvesting.tamu.edu/',
174
+ },
175
+ {
176
+ name: 'Brad Lancaster - Rainwater Harvesting for Drylands',
177
+ url: 'https://www.harvestingrainwater.com/',
178
+ },
179
+ {
180
+ name: 'European Environment Agency - Water Resources',
181
+ url: 'https://www.eea.europa.eu/en/topics/in-depth/water',
182
+ },
183
+ ],
184
+ schemas: [faqSchema, howToSchema, appSchema],
185
+ };
@@ -0,0 +1,185 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { RainHarvesterLocaleContent } from '../index';
3
+
4
+ const slug = 'kalkulator-air-hujan';
5
+ const title = 'Kalkulator Pemanenan Air Hujan';
6
+ const description = 'Hitung berapa banyak air hujan yang dapat Anda kumpulkan dari atap Anda dan tentukan ukuran tangki penyimpanan Anda.';
7
+
8
+ const faqData = [
9
+ {
10
+ question: 'Berapa banyak air yang sebenarnya bisa saya kumpulkan dari atap saya?',
11
+ answer: 'Aturan umumnya adalah untuk setiap meter persegi atap dan setiap milimeter hujan, Anda dapat mengumpulkan sekitar 1 liter air. Namun, ada kehilangan dari penguapan dan filtrasi yang disesuaikan dengan "koefisien limpasan".',
12
+ },
13
+ {
14
+ question: 'Apa itu koefisien limpasan?',
15
+ answer: 'Ini adalah persentase yang menunjukkan seberapa banyak air yang hilang tergantung pada bahan atap. Atap logam atau genteng sangat efisien (0,85-0,95), sedangkan atap kerikil atau tanah jauh kurang efisien (0,1-0,3).',
16
+ },
17
+ {
18
+ question: 'Bagaimana cara menentukan ukuran tangki penyimpanan?',
19
+ answer: 'Anda harus menghitung volume hujan maksimum yang diharapkan dalam sebulan dan mencocokkannya dengan perkiraan konsumsi bulanan Anda. Tangki yang terlalu kecil akan meluap saat badai, dan tangki yang terlalu besar akan membuang biaya yang tidak perlu.',
20
+ },
21
+ {
22
+ question: 'Apakah aman meminum air hujan yang dikumpulkan?',
23
+ answer: 'Tidak secara langsung. Air membawa debu, kotoran burung, dan partikel di udara. Untuk konsumsi manusia, air harus melewati filter sedimen, karbon aktif, dan disinfeksi menggunakan lampu UV atau klorin.',
24
+ },
25
+ ];
26
+
27
+ const howToData = [
28
+ {
29
+ name: 'Ukur permukaan horizontal',
30
+ text: 'Ukur panjang dan lebar alas atap Anda (bukan permukaan yang miring, melainkan area yang memproyeksikan bayangan di tanah).',
31
+ },
32
+ {
33
+ name: 'Periksa curah hujan lokal',
34
+ text: 'Cari layanan meteorologi nasional untuk rata-rata curah hujan tahunan atau bulanan di daerah Anda dalam milimeter (mm).',
35
+ },
36
+ {
37
+ name: 'Terapkan efisiensi bahan',
38
+ text: 'Pilih bahan atap Anda di kalkulator kami untuk memotong air yang akan hilang melalui penyerapan atau panas.',
39
+ },
40
+ {
41
+ name: 'Hitung volume yang dibutuhkan',
42
+ text: 'Gunakan hasil liter tahunan untuk memilih tangki yang dapat menampung setidaknya 20-30% dari total panen untuk periode kering.',
43
+ },
44
+ ];
45
+
46
+ const faqSchema: WithContext<FAQPage> = {
47
+ '@context': 'https://schema.org',
48
+ '@type': 'FAQPage',
49
+ mainEntity: faqData.map((item) => ({
50
+ '@type': 'Question',
51
+ name: item.question,
52
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
53
+ })),
54
+ };
55
+
56
+ const howToSchema: WithContext<HowToThing> = {
57
+ '@context': 'https://schema.org',
58
+ '@type': 'HowTo',
59
+ name: title,
60
+ description,
61
+ step: howToData.map((step, i) => ({
62
+ '@type': 'HowToStep',
63
+ position: i + 1,
64
+ name: step.name,
65
+ text: step.text,
66
+ })),
67
+ };
68
+
69
+ const appSchema: WithContext<SoftwareApplication> = {
70
+ '@context': 'https://schema.org',
71
+ '@type': 'SoftwareApplication',
72
+ name: title,
73
+ description,
74
+ applicationCategory: 'UtilityApplication',
75
+ operatingSystem: 'All',
76
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
77
+ inLanguage: 'id',
78
+ };
79
+
80
+ export const content: RainHarvesterLocaleContent = {
81
+ slug,
82
+ title,
83
+ description,
84
+ ui: {
85
+ headInputs: 'Pengaturan Atap',
86
+ headResults: 'Potensi Panen',
87
+ labelArea: 'Luas Atap',
88
+ labelRainfall: 'Curah Hujan Tahunan',
89
+ labelMaterial: 'Bahan Atap',
90
+ unitM2: 'm²',
91
+ unitMm: 'mm',
92
+ unitLiters: 'Liter',
93
+ helpRainfall: 'Tidak tahu? Cari "rata-rata curah hujan tahunan [kota Anda]" di Google.',
94
+ efficiencyTitle: 'Faktor Efisiensi',
95
+ efficiencyNote: 'Kehilangan 10% diterapkan untuk filter dan penguapan.',
96
+ resultTitle: 'Potensi Panen Tahunan',
97
+ equivalenciesTitle: 'Setara Praktis',
98
+ labelFlushes: 'Siraman Toilet',
99
+ labelShowers: 'Mandi (10 menit)',
100
+ labelGarden: 'Menyiram Taman',
101
+ gardenArea: '(50m²)',
102
+ materialMetal: 'Logam / Genteng Mengkilap',
103
+ materialClay: 'Genteng Tanah Liat',
104
+ materialConcrete: 'Beton / Aspal',
105
+ materialGravel: 'Kerikil / Atap Hijau',
106
+ },
107
+ seo: [
108
+ {
109
+ type: 'title',
110
+ text: 'Pemanenan Air Hujan: Otonomi dan Keberlanjutan',
111
+ level: 2,
112
+ },
113
+ {
114
+ type: 'paragraph',
115
+ html: 'Sebagian besar pemilik rumah tidak menyadari potensi atap mereka sendiri. Atap standar dapat menampung ribuan liter air gratis setiap tahun. Alat ini mengukur potensi tersebut, memungkinkan Anda menghitung dengan tepat berapa banyak air yang dapat Anda "panen" dan menentukan ukuran tangki yang ideal untuk penyimpanan.',
116
+ },
117
+ {
118
+ type: 'title',
119
+ text: 'Logika Perhitungan',
120
+ level: 3,
121
+ },
122
+ {
123
+ type: 'paragraph',
124
+ html: 'Rumus dasar untuk pengumpulan air hujan sederhana namun kuat:',
125
+ },
126
+ {
127
+ type: 'paragraph',
128
+ html: '<code style="display:block;padding:1rem;background:var(--bg-alt);border-radius:0.5rem;margin:1rem 0;font-family:monospace;">Volume = Luas × Curah Hujan × Koefisien Limpasan × Efisiensi Filter</code>',
129
+ },
130
+ {
131
+ type: 'list',
132
+ items: [
133
+ '<strong>Luas:</strong> Alas atap Anda (panjang × lebar proyeksi).',
134
+ '<strong>Curah Hujan:</strong> Hujan yang turun dalam milimeter.',
135
+ '<strong>Koefisien:</strong> Seberapa banyak air yang hilang di atap Anda (misalnya, penyerapan).',
136
+ '<strong>Efisiensi:</strong> Kehilangan pada filter sebelum tangki (~10%).',
137
+ ],
138
+ },
139
+ {
140
+ type: 'title',
141
+ text: 'Mengapa Memanen Air Hujan?',
142
+ level: 3,
143
+ },
144
+ {
145
+ type: 'list',
146
+ items: [
147
+ '<strong>Penghematan:</strong> Mengurangi tagihan air Anda secara signifikan.',
148
+ '<strong>Berkebun:</strong> Tanaman menyukai air tanpa kaporit atau kapur.',
149
+ '<strong>Ketahanan:</strong> Menjaga cadangan darurat jika terjadi pemutusan aliran air.',
150
+ ],
151
+ },
152
+ {
153
+ type: 'title',
154
+ text: 'Penentuan Ukuran Tangki',
155
+ level: 2,
156
+ },
157
+ {
158
+ type: 'paragraph',
159
+ html: 'Kesalahan paling umum adalah membeli tangki hanya berdasarkan anggaran. Jika terlalu kecil, Anda akan membuang ribuan liter karena meluap. Jika terlalu besar, Anda akan menghabiskan uang secara tidak perlu. Aturan umumnya adalah memiliki kapasitas untuk menyimpan <strong>3 bulan</strong> rata-rata curah hujan di daerah Anda, yang memungkinkan Anda menjembatani musim kemarau.',
160
+ },
161
+ ],
162
+ faqTitle: 'Pertanyaan yang Sering Diajukan',
163
+ faq: faqData,
164
+ howTo: howToData,
165
+ bibliographyTitle: 'Referensi Ilmiah',
166
+ bibliography: [
167
+ {
168
+ name: 'FAO - Rainwater Harvesting and Storage',
169
+ url: 'https://www.fao.org/3/a1348s/a1348s.pdf',
170
+ },
171
+ {
172
+ name: 'Texas A&M AgriLife Extension - Rainwater Harvesting',
173
+ url: 'https://rainwaterharvesting.tamu.edu/',
174
+ },
175
+ {
176
+ name: 'Brad Lancaster - Rainwater Harvesting for Drylands',
177
+ url: 'https://www.harvestingrainwater.com/',
178
+ },
179
+ {
180
+ name: 'European Environment Agency - Water Resources',
181
+ url: 'https://www.eea.europa.eu/en/topics/in-depth/water',
182
+ },
183
+ ],
184
+ schemas: [faqSchema, howToSchema, appSchema],
185
+ };