@jjlmoya/utils-developer 1.14.0 → 1.16.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 (200) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/fr.ts +1 -1
  3. package/src/category/i18n/ru.ts +1 -1
  4. package/src/category/index.ts +2 -1
  5. package/src/entries.ts +4 -1
  6. package/src/index.ts +2 -0
  7. package/src/layouts/PreviewLayout.astro +1 -0
  8. package/src/pages/[locale]/[slug].astro +29 -12
  9. package/src/tests/diacritics_density.test.ts +118 -0
  10. package/src/tests/inverted_punctuation.test.ts +113 -0
  11. package/src/tests/locale_completeness.test.ts +2 -3
  12. package/src/tests/no_en_dash.test.ts +73 -0
  13. package/src/tests/pagespeed_best_practices.test.ts +198 -0
  14. package/src/tests/script_density.test.ts +94 -0
  15. package/src/tests/shared-test-helpers.ts +56 -0
  16. package/src/tests/tool_exports.test.ts +34 -0
  17. package/src/tests/tool_validation.test.ts +2 -2
  18. package/src/tool/aspectRatio/component.astro +3 -1
  19. package/src/tool/aspectRatio/i18n/de.ts +1 -1
  20. package/src/tool/aspectRatio/i18n/fr.ts +1 -1
  21. package/src/tool/aspectRatio/i18n/pl.ts +2 -2
  22. package/src/tool/aspectRatio/i18n/ru.ts +4 -4
  23. package/src/tool/aspectRatio/i18n/zh.ts +1 -1
  24. package/src/tool/aspectRatio/seo.astro +2 -1
  25. package/src/tool/calculadoraTiempoDatos/i18n/de.ts +1 -1
  26. package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +1 -1
  27. package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +5 -5
  28. package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +5 -5
  29. package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +1 -1
  30. package/src/tool/calculadoraTiempoDatos/seo.astro +2 -1
  31. package/src/tool/colorConverter/component.astro +3 -3
  32. package/src/tool/colorConverter/i18n/de.ts +1 -1
  33. package/src/tool/colorConverter/i18n/ru.ts +2 -2
  34. package/src/tool/colorConverter/seo.astro +2 -1
  35. package/src/tool/conversorExcelCsvHtml/i18n/es.ts +1 -1
  36. package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +1 -1
  37. package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +2 -2
  38. package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +2 -2
  39. package/src/tool/conversorExcelCsvHtml/seo.astro +2 -1
  40. package/src/tool/cronGenerator/i18n/de.ts +4 -4
  41. package/src/tool/cronGenerator/i18n/en.ts +1 -1
  42. package/src/tool/cronGenerator/i18n/es.ts +2 -2
  43. package/src/tool/cronGenerator/i18n/fr.ts +5 -5
  44. package/src/tool/cronGenerator/i18n/id.ts +1 -1
  45. package/src/tool/cronGenerator/i18n/nl.ts +1 -1
  46. package/src/tool/cronGenerator/i18n/pl.ts +8 -8
  47. package/src/tool/cronGenerator/i18n/pt.ts +1 -1
  48. package/src/tool/cronGenerator/i18n/ru.ts +9 -9
  49. package/src/tool/cronGenerator/i18n/sv.ts +1 -1
  50. package/src/tool/cronGenerator/i18n/zh.ts +3 -3
  51. package/src/tool/cronGenerator/seo.astro +2 -1
  52. package/src/tool/cssSpecificityCalculator/i18n/de.ts +1 -1
  53. package/src/tool/cssSpecificityCalculator/i18n/fr.ts +3 -3
  54. package/src/tool/cssSpecificityCalculator/i18n/pl.ts +2 -2
  55. package/src/tool/cssSpecificityCalculator/i18n/ru.ts +2 -2
  56. package/src/tool/cssSpecificityCalculator/seo.astro +2 -1
  57. package/src/tool/cssToInlineConverter/i18n/de.ts +6 -6
  58. package/src/tool/cssToInlineConverter/i18n/es.ts +1 -1
  59. package/src/tool/cssToInlineConverter/i18n/fr.ts +3 -3
  60. package/src/tool/cssToInlineConverter/seo.astro +2 -1
  61. package/src/tool/duplicateCssRemover/i18n/de.ts +7 -7
  62. package/src/tool/duplicateCssRemover/i18n/fr.ts +1 -1
  63. package/src/tool/duplicateCssRemover/i18n/id.ts +1 -1
  64. package/src/tool/duplicateCssRemover/i18n/nl.ts +1 -1
  65. package/src/tool/duplicateCssRemover/i18n/pl.ts +1 -1
  66. package/src/tool/duplicateCssRemover/i18n/pt.ts +1 -1
  67. package/src/tool/duplicateCssRemover/i18n/ru.ts +3 -3
  68. package/src/tool/duplicateCssRemover/i18n/sv.ts +1 -1
  69. package/src/tool/duplicateCssRemover/seo.astro +2 -1
  70. package/src/tool/generadorSecurityTxt/i18n/de.ts +5 -5
  71. package/src/tool/generadorSecurityTxt/i18n/ru.ts +2 -2
  72. package/src/tool/generadorSecurityTxt/seo.astro +2 -1
  73. package/src/tool/hashGenerator/i18n/ru.ts +5 -5
  74. package/src/tool/hashGenerator/i18n/zh.ts +2 -2
  75. package/src/tool/hashGenerator/seo.astro +2 -1
  76. package/src/tool/inspectorCertificadosSsl/i18n/de.ts +6 -6
  77. package/src/tool/inspectorCertificadosSsl/i18n/ru.ts +5 -5
  78. package/src/tool/inspectorCertificadosSsl/seo.astro +2 -1
  79. package/src/tool/jsonFormatter/i18n/de.ts +4 -4
  80. package/src/tool/jsonFormatter/i18n/en.ts +4 -4
  81. package/src/tool/jsonFormatter/i18n/es.ts +4 -4
  82. package/src/tool/jsonFormatter/i18n/fr.ts +4 -4
  83. package/src/tool/jsonFormatter/i18n/id.ts +4 -4
  84. package/src/tool/jsonFormatter/i18n/it.ts +4 -4
  85. package/src/tool/jsonFormatter/i18n/ja.ts +4 -4
  86. package/src/tool/jsonFormatter/i18n/ko.ts +4 -4
  87. package/src/tool/jsonFormatter/i18n/nl.ts +4 -4
  88. package/src/tool/jsonFormatter/i18n/pl.ts +4 -4
  89. package/src/tool/jsonFormatter/i18n/pt.ts +4 -4
  90. package/src/tool/jsonFormatter/i18n/ru.ts +5 -5
  91. package/src/tool/jsonFormatter/i18n/sv.ts +4 -4
  92. package/src/tool/jsonFormatter/i18n/tr.ts +4 -4
  93. package/src/tool/jsonFormatter/i18n/zh.ts +5 -5
  94. package/src/tool/jsonFormatter/seo.astro +2 -1
  95. package/src/tool/keycode/i18n/de.ts +7 -7
  96. package/src/tool/keycode/i18n/en.ts +5 -5
  97. package/src/tool/keycode/i18n/es.ts +5 -5
  98. package/src/tool/keycode/i18n/fr.ts +7 -7
  99. package/src/tool/keycode/i18n/id.ts +5 -5
  100. package/src/tool/keycode/i18n/it.ts +5 -5
  101. package/src/tool/keycode/i18n/ja.ts +5 -5
  102. package/src/tool/keycode/i18n/ko.ts +5 -5
  103. package/src/tool/keycode/i18n/nl.ts +5 -5
  104. package/src/tool/keycode/i18n/pl.ts +7 -7
  105. package/src/tool/keycode/i18n/pt.ts +5 -5
  106. package/src/tool/keycode/i18n/ru.ts +6 -6
  107. package/src/tool/keycode/i18n/sv.ts +5 -5
  108. package/src/tool/keycode/i18n/tr.ts +5 -5
  109. package/src/tool/keycode/i18n/zh.ts +5 -5
  110. package/src/tool/keycode/seo.astro +2 -1
  111. package/src/tool/llmCostCalculator/component.astro +1 -2
  112. package/src/tool/llmCostCalculator/i18n/de.ts +4 -4
  113. package/src/tool/llmCostCalculator/i18n/en.ts +3 -3
  114. package/src/tool/llmCostCalculator/i18n/fr.ts +3 -3
  115. package/src/tool/llmCostCalculator/i18n/id.ts +3 -3
  116. package/src/tool/llmCostCalculator/i18n/pt.ts +3 -3
  117. package/src/tool/llmCostCalculator/i18n/ru.ts +3 -3
  118. package/src/tool/llmCostCalculator/i18n/sv.ts +3 -3
  119. package/src/tool/llmCostCalculator/i18n/tr.ts +3 -3
  120. package/src/tool/llmCostCalculator/i18n/zh.ts +3 -3
  121. package/src/tool/llmCostCalculator/seo.astro +2 -1
  122. package/src/tool/mobileMockupGenerator/component.astro +4 -5
  123. package/src/tool/mobileMockupGenerator/i18n/es.ts +1 -1
  124. package/src/tool/mobileMockupGenerator/seo.astro +2 -1
  125. package/src/tool/musicalTypography/i18n/de.ts +1 -1
  126. package/src/tool/musicalTypography/i18n/fr.ts +1 -1
  127. package/src/tool/musicalTypography/i18n/id.ts +1 -1
  128. package/src/tool/musicalTypography/i18n/it.ts +1 -1
  129. package/src/tool/musicalTypography/i18n/ko.ts +1 -1
  130. package/src/tool/musicalTypography/i18n/ru.ts +3 -3
  131. package/src/tool/musicalTypography/seo.astro +2 -1
  132. package/src/tool/placeholderGenerator/component.astro +2 -2
  133. package/src/tool/placeholderGenerator/i18n/de.ts +4 -4
  134. package/src/tool/placeholderGenerator/i18n/ru.ts +1 -1
  135. package/src/tool/placeholderGenerator/seo.astro +2 -1
  136. package/src/tool/promptLibrary/i18n/de.ts +1 -1
  137. package/src/tool/promptLibrary/seo.astro +2 -1
  138. package/src/tool/readabilityCalculator/component.astro +4 -4
  139. package/src/tool/readabilityCalculator/i18n/de.ts +2 -2
  140. package/src/tool/readabilityCalculator/seo.astro +2 -1
  141. package/src/tool/readabilityCalculator/visual-readability-calculator-wcag-apca.css +87 -3
  142. package/src/tool/serpPixelSimulator/bibliography.astro +7 -0
  143. package/src/tool/serpPixelSimulator/bibliography.ts +16 -0
  144. package/src/tool/serpPixelSimulator/component.astro +84 -0
  145. package/src/tool/serpPixelSimulator/controller.ts +323 -0
  146. package/src/tool/serpPixelSimulator/entry.ts +30 -0
  147. package/src/tool/serpPixelSimulator/i18n/de.ts +214 -0
  148. package/src/tool/serpPixelSimulator/i18n/en.ts +213 -0
  149. package/src/tool/serpPixelSimulator/i18n/es.ts +214 -0
  150. package/src/tool/serpPixelSimulator/i18n/fr.ts +214 -0
  151. package/src/tool/serpPixelSimulator/i18n/id.ts +214 -0
  152. package/src/tool/serpPixelSimulator/i18n/it.ts +214 -0
  153. package/src/tool/serpPixelSimulator/i18n/ja.ts +214 -0
  154. package/src/tool/serpPixelSimulator/i18n/ko.ts +214 -0
  155. package/src/tool/serpPixelSimulator/i18n/nl.ts +214 -0
  156. package/src/tool/serpPixelSimulator/i18n/pl.ts +214 -0
  157. package/src/tool/serpPixelSimulator/i18n/pt.ts +214 -0
  158. package/src/tool/serpPixelSimulator/i18n/ru.ts +214 -0
  159. package/src/tool/serpPixelSimulator/i18n/sv.ts +214 -0
  160. package/src/tool/serpPixelSimulator/i18n/tr.ts +214 -0
  161. package/src/tool/serpPixelSimulator/i18n/zh.ts +214 -0
  162. package/src/tool/serpPixelSimulator/index.ts +12 -0
  163. package/src/tool/serpPixelSimulator/logic.ts +18 -0
  164. package/src/tool/serpPixelSimulator/seo.astro +12 -0
  165. package/src/tool/serpPixelSimulator/serp-pixel-simulator.css +335 -0
  166. package/src/tool/serpPixelSimulator/ui.ts +33 -0
  167. package/src/tool/svgSanitizer/i18n/de.ts +2 -2
  168. package/src/tool/svgSanitizer/i18n/id.ts +1 -1
  169. package/src/tool/svgSanitizer/i18n/pl.ts +1 -1
  170. package/src/tool/svgSanitizer/i18n/ru.ts +7 -7
  171. package/src/tool/svgSanitizer/i18n/sv.ts +3 -3
  172. package/src/tool/svgSanitizer/i18n/tr.ts +3 -3
  173. package/src/tool/svgSanitizer/i18n/zh.ts +3 -3
  174. package/src/tool/svgSanitizer/seo.astro +2 -1
  175. package/src/tool/svgToCss/i18n/de.ts +2 -2
  176. package/src/tool/svgToCss/i18n/es.ts +1 -1
  177. package/src/tool/svgToCss/i18n/fr.ts +1 -1
  178. package/src/tool/svgToCss/i18n/pl.ts +1 -1
  179. package/src/tool/svgToCss/i18n/ru.ts +2 -2
  180. package/src/tool/svgToCss/i18n/zh.ts +2 -2
  181. package/src/tool/svgToCss/seo.astro +2 -1
  182. package/src/tool/urlCleaner/component.astro +23 -5
  183. package/src/tool/urlCleaner/i18n/de.ts +3 -3
  184. package/src/tool/urlCleaner/i18n/es.ts +1 -1
  185. package/src/tool/urlCleaner/i18n/id.ts +1 -1
  186. package/src/tool/urlCleaner/i18n/nl.ts +1 -1
  187. package/src/tool/urlCleaner/seo.astro +2 -1
  188. package/src/tool/urlCleaner/url-tracking-cleaner.css +92 -2
  189. package/src/tool/urlEncoderDecoder/i18n/de.ts +5 -5
  190. package/src/tool/urlEncoderDecoder/i18n/fr.ts +2 -2
  191. package/src/tool/urlEncoderDecoder/i18n/pl.ts +5 -5
  192. package/src/tool/urlEncoderDecoder/i18n/ru.ts +8 -8
  193. package/src/tool/urlEncoderDecoder/i18n/sv.ts +5 -5
  194. package/src/tool/urlEncoderDecoder/i18n/zh.ts +5 -5
  195. package/src/tool/urlEncoderDecoder/seo.astro +2 -1
  196. package/src/tool/utmGenerator/i18n/de.ts +2 -2
  197. package/src/tool/utmGenerator/i18n/pl.ts +5 -5
  198. package/src/tool/utmGenerator/i18n/ru.ts +6 -6
  199. package/src/tool/utmGenerator/seo.astro +2 -1
  200. package/src/tools.ts +2 -2
