@jjlmoya/utils-nature 1.13.0 → 1.15.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 (84) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/fr.ts +6 -6
  3. package/src/category/i18n/ru.ts +5 -5
  4. package/src/layouts/PreviewLayout.astro +1 -1
  5. package/src/pages/[locale]/[slug].astro +32 -14
  6. package/src/tests/diacritics_density.test.ts +118 -0
  7. package/src/tests/inverted_punctuation.test.ts +84 -0
  8. package/src/tests/locale_completeness.test.ts +1 -31
  9. package/src/tests/no_en_dash.test.ts +71 -0
  10. package/src/tests/script_density.test.ts +94 -0
  11. package/src/tests/shared-test-helpers.ts +56 -0
  12. package/src/tests/tool_exports.test.ts +34 -0
  13. package/src/tool/cricketThermometer/bibliography.ts +12 -0
  14. package/src/tool/cricketThermometer/i18n/de.ts +6 -18
  15. package/src/tool/cricketThermometer/i18n/en.ts +3 -15
  16. package/src/tool/cricketThermometer/i18n/es.ts +3 -15
  17. package/src/tool/cricketThermometer/i18n/fr.ts +9 -21
  18. package/src/tool/cricketThermometer/i18n/id.ts +3 -15
  19. package/src/tool/cricketThermometer/i18n/it.ts +3 -15
  20. package/src/tool/cricketThermometer/i18n/ja.ts +3 -15
  21. package/src/tool/cricketThermometer/i18n/ko.ts +3 -15
  22. package/src/tool/cricketThermometer/i18n/nl.ts +3 -15
  23. package/src/tool/cricketThermometer/i18n/pl.ts +6 -18
  24. package/src/tool/cricketThermometer/i18n/pt.ts +3 -15
  25. package/src/tool/cricketThermometer/i18n/ru.ts +8 -20
  26. package/src/tool/cricketThermometer/i18n/sv.ts +3 -15
  27. package/src/tool/cricketThermometer/i18n/tr.ts +3 -15
  28. package/src/tool/cricketThermometer/i18n/zh.ts +8 -20
  29. package/src/tool/cricketThermometer/seo.astro +1 -1
  30. package/src/tool/cricketThermometer/ui.ts +0 -2
  31. package/src/tool/digitalCarbon/bibliography.ts +8 -0
  32. package/src/tool/digitalCarbon/digital-carbon-footprint-calculator.css +57 -1
  33. package/src/tool/digitalCarbon/i18n/de.ts +4 -10
  34. package/src/tool/digitalCarbon/i18n/en.ts +2 -8
  35. package/src/tool/digitalCarbon/i18n/es.ts +2 -8
  36. package/src/tool/digitalCarbon/i18n/fr.ts +6 -12
  37. package/src/tool/digitalCarbon/i18n/id.ts +2 -8
  38. package/src/tool/digitalCarbon/i18n/it.ts +2 -8
  39. package/src/tool/digitalCarbon/i18n/ja.ts +2 -8
  40. package/src/tool/digitalCarbon/i18n/ko.ts +2 -8
  41. package/src/tool/digitalCarbon/i18n/nl.ts +2 -8
  42. package/src/tool/digitalCarbon/i18n/pl.ts +2 -8
  43. package/src/tool/digitalCarbon/i18n/pt.ts +2 -8
  44. package/src/tool/digitalCarbon/i18n/ru.ts +3 -9
  45. package/src/tool/digitalCarbon/i18n/sv.ts +2 -8
  46. package/src/tool/digitalCarbon/i18n/tr.ts +2 -8
  47. package/src/tool/digitalCarbon/i18n/zh.ts +2 -8
  48. package/src/tool/digitalCarbon/seo.astro +1 -1
  49. package/src/tool/rainHarvester/bibliography.ts +20 -0
  50. package/src/tool/rainHarvester/i18n/de.ts +5 -23
  51. package/src/tool/rainHarvester/i18n/en.ts +2 -20
  52. package/src/tool/rainHarvester/i18n/es.ts +2 -20
  53. package/src/tool/rainHarvester/i18n/fr.ts +3 -21
  54. package/src/tool/rainHarvester/i18n/id.ts +2 -20
  55. package/src/tool/rainHarvester/i18n/it.ts +2 -20
  56. package/src/tool/rainHarvester/i18n/ja.ts +2 -20
  57. package/src/tool/rainHarvester/i18n/ko.ts +2 -20
  58. package/src/tool/rainHarvester/i18n/nl.ts +2 -20
  59. package/src/tool/rainHarvester/i18n/pl.ts +5 -23
  60. package/src/tool/rainHarvester/i18n/pt.ts +2 -20
  61. package/src/tool/rainHarvester/i18n/ru.ts +8 -26
  62. package/src/tool/rainHarvester/i18n/sv.ts +2 -20
  63. package/src/tool/rainHarvester/i18n/tr.ts +2 -20
  64. package/src/tool/rainHarvester/i18n/zh.ts +5 -23
  65. package/src/tool/rainHarvester/seo.astro +1 -1
  66. package/src/tool/seedCalculator/bibliography.ts +16 -0
  67. package/src/tool/seedCalculator/i18n/de.ts +2 -18
  68. package/src/tool/seedCalculator/i18n/en.ts +2 -18
  69. package/src/tool/seedCalculator/i18n/es.ts +2 -18
  70. package/src/tool/seedCalculator/i18n/fr.ts +3 -19
  71. package/src/tool/seedCalculator/i18n/id.ts +2 -18
  72. package/src/tool/seedCalculator/i18n/it.ts +2 -18
  73. package/src/tool/seedCalculator/i18n/ja.ts +2 -18
  74. package/src/tool/seedCalculator/i18n/ko.ts +2 -18
  75. package/src/tool/seedCalculator/i18n/nl.ts +2 -18
  76. package/src/tool/seedCalculator/i18n/pl.ts +3 -19
  77. package/src/tool/seedCalculator/i18n/pt.ts +2 -18
  78. package/src/tool/seedCalculator/i18n/ru.ts +6 -22
  79. package/src/tool/seedCalculator/i18n/sv.ts +2 -18
  80. package/src/tool/seedCalculator/i18n/tr.ts +2 -18
  81. package/src/tool/seedCalculator/i18n/zh.ts +2 -18
  82. package/src/tool/seedCalculator/seo.astro +8 -2
  83. package/src/tool/seedCalculator/ui.ts +0 -2
  84. package/src/types.ts +0 -2
