@jjlmoya/utils-travel 1.13.0 → 1.14.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 +31 -14
- package/src/tests/locale_completeness.test.ts +7 -19
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tool/luggage-calculator/bibliography.astro +2 -10
- package/src/tool/luggage-calculator/bibliography.ts +16 -0
- package/src/tool/luggage-calculator/entry.ts +2 -0
- package/src/tool/luggage-calculator/i18n/de.ts +1 -17
- package/src/tool/luggage-calculator/i18n/en.ts +1 -17
- package/src/tool/luggage-calculator/i18n/es.ts +1 -17
- package/src/tool/luggage-calculator/i18n/fr.ts +1 -17
- package/src/tool/luggage-calculator/i18n/id.ts +1 -17
- package/src/tool/luggage-calculator/i18n/it.ts +1 -17
- package/src/tool/luggage-calculator/i18n/ja.ts +1 -17
- package/src/tool/luggage-calculator/i18n/ko.ts +1 -17
- package/src/tool/luggage-calculator/i18n/nl.ts +1 -17
- package/src/tool/luggage-calculator/i18n/pl.ts +1 -17
- package/src/tool/luggage-calculator/i18n/pt.ts +1 -17
- package/src/tool/luggage-calculator/i18n/ru.ts +1 -17
- package/src/tool/luggage-calculator/i18n/sv.ts +1 -17
- package/src/tool/luggage-calculator/i18n/tr.ts +1 -17
- package/src/tool/luggage-calculator/i18n/zh.ts +1 -17
- package/src/tool/luggage-calculator/index.ts +1 -0
- package/src/tool/mini-adventures/bibliography.astro +2 -10
- package/src/tool/mini-adventures/bibliography.ts +6 -0
- package/src/tool/mini-adventures/entry.ts +2 -0
- package/src/tool/mini-adventures/i18n/de.ts +1 -7
- package/src/tool/mini-adventures/i18n/en.ts +1 -7
- package/src/tool/mini-adventures/i18n/es.ts +1 -7
- package/src/tool/mini-adventures/i18n/fr.ts +1 -7
- package/src/tool/mini-adventures/i18n/id.ts +1 -7
- package/src/tool/mini-adventures/i18n/it.ts +1 -7
- package/src/tool/mini-adventures/i18n/ja.ts +1 -7
- package/src/tool/mini-adventures/i18n/ko.ts +1 -7
- package/src/tool/mini-adventures/i18n/nl.ts +1 -7
- package/src/tool/mini-adventures/i18n/pl.ts +1 -7
- package/src/tool/mini-adventures/i18n/pt.ts +1 -7
- package/src/tool/mini-adventures/i18n/ru.ts +1 -7
- package/src/tool/mini-adventures/i18n/sv.ts +1 -7
- package/src/tool/mini-adventures/i18n/tr.ts +1 -7
- package/src/tool/mini-adventures/i18n/zh.ts +1 -7
- package/src/tool/mini-adventures/index.ts +1 -0
- package/src/tool/suitcase-checklist/bibliography.astro +2 -10
- package/src/tool/suitcase-checklist/bibliography.ts +6 -0
- package/src/tool/suitcase-checklist/entry.ts +2 -0
- package/src/tool/suitcase-checklist/i18n/de.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/en.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/es.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/fr.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/id.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/it.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/ja.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/ko.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/nl.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/pl.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/pt.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/ru.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/sv.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/tr.ts +1 -7
- package/src/tool/suitcase-checklist/i18n/zh.ts +1 -7
- package/src/tool/suitcase-checklist/index.ts +1 -0
- package/src/tool/tip-calculator/bibliography.astro +2 -10
- package/src/tool/tip-calculator/bibliography.ts +16 -0
- package/src/tool/tip-calculator/entry.ts +2 -0
- package/src/tool/tip-calculator/i18n/de.ts +1 -17
- package/src/tool/tip-calculator/i18n/en.ts +1 -17
- package/src/tool/tip-calculator/i18n/es.ts +1 -17
- package/src/tool/tip-calculator/i18n/fr.ts +1 -17
- package/src/tool/tip-calculator/i18n/id.ts +1 -17
- package/src/tool/tip-calculator/i18n/it.ts +1 -17
- package/src/tool/tip-calculator/i18n/ja.ts +1 -17
- package/src/tool/tip-calculator/i18n/ko.ts +1 -17
- package/src/tool/tip-calculator/i18n/nl.ts +1 -17
- package/src/tool/tip-calculator/i18n/pl.ts +1 -17
- package/src/tool/tip-calculator/i18n/pt.ts +1 -17
- package/src/tool/tip-calculator/i18n/ru.ts +1 -17
- package/src/tool/tip-calculator/i18n/sv.ts +1 -17
- package/src/tool/tip-calculator/i18n/tr.ts +1 -17
- package/src/tool/tip-calculator/i18n/zh.ts +1 -17
- package/src/tool/tip-calculator/index.ts +1 -0
- package/src/types.ts +4 -6
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,17 @@ 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
|
+
// eslint-disable-next-line custom/no-css-comments
|
|
85
|
+
const cssFiles = import.meta.glob("../../tool/**/*.css", { query: "?raw", import: "default" });
|
|
86
|
+
const cssKey = Object.keys(cssFiles).find((k) => k.endsWith(`/${englishSlug}.css`));
|
|
87
|
+
const toolCss = cssKey ? await cssFiles[cssKey]() as string : "";
|
|
72
88
|
|
|
73
|
-
const seoContent: UtilitySEOContent = { locale, sections: content.seo };
|
|
89
|
+
const seoContent: UtilitySEOContent = { locale, sections: content.seo ?? [] };
|
|
74
90
|
|
|
75
91
|
const words = content.title.split(" ");
|
|
76
92
|
const titleHighlight = words[0] || "";
|
|
@@ -89,8 +105,9 @@ const titleBase = words.slice(1).join(" ") || "";
|
|
|
89
105
|
tools={allToolsNav}
|
|
90
106
|
/>
|
|
91
107
|
<Fragment slot="head">
|
|
108
|
+
{toolCss ? <Fragment set:html={`<style is:inline>${toolCss}</style>`} /> : null}
|
|
92
109
|
{
|
|
93
|
-
content.schemas.map((schema: unknown) => (
|
|
110
|
+
( content.schemas ?? []).map((schema: unknown) => (
|
|
94
111
|
<script
|
|
95
112
|
is:inline
|
|
96
113
|
type="application/ld+json"
|
|
@@ -116,11 +133,11 @@ const titleBase = words.slice(1).join(" ") || "";
|
|
|
116
133
|
</section>
|
|
117
134
|
|
|
118
135
|
<section class="section-faq">
|
|
119
|
-
<FAQSection items={content.faq}
|
|
136
|
+
<FAQSection items={content.faq} />
|
|
120
137
|
</section>
|
|
121
138
|
|
|
122
139
|
<section class="section-bibliography">
|
|
123
|
-
<Bibliography links={content.bibliography}
|
|
140
|
+
<Bibliography links={content.bibliography} />
|
|
124
141
|
</section>
|
|
125
142
|
</div>
|
|
126
143
|
</PreviewLayout>
|
|
@@ -7,28 +7,16 @@ 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 have mandatory properties', async () => {
|
|
11
11
|
const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
|
|
12
12
|
const content = (await loader?.()) as ToolLocaleContent;
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
}
|
|
14
|
+
expect(content.slug).toBeTruthy();
|
|
15
|
+
expect(typeof content.slug).toBe('string');
|
|
16
|
+
expect(content.title).toBeTruthy();
|
|
17
|
+
expect(typeof content.title).toBe('string');
|
|
18
|
+
expect(content.description).toBeTruthy();
|
|
19
|
+
expect(typeof content.description).toBe('string');
|
|
32
20
|
});
|
|
33
21
|
});
|
|
34
22
|
});
|
|
@@ -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
|
+
});
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
import { Bibliography as SharedBibliography } from "@jjlmoya/utils-shared";
|
|
3
|
-
import {
|
|
4
|
-
import type { KnownLocale } from "../../types";
|
|
5
|
-
|
|
6
|
-
interface Props {
|
|
7
|
-
locale?: KnownLocale;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const { locale = "es" } = Astro.props;
|
|
11
|
-
const content = await luggageCalculator.i18n[locale]?.();
|
|
3
|
+
import { bibliography } from "./bibliography";
|
|
12
4
|
---
|
|
13
5
|
|
|
14
|
-
|
|
6
|
+
<SharedBibliography links={bibliography} />
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { BibliographyEntry } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const bibliography: BibliographyEntry[] = [
|
|
4
|
+
{
|
|
5
|
+
name: "AENA: Passagiere und Gepäck",
|
|
6
|
+
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
name: "Fluggastrechte - EU",
|
|
10
|
+
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_de.htm",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: "IATA: Gepäckregeln für Passagiere",
|
|
14
|
+
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
15
|
+
},
|
|
16
|
+
];
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
3
|
import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
|
|
|
407
408
|
},
|
|
408
409
|
];
|
|
409
410
|
|
|
410
|
-
const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
|
|
411
|
-
{
|
|
412
|
-
name: "AENA: Passagiere und Gepäck",
|
|
413
|
-
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
414
|
-
},
|
|
415
|
-
{
|
|
416
|
-
name: "Fluggastrechte - EU",
|
|
417
|
-
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_de.htm",
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
name: "IATA: Gepäckregeln für Passagiere",
|
|
421
|
-
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
422
|
-
},
|
|
423
|
-
];
|
|
424
|
-
|
|
425
411
|
const seo: LuggageCalculatorLocaleContent['seo'] = [
|
|
426
412
|
{
|
|
427
413
|
type: "title",
|
|
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
|
|
|
607
593
|
ui,
|
|
608
594
|
seo,
|
|
609
595
|
faq,
|
|
610
|
-
faqTitle: "Häufig gestellte Fragen",
|
|
611
596
|
bibliography,
|
|
612
|
-
bibliographyTitle: "Quellen und Referenzen",
|
|
613
597
|
howTo,
|
|
614
598
|
howToTitle: "So verwenden Sie den Rechner",
|
|
615
599
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
3
|
import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -408,21 +409,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
|
|
|
408
409
|
},
|
|
409
410
|
];
|
|
410
411
|
|
|
411
|
-
const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
|
|
412
|
-
{
|
|
413
|
-
name: "AENA: Passengers and Baggage",
|
|
414
|
-
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
415
|
-
},
|
|
416
|
-
{
|
|
417
|
-
name: "Air Passenger Rights - EU",
|
|
418
|
-
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_es.htm",
|
|
419
|
-
},
|
|
420
|
-
{
|
|
421
|
-
name: "IATA: Passenger Baggage Rules",
|
|
422
|
-
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
423
|
-
},
|
|
424
|
-
];
|
|
425
|
-
|
|
426
412
|
const seo: LuggageCalculatorLocaleContent['seo'] = [
|
|
427
413
|
{
|
|
428
414
|
type: "title",
|
|
@@ -608,9 +594,7 @@ export const content: LuggageCalculatorLocaleContent = {
|
|
|
608
594
|
ui,
|
|
609
595
|
seo,
|
|
610
596
|
faq,
|
|
611
|
-
faqTitle: "Frequently Asked Questions",
|
|
612
597
|
bibliography,
|
|
613
|
-
bibliographyTitle: "Sources and References",
|
|
614
598
|
howTo,
|
|
615
599
|
howToTitle: "How to use the calculator",
|
|
616
600
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
3
|
import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -408,21 +409,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
|
|
|
408
409
|
},
|
|
409
410
|
];
|
|
410
411
|
|
|
411
|
-
const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
|
|
412
|
-
{
|
|
413
|
-
name: "AENA: Pasajeros y Equipajes",
|
|
414
|
-
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
415
|
-
},
|
|
416
|
-
{
|
|
417
|
-
name: "Derechos de los Pasajeros de la UE",
|
|
418
|
-
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_es.htm",
|
|
419
|
-
},
|
|
420
|
-
{
|
|
421
|
-
name: "IATA: Passenger Baggage Rules",
|
|
422
|
-
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
423
|
-
},
|
|
424
|
-
];
|
|
425
|
-
|
|
426
412
|
const seo: LuggageCalculatorLocaleContent['seo'] = [
|
|
427
413
|
{
|
|
428
414
|
type: "title",
|
|
@@ -608,9 +594,7 @@ export const content: LuggageCalculatorLocaleContent = {
|
|
|
608
594
|
ui,
|
|
609
595
|
seo,
|
|
610
596
|
faq,
|
|
611
|
-
faqTitle: "Preguntas Frecuentes",
|
|
612
597
|
bibliography,
|
|
613
|
-
bibliographyTitle: "Fuentes y Referencias",
|
|
614
598
|
howTo,
|
|
615
599
|
howToTitle: "Cómo usar la calculadora",
|
|
616
600
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
3
|
import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -392,21 +393,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
|
|
|
392
393
|
},
|
|
393
394
|
];
|
|
394
395
|
|
|
395
|
-
const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
|
|
396
|
-
{
|
|
397
|
-
name: "AENA: Pasajeros y Equipajes",
|
|
398
|
-
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
399
|
-
},
|
|
400
|
-
{
|
|
401
|
-
name: "Droits des Passagers Aériens - UE",
|
|
402
|
-
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_es.htm",
|
|
403
|
-
},
|
|
404
|
-
{
|
|
405
|
-
name: "IATA: Passenger Baggage Rules",
|
|
406
|
-
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
407
|
-
},
|
|
408
|
-
];
|
|
409
|
-
|
|
410
396
|
const seo: LuggageCalculatorLocaleContent['seo'] = [
|
|
411
397
|
{
|
|
412
398
|
type: "title",
|
|
@@ -540,9 +526,7 @@ export const content: LuggageCalculatorLocaleContent = {
|
|
|
540
526
|
ui,
|
|
541
527
|
seo,
|
|
542
528
|
faq,
|
|
543
|
-
faqTitle: "Questions Fréquentes",
|
|
544
529
|
bibliography,
|
|
545
|
-
bibliographyTitle: "Sources et Références",
|
|
546
530
|
howTo,
|
|
547
531
|
howToTitle: "Comment utiliser le calculateur",
|
|
548
532
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
3
|
import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
|
|
|
407
408
|
},
|
|
408
409
|
];
|
|
409
410
|
|
|
410
|
-
const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
|
|
411
|
-
{
|
|
412
|
-
name: "AENA: Penumpang dan Bagasi",
|
|
413
|
-
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
414
|
-
},
|
|
415
|
-
{
|
|
416
|
-
name: "Hak Penumpang Udara - Uni Eropa",
|
|
417
|
-
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_en.htm",
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
name: "IATA: Aturan Bagasi Penumpang",
|
|
421
|
-
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
422
|
-
},
|
|
423
|
-
];
|
|
424
|
-
|
|
425
411
|
const seo: LuggageCalculatorLocaleContent['seo'] = [
|
|
426
412
|
{
|
|
427
413
|
type: "title",
|
|
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
|
|
|
607
593
|
ui,
|
|
608
594
|
seo,
|
|
609
595
|
faq,
|
|
610
|
-
faqTitle: "Pertanyaan yang Sering Diajukan",
|
|
611
596
|
bibliography,
|
|
612
|
-
bibliographyTitle: "Sumber dan Referensi",
|
|
613
597
|
howTo,
|
|
614
598
|
howToTitle: "Cara menggunakan kalkulator",
|
|
615
599
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
3
|
import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
|
|
|
407
408
|
},
|
|
408
409
|
];
|
|
409
410
|
|
|
410
|
-
const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
|
|
411
|
-
{
|
|
412
|
-
name: "AENA: Passeggeri e Bagagli",
|
|
413
|
-
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
414
|
-
},
|
|
415
|
-
{
|
|
416
|
-
name: "Diritti dei Passeggeri Aerei - UE",
|
|
417
|
-
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_it.htm",
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
name: "IATA: Regole sui Bagagli dei Passeggeri",
|
|
421
|
-
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
422
|
-
},
|
|
423
|
-
];
|
|
424
|
-
|
|
425
411
|
const seo: LuggageCalculatorLocaleContent['seo'] = [
|
|
426
412
|
{
|
|
427
413
|
type: "title",
|
|
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
|
|
|
607
593
|
ui,
|
|
608
594
|
seo,
|
|
609
595
|
faq,
|
|
610
|
-
faqTitle: "Domande Frequenti",
|
|
611
596
|
bibliography,
|
|
612
|
-
bibliographyTitle: "Fonti e Riferimenti",
|
|
613
597
|
howTo,
|
|
614
598
|
howToTitle: "Come utilizzare il calcolatore",
|
|
615
599
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
3
|
import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
|
|
|
407
408
|
},
|
|
408
409
|
];
|
|
409
410
|
|
|
410
|
-
const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
|
|
411
|
-
{
|
|
412
|
-
name: "AENA:旅客と手荷物",
|
|
413
|
-
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
414
|
-
},
|
|
415
|
-
{
|
|
416
|
-
name: "航空旅客の権利 - EU",
|
|
417
|
-
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_en.htm",
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
name: "IATA:旅客手荷物規則",
|
|
421
|
-
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
422
|
-
},
|
|
423
|
-
];
|
|
424
|
-
|
|
425
411
|
const seo: LuggageCalculatorLocaleContent['seo'] = [
|
|
426
412
|
{
|
|
427
413
|
type: "title",
|
|
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
|
|
|
607
593
|
ui,
|
|
608
594
|
seo,
|
|
609
595
|
faq,
|
|
610
|
-
faqTitle: "よくある質問",
|
|
611
596
|
bibliography,
|
|
612
|
-
bibliographyTitle: "出典とリファレンス",
|
|
613
597
|
howTo,
|
|
614
598
|
howToTitle: "計算機の使い方",
|
|
615
599
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
3
|
import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
|
|
|
407
408
|
},
|
|
408
409
|
];
|
|
409
410
|
|
|
410
|
-
const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
|
|
411
|
-
{
|
|
412
|
-
name: "AENA: 승객 및 수하물",
|
|
413
|
-
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
414
|
-
},
|
|
415
|
-
{
|
|
416
|
-
name: "항공 승객 권리 - EU",
|
|
417
|
-
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_en.htm",
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
name: "IATA: 승객 수하물 규정",
|
|
421
|
-
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
422
|
-
},
|
|
423
|
-
];
|
|
424
|
-
|
|
425
411
|
const seo: LuggageCalculatorLocaleContent['seo'] = [
|
|
426
412
|
{
|
|
427
413
|
type: "title",
|
|
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
|
|
|
607
593
|
ui,
|
|
608
594
|
seo,
|
|
609
595
|
faq,
|
|
610
|
-
faqTitle: "자주 묻는 질문",
|
|
611
596
|
bibliography,
|
|
612
|
-
bibliographyTitle: "출처 및 참고",
|
|
613
597
|
howTo,
|
|
614
598
|
howToTitle: "계산기 사용 방법",
|
|
615
599
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
3
|
import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
|
|
|
407
408
|
},
|
|
408
409
|
];
|
|
409
410
|
|
|
410
|
-
const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
|
|
411
|
-
{
|
|
412
|
-
name: "AENA: Passagiers en Bagage",
|
|
413
|
-
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
414
|
-
},
|
|
415
|
-
{
|
|
416
|
-
name: "Passagiersrechten Luchtvaart - EU",
|
|
417
|
-
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_nl.htm",
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
name: "IATA: Passagiersbagageregels",
|
|
421
|
-
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
422
|
-
},
|
|
423
|
-
];
|
|
424
|
-
|
|
425
411
|
const seo: LuggageCalculatorLocaleContent['seo'] = [
|
|
426
412
|
{
|
|
427
413
|
type: "title",
|
|
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
|
|
|
607
593
|
ui,
|
|
608
594
|
seo,
|
|
609
595
|
faq,
|
|
610
|
-
faqTitle: "Veelgestelde Vragen",
|
|
611
596
|
bibliography,
|
|
612
|
-
bibliographyTitle: "Bronnen en Referenties",
|
|
613
597
|
howTo,
|
|
614
598
|
howToTitle: "Hoe de calculator te gebruiken",
|
|
615
599
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
3
|
import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
|
|
|
407
408
|
},
|
|
408
409
|
];
|
|
409
410
|
|
|
410
|
-
const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
|
|
411
|
-
{
|
|
412
|
-
name: "AENA: Pasażerowie i Bagaż",
|
|
413
|
-
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
414
|
-
},
|
|
415
|
-
{
|
|
416
|
-
name: "Prawa Pasażerów Lotniczych - UE",
|
|
417
|
-
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_pl.htm",
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
name: "IATA: Przepisy dotyczące bagażu pasażerskiego",
|
|
421
|
-
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
422
|
-
},
|
|
423
|
-
];
|
|
424
|
-
|
|
425
411
|
const seo: LuggageCalculatorLocaleContent['seo'] = [
|
|
426
412
|
{
|
|
427
413
|
type: "title",
|
|
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
|
|
|
607
593
|
ui,
|
|
608
594
|
seo,
|
|
609
595
|
faq,
|
|
610
|
-
faqTitle: "Najczęściej Zadawane Pytania",
|
|
611
596
|
bibliography,
|
|
612
|
-
bibliographyTitle: "Źródła i Odniesienia",
|
|
613
597
|
howTo,
|
|
614
598
|
howToTitle: "Jak korzystać z kalkulatora",
|
|
615
599
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
3
|
import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -407,21 +408,6 @@ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
|
|
|
407
408
|
},
|
|
408
409
|
];
|
|
409
410
|
|
|
410
|
-
const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
|
|
411
|
-
{
|
|
412
|
-
name: "AENA: Passageiros e Bagagem",
|
|
413
|
-
url: "https://www.aena.es/es/pasajeros/pasajeros.html",
|
|
414
|
-
},
|
|
415
|
-
{
|
|
416
|
-
name: "Direitos dos Passageiros Aéreos - UE",
|
|
417
|
-
url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_pt.htm",
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
name: "IATA: Regras de Bagagem de Passageiros",
|
|
421
|
-
url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
|
|
422
|
-
},
|
|
423
|
-
];
|
|
424
|
-
|
|
425
411
|
const seo: LuggageCalculatorLocaleContent['seo'] = [
|
|
426
412
|
{
|
|
427
413
|
type: "title",
|
|
@@ -607,9 +593,7 @@ export const content: LuggageCalculatorLocaleContent = {
|
|
|
607
593
|
ui,
|
|
608
594
|
seo,
|
|
609
595
|
faq,
|
|
610
|
-
faqTitle: "Perguntas Frequentes",
|
|
611
596
|
bibliography,
|
|
612
|
-
bibliographyTitle: "Fontes e Referências",
|
|
613
597
|
howTo,
|
|
614
598
|
howToTitle: "Como usar a calculadora",
|
|
615
599
|
schemas: [faqSchema, howToSchema, appSchema],
|