@jjlmoya/utils-nature 1.22.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.
Files changed (68) hide show
  1. package/package.json +2 -2
  2. package/src/category/i18n/es.ts +1 -1
  3. package/src/category/i18n/fr.ts +110 -110
  4. package/src/category/i18n/it.ts +1 -1
  5. package/src/category/i18n/pl.ts +1 -1
  6. package/src/category/i18n/pt.ts +1 -1
  7. package/src/category/i18n/ru.ts +110 -110
  8. package/src/category/seo.astro +1 -1
  9. package/src/components/PreviewNavSidebar.astro +1 -1
  10. package/src/components/PreviewToolbar.astro +1 -1
  11. package/src/data.ts +1 -1
  12. package/src/env.d.ts +1 -1
  13. package/src/layouts/PreviewLayout.astro +117 -117
  14. package/src/pages/[locale]/[slug].astro +164 -164
  15. package/src/pages/index.astro +1 -1
  16. package/src/tests/bibliography_wellformed_export.test.ts +46 -0
  17. package/src/tests/category_seo_quality.test.ts +74 -0
  18. package/src/tests/faq_count.test.ts +19 -19
  19. package/src/tests/mocks/astro_mock.js +1 -1
  20. package/src/tests/no_en_dash.test.ts +71 -71
  21. package/src/tests/no_h1_in_components.test.ts +1 -1
  22. package/src/tests/seo_length.test.ts +23 -23
  23. package/src/tests/seo_parity.test.ts +2 -2
  24. package/src/tests/seo_wellformed_export.test.ts +65 -0
  25. package/src/tests/spanish_leakage.test.ts +175 -175
  26. package/src/tool/compostBinVolumeRatioCalculator/bibliography.astro +2 -14
  27. package/src/tool/compostBinVolumeRatioCalculator/seo.astro +6 -14
  28. package/src/tool/cricketThermometer/i18n/de.ts +169 -169
  29. package/src/tool/cricketThermometer/i18n/en.ts +169 -169
  30. package/src/tool/cricketThermometer/i18n/es.ts +169 -169
  31. package/src/tool/cricketThermometer/i18n/fr.ts +169 -169
  32. package/src/tool/cricketThermometer/i18n/id.ts +169 -169
  33. package/src/tool/cricketThermometer/i18n/it.ts +169 -169
  34. package/src/tool/cricketThermometer/i18n/ja.ts +169 -169
  35. package/src/tool/cricketThermometer/i18n/ko.ts +169 -169
  36. package/src/tool/cricketThermometer/i18n/nl.ts +169 -169
  37. package/src/tool/cricketThermometer/i18n/pl.ts +169 -169
  38. package/src/tool/cricketThermometer/i18n/pt.ts +169 -169
  39. package/src/tool/cricketThermometer/i18n/ru.ts +169 -169
  40. package/src/tool/cricketThermometer/i18n/sv.ts +169 -169
  41. package/src/tool/cricketThermometer/i18n/tr.ts +169 -169
  42. package/src/tool/cricketThermometer/i18n/zh.ts +169 -169
  43. package/src/tool/cricketThermometer/seo.astro +15 -15
  44. package/src/tool/digitalCarbon/i18n/de.ts +229 -229
  45. package/src/tool/digitalCarbon/i18n/fr.ts +229 -229
  46. package/src/tool/digitalCarbon/i18n/ru.ts +229 -229
  47. package/src/tool/digitalCarbon/seo.astro +15 -15
  48. package/src/tool/rainHarvester/i18n/de.ts +167 -167
  49. package/src/tool/rainHarvester/i18n/en.ts +167 -167
  50. package/src/tool/rainHarvester/i18n/es.ts +167 -167
  51. package/src/tool/rainHarvester/i18n/fr.ts +167 -167
  52. package/src/tool/rainHarvester/i18n/id.ts +167 -167
  53. package/src/tool/rainHarvester/i18n/it.ts +167 -167
  54. package/src/tool/rainHarvester/i18n/ja.ts +167 -167
  55. package/src/tool/rainHarvester/i18n/ko.ts +167 -167
  56. package/src/tool/rainHarvester/i18n/nl.ts +167 -167
  57. package/src/tool/rainHarvester/i18n/pl.ts +167 -167
  58. package/src/tool/rainHarvester/i18n/pt.ts +167 -167
  59. package/src/tool/rainHarvester/i18n/ru.ts +167 -167
  60. package/src/tool/rainHarvester/i18n/sv.ts +167 -167
  61. package/src/tool/rainHarvester/i18n/tr.ts +167 -167
  62. package/src/tool/rainHarvester/i18n/zh.ts +167 -167
  63. package/src/tool/rainHarvester/seo.astro +15 -15
  64. package/src/tool/seedCalculator/i18n/fr.ts +197 -197
  65. package/src/tool/seedCalculator/i18n/pl.ts +197 -197
  66. package/src/tool/seedCalculator/i18n/ru.ts +197 -197
  67. package/src/tool/seedCalculator/seo.astro +15 -15
  68. 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 = 'kalkulator-air-hujan';
