@jjlmoya/utils-pets 1.12.0 → 1.13.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 (45) hide show
  1. package/package.json +1 -1
  2. package/src/pages/[locale]/[slug].astro +29 -13
  3. package/src/tests/locale_completeness.test.ts +4 -14
  4. package/src/tests/shared-test-helpers.ts +56 -0
  5. package/src/tests/tool_exports.test.ts +34 -0
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/petAge/bibliography.astro +2 -10
  8. package/src/tool/petAge/bibliography.ts +6 -0
  9. package/src/tool/petAge/entry.ts +2 -0
  10. package/src/tool/petAge/i18n/de.ts +2 -7
  11. package/src/tool/petAge/i18n/en.ts +2 -7
  12. package/src/tool/petAge/i18n/es.ts +2 -7
  13. package/src/tool/petAge/i18n/fr.ts +2 -7
  14. package/src/tool/petAge/i18n/id.ts +2 -7
  15. package/src/tool/petAge/i18n/it.ts +2 -7
  16. package/src/tool/petAge/i18n/ja.ts +2 -7
  17. package/src/tool/petAge/i18n/ko.ts +2 -7
  18. package/src/tool/petAge/i18n/nl.ts +2 -7
  19. package/src/tool/petAge/i18n/pl.ts +2 -7
  20. package/src/tool/petAge/i18n/pt.ts +2 -7
  21. package/src/tool/petAge/i18n/ru.ts +2 -7
  22. package/src/tool/petAge/i18n/sv.ts +2 -7
  23. package/src/tool/petAge/i18n/tr.ts +2 -7
  24. package/src/tool/petAge/i18n/zh.ts +2 -7
  25. package/src/tool/petAge/seo.astro +2 -48
  26. package/src/tool/petRation/bibliography.astro +2 -10
  27. package/src/tool/petRation/bibliography.ts +6 -0
  28. package/src/tool/petRation/entry.ts +2 -0
  29. package/src/tool/petRation/i18n/de.ts +2 -7
  30. package/src/tool/petRation/i18n/en.ts +2 -7
  31. package/src/tool/petRation/i18n/es.ts +2 -7
  32. package/src/tool/petRation/i18n/fr.ts +2 -7
  33. package/src/tool/petRation/i18n/id.ts +2 -7
  34. package/src/tool/petRation/i18n/it.ts +2 -7
  35. package/src/tool/petRation/i18n/ja.ts +2 -7
  36. package/src/tool/petRation/i18n/ko.ts +2 -7
  37. package/src/tool/petRation/i18n/nl.ts +2 -7
  38. package/src/tool/petRation/i18n/pl.ts +2 -7
  39. package/src/tool/petRation/i18n/pt.ts +2 -7
  40. package/src/tool/petRation/i18n/ru.ts +2 -7
  41. package/src/tool/petRation/i18n/sv.ts +2 -7
  42. package/src/tool/petRation/i18n/tr.ts +2 -7
  43. package/src/tool/petRation/i18n/zh.ts +2 -7
  44. package/src/tool/petRation/seo.astro +2 -48
  45. package/src/types.ts +0 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-pets",
3
- "version": "1.12.0",
3
+ "version": "1.13.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) => (
109
+ ( content.schemas ?? []).map((schema) => (
94
110
  <script
95
111
  is:inline
96
112
  type="application/ld+json"
@@ -120,7 +136,7 @@ const titleBase = words.slice(1).join(" ") || "";
120
136
  </section>
121
137
 
122
138
  <section class="section-bibliography">
123
- <Bibliography links={content.bibliography} title={content.bibliographyTitle} />
139
+ <Bibliography links={content.bibliography} />
124
140
  </section>
125
141
  </div>
126
142
  </PreviewLayout>
@@ -7,28 +7,18 @@ 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('faq should be defined', 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
- 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
- }
14
+ expect(Array.isArray(content.faq)).toBe(true);
20
15
  });
21
16
 
22
- it('bibliographyTitle should be defined when bibliography items exist', async () => {
17
+ it('bibliography should be defined', async () => {
23
18
  const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
24
19
  const content = (await loader?.()) as ToolLocaleContent;
25
20
 
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
- }
21
+ expect(Array.isArray(content.bibliography)).toBe(true);
32
22
  });
33
23
  });
34
24
  });