@@ -100,7 +100,7 @@ const ui: CronGeneratorUI = {
100
100
  hintDow: '0 = Domingo, 6 = Sábado',
101
101
  labelNextRuns: 'Próximas Ejecuciones',
102
102
  btnCopy: 'Copiar Expresión',
103
- btnCopied: 'Copiado!',
103
+ btnCopied: '¡Copiado!',
104
104
  msgNoRuns: 'No se encontraron ejecuciones próximas razonables.',
105
105
  msgError: 'Error al calcular fechas.',
106
106
  presetEveryMinute: 'Cada minuto',
@@ -185,7 +185,7 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
185
185
  },
186
186
  {
187
187
  type: 'paragraph',
188
- html: 'El 90% de los servidores funcionan en <strong>UTC</strong>. Si programas una tarea a las 02:00 AM pensando en tu horario local, podrías ejecutarla en un momento inesperado. Además, Cron no tiene acceso a tu <code>$PATH</code> habitual usa siempre rutas absolutas como <code>/usr/local/bin/node</code>.',
188
+ html: 'El 90% de los servidores funcionan en <strong>UTC</strong>. Si programas una tarea a las 02:00 AM pensando en tu horario local, podrías ejecutarla en un momento inesperado. Además, Cron no tiene acceso a tu <code>$PATH</code> habitual - usa siempre rutas absolutas como <code>/usr/local/bin/node</code>.',
189
189
  },
