@jjlmoya/utils-nature 1.23.0 → 1.24.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.
- package/package.json +2 -2
- package/src/category/i18n/es.ts +1 -1
- package/src/category/i18n/fr.ts +110 -110
- package/src/category/i18n/it.ts +1 -1
- package/src/category/i18n/pl.ts +1 -1
- package/src/category/i18n/pt.ts +1 -1
- package/src/category/i18n/ru.ts +110 -110
- package/src/category/seo.astro +1 -1
- package/src/components/PreviewNavSidebar.astro +1 -1
- package/src/components/PreviewToolbar.astro +1 -1
- package/src/data.ts +1 -1
- package/src/env.d.ts +1 -1
- package/src/layouts/PreviewLayout.astro +117 -117
- package/src/pages/[locale]/[slug].astro +164 -164
- package/src/pages/index.astro +1 -1
- package/src/tests/category_seo_quality.test.ts +74 -0
- package/src/tests/faq_count.test.ts +19 -19
- package/src/tests/mocks/astro_mock.js +1 -1
- package/src/tests/no_en_dash.test.ts +71 -71
- package/src/tests/no_h1_in_components.test.ts +1 -1
- package/src/tests/seo_length.test.ts +23 -23
- package/src/tests/seo_parity.test.ts +2 -2
- package/src/tests/spanish_leakage.test.ts +175 -175
- package/src/tool/cricketThermometer/i18n/de.ts +169 -169
- package/src/tool/cricketThermometer/i18n/en.ts +169 -169
- package/src/tool/cricketThermometer/i18n/es.ts +169 -169
- package/src/tool/cricketThermometer/i18n/fr.ts +169 -169
- package/src/tool/cricketThermometer/i18n/id.ts +169 -169
- package/src/tool/cricketThermometer/i18n/it.ts +169 -169
- package/src/tool/cricketThermometer/i18n/ja.ts +169 -169
- package/src/tool/cricketThermometer/i18n/ko.ts +169 -169
- package/src/tool/cricketThermometer/i18n/nl.ts +169 -169
- package/src/tool/cricketThermometer/i18n/pl.ts +169 -169
- package/src/tool/cricketThermometer/i18n/pt.ts +169 -169
- package/src/tool/cricketThermometer/i18n/ru.ts +169 -169
- package/src/tool/cricketThermometer/i18n/sv.ts +169 -169
- package/src/tool/cricketThermometer/i18n/tr.ts +169 -169
- package/src/tool/cricketThermometer/i18n/zh.ts +169 -169
- package/src/tool/cricketThermometer/seo.astro +15 -15
- package/src/tool/digitalCarbon/i18n/de.ts +229 -229
- package/src/tool/digitalCarbon/i18n/fr.ts +229 -229
- package/src/tool/digitalCarbon/i18n/ru.ts +229 -229
- package/src/tool/digitalCarbon/seo.astro +15 -15
- package/src/tool/rainHarvester/i18n/de.ts +167 -167
- package/src/tool/rainHarvester/i18n/en.ts +167 -167
- package/src/tool/rainHarvester/i18n/es.ts +167 -167
- package/src/tool/rainHarvester/i18n/fr.ts +167 -167
- package/src/tool/rainHarvester/i18n/id.ts +167 -167
- package/src/tool/rainHarvester/i18n/it.ts +167 -167
- package/src/tool/rainHarvester/i18n/ja.ts +167 -167
- package/src/tool/rainHarvester/i18n/ko.ts +167 -167
- package/src/tool/rainHarvester/i18n/nl.ts +167 -167
- package/src/tool/rainHarvester/i18n/pl.ts +167 -167
- package/src/tool/rainHarvester/i18n/pt.ts +167 -167
- package/src/tool/rainHarvester/i18n/ru.ts +167 -167
- package/src/tool/rainHarvester/i18n/sv.ts +167 -167
- package/src/tool/rainHarvester/i18n/tr.ts +167 -167
- package/src/tool/rainHarvester/i18n/zh.ts +167 -167
- package/src/tool/rainHarvester/seo.astro +15 -15
- package/src/tool/seedCalculator/i18n/fr.ts +197 -197
- package/src/tool/seedCalculator/i18n/pl.ts +197 -197
- package/src/tool/seedCalculator/i18n/ru.ts +197 -197
- package/src/tool/seedCalculator/seo.astro +15 -15
- package/src/types.ts +1 -1
|
@@ -1,167 +1,167 @@
|
|
|
1
|
-
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
-
import { bibliography } from '../bibliography';
|
|
3
|
-
import type { RainHarvesterLocaleContent } from '../index';
|
|
4
|
-
|
|
5
|
-
const slug = 'rainwater-calculator';
|
|
6
|
-
const title = 'Rainwater Harvesting Calculator';
|
|
7
|
-
const description = 'Calculate how much rainwater you can collect from your roof and size your storage tank.';
|
|
8
|
-
|
|
9
|
-
const faqData = [
|
|
10
|
-
{
|
|
11
|
-
question: 'How much water can I actually collect from my roof?',
|
|
12
|
-
answer: 'The general rule is that for every square meter of roof and every millimeter of rain, you can collect approximately 1 liter of water. However, there are losses from evaporation and filtration adjusted with the "runoff coefficient".',
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
question: 'What is the runoff coefficient?',
|
|
16
|
-
answer: 'It is a percentage that indicates how much water is lost depending on the roof material. A metal or tile roof is very efficient (0.85-0.95), while a gravel or soil roof is much less efficient (0.1-0.3).',
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
question: 'How do I size the storage tank?',
|
|
20
|
-
answer: 'You should calculate the maximum expected rain volume in a month and cross-reference it with your estimated monthly consumption. A tank that is too small will overflow in storms, and one that is too large will be unnecessarily expensive.',
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
question: 'Is it safe to drink collected rainwater?',
|
|
24
|
-
answer: 'Not directly. Water carries dust, bird droppings, and airborne particles. For human consumption, it must pass through sediment filters, activated carbon, and disinfection using UV light or chlorine.',
|
|
25
|
-
},
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
const howToData = [
|
|
29
|
-
{
|
|
30
|
-
name: 'Measure the horizontal surface',
|
|
31
|
-
text: 'Measure the length and width of your roof base (not the sloped surface, but the area that projects shadows on the ground).',
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
name: 'Check local rainfall',
|
|
35
|
-
text: 'Search the national meteorological service for the average annual or monthly precipitation in your area in millimeters (mm).',
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
name: 'Apply material efficiency',
|
|
39
|
-
text: 'Select your roof material in our calculator to discount the water that will be lost through absorption or heat.',
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
name: 'Calculate the required volume',
|
|
43
|
-
text: 'Use the annual liters result to choose a tank that can store at least 20-30% of the total harvest for dry periods.',
|
|
44
|
-
},
|
|
45
|
-
];
|
|
46
|
-
|
|
47
|
-
const faqSchema: WithContext<FAQPage> = {
|
|
48
|
-
'@context': 'https://schema.org',
|
|
49
|
-
'@type': 'FAQPage',
|
|
50
|
-
mainEntity: faqData.map((item) => ({
|
|
51
|
-
'@type': 'Question',
|
|
52
|
-
name: item.question,
|
|
53
|
-
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
54
|
-
})),
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const howToSchema: WithContext<HowTo> = {
|
|
58
|
-
'@context': 'https://schema.org',
|
|
59
|
-
'@type': 'HowTo',
|
|
60
|
-
name: title,
|
|
61
|
-
description,
|
|
62
|
-
step: howToData.map((step, i) => ({
|
|
63
|
-
'@type': 'HowToStep',
|
|
64
|
-
position: i + 1,
|
|
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: 'en',
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
export const content: RainHarvesterLocaleContent = {
|
|
82
|
-
slug,
|
|
83
|
-
title,
|
|
84
|
-
description,
|
|
85
|
-
ui: {
|
|
86
|
-
headInputs: 'Roof Settings',
|
|
87
|
-
headResults: 'Harvest Potential',
|
|
88
|
-
labelArea: 'Roof Area',
|
|
89
|
-
labelRainfall: 'Annual Rainfall',
|
|
90
|
-
labelMaterial: 'Roof Material',
|
|
91
|
-
unitM2: 'm²',
|
|
92
|
-
unitMm: 'mm',
|
|
93
|
-
unitLiters: 'Liters',
|
|
94
|
-
helpRainfall: 'Don\'t know? Search "average annual precipitation [your city]" on Google.',
|
|
95
|
-
efficiencyTitle: 'Efficiency Factor',
|
|
96
|
-
efficiencyNote: 'A 10% loss is applied for filters and evaporation.',
|
|
97
|
-
resultTitle: 'Annual Harvest Potential',
|
|
98
|
-
equivalenciesTitle: 'Practical Equivalents',
|
|
99
|
-
labelFlushes: 'Toilet Flushes',
|
|
100
|
-
labelShowers: 'Showers (10 min)',
|
|
101
|
-
labelGarden: 'Garden Watering',
|
|
102
|
-
gardenArea: '(50m²)',
|
|
103
|
-
materialMetal: 'Metal / Glazed Tile',
|
|
104
|
-
materialClay: 'Arabic Tile / Clay',
|
|
105
|
-
materialConcrete: 'Concrete / Asphalt',
|
|
106
|
-
materialGravel: 'Gravel / Green Roof',
|
|
107
|
-
},
|
|
108
|
-
seo: [
|
|
109
|
-
{
|
|
110
|
-
type: 'title',
|
|
111
|
-
text: 'Rainwater Harvesting: Autonomy and Sustainability',
|
|
112
|
-
level: 2,
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
type: 'paragraph',
|
|
116
|
-
html: 'Most homeowners are unaware of the potential of their own roofs. A standard roof can capture thousands of liters of free water each year. This tool quantifies that potential, allowing you to calculate exactly how much water you can "harvest" and determine the ideal tank size for storage.',
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
type: 'title',
|
|
120
|
-
text: 'Calculation Logic',
|
|
121
|
-
level: 3,
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
type: 'paragraph',
|
|
125
|
-
html: 'The base formula for rainwater collection is simple but powerful:',
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
type: 'paragraph',
|
|
129
|
-
html: '<code style="display:block;padding:1rem;background:var(-bg-alt);border-radius:0.5rem;margin:1rem 0;font-family:monospace;">Volume = Area × Rainfall × Runoff Coefficient × Filter Efficiency</code>',
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
type: 'list',
|
|
133
|
-
items: [
|
|
134
|
-
'<strong>Area:</strong> Your roof footprint (projected length × width).',
|
|
135
|
-
'<strong>Rainfall:</strong> Falling rain in millimeters.',
|
|
136
|
-
'<strong>Coefficient:</strong> How much water your roof loses (e.g., absorption).',
|
|
137
|
-
'<strong>Efficiency:</strong> Losses in pre-tank filters (~10%).',
|
|
138
|
-
],
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
type: 'title',
|
|
142
|
-
text: 'Why Collect Rainwater?',
|
|
143
|
-
level: 3,
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
type: 'list',
|
|
147
|
-
items: [
|
|
148
|
-
'<strong>Savings:</strong> Significantly reduce your water bill.',
|
|
149
|
-
'<strong>Gardening:</strong> Plants love water without chlorine or lime.',
|
|
150
|
-
'<strong>Resilience:</strong> Maintain an emergency reserve in case of cuts.',
|
|
151
|
-
],
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
type: 'title',
|
|
155
|
-
text: 'Tank Sizing',
|
|
156
|
-
level: 2,
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
type: 'paragraph',
|
|
160
|
-
html: 'The most common mistake is buying a tank based only on budget. If it is too small, you will waste thousands of liters due to overflow. If it is too large, you will spend money unnecessarily. A general rule is to have capacity to store <strong>3 months</strong> of average rainfall in your area, allowing you to bridge dry seasons.',
|
|
161
|
-
},
|
|
162
|
-
],
|
|
163
|
-
faq: faqData,
|
|
164
|
-
howTo: howToData,
|
|
165
|
-
bibliography,
|
|
166
|
-
schemas: [faqSchema, howToSchema, appSchema],
|
|
167
|
-
};
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { RainHarvesterLocaleContent } from '../index';
|
|
4
|
+
|
|
5
|
+
const slug = 'rainwater-calculator';
|
|
6
|
+
const title = 'Rainwater Harvesting Calculator';
|
|
7
|
+
const description = 'Calculate how much rainwater you can collect from your roof and size your storage tank.';
|
|
8
|
+
|
|
9
|
+
const faqData = [
|
|
10
|
+
{
|
|
11
|
+
question: 'How much water can I actually collect from my roof?',
|
|
12
|
+
answer: 'The general rule is that for every square meter of roof and every millimeter of rain, you can collect approximately 1 liter of water. However, there are losses from evaporation and filtration adjusted with the "runoff coefficient".',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'What is the runoff coefficient?',
|
|
16
|
+
answer: 'It is a percentage that indicates how much water is lost depending on the roof material. A metal or tile roof is very efficient (0.85-0.95), while a gravel or soil roof is much less efficient (0.1-0.3).',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'How do I size the storage tank?',
|
|
20
|
+
answer: 'You should calculate the maximum expected rain volume in a month and cross-reference it with your estimated monthly consumption. A tank that is too small will overflow in storms, and one that is too large will be unnecessarily expensive.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
question: 'Is it safe to drink collected rainwater?',
|
|
24
|
+
answer: 'Not directly. Water carries dust, bird droppings, and airborne particles. For human consumption, it must pass through sediment filters, activated carbon, and disinfection using UV light or chlorine.',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const howToData = [
|
|
29
|
+
{
|
|
30
|
+
name: 'Measure the horizontal surface',
|
|
31
|
+
text: 'Measure the length and width of your roof base (not the sloped surface, but the area that projects shadows on the ground).',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Check local rainfall',
|
|
35
|
+
text: 'Search the national meteorological service for the average annual or monthly precipitation in your area in millimeters (mm).',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Apply material efficiency',
|
|
39
|
+
text: 'Select your roof material in our calculator to discount the water that will be lost through absorption or heat.',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'Calculate the required volume',
|
|
43
|
+
text: 'Use the annual liters result to choose a tank that can store at least 20-30% of the total harvest for dry periods.',
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
48
|
+
'@context': 'https://schema.org',
|
|
49
|
+
'@type': 'FAQPage',
|
|
50
|
+
mainEntity: faqData.map((item) => ({
|
|
51
|
+
'@type': 'Question',
|
|
52
|
+
name: item.question,
|
|
53
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
54
|
+
})),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const howToSchema: WithContext<HowTo> = {
|
|
58
|
+
'@context': 'https://schema.org',
|
|
59
|
+
'@type': 'HowTo',
|
|
60
|
+
name: title,
|
|
61
|
+
description,
|
|
62
|
+
step: howToData.map((step, i) => ({
|
|
63
|
+
'@type': 'HowToStep',
|
|
64
|
+
position: i + 1,
|
|
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: 'en',
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const content: RainHarvesterLocaleContent = {
|
|
82
|
+
slug,
|
|
83
|
+
title,
|
|
84
|
+
description,
|
|
85
|
+
ui: {
|
|
86
|
+
headInputs: 'Roof Settings',
|
|
87
|
+
headResults: 'Harvest Potential',
|
|
88
|
+
labelArea: 'Roof Area',
|
|
89
|
+
labelRainfall: 'Annual Rainfall',
|
|
90
|
+
labelMaterial: 'Roof Material',
|
|
91
|
+
unitM2: 'm²',
|
|
92
|
+
unitMm: 'mm',
|
|
93
|
+
unitLiters: 'Liters',
|
|
94
|
+
helpRainfall: 'Don\'t know? Search "average annual precipitation [your city]" on Google.',
|
|
95
|
+
efficiencyTitle: 'Efficiency Factor',
|
|
96
|
+
efficiencyNote: 'A 10% loss is applied for filters and evaporation.',
|
|
97
|
+
resultTitle: 'Annual Harvest Potential',
|
|
98
|
+
equivalenciesTitle: 'Practical Equivalents',
|
|
99
|
+
labelFlushes: 'Toilet Flushes',
|
|
100
|
+
labelShowers: 'Showers (10 min)',
|
|
101
|
+
labelGarden: 'Garden Watering',
|
|
102
|
+
gardenArea: '(50m²)',
|
|
103
|
+
materialMetal: 'Metal / Glazed Tile',
|
|
104
|
+
materialClay: 'Arabic Tile / Clay',
|
|
105
|
+
materialConcrete: 'Concrete / Asphalt',
|
|
106
|
+
materialGravel: 'Gravel / Green Roof',
|
|
107
|
+
},
|
|
108
|
+
seo: [
|
|
109
|
+
{
|
|
110
|
+
type: 'title',
|
|
111
|
+
text: 'Rainwater Harvesting: Autonomy and Sustainability',
|
|
112
|
+
level: 2,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: 'paragraph',
|
|
116
|
+
html: 'Most homeowners are unaware of the potential of their own roofs. A standard roof can capture thousands of liters of free water each year. This tool quantifies that potential, allowing you to calculate exactly how much water you can "harvest" and determine the ideal tank size for storage.',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
type: 'title',
|
|
120
|
+
text: 'Calculation Logic',
|
|
121
|
+
level: 3,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
type: 'paragraph',
|
|
125
|
+
html: 'The base formula for rainwater collection is simple but powerful:',
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
type: 'paragraph',
|
|
129
|
+
html: '<code style="display:block;padding:1rem;background:var(-bg-alt);border-radius:0.5rem;margin:1rem 0;font-family:monospace;">Volume = Area × Rainfall × Runoff Coefficient × Filter Efficiency</code>',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
type: 'list',
|
|
133
|
+
items: [
|
|
134
|
+
'<strong>Area:</strong> Your roof footprint (projected length × width).',
|
|
135
|
+
'<strong>Rainfall:</strong> Falling rain in millimeters.',
|
|
136
|
+
'<strong>Coefficient:</strong> How much water your roof loses (e.g., absorption).',
|
|
137
|
+
'<strong>Efficiency:</strong> Losses in pre-tank filters (~10%).',
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'title',
|
|
142
|
+
text: 'Why Collect Rainwater?',
|
|
143
|
+
level: 3,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'list',
|
|
147
|
+
items: [
|
|
148
|
+
'<strong>Savings:</strong> Significantly reduce your water bill.',
|
|
149
|
+
'<strong>Gardening:</strong> Plants love water without chlorine or lime.',
|
|
150
|
+
'<strong>Resilience:</strong> Maintain an emergency reserve in case of cuts.',
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
type: 'title',
|
|
155
|
+
text: 'Tank Sizing',
|
|
156
|
+
level: 2,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
type: 'paragraph',
|
|
160
|
+
html: 'The most common mistake is buying a tank based only on budget. If it is too small, you will waste thousands of liters due to overflow. If it is too large, you will spend money unnecessarily. A general rule is to have capacity to store <strong>3 months</strong> of average rainfall in your area, allowing you to bridge dry seasons.',
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
faq: faqData,
|
|
164
|
+
howTo: howToData,
|
|
165
|
+
bibliography,
|
|
166
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
167
|
+
};
|