@jjlmoya/utils-pets 1.12.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.
Files changed (57) hide show
  1. package/package.json +4 -2
  2. package/src/category/i18n/fr.ts +4 -4
  3. package/src/category/i18n/ru.ts +4 -4
  4. package/src/category/i18n/zh.ts +1 -1
  5. package/src/data.ts +1 -1
  6. package/src/layouts/PreviewLayout.astro +7 -1
  7. package/src/pages/[locale]/[slug].astro +29 -13
  8. package/src/tests/diacritics_density.test.ts +118 -0
  9. package/src/tests/inverted_punctuation.test.ts +84 -0
  10. package/src/tests/locale_completeness.test.ts +4 -14
  11. package/src/tests/no_en_dash.test.ts +70 -0
  12. package/src/tests/pagespeed_best_practices.test.ts +198 -0
  13. package/src/tests/script_density.test.ts +94 -0
  14. package/src/tests/shared-test-helpers.ts +56 -0
  15. package/src/tests/tool_exports.test.ts +34 -0
  16. package/src/tests/tool_validation.test.ts +2 -2
  17. package/src/tool/petAge/bibliography.astro +2 -10
  18. package/src/tool/petAge/bibliography.ts +6 -0
  19. package/src/tool/petAge/component.astro +1 -0
  20. package/src/tool/petAge/entry.ts +2 -0
  21. package/src/tool/petAge/i18n/de.ts +2 -7
  22. package/src/tool/petAge/i18n/en.ts +2 -7
  23. package/src/tool/petAge/i18n/es.ts +2 -7
  24. package/src/tool/petAge/i18n/fr.ts +4 -9
  25. package/src/tool/petAge/i18n/id.ts +2 -7
  26. package/src/tool/petAge/i18n/it.ts +2 -7
  27. package/src/tool/petAge/i18n/ja.ts +2 -7
  28. package/src/tool/petAge/i18n/ko.ts +2 -7
  29. package/src/tool/petAge/i18n/nl.ts +2 -7
  30. package/src/tool/petAge/i18n/pl.ts +2 -7
  31. package/src/tool/petAge/i18n/pt.ts +2 -7
  32. package/src/tool/petAge/i18n/ru.ts +9 -14
  33. package/src/tool/petAge/i18n/sv.ts +2 -7
  34. package/src/tool/petAge/i18n/tr.ts +2 -7
  35. package/src/tool/petAge/i18n/zh.ts +8 -13
  36. package/src/tool/petAge/seo.astro +2 -48
  37. package/src/tool/petRation/bibliography.astro +2 -10
  38. package/src/tool/petRation/bibliography.ts +6 -0
  39. package/src/tool/petRation/component.astro +2 -2
  40. package/src/tool/petRation/entry.ts +2 -0
  41. package/src/tool/petRation/i18n/de.ts +2 -7
  42. package/src/tool/petRation/i18n/en.ts +2 -7
  43. package/src/tool/petRation/i18n/es.ts +2 -7
  44. package/src/tool/petRation/i18n/fr.ts +8 -13
  45. package/src/tool/petRation/i18n/id.ts +2 -7
  46. package/src/tool/petRation/i18n/it.ts +2 -7
  47. package/src/tool/petRation/i18n/ja.ts +2 -7
  48. package/src/tool/petRation/i18n/ko.ts +3 -8
  49. package/src/tool/petRation/i18n/nl.ts +2 -7
  50. package/src/tool/petRation/i18n/pl.ts +2 -7
  51. package/src/tool/petRation/i18n/pt.ts +2 -7
  52. package/src/tool/petRation/i18n/ru.ts +8 -13
  53. package/src/tool/petRation/i18n/sv.ts +2 -7
  54. package/src/tool/petRation/i18n/tr.ts +5 -10
  55. package/src/tool/petRation/i18n/zh.ts +5 -10
  56. package/src/tool/petRation/seo.astro +2 -48
  57. package/src/types.ts +0 -2
@@ -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
 
@@ -51,7 +52,7 @@ const faq: PetAgeLocaleContent['faq'] = [
51
52
  },
