@jjlmoya/utils-developer 1.14.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 (162) 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/i18n/de.ts +1 -1
  13. package/src/tool/aspectRatio/i18n/fr.ts +1 -1
  14. package/src/tool/aspectRatio/i18n/pl.ts +2 -2
  15. package/src/tool/aspectRatio/i18n/ru.ts +4 -4
  16. package/src/tool/aspectRatio/i18n/zh.ts +1 -1
  17. package/src/tool/aspectRatio/seo.astro +2 -1
  18. package/src/tool/calculadoraTiempoDatos/i18n/de.ts +1 -1
  19. package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +1 -1
  20. package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +5 -5
  21. package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +5 -5
  22. package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +1 -1
  23. package/src/tool/calculadoraTiempoDatos/seo.astro +2 -1
  24. package/src/tool/colorConverter/i18n/de.ts +1 -1
  25. package/src/tool/colorConverter/i18n/ru.ts +2 -2
  26. package/src/tool/colorConverter/seo.astro +2 -1
  27. package/src/tool/conversorExcelCsvHtml/i18n/es.ts +1 -1
  28. package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +1 -1
  29. package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +2 -2
  30. package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +2 -2
  31. package/src/tool/conversorExcelCsvHtml/seo.astro +2 -1
  32. package/src/tool/cronGenerator/i18n/de.ts +4 -4
  33. package/src/tool/cronGenerator/i18n/en.ts +1 -1
  34. package/src/tool/cronGenerator/i18n/es.ts +2 -2
  35. package/src/tool/cronGenerator/i18n/fr.ts +5 -5
  36. package/src/tool/cronGenerator/i18n/id.ts +1 -1
  37. package/src/tool/cronGenerator/i18n/nl.ts +1 -1
  38. package/src/tool/cronGenerator/i18n/pl.ts +8 -8
  39. package/src/tool/cronGenerator/i18n/pt.ts +1 -1
  40. package/src/tool/cronGenerator/i18n/ru.ts +9 -9
  41. package/src/tool/cronGenerator/i18n/sv.ts +1 -1
  42. package/src/tool/cronGenerator/i18n/zh.ts +3 -3
  43. package/src/tool/cronGenerator/seo.astro +2 -1
  44. package/src/tool/cssSpecificityCalculator/i18n/de.ts +1 -1
  45. package/src/tool/cssSpecificityCalculator/i18n/fr.ts +3 -3
  46. package/src/tool/cssSpecificityCalculator/i18n/pl.ts +2 -2
  47. package/src/tool/cssSpecificityCalculator/i18n/ru.ts +2 -2
  48. package/src/tool/cssSpecificityCalculator/seo.astro +2 -1
  49. package/src/tool/cssToInlineConverter/i18n/de.ts +6 -6
  50. package/src/tool/cssToInlineConverter/i18n/es.ts +1 -1
  51. package/src/tool/cssToInlineConverter/i18n/fr.ts +3 -3
  52. package/src/tool/cssToInlineConverter/seo.astro +2 -1
  53. package/src/tool/duplicateCssRemover/i18n/de.ts +7 -7
  54. package/src/tool/duplicateCssRemover/i18n/fr.ts +1 -1
  55. package/src/tool/duplicateCssRemover/i18n/id.ts +1 -1
  56. package/src/tool/duplicateCssRemover/i18n/nl.ts +1 -1
  57. package/src/tool/duplicateCssRemover/i18n/pl.ts +1 -1
  58. package/src/tool/duplicateCssRemover/i18n/pt.ts +1 -1
  59. package/src/tool/duplicateCssRemover/i18n/ru.ts +3 -3
  60. package/src/tool/duplicateCssRemover/i18n/sv.ts +1 -1
  61. package/src/tool/duplicateCssRemover/seo.astro +2 -1
  62. package/src/tool/generadorSecurityTxt/i18n/de.ts +5 -5
  63. package/src/tool/generadorSecurityTxt/i18n/ru.ts +2 -2
  64. package/src/tool/generadorSecurityTxt/seo.astro +2 -1
  65. package/src/tool/hashGenerator/i18n/ru.ts +5 -5
  66. package/src/tool/hashGenerator/i18n/zh.ts +2 -2
  67. package/src/tool/hashGenerator/seo.astro +2 -1
  68. package/src/tool/inspectorCertificadosSsl/i18n/de.ts +6 -6
  69. package/src/tool/inspectorCertificadosSsl/i18n/ru.ts +5 -5
  70. package/src/tool/inspectorCertificadosSsl/seo.astro +2 -1
  71. package/src/tool/jsonFormatter/i18n/de.ts +4 -4
  72. package/src/tool/jsonFormatter/i18n/en.ts +4 -4
  73. package/src/tool/jsonFormatter/i18n/es.ts +4 -4
  74. package/src/tool/jsonFormatter/i18n/fr.ts +4 -4
  75. package/src/tool/jsonFormatter/i18n/id.ts +4 -4
  76. package/src/tool/jsonFormatter/i18n/it.ts +4 -4
  77. package/src/tool/jsonFormatter/i18n/ja.ts +4 -4
  78. package/src/tool/jsonFormatter/i18n/ko.ts +4 -4
  79. package/src/tool/jsonFormatter/i18n/nl.ts +4 -4
  80. package/src/tool/jsonFormatter/i18n/pl.ts +4 -4
  81. package/src/tool/jsonFormatter/i18n/pt.ts +4 -4
  82. package/src/tool/jsonFormatter/i18n/ru.ts +5 -5
  83. package/src/tool/jsonFormatter/i18n/sv.ts +4 -4
  84. package/src/tool/jsonFormatter/i18n/tr.ts +4 -4
  85. package/src/tool/jsonFormatter/i18n/zh.ts +5 -5
  86. package/src/tool/jsonFormatter/seo.astro +2 -1
  87. package/src/tool/keycode/i18n/de.ts +7 -7
  88. package/src/tool/keycode/i18n/en.ts +5 -5
  89. package/src/tool/keycode/i18n/es.ts +5 -5
  90. package/src/tool/keycode/i18n/fr.ts +7 -7
  91. package/src/tool/keycode/i18n/id.ts +5 -5
  92. package/src/tool/keycode/i18n/it.ts +5 -5
  93. package/src/tool/keycode/i18n/ja.ts +5 -5
  94. package/src/tool/keycode/i18n/ko.ts +5 -5
  95. package/src/tool/keycode/i18n/nl.ts +5 -5
  96. package/src/tool/keycode/i18n/pl.ts +7 -7
  97. package/src/tool/keycode/i18n/pt.ts +5 -5
  98. package/src/tool/keycode/i18n/ru.ts +6 -6
  99. package/src/tool/keycode/i18n/sv.ts +5 -5
  100. package/src/tool/keycode/i18n/tr.ts +5 -5
  101. package/src/tool/keycode/i18n/zh.ts +5 -5
  102. package/src/tool/keycode/seo.astro +2 -1
  103. package/src/tool/llmCostCalculator/i18n/de.ts +4 -4
  104. package/src/tool/llmCostCalculator/i18n/en.ts +3 -3
  105. package/src/tool/llmCostCalculator/i18n/fr.ts +3 -3
  106. package/src/tool/llmCostCalculator/i18n/id.ts +3 -3
  107. package/src/tool/llmCostCalculator/i18n/pt.ts +3 -3
  108. package/src/tool/llmCostCalculator/i18n/ru.ts +3 -3
  109. package/src/tool/llmCostCalculator/i18n/sv.ts +3 -3
  110. package/src/tool/llmCostCalculator/i18n/tr.ts +3 -3
  111. package/src/tool/llmCostCalculator/i18n/zh.ts +3 -3
  112. package/src/tool/llmCostCalculator/seo.astro +2 -1
  113. package/src/tool/mobileMockupGenerator/i18n/es.ts +1 -1
  114. package/src/tool/mobileMockupGenerator/seo.astro +2 -1
  115. package/src/tool/musicalTypography/i18n/de.ts +1 -1
  116. package/src/tool/musicalTypography/i18n/fr.ts +1 -1
  117. package/src/tool/musicalTypography/i18n/id.ts +1 -1
  118. package/src/tool/musicalTypography/i18n/it.ts +1 -1
  119. package/src/tool/musicalTypography/i18n/ko.ts +1 -1
  120. package/src/tool/musicalTypography/i18n/ru.ts +3 -3
  121. package/src/tool/musicalTypography/seo.astro +2 -1
  122. package/src/tool/placeholderGenerator/i18n/de.ts +4 -4
  123. package/src/tool/placeholderGenerator/i18n/ru.ts +1 -1
  124. package/src/tool/placeholderGenerator/seo.astro +2 -1
  125. package/src/tool/promptLibrary/i18n/de.ts +1 -1
  126. package/src/tool/promptLibrary/seo.astro +2 -1
  127. package/src/tool/readabilityCalculator/i18n/de.ts +2 -2
  128. package/src/tool/readabilityCalculator/seo.astro +2 -1
  129. package/src/tool/readabilityCalculator/visual-readability-calculator-wcag-apca.css +87 -3
  130. package/src/tool/svgSanitizer/i18n/de.ts +2 -2
  131. package/src/tool/svgSanitizer/i18n/id.ts +1 -1
  132. package/src/tool/svgSanitizer/i18n/pl.ts +1 -1
  133. package/src/tool/svgSanitizer/i18n/ru.ts +7 -7
  134. package/src/tool/svgSanitizer/i18n/sv.ts +3 -3
  135. package/src/tool/svgSanitizer/i18n/tr.ts +3 -3
  136. package/src/tool/svgSanitizer/i18n/zh.ts +3 -3
  137. package/src/tool/svgSanitizer/seo.astro +2 -1
  138. package/src/tool/svgToCss/i18n/de.ts +2 -2
  139. package/src/tool/svgToCss/i18n/es.ts +1 -1
  140. package/src/tool/svgToCss/i18n/fr.ts +1 -1
  141. package/src/tool/svgToCss/i18n/pl.ts +1 -1
  142. package/src/tool/svgToCss/i18n/ru.ts +2 -2
  143. package/src/tool/svgToCss/i18n/zh.ts +2 -2
  144. package/src/tool/svgToCss/seo.astro +2 -1
  145. package/src/tool/urlCleaner/component.astro +23 -5
  146. package/src/tool/urlCleaner/i18n/de.ts +3 -3
  147. package/src/tool/urlCleaner/i18n/es.ts +1 -1
  148. package/src/tool/urlCleaner/i18n/id.ts +1 -1
  149. package/src/tool/urlCleaner/i18n/nl.ts +1 -1
  150. package/src/tool/urlCleaner/seo.astro +2 -1
  151. package/src/tool/urlCleaner/url-tracking-cleaner.css +92 -2
  152. package/src/tool/urlEncoderDecoder/i18n/de.ts +5 -5
  153. package/src/tool/urlEncoderDecoder/i18n/fr.ts +2 -2
  154. package/src/tool/urlEncoderDecoder/i18n/pl.ts +5 -5
  155. package/src/tool/urlEncoderDecoder/i18n/ru.ts +8 -8
  156. package/src/tool/urlEncoderDecoder/i18n/sv.ts +5 -5
  157. package/src/tool/urlEncoderDecoder/i18n/zh.ts +5 -5
  158. package/src/tool/urlEncoderDecoder/seo.astro +2 -1
  159. package/src/tool/utmGenerator/i18n/de.ts +2 -2
  160. package/src/tool/utmGenerator/i18n/pl.ts +5 -5
  161. package/src/tool/utmGenerator/i18n/ru.ts +6 -6
  162. package/src/tool/utmGenerator/seo.astro +2 -1
