@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
@@ -33,15 +33,15 @@ const faqData = [
33
33
  const howToData = [
34
34
  {
35
35
  name: 'Rohtext einfügen',
36
- text: 'Geben Sie Ihre URL oder Zeichenfolge in das obere Feld Rohtext (lesbar) ein oder fügen Sie sie ein.',
36
+ text: 'Geben Sie Ihre URL oder Zeichenfolge in das obere Feld "Rohtext (lesbar)" ein oder fügen Sie sie ein.',
37
37
  },
38
38
  {
39
39
  name: 'Kodieren oder Dekodieren',
40
- text: 'Klicken Sie auf URL kodieren“, um den Text in das sichere Percent-Encoding-Format zu konvertieren, oder auf Dekodieren“, um eine kodierte URL wieder in ihre lesbare Form zu bringen.',
40
+ text: 'Klicken Sie auf "URL kodieren", um den Text in das sichere Percent-Encoding-Format zu konvertieren, oder auf "Dekodieren", um eine kodierte URL wieder in ihre lesbare Form zu bringen.',
41
41
  },
42
42
  {
43
43
  name: 'Ergebnis kopieren',
44
- text: 'Verwenden Sie die Schaltfläche Kopieren des entsprechenden Feldes, um das Ergebnis in Ihre Zwischenablage zu übernehmen.',
44
+ text: 'Verwenden Sie die Schaltfläche "Kopieren" des entsprechenden Feldes, um das Ergebnis in Ihre Zwischenablage zu übernehmen.',
45
45
  },
46
46
  ];
47
47
 
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
123
123
  },
124
124
  {
125
125
  type: 'paragraph',
126
- html: 'Beim Surfen im Internet oder beim Senden von Anfragen an Server betrachtet man eine URL (Uniform Resource Locator) oft einfach als Webadresse“. Das Internetprotokoll schreibt jedoch vor, dass URLs nur mit einem sehr eingeschränkten Satz von <strong>Standard-ASCII</strong>-Zeichen übertragen werden dürfen.',
126
+ html: 'Beim Surfen im Internet oder beim Senden von Anfragen an Server betrachtet man eine URL (Uniform Resource Locator) oft einfach als "Webadresse". Das Internetprotokoll schreibt jedoch vor, dass URLs nur mit einem sehr eingeschränkten Satz von <strong>Standard-ASCII</strong>-Zeichen übertragen werden dürfen.',
127
127
  },
128
128
  {
129
129
  type: 'paragraph',
@@ -136,7 +136,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
136
136
  },
137
137
  {
138
138
  type: 'paragraph',
139
- html: 'Wenn Sie dieses Tool verwenden, nimmt der Algorithmus jedes unsichere Zeichen (wie ein Leerzeichen oder einen Umlaut wie ä) und ersetzt es durch ein Prozentzeichen <code>%</code> gefolgt von zwei hexadezimalen Ziffern, die seinem Wert im UTF-8-Standard entsprechen.',
139
+ html: 'Wenn Sie dieses Tool verwenden, nimmt der Algorithmus jedes "unsichere" Zeichen (wie ein Leerzeichen oder einen Umlaut wie ä) und ersetzt es durch ein Prozentzeichen <code>%</code> gefolgt von zwei hexadezimalen Ziffern, die seinem Wert im UTF-8-Standard entsprechen.',
140
140
  },