@@ -0,0 +1,56 @@
1
+ import type { ToolDefinition } from '../types';
2
+
3
+ export interface ToolExportValidationResult {
4
+ passed: boolean;
5
+ failures: string[];
6
+ }
7
+
8
+ function validateComponentType(
9
+ toolId: string,
10
+ componentName: string,
11
+ component: unknown,
12
+ failures: string[],
13
+ ): void {
14
+ if (typeof component !== 'function') {
15
+ failures.push(`${toolId}: ${componentName} is not a function (${typeof component})`);
16
+ }
17
+ }
18
+
19
+ async function validateComponentExecution(
20
+ toolId: string,
21
+ componentName: string,
22
+ fn: () => Promise<unknown>,
23
+ failures: string[],
24
+ ): Promise<void> {
25
+ try {
26
+ const result = await fn();
27
+ if (!result || typeof result !== 'object') {
28
+ failures.push(`${toolId}: ${componentName} import returned invalid result`);
29
+ }
30
+ } catch (error) {
31
+ failures.push(`${toolId}: ${componentName} execution error - ${error instanceof Error ? error.message : 'unknown'}`);
32
+ }
33
+ }
34
+
35
+ export async function validateToolExports(tools: ToolDefinition[]): Promise<ToolExportValidationResult> {
36
+ const failures: string[] = [];
37
+
38
+ for (const tool of tools) {
39
+ validateComponentType(tool.entry.id, 'Component', tool.Component, failures);
40
+ validateComponentType(tool.entry.id, 'SEOComponent', tool.SEOComponent, failures);
41
+ validateComponentType(tool.entry.id, 'BibliographyComponent', tool.BibliographyComponent, failures);
42
+
43
+ const componentFn = tool.Component as () => Promise<unknown>;
44
+ const seoFn = tool.SEOComponent as () => Promise<unknown>;
45
+ const bibFn = tool.BibliographyComponent as () => Promise<unknown>;
46
+
47
+ await validateComponentExecution(tool.entry.id, 'Component', componentFn, failures);
48
+ await validateComponentExecution(tool.entry.id, 'SEOComponent', seoFn, failures);
49
+ await validateComponentExecution(tool.entry.id, 'BibliographyComponent', bibFn, failures);
50
+ }
51
+
52
+ return {
53
+ passed: failures.length === 0,
54
+ failures,
55
+ };
56
+ }
@@ -0,0 +1,34 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ALL_TOOLS } from '../tools';
3
+ import { validateToolExports } from './shared-test-helpers';
4
+
5
+ describe('Tool Exports Pattern Validation', () => {
6
+ describe('Component Exports Format', () => {
7
+ ALL_TOOLS.forEach((tool) => {
8
+ it(`${tool.entry.id}: Component should be a lazy-loaded function`, () => {
9
+ expect(typeof tool.Component).toBe('function');
10
+ expect(tool.Component).toBeInstanceOf(Function);
11
+ });
12
+
13
+ it(`${tool.entry.id}: SEOComponent should be a lazy-loaded function`, () => {
14
+ expect(typeof tool.SEOComponent).toBe('function');
15
+ expect(tool.SEOComponent).toBeInstanceOf(Function);
16
+ });
17
+
18
+ it(`${tool.entry.id}: BibliographyComponent should be a lazy-loaded function`, () => {
19
+ expect(typeof tool.BibliographyComponent).toBe('function');
20
+ expect(tool.BibliographyComponent).toBeInstanceOf(Function);
21
+ });
22
+ });
23
+ });
24
+
25
+ describe('Dynamic Import Validation', () => {
26
+ it('all tools must have functional dynamic imports', async () => {
27
+ const result = await validateToolExports(ALL_TOOLS);
28
+ if (!result.passed) {
29
+ throw new Error(`Tool export validation failed:\n${result.failures.join('\n')}`);
30
+ }
31
+ expect(result.passed).toBe(true);
32
+ });
33
+ });
34
+ });
@@ -0,0 +1,12 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'The American Naturalist - The Cricket as a Thermometer',
6
+ url: 'https://www.jstor.org/stable/2453256',
7
+ },
8
+ {
9
+ name: 'Wikipedia - Dolbear\'s Law',
10
+ url: 'https://en.wikipedia.org/wiki/Dolbear%27s_law',
11
+ },
12
+ ];
@@ -1,9 +1,10 @@
1
1
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { CricketThermometerUI } from '../ui';
4
5
 