190
190
  ],
191
191
  };
@@ -96,7 +96,7 @@ const ui: CronGeneratorUI = {
96
96
  fieldDom: 'Jour du Mois (1-31)',
97
97
  fieldMonth: 'Mois (1-12)',
98
98
  fieldDow: 'Jour de la Semaine (0-6)',
99
- hintMinute: 'Ex : *, */5, 0,30',
99
+ hintMinute: 'Ex: *, */5, 0,30',
100
100
  hintDow: '0 = Dimanche, 6 = Samedi',
101
101
  labelNextRuns: 'Prochaines exécutions',
102
102
  btnCopy: 'Copier l\'expression',
@@ -139,11 +139,11 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
139
139
  bibliographyTitle: 'Références et documentation',
140
140
  bibliography: [
141
141
  {
142
- name: 'Manuel GNU Crontab : Expressions Cron sous Linux',
142
+ name: 'Manuel GNU Crontab: Expressions Cron sous Linux',
143
143
  url: 'https://www.gnu.org/software/mcron/manual/html_node/Crontab-file.html',
144
144
  },
145
145
  {
146
- name: 'Cron sur Wikipedia : Histoire et syntaxe',
146
+ name: 'Cron sur Wikipedia: Histoire et syntaxe',
147
147
  url: 'https://en.wikipedia.org/wiki/Cron',
148
148
  },
149
149
  ],
@@ -181,11 +181,11 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
181
181
  },
182
182
  {
183
183
  type: 'tip',
184
- html: 'Utilisez le slash <code>/</code> pour définir des pas : <code>*/5</code> en minutes s\'exécute toutes les 5 minutes. La virgule <code>,</code> crée des listes (<code>1,3,5</code>) et le tiret <code>-</code> définit des plages (<code>1-5</code>).',
184
+ html: 'Utilisez le slash <code>/</code> pour définir des pas: <code>*/5</code> en minutes s\'exécute toutes les 5 minutes. La virgule <code>,</code> crée des listes (<code>1,3,5</code>) et le tiret <code>-</code> définit des plages (<code>1-5</code>).',
185
185
  },
186
186
  {
187
187
  type: 'paragraph',
188
- html: '90% des serveurs fonctionnent en <strong>UTC</strong>. Si vous planifiez une tâche à 02h00 en pensant à votre fuseau local, elle peut s\'exécuter à un moment inattendu. De plus, Cron n\'a pas accès à votre <code>$PATH</code> habituel utilisez toujours des chemins absolus comme <code>/usr/local/bin/node</code>.',
188
+ html: '90% des serveurs fonctionnent en <strong>UTC</strong>. Si vous planifiez une tâche à 02h00 en pensant à votre fuseau local, elle peut s\'exécuter à un moment inattendu. De plus, Cron n\'a pas accès à votre <code>$PATH</code> habituel - utilisez toujours des chemins absolus comme <code>/usr/local/bin/node</code>.',
189
189
  },
190
190
  ],
191
191
  };
@@ -185,7 +185,7 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
185
185
  },
186
186
  {
187
187
  type: 'paragraph',
188
- html: '90% server berjalan pada <strong>UTC</strong>. Jika Anda menjadwalkan tugas pada pukul 02:00 pagi berdasarkan zona waktu lokal Anda, tugas tersebut mungkin berjalan pada waktu yang tidak terduga. Selain itu, Cron tidak memiliki akses ke <code>$PATH</code> Anda yang biasa selalu gunakan jalur absolut seperti <code>/usr/local/bin/node</code>.',
188
+ html: '90% server berjalan pada <strong>UTC</strong>. Jika Anda menjadwalkan tugas pada pukul 02:00 pagi berdasarkan zona waktu lokal Anda, tugas tersebut mungkin berjalan pada waktu yang tidak terduga. Selain itu, Cron tidak memiliki akses ke <code>$PATH</code> Anda yang biasa - selalu gunakan jalur absolut seperti <code>/usr/local/bin/node</code>.',
189
189
  },
190
190
  ],
191
191
  };
@@ -185,7 +185,7 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
185
185
  },
