@jjlmoya/utils-home 1.16.0 → 1.17.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 (125) hide show
  1. package/package.json +1 -1
  2. package/src/pages/[locale]/[slug].astro +28 -12
  3. package/src/tests/locale_completeness.test.ts +2 -20
  4. package/src/tests/shared-test-helpers.ts +56 -0
  5. package/src/tests/tool_exports.test.ts +34 -0
  6. package/src/tool/dewPointCalculator/bibliography.ts +10 -0
  7. package/src/tool/dewPointCalculator/i18n/de.ts +2 -12
  8. package/src/tool/dewPointCalculator/i18n/en.ts +2 -12
  9. package/src/tool/dewPointCalculator/i18n/es.ts +2 -12
  10. package/src/tool/dewPointCalculator/i18n/fr.ts +2 -12
  11. package/src/tool/dewPointCalculator/i18n/id.ts +2 -12
  12. package/src/tool/dewPointCalculator/i18n/it.ts +2 -12
  13. package/src/tool/dewPointCalculator/i18n/ja.ts +2 -12
  14. package/src/tool/dewPointCalculator/i18n/ko.ts +2 -12
  15. package/src/tool/dewPointCalculator/i18n/nl.ts +2 -12
  16. package/src/tool/dewPointCalculator/i18n/pl.ts +2 -12
  17. package/src/tool/dewPointCalculator/i18n/pt.ts +2 -12
  18. package/src/tool/dewPointCalculator/i18n/ru.ts +2 -12
  19. package/src/tool/dewPointCalculator/i18n/sv.ts +2 -12
  20. package/src/tool/dewPointCalculator/i18n/tr.ts +2 -12
  21. package/src/tool/dewPointCalculator/i18n/zh.ts +2 -12
  22. package/src/tool/dewPointCalculator/seo.astro +2 -1
  23. package/src/tool/heatingComparator/bibliography.ts +14 -0
  24. package/src/tool/heatingComparator/i18n/de.ts +2 -16
  25. package/src/tool/heatingComparator/i18n/en.ts +2 -12
  26. package/src/tool/heatingComparator/i18n/es.ts +2 -16
  27. package/src/tool/heatingComparator/i18n/fr.ts +2 -12
  28. package/src/tool/heatingComparator/i18n/id.ts +2 -16
  29. package/src/tool/heatingComparator/i18n/it.ts +2 -16
  30. package/src/tool/heatingComparator/i18n/ja.ts +296 -310
  31. package/src/tool/heatingComparator/i18n/ko.ts +296 -306
  32. package/src/tool/heatingComparator/i18n/nl.ts +2 -16
  33. package/src/tool/heatingComparator/i18n/pl.ts +2 -16
  34. package/src/tool/heatingComparator/i18n/pt.ts +2 -16
  35. package/src/tool/heatingComparator/i18n/ru.ts +2 -12
  36. package/src/tool/heatingComparator/i18n/sv.ts +2 -16
  37. package/src/tool/heatingComparator/i18n/tr.ts +2 -16
  38. package/src/tool/heatingComparator/i18n/zh.ts +296 -306
  39. package/src/tool/heatingComparator/seo.astro +3 -3
  40. package/src/tool/ledSavingCalculator/bibliography.ts +14 -0
  41. package/src/tool/ledSavingCalculator/i18n/de.ts +2 -12
  42. package/src/tool/ledSavingCalculator/i18n/en.ts +2 -16
  43. package/src/tool/ledSavingCalculator/i18n/es.ts +2 -16
  44. package/src/tool/ledSavingCalculator/i18n/fr.ts +2 -16
  45. package/src/tool/ledSavingCalculator/i18n/id.ts +2 -12
  46. package/src/tool/ledSavingCalculator/i18n/it.ts +2 -12
  47. package/src/tool/ledSavingCalculator/i18n/ja.ts +2 -12
  48. package/src/tool/ledSavingCalculator/i18n/ko.ts +2 -12
  49. package/src/tool/ledSavingCalculator/i18n/nl.ts +2 -12
  50. package/src/tool/ledSavingCalculator/i18n/pl.ts +2 -12
  51. package/src/tool/ledSavingCalculator/i18n/pt.ts +2 -12
  52. package/src/tool/ledSavingCalculator/i18n/ru.ts +2 -12
  53. package/src/tool/ledSavingCalculator/i18n/sv.ts +2 -12
  54. package/src/tool/ledSavingCalculator/i18n/tr.ts +2 -12
  55. package/src/tool/ledSavingCalculator/i18n/zh.ts +2 -12
  56. package/src/tool/ledSavingCalculator/seo.astro +2 -1
  57. package/src/tool/projectorCalculator/bibliography.ts +5 -0
  58. package/src/tool/projectorCalculator/i18n/de.ts +2 -6
  59. package/src/tool/projectorCalculator/i18n/en.ts +2 -7
  60. package/src/tool/projectorCalculator/i18n/es.ts +2 -7
  61. package/src/tool/projectorCalculator/i18n/fr.ts +2 -7
  62. package/src/tool/projectorCalculator/i18n/id.ts +2 -7
  63. package/src/tool/projectorCalculator/i18n/it.ts +2 -6
  64. package/src/tool/projectorCalculator/i18n/ja.ts +175 -179
  65. package/src/tool/projectorCalculator/i18n/ko.ts +175 -179
  66. package/src/tool/projectorCalculator/i18n/nl.ts +2 -6
  67. package/src/tool/projectorCalculator/i18n/pl.ts +2 -6
  68. package/src/tool/projectorCalculator/i18n/pt.ts +2 -6
  69. package/src/tool/projectorCalculator/i18n/ru.ts +2 -6
  70. package/src/tool/projectorCalculator/i18n/sv.ts +2 -6
  71. package/src/tool/projectorCalculator/i18n/tr.ts +2 -6
  72. package/src/tool/projectorCalculator/i18n/zh.ts +175 -179
  73. package/src/tool/projectorCalculator/seo.astro +2 -1
  74. package/src/tool/qrGenerator/bibliography.ts +14 -0
  75. package/src/tool/qrGenerator/i18n/de.ts +192 -202
  76. package/src/tool/qrGenerator/i18n/en.ts +2 -16
  77. package/src/tool/qrGenerator/i18n/es.ts +2 -16
  78. package/src/tool/qrGenerator/i18n/fr.ts +2 -16
  79. package/src/tool/qrGenerator/i18n/id.ts +146 -150
  80. package/src/tool/qrGenerator/i18n/it.ts +169 -173
  81. package/src/tool/qrGenerator/i18n/ja.ts +146 -150
  82. package/src/tool/qrGenerator/i18n/ko.ts +146 -150
  83. package/src/tool/qrGenerator/i18n/nl.ts +146 -150
  84. package/src/tool/qrGenerator/i18n/pl.ts +146 -150
  85. package/src/tool/qrGenerator/i18n/pt.ts +146 -150
  86. package/src/tool/qrGenerator/i18n/ru.ts +146 -150
  87. package/src/tool/qrGenerator/i18n/sv.ts +146 -150
  88. package/src/tool/qrGenerator/i18n/tr.ts +146 -150
  89. package/src/tool/qrGenerator/i18n/zh.ts +146 -150
  90. package/src/tool/qrGenerator/seo.astro +2 -1
  91. package/src/tool/solarCalculator/bibliography.ts +5 -0
  92. package/src/tool/solarCalculator/i18n/de.ts +141 -145
  93. package/src/tool/solarCalculator/i18n/en.ts +2 -7
  94. package/src/tool/solarCalculator/i18n/es.ts +2 -7
  95. package/src/tool/solarCalculator/i18n/fr.ts +2 -7
  96. package/src/tool/solarCalculator/i18n/id.ts +2 -6
  97. package/src/tool/solarCalculator/i18n/it.ts +2 -6
  98. package/src/tool/solarCalculator/i18n/ja.ts +121 -125
  99. package/src/tool/solarCalculator/i18n/ko.ts +116 -120
  100. package/src/tool/solarCalculator/i18n/nl.ts +2 -5
  101. package/src/tool/solarCalculator/i18n/pl.ts +2 -6
  102. package/src/tool/solarCalculator/i18n/pt.ts +2 -6
  103. package/src/tool/solarCalculator/i18n/ru.ts +2 -5
  104. package/src/tool/solarCalculator/i18n/sv.ts +2 -5
  105. package/src/tool/solarCalculator/i18n/tr.ts +2 -5
  106. package/src/tool/solarCalculator/i18n/zh.ts +116 -120
  107. package/src/tool/solarCalculator/seo.astro +2 -1
  108. package/src/tool/tariffComparator/bibliography.ts +7 -0
  109. package/src/tool/tariffComparator/i18n/de.ts +129 -132
  110. package/src/tool/tariffComparator/i18n/en.ts +2 -9
  111. package/src/tool/tariffComparator/i18n/es.ts +2 -9
  112. package/src/tool/tariffComparator/i18n/fr.ts +2 -9
  113. package/src/tool/tariffComparator/i18n/id.ts +2 -5
  114. package/src/tool/tariffComparator/i18n/it.ts +2 -5
  115. package/src/tool/tariffComparator/i18n/ja.ts +129 -132
  116. package/src/tool/tariffComparator/i18n/ko.ts +129 -132
  117. package/src/tool/tariffComparator/i18n/nl.ts +2 -5
  118. package/src/tool/tariffComparator/i18n/pl.ts +2 -5
  119. package/src/tool/tariffComparator/i18n/pt.ts +2 -5
  120. package/src/tool/tariffComparator/i18n/ru.ts +2 -5
  121. package/src/tool/tariffComparator/i18n/sv.ts +2 -5
  122. package/src/tool/tariffComparator/i18n/tr.ts +2 -5
  123. package/src/tool/tariffComparator/i18n/zh.ts +129 -132
  124. package/src/tool/tariffComparator/seo.astro +2 -1
  125. package/src/types.ts +0 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-home",
