@jjlmoya/utils-tools 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 (222) hide show
  1. package/package.json +1 -1
  2. package/src/pages/[locale]/[slug].astro +30 -13
  3. package/src/tests/locale_completeness.test.ts +3 -20
  4. package/src/tests/shared-test-helpers.ts +56 -0
  5. package/src/tests/tool_exports.test.ts +34 -0
  6. package/src/tool/date-diff-calculator/bibliography.astro +2 -10
  7. package/src/tool/date-diff-calculator/bibliography.ts +7 -0
  8. package/src/tool/date-diff-calculator/i18n/de.ts +4 -7
  9. package/src/tool/date-diff-calculator/i18n/en.ts +4 -7
  10. package/src/tool/date-diff-calculator/i18n/es.ts +4 -7
  11. package/src/tool/date-diff-calculator/i18n/fr.ts +4 -7
  12. package/src/tool/date-diff-calculator/i18n/id.ts +4 -7
  13. package/src/tool/date-diff-calculator/i18n/it.ts +4 -7
  14. package/src/tool/date-diff-calculator/i18n/ja.ts +4 -7
  15. package/src/tool/date-diff-calculator/i18n/ko.ts +4 -7
  16. package/src/tool/date-diff-calculator/i18n/nl.ts +4 -7
  17. package/src/tool/date-diff-calculator/i18n/pl.ts +4 -7
  18. package/src/tool/date-diff-calculator/i18n/pt.ts +4 -7
  19. package/src/tool/date-diff-calculator/i18n/ru.ts +4 -7
  20. package/src/tool/date-diff-calculator/i18n/sv.ts +4 -7
  21. package/src/tool/date-diff-calculator/i18n/tr.ts +4 -7
  22. package/src/tool/date-diff-calculator/i18n/zh.ts +4 -7
  23. package/src/tool/date-diff-calculator/seo.astro +2 -1
  24. package/src/tool/drive-direct-link/bibliography.astro +2 -10
  25. package/src/tool/drive-direct-link/bibliography.ts +6 -0
  26. package/src/tool/drive-direct-link/i18n/de.ts +4 -6
  27. package/src/tool/drive-direct-link/i18n/en.ts +4 -6
  28. package/src/tool/drive-direct-link/i18n/es.ts +4 -6
  29. package/src/tool/drive-direct-link/i18n/fr.ts +4 -6
  30. package/src/tool/drive-direct-link/i18n/id.ts +4 -6
  31. package/src/tool/drive-direct-link/i18n/it.ts +4 -6
  32. package/src/tool/drive-direct-link/i18n/ja.ts +4 -6
  33. package/src/tool/drive-direct-link/i18n/ko.ts +4 -6
  34. package/src/tool/drive-direct-link/i18n/nl.ts +4 -6
  35. package/src/tool/drive-direct-link/i18n/pl.ts +4 -6
  36. package/src/tool/drive-direct-link/i18n/pt.ts +4 -6
  37. package/src/tool/drive-direct-link/i18n/ru.ts +4 -6
  38. package/src/tool/drive-direct-link/i18n/sv.ts +4 -6
  39. package/src/tool/drive-direct-link/i18n/tr.ts +4 -6
  40. package/src/tool/drive-direct-link/i18n/zh.ts +4 -6
  41. package/src/tool/drive-direct-link/seo.astro +2 -1
  42. package/src/tool/email-list-cleaner/bibliography.astro +2 -10
  43. package/src/tool/email-list-cleaner/bibliography.ts +7 -0
  44. package/src/tool/email-list-cleaner/i18n/de.ts +4 -7
  45. package/src/tool/email-list-cleaner/i18n/en.ts +4 -7
  46. package/src/tool/email-list-cleaner/i18n/es.ts +4 -7
  47. package/src/tool/email-list-cleaner/i18n/fr.ts +4 -7
  48. package/src/tool/email-list-cleaner/i18n/id.ts +4 -7
  49. package/src/tool/email-list-cleaner/i18n/it.ts +4 -7
  50. package/src/tool/email-list-cleaner/i18n/ja.ts +4 -7
  51. package/src/tool/email-list-cleaner/i18n/ko.ts +4 -7
  52. package/src/tool/email-list-cleaner/i18n/nl.ts +4 -7
  53. package/src/tool/email-list-cleaner/i18n/pl.ts +4 -7
  54. package/src/tool/email-list-cleaner/i18n/pt.ts +4 -7
  55. package/src/tool/email-list-cleaner/i18n/ru.ts +4 -7
  56. package/src/tool/email-list-cleaner/i18n/sv.ts +4 -7
  57. package/src/tool/email-list-cleaner/i18n/tr.ts +4 -7
  58. package/src/tool/email-list-cleaner/i18n/zh.ts +4 -7
  59. package/src/tool/email-list-cleaner/seo.astro +2 -1
  60. package/src/tool/env-badge-spain/bibliography.astro +2 -10
  61. package/src/tool/env-badge-spain/bibliography.ts +6 -0
  62. package/src/tool/env-badge-spain/i18n/de.ts +4 -6
  63. package/src/tool/env-badge-spain/i18n/en.ts +4 -6
  64. package/src/tool/env-badge-spain/i18n/es.ts +4 -6
  65. package/src/tool/env-badge-spain/i18n/fr.ts +4 -6
  66. package/src/tool/env-badge-spain/i18n/id.ts +4 -6
  67. package/src/tool/env-badge-spain/i18n/it.ts +4 -6
  68. package/src/tool/env-badge-spain/i18n/ja.ts +4 -6
  69. package/src/tool/env-badge-spain/i18n/ko.ts +4 -6
  70. package/src/tool/env-badge-spain/i18n/nl.ts +4 -6
  71. package/src/tool/env-badge-spain/i18n/pl.ts +4 -6
  72. package/src/tool/env-badge-spain/i18n/pt.ts +4 -6
  73. package/src/tool/env-badge-spain/i18n/ru.ts +4 -6
  74. package/src/tool/env-badge-spain/i18n/sv.ts +4 -6
  75. package/src/tool/env-badge-spain/i18n/tr.ts +4 -6
  76. package/src/tool/env-badge-spain/i18n/zh.ts +4 -6
  77. package/src/tool/env-badge-spain/seo.astro +2 -1
  78. package/src/tool/morse-beacon/bibliography.astro +2 -10
  79. package/src/tool/morse-beacon/bibliography.ts +7 -0
  80. package/src/tool/morse-beacon/i18n/de.ts +4 -7
  81. package/src/tool/morse-beacon/i18n/en.ts +4 -7
  82. package/src/tool/morse-beacon/i18n/es.ts +4 -7
  83. package/src/tool/morse-beacon/i18n/fr.ts +4 -7
  84. package/src/tool/morse-beacon/i18n/id.ts +4 -7
  85. package/src/tool/morse-beacon/i18n/it.ts +4 -7
  86. package/src/tool/morse-beacon/i18n/ja.ts +4 -7
  87. package/src/tool/morse-beacon/i18n/ko.ts +4 -7
  88. package/src/tool/morse-beacon/i18n/nl.ts +4 -7
  89. package/src/tool/morse-beacon/i18n/pl.ts +4 -7
  90. package/src/tool/morse-beacon/i18n/pt.ts +4 -7
  91. package/src/tool/morse-beacon/i18n/ru.ts +4 -7
  92. package/src/tool/morse-beacon/i18n/sv.ts +4 -7
  93. package/src/tool/morse-beacon/i18n/tr.ts +4 -7
  94. package/src/tool/morse-beacon/i18n/zh.ts +4 -7
  95. package/src/tool/morse-beacon/seo.astro +2 -1
  96. package/src/tool/password-generator/bibliography.astro +2 -10
  97. package/src/tool/password-generator/bibliography.ts +8 -0
  98. package/src/tool/password-generator/i18n/de.ts +4 -8
  99. package/src/tool/password-generator/i18n/en.ts +4 -8
  100. package/src/tool/password-generator/i18n/es.ts +4 -8
  101. package/src/tool/password-generator/i18n/fr.ts +4 -8
  102. package/src/tool/password-generator/i18n/id.ts +4 -8
  103. package/src/tool/password-generator/i18n/it.ts +4 -8
  104. package/src/tool/password-generator/i18n/ja.ts +4 -8
  105. package/src/tool/password-generator/i18n/ko.ts +4 -8
  106. package/src/tool/password-generator/i18n/nl.ts +4 -8
  107. package/src/tool/password-generator/i18n/pl.ts +4 -8
  108. package/src/tool/password-generator/i18n/pt.ts +4 -8
  109. package/src/tool/password-generator/i18n/ru.ts +4 -8
  110. package/src/tool/password-generator/i18n/sv.ts +4 -8
  111. package/src/tool/password-generator/i18n/tr.ts +4 -8
  112. package/src/tool/password-generator/i18n/zh.ts +4 -8
  113. package/src/tool/password-generator/seo.astro +2 -1
  114. package/src/tool/routes/bibliography.astro +2 -10
  115. package/src/tool/routes/bibliography.ts +9 -0
  116. package/src/tool/routes/i18n/de.ts +4 -9
  117. package/src/tool/routes/i18n/en.ts +4 -9
  118. package/src/tool/routes/i18n/es.ts +4 -9
  119. package/src/tool/routes/i18n/fr.ts +4 -9
  120. package/src/tool/routes/i18n/id.ts +4 -9
  121. package/src/tool/routes/i18n/it.ts +4 -9
  122. package/src/tool/routes/i18n/ja.ts +4 -9
  123. package/src/tool/routes/i18n/ko.ts +4 -9
  124. package/src/tool/routes/i18n/nl.ts +4 -9
  125. package/src/tool/routes/i18n/pl.ts +4 -9
  126. package/src/tool/routes/i18n/pt.ts +4 -9
  127. package/src/tool/routes/i18n/ru.ts +4 -9
  128. package/src/tool/routes/i18n/sv.ts +4 -9
  129. package/src/tool/routes/i18n/tr.ts +4 -9
  130. package/src/tool/routes/i18n/zh.ts +4 -9
  131. package/src/tool/routes/seo.astro +2 -1
  132. package/src/tool/rule-of-three/bibliography.astro +2 -10
  133. package/src/tool/rule-of-three/bibliography.ts +6 -0
  134. package/src/tool/rule-of-three/i18n/de.ts +4 -6
  135. package/src/tool/rule-of-three/i18n/en.ts +4 -6
  136. package/src/tool/rule-of-three/i18n/es.ts +4 -6
  137. package/src/tool/rule-of-three/i18n/fr.ts +4 -6
  138. package/src/tool/rule-of-three/i18n/id.ts +4 -6
  139. package/src/tool/rule-of-three/i18n/it.ts +4 -6
  140. package/src/tool/rule-of-three/i18n/ja.ts +4 -6
  141. package/src/tool/rule-of-three/i18n/ko.ts +4 -6
  142. package/src/tool/rule-of-three/i18n/nl.ts +4 -6
  143. package/src/tool/rule-of-three/i18n/pl.ts +4 -6
  144. package/src/tool/rule-of-three/i18n/pt.ts +4 -6
  145. package/src/tool/rule-of-three/i18n/ru.ts +4 -6
  146. package/src/tool/rule-of-three/i18n/sv.ts +4 -6
  147. package/src/tool/rule-of-three/i18n/tr.ts +4 -6
  148. package/src/tool/rule-of-three/i18n/zh.ts +4 -6
  149. package/src/tool/rule-of-three/seo.astro +2 -1
  150. package/src/tool/seo-content-optimizer/bibliography.astro +2 -10
  151. package/src/tool/seo-content-optimizer/bibliography.ts +6 -0
  152. package/src/tool/seo-content-optimizer/i18n/de.ts +4 -6
  153. package/src/tool/seo-content-optimizer/i18n/en.ts +4 -6
  154. package/src/tool/seo-content-optimizer/i18n/es.ts +4 -6
  155. package/src/tool/seo-content-optimizer/i18n/fr.ts +4 -6
  156. package/src/tool/seo-content-optimizer/i18n/id.ts +4 -6
  157. package/src/tool/seo-content-optimizer/i18n/it.ts +4 -6
  158. package/src/tool/seo-content-optimizer/i18n/ja.ts +4 -6
  159. package/src/tool/seo-content-optimizer/i18n/ko.ts +4 -6
  160. package/src/tool/seo-content-optimizer/i18n/nl.ts +4 -6
  161. package/src/tool/seo-content-optimizer/i18n/pl.ts +4 -6
  162. package/src/tool/seo-content-optimizer/i18n/pt.ts +4 -6
  163. package/src/tool/seo-content-optimizer/i18n/ru.ts +4 -6
  164. package/src/tool/seo-content-optimizer/i18n/sv.ts +4 -6
  165. package/src/tool/seo-content-optimizer/i18n/tr.ts +4 -6
  166. package/src/tool/seo-content-optimizer/i18n/zh.ts +4 -6
  167. package/src/tool/seo-content-optimizer/seo.astro +2 -1
  168. package/src/tool/speed-reader/bibliography.astro +2 -10
  169. package/src/tool/speed-reader/bibliography.ts +10 -0
  170. package/src/tool/speed-reader/i18n/de.ts +4 -10
  171. package/src/tool/speed-reader/i18n/en.ts +4 -10
  172. package/src/tool/speed-reader/i18n/es.ts +4 -10
  173. package/src/tool/speed-reader/i18n/fr.ts +4 -10
  174. package/src/tool/speed-reader/i18n/id.ts +4 -10
  175. package/src/tool/speed-reader/i18n/it.ts +4 -10
  176. package/src/tool/speed-reader/i18n/ja.ts +4 -10
  177. package/src/tool/speed-reader/i18n/ko.ts +4 -10
  178. package/src/tool/speed-reader/i18n/nl.ts +4 -10
  179. package/src/tool/speed-reader/i18n/pl.ts +4 -10
  180. package/src/tool/speed-reader/i18n/pt.ts +4 -10
  181. package/src/tool/speed-reader/i18n/ru.ts +4 -10
  182. package/src/tool/speed-reader/i18n/sv.ts +4 -10
  183. package/src/tool/speed-reader/i18n/tr.ts +4 -10
  184. package/src/tool/speed-reader/i18n/zh.ts +4 -10
  185. package/src/tool/speed-reader/seo.astro +2 -1
  186. package/src/tool/text-pixel-calculator/bibliography.astro +2 -10
  187. package/src/tool/text-pixel-calculator/bibliography.ts +6 -0
  188. package/src/tool/text-pixel-calculator/i18n/de.ts +4 -6
  189. package/src/tool/text-pixel-calculator/i18n/en.ts +4 -6
  190. package/src/tool/text-pixel-calculator/i18n/es.ts +4 -6
  191. package/src/tool/text-pixel-calculator/i18n/fr.ts +4 -6
  192. package/src/tool/text-pixel-calculator/i18n/id.ts +4 -6
  193. package/src/tool/text-pixel-calculator/i18n/it.ts +4 -6
  194. package/src/tool/text-pixel-calculator/i18n/ja.ts +4 -6
  195. package/src/tool/text-pixel-calculator/i18n/ko.ts +4 -6
  196. package/src/tool/text-pixel-calculator/i18n/nl.ts +4 -6
  197. package/src/tool/text-pixel-calculator/i18n/pl.ts +4 -6
  198. package/src/tool/text-pixel-calculator/i18n/pt.ts +4 -6
  199. package/src/tool/text-pixel-calculator/i18n/ru.ts +4 -6
  200. package/src/tool/text-pixel-calculator/i18n/sv.ts +4 -6
  201. package/src/tool/text-pixel-calculator/i18n/tr.ts +4 -6
  202. package/src/tool/text-pixel-calculator/i18n/zh.ts +4 -6
  203. package/src/tool/text-pixel-calculator/seo.astro +2 -1
  204. package/src/tool/whatsapp-link/bibliography.astro +2 -10
  205. package/src/tool/whatsapp-link/bibliography.ts +6 -0
  206. package/src/tool/whatsapp-link/i18n/de.ts +4 -6
  207. package/src/tool/whatsapp-link/i18n/en.ts +4 -6
  208. package/src/tool/whatsapp-link/i18n/es.ts +4 -6
  209. package/src/tool/whatsapp-link/i18n/fr.ts +4 -6
  210. package/src/tool/whatsapp-link/i18n/id.ts +4 -6
  211. package/src/tool/whatsapp-link/i18n/it.ts +4 -6
  212. package/src/tool/whatsapp-link/i18n/ja.ts +4 -6
  213. package/src/tool/whatsapp-link/i18n/ko.ts +4 -6
  214. package/src/tool/whatsapp-link/i18n/nl.ts +4 -6
  215. package/src/tool/whatsapp-link/i18n/pl.ts +4 -6
  216. package/src/tool/whatsapp-link/i18n/pt.ts +4 -6
  217. package/src/tool/whatsapp-link/i18n/ru.ts +4 -6
  218. package/src/tool/whatsapp-link/i18n/sv.ts +4 -6
  219. package/src/tool/whatsapp-link/i18n/tr.ts +4 -6
  220. package/src/tool/whatsapp-link/i18n/zh.ts +4 -6
  221. package/src/tool/whatsapp-link/seo.astro +2 -1
  222. package/src/types.ts +0 -2
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { PasswordGeneratorUI } from '../ui';
@@ -89,16 +90,11 @@ export const content: ToolLocaleContent<PasswordGeneratorUI> = {
89
90
  title: 'Gerador de Passwords Aleatórias Seguras',
90
91
  description: 'Crie passwords fortes e à prova de hackers instantaneamente. Ferramenta de cibersegurança gratuita para gerar chaves aleatórias e seguras.',
91
92
  ui,
92
- faqTitle: 'Perguntas Frequentes',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Referências',
96
- bibliography: [
97
- { name: 'Web Cryptography API — MDN Web Docs', url: 'https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API' },
98
- { name: 'NIST SP 800-63B: Digital Identity Guidelines', url: 'https://pages.nist.gov/800-63-3/sp800-63b.html' },
99
- { name: 'Password — Wikipédia', url: 'https://pt.wikipedia.org/wiki/Palavra-passe' },
100
- { name: 'Have I Been Pwned — Verifique se a sua password foi exposta', url: 'https://haveibeenpwned.com/Passwords' },
101
- ],
96
+
97
+ bibliography,
102
98
  schemas: [faqSchema, howToSchema, appSchema],
103
99
  seo: [
104
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { PasswordGeneratorUI } from '../ui';
@@ -89,16 +90,11 @@ export const content: ToolLocaleContent<PasswordGeneratorUI> = {
89
90
  title: 'Генератор надежных случайных паролей',
90
91
  description: 'Мгновенно создавайте надежные, устойчивые к взлому пароли. Бесплатный инструмент кибербезопасности для генерации случайных защищенных ключей.',
91
92
  ui,
92
- faqTitle: 'Часто задаваемые вопросы',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Источники',
96
- bibliography: [
97
- { name: 'Web Cryptography API — MDN Web Docs', url: 'https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API' },
98
- { name: 'NIST SP 800-63B: Digital Identity Guidelines', url: 'https://pages.nist.gov/800-63-3/sp800-63b.html' },
99
- { name: 'Пароль — Википедия', url: 'https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%BE%D0%BB%D1%8C' },
100
- { name: 'Have I Been Pwned — Проверьте, не был ли ваш пароль скомпрометирован', url: 'https://haveibeenpwned.com/Passwords' },
101
- ],
96
+
97
+ bibliography,
102
98
  schemas: [faqSchema, howToSchema, appSchema],
103
99
  seo: [
104
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { PasswordGeneratorUI } from '../ui';
@@ -89,16 +90,11 @@ export const content: ToolLocaleContent<PasswordGeneratorUI> = {
89
90
  title: 'Säker slumpmässig lösenordsgenerator',
90
91
  description: 'Skapa starka, hacksäkra lösenord omedelbart. Gratis cybersäkerhetsverktyg för att generera slumpmässiga, säkra nycklar.',
91
92
  ui,
92
- faqTitle: 'Vanliga frågor',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Referenser',
96
- bibliography: [
97
- { name: 'Web Cryptography API — MDN Web Docs', url: 'https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API' },
98
- { name: 'NIST SP 800-63B: Digital Identity Guidelines', url: 'https://pages.nist.gov/800-63-3/sp800-63b.html' },
99
- { name: 'Lösenord — Wikipedia', url: 'https://sv.wikipedia.org/wiki/L%C3%B6senord' },
100
- { name: 'Have I Been Pwned — Kontrollera om ditt lösenord har exponerats', url: 'https://haveibeenpwned.com/Passwords' },
101
- ],
96
+
97
+ bibliography,
102
98
  schemas: [faqSchema, howToSchema, appSchema],
103
99
  seo: [
104
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { PasswordGeneratorUI } from '../ui';
@@ -89,16 +90,11 @@ export const content: ToolLocaleContent<PasswordGeneratorUI> = {
89
90
  title: 'Güvenli Rastgele Şifre Oluşturucu',
90
91
  description: 'Anında güçlü, hackerlara karşı dayanıklı şifreler oluşturun. Rastgele, güvenli anahtarlar oluşturmak için ücretsiz siber güvenlik aracı.',
91
92
  ui,
92
- faqTitle: 'Sıkça Sorulan Sorular',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Kaynaklar',
96
- bibliography: [
97
- { name: 'Web Cryptography API — MDN Web Docs', url: 'https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API' },
98
- { name: 'NIST SP 800-63B: Digital Identity Guidelines', url: 'https://pages.nist.gov/800-63-3/sp800-63b.html' },
99
- { name: 'Şifre — Vikipedi', url: 'https://tr.wikipedia.org/wiki/Parola' },
100
- { name: 'Have I Been Pwned — Şifrenizin ifşa olup olmadığını kontrol edin', url: 'https://haveibeenpwned.com/Passwords' },
101
- ],
96
+
97
+ bibliography,
102
98
  schemas: [faqSchema, howToSchema, appSchema],
103
99
  seo: [
104
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { PasswordGeneratorUI } from '../ui';
@@ -89,16 +90,11 @@ export const content: ToolLocaleContent<PasswordGeneratorUI> = {
89
90
  title: '安全随机密码生成器',
90
91
  description: '立即创建强大、防黑客的密码。免费的网络安全工具,用于生成随机、安全的密钥。',
91
92
  ui,
92
- faqTitle: '常见问题',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: '参考文献',
96
- bibliography: [
97
- { name: 'Web Cryptography API — MDN Web Docs', url: 'https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API' },
98
- { name: 'NIST SP 800-63B: 数字身份指南', url: 'https://pages.nist.gov/800-63-3/sp800-63b.html' },
99
- { name: '密码 — 维基百科', url: 'https://zh.wikipedia.org/wiki/%E5%AF%86%E7%A0%81' },
100
- { name: 'Have I Been Pwned — 检查您的密码是否已泄露', url: 'https://haveibeenpwned.com/Passwords' },
101
- ],
96
+
97
+ bibliography,
102
98
  schemas: [faqSchema, howToSchema, appSchema],
103
99
  seo: [
104
100
  {
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await passwordGenerator.i18n[locale]?.();
12
+ if (!content) return null;
12
13
  ---
13
14
 
14
- {content && <SEORenderer content={{ locale, sections: content.seo }} />}
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 { routes } 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 routes.i18n[locale]?.();
3
+ import { bibliography } from './bibliography';
12
4
  ---
13
5
 
14
- {content && <SharedBibliography links={content.bibliography} />}
6
+ <SharedBibliography links={bibliography} />
@@ -0,0 +1,9 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ { name: 'Leaflet — Open-source interactive maps library', url: 'https://leafletjs.com/' },
5
+ { name: 'OpenStreetMap — Open cartographic data', url: 'https://www.openstreetmap.org/' },
6
+ { name: 'CARTO — Voyager map tiles', url: 'https://carto.com/basemaps/' },
7
+ { name: 'Nominatim — Reverse geocoding service (OpenStreetMap)', url: 'https://nominatim.org/' },
8
+ { name: 'OSRM — Open Source Routing Machine (route optimization)', url: 'http://project-osrm.org/' },
9
+ ];
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: 'Kostenloser optimaler Routenplaner',
90
91
  description: 'Optimieren Sie Ihre Liefer- oder Reiserouten kostenlos. Unser Tool ordnet Ihre Haltepunkte automatisch neu, um den kürzesten und effizientesten Weg zu finden.',
91
92
  ui,
92
- faqTitle: 'Häufig gestellte Fragen',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Technologien und Quellen',
96
- bibliography: [
97
- { name: 'Leaflet — Open-Source interaktive Kartenbibliothek', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — Offene kartografische Daten', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Voyager-Kartenkacheln', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — Reverse-Geocoding-Dienst (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Open Source Routing Machine (Routenoptimierung)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: 'Free Optimal Route Calculator',
90
91
  description: 'Optimize your delivery or travel routes for free. Our tool automatically reorders your stops to find the shortest and most efficient path.',
91
92
  ui,
92
- faqTitle: 'Frequently Asked Questions',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Technologies and Sources',
96
- bibliography: [
97
- { name: 'Leaflet — Open-source interactive maps library', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — Open cartographic data', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Voyager map tiles', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — Reverse geocoding service (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Open Source Routing Machine (route optimization)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: 'Calculadora de Rutas Óptimas Gratis',
90
91
  description: 'Optimiza tus rutas de reparto o viaje gratis. Nuestra herramienta reordena tus paradas automáticamente para encontrar el camino más corto y eficiente.',
91
92
  ui,
92
- faqTitle: 'Preguntas Frecuentes',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Tecnologías y Fuentes',
96
- bibliography: [
97
- { name: 'Leaflet — Librería de mapas interactivos de código abierto', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — Datos cartográficos abiertos', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Tiles de mapas Voyager', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — Servicio de geocodificación inversa (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Open Source Routing Machine (optimización de rutas)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: "Calculateur d'itinéraires optimaux gratuit",
90
91
  description: "Optimisez vos itinéraires de livraison ou de voyage gratuitement. Notre outil réorganise automatiquement vos arrêts pour trouver le chemin le plus court et le plus efficace.",
91
92
  ui,
92
- faqTitle: 'Questions fréquentes',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Technologies et sources',
96
- bibliography: [
97
- { name: 'Leaflet — Bibliothèque de cartes interactives open source', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — Données cartographiques ouvertes', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Tuiles de carte Voyager', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — Service de géocodage inverse (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: "OSRM — Open Source Routing Machine (optimisation d'itinéraires)", url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: 'Kalkulator Rute Optimal Gratis',
90
91
  description: 'Optimalkan rute pengiriman atau perjalanan Anda secara gratis. Alat kami mengurutkan ulang perhentian Anda secara otomatis untuk menemukan jalur terpendek dan paling efisien.',
91
92
  ui,
92
- faqTitle: 'Pertanyaan yang Sering Diajukan',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Teknologi dan Sumber',
96
- bibliography: [
97
- { name: 'Leaflet — Library peta interaktif sumber terbuka', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — Data kartografi terbuka', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Tile peta Voyager', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — Layanan geocoding balik (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Open Source Routing Machine (optimisasi rute)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: 'Calcolatore di Rotte Ottimali Gratuito',
90
91
  description: 'Ottimizza le tue rotte di consegna o di viaggio gratuitamente. Il nostro strumento riordina automaticamente le tue tappe per trovare il percorso più breve ed efficiente.',
91
92
  ui,
92
- faqTitle: 'Domande Frequenti',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Tecnologie e Fonti',
96
- bibliography: [
97
- { name: 'Leaflet — Libreria di mappe interattive open-source', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — Dati cartografici aperti', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Tile delle mappe Voyager', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — Servizio di geocodifica inversa (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Open Source Routing Machine (ottimizzazione rotte)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: '無料の最適ルート計算機',
90
91
  description: '配達や旅行のルートを無料で最適化します。当ツールは経由地を自動的に並べ替えて、最短かつ最も効率的な経路を見つけます。',
91
92
  ui,
92
- faqTitle: 'よくある質問',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: '技術と情報源',
96
- bibliography: [
97
- { name: 'Leaflet — オープンソースのインタラクティブ・マップ・ライブラリ', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — オープンな地図データ', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Voyager マップタイル', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — 逆ジオコーディングサービス(OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Open Source Routing Machine(ルート最適化)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: '무료 최적 경로 계산기',
90
91
  description: '배달 또는 여행 경로를 무료로 최적화하세요. 당사의 도구는 가장 짧고 효율적인 경로를 찾기 위해 정거장을 자동으로 재배치합니다.',
91
92
  ui,
92
- faqTitle: '자주 묻는 질문',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: '기술 및 출처',
96
- bibliography: [
97
- { name: 'Leaflet — 오픈 소스 대화형 지도 라이브러리', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — 공개 지도 데이터', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Voyager 지도 타일', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — 역 지오코딩 서비스 (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — 오픈 소스 라우팅 엔진 (경로 최적화)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: 'Gratis optimale routeplanner',
90
91
  description: 'Optimaliseer uw bezorg- of reisroutes gratis. Onze tool reorganiseert uw stops automatisch om de kortste en meest efficiënte route te vinden.',
91
92
  ui,
92
- faqTitle: 'Veelgestelde Vragen',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Technologieën en Bronnen',
96
- bibliography: [
97
- { name: 'Leaflet — Open-source interactieve kaartenbibliotheek', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — Open cartografische gegevens', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Voyager-kaarttegels', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — Omgekeerde geocoderingsdienst (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Open Source Routing Machine (route-optimalisatie)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: 'Darmowy Kalkulator Optymalnej Trasy',
90
91
  description: 'Optymalizuj swoje trasy dostaw lub podróży za darmo. Nasze narzędzie automatycznie porządkuje przystanki, aby znaleźć najkrótszą i najskuteczniejszą ścieżkę.',
91
92
  ui,
92
- faqTitle: 'Często zadawane pytania',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Technologie i Źródła',
96
- bibliography: [
97
- { name: 'Leaflet — otwarta biblioteka map interaktywnych', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — otwarte dane kartograficzne', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — kafelki mapy Voyager', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — usługa odwróconego geokodowania (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Open Source Routing Machine (optymalizacja tras)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: 'Calculadora de Rotas Ideais Gratuita',
90
91
  description: 'Otimize as suas rotas de entrega ou de viagem gratuitamente. A nossa ferramenta reordena automaticamente as suas paragens para encontrar o caminho mais curto e eficiente.',
91
92
  ui,
92
- faqTitle: 'Perguntas Frequentes',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Tecnologias e Fontes',
96
- bibliography: [
97
- { name: 'Leaflet — Biblioteca de mapas interativos de código aberto', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — Dados cartográficos abertos', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Mosaicos de mapas Voyager', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — Serviço de geocodificação reversa (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Open Source Routing Machine (otimização de rotas)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: 'Бесплатный калькулятор оптимального маршрута',
90
91
  description: 'Бесплатно оптимизируйте маршруты доставки или путешествий. Наш инструмент автоматически переставляет ваши остановки, чтобы найти кратчайший и самый эффективный путь.',
91
92
  ui,
92
- faqTitle: 'Часто задаваемые вопросы',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Технологии и источники',
96
- bibliography: [
97
- { name: 'Leaflet — открытая библиотека интерактивных карт', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — открытые картографические данные', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — тайлы карт Voyager', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — сервис обратного геокодирования (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Open Source Routing Machine (оптимизация маршрутов)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: 'Gratis optimal ruttberäknare',
90
91
  description: 'Optimera dina leverans- eller resrutter gratis. Vårt verktyg sorterar om dina stopp automatiskt för att hitta den kortaste och mest effektiva vägen.',
91
92
  ui,
92
- faqTitle: 'Vanliga frågor',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Tekniker och källor',
96
- bibliography: [
97
- { name: 'Leaflet — Interaktivt kartbibliotek med öppen källkod', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — Öppna kartografiska data', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Voyager-kartplattor', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — Omvänd geokodningstjänst (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Open Source Routing Machine (ruttoptimering)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: 'Ücretsiz En Uygun Rota Hesaplayıcı',
90
91
  description: 'Teslimat veya seyahat rotalarınızı ücretsiz olarak optimize edin. Aracımız, en kısa ve en verimli yolu bulmak için duraklarınızı otomatik olarak yeniden sıralar.',
91
92
  ui,
92
- faqTitle: 'Sıkça Sorulan Sorular',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: 'Teknolojiler ve Kaynaklar',
96
- bibliography: [
97
- { name: 'Leaflet — Açık kaynaklı etkileşimli harita kütüphanesi', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — Açık kartografik veriler', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Voyager harita kutucukları', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — Ters coğrafi kodlama servisi (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — Açık Kaynak Rota Makinesi (rota optimizasyonu)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RoutesUI } from '../ui';
@@ -89,17 +90,11 @@ export const content: ToolLocaleContent<RoutesUI> = {
89
90
  title: '免费最佳路线计算器',
90
91
  description: '免费优化您的送货或旅行路线。我们的工具会自动重新排列您的停靠点,以找到最短、最高效的路径。',
91
92
  ui,
92
- faqTitle: '常见问题',
93
+
93
94
  faq: faqData,
94
95
  howTo: howToData,
95
- bibliographyTitle: '技术与来源',
96
- bibliography: [
97
- { name: 'Leaflet — 开源交互式地图库', url: 'https://leafletjs.com/' },
98
- { name: 'OpenStreetMap — 开源地图数据', url: 'https://www.openstreetmap.org/' },
99
- { name: 'CARTO — Voyager 地图图块', url: 'https://carto.com/basemaps/' },
100
- { name: 'Nominatim — 逆地理编码服务 (OpenStreetMap)', url: 'https://nominatim.org/' },
101
- { name: 'OSRM — 开源路由引擎 (路线优化)', url: 'http://project-osrm.org/' },
102
- ],
96
+
97
+ bibliography,
103
98
  schemas: [faqSchema, howToSchema, appSchema],
104
99
  seo: [
105
100
  {
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await routes.i18n[locale]?.();
12
+ if (!content) return null;
12
13
  ---
13
14
 
14
- {content && <SEORenderer content={{ locale, sections: content.seo }} />}
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 { ruleOfThree } 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 ruleOfThree.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: 'Proportionality (mathematics) — Wikipedia', url: 'https://en.wikipedia.org/wiki/Proportionality_(mathematics)' },
5
+ { name: 'Ratios and proportions — Khan Academy', url: 'https://www.khanacademy.org/math/pre-algebra/pre-algebra-ratios-rates/pre-algebra-ratios-intro/a/ratio-review' },
6
+ ];
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { ToolLocaleContent } from '../../../types';
2
3
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
4
  import type { RuleOfThreeUI } from '../ui';
@@ -86,14 +87,11 @@ export const content: ToolLocaleContent<RuleOfThreeUI> = {
86
87
  title: 'Einfacher Dreisatz Rechner',
87
88
  description: 'Lösen Sie mathematische Proportionen sofort. Das ultimative Tool zur Berechnung von Mengen, Rezepten, Rabatten und Umrechnungen.',
88
89
  ui,
89
- faqTitle: 'Häufig gestellte Fragen',
90
+
90
91
  faq: faqData,
91
92
  howTo: howToData,
92
- bibliographyTitle: 'Referenzen',
93
- bibliography: [
94
- { name: 'Proportionalität (Mathematik) — Wikipedia', url: 'https://de.wikipedia.org/wiki/Proportionalit%C3%A4t' },
95
- { name: 'Verhältnisse und Proportionen — Khan Academy', url: 'https://de.khanacademy.org/math/pre-algebra/pre-algebra-ratios-rates' },
96
- ],
93
+
94
+ bibliography,
97
95
  schemas: [faqSchema, howToSchema, appSchema],
98
96
  seo: [
99
97
  {