141
141
  {
142
142
  type: 'list',
@@ -11,7 +11,7 @@ const faqData = [
11
11
  {
12
12
  question: 'Quels caractères sont encodés dans une URL ?',
13
13
  answer:
14
- "Tous les caractères non autorisés dans le standard ASCII pour les URLs sont encodés : espaces, lettres accentuées, symboles tels que &, =, +, #, ?, / et d'autres. Par exemple, un espace devient %20 et ñ devient %C3%B1.",
14
+ "Tous les caractères non autorisés dans le standard ASCII pour les URLs sont encodés: espaces, lettres accentuées, symboles tels que &, =, +, #, ?, / et d'autres. Par exemple, un espace devient %20 et ñ devient %C3%B1.",
15
15
  },
16
16
  {
17
17
  question: 'Quelle est la différence entre encodeURI et encodeURIComponent ?',
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
141
141
  {
142
142
  type: 'list',
143
143
  items: [
144
- '<strong>Exemple Basique :</strong> Un simple espace sera remplacé par son équivalent sécurisé : <code>%20</code>.',
144
+ '<strong>Exemple Basique:</strong> Un simple espace sera remplacé par son équivalent sécurisé: <code>%20</code>.',
145
145
  '<strong>Support Étendu :</strong> La lettre <code>á</code> devient <code>%C3%A1</code>, et <code>ñ</code> devient <code>%C3%B1</code>.',
146
146
  ],
147
147
  },
@@ -33,15 +33,15 @@ const faqData = [
33
33
  const howToData = [
34
34
  {
35
35
  name: 'Wklej surowy tekst',
36
- text: 'Wpisz lub wklej swój adres URL lub ciąg tekstowy w górnym polu Tekst surowy (czytelny)”.',
36
+ text: 'Wpisz lub wklej swój adres URL lub ciąg tekstowy w górnym polu "Tekst surowy (czytelny)".',
37
37
  },
38
38
  {
39
39
  name: 'Zakoduj lub dekoduj',
40
- text: 'Kliknij Koduj URL”, aby przekonwertować tekst na bezpieczny format Percent-Encoding, lub Dekoduj”, aby przywrócić zakodowany adres URL do jego czytelnej formy.',
40
+ text: 'Kliknij "Koduj URL", aby przekonwertować tekst na bezpieczny format Percent-Encoding, lub "Dekoduj", aby przywrócić zakodowany adres URL do jego czytelnej formy.',
41
41
  },
42
42
  {
43
43
  name: 'Skopiuj wynik',
44
- text: 'Użyj przycisku Kopiuj w odpowiednim polu, aby przenieść wynik do schowka.',
44
+ text: 'Użyj przycisku "Kopiuj" w odpowiednim polu, aby przenieść wynik do schowka.',
45
45
  },
46
46
  ];
47
47
 
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
123
123
  },
124
124
  {
125
125
  type: 'paragraph',
126
- html: 'Podczas przeglądania Internetu lub wysyłania żądań do serwerów często myślimy o adresie URL (Uniform Resource Locator) po prostu jako o adresie internetowym”. Jednak protokół internetowy dyktuje, że adresy URL mogą być przesyłane wyłącznie przy użyciu bardzo ograniczonego zestawu <strong>standardowych znaków ASCII</strong>.',
126
+ html: 'Podczas przeglądania Internetu lub wysyłania żądań do serwerów często myślimy o adresie URL (Uniform Resource Locator) po prostu jako o "adresie internetowym". Jednak protokół internetowy dyktuje, że adresy URL mogą być przesyłane wyłącznie przy użyciu bardzo ograniczonego zestawu <strong>standardowych znaków ASCII</strong>.',
127
127
  },
128
128
  {
129
129
  type: 'paragraph',
@@ -136,7 +136,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
136
136
  },
137
137
  {
138
138
  type: 'paragraph',
139
- html: 'Gdy korzystasz z tego narzędzia, algorytm pobiera dowolny niebezpieczny znak (taki jak spacja lub litera z akcentem, np. ñ) i zastępuje go znakiem procenta <code>%</code>, po którym następują dwie cyfry szesnastkowe odpowiadające jego wartości w standardzie UTF-8.',
139
+ html: 'Gdy korzystasz z tego narzędzia, algorytm pobiera dowolny "niebezpieczny" znak (taki jak spacja lub litera z akcentem, np. ñ) i zastępuje go znakiem procenta <code>%</code>, po którym następują dwie cyfry szesnastkowe odpowiadające jego wartości w standardzie UTF-8.',
140
140
  },
141
141
  {
142
142
  type: 'list',
@@ -11,7 +11,7 @@ const faqData = [
11
11
  {
12
12
  question: 'Какие символы кодируются в URL?',
13
13
  answer:
14
- 'Кодируются все символы, не разрешенные стандартом ASCII для URL: пробелы, буквы с диакритическими знаками, символы, такие как &, =, +, #, ?, / и другие. Например, пробел заменяется на %20, а ñ на %C3%B1.',
14
+ 'Кодируются все символы, не разрешенные стандартом ASCII для URL: пробелы, буквы с диакритическими знаками, символы, такие как &, =, +, #, ?, / и другие. Например, пробел заменяется на %20, а ñ - на %C3%B1.',
15
15
  },
16
16
  {
17
17
  question: 'В чем разница между encodeURI и encodeURIComponent?',
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: 'Почему в моем URL-адресе %20 вместо пробелов?',
23
23
  answer:
24
- 'Протокол HTTP не допускает использования пробелов в URL-адресах. %20 это представление пробела в кодировке Percent-Encoding согласно стандарту ASCII. Некоторые системы используют знак + в качестве альтернативы, но %20 является наиболее универсальным и безопасным.',
24
+ 'Протокол HTTP не допускает использования пробелов в URL-адресах. %20 - это представление пробела в кодировке Percent-Encoding согласно стандарту ASCII. Некоторые системы используют знак + в качестве альтернативы, но %20 является наиболее универсальным и безопасным.',
25
25
  },
26
26
  {
27
27
  question: 'Безопасно ли использовать этот инструмент с личными URL-адресами?',
@@ -33,15 +33,15 @@ const faqData = [
33
33
  const howToData = [
34
34
  {
35
35
  name: 'Вставьте исходный текст',
36
- text: 'Введите или вставьте ваш URL-адрес или текстовую строку в верхнее поле «Исходный текст (читаемый)».',
36
+ text: 'Введите или вставьте ваш URL-адрес или текстовую строку в верхнее поле "Исходный текст (читаемый)".',
37
37
  },
38
38
  {
39
39
  name: 'Закодируйте или декодируйте',
40
- text: 'Нажмите «Закодировать URL», чтобы преобразовать текст в безопасный формат Percent-Encoding, или «Декодировать», чтобы вернуть закодированный URL-адрес в читаемый вид.',
40
+ text: 'Нажмите "Закодировать URL", чтобы преобразовать текст в безопасный формат Percent-Encoding, или "Декодировать", чтобы вернуть закодированный URL-адрес в читаемый вид.',
41
41
  },
42
42
  {
43
43
  name: 'Скопируйте результат',
44
- text: 'Используйте кнопку «Копировать» в соответствующем поле, чтобы перенести результат в буфер обмена.',
44
+ text: 'Используйте кнопку "Копировать" в соответствующем поле, чтобы перенести результат в буфер обмена.',
45
45
  },
46
46
  ];
47
47
 
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
123
123
  },
124
124
  {
125
125
  type: 'paragraph',
126
- html: 'При просмотре веб-страниц или отправке запросов на серверы часто думают об URL (Uniform Resource Locator) просто как о «веб-адресе». Однако интернет-протокол диктует, что URL-адреса могут передаваться только с использованием очень ограниченного набора <strong>стандартных символов ASCII</strong>.',
126
+ html: 'При просмотре веб-страниц или отправке запросов на серверы часто думают об URL (Uniform Resource Locator) просто как о "веб-адресе". Однако интернет-протокол диктует, что URL-адреса могут передаваться только с использованием очень ограниченного набора <strong>стандартных символов ASCII</strong>.',
127
127
  },
128
128
  {
129
129
  type: 'paragraph',
@@ -136,13 +136,13 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
136
136
  },
137
137
  {
138
138
  type: 'paragraph',
139
- html: 'Когда вы используете этот инструмент, алгоритм берет любой «небезопасный» символ (например, пробел или букву с диакритическим знаком, такую как ñ) и заменяет его знаком процента <code>%</code>, за которым следуют две шестнадцатеричные цифры, соответствующие его значению в стандарте UTF-8.',
139
+ html: 'Когда вы используете этот инструмент, алгоритм берет любой "небезопасный" символ (например, пробел или букву с диакритическим знаком, такую как ñ) и заменяет его знаком процента <code>%</code>, за которым следуют две шестнадцатеричные цифры, соответствующие его значению в стандарте UTF-8.',
140
140
  },
141
141
  {
142
142
  type: 'list',
143
143
  items: [
144
144
  '<strong>Базовый пример:</strong> обычный пробел будет заменен его безопасным эквивалентом: <code>%20</code>.',
145
- '<strong>Расширенная поддержка:</strong> буква <code>ё</code> заменяется на <code>%D1%91</code>, а <code>й</code> на <code>%D0%B9</code>.',
145
+ '<strong>Расширенная поддержка:</strong> буква <code>ё</code> заменяется на <code>%D1%91</code>, а <code>й</code> - на <code>%D0%B9</code>.',
146
146
  ],
147
147
  },
148
148
  {
@@ -33,15 +33,15 @@ const faqData = [
33
33
  const howToData = [
34
34
  {
35
35
  name: 'Klistra in råtexten',
36
- text: 'Skriv eller klistra in din URL eller textsträng i det övre fältet Råtext (läsbar)”.',
36
+ text: 'Skriv eller klistra in din URL eller textsträng i det övre fältet "Råtext (läsbar)".',
37
37
  },
38
38
  {
39
39
  name: 'Koda eller avkoda',
40
- text: 'Klicka på Koda URL för att konvertera texten till det säkra Percent-Encoding-formatet, eller Avkoda för att återställa en kodad URL till dess läsbara form.',
40
+ text: 'Klicka på "Koda URL" för att konvertera texten till det säkra Percent-Encoding-formatet, eller "Avkoda" för att återställa en kodad URL till dess läsbara form.',
41
41
  },
42
42
  {
43
43
  name: 'Kopiera resultatet',
44
- text: 'Använd knappen Kopiera i motsvarande fält för att ta resultatet till ditt urklipp.',
44
+ text: 'Använd knappen "Kopiera" i motsvarande fält för att ta resultatet till ditt urklipp.',
45
45
  },
46
46
  ];
47
47
 
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
123
123
  },
124
124
  {
125
125
  type: 'paragraph',
126
- html: 'När man surfar på internet eller skickar förfrågningar till servrar är det vanligt att tänka på en URL (Uniform Resource Locator) helt enkelt som en webbadress”. Internetprotokoll föreskriver dock att URL:er endast kan överföras med en mycket begränsad uppsättning <strong>standard-ASCII</strong>-tecken.',
126
+ html: 'När man surfar på internet eller skickar förfrågningar till servrar är det vanligt att tänka på en URL (Uniform Resource Locator) helt enkelt som en "webbadress". Internetprotokoll föreskriver dock att URL:er endast kan överföras med en mycket begränsad uppsättning <strong>standard-ASCII</strong>-tecken.',
127
127
  },
128
128
  {
129
129
  type: 'paragraph',
@@ -136,7 +136,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
136
136
  },
137
137
  {
138
138
  type: 'paragraph',
139
- html: 'När du använder det här verktyget tar algoritmen alla osäkra tecken (som ett blanksteg eller ett tecken med accent som ñ) och ersätter det med ett procenttecken <code>%</code> följt av två hexadecimala siffror som motsvarar dess värde i UTF-8-standarden.',
139
+ html: 'När du använder det här verktyget tar algoritmen alla "osäkra" tecken (som ett blanksteg eller ett tecken med accent som ñ) och ersätter det med ett procenttecken <code>%</code> följt av två hexadecimala siffror som motsvarar dess värde i UTF-8-standarden.',
140
140
  },
141
141
  {
142
142
  type: 'list',
@@ -33,15 +33,15 @@ const faqData = [
33
33
  const howToData = [
34
34
  {
35
35
  name: '粘贴原始文本',
36
- text: '在上方“原始文本(可读)”字段中输入或粘贴您的 URL 或文本字符串。',
36
+ text: '在上方"原始文本(可读)"字段中输入或粘贴您的 URL 或文本字符串。',
37
37
  },
38
38
  {
39
39
  name: '编码或解码',
40
- text: '点击“URL 编码”将文本转换为安全的百分比编码格式,或点击“解码”将已编码的 URL 恢复为可读形式。',
40
+ text: '点击"URL 编码"将文本转换为安全的百分比编码格式,或点击"解码"将已编码的 URL 恢复为可读形式。',
41
41
  },
42
42
  {
43
43
  name: '复制结果',
44
- text: '使用对应字段的“复制”按钮将结果保存到剪贴板。',
44
+ text: '使用对应字段的"复制"按钮将结果保存到剪贴板。',
45
45
  },
46
46
  ];
47
47
 
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
123
123
  },
124
124
  {
125
125
  type: 'paragraph',
126
- html: '在浏览互联网或向服务器发送请求时,人们通常将 URL(统一资源定位符)简单地视为“网址”。然而,互联网协议规定 URL 只能使用非常有限的 <strong>标准 ASCII</strong> 字符集进行传输。',
126
+ html: '在浏览互联网或向服务器发送请求时,人们通常将 URL(统一资源定位符)简单地视为"网址"。然而,互联网协议规定 URL 只能使用非常有限的 <strong>标准 ASCII</strong> 字符集进行传输。',
127
127
  },
128
128
  {
129
129
  type: 'paragraph',
@@ -136,7 +136,7 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
136
136
  },
137
137
  {
138
138
  type: 'paragraph',
139
- html: '当您使用此工具时,算法会将任何“不安全”的字符(如空格或 ñ 等带重音符号的字母)替换为百分号 <code>%</code>,后跟与其在 UTF-8 标准中的值相对应的两个十六进制数字。',
139
+ html: '当您使用此工具时,算法会将任何"不安全"的字符(如空格或 ñ 等带重音符号的字母)替换为百分号 <code>%</code>,后跟与其在 UTF-8 标准中的值相对应的两个十六进制数字。',
140
140
  },
141
141
  {
142
142
  type: 'list',
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await urlEncoderDecoder.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 }} />}
@@ -15,7 +15,7 @@
15
15
  color: var(--urlc-text);
16
16
  }
17
17
 
18
- :global(.theme-dark) .urlc-root {
18
+ .theme-dark .urlc-root {
19
19
  --urlc-card-bg: #1e293b;
20
20
  --urlc-bg: #0f172a;
21
21
  --urlc-text: #f1f5f9;
@@ -17,7 +17,7 @@ const faqData = [
17
17
  },
18
18
  {
19
19
  question: 'Unterscheidet Google Analytics bei UTM zwischen Groß- und Kleinschreibung?',
20
- answer: 'Ja. google“, Google und GOOGLE werden als unterschiedliche Quellen behandelt. Achten Sie immer auf Konsistenz, am besten verwenden Sie nur Kleinschreibung.',
20
+ answer: 'Ja. "google", "Google" und "GOOGLE" werden als unterschiedliche Quellen behandelt. Achten Sie immer auf Konsistenz, am besten verwenden Sie nur Kleinschreibung.',
21
21
  },
22
22
  ];
23
23
 
@@ -107,7 +107,7 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
107
107
  {
108
108
  type: 'list',
109
109
  items: [
110
- '<strong>Einheitliche Schreibweise:</strong> Tools unterscheiden zwischen Google“, GOOGLE und google“. Verwenden Sie immer Kleinschreibung, um Duplikate zu vermeiden.',
110
+ '<strong>Einheitliche Schreibweise:</strong> Tools unterscheiden zwischen "Google", "GOOGLE" und "google". Verwenden Sie immer Kleinschreibung, um Duplikate zu vermeiden.',
111
111
  '<strong>Leerzeichen vermeiden:</strong> Leerzeichen werden zu %20. Verwenden Sie stattdessen Bindestriche (-) oder Unterstriche (_).',
112
112
  '<strong>Nicht bei internen Links verwenden:</strong> UTM-Tracking ist ausschließlich für externen Traffic gedacht. Bei internen Links unterbricht es die Sitzung und verfälscht wichtige Kennzahlen.',
113
113
  '<strong>Dokumentieren Sie Ihre Tags:</strong> Führen Sie Protokoll über alle verwendeten Kombinationen, um Inkonsistenzen zu vermeiden.',
@@ -17,7 +17,7 @@ const faqData = [
17
17
  },
18
18
  {
19
19
  question: 'Czy Google Analytics rozróżnia wielkość liter w UTM?',
20
- answer: 'Tak. google”, Google i GOOGLE będą traktowane jako różne źródła. Zawsze zachowuj spójność, najlepiej używając tylko małych liter.',
20
+ answer: 'Tak. "google", "Google" i "GOOGLE" będą traktowane jako różne źródła. Zawsze zachowuj spójność, najlepiej używając tylko małych liter.',
21
21
  },
22
22
  ];
23
23
 
@@ -81,8 +81,8 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
81
81
  faq: faqData,
82
82
  bibliographyTitle: 'Referencje',
83
83
  bibliography: [
84
- { name: 'Gromadzenie danych kampanii za pomocą niestandardowych adresów URL Pomoc Google Analytics (2024)', url: 'https://support.google.com/analytics/answer/1033863' },
85
- { name: 'Najlepsze praktyki tagowania adresów URL kampanii Blog VWO (2023)', url: 'https://vwo.com/blog/utm-tagging-best-practices/' },
84
+ { name: 'Gromadzenie danych kampanii za pomocą niestandardowych adresów URL - Pomoc Google Analytics (2024)', url: 'https://support.google.com/analytics/answer/1033863' },
85
+ { name: 'Najlepsze praktyki tagowania adresów URL kampanii - Blog VWO (2023)', url: 'https://vwo.com/blog/utm-tagging-best-practices/' },
86
86
  ],
87
87
  howTo: howToData,
88
88
  schemas: [faqSchema, howToSchema, appSchema],
@@ -99,7 +99,7 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
99
99
  '<strong>Źródło kampanii:</strong> Identyfikuje wyszukiwarkę, sieć społecznościową lub pochodzenie ruchu. Przykład: google, newsletter, facebook.',
100
100
  '<strong>Medium kampanii:</strong> Odnosi się do kanału marketingowego. Przykład: cpc, e-mail, social, banner, organic.',
101
101
  '<strong>Nazwa kampanii:</strong> Konkretna nazwa Twojej kampanii. Przykład: oferta_letnia_2025, app_launch_v2.',
102
- '<strong>Termin kampanii:</strong> W przypadku wyszukiwania płatnego słowa kluczowe, na które licytujesz. Przykład: kup_buty_sportowe.',
102
+ '<strong>Termin kampanii:</strong> W przypadku wyszukiwania płatnego - słowa kluczowe, na które licytujesz. Przykład: kup_buty_sportowe.',
103
103
  '<strong>Treść kampanii:</strong> Do testów A/B. Rozróżnia podobne elementy w ramach kampanii. Przykład: header_v1, sidebar_v2.',
104
104
  ],
105
105
  },
@@ -107,7 +107,7 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
107
107
  {
108
108
  type: 'list',
109
109
  items: [
110
- '<strong>Spójność wielkości liter:</strong> Narzędzia rozróżniają Google”, GOOGLE i google”. Zawsze używaj małych liter, aby uniknąć duplikatów.',
110
+ '<strong>Spójność wielkości liter:</strong> Narzędzia rozróżniają "Google", "GOOGLE" i "google". Zawsze używaj małych liter, aby uniknąć duplikatów.',
111
111
  '<strong>Unikaj spacji:</strong> Spacje zmieniają się w %20. Zamiast nich używaj łączników (-) lub podkreśleń (_).',
112
112
  '<strong>Nie używaj w linkach wewnętrznych:</strong> Śledzenie UTM służy wyłącznie do ruchu zewnętrznego. W linkach wewnętrznych przerywa sesję i psuje kluczowe wskaźniki.',
113
113
  '<strong>Dokumentuj swoje tagi:</strong> Prowadź rejestr wszystkich używanych kombinacji, aby zapobiec niespójnościom.',
@@ -17,7 +17,7 @@ const faqData = [
17
17
  },
18
18
  {
19
19
  question: 'Различает ли Google Analytics регистр в UTM?',
20
- answer: 'Да. «google», «Google» и «GOOGLE» будут рассматриваться как разные источники. Всегда соблюдайте единообразие, предпочтительно используя только строчные буквы.',
20
+ answer: 'Да. "google", "Google" и "GOOGLE" будут рассматриваться как разные источники. Всегда соблюдайте единообразие, предпочтительно используя только строчные буквы.',
21
21
  },
22
22
  ];
23
23
 
@@ -81,8 +81,8 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
81
81
  faq: faqData,
82
82
  bibliographyTitle: 'Ссылки',
83
83
  bibliography: [
84
- { name: 'Сбор данных кампании с помощью пользовательских URL Справка Google Analytics (2024)', url: 'https://support.google.com/analytics/answer/1033863' },
85
- { name: 'Лучшие практики для разметки URL кампаний Блог VWO (2023)', url: 'https://vwo.com/blog/utm-tagging-best-practices/' },
84
+ { name: 'Сбор данных кампании с помощью пользовательских URL - Справка Google Analytics (2024)', url: 'https://support.google.com/analytics/answer/1033863' },
85
+ { name: 'Лучшие практики для разметки URL кампаний - Блог VWO (2023)', url: 'https://vwo.com/blog/utm-tagging-best-practices/' },
86
86
  ],
87
87
  howTo: howToData,
88
88
  schemas: [faqSchema, howToSchema, appSchema],
@@ -90,7 +90,7 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
90
90
  { type: 'title', text: 'Генератор UTM: параметры отслеживания для Google Analytics', level: 2 },
91
91
  {
92
92
  type: 'paragraph',
93
- html: 'Параметры <strong>UTM</strong> (Urchin Tracking Module) это текстовые метки, добавляемые в конец URL-адреса для отслеживания веб-трафика. Наш генератор упрощает создание ссылок с отслеживанием для ваших цифровых маркетинговых кампаний.',
93
+ html: 'Параметры <strong>UTM</strong> (Urchin Tracking Module) - это текстовые метки, добавляемые в конец URL-адреса для отслеживания веб-трафика. Наш генератор упрощает создание ссылок с отслеживанием для ваших цифровых маркетинговых кампаний.',
94
94
  },
95
95
  { type: 'title', text: '5 столпов отслеживаемой ссылки', level: 3 },
96
96
  {
@@ -99,7 +99,7 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
99
99
  '<strong>Источник кампании:</strong> определяет поисковую систему, социальную сеть или источник трафика. Пример: google, newsletter, facebook.',
100
100
  '<strong>Канал кампании:</strong> относится к маркетинговому каналу. Пример: cpc, email, social, banner, organic.',
101
101
  '<strong>Название кампании:</strong> конкретное название вашей кампании. Пример: summer_offer_2025, app_launch_v2.',
102
- '<strong>Ключевое слово кампании:</strong> для платного поиска ключевые слова, по которым вы делаете ставки. Пример: buy_sports_shoes.',
102
+ '<strong>Ключевое слово кампании:</strong> для платного поиска - ключевые слова, по которым вы делаете ставки. Пример: buy_sports_shoes.',
103
103
  '<strong>Контент кампании:</strong> для A/B-тестирования. Позволяет различать похожие элементы в рамках одной кампании. Пример: header_v1, sidebar_v2.',
104
104
  ],
105
105
  },
@@ -107,7 +107,7 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
107
107
  {
108
108
  type: 'list',
109
109
  items: [
110
- '<strong>Единообразие регистра:</strong> инструменты различают «Google», «GOOGLE» и «google». Всегда используйте строчные буквы, чтобы избежать дубликатов.',
110
+ '<strong>Единообразие регистра:</strong> инструменты различают "Google", "GOOGLE" и "google". Всегда используйте строчные буквы, чтобы избежать дубликатов.',
111
111
  '<strong>Избегайте пробелов:</strong> пробелы превращаются в %20. Вместо них используйте дефисы (-) или подчеркивания (_).',
112
112
  '<strong>Не используйте на внутренних ссылках:</strong> отслеживание UTM предназначено исключительно для внешнего трафика. На внутренних ссылках оно прерывает сеанс и портит ключевые показатели.',
113
113
  '<strong>Документируйте свои теги:</strong> ведите учет всех используемых вами комбинаций, чтобы предотвратить несоответствия.',
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await utmGenerator.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
  box-shadow: 0 8px 32px rgba(31, 38, 135, 0.06);
15
15
  }
16
16
 
17
- :global(.theme-dark) .ug-container {
17
+ .theme-dark .ug-container {
18
18
  background: rgba(15, 23, 42, 0.75);
19
19
  border-color: rgba(255, 255, 255, 0.06);
20
20
  }
@@ -51,7 +51,7 @@
51
51
  color: rgb(100, 116, 139);
52
52
  }
53
53
 
54
- :global(.theme-dark) .ug-input-group label {
54
+ .theme-dark .ug-input-group label {
55
55
  color: rgb(148, 163, 184);
56
56
  }
57
57
 
@@ -64,7 +64,7 @@
64
64
  transition: all 0.2s ease;
65
65
  }
66
66
 
67
- :global(.theme-dark) .ug-input {
67
+ .theme-dark .ug-input {
68
68
  background: rgba(255, 255, 255, 0.04);
69
69
  border-color: rgb(51, 65, 85);
70
70
  color: rgb(203, 213, 225);
@@ -88,7 +88,7 @@
88
88
  border: 1px solid rgba(99, 102, 241, 0.2);
89
89
  }
90
90
 
91
- :global(.theme-dark) .ug-result {
91
+ .theme-dark .ug-result {
92
92
  background: rgba(99, 102, 241, 0.05);
93
93
  border-color: rgba(99, 102, 241, 0.15);
94
94
  }
@@ -108,7 +108,7 @@
108
108
  font-size: 0.875rem;
109
109
  }
110
110
 
111
- :global(.theme-dark) .ug-result-label {
111
+ .theme-dark .ug-result-label {
112
112
  color: rgb(203, 213, 225);
113
113
  }
114
114
 
@@ -122,7 +122,7 @@
122
122
  border: 1px solid rgba(0, 0, 0, 0.05);
123
123
  }
124
124
 
125
- :global(.theme-dark) .ug-result-url {
125
+ .theme-dark .ug-result-url {
126
126
  background: rgb(30, 41, 59);
127
127
  border-color: rgb(51, 65, 85);
128
128
  color: rgb(129, 140, 248);