@@ -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
+ });
@@ -131,8 +131,8 @@ describe('Tool Validation Suite', () => {
131
131
  const content = fs.readFileSync(componentPath, 'utf-8');
132
132
 
133
133
  expect(content).toContain("import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared'");
134
- expect(content).toContain(`import { ${toolVarName} } from './index'`);
135
- expect(content).toContain('<SharedBibliography links={content.bibliography} />');
134
+ expect(content).toContain("import { bibliography } from './bibliography'");
135
+ expect(content).toContain('<SharedBibliography links={bibliography} />');
136
136
  });
137
137
  });
138
138
  });
@@ -1,14 +1,6 @@
1
1
  ---
2
2
  import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
- import { petAge } from './index';
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 petAge.i18n[locale]?.();
3
+ import { bibliography } from './bibliography';
12
4
  ---
13
5
 
14
- {content && <SharedBibliography links={content.bibliography} />}
6
+ <SharedBibliography links={bibliography} />
@@ -0,0 +1,6 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ { name: 'AAHA Senior Care Guidelines for Dogs and Cats', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
5
+ { name: 'AKC: How to Calculate Dog Years to Human Years', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
6
+ ];
@@ -62,3 +62,5 @@ export const petAge: PetToolEntry<PetAgeUI> = {
62
62
  zh: () => import('./i18n/zh').then((m) => m.content),
63
63
  },
64
64
  };
65
+
66
+ export { bibliography } from './bibliography';
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Lebensphase analysieren', text: 'Überprüfen Sie das Ergebnis, um zu wissen, ob Ihr Haustier im Vergleich zum Menschen im Säuglings-, Jugend-, Erwachsenen- oder Seniorenstadium ist.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'AAHA Senioren-Pflege-Richtlinien für Hunde und Katzen', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: Wie man Hundejahre in Menschenjahre umrechnet', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'Häufig gestellte Fragen',
179
+
184
180
  faq,
185
- bibliographyTitle: 'Bibliographie',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Analyze life stage', text: 'Check the result to know if your pet is in the infant, young, adult, or senior stage compared to a human and understand their current needs.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'AAHA Senior Care Guidelines for Dogs and Cats', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: How to Calculate Dog Years to Human Years', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'Frequently Asked Questions',
179
+
184
180
  faq,
185
- bibliographyTitle: 'Bibliography',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Analiza su etapa de vida', text: 'Revisa el resultado para conocer si tu mascota está en etapa de cachorro, joven, adulto o senior frente a un humano y comprende sus necesidades actuales.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'Pautas de la AAHA sobre el cuidado de personas mayores para perros y gatos', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: Cómo calcular los años de perro en años humanos', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'Preguntas Frecuentes',
179
+
184
180
  faq,
185
- bibliographyTitle: 'Bibliografía',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Analysez l\'étape de vie', text: 'Vérifiez le résultat pour savoir si votre animal est au stade de chiot, jeune, adulte ou senior par rapport à un humain et comprenez ses besoins actuels.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'Lignes directrices de l\'AAHA sur les soins aux seniors pour chiens et chats', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC : Comment calculer les années de chien en années humaines', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'Foire Aux Questions',
179
+
184
180
  faq,
185
- bibliographyTitle: 'Bibliographie',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Analisis tahap kehidupan', text: 'Periksa hasilnya untuk mengetahui apakah hewan peliharaan Anda berada dalam tahap bayi, muda, dewasa, atau senior dibandingkan dengan manusia dan pahami kebutuhan mereka saat ini.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'Pedoman Perawatan Senior AAHA untuk Anjing dan Kucing', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: Cara Menghitung Tahun Anjing ke Tahun Manusia', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'Pertanyaan yang Sering Diajukan',
179
+
184
180
  faq,
185
- bibliographyTitle: 'Bibliografi',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Analizza la fase di vita', text: 'Verifica il risultato per sapere se il tuo animale è al stadio di cucciolo, giovane, adulto o senior rispetto a un umano e comprendi le sue necessità attuali.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'Linee guida dell\'AAHA sulla cura dei senior per cani e gatti', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: Come calcolare gli anni di cane in anni umani', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'Domande Frequenti',
179
+
184
180
  faq,
185
- bibliographyTitle: 'Bibliografia',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'ライフステージを確認', text: '計算 結果 から、 人間 と 比較 して 現在 の ペット が 幼少期 、 青年期 、 成人期 、 シニア期 の どの 段階 に ある か を 確認 します。' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'AAHA 犬と猫のシニアケアガイドライン', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC:犬の年齢を人間の年齢に換算する方法', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'よくある質問',
179
+
184
180
  faq,