52
53
  {
53
54
  question: 'Как стареют кошки по сравнению с людьми?',
54
- answer: 'Кошка заканчивает свое младенчество в один месяц, подростковый возраст в 6 месяцев и достигает взрослости (эквивалент 24 человеческих лет) в 2 года. После этого каждый год жизни кошки равен примерно 4 человеческим годам. Эта закономерность довольно последовательна у различных пород кошек, в отличие от значительных изменений, наблюдаемых у собак.',
55
+ answer: 'Кошка заканчивает свое младенчество в один месяц, подростковый возраст - в 6 месяцев и достигает взрослости (эквивалент 24 человеческих лет) в 2 года. После этого каждый год жизни кошки равен примерно 4 человеческим годам. Эта закономерность довольно последовательна у различных пород кошек, в отличие от значительных изменений, наблюдаемых у собак.',
55
56
  },
56
57
  {
57
58
  question: 'В каком возрасте питомец считается Сеньором?',
@@ -61,23 +62,18 @@ const faq: PetAgeLocaleContent['faq'] = [
61
62
 
62
63
  const howTo: PetAgeLocaleContent['howTo'] = [
63
64
  { name: 'Выберите вид питомца', text: 'Выберите, собака у вас или кошка, чтобы применить правильную биологическую формулу для их специфической скорости метаболизма.' },
64
- { name: 'Укажите размер (только для собак)', text: 'Для собак вес является ключевым фактором в определении биологического возраста. Укажите, маленькая она (до 10 кг), средняя (1025 кг), большая (2545 кг) или гигантская (более 45 кг).' },
65
+ { name: 'Укажите размер (только для собак)', text: 'Для собак вес является ключевым фактором в определении биологического возраста. Укажите, маленькая она (до 10 кг), средняя (10-25 кг), большая (25-45 кг) или гигантская (более 45 кг).' },
65
66
  { name: 'Введите год рождения', text: 'Введите год рождения вашего питомца, чтобы рассчитать его хронологический возраст. Наша система обработает эту информацию с учетом установленных кривых старения.' },
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',
77
73
  title: 'Что нужно знать о старении домашних животных',
78
74
  items: [
79
- '"Правило 7" это миф: собаки созревают экспоненциально в течение первых 2 лет.',
80
- 'Собака в возрасте 1 года это как 15 человеческих лет; 2 года эквивалентны 24 годам.',
75
+ '"Правило 7" - это миф: собаки созревают экспоненциально в течение первых 2 лет.',
76
+ 'Собака в возрасте 1 года - это как 15 человеческих лет; 2 года эквивалентны 24 годам.',
81
77
  'Крупные собаки стареют быстрее маленьких после 2 лет из-за биологической нагрузки.',
82
78
  'Кошки следуют более линейной кривой: каждый кошачий год равен 4 человеческим годам после 2 лет.',
83
79
  'Биологический возраст лучше предсказывает потребности в здоровье, чем просто хронологический возраст.',
@@ -87,7 +83,7 @@ const seo: PetAgeLocaleContent['seo'] = [
87
83
  { type: 'title', text: 'Научная правда о возрасте вашего питомца', level: 2 },
88
84
  {
89
85
  type: 'paragraph',
90
- html: 'Знаете ли вы, что 2-летняя кошка уже обладает зрелостью 24-летнего человека? Узнайте, почему правило умножения на 7 это миф, и как понимание биологической реальности может улучшить уход за вашим питомцем. Старый миф о том, что "1 собачий год равен 7 человеческим", это чрезмерное упрощение, которое не учитывает огромных изменений в развитии в начале жизни. Питомцы созревают с головокружительной скоростью в течение первых двух лет жизни, достигая половой и физической зрелости очень быстро. После этого кривая старения выравнивается и значительно замедляется.',
86
+ html: 'Знаете ли вы, что 2-летняя кошка уже обладает зрелостью 24-летнего человека? Узнайте, почему правило умножения на 7 - это миф, и как понимание биологической реальности может улучшить уход за вашим питомцем. Старый миф о том, что "1 собачий год равен 7 человеческим", - это чрезмерное упрощение, которое не учитывает огромных изменений в развитии в начале жизни. Питомцы созревают с головокружительной скоростью в течение первых двух лет жизни, достигая половой и физической зрелости очень быстро. После этого кривая старения выравнивается и значительно замедляется.',
91
87
  },
92
88
  {
93
89
  type: 'paragraph',
@@ -134,12 +130,12 @@ const seo: PetAgeLocaleContent['seo'] = [
134
130
  type: 'card',
135
131
  title: 'Сеньор (старше 7 лет)',
136
132
  icon: 'mdi:heart-pulse',
137
- html: 'На морде начинает появляться седина, и питомец склонен больше спать. Их метаболизм значительно замедляется, и они могут проявлять меньше интереса к активным играм. С этого момента ветеринарные осмотры должны проходить каждые шесть месяцев. Следите за признаками артрита, изменениями в состоянии зубов и любыми изменениями в поведении, которые могут указывать на дискомфорт. Раннее обнаружение возрастных недугов лучший способ обеспечить высокое качество их жизни.',
133
+ html: 'На морде начинает появляться седина, и питомец склонен больше спать. Их метаболизм значительно замедляется, и они могут проявлять меньше интереса к активным играм. С этого момента ветеринарные осмотры должны проходить каждые шесть месяцев. Следите за признаками артрита, изменениями в состоянии зубов и любыми изменениями в поведении, которые могут указывать на дискомфорт. Раннее обнаружение возрастных недугов - лучший способ обеспечить высокое качество их жизни.',
138
134
  },
139
135
  {
140
136
  type: 'tip',
141
137
  title: 'Ветеринарный совет по старению',
142
- html: 'Рассчитанный возраст это средняя биологическая оценка, основанная на обширных наборах данных. Такие факторы, как конкретная порода, генетика, диета и образ жизни, могут существенно повлиять на фактическую скорость старения вашего питомца. Для получения индивидуальной консультации и комплексной оценки здоровья всегда консультируйтесь со своим ветеринаром, который знает вашего спутника лучше всех.',
138
+ html: 'Рассчитанный возраст - это средняя биологическая оценка, основанная на обширных наборах данных. Такие факторы, как конкретная порода, генетика, диета и образ жизни, могут существенно повлиять на фактическую скорость старения вашего питомца. Для получения индивидуальной консультации и комплексной оценки здоровья всегда консультируйтесь со своим ветеринаром, который знает вашего спутника лучше всех.',
143
139
  },
144
140
  ];
145
141
 
@@ -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,
@@ -1,9 +1,10 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetAgeUI, PetAgeLocaleContent } from '../index';
3
4
 
4
5
  const slug = 'pet-age-calculator';
5
6
  const title = '宠物年龄换算器';
6
- const description = '了解您的爱犬或爱猫换算成人类后的真实年龄。告别过时的“乘7规则”。使用我们基于最新兽医学研究的计算器,精准掌握宠物的生命阶段。';
7
+ const description = '了解您的爱犬或爱猫换算成人类后的真实年龄。告别过时的\"乘7规则\"。使用我们基于最新兽医学研究的计算器,精准掌握宠物的生命阶段。';
7
8
 
8
9
  const ui: PetAgeUI = {
9
10
  toolTitle: '年龄计算器',
@@ -42,7 +43,7 @@ const ui: PetAgeUI = {
42
43
 
43
44
  const faq: PetAgeLocaleContent['faq'] = [
44
45
  {
45
- question: '“狗的一岁等于人类的七岁”是真的吗?',
46
+ question: '\"狗的一岁等于人类的七岁\"是真的吗?',
46
47
  answer: '不 是 真的。 这 是 一个 过度 简化 的 规则, 已经被 现代 兽医学 研究所 否定。 宠物 在 生命 的 最初 两年 成长 极其 迅速, 之后 这个 过程 会 随着 体重 和 品种 的 不同 而 显著 放缓。 最新 的 研究 发现 , 这种 传统 的 乘 7 比例 完全 无法 描绘 宠物 生物学 层面 的 老化 曲线。',
47
48
  },
48
49
  {
@@ -54,7 +55,7 @@ const faq: PetAgeLocaleContent['faq'] = [
54
55
  answer: '猫 在 一个月 大时 结束 婴儿期, 6 个月 大时 进入 青春期, 并在 2 岁 时 达到 成年 (相当于 人类 的 24 岁)。 之后, 猫 的 每一个 寿年 大约 相当于 人类 的 4 岁。 与 犬 类 相比 , 猫 的 衰老 曲线 相对 稳定 且 线性。',
55
56
  },
56
57
  {
57
- question: '宠物多大岁数被认为是“老年”?',
58
+ question: '宠物多大岁数被认为是\"老年\"?',
58
59
  answer: '通常 而言, 当 宠物 达到 其 预期 寿命 的 75% 时 就 被 视为 老年。 对于 猫 来说, 通常 是 从 7 到 11 岁 开始, 具体 取决于 它们的 健康 状况。 高龄 宠物 需要 更加 频繁 的 医疗 检查 和 专门 的 营养 支持。',
59
60
  },
60
61
  ];
@@ -66,17 +67,12 @@ 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',
77
73
  title: '关于宠物衰老您需要了解的知识',
78
74
  items: [
79
- '“乘 7 规则” 是 一个 误区 : 宠物 在 最初 的 2 年 呈 指数 级 成熟。',
75
+ '\"乘 7 规则\" 是 一个 误区 : 宠物 在 最初 的 2 年 呈 指数 级 成熟。',
80
76
  '1 岁 的 狗 相当于 15 岁 的 人类 ; 2 岁 的 狗 相当于 24 岁 的 人类。',
81
77
  '2 岁 之后, 大型 犬 的 衰老 速度 快于 小型 犬。',
82
78
  '猫 遵循 更加 线性 的 曲线 : 2 岁 后 每一个 猫 寿年 等于 人类 的 4 岁。',
@@ -87,7 +83,7 @@ const seo: PetAgeLocaleContent['seo'] = [
87
83
  { type: 'title', text: '关于您宠物年龄的科学真相', level: 2 },
88
84
  {
89
85
  type: 'paragraph',
90
- html: '您 知道 吗 ? 一只 2 岁 的 猫 已经 具备了 人类 24 岁 的 成熟度。 探索 为什么 “乘 7 规则” 只是 段子。 那个 1 个 狗 年 等于 7 个 人 类 年” 的 老 传说 只是 一种 过度 的 简化。 生物学 上 的 现实 要 有趣 得 多 : 宠物 在 生命 的 最初 两年 以 惊人的 速度 成熟, 极快 地 达到 性成熟 和 体成熟。 之后, 这种 衰老 曲线 会 趋于 平缓 并 放缓。',
86
+ html: '您 知道 吗 ? 一只 2 岁 的 猫 已经 具备了 人类 24 岁 的 成熟度。 探索 为什么 \"乘 7 规则\" 只是 段子。 那个 \"1 个 狗 年 等于 7 个 人 类 年\" 的 老 传说 只是 一种 过度 的 简化。 生物学 上 的 现实 要 有趣 得 多 : 宠物 在 生命 的 最初 两年 以 惊人的 速度 成熟, 极快 地 达到 性成熟 和 体成熟。 之后, 这种 衰老 曲线 会 趋于 平缓 并 放缓。',
91
87
  },
92
88
  {
93
89
  type: 'paragraph',
@@ -96,7 +92,7 @@ const seo: PetAgeLocaleContent['seo'] = [
96
92
  { type: 'title', text: '计算背后的科学原理', level: 3 },
97
93
  {
98
94
  type: 'paragraph',
99
- html: '此 工具 采用 <strong>美国 兽医 协会 (AAHA)</strong> 的 官方 指南 以及 关于 犬 类 DNA 甲基化 的 最新 研究 模型 , 旨在 为 您 提供 尽可能 准确 的 估算 。 DNA 甲基化 分析 被 称为 “表观 遗传 钟” , 通过 检测 遗传物质 上 的 化学 变化 来 揭示 生命体 内部 的 生物 年龄 。',
95
+ html: '此 工具 采用 <strong>美国 兽医 协会 (AAHA)</strong> 的 官方 指南 以及 关于 犬 类 DNA 甲基化 的 最新 研究 模型 , 旨在 为 您 提供 尽可能 准确 的 估算 。 DNA 甲基化 分析 被 称为 \"表观 遗传 钟\" , 通过 检测 遗传物质 上 的 化学 变化 来 揭示 生命体 内部 的 生物 年龄 。',
100
96
  },
101
97
  {
102
98
  type: 'paragraph',
@@ -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,16 +1,5 @@
1
1
  ---
2
- import {
3
- SEOTitle,
4
- SEOCard,
5
- SEOStats,
6
- SEOTip,
7
- SEOArticle,
8
- SEOTable,
9
- SEOProsCons,
10
- SEOSummary,
11
- SEOGlossary,
12
- SEODiagnostic,
13
- } from '@jjlmoya/utils-shared';
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
14
3
  import { petAge } from './index';
15
4
  import type { KnownLocale } from '../../types';
16
5
 
@@ -21,41 +10,6 @@ interface Props {
21
10
  const { locale = 'es' } = Astro.props;
22
11
  const content = await petAge.i18n[locale]?.();
23
12
  if (!content) return null;
24
-
25
- const { seo } = content;
26
13
  ---
27
14
 
28
- <SEOArticle>
29
- {seo.map((section: any) => {
30
- switch (section.type) {
31
- case 'summary':
32
- return <SEOSummary title={section.title} items={section.items} />;
33
- case 'title':
34
- return <SEOTitle title={section.text} level={section.level || 2} />;
35
- case 'paragraph':
36
- return <p set:html={section.html} />;
37
- case 'stats':
38
- return <SEOStats stats={section.items} columns={section.columns} />;
39
- case 'card':
40
- return <SEOCard title={section.title} icon={section.icon}><Fragment set:html={section.html} /></SEOCard>;
41
- case 'tip':
42
- return <SEOTip title={section.title}><Fragment set:html={section.html} /></SEOTip>;
43
- case 'table':
44
- return (
45
- <SEOTable headers={section.headers}>
46
- {section.rows.map((row: string[]) => (
47
- <tr>{row.map((cell: string) => <td set:html={cell} />)}</tr>
48
- ))}
49
- </SEOTable>
50
- );
51
- case 'proscons':
52
- return <SEOProsCons title={section.title} items={section.items} />;
53
- case 'diagnostic':
54
- return <SEODiagnostic title={section.title} icon={section.icon} type={section.variant} badge={section.badge}><Fragment set:html={section.html} /></SEODiagnostic>;
55
- case 'glossary':
56
- return <SEOGlossary items={section.items} />;
57
- default:
58
- return null;
59
- }
60
- })}
61
- </SEOArticle>
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -1,14 +1,6 @@
1
1
  ---
2
2
  import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
- import { petRation } 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 petRation.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: 'WSAVA: Nutrition Toolkit and Calorie Recommendations', url: 'https://wsava.org/global-guidelines/global-nutrition-guidelines/' },
5
+ { name: 'FEDIAF: Nutritional Guidelines for Complete and Complementary Pet Food', url: 'https://fediaf.org/self-regulation/nutrition.html' },
6
+ ];
@@ -50,7 +50,7 @@ const { ui } = Astro.props;
50
50
 
51
51
  <div class="input-item">
52
52
  <div class="label-row-v2">
53
- <label class="item-label">{ui.labelWeight}</label>
53
+ <label class="item-label" for="weightRange">{ui.labelWeight}</label>
54
54
  <div class="val-badge"><span id="weightDisplay">10</span> kg</div>
55
55
  </div>
56
56
  <input type="range" id="weightRange" min="1" max="85" step="0.5" value="10" class="range-v2" />
@@ -86,7 +86,7 @@ const { ui } = Astro.props;
86
86
  </div>
87
87
  <div class="custom-ratio-link" id="showManualSlider">{ui.manualAdjust}</div>
88
88
  <div class="manual-slider-box" id="manualSliderBox" style="display: none;">
89
- <input type="range" id="dietRatioRange" min="0" max="100" step="5" value="0" class="range-v2 ratio-slider" />
89
+ <input type="range" id="dietRatioRange" min="0" max="100" step="5" value="0" class="range-v2 ratio-slider" aria-label={ui.wetPercentLabel} />
90
90
  <div class="ratio-labels">
91
91
  <span>{ui.wetPercentLabel}</span>
92
92
  <strong id="ratioValDisplay">0%</strong>
@@ -61,3 +61,5 @@ export const petRation: PetToolEntry<PetRationUI> = {
61
61
  zh: () => import('./i18n/zh').then((m) => m.content),
62
62
  },
63
63
  };
64
+
65
+ 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 { PetRationUI, PetRationLocaleContent } from '../index';
3
4
 
@@ -65,11 +66,6 @@ const howTo: PetRationLocaleContent['howTo'] = [
65
66
  { name: 'Kalorien des Futters pro kg eingeben', text: 'Suchen Sie auf der Futterverpackung nach dem genauen kcal/kg-Wert, damit die endgültige Ration in Gramm so präzise wie möglich für eine optimale Gesundheit berechnet wird.' },
66
67
  ];
67
68
 
68
- const bibliography: PetRationLocaleContent['bibliography'] = [
69
- { name: 'WSAVA: Nutrition Toolkit und Kalorienempfehlungen', url: 'https://wsava.org/global-guidelines/global-nutrition-guidelines/' },
70
- { name: 'FEDIAF: Ernährungsrichtlinien für Alleinfuttermittel und Ergänzungsfuttermittel für Heimtiere', url: 'https://fediaf.org/self-regulation/nutrition.html' },
71
- ];
72
-
73
69
  const seo: PetRationLocaleContent['seo'] = [
74
70
  {
75
71
  type: 'summary',
@@ -172,8 +168,7 @@ const schemas: PetRationLocaleContent['schemas'] = [
172
168
  ];
173
169
 
174
170
  export const content: PetRationLocaleContent = {
175
- faqTitle: 'Häufig gestellte Fragen',
176
- bibliographyTitle: 'Bibliographie',
171
+
177
172
  slug,
178
173
  title,
179
174
  description,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetRationUI, PetRationLocaleContent } from '../index';
3
4
 
@@ -65,11 +66,6 @@ const howTo: PetRationLocaleContent['howTo'] = [
65
66
  { name: 'Enter the food calories per kg', text: 'Look on the pet food packaging for the exact kcal/kg value so the final ration in grams is as precise as possible for optimal health.' },
66
67
  ];
67
68
 
68
- const bibliography: PetRationLocaleContent['bibliography'] = [
69
- { name: 'WSAVA: Nutrition Toolkit and Calorie Recommendations', url: 'https://wsava.org/global-guidelines/global-nutrition-guidelines/' },
70
- { name: 'FEDIAF: Nutritional Guidelines for Complete and Complementary Pet Food', url: 'https://fediaf.org/self-regulation/nutrition.html' },
71
- ];
72
-
73
69
  const seo: PetRationLocaleContent['seo'] = [
74
70
  {
75
71
  type: 'summary',
@@ -172,8 +168,7 @@ const schemas: PetRationLocaleContent['schemas'] = [
172
168
  ];
173
169
 
174
170
  export const content: PetRationLocaleContent = {
175
- faqTitle: 'Frequently Asked Questions',
176
- bibliographyTitle: 'Bibliography',
171
+
177
172
  slug,
178
173
  title,
179
174
  description,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetRationUI, PetRationLocaleContent } from '../index';
3
4
 
@@ -65,11 +66,6 @@ const howTo: PetRationLocaleContent['howTo'] = [
65
66
  { name: 'Introduce las calorías del alimento por kg', text: 'Busca en el envase del alimento para mascotas el valor exacto de kcal/kg para que la ración final en gramos sea lo más precisa posible para una salud óptima.' },
66
67
  ];
67
68
 
68
- const bibliography: PetRationLocaleContent['bibliography'] = [
69
- { name: 'WSAVA: Kit de herramientas de nutrición y recomendaciones calóricas', url: 'https://wsava.org/global-guidelines/global-nutrition-guidelines/' },
70
- { name: 'FEDIAF: Guía nutricional para alimentos completos y complementarios para mascotas', url: 'https://fediaf.org/self-regulation/nutrition.html' },
71
- ];
72
-
73
69
  const seo: PetRationLocaleContent['seo'] = [
74
70
  {
75
71
  type: 'summary',
@@ -172,8 +168,7 @@ const schemas: PetRationLocaleContent['schemas'] = [
172
168
  ];
173
169
 
174
170
  export const content: PetRationLocaleContent = {
175
- faqTitle: 'Preguntas Frecuentes',
176
- bibliographyTitle: 'Bibliografía',
171
+
177
172
  slug,
178
173
  title,
179
174
  description,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetRationUI, PetRationLocaleContent } from '../index';
3
4
 
@@ -35,7 +36,7 @@ const ui: PetRationUI = {
35
36
  kcalUnit: 'kcal/jour',
36
37
  statusPuppy: 'Phase de croissance rapide',
37
38
  statusSenior: 'Métabolisme mature',
38
- statusLargeDog: 'Grande race : Soin articulaire',
39
+ statusLargeDog: 'Grande race: Soin articulaire',
39
40
  statusDefault: 'Poids équilibré',
40
41
  };
41
42
 
@@ -65,17 +66,12 @@ const howTo: PetRationLocaleContent['howTo'] = [
65
66
  { name: 'Entrez les calories de la nourriture par kg', text: 'Regardez sur l\'emballage de la nourriture pour animaux la valeur exacte en kcal/kg afin que le calcul de la ration finale en grammes soit aussi précis que possible pour une santé optimale.' },
66
67
  ];
67
68
 
68
- const bibliography: PetRationLocaleContent['bibliography'] = [
69
- { name: 'WSAVA : Boîte à outils nutritionnelle et recommandations caloriques', url: 'https://wsava.org/global-guidelines/global-nutrition-guidelines/' },
70
- { name: 'FEDIAF : Directives nutritionnelles pour les aliments complets et complémentaires pour animaux de compagnie', url: 'https://fediaf.org/self-regulation/nutrition.html' },
71
- ];
72
-
73
69
  const seo: PetRationLocaleContent['seo'] = [
74
70
  {
75
71
  type: 'summary',
76
72
  title: 'Principes Clés de la Nutrition Vétérinaire',
77
73
  items: [
78
- 'La formule RER est : 70 × (poids en kg)^0,75. C\'est la base scientifique de tout calcul calorique vétérinaire moderne.',
74
+ 'La formule RER est: 70 × (poids en kg)^0,75. C\'est la base scientifique de tout calcul calorique vétérinaire moderne.',
79
75
  'Le DER multiplie le RER par le facteur de mode de vie spécifique de l\'animal pour fournir un besoin quotidien.',
80
76
  'Un chien castré a besoin de jusqu\'à 20 pour cent de calories en moins qu\'un chien entier en raison des changements hormonaux.',
81
77
  'L\'obésité touche 50 pour cent des animaux de compagnie aujourd\'hui et réduit considérablement leur espérance et leur qualité de vida.',
@@ -86,16 +82,16 @@ const seo: PetRationLocaleContent['seo'] = [
86
82
  { type: 'title', text: 'Guide Complet pour Calculer la Ration Journalière de votre Animal pour une Santé Optimale', level: 2 },
87
83
  {
88
84
  type: 'paragraph',
89
- html: 'Nourrir correctement un chien ou un chat n\'est pas seulement une question de remplir son bol chaque matin. La nutrition est le pilier fondamental de sa santé, de sa longévité et de son bien-être émotionnel. Un <strong>calculateur de ration journalière pour animaux</strong> est un outil essentiel pour tout propriétaire responsable qui souhaite éviter les deux problèmes les plus courants de la nutrition vétérinaire actuelle : la malnutrition par manque de nutriments et, surtout, l\'obésité, qui touche plus de 50 % des animaux de compagnie dans les pays développés.',
85
+ html: 'Nourrir correctement un chien ou un chat n\'est pas seulement une question de remplir son bol chaque matin. La nutrition est le pilier fondamental de sa santé, de sa longévité et de son bien-être émotionnel. Un <strong>calculateur de ration journalière pour animaux</strong> est un outil essentiel pour tout propriétaire responsable qui souhaite éviter les deux problèmes les plus courants de la nutrition vétérinaire actuelle: la malnutrition par manque de nutriments et, surtout, l\'obésité, qui touche plus de 50 % des animaux de compagnie dans les pays développés.',
90
86
  },
91
87
  {
92
88
  type: 'paragraph',
93
89
  html: 'Dans ce guide, nous explorerons les fondements scientifiques des calculs caloriques, comment interpréter les étiquettes des aliments et comment des facteurs tels que l\'âge, le niveau d\'activité physique et le statut physiologique influencent la quantité de nourriture dont votre compagnon a besoin chaque jour. Nous vous aiderons à comprendre comment de petits ajustements dans la ration journalière peuvent faire une énorme différence dans la prévention du diabète, des problèmes articulaires et de la santé cardiaque de votre animal.',
94
90
  },
95
- { type: 'title', text: 'La Science derrière les Calculs : Comprendre le RER et le DER', level: 3 },
91
+ { type: 'title', text: 'La Science derrière les Calculs: Comprendre le RER et le DER', level: 3 },
96
92
  {
97
93
  type: 'paragraph',
98
- html: 'Pour déterminer exactement combien un animal doit manger chaque jour, les vétérinaires et les nutritionnistes utilisent deux concepts clés : le RER et le DER. Ces acronymes signifient respectivement Besoin Énergétique au Repos et Besoin Énergétique Quotidien. Comprendre comment ils interagissent est crucial pour gérer le poids et le bien-être de votre animal de manière sûre et contrôlée.',
94
+ html: 'Pour déterminer exactement combien un animal doit manger chaque jour, les vétérinaires et les nutritionnistes utilisent deux concepts clés: le RER et le DER. Ces acronymes signifient respectivement Besoin Énergétique au Repos et Besoin Énergétique Quotidien. Comprendre comment ils interagissent est crucial pour gérer le poids et le bien-être de votre animal de manière sûre et contrôlée.',
99
95
  },
100
96
  {
101
97
  type: 'paragraph',
@@ -104,7 +100,7 @@ const seo: PetRationLocaleContent['seo'] = [
104
100
  {
105
101
  type: 'stats',
106
102
  items: [
107
- { label: 'RER : Énergie au repos', value: '70 × kg^0,75' },
103
+ { label: 'RER: Énergie au repos', value: '70 × kg^0,75' },
108
104
  { label: 'Facteur chiot', value: 'de x2.5 à x3.5' },
109
105
  { label: 'Facteur adulte actif', value: 'de x1.6 à x2.0' },
110
106
  { label: 'Facteur senior', value: 'de x1.0 à x1.4' },
@@ -172,8 +168,7 @@ const schemas: PetRationLocaleContent['schemas'] = [
172
168
  ];
173
169
 
174
170
  export const content: PetRationLocaleContent = {
175
- faqTitle: 'Foire Aux Questions',
176
- bibliographyTitle: 'Bibliographie',
171
+
177
172
  slug,
178
173
  title,
179
174
  description,
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, SoftwareApplication } from 'schema-dts';
2
3
  import type { PetRationUI, PetRationLocaleContent } from '../index';
3
4
 
@@ -65,11 +66,6 @@ const howTo: PetRationLocaleContent['howTo'] = [
65
66
  { name: 'Masukkan kalori makanan per kg', text: 'Lihat pada kemasan makanan hewan untuk nilai kcal/kg yang tepat sehingga penghitungan ransum akhir dalam gram seakurat mungkin untuk kesehatan yang optimal.' },
66
67
  ];
67
68
 
68
- const bibliography: PetRationLocaleContent['bibliography'] = [
69
- { name: 'WSAVA: Toolkit Nutrisi dan Rekomendasi Kalori', url: 'https://wsava.org/global-guidelines/global-nutrition-guidelines/' },
70
- { name: 'FEDIAF: Pedoman Nutrisi untuk Makanan Hewan Peliharaan Lengkap dan Pelengkap', url: 'https://fediaf.org/self-regulation/nutrition.html' },
71
- ];
72
-
73
69
  const seo: PetRationLocaleContent['seo'] = [
74
70
  {
75
71
  type: 'summary',
@@ -172,8 +168,7 @@ const schemas: PetRationLocaleContent['schemas'] = [
172
168
  ];
173
169
 
174
170
  export const content: PetRationLocaleContent = {
175
- faqTitle: 'Pertanyaan yang Sering Diajukan',
176
- bibliographyTitle: 'Bibliografi',
171
+
177
172
  slug,
178
173
  title,
179
174
  description,