@jjlmoya/utils-developer 1.13.0 → 1.15.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 (184) 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/layouts/PreviewLayout.astro +1 -0
  5. package/src/pages/[locale]/[slug].astro +29 -12
  6. package/src/tests/diacritics_density.test.ts +118 -0
  7. package/src/tests/inverted_punctuation.test.ts +113 -0
  8. package/src/tests/no_en_dash.test.ts +73 -0
  9. package/src/tests/script_density.test.ts +94 -0
  10. package/src/tests/shared-test-helpers.ts +56 -0
  11. package/src/tests/tool_exports.test.ts +34 -0
  12. package/src/tool/aspectRatio/aspect-ratio-calculator.css +1 -1
  13. package/src/tool/aspectRatio/i18n/de.ts +1 -1
  14. package/src/tool/aspectRatio/i18n/fr.ts +1 -1
  15. package/src/tool/aspectRatio/i18n/pl.ts +2 -2
  16. package/src/tool/aspectRatio/i18n/ru.ts +4 -4
  17. package/src/tool/aspectRatio/i18n/zh.ts +1 -1
  18. package/src/tool/aspectRatio/seo.astro +2 -1
  19. package/src/tool/calculadoraTiempoDatos/data-time-calculator-web-speed-impact.css +26 -26
  20. package/src/tool/calculadoraTiempoDatos/i18n/de.ts +1 -1
  21. package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +1 -1
  22. package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +5 -5
  23. package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +5 -5
  24. package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +1 -1
  25. package/src/tool/calculadoraTiempoDatos/seo.astro +2 -1
  26. package/src/tool/colorConverter/color-converter-rgb-hex-hsl.css +9 -9
  27. package/src/tool/colorConverter/i18n/de.ts +1 -1
  28. package/src/tool/colorConverter/i18n/ru.ts +2 -2
  29. package/src/tool/colorConverter/seo.astro +2 -1
  30. package/src/tool/conversorExcelCsvHtml/excel-csv-html-table-converter.css +24 -24
  31. package/src/tool/conversorExcelCsvHtml/i18n/es.ts +1 -1
  32. package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +1 -1
  33. package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +2 -2
  34. package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +2 -2
  35. package/src/tool/conversorExcelCsvHtml/seo.astro +2 -1
  36. package/src/tool/cronGenerator/cron.css +5 -5
  37. package/src/tool/cronGenerator/i18n/de.ts +4 -4
  38. package/src/tool/cronGenerator/i18n/en.ts +1 -1
  39. package/src/tool/cronGenerator/i18n/es.ts +2 -2
  40. package/src/tool/cronGenerator/i18n/fr.ts +5 -5
  41. package/src/tool/cronGenerator/i18n/id.ts +1 -1
  42. package/src/tool/cronGenerator/i18n/nl.ts +1 -1
  43. package/src/tool/cronGenerator/i18n/pl.ts +8 -8
  44. package/src/tool/cronGenerator/i18n/pt.ts +1 -1
  45. package/src/tool/cronGenerator/i18n/ru.ts +9 -9
  46. package/src/tool/cronGenerator/i18n/sv.ts +1 -1
  47. package/src/tool/cronGenerator/i18n/zh.ts +3 -3
  48. package/src/tool/cronGenerator/seo.astro +2 -1
  49. package/src/tool/cssSpecificityCalculator/css-specificity-calculator.css +1 -1
  50. package/src/tool/cssSpecificityCalculator/i18n/de.ts +1 -1
  51. package/src/tool/cssSpecificityCalculator/i18n/fr.ts +3 -3
  52. package/src/tool/cssSpecificityCalculator/i18n/pl.ts +2 -2
  53. package/src/tool/cssSpecificityCalculator/i18n/ru.ts +2 -2
  54. package/src/tool/cssSpecificityCalculator/seo.astro +2 -1
  55. package/src/tool/cssToInlineConverter/css-to-inline-converter.css +1 -1
  56. package/src/tool/cssToInlineConverter/i18n/de.ts +6 -6
  57. package/src/tool/cssToInlineConverter/i18n/es.ts +1 -1
  58. package/src/tool/cssToInlineConverter/i18n/fr.ts +3 -3
  59. package/src/tool/cssToInlineConverter/seo.astro +2 -1
  60. package/src/tool/duplicateCssRemover/duplicate-css-remover.css +2 -2
  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/security-txt-generator-rfc-9116.css +9 -9
  73. package/src/tool/generadorSecurityTxt/seo.astro +2 -1
  74. package/src/tool/hashGenerator/hash-generator.css +10 -10
  75. package/src/tool/hashGenerator/i18n/ru.ts +5 -5
  76. package/src/tool/hashGenerator/i18n/zh.ts +2 -2
  77. package/src/tool/hashGenerator/seo.astro +2 -1
  78. package/src/tool/inspectorCertificadosSsl/i18n/de.ts +6 -6
  79. package/src/tool/inspectorCertificadosSsl/i18n/ru.ts +5 -5
  80. package/src/tool/inspectorCertificadosSsl/seo.astro +2 -1
  81. package/src/tool/inspectorCertificadosSsl/ssl-tls-certificate-inspector.css +9 -9
  82. package/src/tool/jsonFormatter/i18n/de.ts +4 -4
  83. package/src/tool/jsonFormatter/i18n/en.ts +4 -4
  84. package/src/tool/jsonFormatter/i18n/es.ts +4 -4
  85. package/src/tool/jsonFormatter/i18n/fr.ts +4 -4
  86. package/src/tool/jsonFormatter/i18n/id.ts +4 -4
  87. package/src/tool/jsonFormatter/i18n/it.ts +4 -4
  88. package/src/tool/jsonFormatter/i18n/ja.ts +4 -4
  89. package/src/tool/jsonFormatter/i18n/ko.ts +4 -4
  90. package/src/tool/jsonFormatter/i18n/nl.ts +4 -4
  91. package/src/tool/jsonFormatter/i18n/pl.ts +4 -4
  92. package/src/tool/jsonFormatter/i18n/pt.ts +4 -4
  93. package/src/tool/jsonFormatter/i18n/ru.ts +5 -5
  94. package/src/tool/jsonFormatter/i18n/sv.ts +4 -4
  95. package/src/tool/jsonFormatter/i18n/tr.ts +4 -4
  96. package/src/tool/jsonFormatter/i18n/zh.ts +5 -5
  97. package/src/tool/jsonFormatter/json-formatter.css +33 -33
  98. package/src/tool/jsonFormatter/seo.astro +2 -1
  99. package/src/tool/keycode/i18n/de.ts +7 -7
  100. package/src/tool/keycode/i18n/en.ts +5 -5
  101. package/src/tool/keycode/i18n/es.ts +5 -5
  102. package/src/tool/keycode/i18n/fr.ts +7 -7
  103. package/src/tool/keycode/i18n/id.ts +5 -5
  104. package/src/tool/keycode/i18n/it.ts +5 -5
  105. package/src/tool/keycode/i18n/ja.ts +5 -5
  106. package/src/tool/keycode/i18n/ko.ts +5 -5
  107. package/src/tool/keycode/i18n/nl.ts +5 -5
  108. package/src/tool/keycode/i18n/pl.ts +7 -7
  109. package/src/tool/keycode/i18n/pt.ts +5 -5
  110. package/src/tool/keycode/i18n/ru.ts +6 -6
  111. package/src/tool/keycode/i18n/sv.ts +5 -5
  112. package/src/tool/keycode/i18n/tr.ts +5 -5
  113. package/src/tool/keycode/i18n/zh.ts +5 -5
  114. package/src/tool/keycode/keycode.css +1 -1
  115. package/src/tool/keycode/seo.astro +2 -1
  116. package/src/tool/llmCostCalculator/i18n/de.ts +4 -4
  117. package/src/tool/llmCostCalculator/i18n/en.ts +3 -3
  118. package/src/tool/llmCostCalculator/i18n/fr.ts +3 -3
  119. package/src/tool/llmCostCalculator/i18n/id.ts +3 -3
  120. package/src/tool/llmCostCalculator/i18n/pt.ts +3 -3
  121. package/src/tool/llmCostCalculator/i18n/ru.ts +3 -3
  122. package/src/tool/llmCostCalculator/i18n/sv.ts +3 -3
  123. package/src/tool/llmCostCalculator/i18n/tr.ts +3 -3
  124. package/src/tool/llmCostCalculator/i18n/zh.ts +3 -3
  125. package/src/tool/llmCostCalculator/llm-cost-calculator.css +1 -1
  126. package/src/tool/llmCostCalculator/seo.astro +2 -1
  127. package/src/tool/mobileMockupGenerator/i18n/es.ts +1 -1
  128. package/src/tool/mobileMockupGenerator/mobile-mockup-generator.css +68 -68
  129. package/src/tool/mobileMockupGenerator/seo.astro +2 -1
  130. package/src/tool/musicalTypography/i18n/de.ts +1 -1
  131. package/src/tool/musicalTypography/i18n/fr.ts +1 -1
  132. package/src/tool/musicalTypography/i18n/id.ts +1 -1
  133. package/src/tool/musicalTypography/i18n/it.ts +1 -1
  134. package/src/tool/musicalTypography/i18n/ko.ts +1 -1
  135. package/src/tool/musicalTypography/i18n/ru.ts +3 -3
  136. package/src/tool/musicalTypography/musical-typography.css +8 -8
  137. package/src/tool/musicalTypography/seo.astro +2 -1
  138. package/src/tool/placeholderGenerator/i18n/de.ts +4 -4
  139. package/src/tool/placeholderGenerator/i18n/ru.ts +1 -1
  140. package/src/tool/placeholderGenerator/placeholder-image-generator.css +2 -2
  141. package/src/tool/placeholderGenerator/seo.astro +2 -1
  142. package/src/tool/promptLibrary/i18n/de.ts +1 -1
  143. package/src/tool/promptLibrary/prompt-library.css +30 -30
  144. package/src/tool/promptLibrary/seo.astro +2 -1
  145. package/src/tool/readabilityCalculator/i18n/de.ts +2 -2
  146. package/src/tool/readabilityCalculator/seo.astro +2 -1
  147. package/src/tool/readabilityCalculator/visual-readability-calculator-wcag-apca.css +98 -14
  148. package/src/tool/svgSanitizer/i18n/de.ts +2 -2
  149. package/src/tool/svgSanitizer/i18n/id.ts +1 -1
  150. package/src/tool/svgSanitizer/i18n/pl.ts +1 -1
  151. package/src/tool/svgSanitizer/i18n/ru.ts +7 -7
  152. package/src/tool/svgSanitizer/i18n/sv.ts +3 -3
  153. package/src/tool/svgSanitizer/i18n/tr.ts +3 -3
  154. package/src/tool/svgSanitizer/i18n/zh.ts +3 -3
  155. package/src/tool/svgSanitizer/seo.astro +2 -1
  156. package/src/tool/svgSanitizer/svg-sanitizer.css +7 -7
  157. package/src/tool/svgToCss/i18n/de.ts +2 -2
  158. package/src/tool/svgToCss/i18n/es.ts +1 -1
  159. package/src/tool/svgToCss/i18n/fr.ts +1 -1
  160. package/src/tool/svgToCss/i18n/pl.ts +1 -1
  161. package/src/tool/svgToCss/i18n/ru.ts +2 -2
  162. package/src/tool/svgToCss/i18n/zh.ts +2 -2
  163. package/src/tool/svgToCss/seo.astro +2 -1
  164. package/src/tool/svgToCss/svg-to-css-converter.css +2 -2
  165. package/src/tool/urlCleaner/component.astro +23 -5
  166. package/src/tool/urlCleaner/i18n/de.ts +3 -3
  167. package/src/tool/urlCleaner/i18n/es.ts +1 -1
  168. package/src/tool/urlCleaner/i18n/id.ts +1 -1
  169. package/src/tool/urlCleaner/i18n/nl.ts +1 -1
  170. package/src/tool/urlCleaner/seo.astro +2 -1
  171. package/src/tool/urlCleaner/url-tracking-cleaner.css +104 -14
  172. package/src/tool/urlEncoderDecoder/i18n/de.ts +5 -5
  173. package/src/tool/urlEncoderDecoder/i18n/fr.ts +2 -2
  174. package/src/tool/urlEncoderDecoder/i18n/pl.ts +5 -5
  175. package/src/tool/urlEncoderDecoder/i18n/ru.ts +8 -8
  176. package/src/tool/urlEncoderDecoder/i18n/sv.ts +5 -5
  177. package/src/tool/urlEncoderDecoder/i18n/zh.ts +5 -5
  178. package/src/tool/urlEncoderDecoder/seo.astro +2 -1
  179. package/src/tool/urlEncoderDecoder/url-encoder-decoder.css +1 -1
  180. package/src/tool/utmGenerator/i18n/de.ts +2 -2
  181. package/src/tool/utmGenerator/i18n/pl.ts +5 -5
  182. package/src/tool/utmGenerator/i18n/ru.ts +6 -6
  183. package/src/tool/utmGenerator/seo.astro +2 -1
  184. package/src/tool/utmGenerator/utm-generator.css +6 -6