185
- bibliographyTitle: '参考文献',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: '생애 단계 분석', text: '계산 결과를 확인하여 사람 나이와 비교했을 때 현재 반려동물이 어느 단계에 있는지, 그리고 어떤 관리가 필요한지 분석하세요.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'AAHA 강아지 및 고양이 노령 관리 가이드라인', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: 강아지 나이를 사람 나이로 환산하는 방법', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: '자주 묻는 질문',
179
+
184
180
  faq,
185
- bibliographyTitle: '참고 문헌',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Analyseer de levensfase', text: 'Controleer het resultaat om te weten of uw huisdier zich in de baby-, jonge, volwassen of seniorfase bevindt vergeleken met een mens en begrijp hun huidige behoeften.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'AAHA Senior Care Guidelines voor honden en katten', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: Hoe u hondenjaren naar mensenjaren berekent', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'Veelgestelde Vragen',
179
+
184
180
  faq,
185
- bibliographyTitle: 'Bibliografie',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Przeanalizuj odpowiednik ludzki', text: 'Sprawdź wynik, aby dowiedzieć się, czy Twoje zwierzę jest w fazie szczenięcej, młodej, dorosłej czy starszej w porównaniu z człowiekiem i zrozumieć jego obecne potrzeby.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'Wytyczne AAHA dotyczące opieki nad seniorami dla psów i kotów', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: Jak przeliczyć lata psie na lata ludzkie', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'Często Zadawane Pytania',
179
+
184
180
  faq,
185
- bibliographyTitle: 'Bibliografia',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Analise a sua etapa de vida', text: 'Reveja o resultado para conhecer se a sua mascota está em etapa de cachorro, jovem, adulto ou sénior frente a um humano e compreenda as suas necessidades atuais.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'Diretrizes da AAHA sobre cuidados com idosos para cães e gatos', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: Como calcular os anos de cão em anos humanos', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'Perguntas Frequentes',
179
+
184
180
  faq,
185
- bibliographyTitle: 'Bibliografia',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Проанализируйте жизненный этап', text: 'Проверьте результат, чтобы узнать, находится ли ваш питомец в стадии младенчества, юности, взрослости или старости по сравнению с человеком, и поймите его текущие потребности.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'Руководство AAHA по уходу за стареющими собаками и кошками', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: Как перевести собачьи годы в человеческие', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'Часто Задаваемые Вопросы',
179
+
184
180
  faq,
185
- bibliographyTitle: 'Библиография',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Analysera livsstadiet', text: 'Kontrollera resultatet för att veta om ditt husdjur befinner sig i baby-, ung-, vuxen- eller seniorstadiet jämfört med en människa och förstå deras nuvarande behov.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'AAHA Senior Care Guidelines för hundar och katter', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: Hur man beräknar hundår till människoår', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -180,9 +176,8 @@ export const content: PetAgeLocaleContent = {
180
176
  description,
181
177
  ui,
182
178
  seo,
183
- faqTitle: 'Vanliga frågor',
179
+
184
180
  faq,
185
- bibliographyTitle: 'Bibliografi',
186
181
  bibliography,
187
182
  howTo,
188
183
  schemas,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
@@ -66,11 +67,6 @@ const howTo: PetAgeLocaleContent['howTo'] = [
66
67
  { name: 'Yaşam Evresini Analiz Edin', text: 'Evcil hayvanınızın bir insana kıyasla yavru, genç, yetişkin veya kıdemli aşamada olup olmadığını öğrenmek için sonucu kontrol edin ve mevcut ihtiyaçlarını anlayın.' },
67
68
  ];
68
69
 
69
- const bibliography: PetAgeLocaleContent['bibliography'] = [
70
- { name: 'AAHA Köpek ve Kedi Kıdemli Bakım Rehberi', url: 'https://www.aaha.org/wp-content/uploads/globalassets/02-guidelines/2023-aaha-senior-care-guidelines-for-dogs-and-cats/resources/2023-aaha-senior-care-guidelines-for-dogs-and-cats.pdf' },
71
- { name: 'AKC: Köpek Yılları İnsan Yıllarına Nasıl Hesaplanır', url: 'https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/' },
72
- ];
73
-
74
70
  const seo: PetAgeLocaleContent['seo'] = [
75
71
  {
76
72
  type: 'summary',
@@ -186,9 +182,8 @@ export const content: PetAgeLocaleContent = {
186
182
  description,
187
183
  ui,
188
184
  seo,
189
- faqTitle: 'Sıkça Sorulan Sorular',
185
+
190
186
  faq,
191
- bibliographyTitle: 'Bibliyografya',
192
187
  bibliography,
193
188
  howTo,
194
189
  schemas,