@jjlmoya/utils-tools 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 (240) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/de.ts +3 -3
  3. package/src/category/i18n/en.ts +1 -1
  4. package/src/category/i18n/es.ts +1 -1
  5. package/src/category/i18n/fr.ts +16 -16
  6. package/src/category/i18n/id.ts +1 -1
  7. package/src/category/i18n/nl.ts +1 -1
  8. package/src/category/i18n/pl.ts +1 -1
  9. package/src/category/i18n/pt.ts +1 -1
  10. package/src/category/i18n/ru.ts +10 -10
  11. package/src/category/i18n/sv.ts +1 -1
  12. package/src/category/i18n/tr.ts +1 -1
  13. package/src/category/i18n/zh.ts +4 -4
  14. package/src/layouts/PreviewLayout.astro +7 -2
  15. package/src/pages/[locale]/[slug].astro +30 -13
  16. package/src/tests/diacritics_density.test.ts +118 -0
  17. package/src/tests/inverted_punctuation.test.ts +84 -0
  18. package/src/tests/locale_completeness.test.ts +3 -20
  19. package/src/tests/no_en_dash.test.ts +70 -0
  20. package/src/tests/script_density.test.ts +94 -0
  21. package/src/tests/shared-test-helpers.ts +56 -0
  22. package/src/tests/tool_exports.test.ts +34 -0
  23. package/src/tool/date-diff-calculator/bibliography.astro +2 -10
  24. package/src/tool/date-diff-calculator/bibliography.ts +7 -0
  25. package/src/tool/date-diff-calculator/i18n/de.ts +8 -11
  26. package/src/tool/date-diff-calculator/i18n/en.ts +4 -7
  27. package/src/tool/date-diff-calculator/i18n/es.ts +4 -7
  28. package/src/tool/date-diff-calculator/i18n/fr.ts +4 -7
  29. package/src/tool/date-diff-calculator/i18n/id.ts +4 -7
  30. package/src/tool/date-diff-calculator/i18n/it.ts +4 -7
  31. package/src/tool/date-diff-calculator/i18n/ja.ts +4 -7
  32. package/src/tool/date-diff-calculator/i18n/ko.ts +4 -7
  33. package/src/tool/date-diff-calculator/i18n/nl.ts +4 -7
  34. package/src/tool/date-diff-calculator/i18n/pl.ts +5 -8
  35. package/src/tool/date-diff-calculator/i18n/pt.ts +4 -7
  36. package/src/tool/date-diff-calculator/i18n/ru.ts +8 -11
  37. package/src/tool/date-diff-calculator/i18n/sv.ts +4 -7
  38. package/src/tool/date-diff-calculator/i18n/tr.ts +4 -7
  39. package/src/tool/date-diff-calculator/i18n/zh.ts +7 -10
  40. package/src/tool/date-diff-calculator/seo.astro +2 -1
  41. package/src/tool/drive-direct-link/bibliography.astro +2 -10
  42. package/src/tool/drive-direct-link/bibliography.ts +6 -0
  43. package/src/tool/drive-direct-link/i18n/de.ts +8 -10
  44. package/src/tool/drive-direct-link/i18n/en.ts +4 -6
  45. package/src/tool/drive-direct-link/i18n/es.ts +5 -7
  46. package/src/tool/drive-direct-link/i18n/fr.ts +5 -7
  47. package/src/tool/drive-direct-link/i18n/id.ts +4 -6
  48. package/src/tool/drive-direct-link/i18n/it.ts +4 -6
  49. package/src/tool/drive-direct-link/i18n/ja.ts +4 -6
  50. package/src/tool/drive-direct-link/i18n/ko.ts +4 -6
  51. package/src/tool/drive-direct-link/i18n/nl.ts +4 -6
  52. package/src/tool/drive-direct-link/i18n/pl.ts +8 -10
  53. package/src/tool/drive-direct-link/i18n/pt.ts +4 -6
  54. package/src/tool/drive-direct-link/i18n/ru.ts +12 -14
  55. package/src/tool/drive-direct-link/i18n/sv.ts +4 -6
  56. package/src/tool/drive-direct-link/i18n/tr.ts +4 -6
  57. package/src/tool/drive-direct-link/i18n/zh.ts +8 -10
  58. package/src/tool/drive-direct-link/seo.astro +2 -1
  59. package/src/tool/email-list-cleaner/bibliography.astro +2 -10
  60. package/src/tool/email-list-cleaner/bibliography.ts +7 -0
  61. package/src/tool/email-list-cleaner/i18n/de.ts +6 -9
  62. package/src/tool/email-list-cleaner/i18n/en.ts +4 -7
  63. package/src/tool/email-list-cleaner/i18n/es.ts +4 -7
  64. package/src/tool/email-list-cleaner/i18n/fr.ts +4 -7
  65. package/src/tool/email-list-cleaner/i18n/id.ts +4 -7
  66. package/src/tool/email-list-cleaner/i18n/it.ts +4 -7
  67. package/src/tool/email-list-cleaner/i18n/ja.ts +4 -7
  68. package/src/tool/email-list-cleaner/i18n/ko.ts +4 -7
  69. package/src/tool/email-list-cleaner/i18n/nl.ts +4 -7
  70. package/src/tool/email-list-cleaner/i18n/pl.ts +6 -9
  71. package/src/tool/email-list-cleaner/i18n/pt.ts +4 -7
  72. package/src/tool/email-list-cleaner/i18n/ru.ts +11 -14
  73. package/src/tool/email-list-cleaner/i18n/sv.ts +5 -8
  74. package/src/tool/email-list-cleaner/i18n/tr.ts +4 -7
  75. package/src/tool/email-list-cleaner/i18n/zh.ts +7 -10
  76. package/src/tool/email-list-cleaner/seo.astro +2 -1
  77. package/src/tool/env-badge-spain/bibliography.astro +2 -10
  78. package/src/tool/env-badge-spain/bibliography.ts +6 -0
  79. package/src/tool/env-badge-spain/i18n/de.ts +4 -6
  80. package/src/tool/env-badge-spain/i18n/en.ts +4 -6
  81. package/src/tool/env-badge-spain/i18n/es.ts +4 -6
  82. package/src/tool/env-badge-spain/i18n/fr.ts +4 -6
  83. package/src/tool/env-badge-spain/i18n/id.ts +4 -6
  84. package/src/tool/env-badge-spain/i18n/it.ts +4 -6
  85. package/src/tool/env-badge-spain/i18n/ja.ts +4 -6
  86. package/src/tool/env-badge-spain/i18n/ko.ts +4 -6
  87. package/src/tool/env-badge-spain/i18n/nl.ts +4 -6
  88. package/src/tool/env-badge-spain/i18n/pl.ts +4 -6
  89. package/src/tool/env-badge-spain/i18n/pt.ts +4 -6
  90. package/src/tool/env-badge-spain/i18n/ru.ts +14 -16
  91. package/src/tool/env-badge-spain/i18n/sv.ts +4 -6
  92. package/src/tool/env-badge-spain/i18n/tr.ts +4 -6
  93. package/src/tool/env-badge-spain/i18n/zh.ts +4 -6
  94. package/src/tool/env-badge-spain/seo.astro +2 -1
  95. package/src/tool/morse-beacon/bibliography.astro +2 -10
  96. package/src/tool/morse-beacon/bibliography.ts +7 -0
  97. package/src/tool/morse-beacon/i18n/de.ts +8 -11
  98. package/src/tool/morse-beacon/i18n/en.ts +6 -9
  99. package/src/tool/morse-beacon/i18n/es.ts +6 -9
  100. package/src/tool/morse-beacon/i18n/fr.ts +9 -12
  101. package/src/tool/morse-beacon/i18n/id.ts +6 -9
  102. package/src/tool/morse-beacon/i18n/it.ts +6 -9
  103. package/src/tool/morse-beacon/i18n/ja.ts +6 -9
  104. package/src/tool/morse-beacon/i18n/ko.ts +6 -9
  105. package/src/tool/morse-beacon/i18n/nl.ts +6 -9
  106. package/src/tool/morse-beacon/i18n/pl.ts +7 -10
  107. package/src/tool/morse-beacon/i18n/pt.ts +6 -9
  108. package/src/tool/morse-beacon/i18n/ru.ts +7 -10
  109. package/src/tool/morse-beacon/i18n/sv.ts +6 -9
  110. package/src/tool/morse-beacon/i18n/tr.ts +6 -9
  111. package/src/tool/morse-beacon/i18n/zh.ts +7 -10
  112. package/src/tool/morse-beacon/seo.astro +2 -1
  113. package/src/tool/password-generator/bibliography.astro +2 -10
  114. package/src/tool/password-generator/bibliography.ts +8 -0
  115. package/src/tool/password-generator/i18n/de.ts +9 -13
  116. package/src/tool/password-generator/i18n/en.ts +4 -8
  117. package/src/tool/password-generator/i18n/es.ts +4 -8
  118. package/src/tool/password-generator/i18n/fr.ts +5 -9
  119. package/src/tool/password-generator/i18n/id.ts +4 -8
  120. package/src/tool/password-generator/i18n/it.ts +4 -8
  121. package/src/tool/password-generator/i18n/ja.ts +4 -8
  122. package/src/tool/password-generator/i18n/ko.ts +4 -8
  123. package/src/tool/password-generator/i18n/nl.ts +4 -8
  124. package/src/tool/password-generator/i18n/pl.ts +7 -11
  125. package/src/tool/password-generator/i18n/pt.ts +4 -8
  126. package/src/tool/password-generator/i18n/ru.ts +8 -12
  127. package/src/tool/password-generator/i18n/sv.ts +4 -8
  128. package/src/tool/password-generator/i18n/tr.ts +4 -8
  129. package/src/tool/password-generator/i18n/zh.ts +7 -11
  130. package/src/tool/password-generator/seo.astro +2 -1
  131. package/src/tool/routes/bibliography.astro +2 -10
  132. package/src/tool/routes/bibliography.ts +9 -0
  133. package/src/tool/routes/i18n/de.ts +5 -10
  134. package/src/tool/routes/i18n/en.ts +4 -9
  135. package/src/tool/routes/i18n/es.ts +4 -9
  136. package/src/tool/routes/i18n/fr.ts +7 -12
  137. package/src/tool/routes/i18n/id.ts +4 -9
  138. package/src/tool/routes/i18n/it.ts +4 -9
  139. package/src/tool/routes/i18n/ja.ts +4 -9
  140. package/src/tool/routes/i18n/ko.ts +4 -9
  141. package/src/tool/routes/i18n/nl.ts +4 -9
  142. package/src/tool/routes/i18n/pl.ts +4 -9
  143. package/src/tool/routes/i18n/pt.ts +4 -9
  144. package/src/tool/routes/i18n/ru.ts +7 -12
  145. package/src/tool/routes/i18n/sv.ts +4 -9
  146. package/src/tool/routes/i18n/tr.ts +4 -9
  147. package/src/tool/routes/i18n/zh.ts +5 -10
  148. package/src/tool/routes/seo.astro +2 -1
  149. package/src/tool/rule-of-three/bibliography.astro +2 -10
  150. package/src/tool/rule-of-three/bibliography.ts +6 -0
  151. package/src/tool/rule-of-three/i18n/de.ts +6 -8
  152. package/src/tool/rule-of-three/i18n/en.ts +4 -6
  153. package/src/tool/rule-of-three/i18n/es.ts +4 -6
  154. package/src/tool/rule-of-three/i18n/fr.ts +11 -13
  155. package/src/tool/rule-of-three/i18n/id.ts +4 -6
  156. package/src/tool/rule-of-three/i18n/it.ts +4 -6
  157. package/src/tool/rule-of-three/i18n/ja.ts +4 -6
  158. package/src/tool/rule-of-three/i18n/ko.ts +4 -6
  159. package/src/tool/rule-of-three/i18n/nl.ts +6 -8
  160. package/src/tool/rule-of-three/i18n/pl.ts +6 -8
  161. package/src/tool/rule-of-three/i18n/pt.ts +4 -6
  162. package/src/tool/rule-of-three/i18n/ru.ts +7 -9
  163. package/src/tool/rule-of-three/i18n/sv.ts +4 -6
  164. package/src/tool/rule-of-three/i18n/tr.ts +5 -7
  165. package/src/tool/rule-of-three/i18n/zh.ts +6 -8
  166. package/src/tool/rule-of-three/seo.astro +2 -1
  167. package/src/tool/seo-content-optimizer/bibliography.astro +2 -10
  168. package/src/tool/seo-content-optimizer/bibliography.ts +6 -0
  169. package/src/tool/seo-content-optimizer/i18n/de.ts +4 -6
  170. package/src/tool/seo-content-optimizer/i18n/en.ts +4 -6
  171. package/src/tool/seo-content-optimizer/i18n/es.ts +4 -6
  172. package/src/tool/seo-content-optimizer/i18n/fr.ts +7 -9
  173. package/src/tool/seo-content-optimizer/i18n/id.ts +4 -6
  174. package/src/tool/seo-content-optimizer/i18n/it.ts +4 -6
  175. package/src/tool/seo-content-optimizer/i18n/ja.ts +4 -6
  176. package/src/tool/seo-content-optimizer/i18n/ko.ts +4 -6
  177. package/src/tool/seo-content-optimizer/i18n/nl.ts +4 -6
  178. package/src/tool/seo-content-optimizer/i18n/pl.ts +4 -6
  179. package/src/tool/seo-content-optimizer/i18n/pt.ts +4 -6
  180. package/src/tool/seo-content-optimizer/i18n/ru.ts +5 -7
  181. package/src/tool/seo-content-optimizer/i18n/sv.ts +4 -6
  182. package/src/tool/seo-content-optimizer/i18n/tr.ts +4 -6
  183. package/src/tool/seo-content-optimizer/i18n/zh.ts +4 -6
  184. package/src/tool/seo-content-optimizer/seo.astro +2 -1
  185. package/src/tool/speed-reader/bibliography.astro +2 -10
  186. package/src/tool/speed-reader/bibliography.ts +10 -0
  187. package/src/tool/speed-reader/i18n/de.ts +7 -13
  188. package/src/tool/speed-reader/i18n/en.ts +6 -12
  189. package/src/tool/speed-reader/i18n/es.ts +4 -10
  190. package/src/tool/speed-reader/i18n/fr.ts +13 -19
  191. package/src/tool/speed-reader/i18n/id.ts +6 -12
  192. package/src/tool/speed-reader/i18n/it.ts +6 -12
  193. package/src/tool/speed-reader/i18n/ja.ts +4 -10
  194. package/src/tool/speed-reader/i18n/ko.ts +4 -10
  195. package/src/tool/speed-reader/i18n/nl.ts +6 -12
  196. package/src/tool/speed-reader/i18n/pl.ts +7 -13
  197. package/src/tool/speed-reader/i18n/pt.ts +6 -12
  198. package/src/tool/speed-reader/i18n/ru.ts +14 -20
  199. package/src/tool/speed-reader/i18n/sv.ts +6 -12
  200. package/src/tool/speed-reader/i18n/tr.ts +4 -10
  201. package/src/tool/speed-reader/i18n/zh.ts +8 -14
  202. package/src/tool/speed-reader/seo.astro +2 -1
  203. package/src/tool/text-pixel-calculator/bibliography.astro +2 -10
  204. package/src/tool/text-pixel-calculator/bibliography.ts +6 -0
  205. package/src/tool/text-pixel-calculator/i18n/de.ts +6 -8
  206. package/src/tool/text-pixel-calculator/i18n/en.ts +4 -6
  207. package/src/tool/text-pixel-calculator/i18n/es.ts +4 -6
  208. package/src/tool/text-pixel-calculator/i18n/fr.ts +5 -7
  209. package/src/tool/text-pixel-calculator/i18n/id.ts +4 -6
  210. package/src/tool/text-pixel-calculator/i18n/it.ts +4 -6
  211. package/src/tool/text-pixel-calculator/i18n/ja.ts +4 -6
  212. package/src/tool/text-pixel-calculator/i18n/ko.ts +4 -6
  213. package/src/tool/text-pixel-calculator/i18n/nl.ts +4 -6
  214. package/src/tool/text-pixel-calculator/i18n/pl.ts +7 -9
  215. package/src/tool/text-pixel-calculator/i18n/pt.ts +4 -6
  216. package/src/tool/text-pixel-calculator/i18n/ru.ts +8 -10
  217. package/src/tool/text-pixel-calculator/i18n/sv.ts +4 -6
  218. package/src/tool/text-pixel-calculator/i18n/tr.ts +4 -6
  219. package/src/tool/text-pixel-calculator/i18n/zh.ts +7 -9
  220. package/src/tool/text-pixel-calculator/seo.astro +2 -1
  221. package/src/tool/whatsapp-link/bibliography.astro +2 -10
  222. package/src/tool/whatsapp-link/bibliography.ts +6 -0
  223. package/src/tool/whatsapp-link/i18n/de.ts +8 -10
  224. package/src/tool/whatsapp-link/i18n/en.ts +4 -6
  225. package/src/tool/whatsapp-link/i18n/es.ts +6 -8
  226. package/src/tool/whatsapp-link/i18n/fr.ts +6 -8
  227. package/src/tool/whatsapp-link/i18n/id.ts +4 -6
  228. package/src/tool/whatsapp-link/i18n/it.ts +4 -6
  229. package/src/tool/whatsapp-link/i18n/ja.ts +4 -6
  230. package/src/tool/whatsapp-link/i18n/ko.ts +4 -6
  231. package/src/tool/whatsapp-link/i18n/nl.ts +4 -6
  232. package/src/tool/whatsapp-link/i18n/pl.ts +8 -10
  233. package/src/tool/whatsapp-link/i18n/pt.ts +4 -6
  234. package/src/tool/whatsapp-link/i18n/ru.ts +9 -11
  235. package/src/tool/whatsapp-link/i18n/sv.ts +4 -6
  236. package/src/tool/whatsapp-link/i18n/tr.ts +4 -6
  237. package/src/tool/whatsapp-link/i18n/zh.ts +8 -10
  238. package/src/tool/whatsapp-link/seo.astro +2 -1
  239. package/src/tool/whatsapp-link/whatsapp-link-generator.css +41 -4
  240. 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 { WhatsappLinkUI } from '../ui';