6
- const title = 'Kalkulator Pemanenan Air Hujan';
7
- const description = 'Hitung berapa banyak air hujan yang dapat Anda kumpulkan dari atap Anda dan tentukan ukuran tangki penyimpanan Anda.';
8
-
9
- const faqData = [
10
- {
11
- question: 'Berapa banyak air yang sebenarnya bisa saya kumpulkan dari atap saya?',
12
- 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".',
13
- },
14
- {
15
- question: 'Apa itu koefisien limpasan?',
16
- 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).',
17
- },
18
- {
19
- question: 'Bagaimana cara menentukan ukuran tangki penyimpanan?',
20
- 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.',
21
- },
22
- {
23
- question: 'Apakah aman meminum air hujan yang dikumpulkan?',
24
- 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.',
25
- },
26
- ];
27
-
28
- const howToData = [
29
- {
30
- name: 'Ukur permukaan horizontal',
31
- text: 'Ukur panjang dan lebar alas atap Anda (bukan permukaan yang miring, melainkan area yang memproyeksikan bayangan di tanah).',
32
- },
33
- {
34
- name: 'Periksa curah hujan lokal',
35
- text: 'Cari layanan meteorologi nasional untuk rata-rata curah hujan tahunan atau bulanan di daerah Anda dalam milimeter (mm).',
36
- },
37
- {
38
- name: 'Terapkan efisiensi bahan',
39
- text: 'Pilih bahan atap Anda di kalkulator kami untuk memotong air yang akan hilang melalui penyerapan atau panas.',
40
- },
41
- {
42
- name: 'Hitung volume yang dibutuhkan',
43
- text: 'Gunakan hasil liter tahunan untuk memilih tangki yang dapat menampung setidaknya 20-30% dari total panen untuk periode kering.',
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: 'id',
79
- };
80
-
81
- export const content: RainHarvesterLocaleContent = {
82
- slug,
83
- title,
84
- description,
85
- ui: {
86
- headInputs: 'Pengaturan Atap',
87
- headResults: 'Potensi Panen',
88
- labelArea: 'Luas Atap',
89
- labelRainfall: 'Curah Hujan Tahunan',
90
- labelMaterial: 'Bahan Atap',
91
- unitM2: 'm²',
92
- unitMm: 'mm',
93
- unitLiters: 'Liter',
94
- helpRainfall: 'Tidak tahu? Cari "rata-rata curah hujan tahunan [kota Anda]" di Google.',
95
- efficiencyTitle: 'Faktor Efisiensi',
96
- efficiencyNote: 'Kehilangan 10% diterapkan untuk filter dan penguapan.',
97
- resultTitle: 'Potensi Panen Tahunan',
98
- equivalenciesTitle: 'Setara Praktis',
99
- labelFlushes: 'Siraman Toilet',
100
- labelShowers: 'Mandi (10 menit)',
101
- labelGarden: 'Menyiram Taman',
102
- gardenArea: '(50m²)',
103
- materialMetal: 'Logam / Genteng Mengkilap',
104
- materialClay: 'Genteng Tanah Liat',
105
- materialConcrete: 'Beton / Aspal',
106
- materialGravel: 'Kerikil / Atap Hijau',
107
- },
108
- seo: [
109
- {
110
- type: 'title',
111
- text: 'Pemanenan Air Hujan: Otonomi dan Keberlanjutan',
112
- level: 2,
113
- },
114
- {
115
- type: 'paragraph',
116
- 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.',
117
- },
118
- {
119
- type: 'title',
120
- text: 'Logika Perhitungan',
121
- level: 3,
122
- },
123
- {
124
- type: 'paragraph',
125
- html: 'Rumus dasar untuk pengumpulan air hujan sederhana namun kuat:',
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 = Luas × Curah Hujan × Koefisien Limpasan × Efisiensi Filter</code>',
130
- },
131
- {
132
- type: 'list',
133
- items: [
134
- '<strong>Luas:</strong> Alas atap Anda (panjang × lebar proyeksi).',
135
- '<strong>Curah Hujan:</strong> Hujan yang turun dalam milimeter.',
136
- '<strong>Koefisien:</strong> Seberapa banyak air yang hilang di atap Anda (misalnya, penyerapan).',
137
- '<strong>Efisiensi:</strong> Kehilangan pada filter sebelum tangki (~10%).',
138
- ],
139
- },
140
- {
141
- type: 'title',
142
- text: 'Mengapa Memanen Air Hujan?',
143
- level: 3,
144
- },
145
- {
146
- type: 'list',
147
- items: [
148
- '<strong>Penghematan:</strong> Mengurangi tagihan air Anda secara signifikan.',
149
- '<strong>Berkebun:</strong> Tanaman menyukai air tanpa kaporit atau kapur.',
150
- '<strong>Ketahanan:</strong> Menjaga cadangan darurat jika terjadi pemutusan aliran air.',
151
- ],
152
- },
153
- {
154
- type: 'title',
155
- text: 'Penentuan Ukuran Tangki',
156
- level: 2,
157
- },
158
- {
159
- type: 'paragraph',
160
- 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.',
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 = 'kalkulator-air-hujan';
6
+ const title = 'Kalkulator Pemanenan Air Hujan';
7
+ const description = 'Hitung berapa banyak air hujan yang dapat Anda kumpulkan dari atap Anda dan tentukan ukuran tangki penyimpanan Anda.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Berapa banyak air yang sebenarnya bisa saya kumpulkan dari atap saya?',
12
+ 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".',
13
+ },
14
+ {
15
+ question: 'Apa itu koefisien limpasan?',
16
+ 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).',
17
+ },
18
+ {
19
+ question: 'Bagaimana cara menentukan ukuran tangki penyimpanan?',
20
+ 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.',
21
+ },
22
+ {
23
+ question: 'Apakah aman meminum air hujan yang dikumpulkan?',
24
+ 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.',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ {
30
+ name: 'Ukur permukaan horizontal',
31
+ text: 'Ukur panjang dan lebar alas atap Anda (bukan permukaan yang miring, melainkan area yang memproyeksikan bayangan di tanah).',
32
+ },
33
+ {
34
+ name: 'Periksa curah hujan lokal',
35
+ text: 'Cari layanan meteorologi nasional untuk rata-rata curah hujan tahunan atau bulanan di daerah Anda dalam milimeter (mm).',
36
+ },
37
+ {
38
+ name: 'Terapkan efisiensi bahan',
39
+ text: 'Pilih bahan atap Anda di kalkulator kami untuk memotong air yang akan hilang melalui penyerapan atau panas.',
40
+ },
41
+ {
42
+ name: 'Hitung volume yang dibutuhkan',
43
+ text: 'Gunakan hasil liter tahunan untuk memilih tangki yang dapat menampung setidaknya 20-30% dari total panen untuk periode kering.',
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: 'id',
79
+ };
80
+
81
+ export const content: RainHarvesterLocaleContent = {
82
+ slug,
83
+ title,
84
+ description,
85
+ ui: {
86
+ headInputs: 'Pengaturan Atap',
87
+ headResults: 'Potensi Panen',
88
+ labelArea: 'Luas Atap',
89
+ labelRainfall: 'Curah Hujan Tahunan',
90
+ labelMaterial: 'Bahan Atap',
91
+ unitM2: 'm²',
92
+ unitMm: 'mm',
93
+ unitLiters: 'Liter',
94
+ helpRainfall: 'Tidak tahu? Cari "rata-rata curah hujan tahunan [kota Anda]" di Google.',
95
+ efficiencyTitle: 'Faktor Efisiensi',
96
+ efficiencyNote: 'Kehilangan 10% diterapkan untuk filter dan penguapan.',
97
+ resultTitle: 'Potensi Panen Tahunan',
98
+ equivalenciesTitle: 'Setara Praktis',
99
+ labelFlushes: 'Siraman Toilet',
100
+ labelShowers: 'Mandi (10 menit)',
101
+ labelGarden: 'Menyiram Taman',
102
+ gardenArea: '(50m²)',
103
+ materialMetal: 'Logam / Genteng Mengkilap',
104
+ materialClay: 'Genteng Tanah Liat',
105
+ materialConcrete: 'Beton / Aspal',
106
+ materialGravel: 'Kerikil / Atap Hijau',
107
+ },
108
+ seo: [
109
+ {
110
+ type: 'title',
111
+ text: 'Pemanenan Air Hujan: Otonomi dan Keberlanjutan',
112
+ level: 2,
113
+ },
114
+ {
115
+ type: 'paragraph',
116
+ 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.',
117
+ },
118
+ {
119
+ type: 'title',
120
+ text: 'Logika Perhitungan',
121
+ level: 3,
122
+ },
123
+ {
124
+ type: 'paragraph',
125
+ html: 'Rumus dasar untuk pengumpulan air hujan sederhana namun kuat:',
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 = Luas × Curah Hujan × Koefisien Limpasan × Efisiensi Filter</code>',
130
+ },
131
+ {
132
+ type: 'list',
133
+ items: [
134
+ '<strong>Luas:</strong> Alas atap Anda (panjang × lebar proyeksi).',
135
+ '<strong>Curah Hujan:</strong> Hujan yang turun dalam milimeter.',
136
+ '<strong>Koefisien:</strong> Seberapa banyak air yang hilang di atap Anda (misalnya, penyerapan).',
137
+ '<strong>Efisiensi:</strong> Kehilangan pada filter sebelum tangki (~10%).',
138
+ ],
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Mengapa Memanen Air Hujan?',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ items: [
148
+ '<strong>Penghematan:</strong> Mengurangi tagihan air Anda secara signifikan.',
149
+ '<strong>Berkebun:</strong> Tanaman menyukai air tanpa kaporit atau kapur.',
150
+ '<strong>Ketahanan:</strong> Menjaga cadangan darurat jika terjadi pemutusan aliran air.',
151
+ ],
152
+ },
153
+ {
154
+ type: 'title',
155
+ text: 'Penentuan Ukuran Tangki',
156
+ level: 2,
157
+ },
158
+ {
159
+ type: 'paragraph',
160
+ 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.',
161
+ },
162
+ ],
163
+ faq: faqData,
164
+ howTo: howToData,
165
+ bibliography,
166
+ schemas: [faqSchema, howToSchema, appSchema],
167
+ };