186
186
  {
187
187
  type: 'paragraph',
188
- html: '90% van de servers draait op <strong>UTC</strong>. Als u een taak plant om 02:00 uur \'s nachts op basis van uw lokale tijdzone, kan deze op een onverwacht tijdstip worden uitgevoerd. Bovendien heeft Cron geen toegang tot uw gebruikelijke <code>$PATH</code> gebruik altijd absolute paden zoals <code>/usr/local/bin/node</code>.',
188
+ html: '90% van de servers draait op <strong>UTC</strong>. Als u een taak plant om 02:00 uur \'s nachts op basis van uw lokale tijdzone, kan deze op een onverwacht tijdstip worden uitgevoerd. Bovendien heeft Cron geen toegang tot uw gebruikelijke <code>$PATH</code> - gebruik altijd absolute paden zoals <code>/usr/local/bin/node</code>.',
189
189
  },
190
190
  ],
191
191
  };
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: 'Co oznacza gwiazdka (*) w Cron?',
23
23
  answer:
24
- 'Gwiazdka to symbol wieloznaczny oznaczający wszystko”. Na przykład gwiazdka w polu minut oznacza, że zadanie będzie uruchamiane w każdej minucie zdefiniowanego zakresu.',
24
+ 'Gwiazdka to symbol wieloznaczny oznaczający "wszystko". Na przykład gwiazdka w polu minut oznacza, że zadanie będzie uruchamiane w każdej minucie zdefiniowanego zakresu.',
25
25
  },
26
26
  {
27
27
  question: 'Jak mogę sprawdzić nadchodzące wykonania?',
@@ -37,7 +37,7 @@ const howToData = [
37
37
  },
38
38
  {
39
39
  name: 'Skonfiguruj zaawansowane szczegóły',
40
- text: 'Przełącz się na kartę Zaawansowane”, aby ręcznie zdefiniować dokładne minuty, godziny lub określone dni tygodnia.',
40
+ text: 'Przełącz się na kartę "Zaawansowane", aby ręcznie zdefiniować dokładne minuty, godziny lub określone dni tygodnia.',
41
41
  },
42
42
  {
43
43
  name: 'Zweryfikuj tłumaczenie i daty',
@@ -167,11 +167,11 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
167
167
  {
168
168
  type: 'list',
169
169
  items: [
170
- '<strong>Pole 1 Minuta (0-59):</strong> Kiedy zadanie rozpoczyna się w ciągu godziny.',
171
- '<strong>Pole 2 Godzina (0-23):</strong> Wymagany format 24-godzinny.',
172
- '<strong>Pole 3 Dzień miesiąca (1-31):</strong> Konkretny dzień kalendarzowy.',
173
- '<strong>Pole 4 Miesiąc (1-12):</strong> Od stycznia do grudnia.',
174
- '<strong>Pole 5 Dzień tygodnia (0-6):</strong> 0 to zazwyczaj niedziela.',
170
+ '<strong>Pole 1 - Minuta (0-59):</strong> Kiedy zadanie rozpoczyna się w ciągu godziny.',
171
+ '<strong>Pole 2 - Godzina (0-23):</strong> Wymagany format 24-godzinny.',
172
+ '<strong>Pole 3 - Dzień miesiąca (1-31):</strong> Konkretny dzień kalendarzowy.',
173
+ '<strong>Pole 4 - Miesiąc (1-12):</strong> Od stycznia do grudnia.',
174
+ '<strong>Pole 5 - Dzień tygodnia (0-6):</strong> 0 to zazwyczaj niedziela.',
175
175
  ],
176
176
  },
177
177
  {
@@ -185,7 +185,7 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
185
185
  },
186
186
  {
187
187
  type: 'paragraph',
188
- html: '90% serwerów działa w czasie <strong>UTC</strong>. Jeśli zaplanujesz zadanie na 02:00 rano, myśląc o lokalnej strefie czasowej, może ono zostać uruchomione o nieoczekiwanej porze. Ponadto Cron nie ma dostępu do Twojej zwykłej ścieżki <code>$PATH</code> zawsze używaj ścieżek bezwzględnych, takich jak <code>/usr/local/bin/node</code>.',
188
+ html: '90% serwerów działa w czasie <strong>UTC</strong>. Jeśli zaplanujesz zadanie na 02:00 rano, myśląc o lokalnej strefie czasowej, może ono zostać uruchomione o nieoczekiwanej porze. Ponadto Cron nie ma dostępu do Twojej zwykłej ścieżki <code>$PATH</code> - zawsze używaj ścieżek bezwzględnych, takich jak <code>/usr/local/bin/node</code>.',
189
189
  },
190
190
  ],
191
191
  };
@@ -185,7 +185,7 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
185
185
  },
186
186
  {
187
187
  type: 'paragraph',
188
- html: '90% dos servidores funcionam em <strong>UTC</strong>. Se agendar uma tarefa às 02:00 da manhã pensando no seu fuso horário local, ela poderá ser executada num horário inesperado. Além disso, o Cron não tem acesso ao seu <code>$PATH</code> habitual use sempre caminhos absolutos como <code>/usr/local/bin/node</code>.',
188
+ html: '90% dos servidores funcionam em <strong>UTC</strong>. Se agendar uma tarefa às 02:00 da manhã pensando no seu fuso horário local, ela poderá ser executada num horário inesperado. Além disso, o Cron não tem acesso ao seu <code>$PATH</code> habitual - use sempre caminhos absolutos como <code>/usr/local/bin/node</code>.',
189
189
  },
190
190
  ],
191
191
  };
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: 'Что означает звездочка (*) в Cron?',
23
23
  answer:
24
- 'Звездочка это подстановочный знак, означающий «все». Например, * в поле минут означает, что задача будет запускаться каждую минуту определенного диапазона.',
24
+ 'Звездочка - это подстановочный знак, означающий "все". Например, * в поле минут означает, что задача будет запускаться каждую минуту определенного диапазона.',
25
25
  },