3
- "version": "1.16.0",
3
+ "version": "1.17.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -34,18 +34,28 @@ export async function getStaticPaths() {
34
34
  ]),
35
35
  ) as Partial<Record<KnownLocale, string>>;
36
36
 
37
+ const firstLoader = entry.i18n.en ?? Object.values(entry.i18n)[0];
38
+ const englishSlug = firstLoader ? (await firstLoader()).slug : entry.id;
39
+
37
40
  for (const { locale, content } of localeContents) {
38
- const allToolsNav = await Promise.all(
39
- ALL_TOOLS.map(async ({ entry: navEntry }) => ({
40
- id: navEntry.id,
41
- title: (await navEntry.i18n[locale]!()).title,
42
- href: `/${locale}/${(await navEntry.i18n[locale]!()).slug}`,
43
- isActive: navEntry.id === entry.id,
44
- })),
45
- );
41
+ const allToolsNav = (
42
+ await Promise.all(
43
+ ALL_TOOLS.map(async ({ entry: navEntry }) => {
44
+ const loader = navEntry.i18n[locale] ?? navEntry.i18n.en;
45
+ if (!loader) return null;
46
+ const navContent = await loader();
47
+ return {
48
+ id: navEntry.id,
49
+ title: navContent.title,
50
+ href: `/${locale}/${navContent.slug}`,
51
+ isActive: navEntry.id === entry.id,
52
+ };
53
+ }),
54
+ )
55
+ ).filter(Boolean) as NavItem[];
46
56
  paths.push({
47
57
  params: { locale, slug: content.slug },
48
- props: { Component, locale, content, localeUrls, allToolsNav },
58
+ props: { Component, locale, content, localeUrls, allToolsNav, englishSlug },
49
59
  });
50
60
  }