@@ -8,7 +8,7 @@ const description = 'Convierte tus datos de Excel o CSV a tablas HTML semántica
8
8
 
9
9
  const faqData = [
10
10
  {
11
- question: '¿Cómo convierto un archivo Excel (.xlsx) a HTML?',
11
+ question: '¿Cómo convierto un archivo Excel (XLSX) a HTML?',
12
12
  answer: 'Primero, abre tu archivo en Excel y guárdalo como CSV (delimitado por comas). Luego, sube ese archivo CSV a nuestra herramienta o pega su contenido para obtener el código HTML de la tabla.',
13
13
  },
14
14
  {
@@ -40,7 +40,7 @@ const howToData = [
40
40
  },
41
41
  {
42
42
  name: 'Skopiuj kod',
43
- text: 'Przełącz się na kartę Kod HTML i skopiuj wynik, aby wkleić go na swojej stronie internetowej.',
43
+ text: 'Przełącz się na kartę "Kod HTML" i skopiuj wynik, aby wkleić go na swojej stronie internetowej.',
44
44
  },
45
45
  ];
46
46
 
@@ -13,7 +13,7 @@ const faqData = [
13
13
  },
14
14
  {
15
15
  question: 'Включает ли сгенерированный код стили CSS?',
16
- answer: 'Генератор создает чистый HTML с дополнительными классами для границ и «зебры» (чередующихся строк). Окончательные визуальные стили зависят от CSS вашего собственного сайта, что обеспечивает идеальную интеграцию.',
16
+ answer: 'Генератор создает чистый HTML с дополнительными классами для границ и "зебры" (чередующихся строк). Окончательные визуальные стили зависят от CSS вашего собственного сайта, что обеспечивает идеальную интеграцию.',
17
17
  },
18
18
  {
19
19
  question: 'Могу ли я загружать очень большие CSV-файлы?',
@@ -40,7 +40,7 @@ const howToData = [
40
40
  },
41
41
  {
42
42
  name: 'Скопируйте код',
43
- text: 'Перейдите на вкладку «Код HTML» и скопируйте результат для вставки на ваш сайт.',
43
+ text: 'Перейдите на вкладку "Код HTML" и скопируйте результат для вставки на ваш сайт.',
44
44
  },
45
45
  ];
46
46
 
@@ -21,7 +21,7 @@ const faqData = [
21
21
  },
22
22
  {
23
23
  question: '它与 Google 表格兼容吗?',
24
- answer: '绝对兼容。在 Google 表格中,转到“文件”>“下载”>“逗号分隔值 (.csv)”,然后将该文件用于我们的工具。',
24
+ answer: '绝对兼容。在 Google 表格中,转到"文件">"下载">"逗号分隔值 (.csv)",然后将该文件用于我们的工具。',
25
25
  },
26
26
  ];