26
26
  {
27
27
  question: 'Как я могу проверить предстоящие запуски?',
@@ -37,7 +37,7 @@ const howToData = [
37
37
  },
38
38
  {
39
39
  name: 'Настройте дополнительные детали',
40
- text: 'Перейдите на вкладку «Дополнительно», чтобы вручную определить точные минуты, часы или конкретные дни недели.',
40
+ text: 'Перейдите на вкладку "Дополнительно", чтобы вручную определить точные минуты, часы или конкретные дни недели.',
41
41
  },
42
42
  {
43
43
  name: 'Проверьте перевод и даты',
@@ -157,7 +157,7 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
157
157
  },
158
158
  {
159
159
  type: 'paragraph',
160
- html: 'Несмотря на то, что мы живем в эпоху <em>serverless</em>-серверов и облачных рабочих процессов, система <strong>Crontab</strong> остается основой глобальной технологической инфраструктуры. От небольших блогов до массивных банковских систем планирование задач поддерживает работу цифрового мира.',
160
+ html: 'Несмотря на то, что мы живем в эпоху <em>serverless</em>-серверов и облачных рабочих процессов, система <strong>Crontab</strong> остается основой глобальной технологической инфраструктуры. От небольших блогов до массивных банковских систем - планирование задач поддерживает работу цифрового мира.',
161
161
  },
162
162
  {
163
163
  type: 'title',
@@ -167,11 +167,11 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
167
167
  {
168
168
  type: 'list',
169
169
  items: [
170
- '<strong>Поле 1 Минута (0-59):</strong> когда задача запускается внутри часа.',
171
- '<strong>Поле 2 Час (0-23):</strong> требуется 24-часовой формат.',
172
- '<strong>Поле 3 День месяца (1-31):</strong> конкретный календарный день.',
173
- '<strong>Поле 4 Месяц (1-12):</strong> с января по декабрь.',
174
- '<strong>Поле 5 День недели (0-6):</strong> 0 обычно означает воскресенье.',
170
+ '<strong>Поле 1 - Минута (0-59):</strong> когда задача запускается внутри часа.',
171
+ '<strong>Поле 2 - Час (0-23):</strong> требуется 24-часовой формат.',
172
+ '<strong>Поле 3 - День месяца (1-31):</strong> конкретный календарный день.',
173
+ '<strong>Поле 4 - Месяц (1-12):</strong> с января по декабрь.',
174
+ '<strong>Поле 5 - День недели (0-6):</strong> 0 обычно означает воскресенье.',
175
175
  ],
176
176
  },
177
177
  {
@@ -185,7 +185,7 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
185
185
  },
186
186
  {
187
187
  type: 'paragraph',
188
- html: '90% серверов работают по времени <strong>UTC</strong>. Если вы планируете задачу на 02:00 ночи, ориентируясь на местное время, она может запуститься в неожиданное время. Кроме того, у Cron нет доступа к вашему обычному <code>$PATH</code> всегда используйте абсолютные пути, такие как <code>/usr/local/bin/node</code>.',
188
+ html: '90% серверов работают по времени <strong>UTC</strong>. Если вы планируете задачу на 02:00 ночи, ориентируясь на местное время, она может запуститься в неожиданное время. Кроме того, у Cron нет доступа к вашему обычному <code>$PATH</code> - всегда используйте абсолютные пути, такие как <code>/usr/local/bin/node</code>.',
189
189
  },
190
190
  ],
191
191
  };
@@ -185,7 +185,7 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
185
185
  },
186
186
  {
187
187
  type: 'paragraph',
188
- html: '90 % av alla servrar körs på <strong>UTC</strong>. Om du schemalägger en uppgift kl. 02:00 med din lokala tidszon i åtanke, kan den köras vid en oväntad tidpunkt. Cron har dessutom inte tillgång till din vanliga <code>$PATH</code> använd alltid absoluta sökvägar som <code>/usr/local/bin/node</code>.',
188
+ html: '90 % av alla servrar körs på <strong>UTC</strong>. Om du schemalägger en uppgift kl. 02:00 med din lokala tidszon i åtanke, kan den köras vid en oväntad tidpunkt. Cron har dessutom inte tillgång till din vanliga <code>$PATH</code> - använd alltid absoluta sökvägar som <code>/usr/local/bin/node</code>.',
189
189
  },
190
190
  ],
191
191
  };
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: 'Cron 中的星号 (*) 是什么意思?',
23
23
  answer:
24
- '星号是一个通配符,表示“所有”。例如,分钟字段中的 * 表示任务将在定义范围内的每分钟运行。',
24
+ '星号是一个通配符,表示"所有"。例如,分钟字段中的 * 表示任务将在定义范围内的每分钟运行。',
25
25
  },
26
26
  {
27
27
  question: '如何检查即将进行的执行?',
@@ -37,7 +37,7 @@ const howToData = [
37
37
  },
38
38
  {
39
39
  name: '配置高级细节',
40
- text: '切换到“高级”选项卡,手动定义具体的分钟、小时或特定的星期。',
40
+ text: '切换到"高级"选项卡,手动定义具体的分钟、小时或特定的星期。',
41
41
  },
42
42
  {
43
43
  name: '验证翻译和日期',
@@ -185,7 +185,7 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
185
185
  },
186
186
  {
187
187
  type: 'paragraph',
188
- html: '90% 的服务器运行在 <strong>UTC</strong> 时间。如果您按照当地时区计划在凌晨 02:00 运行任务,它可能会在意外的时间执行。此外,Cron 无法直接访问您的 <code>$PATH</code> 变量 —— 请始终使用绝对路径,例如 <code>/usr/local/bin/node</code>。',
188
+ html: '90% 的服务器运行在 <strong>UTC</strong> 时间。如果您按照当地时区计划在凌晨 02:00 运行任务,它可能会在意外的时间执行。此外,Cron 无法直接访问您的 <code>$PATH</code> 变量 - 请始终使用绝对路径,例如 <code>/usr/local/bin/node</code>。',
189
189
  },
190
190
  ],
191
191
  };
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await cronGenerator.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 }} />}
@@ -119,7 +119,7 @@ export const content: ToolLocaleContent<CssSpecificityCalculatorUI> = {
119
119
  },
120
120
  {
121
121
  type: 'paragraph',
122
- html: 'Die CSS-Spezifität ist der Algorithmus, nach dem Browser entscheiden, welche Eigenschaftswerte auf ein bestimmtes Element angewendet werden. Es ist im Grunde ein mathematischer Wert, der dem Browser sagt, wie spezifisch eine Regel ist.',
122
+ html: 'Die CSS-Spezifität ist der Algorithmus, nach dem Browser entscheiden, welche Eigenschaftswerte auf ein bestimmtes Element angewendet werden. Es ist im Grunde ein mathematischer Wert, der dem Browser sagt, "wie spezifisch" eine Regel ist.',
123
123
  },