@@ -76,14 +77,11 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
76
77
  title: 'QRコード付きWhatsAppリンク作成ツール',
77
78
  description: '定型メッセージとQRコード付きのWhatsApp直通チャットリンクを作成します。無料ツール、登録不要、100%プライベート。',
78
79
  ui,
79
- faqTitle: 'よくある質問',
80
+
80
81
  faq: faqData,
81
82
  howTo: howToData,
82
- bibliographyTitle: '参考文献',
83
- bibliography: [
84
- { name: '「クリックしてチャット」機能の使い方 — WhatsAppヘルプセンター', url: 'https://faq.whatsapp.com/591339899867293' },
85
- { name: 'API クリックしてチャット:パラメータと形式 — WhatsApp', url: 'https://faq.whatsapp.com/425559092497645' },
86
- ],
83
+
84
+ bibliography,
87
85
  schemas: [faqSchema, howToSchema, appSchema],
88
86
  seo: [
89
87
  { type: 'title', level: 2, text: 'WhatsApp用の短い直通リンクを生成' },
@@ -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 { WhatsappLinkUI } from '../ui';
@@ -76,14 +77,11 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
76
77
  title: 'QR 포함 WhatsApp 링크 생성기',
77
78
  description: '미리 채워진 메시지와 QR 코드가 포함된 WhatsApp 직통 채팅 링크를 만드세요. 무료 도구, 가입 불필요, 100% 개인 정보 보호.',
78
79
  ui,
79
- faqTitle: '자주 묻는 질문',
80
+
80
81
  faq: faqData,
81
82
  howTo: howToData,
82
- bibliographyTitle: '참고 문헌',
83
- bibliography: [
84
- { name: '클릭해서 채팅하기 기능 사용 방법 — WhatsApp 고객 센터', url: 'https://faq.whatsapp.com/591339899867293' },
85
- { name: 'API 클릭해서 채팅하기: 파라미터 및 형식 — WhatsApp', url: 'https://faq.whatsapp.com/425559092497645' },
86
- ],
83
+
84
+ bibliography,
87
85
  schemas: [faqSchema, howToSchema, appSchema],
88
86
  seo: [
89
87
  { type: 'title', level: 2, text: 'WhatsApp용 짧은 직통 링크 생성' },
@@ -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 { WhatsappLinkUI } from '../ui';
@@ -76,14 +77,11 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
76
77
  title: 'WhatsApp Link Generator met QR',
77
78
  description: 'Maak directe WhatsApp-chatlinks met vooraf ingevuld bericht en QR-code. Gratis tool, geen registratie, 100% privé.',
78
79
  ui,
79
- faqTitle: 'Veelgestelde Vragen',
80
+
80
81
  faq: faqData,
81
82
  howTo: howToData,
82
- bibliographyTitle: 'Referenties',
83
- bibliography: [
84
- { name: 'De functie "Klik om te chatten" gebruiken — WhatsApp Helpcentrum', url: 'https://faq.whatsapp.com/591339899867293' },
85
- { name: 'API Klik om te chatten: parameters en formaten — WhatsApp', url: 'https://faq.whatsapp.com/425559092497645' },
86
- ],
83
+
84
+ bibliography,
87
85
  schemas: [faqSchema, howToSchema, appSchema],
88
86
  seo: [
89
87
  { type: 'title', level: 2, text: 'Genereer korte directe links voor WhatsApp' },
@@ -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 { WhatsappLinkUI } from '../ui';
@@ -13,7 +14,7 @@ const faqData = [
13
14
  },
14
15
  {
15
16
  question: 'Jak korzystać z wygenerowanego kodu QR?',
16
- answer: 'Po wygenerowaniu prawidłowego linku pojawi się przycisk Pokaż QR”. Kod QR zawiera adres URL Twojego linku. Kliknij go prawym przyciskiem myszy i wybierz Zapisz obraz jako”, aby pobrać czysty plik o wysokiej rozdzielczości do wizytówek, plakatów lub mediów społecznościowych.',
17
+ answer: 'Po wygenerowaniu prawidłowego linku pojawi się przycisk "Pokaż QR". Kod QR zawiera adres URL Twojego linku. Kliknij go prawym przyciskiem myszy i wybierz "Zapisz obraz jako", aby pobrać czysty plik o wysokiej rozdzielczości do wizytówek, plakatów lub mediów społecznościowych.',
17
18
  },
18
19
  {
19
20
  question: 'Gdzie trafiają moje dane?',
@@ -76,14 +77,11 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
76
77
  title: 'Generator Linków WhatsApp z QR',
77
78
  description: 'Twórz bezpośrednie linki do czatu WhatsApp ze wstępnie wypełnioną wiadomością i kodem QR. Darmowe narzędzie, bez rejestracji, w 100% prywatne.',
78
79
  ui,
79
- faqTitle: 'Często zadawane pytania',
80
+
80
81
  faq: faqData,
81
82
  howTo: howToData,
82
- bibliographyTitle: 'Źródła',
83
- bibliography: [
84
- { name: 'Jak korzystać z funkcji kliknij i rozmawiaj — Centrum pomocy WhatsApp', url: 'https://faq.whatsapp.com/591339899867293' },
85
- { name: 'API Click to chat: parametry i formaty — WhatsApp', url: 'https://faq.whatsapp.com/425559092497645' },
86
- ],
83
+
84
+ bibliography,
87
85
  schemas: [faqSchema, howToSchema, appSchema],
88
86
  seo: [
89
87
  { type: 'title', level: 2, text: 'Generuj krótkie linki bezpośrednie do WhatsApp' },
@@ -94,13 +92,13 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
94
92
  { type: 'title', level: 3, text: 'Do czego służy skracacz WhatsApp wa.me?' },
95
93
  {
96
94
  type: 'paragraph',
97
- html: 'WhatsApp oferuje interfejs API o nazwie Kliknij i rozmawiaj”. Za pomocą specjalnego adresu URL każdy użytkownik może otworzyć z Tobą nowy czat bez konieczności dodawania Cię najpierw do kontaktów, zarówno z telefonu komórkowego, jak i przez WhatsApp Web.',
95
+ html: 'WhatsApp oferuje interfejs API o nazwie "Kliknij i rozmawiaj". Za pomocą specjalnego adresu URL każdy użytkownik może otworzyć z Tobą nowy czat bez konieczności dodawania Cię najpierw do kontaktów, zarówno z telefonu komórkowego, jak i przez WhatsApp Web.',
98
96
  },
99
97
  {
100
98
  type: 'list',
101
99
  items: [
102
- '<strong>Większa konwersja:</strong> Przycisk Kontakt przez WhatsApp w Twoim sklepie zmniejsza opory i zwiększa sprzedaż.',
103
- '<strong>Wstępnie wypełniona wiadomość:</strong> Użytkownik po prostu naciska Wyślij”. Przykład: Cześć! Piszę z Instagrama i chcę skorzystać z oferty”.',
100
+ '<strong>Większa konwersja:</strong> Przycisk "Kontakt przez WhatsApp" w Twoim sklepie zmniejsza opory i zwiększa sprzedaż.',
101
+ '<strong>Wstępnie wypełniona wiadomość:</strong> Użytkownik po prostu naciska "Wyślij". Przykład: "Cześć! Piszę z Instagrama i chcę skorzystać z oferty".',
104
102
  '<strong>Automatyczny kod QR:</strong> Pobierz kod QR do wizytówek, plakatów lub postów w mediach społecznościowych.',
105
103
  ],
106
104
  },
@@ -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 { WhatsappLinkUI } from '../ui';
@@ -76,14 +77,11 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
76
77
  title: 'Gerador de Links do WhatsApp com QR',
77
78
  description: 'Crie links diretos de conversa do WhatsApp com mensagem pré-preenchida e código QR. Ferramenta gratuita, sem registo, 100% privada.',
78
79
  ui,
79
- faqTitle: 'Perguntas Frequentes',
80
+
80
81
  faq: faqData,
81
82
  howTo: howToData,
82
- bibliographyTitle: 'Referências',
83
- bibliography: [
84
- { name: 'Como utilizar o recurso "conversa em um clique" — Centro de Ajuda do WhatsApp', url: 'https://faq.whatsapp.com/591339899867293' },
85
- { name: 'API de conversa em um clique: parâmetros e formatos — WhatsApp', url: 'https://faq.whatsapp.com/425559092497645' },
86
- ],
83
+
84
+ bibliography,
87
85
  schemas: [faqSchema, howToSchema, appSchema],
88
86
  seo: [
89
87
  { type: 'title', level: 2, text: 'Gere links diretos curtos para o WhatsApp' },
@@ -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 { WhatsappLinkUI } from '../ui';
@@ -13,7 +14,7 @@ const faqData = [
13
14
  },
14
15
  {
15
16
  question: 'Как использовать сгенерированный QR-код?',
16
- answer: 'Как только будет создана действительная ссылка, появится кнопка «Показать QR». QR-код содержит URL-адрес вашей ссылки. Нажмите на него правой кнопкой мыши и выберите «Сохранить изображение как», чтобы загрузить чистый файл в высоком разрешении для визиток, плакатов или социальных сетей.',
17
+ answer: 'Как только будет создана действительная ссылка, появится кнопка "Показать QR". QR-код содержит URL-адрес вашей ссылки. Нажмите на него правой кнопкой мыши и выберите "Сохранить изображение как", чтобы загрузить чистый файл в высоком разрешении для визиток, плакатов или социальных сетей.',
17
18
  },
18
19
  {
19
20
  question: 'Куда попадают мои данные?',
@@ -23,7 +24,7 @@ const faqData = [
23
24
 
24
25
  const howToData = [
25
26
  { name: 'Выберите префикс', text: 'Выберите код своей страны из выпадающего списка и введите свой номер телефона без префикса.' },
26
- { name: 'Добавьте необязательное сообщение', text: 'Напишите предзаполненный текст, который появится, когда кто-то откроет ссылку и нажмет «Отправить».' },
27
+ { name: 'Добавьте необязательное сообщение', text: 'Напишите предзаполненный текст, который появится, когда кто-то откроет ссылку и нажмет "Отправить".' },
27
28
  { name: 'Создайте ссылку', text: 'Нажмите зеленую кнопку, чтобы получить прямую ссылку wa.me, готовую к отправке.' },
28
29
  { name: 'Поделитесь или распечатайте QR', text: 'Скопируйте ссылку, проверьте чат или скачайте QR-код для визиток и печати.' },
29
30
  ];
@@ -76,14 +77,11 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
76
77
  title: 'Генератор ссылок WhatsApp с QR',
77
78
  description: 'Создавайте прямые ссылки для чата WhatsApp с предзаполненным сообщением и QR-кодом. Бесплатный инструмент, без регистрации, 100% конфиденциально.',
78
79
  ui,
79
- faqTitle: 'Часто задаваемые вопросы',
80
+
80
81
  faq: faqData,
81
82
  howTo: howToData,
82
- bibliographyTitle: 'Источники',
83
- bibliography: [
84
- { name: 'Как использовать функцию «Прямая связь» — Справочный центр WhatsApp', url: 'https://faq.whatsapp.com/591339899867293' },
85
- { name: 'API «Прямая связь»: параметры и форматы — WhatsApp', url: 'https://faq.whatsapp.com/425559092497645' },
86
- ],
83
+
84
+ bibliography,
87
85
  schemas: [faqSchema, howToSchema, appSchema],
88
86
  seo: [
89
87
  { type: 'title', level: 2, text: 'Создавайте короткие прямые ссылки для WhatsApp' },
@@ -94,13 +92,13 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
94
92
  { type: 'title', level: 3, text: 'Для чего нужен сокращатель WhatsApp wa.me?' },
95
93
  {
96
94
  type: 'paragraph',
97
- html: 'WhatsApp предлагает API под названием «Прямая связь». Используя специальный URL-адрес, любой пользователь может начать с вами новый чат, не добавляя вас в контакты, как с мобильного телефона, так и через WhatsApp Web.',
95
+ html: 'WhatsApp предлагает API под названием "Прямая связь". Используя специальный URL-адрес, любой пользователь может начать с вами новый чат, не добавляя вас в контакты, как с мобильного телефона, так и через WhatsApp Web.',
98
96
  },
99
97
  {
100
98
  type: 'list',
101
99
  items: [
102
- '<strong>Больше конверсий:</strong> кнопка «Связаться через WhatsApp» в вашем магазине снижает барьеры и увеличивает продажи.',
103
- '<strong>Предзаполненное сообщение:</strong> пользователю достаточно нажать «Отправить». Пример: «Здравствуйте! Я с Instagram и хочу воспользоваться предложением».',
100
+ '<strong>Больше конверсий:</strong> кнопка "Связаться через WhatsApp" в вашем магазине снижает барьеры и увеличивает продажи.',
101
+ '<strong>Предзаполненное сообщение:</strong> пользователю достаточно нажать "Отправить". Пример: "Здравствуйте! Я с Instagram и хочу воспользоваться предложением".',
104
102
  '<strong>Автоматический QR-код:</strong> скачайте QR-код для визиток, плакатов или постов в социальных сетях.',
105
103
  ],
106
104
  },
@@ -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 { WhatsappLinkUI } from '../ui';
@@ -76,14 +77,11 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
76
77
  title: 'WhatsApp länkgenerator med QR',
77
78
  description: 'Skapa direkta WhatsApp-chattlänkar med förifyllt meddelande och QR-kod. Gratis verktyg, ingen registrering, 100 % privat.',
78
79
  ui,
79
- faqTitle: 'Vanliga frågor',
80
+
80
81
  faq: faqData,
81
82
  howTo: howToData,
82
- bibliographyTitle: 'Referenser',
83
- bibliography: [
84
- { name: 'Hur du använder funktionen "klicka för att chatta" — WhatsApp hjälpcenter', url: 'https://faq.whatsapp.com/591339899867293' },
85
- { name: 'API Klicka för att chatta: parametrar och format — WhatsApp', url: 'https://faq.whatsapp.com/425559092497645' },
86
- ],
83
+
84
+ bibliography,
87
85
  schemas: [faqSchema, howToSchema, appSchema],
88
86
  seo: [
89
87
  { type: 'title', level: 2, text: 'Skapa korta direktlänkar för WhatsApp' },
@@ -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 { WhatsappLinkUI } from '../ui';
@@ -76,14 +77,11 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
76
77
  title: 'QR Kodlu WhatsApp Bağlantı Oluşturucu',
77
78
  description: 'Önceden doldurulmuş mesaj ve QR kodu ile doğrudan WhatsApp sohbet bağlantıları oluşturun. Ücretsiz araç, kayıt yok, %100 özel.',
78
79
  ui,
79
- faqTitle: 'Sıkça Sorulan Sorular',
80
+
80
81
  faq: faqData,
81
82
  howTo: howToData,
82
- bibliographyTitle: 'Kaynaklar',
83
- bibliography: [
84
- { name: 'Tıkla Sohbet Et özelliği nasıl kullanılır — WhatsApp Yardım Merkezi', url: 'https://faq.whatsapp.com/591339899867293' },
85
- { name: 'API Tıkla Sohbet Et: parametreler ve formatlar — WhatsApp', url: 'https://faq.whatsapp.com/425559092497645' },
86
- ],
83
+
84
+ bibliography,
87
85
  schemas: [faqSchema, howToSchema, appSchema],
88
86
  seo: [
89
87
  { type: 'title', level: 2, text: 'WhatsApp için kısa doğrudan bağlantılar oluşturun' },
@@ -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 { WhatsappLinkUI } from '../ui';
@@ -13,7 +14,7 @@ const faqData = [
13
14
  },
14
15
  {
15
16
  question: '如何使用生成的二维码?',
16
- answer: '生成有效链接后,将出现“显示二维码”按钮。二维码包含您的链接 URL。右键点击二维码并选择“图片另存为”,即可下载用于名片、海报或社交媒体的高分辨率图片。',
17
+ answer: '生成有效链接后,将出现"显示二维码"按钮。二维码包含您的链接 URL。右键点击二维码并选择"图片另存为",即可下载用于名片、海报或社交媒体的高分辨率图片。',
17
18
  },
18
19
  {
19
20
  question: '我的数据会流向何处?',
@@ -76,14 +77,11 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
76
77
  title: '带二维码的 WhatsApp 链接生成器',
77
78
  description: '创建带有预填消息和二维码的 WhatsApp 直接聊天链接。免费工具,无需注册,100% 隐私保护。',
78
79
  ui,
79
- faqTitle: '常见问题',
80
+
80
81
  faq: faqData,
81
82
  howTo: howToData,
82
- bibliographyTitle: '参考文献',
83
- bibliography: [
84
- { name: '如何使用“点击聊天”功能 — WhatsApp 帮助中心', url: 'https://faq.whatsapp.com/591339899867293' },
85
- { name: 'API 点击聊天:参数和格式 — WhatsApp', url: 'https://faq.whatsapp.com/425559092497645' },
86
- ],
83
+
84
+ bibliography,
87
85
  schemas: [faqSchema, howToSchema, appSchema],
88
86
  seo: [
89
87
  { type: 'title', level: 2, text: '为 WhatsApp 生成简短的直接链接' },
@@ -94,13 +92,13 @@ export const content: ToolLocaleContent<WhatsappLinkUI> = {
94
92
  { type: 'title', level: 3, text: 'wa.me WhatsApp 短链接有什么用?' },
95
93
  {
96
94
  type: 'paragraph',
97
- html: 'WhatsApp 提供了一个名为“点击聊天”的 API。通过使用特殊的 URL,任何用户都可以与您开启新聊天,而无需先将您添加为联系人,无论是在手机上还是通过 WhatsApp 网页版。',
95
+ html: 'WhatsApp 提供了一个名为"点击聊天"的 API。通过使用特殊的 URL,任何用户都可以与您开启新聊天,而无需先将您添加为联系人,无论是在手机上还是通过 WhatsApp 网页版。',
98
96
  },
99
97
  {
100
98
  type: 'list',
101
99
  items: [
102
- '<strong>提高转化率:</strong>在您的商店中添加“通过 WhatsApp 联系”按钮可减少摩擦并增加销售额。',
103
- '<strong>预填消息:</strong>用户只需按“发送”。例如:“您好!我从 Instagram 过来,想领取优惠。”',
100
+ '<strong>提高转化率:</strong>在您的商店中添加"通过 WhatsApp 联系"按钮可减少摩擦并增加销售额。',
101
+ '<strong>预填消息:</strong>用户只需按"发送"。例如:"您好!我从 Instagram 过来,想领取优惠。"',
104
102
  '<strong>自动二维码:</strong>下载二维码用于名片、海报或社交媒体贴子。',
105
103
  ],
106
104
  },
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await whatsappLink.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 }} />}
@@ -27,6 +27,13 @@
27
27
  display: flex;
28
28
  flex-direction: column;
29
29
  gap: 1.25rem;
30
+ box-sizing: border-box;
31
+ }
32
+
33
+ .wl-root *,
34
+ .wl-root *::before,
35
+ .wl-root *::after {
36
+ box-sizing: border-box;
30
37
  }
31
38
 
32
39
  .theme-dark .wl-root {
@@ -50,7 +57,9 @@
50
57
  background: var(--wl-panel-bg);
51
58
  border: 1px solid var(--wl-panel-border);
52
59
  border-radius: 1.25rem;
53
- padding: 1.5rem;
60
+ width: 100%;
61
+ min-width: 0;
62
+ padding: clamp(1rem, 4vw, 1.5rem);
54
63
  display: flex;
55
64
  flex-direction: column;
56
65
  gap: 1.25rem;
@@ -73,11 +82,14 @@
73
82
  .wl-phone-row {
74
83
  display: flex;
75
84
  gap: 0.5rem;
85
+ width: 100%;
86
+ min-width: 0;
76
87
  }
77
88
 
78
89
  .wl-prefix-select {
79
90
  flex-shrink: 0;
80
- width: 7.5rem;
91
+ width: min(7.5rem, 42%);
92
+ min-width: 6.75rem;
81
93
  background: var(--wl-field-bg);
82
94
  border: 1px solid var(--wl-field-border);
83
95
  border-radius: 0.75rem;
@@ -96,6 +108,8 @@
96
108
 
97
109
  .wl-phone-input {
98
110
  flex: 1;
111
+ min-width: 0;
112
+ width: 100%;
99
113
  background: var(--wl-field-bg);
100
114
  border: 1px solid var(--wl-field-border);
101
115
  border-radius: 0.75rem;
@@ -183,7 +197,9 @@
183
197
  background: var(--wl-result-bg);
184
198
  border: 1px solid var(--wl-result-border);
185
199
  border-radius: 1.25rem;
186
- padding: 1.25rem 1.5rem;
200
+ width: 100%;
201
+ min-width: 0;
202
+ padding: clamp(1rem, 4vw, 1.5rem);
187
203
  display: flex;
188
204
  flex-direction: column;
189
205
  gap: 0.75rem;
@@ -205,10 +221,12 @@
205
221
  display: flex;
206
222
  align-items: center;
207
223
  gap: 0.625rem;
224
+ min-width: 0;
208
225
  }
209
226
 
210
227
  .wl-link-display {
211
228
  flex: 1;
229
+ min-width: 0;
212
230
  font-size: 0.8rem;
213
231
  font-weight: 500;
214
232
  color: var(--wl-link-color);
@@ -257,6 +275,25 @@
257
275
  }
258
276
 
259
277
  .wl-qr-canvas {
278
+ max-width: 100%;
279
+ height: auto;
260
280
  border-radius: 0.75rem;
261
281
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
262
- }
282
+ }
283
+
284
+ @media (max-width: 24rem) {
285
+ .wl-phone-row,
286
+ .wl-result-row {
287
+ flex-direction: column;
288
+ align-items: stretch;
289
+ }
290
+
291
+ .wl-prefix-select {
292
+ width: 100%;
293
+ min-width: 0;
294
+ }
295
+
296
+ .wl-result-actions {
297
+ justify-content: flex-end;
298
+ }
299
+ }
package/src/types.ts CHANGED
@@ -29,9 +29,7 @@ export interface ToolLocaleContent<TUI extends Record<string, string> = Record<s
29
29
  description: string;
30
30
  ui: TUI;
31
31
  seo: SEOSection[];
32
- faqTitle?: string;
33
32
  faq: FAQItem[];
34
- bibliographyTitle?: string;
35
33
  bibliography: BibliographyEntry[];
36
34
  howTo: HowToStep[];
37
35
  schemas: WithContext<Thing>[];