51
61
  }
@@ -66,11 +76,16 @@ interface Props {
66
76
  content: ToolLocaleContent;
67
77
  localeUrls: Partial<Record<KnownLocale, string>>;
68
78
  allToolsNav: NavItem[];
79
+ englishSlug: string;
69
80
  }
70
81
 
71
- const { Component, locale, content, localeUrls, allToolsNav } = Astro.props;
82
+ const { Component, locale, content, localeUrls, allToolsNav, englishSlug } = Astro.props;
83
+
84
+ const cssFiles = import.meta.glob("../../tool/*/*.css", { query: "?raw", import: "default" });
85
+ const cssKey = Object.keys(cssFiles).find((k) => k.endsWith(`/${englishSlug}.css`));
86
+ const toolCss = cssKey ? await cssFiles[cssKey]() as string : "";
72
87
 
73
- const seoContent: UtilitySEOContent = { locale, sections: content.seo };
88
+ const seoContent: UtilitySEOContent = { locale, sections: content.seo ?? [] };
74
89
 
75
90
  const words = content.title.split(" ");
76
91
  const titleHighlight = words[0] || "";
@@ -89,8 +104,9 @@ const titleBase = words.slice(1).join(" ") || "";
89
104
  tools={allToolsNav}
90
105
  />
91
106
  <Fragment slot="head">
