@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.
- package/package.json +1 -1
- package/src/pages/[locale]/[slug].astro +28 -12
- package/src/tests/locale_completeness.test.ts +2 -20
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tool/dewPointCalculator/bibliography.ts +10 -0
- package/src/tool/dewPointCalculator/i18n/de.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/en.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/es.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/fr.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/id.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/it.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/ja.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/ko.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/nl.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/pl.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/pt.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/ru.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/sv.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/tr.ts +2 -12
- package/src/tool/dewPointCalculator/i18n/zh.ts +2 -12
- package/src/tool/dewPointCalculator/seo.astro +2 -1
- package/src/tool/heatingComparator/bibliography.ts +14 -0
- package/src/tool/heatingComparator/i18n/de.ts +2 -16
- package/src/tool/heatingComparator/i18n/en.ts +2 -12
- package/src/tool/heatingComparator/i18n/es.ts +2 -16
- package/src/tool/heatingComparator/i18n/fr.ts +2 -12
- package/src/tool/heatingComparator/i18n/id.ts +2 -16
- package/src/tool/heatingComparator/i18n/it.ts +2 -16
- package/src/tool/heatingComparator/i18n/ja.ts +296 -310
- package/src/tool/heatingComparator/i18n/ko.ts +296 -306
- package/src/tool/heatingComparator/i18n/nl.ts +2 -16
- package/src/tool/heatingComparator/i18n/pl.ts +2 -16
- package/src/tool/heatingComparator/i18n/pt.ts +2 -16
- package/src/tool/heatingComparator/i18n/ru.ts +2 -12
- package/src/tool/heatingComparator/i18n/sv.ts +2 -16
- package/src/tool/heatingComparator/i18n/tr.ts +2 -16
- package/src/tool/heatingComparator/i18n/zh.ts +296 -306
- package/src/tool/heatingComparator/seo.astro +3 -3
- package/src/tool/ledSavingCalculator/bibliography.ts +14 -0
- package/src/tool/ledSavingCalculator/i18n/de.ts +2 -12
- package/src/tool/ledSavingCalculator/i18n/en.ts +2 -16
- package/src/tool/ledSavingCalculator/i18n/es.ts +2 -16
- package/src/tool/ledSavingCalculator/i18n/fr.ts +2 -16
- package/src/tool/ledSavingCalculator/i18n/id.ts +2 -12
- package/src/tool/ledSavingCalculator/i18n/it.ts +2 -12
- package/src/tool/ledSavingCalculator/i18n/ja.ts +2 -12
- package/src/tool/ledSavingCalculator/i18n/ko.ts +2 -12
- package/src/tool/ledSavingCalculator/i18n/nl.ts +2 -12
- package/src/tool/ledSavingCalculator/i18n/pl.ts +2 -12
- package/src/tool/ledSavingCalculator/i18n/pt.ts +2 -12
- package/src/tool/ledSavingCalculator/i18n/ru.ts +2 -12
- package/src/tool/ledSavingCalculator/i18n/sv.ts +2 -12
- package/src/tool/ledSavingCalculator/i18n/tr.ts +2 -12
- package/src/tool/ledSavingCalculator/i18n/zh.ts +2 -12
- package/src/tool/ledSavingCalculator/seo.astro +2 -1
- package/src/tool/projectorCalculator/bibliography.ts +5 -0
- package/src/tool/projectorCalculator/i18n/de.ts +2 -6
- package/src/tool/projectorCalculator/i18n/en.ts +2 -7
- package/src/tool/projectorCalculator/i18n/es.ts +2 -7
- package/src/tool/projectorCalculator/i18n/fr.ts +2 -7
- package/src/tool/projectorCalculator/i18n/id.ts +2 -7
- package/src/tool/projectorCalculator/i18n/it.ts +2 -6
- package/src/tool/projectorCalculator/i18n/ja.ts +175 -179
- package/src/tool/projectorCalculator/i18n/ko.ts +175 -179
- package/src/tool/projectorCalculator/i18n/nl.ts +2 -6
- package/src/tool/projectorCalculator/i18n/pl.ts +2 -6
- package/src/tool/projectorCalculator/i18n/pt.ts +2 -6
- package/src/tool/projectorCalculator/i18n/ru.ts +2 -6
- package/src/tool/projectorCalculator/i18n/sv.ts +2 -6
- package/src/tool/projectorCalculator/i18n/tr.ts +2 -6
- package/src/tool/projectorCalculator/i18n/zh.ts +175 -179
- package/src/tool/projectorCalculator/seo.astro +2 -1
- package/src/tool/qrGenerator/bibliography.ts +14 -0
- package/src/tool/qrGenerator/i18n/de.ts +192 -202
- package/src/tool/qrGenerator/i18n/en.ts +2 -16
- package/src/tool/qrGenerator/i18n/es.ts +2 -16
- package/src/tool/qrGenerator/i18n/fr.ts +2 -16
- package/src/tool/qrGenerator/i18n/id.ts +146 -150
- package/src/tool/qrGenerator/i18n/it.ts +169 -173
- package/src/tool/qrGenerator/i18n/ja.ts +146 -150
- package/src/tool/qrGenerator/i18n/ko.ts +146 -150
- package/src/tool/qrGenerator/i18n/nl.ts +146 -150
- package/src/tool/qrGenerator/i18n/pl.ts +146 -150
- package/src/tool/qrGenerator/i18n/pt.ts +146 -150
- package/src/tool/qrGenerator/i18n/ru.ts +146 -150
- package/src/tool/qrGenerator/i18n/sv.ts +146 -150
- package/src/tool/qrGenerator/i18n/tr.ts +146 -150
- package/src/tool/qrGenerator/i18n/zh.ts +146 -150
- package/src/tool/qrGenerator/seo.astro +2 -1
- package/src/tool/solarCalculator/bibliography.ts +5 -0
- package/src/tool/solarCalculator/i18n/de.ts +141 -145
- package/src/tool/solarCalculator/i18n/en.ts +2 -7
- package/src/tool/solarCalculator/i18n/es.ts +2 -7
- package/src/tool/solarCalculator/i18n/fr.ts +2 -7
- package/src/tool/solarCalculator/i18n/id.ts +2 -6
- package/src/tool/solarCalculator/i18n/it.ts +2 -6
- package/src/tool/solarCalculator/i18n/ja.ts +121 -125
- package/src/tool/solarCalculator/i18n/ko.ts +116 -120
- package/src/tool/solarCalculator/i18n/nl.ts +2 -5
- package/src/tool/solarCalculator/i18n/pl.ts +2 -6
- package/src/tool/solarCalculator/i18n/pt.ts +2 -6
- package/src/tool/solarCalculator/i18n/ru.ts +2 -5
- package/src/tool/solarCalculator/i18n/sv.ts +2 -5
- package/src/tool/solarCalculator/i18n/tr.ts +2 -5
- package/src/tool/solarCalculator/i18n/zh.ts +116 -120
- package/src/tool/solarCalculator/seo.astro +2 -1
- package/src/tool/tariffComparator/bibliography.ts +7 -0
- package/src/tool/tariffComparator/i18n/de.ts +129 -132
- package/src/tool/tariffComparator/i18n/en.ts +2 -9
- package/src/tool/tariffComparator/i18n/es.ts +2 -9
- package/src/tool/tariffComparator/i18n/fr.ts +2 -9
- package/src/tool/tariffComparator/i18n/id.ts +2 -5
- package/src/tool/tariffComparator/i18n/it.ts +2 -5
- package/src/tool/tariffComparator/i18n/ja.ts +129 -132
- package/src/tool/tariffComparator/i18n/ko.ts +129 -132
- package/src/tool/tariffComparator/i18n/nl.ts +2 -5
- package/src/tool/tariffComparator/i18n/pl.ts +2 -5
- package/src/tool/tariffComparator/i18n/pt.ts +2 -5
- package/src/tool/tariffComparator/i18n/ru.ts +2 -5
- package/src/tool/tariffComparator/i18n/sv.ts +2 -5
- package/src/tool/tariffComparator/i18n/tr.ts +2 -5
- package/src/tool/tariffComparator/i18n/zh.ts +129 -132
- package/src/tool/tariffComparator/seo.astro +2 -1
- package/src/types.ts +0 -2
package/package.json
CHANGED
|
@@ -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 =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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('
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|