124
124
  {
125
125
  type: 'paragraph',
@@ -33,11 +33,11 @@ const faqData = [
33
33
  const howToData = [
34
34
  {
35
35
  name: 'Saisissez le premier sélecteur',
36
- text: 'Tapez le Sélecteur A dans le champ texte de gauche, par exemple : #header .nav-item > a. Les compteurs d\'IDs, Classes et Éléments se mettront à jour instantanément.',
36
+ text: 'Tapez le Sélecteur A dans le champ texte de gauche, par exemple: #header .nav-item > a. Les compteurs d\'IDs, Classes et Éléments se mettront à jour instantanément.',
37
37
  },
38
38
  {
39
39
  name: 'Saisissez le deuxième sélecteur',
40
- text: 'Tapez le Sélecteur B dans le champ texte de droite, par exemple : ul li.active a:hover. Observez comment les poids changent en temps réel.',
40
+ text: 'Tapez le Sélecteur B dans le champ texte de droite, par exemple: ul li.active a:hover. Observez comment les poids changent en temps réel.',
41
41
  },
42
42
  {
43
43
  name: 'Lisez le résultat',
@@ -137,7 +137,7 @@ export const content: ToolLocaleContent<CssSpecificityCalculatorUI> = {
137
137
  {
138
138
  type: 'list',
139
139
  items: [
140
- '<strong>Colonne A (IDs) :</strong> Compte le nombre d\'identifiants uniques. Exemple : <code>#header</code> compte comme 1 dans la colonne A.',
140
+ '<strong>Colonne A (IDs):</strong> Compte le nombre d\'identifiants uniques. Exemple: <code>#header</code> compte comme 1 dans la colonne A.',
141
141
  '<strong>Colonne B (Classes, Attributs et Pseudo-classes) :</strong> Compte toutes les classes (<code>.button</code>), attributs (<code>[type="text"]</code>) et pseudo-classes (<code>:hover</code>).',
142
142
  '<strong>Colonne C (Éléments et Pseudo-éléments) :</strong> Compte tous les éléments HTML (<code>div</code>, <code>h1</code>) et pseudo-éléments (<code>::before</code>).',
143
143
  ],
@@ -119,11 +119,11 @@ export const content: ToolLocaleContent<CssSpecificityCalculatorUI> = {
119
119
  },
120
120
  {
121
121
  type: 'paragraph',
122
- html: 'Specyficzność CSS to algorytm, według którego przeglądarki decydują, które wartości właściwości zastosować do danego elementu. To nic innego jak matematyczny wynik, który mówi przeglądarce, jak bardzo szczegółowa" jest dana reguła.',
122
+ html: 'Specyficzność CSS to algorytm, według którego przeglądarki decydują, które wartości właściwości zastosować do danego elementu. To nic innego jak matematyczny wynik, który mówi przeglądarce, jak bardzo "szczegółowa" jest dana reguła.',
123
123
  },
124
124
  {
125
125
  type: 'paragraph',
126
- html: 'Jeśli dwie reguły mają różne poziomy specyficzności, wygrywa ta o wyższej wadze niezależnie od kolejności, w jakiej zostały napisane. Gdy obie mają tę samą wagę, decyduje ta zadeklarowana później w kodzie źródłowym.',
126
+ html: 'Jeśli dwie reguły mają różne poziomy specyficzności, wygrywa ta o wyższej wadze - niezależnie od kolejności, w jakiej zostały napisane. Gdy obie mają tę samą wagę, decyduje ta zadeklarowana później w kodzie źródłowym.',
127
127
  },
128
128
  {
129
129
  type: 'title',
@@ -11,7 +11,7 @@ const faqData = [
11
11
  {
12
12
  question: 'Что такое специфичность CSS?',
13
13
  answer:
14
- 'Специфичность это алгоритм, который браузеры используют для определения того, какое правило CSS применяется к элементу, когда несколько правил конкурируют. Она представлена трёхколонным счётом (A, B, C), указывающим идентификаторы, классы/атрибуты/псевдо-классы и элементы/псевдо-элементы соответственно.',
14
+ 'Специфичность - это алгоритм, который браузеры используют для определения того, какое правило CSS применяется к элементу, когда несколько правил конкурируют. Она представлена трёхколонным счётом (A, B, C), указывающим идентификаторы, классы/атрибуты/псевдо-классы и элементы/псевдо-элементы соответственно.',
15
15
  },
16
16
  {
17
17
  question: 'Может ли класс когда-либо победить ID в специфичности?',
@@ -119,7 +119,7 @@ export const content: ToolLocaleContent<CssSpecificityCalculatorUI> = {
119
119
  },
120
120
  {
121
121
  type: 'paragraph',
122
- html: 'Специфичность CSS это алгоритм, по которому браузеры определяют, какие значения свойств применять к конкретному элементу. По сути это математический счёт, который говорит браузеру «насколько специфичным» является правило.',
122
+ html: 'Специфичность CSS - это алгоритм, по которому браузеры определяют, какие значения свойств применять к конкретному элементу. По сути это математический счёт, который говорит браузеру "насколько специфичным" является правило.',
123
123
  },
124
124
  {
125
125
  type: 'paragraph',
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await cssSpecificityCalculator.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 }} />}
@@ -16,32 +16,32 @@ const faqData = [
16
16
  {
17
17
  question: 'Was passiert, wenn ein Element bereits ein eigenes style-Attribut hat?',
18
18
  answer:
19
- 'Das Werkzeug respektiert vorhandene Inline-Styles und fügt die neuen Eigenschaften dahinter an es simuliert dabei das Verhalten der CSS-Kaskade: Bei Konflikten überschreiben später deklarierte Eigenschaften frühere.',
19
+ 'Das Werkzeug respektiert vorhandene Inline-Styles und fügt die neuen Eigenschaften dahinter an - es simuliert dabei das Verhalten der CSS-Kaskade: Bei Konflikten überschreiben später deklarierte Eigenschaften frühere.',
20
20
  },
21
21
  {
22
22
  question: 'Funktioniert es auch mit komplexen Selektoren wie :hover oder Media Queries?',
23
23
  answer:
24
- 'Das Werkzeug verarbeitet Klassen-, ID-, Attribut- und strukturelle Pseudo-Klassen-Selektoren, die DOMParser auflösen kann. Zustandsabhängige Selektoren wie :hover und Media Queries können nicht inline eingebettet werden sie hängen von der Laufzeitumgebung ab und werden ignoriert.',
24
+ 'Das Werkzeug verarbeitet Klassen-, ID-, Attribut- und strukturelle Pseudo-Klassen-Selektoren, die DOMParser auflösen kann. Zustandsabhängige Selektoren wie :hover und Media Queries können nicht inline eingebettet werden - sie hängen von der Laufzeitumgebung ab und werden ignoriert.',
25
25
  },
26
26
  {
27
27
  question: 'Wird mein HTML- und CSS-Code an einen Server gesendet?',
28
28
  answer:
29
- 'Nein. Die gesamte Verarbeitung findet zu 100 % in Ihrem Browser mithilfe der nativen DOMParser-API statt. Kein einziges Byte Ihres Codes verlässt Ihr Gerät das garantiert vollständige Privatsphäre, auch bei Vorlagen mit vertraulichen Inhalten.',
29
+ 'Nein. Die gesamte Verarbeitung findet zu 100 % in Ihrem Browser mithilfe der nativen DOMParser-API statt. Kein einziges Byte Ihres Codes verlässt Ihr Gerät - das garantiert vollständige Privatsphäre, auch bei Vorlagen mit vertraulichen Inhalten.',
30
30
  },
31
31
  ];
32
32
 
33
33
  const howToData = [
34
34
  {
35
35
  name: 'Fügen Sie Ihr HTML ein',
36
- text: 'Schreiben oder fügen Sie das HTML, das Sie verarbeiten möchten, in das Feld Original-HTML" ein. Es kann sich um ein Fragment oder ein vollständiges Dokument handeln.',
36
+ text: 'Schreiben oder fügen Sie das HTML, das Sie verarbeiten möchten, in das Feld "Original-HTML" ein. Es kann sich um ein Fragment oder ein vollständiges Dokument handeln.',
37
37
  },
38
38
  {
39
39
  name: 'CSS-Regeln hinzufügen',
40
- text: 'Fügen Sie die Klassen und IDs, die Sie einbetten möchten, in das Feld CSS-Regeln" ein. Das Werkzeug wendet sie unter Berücksichtigung der Selektorspezifität an.',
40
+ text: 'Fügen Sie die Klassen und IDs, die Sie einbetten möchten, in das Feld "CSS-Regeln" ein. Das Werkzeug wendet sie unter Berücksichtigung der Selektorspezifität an.',
41
41
  },
42
42
  {
43
43
  name: 'Konvertieren und kopieren',
44
- text: 'Klicken Sie auf CSS in HTML einbetten". Das Ergebnis mit allen Inline-Styles erscheint darunter bereit zum Kopieren und Einfügen in Ihren E-Mail-Manager oder Ihr CMS.',
44
+ text: 'Klicken Sie auf "CSS in HTML einbetten". Das Ergebnis mit allen Inline-Styles erscheint darunter - bereit zum Kopieren und Einfügen in Ihren E-Mail-Manager oder Ihr CMS.',
45
45
  },
46
46
  ];
47
47
 
@@ -19,7 +19,7 @@ const faqData = [
19
19
  'La herramienta respeta los estilos inline existentes y añade las nuevas propiedades a continuación, simulando el comportamiento de la cascada CSS: las propiedades declaradas más tarde sobreescriben las anteriores en caso de conflicto.',
20
20
  },
21
21
  {
22
- question: '¿Funciona con selectores complejos como :hover o media queries?',
22
+ question: '¿Funciona con selectores complejos como hover o media queries?',
23
23
  answer:
24
24
  'La herramienta procesa selectores de clase, id, atributos y pseudo-clases estructurales que DOMParser puede resolver. Los selectores dependientes de estado como :hover y las media queries no se pueden inlinear (ya que dependen del entorno en tiempo de ejecución) y son ignorados.',
25
25
  },
@@ -16,7 +16,7 @@ const faqData = [
16
16
  {
17
17
  question: 'Que se passe-t-il si un élément a déjà son propre attribut style ?',
18
18
  answer:
19
- 'L\'outil respecte les styles inline existants et ajoute les nouvelles propriétés à la suite, simulant le comportement de la cascade CSS : les propriétés déclarées plus tard écrasent les précédentes en cas de conflit.',
19
+ 'L\'outil respecte les styles inline existants et ajoute les nouvelles propriétés à la suite, simulant le comportement de la cascade CSS: les propriétés déclarées plus tard écrasent les précédentes en cas de conflit.',
20
20
  },
21
21
  {
22
22
  question: 'Fonctionne-t-il avec des sélecteurs complexes comme :hover ou les media queries ?',
@@ -124,11 +124,11 @@ export const content: ToolLocaleContent<CssToInlineConverterUI> = {
124
124
  },
125
125
  {
126
126
  type: 'paragraph',
127
- html: 'Lors du développement d\'applications web modernes, nous sommes habitués à séparer les responsabilités : le HTML construit la structure, et un fichier CSS externe apporte tout le style visuel. Cependant, tous les environnements ne font pas confiance aux feuilles de style externes ni aux balises globales <code>&lt;style&gt;</code>.',
127
+ html: 'Lors du développement d\'applications web modernes, nous sommes habitués à séparer les responsabilités: le HTML construit la structure, et un fichier CSS externe apporte tout le style visuel. Cependant, tous les environnements ne font pas confiance aux feuilles de style externes ni aux balises globales <code>&lt;style&gt;</code>.',
128
128
  },
129
129
  {
130
130
  type: 'paragraph',
131
- html: 'Le cas d\'usage le plus populaire où le CSS externe échoue est le <strong>Développement de Modèles d\'Email</strong>. Dans ces environnements, la seule façon fiable qu\'une police, couleur ou marge se rende correctement est qu\'elle soit imbriquée directement dans la balise : <code>&lt;span style="color: red;"&gt;</code>.',
131
+ html: 'Le cas d\'usage le plus populaire où le CSS externe échoue est le <strong>Développement de Modèles d\'Email</strong>. Dans ces environnements, la seule façon fiable qu\'une police, couleur ou marge se rende correctement est qu\'elle soit imbriquée directement dans la balise: <code>&lt;span style="color: red;"&gt;</code>.',
132
132
  },
133
133
  {
134
134
  type: 'title',
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await cssToInlineConverter.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 }} />}
@@ -5,7 +5,7 @@ import type { DuplicateCssRemoverUI } from '../ui';
5
5
  const slug = 'doppeltes-css-entfernen';
6
6
  const title = 'Doppelten CSS Code online entfernen. Stylesheets vereinheitlichen und bereinigen';
7
7
  const description =
8
- 'Kostenloses Tool zum Bereinigen und Entfernen doppelter CSS-Regeln. Fasst redundante Selektoren zusammen, respektiert die Kaskade und reduziert sofort die Dateigröße direkt im Browser.';
8
+ 'Kostenloses Tool zum Bereinigen und Entfernen doppelter CSS-Regeln. Fasst redundante Selektoren zusammen, respektiert die Kaskade und reduziert sofort die Dateigröße - direkt im Browser.';
9
9
 
10
10
  const faqData = [
11
11
  {
@@ -26,22 +26,22 @@ const faqData = [
26
26
  {
27
27
  question: 'Wird mein CSS an einen Server übertragen?',
28
28
  answer:
29
- 'Nein. Die gesamte Verarbeitung findet direkt in Ihrem Browser per lokalem JavaScript statt. Kein Teil Ihres CSS wird an externe Server übertragen Ihr Code bleibt vollständig privat.',
29
+ 'Nein. Die gesamte Verarbeitung findet direkt in Ihrem Browser per lokalem JavaScript statt. Kein Teil Ihres CSS wird an externe Server übertragen - Ihr Code bleibt vollständig privat.',
30
30
  },
31
31
  ];
32
32
 
33
33
  const howToData = [
34
34
  {
35
35
  name: 'Ihren CSS Code einfügen',
36
- text: 'Kopieren Sie den Inhalt Ihrer CSS-Datei mit wiederholten Selektoren und fügen Sie ihn in das linke Feld Dirty / Duplicate CSS" ein.',
36
+ text: 'Kopieren Sie den Inhalt Ihrer CSS-Datei mit wiederholten Selektoren und fügen Sie ihn in das linke Feld "Dirty / Duplicate CSS" ein.',
37
37
  },
38
38
  {
39
39
  name: 'Bereinigung starten',
40
- text: 'Klicken Sie auf CSS bereinigen und vereinheitlichen". Das Tool durchsucht alle Selektoren, führt Eigenschaften zusammen und entfernt redundante Blöcke.',
40
+ text: 'Klicken Sie auf "CSS bereinigen und vereinheitlichen". Das Tool durchsucht alle Selektoren, führt Eigenschaften zusammen und entfernt redundante Blöcke.',
41
41
  },
42
42
  {
43
43
  name: 'Ergebnis prüfen und kopieren',
44
- text: 'Sehen Sie sich die Byte-Einsparungen an und kopieren Sie das optimierte CSS über den Button Code kopieren" direkt in Ihr Projekt.',
44
+ text: 'Sehen Sie sich die Byte-Einsparungen an und kopieren Sie das optimierte CSS über den Button "Code kopieren" direkt in Ihr Projekt.',
45
45
  },
46
46
  ];
47
47
 
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
141
141
  },
142
142
  {
143
143
  type: 'tip',
144
- html: 'Redundante Stile zu bereinigen ist keine reine Ordnungsfrage es ist eine messbare und unmittelbare Verbesserung wichtiger Metriken wie dem <strong>First Contentful Paint (FCP)</strong>.',
144
+ html: 'Redundante Stile zu bereinigen ist keine reine Ordnungsfrage - es ist eine messbare und unmittelbare Verbesserung wichtiger Metriken wie dem <strong>First Contentful Paint (FCP)</strong>.',
145
145
  },
146
146
  {
147
147
  type: 'title',
@@ -161,7 +161,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
161
161
  },
162
162
  {
163
163
  type: 'paragraph',
164
- html: 'Schluss damit, Kilobytes toter Textdaten an die Mobilgeräte Ihrer Nutzer zu schicken. Vereinheitlichen Sie Ihren Code in Millisekunden vollständig offline, direkt im Browser.',
164
+ html: 'Schluss damit, Kilobytes toter Textdaten an die Mobilgeräte Ihrer Nutzer zu schicken. Vereinheitlichen Sie Ihren Code in Millisekunden - vollständig offline, direkt im Browser.',
165
165
  },
166
166
  ],
167
167
  };
@@ -16,7 +16,7 @@ const faqData = [
16
16
  {
17
17
  question: 'Des propriétés seront-elles perdues lors de la suppression des doublons ?',
18
18
  answer:
19
- 'Non. L\'algorithme respecte strictement la cascade CSS : pour les propriétés en conflit sous le même sélecteur, il préserve toujours la dernière déclarée. Les propriétés uniques de chaque bloc sont combinées sous un sélecteur unifié.',
19
+ 'Non. L\'algorithme respecte strictement la cascade CSS: pour les propriétés en conflit sous le même sélecteur, il préserve toujours la dernière déclarée. Les propriétés uniques de chaque bloc sont combinées sous un sélecteur unifié.',
20
20
  },
21
21
  {
22
22
  question: 'Fonctionne-t-il avec du CSS minifié ou des commentaires ?',
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
141
141
  },
142
142
  {
143
143
  type: 'tip',
144
- html: 'Membuang gaya yang redundan bukan sekadar soal kerapian kode ini adalah peningkatan nyata dan terukur pada metrik penting seperti <strong>First Contentful Paint (FCP)</strong>.',
144
+ html: 'Membuang gaya yang redundan bukan sekadar soal kerapian kode - ini adalah peningkatan nyata dan terukur pada metrik penting seperti <strong>First Contentful Paint (FCP)</strong>.',
145
145
  },
146
146
  {
147
147
  type: 'title',
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
141
141
  },
142
142
  {
143
143
  type: 'tip',
144
- html: 'Overbodige stijlen verwijderen gaat niet alleen om codenetjes het is een meetbare en directe verbetering van vitale metrics zoals de <strong>First Contentful Paint (FCP)</strong>.',
144
+ html: 'Overbodige stijlen verwijderen gaat niet alleen om codenetjes - het is een meetbare en directe verbetering van vitale metrics zoals de <strong>First Contentful Paint (FCP)</strong>.',
145
145
  },
146
146
  {
147
147
  type: 'title',
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
141
141
  },
142
142
  {
143
143
  type: 'tip',
144
- html: 'Usuwanie nadmiarowych stylów to nie tylko kwestia porządku w kodzie to mierzalna i natychmiastowa poprawa kluczowych metryk, takich jak <strong>First Contentful Paint (FCP)</strong>.',
144
+ html: 'Usuwanie nadmiarowych stylów to nie tylko kwestia porządku w kodzie - to mierzalna i natychmiastowa poprawa kluczowych metryk, takich jak <strong>First Contentful Paint (FCP)</strong>.',
145
145
  },
146
146
  {
147
147
  type: 'title',
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
141
141
  },
142
142
  {
143
143
  type: 'tip',
144
- html: 'Purgar estilos redundantes não é apenas uma questão de organização do código é uma melhoria mensurável e imediata em métricas vitais como o <strong>First Contentful Paint (FCP)</strong>.',
144
+ html: 'Purgar estilos redundantes não é apenas uma questão de organização do código - é uma melhoria mensurável e imediata em métricas vitais como o <strong>First Contentful Paint (FCP)</strong>.',
145
145
  },
146
146
  {
147
147
  type: 'title',
@@ -26,7 +26,7 @@ const faqData = [
26
26
  {
27
27
  question: 'Отправляется ли мой CSS на сервер?',
28
28
  answer:
29
- 'Нет. Вся обработка происходит прямо в браузере с помощью локального JavaScript. Никакая часть вашего CSS не передаётся на внешние серверы полная конфиденциальность кода гарантирована.',
29
+ 'Нет. Вся обработка происходит прямо в браузере с помощью локального JavaScript. Никакая часть вашего CSS не передаётся на внешние серверы - полная конфиденциальность кода гарантирована.',
30
30
  },
31
31
  ];
32
32
 
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
141
141
  },
142
142
  {
143
143
  type: 'tip',
144
- html: 'Удаление лишних стилей это не просто вопрос чистоты кода. Это измеримое и немедленное улучшение ключевых показателей, таких как <strong>First Contentful Paint (FCP)</strong>.',
144
+ html: 'Удаление лишних стилей - это не просто вопрос чистоты кода. Это измеримое и немедленное улучшение ключевых показателей, таких как <strong>First Contentful Paint (FCP)</strong>.',
145
145
  },
146
146
  {
147
147
  type: 'title',
@@ -155,7 +155,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
155
155
  {
156
156
  type: 'list',
157
157
  items: [
158
- 'Представьте, что у вас есть правило <code>.box { color: red; }</code>, а сотню строк спустя <code>.box { padding: 10px; color: blue; }</code>. Инструмент объединит оба блока под одним селектором <code>.box</code>, включив padding.',
158
+ 'Представьте, что у вас есть правило <code>.box { color: red; }</code>, а сотню строк спустя - <code>.box { padding: 10px; color: blue; }</code>. Инструмент объединит оба блока под одним селектором <code>.box</code>, включив padding.',
159
159
  '<strong>Сохранение каскада CSS:</strong> При прямых конфликтах алгоритм строго сохраняет последнее объявленное свойство. Это гарантирует, что ваша вёрстка не сломается после очистки документа.',
160
160
  ],
161
161
  },
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
141
141
  },
142
142
  {
143
143
  type: 'tip',
144
- html: 'Att rensa bort redundanta stilar handlar inte bara om kodordning det är en mätbar och omedelbar förbättring av viktiga mätvärden som <strong>First Contentful Paint (FCP)</strong>.',
144
+ html: 'Att rensa bort redundanta stilar handlar inte bara om kodordning - det är en mätbar och omedelbar förbättring av viktiga mätvärden som <strong>First Contentful Paint (FCP)</strong>.',
145
145
  },
146
146
  {
147
147
  type: 'title',
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await duplicateCssRemover.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 }} />}