107
+ {toolCss ? <Fragment set:html={`<style is:inline>${toolCss}</style>`} /> : null}
92
108
  {
93
- content.schemas.map((schema: unknown) => (
109
+ ( content.schemas ?? []).map((schema: unknown) => (
94
110
  <script
95
111
  is:inline
96
112
  type="application/ld+json"
@@ -7,28 +7,10 @@ describe('Locale Completeness Validation', () => {
7
7
  describe(`Tool: ${tool.entry.id}`, () => {
8
8
  Object.keys(tool.entry.i18n).forEach((locale) => {
9
9
  describe(`Locale: ${locale}`, () => {
10
- it('faqTitle should be defined when faq items exist', async () => {
10
+ it('should load without errors', async () => {
11
11
  const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
12
12
  const content = (await loader?.()) as ToolLocaleContent;
13
-
14
- if (content.faq.length > 0) {
15
- expect(
16
- content.faqTitle,
17
- `Tool "${tool.entry.id}" locale "${locale}" has ${content.faq.length} FAQ items but is missing faqTitle`,
18
- ).toBeTruthy();
19
- }
20
- });
21
-
22
- it('bibliographyTitle should be defined when bibliography items exist', async () => {
23
- const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
24
- const content = (await loader?.()) as ToolLocaleContent;
25
-
26
- if (content.bibliography.length > 0) {
27
- expect(
28
- content.bibliographyTitle,
29
- `Tool "${tool.entry.id}" locale "${locale}" has ${content.bibliography.length} bibliography items but is missing bibliographyTitle`,
30
- ).toBeTruthy();
31
- }
13
+ expect(content).toBeDefined();
32
14
  });
33
15
  });
34
16
  });
@@ -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,10 @@
1
+ export const bibliography = [
2
+ {
3
+ name: 'Magnus Approximation of the Dew-Point — Meteorological Applications (2011)',
4
+ url: 'https://es.scribd.com/document/331352069/dew-point',
5
+ },
6
+ {
7
+ name: 'Guide to Meteorological Instruments and Methods of Observation — WMO (2021)',
8
+ url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
9
+ },
10
+ ];
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'taupunkt-rechner';
6
7
  const title = 'Taupunkt Rechner';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: 'Häufig gestellte Fragen',
85
85
  faq: faqData,
86
- bibliographyTitle: 'Literaturhinweise',
87
- bibliography: [
88
- {
89
- name: 'Magnus-Formel zur Berechnung des Taupunkts',
90
- url: 'https://de.wikipedia.org/wiki/Taupunkt',
91
- },
92
- {
93
- name: 'WMO Guide to Meteorological Instruments',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'dew-point-calculator';
6
7
  const title = 'Dew Point Calculator';
@@ -86,19 +87,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
86
87
  slug,
87
88
  title,
88
89
  description,
89
- faqTitle: 'Frequently Asked Questions',
90
90
  faq: faqData,
91
- bibliographyTitle: 'Bibliography',
92
- bibliography: [
93
- {
94
- name: 'Magnus Approximation of the Dew-Point — Meteorological Applications (2011)',
95
- url: 'https://es.scribd.com/document/331352069/dew-point',
96
- },
97
- {
98
- name: 'Guide to Meteorological Instruments and Methods of Observation — WMO (2021)',
99
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
100
- },
101
- ],
91
+ bibliography,
102
92
  howTo: howToData,
103
93
  schemas: [faqSchema, howToSchema, appSchema],
104
94
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'punto-de-rocio';
6
7
  const title = 'Calculadora de Punto de Rocío';
@@ -86,19 +87,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
86
87
  slug,
87
88
  title,
88
89
  description,
89
- faqTitle: 'Preguntas Frecuentes',
90
90
  faq: faqData,
91
- bibliographyTitle: 'Bibliografía',
92
- bibliography: [
93
- {
94
- name: 'Magnus Approximation of the Dew-Point — Meteorological Applications (2011)',
95
- url: 'https://es.scribd.com/document/331352069/dew-point',
96
- },
97
- {
98
- name: 'Guide to Meteorological Instruments and Methods of Observation — WMO (2021)',
99
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
100
- },
101
- ],
91
+ bibliography,
102
92
  howTo: howToData,
103
93
  schemas: [faqSchema, howToSchema, appSchema],
104
94
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'calculateur-point-de-rosee';
6
7
  const title = 'Calculateur de Point de Rosée';
@@ -86,19 +87,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
86
87
  slug,
87
88
  title,
88
89
  description,
89
- faqTitle: 'Questions Fréquentes',
90
90
  faq: faqData,
91
- bibliographyTitle: 'Bibliographie',
92
- bibliography: [
93
- {
94
- name: "Magnus Approximation of the Dew-Point — Meteorological Applications (2011)",
95
- url: 'https://es.scribd.com/document/331352069/dew-point',
96
- },
97
- {
98
- name: "Guide to Meteorological Instruments and Methods of Observation — WMO (2021)",
99
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
100
- },
101
- ],
91
+ bibliography,
102
92
  howTo: howToData,
103
93
  schemas: [faqSchema, howToSchema, appSchema],
104
94
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'titik-embun';
6
7
  const title = 'Kalkulator Titik Embun';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: 'Pertanyaan Umum',
85
85
  faq: faqData,
86
- bibliographyTitle: 'Daftar Pustaka',
87
- bibliography: [
88
- {
89
- name: 'Aproksimasi Magnus untuk Titik Embun',
90
- url: 'https://id.wikipedia.org/wiki/Titik_embun',
91
- },
92
- {
93
- name: 'WMO Guide to Meteorological Instruments',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'punto-di-rugiada';
6
7
  const title = 'Calcolatore Punto di Rugiada';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: 'Domande Frequenti',
85
85
  faq: faqData,
86
- bibliographyTitle: 'Bibliografia',
87
- bibliography: [
88
- {
89
- name: 'Approssimazione di Magnus per il Punto di Rugiada',
90
- url: 'https://it.wikipedia.org/wiki/Punto_di_rugiada',
91
- },
92
- {
93
- name: 'WMO: Guide to Meteorological Instruments',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'dew-point-calculator';
6
7
  const title = '露点計算機';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: 'よくある質問',
85
85
  faq: faqData,
86
- bibliographyTitle: '参考文献',
87
- bibliography: [
88
- {
89
- name: 'マグヌス式による露点計算',
90
- url: 'https://ja.wikipedia.org/wiki/露点',
91
- },
92
- {
93
- name: 'WMO Guide to Meteorological Instruments',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'dew-point-calculator';
6
7
  const title = '이슬점 계산기';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: '자주 묻는 질문',
85
85
  faq: faqData,
86
- bibliographyTitle: '참고 자료',
87
- bibliography: [
88
- {
89
- name: '이슬점 계산의 마그누스 근사식',
90
- url: 'https://ko.wikipedia.org/wiki/이슬점',
91
- },
92
- {
93
- name: 'WMO 기상 측정 도구 및 관측 방법 가이드',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'dauwpunt-calculator';
6
7
  const title = 'Dauwpunt Calculator';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: 'Veelgestelde Vragen',
85
85
  faq: faqData,
86
- bibliographyTitle: 'Bibliografie',
87
- bibliography: [
88
- {
89
- name: 'Magnus-formule voor dauwpuntberekening',
90
- url: 'https://nl.wikipedia.org/wiki/Dauwpunt',
91
- },
92
- {
93
- name: 'WMO Guide to Meteorological Instruments',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'punkt-rosy';
6
7
  const title = 'Kalkulator Punktu Rosy';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: 'Często Zadawane Pytania',
85
85
  faq: faqData,
86
- bibliographyTitle: 'Bibliografia',
87
- bibliography: [
88
- {
89
- name: 'Przybliżenie Magnusa dla Punktu Rosy',
90
- url: 'https://pl.wikipedia.org/wiki/Punkt_rosy',
91
- },
92
- {
93
- name: 'WMO Guide to Meteorological Instruments',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'ponto-de-orvalho';
6
7
  const title = 'Calculadora de Ponto de Orvalho';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: 'Perguntas Frequentes',
85
85
  faq: faqData,
86
- bibliographyTitle: 'Bibliografia',
87
- bibliography: [
88
- {
89
- name: 'Magnus Approximation of the Dew-Point — Meteorological Applications',
90
- url: 'https://en.wikipedia.org/wiki/Dew_point',
91
- },
92
- {
93
- name: 'Guide to Meteorological Instruments and Methods of Observation — WMO',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'tochka-rosy';
6
7
  const title = 'Калькулятор Точки Росы';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: 'Часто задаваемые вопросы',
85
85
  faq: faqData,
86
- bibliographyTitle: 'Библиография',
87
- bibliography: [
88
- {
89
- name: 'Приближение Магнуса для точки росы',
90
- url: 'https://ru.wikipedia.org/wiki/Точка_росы',
91
- },
92
- {
93
- name: 'WMO Guide to Meteorological Instruments',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'daggpunkt-raknare';
6
7
  const title = 'Daggpunktsräknare';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: 'Vanliga frågor',
85
85
  faq: faqData,
86
- bibliographyTitle: 'Referenser',
87
- bibliography: [
88
- {
89
- name: 'Magnus approximation för daggpunkt',
90
- url: 'https://sv.wikipedia.org/wiki/Daggpunkt',
91
- },
92
- {
93
- name: 'WMO Guide to Meteorological Instruments',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'ciglesme-noktasi-hesaplama';
6
7
  const title = 'Çiğleşme Noktası Hesaplayıcı';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: 'Sıkça Sorulan Sorular',
85
85
  faq: faqData,
86
- bibliographyTitle: 'Kaynakça',
87
- bibliography: [
88
- {
89
- name: 'Magnus-Tetens Çiğleşme Noktası Yaklaşımı',
90
- url: 'https://tr.wikipedia.org/wiki/Çiğ_noktası',
91
- },
92
- {
93
- name: 'Dünya Meteoroloji Örgütü (WMO) Gözlem Rehberi',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { DewPointCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'dew-point-calculator';
6
7
  const title = '露点计算器';
@@ -81,19 +82,8 @@ export const content: ToolLocaleContent<DewPointCalculatorUI> = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: '常见问题',
85
85
  faq: faqData,
86
- bibliographyTitle: '参考资料',
87
- bibliography: [
88
- {
89
- name: '露点计算的 Magnus 近似法',
90
- url: 'https://zh.wikipedia.org/wiki/露点',
91
- },
92
- {
93
- name: 'WMO 气象仪器与观测方法指南',
94
- url: 'https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/instruments-and-methods-of-observation-programme-imop/guide-instruments-and-methods-of-observation-wmo-no-8',
95
- },
96
- ],
86
+ bibliography,
97
87
  howTo: howToData,
98
88
  schemas: [faqSchema, howToSchema, appSchema],
99
89
  seo: [
@@ -11,4 +11,5 @@ const { locale = 'es' } = Astro.props;
11
11
  const content = await dewPointCalculator.i18n[locale]?.();
12
12
  if (!content) return null;
13
13
  ---
14
- <SEORenderer content={{ locale: locale as string, sections: content.seo }} />
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}