5
6
  const slug = 'grillen-thermometer';
6
- const title = 'Grillen Thermometer Dolbearsches Gesetz Temperaturrechner';
7
+ const title = 'Grillen Thermometer: Dolbearsches Gesetz Temperaturrechner';
7
8
  const description =
8
9
  'Kein Thermometer zur Hand? Hören Sie den Grillen zu. Berechnen Sie die exakte Temperatur, indem Sie das Zirpen mit unserem Dolbearsches Gesetz Rechner zählen.';
9
10
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Häufig gestellte Fragen',
91
91
  faq: faqData,
92
- bibliographyTitle: 'Wissenschaftliche Referenzen',
93
- bibliography: [
94
- {
95
- name: 'The American Naturalist - Die Grille als Thermometer',
96
- url: 'https://www.jstor.org/stable/2453256',
97
- },
98
- {
99
- name: 'Wikipedia - Dolbearsches Gesetz',
100
- url: 'https://de.wikipedia.org/wiki/Dolbearsches_Gesetz',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -115,7 +105,7 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
115
105
  {
116
106
  type: 'tip',
117
107
  title: 'Warum singen Grillen?',
118
- html: '<p>Der Gesang der Grille, auch <strong>Stridulation</strong> genannt, ist eigentlich ein Paarungsruf. Die Männchen reiben ihre Flügel (nicht ihre Beine) aneinander, um diesen Laut zu erzeugen. Faszinierenderweise hängt die Geschwindigkeit dieses Reibens direkt von der Wärmeenergie der Luft ab, da Grillen wechselwarme Tiere (Ektothermen) sind.</p>',
108
+ html: '<p>Der "Gesang" der Grille, auch <strong>Stridulation</strong> genannt, ist eigentlich ein Paarungsruf. Die Männchen reiben ihre Flügel (nicht ihre Beine) aneinander, um diesen Laut zu erzeugen. Faszinierenderweise hängt die Geschwindigkeit dieses Reibens direkt von der Wärmeenergie der Luft ab, da Grillen wechselwarme Tiere (Ektothermen) sind.</p>',
119
109
  },
120
110
  {
121
111
  type: 'title',
@@ -156,9 +146,9 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
156
146
  {
157
147
  type: 'list',
158
148
  items: [
159
- '<strong>Thermometer der Liebe:</strong> Einige Theorien besagen, dass Weibchen Männchen bevorzugen, die in der korrekten Frequenz für die aktuelle Temperatur singen, da dies darauf hindeutet, dass das Männchen gesund ist und einen starken Stoffwechsel hat.',
149
+ '<strong>Thermometer der Liebe:</strong> Einige Theorien besagen, dass Weibchen Männchen bevorzugen, die in der "korrekten" Frequenz für die aktuelle Temperatur singen, da dies darauf hindeutet, dass das Männchen gesund ist und einen starken Stoffwechsel hat.',
160
150
  '<strong>Kältegrenze:</strong> Unterhalb von 10°C (50°F) hören die meisten Grillen auf zu singen, da ihr Stoffwechsel zu langsam ist, um die muskuläre Anstrengung aufrechtzuerhalten.',
161
- '<strong>Synchronisation:</strong> In warmen Nächten können tausende Grillen ihr Zirpen synchronisieren und so einen beeindruckenden Wellen“-Klangeffekt erzeugen.',
151
+ '<strong>Synchronisation:</strong> In warmen Nächten können tausende Grillen ihr Zirpen synchronisieren und so einen beeindruckenden "Wellen"-Klangeffekt erzeugen.',
162
152
  ],
163
153
  },
164
154
  {
@@ -175,7 +165,5 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
175
165
  btnSoundOn: 'Ton: Ein',
176
166
  btnSoundOff: 'Ton: Aus',
177
167
  unitChirpsMin: 'Zirp/Min',
178
- faqTitle: 'Häufig gestellte Fragen',
179
- bibliographyTitle: 'Wissenschaftliche Referenzen',
180
168
  },
181
169
  };
@@ -1,9 +1,10 @@
1
1
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { CricketThermometerUI } from '../ui';
4
5
 
5
6
  const slug = 'cricket-thermometer';
6
- const title = 'Cricket Thermometer Dolbear\'s Law Temperature Calculator';
7
+ const title = 'Cricket Thermometer: Dolbear\'s Law Temperature Calculator';
7
8
  const description =
8
9
  'No thermometer? Listen to the crickets. Calculate the exact temperature by counting chirps with our Dolbear\'s Law calculator.';
9
10
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Frequently Asked Questions',
91
91
  faq: faqData,
92
- bibliographyTitle: 'Scientific References',
93
- bibliography: [
94
- {
95
- name: 'The American Naturalist - The Cricket as a Thermometer',
96
- url: 'https://www.jstor.org/stable/2453256',
97
- },
98
- {
99
- name: 'Wikipedia - Dolbear\'s Law',
100
- url: 'https://en.wikipedia.org/wiki/Dolbear%27s_law',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -175,7 +165,5 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
175
165
  btnSoundOn: 'Sound: On',
176
166
  btnSoundOff: 'Sound: Off',
177
167
  unitChirpsMin: 'chirps/min',
178
- faqTitle: 'Frequently Asked Questions',
179
- bibliographyTitle: 'Scientific References',
180
168
  },
181
169
  };
@@ -1,9 +1,10 @@
1
1
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { CricketThermometerUI } from '../ui';
4
5
 
5
6
  const slug = 'termometro-grillo';
6
- const title = '¿Qué temperatura hace? Termómetro de Grillos (Ley de Dolbear)';
7
+ const title = '¿Qué temperatura hace?: Termómetro de Grillos (Ley de Dolbear)';
7
8
  const description =
8
9
  '¿No tienes termómetro? Escucha a los grillos. Calcula la temperatura exacta contando sus chirridos con nuestra calculadora de la Ley de Dolbear.';
9
10
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Preguntas Frecuentes',
91
91
  faq: faqData,
92
- bibliographyTitle: 'Referencias Científicas',
93
- bibliography: [
94
- {
95
- name: 'The American Naturalist - The Cricket as a Thermometer',
96
- url: 'https://www.jstor.org/stable/2453256',
97
- },
98
- {
99
- name: 'Wikipedia - Dolbear\'s Law',
100
- url: 'https://en.wikipedia.org/wiki/Dolbear%27s_law',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -175,7 +165,5 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
175
165
  btnSoundOn: 'Sonido: On',
176
166
  btnSoundOff: 'Sonido: Off',
177
167
  unitChirpsMin: 'chirridos/min',
178
- faqTitle: 'Preguntas Frecuentes',
179
- bibliographyTitle: 'Referencias Científicas',
180
168
  },
181
169
  };
@@ -1,9 +1,10 @@
1
1
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { CricketThermometerUI } from '../ui';
4
5
 
5
6
  const slug = 'thermometre-grillon';
6
- const title = 'Thermomètre à Grillons Loi de Dolbear';
7
+ const title = 'Thermomètre à Grillons: Loi de Dolbear';
7
8
  const description =
8
9
  'Pas de thermomètre ? Écoutez les grillons. Calculez la température exacte en comptant les stridulations avec notre calculateur de la Loi de Dolbear.';
9
10
 
@@ -87,25 +88,14 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Questions Fréquentes',
91
91
  faq: faqData,
92
- bibliographyTitle: 'Références Scientifiques',
93
- bibliography: [
94
- {
95
- name: 'The American Naturalist - The Cricket as a Thermometer',
96
- url: 'https://www.jstor.org/stable/2453256',
97
- },
98
- {
99
- name: 'Wikipedia - Dolbear\'s Law',
100
- url: 'https://en.wikipedia.org/wiki/Dolbear%27s_law',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
106
96
  {
107
97
  type: 'title',
108
- text: 'Guide Complet : Comment Utiliser la Loi de Dolbear pour Calculer la Température',
98
+ text: 'Guide Complet: Comment Utiliser la Loi de Dolbear pour Calculer la Température',
109
99
  level: 2,
110
100
  },
111
101
  {
@@ -119,12 +109,12 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
119
109
  },
120
110
  {
121
111
  type: 'title',
122
- text: 'La Science : Ectothermie et Métabolisme',
112
+ text: 'La Science: Ectothermie et Métabolisme',
123
113
  level: 3,
124
114
  },
125
115
  {
126
116
  type: 'paragraph',
127
- html: 'Contrairement aux mammifères, qui maintiennent une température corporelle constante, les insectes dépendent de la chaleur externe. Leurs réactions biochimiques suivent l\'<strong>Équation d\'Arrhenius</strong> : plus il fait chaud, plus la réaction est rapide.',
117
+ html: 'Contrairement aux mammifères, qui maintiennent une température corporelle constante, les insectes dépendent de la chaleur externe. Leurs réactions biochimiques suivent l\'<strong>Équation d\'Arrhenius</strong>: plus il fait chaud, plus la réaction est rapide.',
128
118
  },
129
119
  {
130
120
  type: 'paragraph',
@@ -146,7 +136,7 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
146
136
  },
147
137
  {
148
138
  type: 'paragraph',
149
- html: 'Notre outil fait cela automatiquement : il mesure le temps entre vos tapotements, calcule les stridulations par minute (BPM) et applique la formule instantanément.',
139
+ html: 'Notre outil fait cela automatiquement: il mesure le temps entre vos tapotements, calcule les stridulations par minute (BPM) et applique la formule instantanément.',
150
140
  },
151
141
  {
152
142
  type: 'title',
@@ -172,10 +162,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
172
162
  labelTapping: 'Continuez à tapoter...',
173
163
  tapInstruction: 'Chaque fois que vous entendez une stridulation',
174
164
  btnReset: 'Réinitialiser',
175
- btnSoundOn: 'Son : On',
176
- btnSoundOff: 'Son : Off',
165
+ btnSoundOn: 'Son: On',
166
+ btnSoundOff: 'Son: Off',
177
167
  unitChirpsMin: 'strid./min',
178
- faqTitle: 'Questions Fréquentes',
179
- bibliographyTitle: 'Références Scientifiques',
180
168
  },
181
169
  };
@@ -1,9 +1,10 @@
1
1
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { CricketThermometerUI } from '../ui';
4
5
 
5
6
  const slug = 'termometer-jangkrik';
6
- const title = 'Termometer Jangkrik Kalkulator Suhu Hukum Dolbear';
7
+ const title = 'Termometer Jangkrik: Kalkulator Suhu Hukum Dolbear';
7
8
  const description =
8
9
  'Tidak ada termometer? Dengarkan jangkrik. Hitung suhu tepat dengan menghitung kerikan menggunakan kalkulator Hukum Dolbear kami.';
9
10
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Pertanyaan yang Sering Diajukan',
91
91
  faq: faqData,
92
- bibliographyTitle: 'Referensi Ilmiah',
93
- bibliography: [
94
- {
95
- name: 'The American Naturalist - The Cricket as a Thermometer',
96
- url: 'https://www.jstor.org/stable/2453256',
97
- },
98
- {
99
- name: 'Wikipedia - Dolbear\'s Law',
100
- url: 'https://en.wikipedia.org/wiki/Dolbear%27s_law',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -175,7 +165,5 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
175
165
  btnSoundOn: 'Suara: Aktif',
176
166
  btnSoundOff: 'Suara: Nonaktif',
177
167
  unitChirpsMin: 'kerikan/menit',
178
- faqTitle: 'Pertanyaan yang Sering Diajukan',
179
- bibliographyTitle: 'Referensi Ilmiah',
180
168
  },
181
169
  };
@@ -1,9 +1,10 @@
1
1
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { CricketThermometerUI } from '../ui';
4
5
 
5
6
  const slug = 'termometro-a-grillo';
6
- const title = 'Termometro a Grillo Calcolatore della Temperatura via Legge di Dolbear';
7
+ const title = 'Termometro a Grillo: Calcolatore della Temperatura via Legge di Dolbear';
7
8
  const description =
8
9
  'Senza termometro? Ascolta i grilli. Calcola la temperatura esatta contando i friniti con il nostro calcolatore basato sulla Legge di Dolbear.';
9
10
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Domande Frequenti',
91
91
  faq: faqData,
92
- bibliographyTitle: 'Riferimenti Scientifici',
93
- bibliography: [
94
- {
95
- name: 'The American Naturalist - The Cricket as a Thermometer',
96
- url: 'https://www.jstor.org/stable/2453256',
97
- },
98
- {
99
- name: 'Wikipedia - Dolbear\'s Law',
100
- url: 'https://en.wikipedia.org/wiki/Dolbear%27s_law',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -175,7 +165,5 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
175
165
  btnSoundOn: 'Suono: On',
176
166
  btnSoundOff: 'Suono: Off',
177
167
  unitChirpsMin: 'friniti/min',
178
- faqTitle: 'Domande Frequenti',
179
- bibliographyTitle: 'Riferimenti Scientifici',
180
168
  },
181
169
  };
@@ -1,9 +1,10 @@
1
1
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { CricketThermometerUI } from '../ui';
4
5
 
5
6
  const slug = 'cricket-thermometer';
6
- const title = 'コオロギ温度計 ドルベアの法則による温度計算機';
7
+ const title = 'コオロギ温度計: ドルベアの法則による温度計算機';
7
8
  const description =
8
9
  '温度計がない?そんな時はコオロギの声を聞きましょう。ドルベアの法則に基づき、鳴き声を数えるだけで正確な温度を算出します。';
9
10
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'よくある質問',
91
91
  faq: faqData,
92
- bibliographyTitle: '科学的参考文献',
93
- bibliography: [
94
- {
95
- name: 'The American Naturalist - The Cricket as a Thermometer',
96
- url: 'https://www.jstor.org/stable/2453256',
97
- },
98
- {
99
- name: 'Wikipedia - Dolbear\'s Law',
100
- url: 'https://en.wikipedia.org/wiki/Dolbear%27s_law',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -175,7 +165,5 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
175
165
  btnSoundOn: 'サウンド:ON',
176
166
  btnSoundOff: 'サウンド:OFF',
177
167
  unitChirpsMin: '回/分',
178
- faqTitle: 'よくある質問',
179
- bibliographyTitle: '科学的参考文献',
180
168
  },
181
169
  };
@@ -1,9 +1,10 @@
1
1
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { CricketThermometerUI } from '../ui';
4
5
 
5
6
  const slug = 'cricket-thermometer';
6
- const title = '귀뚜라미 온도계 돌베어 법칙 온도 계산기';
7
+ const title = '귀뚜라미 온도계: 돌베어 법칙 온도 계산기';
7
8
  const description =
8
9
  '온도계가 없으신가요? 귀뚜라미 소리에 귀를 기울여 보세요. 돌베어 법칙 계산기를 사용하여 귀뚜라미 울음소리 횟수로 정확한 온도를 계산할 수 있습니다.';
9
10
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: '자주 묻는 질문',
91
91
  faq: faqData,
92
- bibliographyTitle: '과학적 참고 문헌',
93
- bibliography: [
94
- {
95
- name: 'The American Naturalist - The Cricket as a Thermometer',
96
- url: 'https://www.jstor.org/stable/2453256',
97
- },
98
- {
99
- name: 'Wikipedia - Dolbear\'s Law',
100
- url: 'https://en.wikipedia.org/wiki/Dolbear%27s_law',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -175,7 +165,5 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
175
165
  btnSoundOn: '소리: 켜짐',
176
166
  btnSoundOff: '소리: 꺼짐',
177
167
  unitChirpsMin: '회/분',
178
- faqTitle: '자주 묻는 질문',
179
- bibliographyTitle: '과학적 참고 문헌',
180
168
  },
181
169
  };
@@ -1,9 +1,10 @@
1
1
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { CricketThermometerUI } from '../ui';
4
5
 
5
6
  const slug = 'krekels-thermometer';
6
- const title = 'Krekels thermometer Dolbears wet temperatuurcalculator';
7
+ const title = 'Krekels thermometer: Dolbears wet temperatuurcalculator';
7
8
  const description =
8
9
  'Geen thermometer? Luister naar de krekels. Bereken de exacte temperatuur door het aantal tsjirpen te tellen met onze Dolbears wet calculator.';
9
10
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Veelgestelde Vragen',
91
91
  faq: faqData,
92
- bibliographyTitle: 'Wetenschappelijke Bronnen',
93
- bibliography: [
94
- {
95
- name: 'The American Naturalist - The Cricket as a Thermometer',
96
- url: 'https://www.jstor.org/stable/2453256',
97
- },
98
- {
99
- name: 'Wikipedia - Dolbear\'s Law',
100
- url: 'https://en.wikipedia.org/wiki/Dolbear%27s_law',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -175,7 +165,5 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
175
165
  btnSoundOn: 'Geluid: Aan',
176
166
  btnSoundOff: 'Geluid: Uit',
177
167
  unitChirpsMin: 'tsjirpen/min',
178
- faqTitle: 'Veelgestelde Vragen',
179
- bibliographyTitle: 'Wetenschappelijke Bronnen',
180
168
  },
181
169
  };
@@ -1,9 +1,10 @@
1
1
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { CricketThermometerUI } from '../ui';
4
5
 
5
6
  const slug = 'termometr-swierszczy';
6
- const title = 'Termometr świerszczowy Kalkulator temperatury według prawa Dolbeara';
7
+ const title = 'Termometr świerszczowy: Kalkulator temperatury według prawa Dolbeara';
7
8
  const description =
8
9
  'Nie masz termometru? Posłuchaj świerszczy. Oblicz dokładną temperaturę, licząc cykania za pomocą naszego kalkulatora opartego na prawie Dolbeara.';
9
10
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Często zadawane pytania',
91
91
  faq: faqData,
92
- bibliographyTitle: 'Źródła naukowe',
93
- bibliography: [
94
- {
95
- name: 'The American Naturalist - The Cricket as a Thermometer',
96
- url: 'https://www.jstor.org/stable/2453256',
97
- },
98
- {
99
- name: 'Wikipedia - Dolbear\'s Law',
100
- url: 'https://en.wikipedia.org/wiki/Dolbear%27s_law',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -114,8 +104,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
114
104
  },
115
105
  {
116
106
  type: 'tip',
117
- title: 'Dlaczego świerszcze „śpiewają”?',
118
- html: '<p>„Śpiew” świerszcza, czyli <strong>strydulacja</strong>, to w rzeczywistości wołanie godowe. Samce pocierają o siebie skrzydła (nie nogi), aby wydać ten dźwięk. Co ciekawe, ponieważ są to zwierzęta zmiennocieplne (ektotermy), szybkość tego pocierania zależy bezpośrednio od energii cieplnej powietrza.</p>',
107
+ title: 'Dlaczego świerszcze "śpiewają"?',
108
+ html: '<p>"Śpiew" świerszcza, czyli <strong>strydulacja</strong>, to w rzeczywistości wołanie godowe. Samce pocierają o siebie skrzydła (nie nogi), aby wydać ten dźwięk. Co ciekawe, ponieważ są to zwierzęta zmiennocieplne (ektotermy), szybkość tego pocierania zależy bezpośrednio od energii cieplnej powietrza.</p>',
119
109
  },
120
110
  {
121
111
  type: 'title',
@@ -156,7 +146,7 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
156
146
  {
157
147
  type: 'list',
158
148
  items: [
159
- '<strong>Termometry miłości:</strong> Niektóre teorie sugerują, że samice wolą samców śpiewających z „właściwą” częstotliwością dla aktualnej temperatury, ponieważ świadczy to o zdrowiu samca i silnym metabolizmie.',
149
+ '<strong>Termometry miłości:</strong> Niektóre teorie sugerują, że samice wolą samców śpiewających z "właściwą" częstotliwością dla aktualnej temperatury, ponieważ świadczy to o zdrowiu samca i silnym metabolizmie.',
160
150
  '<strong>Granica zimna:</strong> Poniżej 10°C (50°F) większość świerszczy przestaje śpiewać, ponieważ ich metabolizm jest zbyt wolny, by podtrzymać wysiłek mięśni.',
161
151
  '<strong>Synchronizacja:</strong> W ciepłe noce tysiące świerszczy potrafią zsynchronizować swoje cykanie, tworząc imponujący efekt fali dźwiękowej.',
162
152
  ],
@@ -175,7 +165,5 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
175
165
  btnSoundOn: 'Dźwięk: Wł.',
176
166
  btnSoundOff: 'Dźwięk: Wył.',
177
167
  unitChirpsMin: 'cyknięć/min',
178
- faqTitle: 'Często zadawane pytania',
179
- bibliographyTitle: 'Źródła naukowe',
180
168
  },
181
169
  };
@@ -1,9 +1,10 @@
1
1
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { CricketThermometerUI } from '../ui';
4
5
 
5
6
  const slug = 'termometro-grilo';
6
- const title = 'Termómetro de Grilo Calculadora de Temperatura da Lei de Dolbear';
7
+ const title = 'Termómetro de Grilo: Calculadora de Temperatura da Lei de Dolbear';
7
8
  const description =
8
9
  'Sem termómetro? Ouça os grilos. Calcule a temperatura exata contando os cri-cris com a nossa calculadora da Lei de Dolbear.';
9
10
 
@@ -87,19 +88,8 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Perguntas Frequentes',
91
91
  faq: faqData,
92
- bibliographyTitle: 'Referências Científicas',
93
- bibliography: [
94
- {
95
- name: 'The American Naturalist - The Cricket as a Thermometer',
96
- url: 'https://www.jstor.org/stable/2453256',
97
- },
98
- {
99
- name: 'Wikipedia - Dolbear\'s Law',
100
- url: 'https://en.wikipedia.org/wiki/Dolbear%27s_law',
101
- },
102
- ],
92
+ bibliography,
103
93
  howTo: howToData,
104
94
  schemas: [faqSchema, howToSchema, appSchema],
105
95
  seo: [
@@ -175,7 +165,5 @@ export const content: ToolLocaleContent<CricketThermometerUI> = {
175
165
  btnSoundOn: 'Som: Ligado',
176
166
  btnSoundOff: 'Som: Desligado',
177
167
  unitChirpsMin: 'cantos/min',
178
- faqTitle: 'Perguntas Frequentes',
179
- bibliographyTitle: 'Referências Científicas',
180
168
  },
181
169
  };