27
27
 
@@ -40,7 +40,7 @@ const howToData = [
40
40
  },
41
41
  {
42
42
  name: '复制代码',
43
- text: '切换到“HTML 代码”选项卡并复制结果以粘贴到您的网站上。',
43
+ text: '切换到"HTML 代码"选项卡并复制结果以粘贴到您的网站上。',
44
44
  },
45
45
  ];
46
46
 
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await conversorExcelCsvHtml.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 }} />}
@@ -12,7 +12,7 @@
12
12
  color: var(--cron-text);
13
13
  }
14
14
 
15
- :global(.theme-dark) .cron-root {
15
+ .theme-dark .cron-root {
16
16
  --cron-card-bg: #1e293b;
17
17
  --cron-bg: #0f172a;
18
18
  --cron-text: #f1f5f9;
@@ -249,7 +249,7 @@
249
249
  border: 1px solid var(--cron-border);
250
250
  }
251
251
 
252
- :global(.cron-run-item) {
252
+ .cron-run-item {
253
253
  display: flex;
254
254
  align-items: center;
255
255
  justify-content: space-between;
@@ -260,18 +260,18 @@
260
260
  font-size: 0.825rem;
261
261
  }
262
262
 
263
- :global(.cron-run-date) {
263
+ .cron-run-date {
264
264
  font-weight: 600;
265
265
  color: var(--cron-text);
266
266
  text-transform: capitalize;
267
267
  }
268
268
 
269
- :global(.cron-run-rel) {
269
+ .cron-run-rel {
270
270
  font-size: 0.72rem;
271
271
  color: var(--cron-text-muted);
272
272
  }
273
273
 
274
- :global(.cron-no-runs) {
274
+ .cron-no-runs {
275
275
  padding: 1rem;
276
276
  text-align: center;
277
277
  color: var(--cron-text-muted);
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: 'Was bedeutet das Sternchen (*) in Cron?',
23
23
  answer:
24
- 'Das Sternchen ist ein Platzhalter, der alle bedeutet. Beispielsweise bedeutet ein * im Minutenfeld, dass die Aufgabe jede Minute des definierten Bereichs ausgeführt wird.',
24
+ 'Das Sternchen ist ein Platzhalter, der "alle" bedeutet. Beispielsweise bedeutet ein * im Minutenfeld, dass die Aufgabe jede Minute des definierten Bereichs ausgeführt wird.',
25
25
  },
26
26
  {
27
27
  question: 'Wie kann ich die anstehenden Ausführungen überprüfen?',
@@ -37,7 +37,7 @@ const howToData = [
37
37
  },
38
38
  {
39
39
  name: 'Erweiterte Details konfigurieren',
40
- text: 'Wechseln Sie zur Registerkarte Erweitert“, um die genauen Minuten, Stunden oder特定 Wochentage manuell zu definieren.',
40
+ text: 'Wechseln Sie zur Registerkarte "Erweitert", um die genauen Minuten, Stunden oder特定 Wochentage manuell zu definieren.',
41
41
  },
42
42
  {
43
43
  name: 'Übersetzung und Daten überprüfen',
@@ -157,7 +157,7 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
157
157
  },
158
158
  {
159
159
  type: 'paragraph',
160
- html: 'Obwohl wir im Zeitalter von <em>Serverless</em>-Servern und Cloud-Workflows leben, bleibt das <strong>Crontab</strong>-System das Rückgrat der globalen Technologieinfrastruktur. Von kleinen Blogs bis hin zu massiven Bankinfrastrukturen die Aufgabenplanung sorgt dafür, dass die digitale Welt läuft.',
160
+ html: 'Obwohl wir im Zeitalter von <em>Serverless</em>-Servern und Cloud-Workflows leben, bleibt das <strong>Crontab</strong>-System das Rückgrat der globalen Technologieinfrastruktur. Von kleinen Blogs bis hin zu massiven Bankinfrastrukturen - die Aufgabenplanung sorgt dafür, dass die digitale Welt läuft.',
161
161
  },
162
162
  {
163
163
  type: 'title',
@@ -185,7 +185,7 @@ export const content: ToolLocaleContent<CronGeneratorUI> = {
185
185
  },
186
186
  {
187
187
  type: 'paragraph',
188
- html: '90 % der Server laufen auf <strong>UTC</strong>. Wenn Sie eine Aufgabe für 02:00 Uhr morgens in Ihrer lokalen Zeitzone planen, wird sie möglicherweise zu einer unerwarteten Zeit ausgeführt. Außerdem hat Cron keinen Zugriff auf Ihren üblichen <code>$PATH</code> verwenden Sie immer absolute Pfade wie <code>/usr/local/bin/node</code>.',
188
+ html: '90 % der Server laufen auf <strong>UTC</strong>. Wenn Sie eine Aufgabe für 02:00 Uhr morgens in Ihrer lokalen Zeitzone planen, wird sie möglicherweise zu einer unerwarteten Zeit ausgeführt. Außerdem hat Cron keinen Zugriff auf Ihren üblichen <code>$PATH</code> - verwenden Sie immer absolute Pfade wie <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% of servers run on <strong>UTC</strong>. If you schedule a task at 02:00 AM thinking in your local timezone, it may run at an unexpected time. Also, Cron does not have access to your usual <code>$PATH</code> always use absolute paths like <code>/usr/local/bin/node</code>.',
188
+ html: '90% of servers run on <strong>UTC</strong>. If you schedule a task at 02:00 AM thinking in your local timezone, it may run at an unexpected time. Also, Cron does not have access to your usual <code>$PATH</code> - always use absolute paths like <code>/usr/local/bin/node</code>.',
189
189
  },
190
190
  ],
191
191
  };
@@ -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 }} />}
@@ -13,7 +13,7 @@
13
13
  color: var(--spec-text);
14
14
  }
15
15
 
16
- :global(.theme-dark) .spec-root {
16
+ .theme-dark .spec-root {
17
17
  --spec-card-bg: #1e293b;
18
18
  --spec-bg: #0f172a;
19
19
  --spec-text: #f1f5f9;
@@ -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 }} />}
@@ -13,7 +13,7 @@
13
13
  color: var(--cssi-text);
14
14
  }
15
15
 
16
- :global(.theme-dark) .cssi-root {
16
+ .theme-dark .cssi-root {
17
17
  --cssi-card-bg: #1e293b;
18
18
  --cssi-bg: #0f172a;
19
19
  --cssi-text: #f1f5f9;
@@ -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 }} />}
@@ -14,7 +14,7 @@
14
14
  color: var(--dupcss-text);
15
15
  }
16
16
 
17
- :global(.theme-dark) .dupcss-root {
17
+ .theme-dark .dupcss-root {
18
18
  --dupcss-card-bg: #1e293b;
19
19
  --dupcss-bg: #0f172a;
20
20
  --dupcss-text: #f1f5f9;
@@ -43,7 +43,7 @@
43
43
  overflow: hidden;
44
44
  }
45
45
 
46
- :global(.dupcss-stats-visible) {
46
+ .dupcss-stats-visible {
47
47
  display: flex;
48
48
  }
49
49