@@ -16,7 +16,7 @@ const faqData = [
16
16
  {
17
17
  question: 'Почему важно соблюдать правильные пропорции?',
18
18
  answer:
19
- 'Игнорирование соотношения сторон приводит к сплющенным или растянутым изображениям, появлению нежелательных черных полос (letterboxing) в видео и нарушению макета веб-компонентов на экранах разного размера. Соблюдение правильных пропорций залог профессионального вида.',
19
+ 'Игнорирование соотношения сторон приводит к сплющенным или растянутым изображениям, появлению нежелательных черных полос (letterboxing) в видео и нарушению макета веб-компонентов на экранах разного размера. Соблюдение правильных пропорций - залог профессионального вида.',
20
20
  },
21
21
  {
22
22
  question: 'Как рассчитать высоту на основе ширины при заданном соотношении?',
@@ -26,7 +26,7 @@ const faqData = [
26
26
  {
27
27
  question: 'Какое стандартное соотношение сторон используется для видео на YouTube?',
28
28
  answer:
29
- '16:9 это стандартное соотношение для YouTube и большинства современных видеоплатформ. Оно соответствует таким разрешениям, как 1280×720 (HD), 1920×1080 (Full HD) или 3840×2160 (4K UHD).',
29
+ '16:9 - это стандартное соотношение для YouTube и большинства современных видеоплатформ. Оно соответствует таким разрешениям, как 1280×720 (HD), 1920×1080 (Full HD) или 3840×2160 (4K UHD).',
30
30
  },
31
31
  {
32
32
  question: 'Какое соотношение сторон используется для вертикальных видео в соцсетях?',
@@ -42,7 +42,7 @@ const howToData = [
42
42
  },
43
43
  {
44
44
  name: 'Настройте масштаб',
45
- text: 'Измените значение ширины или высоты в разделе «Реальный масштаб». Инструмент автоматически рассчитает противоположное значение для сохранения пропорций.',
45
+ text: 'Измените значение ширины или высоты в разделе "Реальный масштаб". Инструмент автоматически рассчитает противоположное значение для сохранения пропорций.',
46
46
  },
47
47
  {
48
48
  name: 'Проверьте результат',
@@ -137,7 +137,7 @@ export const content: ToolLocaleContent<AspectRatioUI> = {
137
137
  },
138
138
  {
139
139
  type: 'paragraph',
140
- html: 'Несоблюдение соотношения сторон частая причина сплющенных фотографий, видео с неожиданной обрезкой (letterboxing) или веб-компонентов, макет которых нарушается при просмотре на разных устройствах от мобильных телефонов до ультрашироких мониторов.',
140
+ html: 'Несоблюдение соотношения сторон - частая причина сплющенных фотографий, видео с неожиданной обрезкой (letterboxing) или веб-компонентов, макет которых нарушается при просмотре на разных устройствах - от мобильных телефонов до ультрашироких мониторов.',
141
141
  },
142
142
  {
143
143
  type: 'title',
@@ -42,7 +42,7 @@ const howToData = [
42
42
  },
43
43
  {
44
44
  name: '调整缩放',
45
- text: '在“实际缩放”部分更改宽度或高度值。工具将自动计算对应的数值以保持比例。',
45
+ text: '在"实际缩放"部分更改宽度或高度值。工具将自动计算对应的数值以保持比例。',
46
46
  },
47
47
  {
48
48
  name: '查看预览',
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await aspectRatio.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 }} />}
@@ -36,7 +36,7 @@ const faqData = [
36
36
  const howToData = [
37
37
  { name: 'Website-Gewicht eingeben', text: 'Verwenden Sie Browser-Entwicklertools oder WebPageTest, um das Gewicht Ihrer Seite zu ermitteln. Geben Sie diesen Wert in MB ein.' },
38
38
  { name: 'Ladezeiten beobachten', text: 'Der Rechner zeigt an, wie viele Sekunden Ihre Website zum Laden bei 3G, 4G und 5G benötigt. Die realen Zeiten sind meist höher.' },
39
- { name: 'Lebenszeitauswirkung verstehen', text: 'Der Prozentsatz der Lebenszeit zeigt, wie viel Zeit jemand mit Warten verbringt. Nutzen Sie dies als Motivation zur Optimierung.' },
39
+ { name: 'Lebenszeitauswirkung verstehen', text: 'Der Prozentsatz der "Lebenszeit" zeigt, wie viel Zeit jemand mit Warten verbringt. Nutzen Sie dies als Motivation zur Optimierung.' },
40
40
  { name: 'Optimieren und neu berechnen', text: 'Messen Sie nach der Optimierung erneut und berechnen Sie neu. Sehen Sie, wie kleine Verbesserungen große Auswirkungen haben.' },
41
41
  ];
42
42
 
@@ -36,7 +36,7 @@ const faqData = [
36
36
  const howToData = [
37
37
  { name: 'Wpisz wagę swojej strony', text: 'Użyj narzędzi deweloperskich przeglądarki lub WebPageTest, aby sprawdzić wagę strony. Wpisz tę wartość w MB.' },
38
38
  { name: 'Obserwuj czasy ładowania', text: 'Kalkulator pokazuje, ile sekund zajmuje ładowanie strony w sieciach 3G, 4G i 5G. Czasy w rzeczywistości są zazwyczaj wyższe.' },
39
- { name: 'Zrozum wpływ na czas życia', text: 'Procent czasu życia pokazuje, ile czyjegoś życia mija na czekaniu. Użyj tego jako motywacji do optymalizacji.' },
39
+ { name: 'Zrozum wpływ na czas życia', text: 'Procent "czasu życia" pokazuje, ile czyjegoś życia mija na czekaniu. Użyj tego jako motywacji do optymalizacji.' },
40
40
  { name: 'Optymalizuj i oblicz ponownie', text: 'Po optymalizacji zmierz ponownie i wykonaj obliczenia. Zobacz, jak małe ulepszenia mają duży wpływ.' },
41
41
  ];
42
42
 
@@ -36,7 +36,7 @@ const faqData = [
36
36
  const howToData = [
37
37
  { name: 'Введите вес вашего сайта', text: 'Используйте инструменты разработчика браузера или WebPageTest, чтобы узнать вес вашей страницы. Введите это значение в МБ.' },
38
38
  { name: 'Наблюдайте за временем загрузки', text: 'Калькулятор показывает, сколько секунд требуется вашему сайту для загрузки на 3G, 4G и 5G. Реальное время обычно выше.' },
39
- { name: 'Поймите влияние на продолжительность жизни', text: 'Процент «времени жизни» показывает, сколько времени чьей-то жизни тратится на ожидание. Используйте это как мотивацию для оптимизации.' },
39
+ { name: 'Поймите влияние на продолжительность жизни', text: 'Процент "времени жизни" показывает, сколько времени чьей-то жизни тратится на ожидание. Используйте это как мотивацию для оптимизации.' },
40
40
  { name: 'Оптимизируйте и пересчитайте', text: 'После оптимизации измерьте показатели снова и сделайте перерасчет. Посмотрите, как небольшие улучшения приносят значительный результат.' },
41
41
  ];
42
42
 
@@ -114,7 +114,7 @@ export const content: ToolLocaleContent<CalculadoraTiempoDatosUI> = {
114
114
  { type: 'title', text: 'Почему скорость загрузки сайта критически важна', level: 2 },
115
115
  {
116
116
  type: 'paragraph',
117
- html: 'В сегодняшнюю цифровую эпоху скорость загрузки сайта это не роскошь, а необходимость. Каждая миллисекунда имеет значение для удержания пользователей, улучшения рейтинга в поиске и максимизации конверсии. Современные пользователи ожидают, что страницы загрузятся менее чем за 3 секунды.',
117
+ html: 'В сегодняшнюю цифровую эпоху скорость загрузки сайта - это не роскошь, а необходимость. Каждая миллисекунда имеет значение для удержания пользователей, улучшения рейтинга в поиске и максимизации конверсии. Современные пользователи ожидают, что страницы загрузятся менее чем за 3 секунды.',
118
118
  },
119
119
  { type: 'title', text: 'Влияние на пользовательский опыт', level: 3 },
120
120
  {
@@ -125,9 +125,9 @@ export const content: ToolLocaleContent<CalculadoraTiempoDatosUI> = {
125
125
  {
126
126
  type: 'list',
127
127
  items: [
128
- '<strong>3G:</strong> 0,4 Мбит/с часто встречается в сельской местности и развивающихся странах',
129
- '<strong>4G/LTE:</strong> 10 Мбит/с стандарт в развитых странах',
130
- '<strong>5G:</strong> 100+ Мбит/с постепенно расширяется, но все еще ограничен',
128
+ '<strong>3G:</strong> 0,4 Мбит/с - часто встречается в сельской местности и развивающихся странах',
129
+ '<strong>4G/LTE:</strong> 10 Мбит/с - стандарт в развитых странах',
130
+ '<strong>5G:</strong> 100+ Мбит/с - постепенно расширяется, но все еще ограничен',
131
131
  ],
132
132
  },
133
133
  { type: 'title', text: 'Стратегии по уменьшению веса сайта', level: 3 },
@@ -21,11 +21,11 @@ const faqData = [
21
21
  },
22
22
  {
23
23
  question: 'Hur mycket bör min webbplats väga?',
24
- answer: 'Google rekommenderar att startsidan laddas på mindre än 3 sekunder via en typisk 4G-anslutning. För detta bör en webbplats helst väga mellan 1 och 2 MB. Det globala genomsnittet ligger dock nära 23 MB.',
24
+ answer: 'Google rekommenderar att startsidan laddas på mindre än 3 sekunder via en typisk 4G-anslutning. För detta bör en webbplats helst väga mellan 1 och 2 MB. Det globala genomsnittet ligger dock nära 2-3 MB.',
25
25
  },
26
26
  {
27
27
  question: 'Hur kan jag minska min webbplats vikt?',
28
- answer: 'Huvudstrategier: optimera bilder (5080 % av vikten), minifiera CSS och JavaScript, använda lazy loading, implementera webbläsarcache och använda en CDN. Bildoptimering är vanligtvis den mest effektiva faktorn.',
28
+ answer: 'Huvudstrategier: optimera bilder (50-80 % av vikten), minifiera CSS och JavaScript, använda lazy loading, implementera webbläsarcache och använda en CDN. Bildoptimering är vanligtvis den mest effektiva faktorn.',
29
29
  },
30
30
  {
31
31
  question: 'Påverkar laddningshastigheten Google-rankningen?',
@@ -36,7 +36,7 @@ const faqData = [
36
36
  const howToData = [
37
37
  { name: 'Ange din webbplats vikt', text: 'Använd webbläsarens utvecklarverktyg eller WebPageTest för att hitta din sidas vikt. Ange det värdet i MB.' },
38
38
  { name: 'Observera laddningstider', text: 'Kalkylatorn visar hur många sekunder det tar för din webbplats att ladda via 3G, 4G och 5G. Tiderna i verkligheten är vanligtvis högre.' },
39
- { name: 'Förstå livstidspåverkan', text: 'Procentandelen livstid visar hur mycket av någons liv som spenderas på att vänta. Använd detta som motivation för att optimera.' },
39
+ { name: 'Förstå livstidspåverkan', text: 'Procentandelen "livstid" visar hur mycket av någons liv som spenderas på att vänta. Använd detta som motivation för att optimera.' },
40
40
  { name: 'Optimera och beräkna om', text: 'Mät igen och beräkna om efter optimeringen. Se hur små förbättringar har stor betydelse.' },
41
41
  ];
42
42
 
@@ -134,8 +134,8 @@ export const content: ToolLocaleContent<CalculadoraTiempoDatosUI> = {
134
134
  {
135
135
  type: 'list',
136
136
  items: [
137
- '<strong>Bildoptimering:</strong> Representerar 5080 % av vikten. Minska med 4060 % med verktyg som TinyPNG.',
138
- '<strong>Minifiering:</strong> Ta bort onödig kod från CSS och JavaScript. Spara 3050 %.',
137
+ '<strong>Bildoptimering:</strong> Representerar 50-80 % av vikten. Minska med 40-60 % med verktyg som TinyPNG.',
138
+ '<strong>Minifiering:</strong> Ta bort onödig kod från CSS och JavaScript. Spara 30-50 %.',
139
139
  '<strong>Lazy Loading:</strong> Ladda bilder först när användaren scrollar till dem.',
140
140
  '<strong>Webbläsarcache:</strong> Cachelagra statiska filer i användarnas webbläsare.',
141
141
  '<strong>CDN:</strong> Leverera innehåll från servrar som ligger geografiskt nära.',
@@ -36,7 +36,7 @@ const faqData = [
36
36
  const howToData = [
37
37
  { name: '输入您的网站权重', text: '使用浏览器开发者工具或 WebPageTest 获取页面权重。以 MB 为单位输入该值。' },
38
38
  { name: '观察加载时间', text: '计算器显示网站在 3G、4G 和 5G 下加载所需的秒数。现实中的时间通常更高。' },
39
- { name: '了解对寿命的影响', text: '“寿命”百分比显示了一个人有多少生命花在了等待上。以此作为优化的动力。' },
39
+ { name: '了解对寿命的影响', text: '"寿命"百分比显示了一个人有多少生命花在了等待上。以此作为优化的动力。' },
40
40
  { name: '优化并重新计算', text: '优化后,再次测量并重新计算。观察微小的改进如何产生重大影响。' },
41
41
  ];
42
42
 
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await calculadoraTiempoDatos.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 }} />}
@@ -28,7 +28,7 @@ const faqData = [
28
28
  const howToData = [
29
29
  { name: 'Farbe auswählen', text: 'Verwenden Sie die Schieberegler für Rot, Grün und Blau oder geben Sie einen HEX-Code direkt in das Textfeld ein.' },
30
30
  { name: 'RGB-Kanäle anpassen', text: 'Bewegen Sie die Schieberegler, um die Intensität jedes Kanals zu ändern und die Aktualisierung in Echtzeit zu sehen.' },
31
- { name: 'Format kopieren', text: 'Klicken Sie auf die Schaltfläche Kopieren neben dem HEX-, RGB- oder HSL-Format, das Sie benötigen.' },
31
+ { name: 'Format kopieren', text: 'Klicken Sie auf die Schaltfläche "Kopieren" neben dem HEX-, RGB- oder HSL-Format, das Sie benötigen.' },
32
32
  { name: 'Harmonien erkunden', text: 'Klicken Sie auf die Harmoniefarben (komplementär, analog, triadisch), um sie in die Zwischenablage zu kopieren.' },
33
33
  ];
34
34
 
@@ -28,7 +28,7 @@ const faqData = [
28
28
  const howToData = [
29
29
  { name: 'Выберите цвет', text: 'Используйте ползунки красного, зеленого и синего или введите HEX-код прямо в текстовое поле.' },
30
30
  { name: 'Настройте каналы RGB', text: 'Передвигайте ползунки, чтобы изменить интенсивность каждого канала и увидеть обновление в режиме реального времени.' },
31
- { name: 'Скопируйте формат', text: 'Нажмите кнопку «Копировать» рядом с нужным форматом HEX, RGB или HSL.' },
31
+ { name: 'Скопируйте формат', text: 'Нажмите кнопку "Копировать" рядом с нужным форматом HEX, RGB или HSL.' },
32
32
  { name: 'Исследуйте гармонии', text: 'Нажмите на гармоничные цвета (комплементарные, аналогичные, триадические), чтобы скопировать их в буфер обмена.' },
33
33
  ];
34
34
 
@@ -97,7 +97,7 @@ export const content: ToolLocaleContent<ColorConverterUI> = {
97
97
  { type: 'title', text: 'Конвертер цветов RGB в HEX и HSL для разработчиков', level: 2 },
98
98
  {
99
99
  type: 'paragraph',
100
- html: 'В мире <strong>frontend-разработки</strong> и <strong>UI/UX дизайна</strong> управление цветом это постоянная задача. Наш <strong>онлайн-конвертер цветов</strong> позволяет мгновенно и с математической точностью преобразовывать значения между <strong>HEX, RGB и HSL</strong>.',
100
+ html: 'В мире <strong>frontend-разработки</strong> и <strong>UI/UX дизайна</strong> управление цветом - это постоянная задача. Наш <strong>онлайн-конвертер цветов</strong> позволяет мгновенно и с математической точностью преобразовывать значения между <strong>HEX, RGB и HSL</strong>.',
101
101
  },
102
102
  { type: 'title', text: 'Форматы цветов: HEX, RGB и HSL', level: 3 },
103
103
  {
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await colorConverter.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 }} />}
@@ -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 }} />}
@@ -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 }} />}
@@ -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
  ],