@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
@@ -100,15 +100,15 @@ export const content: ToolLocaleContent<KeycodeUI> = {
100
100
  bibliographyTitle: '참고 자료 및 표준',
101
101
  bibliography: [
102
102
  {
103
- name: 'MDN Web Docs KeyboardEvent',
103
+ name: 'MDN Web Docs - KeyboardEvent',
104
104
  url: 'https://developer.mozilla.org/ko/docs/Web/API/KeyboardEvent',
105
105
  },
106
106
  {
107
- name: 'UI Events Specification (W3C) KeyboardEvent',
107
+ name: 'UI Events Specification (W3C) - KeyboardEvent',
108
108
  url: 'https://www.w3.org/TR/uievents/#events-keyboardevents',
109
109
  },
110
110
  {
111
- name: 'MDN KeyboardEvent.code values',
111
+ name: 'MDN - KeyboardEvent.code values',
112
112
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values',
113
113
  },
114
114
  ],
@@ -135,12 +135,12 @@ export const content: ToolLocaleContent<KeycodeUI> = {
135
135
  },
136
136
  {
137
137
  type: 'card',
138
- title: 'event.code 물리적 키',
138
+ title: 'event.code: 물리적 키',
139
139
  html: '<p>QWERTY 명명법을 사용하여 키보드에서 키의 <strong>물리적 위치</strong> 식별자를 반환합니다. 예를 들어 AZERTY 키보드의 "A" 키는 <code>KeyQ</code>를 반환합니다. 문자가 아닌 위치가 중요한 게임 컨트롤에 이상적입니다.</p>',
140
140
  },
141
141
  {
142
142
  type: 'card',
143
- title: 'event.key 생성된 문자',
143
+ title: 'event.key: 생성된 문자',
144
144
  html: '<p>언어와 활성화된 수정자에 따라 생성된 <strong>문자 값</strong>을 반환합니다. Shift+A를 누르면 <code>"A"</code>가 반환되고, Shift 없이 누르면 <code>"a"</code>가 반환됩니다. 특수 키의 경우 <code>"Enter"</code>, <code>"Escape"</code>, <code>"ArrowUp"</code>과 같은 이름을 반환합니다.</p>',
145
145
  },
146
146
  {
@@ -100,15 +100,15 @@ export const content: ToolLocaleContent<KeycodeUI> = {
100
100
  bibliographyTitle: 'Referenties en Standaarden',
101
101
  bibliography: [
102
102
  {
103
- name: 'MDN Web Docs KeyboardEvent',
103
+ name: 'MDN Web Docs - KeyboardEvent',
104
104
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent',
105
105
  },
106
106
  {
107
- name: 'UI Events Specification (W3C) KeyboardEvent',
107
+ name: 'UI Events Specification (W3C) - KeyboardEvent',
108
108
  url: 'https://www.w3.org/TR/uievents/#events-keyboardevents',
109
109
  },
110
110
  {
111
- name: 'MDN KeyboardEvent.code values',
111
+ name: 'MDN - KeyboardEvent.code values',
112
112
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values',
113
113
  },
114
114
  ],
@@ -135,12 +135,12 @@ export const content: ToolLocaleContent<KeycodeUI> = {
135
135
  },
136
136
  {
137
137
  type: 'card',
138
- title: 'event.code De fysieke toets',
138
+ title: 'event.code: De fysieke toets',
139
139
  html: '<p>Geeft de identifier terug van de <strong>fysieke positie</strong> van de toets op het toetsenbord, met behulp van QWERTY-nomenclatuur. De "A"-toets op een AZERTY-toetsenbord geeft bijvoorbeeld <code>KeyQ</code> terug. Ideaal voor spelbesturingen waarbij de positie telt, niet het teken.</p>',
140
140
  },
141
141
  {
142
142
  type: 'card',
143
- title: 'event.key Het gegenereerde teken',
143
+ title: 'event.key: Het gegenereerde teken',
144
144
  html: '<p>Geeft de <strong>tekenwaarde</strong> terug die gegenereerd wordt op basis van taal en actieve modifiers. Shift+A indrukken geeft <code>"A"</code> terug; zonder Shift geeft het <code>"a"</code>. Voor speciale toetsen geeft het namen terug zoals <code>"Enter"</code>, <code>"Escape"</code>, <code>"ArrowUp"</code>.</p>',
145
145
  },
146
146
  {
@@ -41,7 +41,7 @@ const howToData = [
41
41
  },
42
42
  {
43
43
  name: 'Użyj fragmentów kodu',
44
- text: 'W sekcji Szybkie fragmenty" znajdziesz bloki kodu JavaScript gotowe do wklejenia bezpośrednio do swojego projektu.',
44
+ text: 'W sekcji "Szybkie fragmenty" znajdziesz bloki kodu JavaScript gotowe do wklejenia bezpośrednio do swojego projektu.',
45
45
  },
46
46
  ];
47
47
 
@@ -100,15 +100,15 @@ export const content: ToolLocaleContent<KeycodeUI> = {
100
100
  bibliographyTitle: 'Referencje i Standardy',
101
101
  bibliography: [
102
102
  {
103
- name: 'MDN Web Docs KeyboardEvent',
103
+ name: 'MDN Web Docs - KeyboardEvent',
104
104
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent',
105
105
  },
106
106
  {
107
- name: 'UI Events Specification (W3C) KeyboardEvent',
107
+ name: 'UI Events Specification (W3C) - KeyboardEvent',
108
108
  url: 'https://www.w3.org/TR/uievents/#events-keyboardevents',
109
109
  },
110
110
  {
111
- name: 'MDN KeyboardEvent.code values',
111
+ name: 'MDN - KeyboardEvent.code values',
112
112
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values',
113
113
  },
114
114
  ],
@@ -135,12 +135,12 @@ export const content: ToolLocaleContent<KeycodeUI> = {
135
135
  },
136
136
  {
137
137
  type: 'card',
138
- title: 'event.code Fizyczny klawisz',
139
- html: '<p>Zwraca identyfikator <strong>fizycznej pozycji</strong> klawisza na klawiaturze, używając nomenklatury QWERTY. Na przykład klawisz A" na klawiaturze AZERTY zwraca <code>KeyQ</code>. Idealny do sterowania grami, gdzie liczy się pozycja, a nie znak.</p>',
138
+ title: 'event.code: Fizyczny klawisz',
139
+ html: '<p>Zwraca identyfikator <strong>fizycznej pozycji</strong> klawisza na klawiaturze, używając nomenklatury QWERTY. Na przykład klawisz "A" na klawiaturze AZERTY zwraca <code>KeyQ</code>. Idealny do sterowania grami, gdzie liczy się pozycja, a nie znak.</p>',
140
140
  },
141
141
  {
142
142
  type: 'card',
143
- title: 'event.key Wygenerowany znak',
143
+ title: 'event.key: Wygenerowany znak',
144
144
  html: '<p>Zwraca <strong>wartość znaku</strong> wygenerowanego zgodnie z językiem i aktywnymi modyfikatorami. Naciśnięcie Shift+A zwraca <code>"A"</code>; bez Shift zwraca <code>"a"</code>. Dla klawiszy specjalnych zwraca nazwy jak <code>"Enter"</code>, <code>"Escape"</code>, <code>"ArrowUp"</code>.</p>',
145
145
  },
146
146
  {
@@ -100,15 +100,15 @@ export const content: ToolLocaleContent<KeycodeUI> = {
100
100
  bibliographyTitle: 'Referências e Padrões',
101
101
  bibliography: [
102
102
  {
103
- name: 'MDN Web Docs KeyboardEvent',
103
+ name: 'MDN Web Docs - KeyboardEvent',
104
104
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent',
105
105
  },
106
106
  {
107
- name: 'Especificação UI Events (W3C) KeyboardEvent',
107
+ name: 'Especificação UI Events (W3C) - KeyboardEvent',
108
108
  url: 'https://www.w3.org/TR/uievents/#events-keyboardevents',
109
109
  },
110
110
  {
111
- name: 'MDN Valores de KeyboardEvent.code',
111
+ name: 'MDN - Valores de KeyboardEvent.code',
112
112
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values',
113
113
  },
114
114
  ],
@@ -135,12 +135,12 @@ export const content: ToolLocaleContent<KeycodeUI> = {
135
135
  },
136
136
  {
137
137
  type: 'card',
138
- title: 'event.code A tecla física',
138
+ title: 'event.code: A tecla física',
139
139
  html: '<p>Retorna o identificador da <strong>posição física</strong> da tecla no teclado, usando nomenclatura QWERTY. Por exemplo, a tecla "A" em um teclado AZERTY retorna <code>KeyQ</code>. Ideal para controles de jogos onde a posição importa, não o carácter.</p>',
140
140
  },
141
141
  {
142
142
  type: 'card',
143
- title: 'event.key O carácter gerado',
143
+ title: 'event.key: O carácter gerado',
144
144
  html: '<p>Retorna o <strong>valor de carácter</strong> gerado de acordo com o idioma e modificadores ativos. Pressionar Shift+A retorna <code>"A"</code>; sem Shift retorna <code>"a"</code>. Para teclas especiais, retorna nomes como <code>"Enter"</code>, <code>"Escape"</code>, <code>"ArrowUp"</code>.</p>',
145
145
  },
146
146
  {
@@ -16,7 +16,7 @@ const faqData = [
16
16
  {
17
17
  question: 'Что такое event.which и почему это устаревшее?',
18
18
  answer:
19
- 'event.which это устаревшее свойство, которое возвращает числовой код ASCII для клавиши. Оно помечено как устаревшее в современных стандартах, потому что event.key и event.code заменяют его более точной и читаемой информацией. Оно показано в этом инструменте в образовательных целях.',
19
+ 'event.which - это устаревшее свойство, которое возвращает числовой код ASCII для клавиши. Оно помечено как устаревшее в современных стандартах, потому что event.key и event.code заменяют его более точной и читаемой информацией. Оно показано в этом инструменте в образовательных целях.',
20
20
  },
21
21
  {
22
22
  question: 'Что означает свойство location?',
@@ -100,15 +100,15 @@ export const content: ToolLocaleContent<KeycodeUI> = {
100
100
  bibliographyTitle: 'Ссылки и Стандарты',
101
101
  bibliography: [
102
102
  {
103
- name: 'MDN Web Docs KeyboardEvent',
103
+ name: 'MDN Web Docs - KeyboardEvent',
104
104
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent',
105
105
  },
106
106
  {
107
- name: 'Спецификация UI Events (W3C) KeyboardEvent',
107
+ name: 'Спецификация UI Events (W3C) - KeyboardEvent',
108
108
  url: 'https://www.w3.org/TR/uievents/#events-keyboardevents',
109
109
  },
110
110
  {
111
- name: 'MDN Значения KeyboardEvent.code',
111
+ name: 'MDN - Значения KeyboardEvent.code',
112
112
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values',
113
113
  },
114
114
  ],
@@ -135,12 +135,12 @@ export const content: ToolLocaleContent<KeycodeUI> = {
135
135
  },
136
136
  {
137
137
  type: 'card',
138
- title: 'event.code Физическая клавиша',
138
+ title: 'event.code: Физическая клавиша',
139
139
  html: '<p>Возвращает идентификатор <strong>физической позиции</strong> клавиши на клавиатуре, используя номенклатуру QWERTY. Например, клавиша "A" на клавиатуре AZERTY возвращает <code>KeyQ</code>. Идеально для управления игрой, где важна позиция, а не символ.</p>',
140
140
  },
141
141
  {
142
142
  type: 'card',
143
- title: 'event.key Сгенерированный символ',
143
+ title: 'event.key: Сгенерированный символ',
144
144
  html: '<p>Возвращает <strong>значение символа</strong>, сгенерированное в соответствии с языком и активными модификаторами. Нажатие Shift+A возвращает <code>"A"</code>; без Shift возвращает <code>"a"</code>. Для специальных клавиш возвращает названия, такие как <code>"Enter"</code>, <code>"Escape"</code>, <code>"ArrowUp"</code>.</p>',
145
145
  },
146
146
  {
@@ -100,15 +100,15 @@ export const content: ToolLocaleContent<KeycodeUI> = {
100
100
  bibliographyTitle: 'Referenser och Standarder',
101
101
  bibliography: [
102
102
  {
103
- name: 'MDN Web Docs KeyboardEvent',
103
+ name: 'MDN Web Docs - KeyboardEvent',
104
104
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent',
105
105
  },
106
106
  {
107
- name: 'UI Events Specification (W3C) KeyboardEvent',
107
+ name: 'UI Events Specification (W3C) - KeyboardEvent',
108
108
  url: 'https://www.w3.org/TR/uievents/#events-keyboardevents',
109
109
  },
110
110
  {
111
- name: 'MDN KeyboardEvent.code values',
111
+ name: 'MDN - KeyboardEvent.code values',
112
112
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values',
113
113
  },
114
114
  ],
@@ -135,12 +135,12 @@ export const content: ToolLocaleContent<KeycodeUI> = {
135
135
  },
136
136
  {
137
137
  type: 'card',
138
- title: 'event.code Den fysiska tangenten',
138
+ title: 'event.code: Den fysiska tangenten',
139
139
  html: '<p>Returnerar identifieraren för tangentens <strong>fysiska position</strong> på tangentbordet, med QWERTY-nomenklatur. Till exempel returnerar tangenten "A" på ett AZERTY-tangentbord <code>KeyQ</code>. Idealisk för spelkontroller där position spelar roll, inte tecknet.</p>',
140
140
  },
141
141
  {
142
142
  type: 'card',
143
- title: 'event.key Det genererade tecknet',
143
+ title: 'event.key: Det genererade tecknet',
144
144
  html: '<p>Returnerar det <strong>genererade teckenvärde</strong> enligt språk och aktiva modifierare. Att trycka Shift+A returnerar <code>"A"</code>; utan Shift returnerar <code>"a"</code>. För specialtangenter returneras namn som <code>"Enter"</code>, <code>"Escape"</code>, <code>"ArrowUp"</code>.</p>',
145
145
  },
146
146
  {
@@ -100,15 +100,15 @@ export const content: ToolLocaleContent<KeycodeUI> = {
100
100
  bibliographyTitle: 'Referanslar ve Standartlar',
101
101
  bibliography: [
102
102
  {
103
- name: 'MDN Web Docs KeyboardEvent',
103
+ name: 'MDN Web Docs - KeyboardEvent',
104
104
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent',
105
105
  },
106
106
  {
107
- name: 'UI Events Specification (W3C) KeyboardEvent',
107
+ name: 'UI Events Specification (W3C) - KeyboardEvent',
108
108
  url: 'https://www.w3.org/TR/uievents/#events-keyboardevents',
109
109
  },
110
110
  {
111
- name: 'MDN KeyboardEvent.code values',
111
+ name: 'MDN - KeyboardEvent.code values',
112
112
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values',
113
113
  },
114
114
  ],
@@ -135,12 +135,12 @@ export const content: ToolLocaleContent<KeycodeUI> = {
135
135
  },
136
136
  {
137
137
  type: 'card',
138
- title: 'event.code Fiziksel Tuş',
138
+ title: 'event.code: Fiziksel Tuş',
139
139
  html: '<p>Tuşun klavyedeki <strong>fiziksel konumunun</strong> tanımlayıcısını QWERTY nomenklaturunu kullanarak döndürür. Örneğin, AZERTY klavyesindeki "A" tuşu <code>KeyQ</code> döndürür. Konum önemli olan, karakter değil, oyun kontrolleri için idealdir.</p>',
140
140
  },
141
141
  {
142
142
  type: 'card',
143
- title: 'event.key Oluşturulan Karakter',
143
+ title: 'event.key: Oluşturulan Karakter',
144
144
  html: '<p>Dil ve etkin değiştiricilere göre oluşturulan <strong>karakter değerini</strong> döndürür. Shift+A tuşuna basmak <code>"A"</code> döndürür; Shift olmadan <code>"a"</code> döndürür. Özel tuşlar için <code>"Enter"</code>, <code>"Escape"</code>, <code>"ArrowUp"</code> gibi adları döndürür.</p>',
145
145
  },
146
146
  {
@@ -100,15 +100,15 @@ export const content: ToolLocaleContent<KeycodeUI> = {
100
100
  bibliographyTitle: '参考资料和标准',
101
101
  bibliography: [
102
102
  {
103
- name: 'MDN Web Docs KeyboardEvent',
103
+ name: 'MDN Web Docs - KeyboardEvent',
104
104
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent',
105
105
  },
106
106
  {
107
- name: 'UI Events Specification (W3C) KeyboardEvent',
107
+ name: 'UI Events Specification (W3C) - KeyboardEvent',
108
108
  url: 'https://www.w3.org/TR/uievents/#events-keyboardevents',
109
109
  },
110
110
  {
111
- name: 'MDN KeyboardEvent.code values',
111
+ name: 'MDN - KeyboardEvent.code values',
112
112
  url: 'https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values',
113
113
  },
114
114
  ],
@@ -135,12 +135,12 @@ export const content: ToolLocaleContent<KeycodeUI> = {
135
135
  },
136
136
  {
137
137
  type: 'card',
138
- title: 'event.code 物理按键',
138
+ title: 'event.code: 物理按键',
139
139
  html: '<p>使用QWERTY命名法返回键盘上按键<strong>物理位置</strong>的标识符。例如,AZERTY键盘上的"A"键返回<code>KeyQ</code>。对于位置重要而不是字符的游戏控制非常理想。</p>',
140
140
  },
141
141
  {
142
142
  type: 'card',
143
- title: 'event.key 生成的字符',
143
+ title: 'event.key: 生成的字符',
144
144
  html: '<p>返回根据语言和活动修饰符生成的<strong>字符值</strong>。按Shift+A返回<code>"A"</code>;没有Shift时返回<code>"a"</code>。对于特殊按键,返回名称如<code>"Enter"</code>、<code>"Escape"</code>、<code>"ArrowUp"</code>。</p>',
145
145
  },
146
146
  {
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await keycode.i18n[locale]?.();
12
+ if (!content) return null;
12
13
  ---
13
14
 
14
- {content && <SEORenderer content={{ locale, sections: content.seo }} />}
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -16,12 +16,12 @@ const faqData = [
16
16
  {
17
17
  question: 'Was sind Tokens und wie hängen sie mit Wörtern zusammen?',
18
18
  answer:
19
- 'Ein Token ist die grundlegende Texteinheit, die ein Sprachmodell verarbeitet. Im Durchschnitt entspricht 1 Token etwa 0,75 Wörtern auf Englisch, also 1.000 Tokens ≈ 750 Wörter. Preise werden pro Million Tokens ($/1M) angegeben das ist die branchenübliche Einheit bei allen Anbietern.',
19
+ 'Ein Token ist die grundlegende Texteinheit, die ein Sprachmodell verarbeitet. Im Durchschnitt entspricht 1 Token etwa 0,75 Wörtern auf Englisch, also 1.000 Tokens ≈ 750 Wörter. Preise werden pro Million Tokens ($/1M) angegeben - das ist die branchenübliche Einheit bei allen Anbietern.',
20
20
  },
21
21
  {
22
22
  question: 'Warum sind Ausgabe Tokens teurer als Eingabe Tokens?',
23
23
  answer:
24
- 'Das Generieren von Text (Ausgabe) erfordert, dass das Modell jeden Token nacheinander berechnet das ist rechenintensiver als das Lesen der Eingabe. Die meisten Anbieter berechnen für Ausgabe Tokens das 3- bis 5-Fache des Preises für Eingabe Tokens.',
24
+ 'Das Generieren von Text (Ausgabe) erfordert, dass das Modell jeden Token nacheinander berechnet - das ist rechenintensiver als das Lesen der Eingabe. Die meisten Anbieter berechnen für Ausgabe Tokens das 3- bis 5-Fache des Preises für Eingabe Tokens.',
25
25
  },
26
26
  {
27
27
  question: 'Wie kann ich die Kosten meiner LLM-API senken?',
@@ -127,7 +127,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
127
127
  },
128
128
  {
129
129
  type: 'paragraph',
130
- html: 'APIs für große Sprachmodelle werden nach Token-Nutzung abgerechnet nicht nach Zeit oder Anfragen. Jeder API-Aufruf hat zwei Kostenkomponenten: die <strong>Eingabekosten</strong> (Verarbeitung deines Prompts) und die <strong>Ausgabekosten</strong> (Generierung der Antwort). Diesen Unterschied zu verstehen ist der Schlüssel zur genauen Schätzung deiner monatlichen Rechnung.',
130
+ html: 'APIs für große Sprachmodelle werden nach Token-Nutzung abgerechnet - nicht nach Zeit oder Anfragen. Jeder API-Aufruf hat zwei Kostenkomponenten: die <strong>Eingabekosten</strong> (Verarbeitung deines Prompts) und die <strong>Ausgabekosten</strong> (Generierung der Antwort). Diesen Unterschied zu verstehen ist der Schlüssel zur genauen Schätzung deiner monatlichen Rechnung.',
131
131
  },
132
132
  {
133
133
  type: 'title',
@@ -146,7 +146,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
146
146
  {
147
147
  type: 'card',
148
148
  title: 'Ausgabe Tokens',
149
- html: '<p>Ausgabe Tokens werden sequenziell Token für Token erzeugt, was sie rechenintensiver macht. Die meisten Anbieter berechnen für Ausgabe Tokens <strong>das 3- bis 5-Fache</strong> des Eingabepreises. Eine Antwort mit 300 Wörtern erzeugt etwa 400 Ausgabe Tokens. Präzise Antworten zu halten ist eine der wirkungsvollsten Methoden, Kosten zu sparen.</p>',
149
+ html: '<p>Ausgabe Tokens werden sequenziell - Token für Token - erzeugt, was sie rechenintensiver macht. Die meisten Anbieter berechnen für Ausgabe Tokens <strong>das 3- bis 5-Fache</strong> des Eingabepreises. Eine Antwort mit 300 Wörtern erzeugt etwa 400 Ausgabe Tokens. Präzise Antworten zu halten ist eine der wirkungsvollsten Methoden, Kosten zu sparen.</p>',
150
150
  },
151
151
  {
152
152
  type: 'title',
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: 'Why are output tokens more expensive than input tokens?',
23
23
  answer:
24
- 'Generating text (output) requires the model to compute each token sequentially, which is computationally more intensive than reading the input. Most providers charge 35x more for output tokens than input tokens.',
24
+ 'Generating text (output) requires the model to compute each token sequentially, which is computationally more intensive than reading the input. Most providers charge 3-5x more for output tokens than input tokens.',
25
25
  },
26
26
  {
27
27
  question: 'How can I reduce my LLM API costs?',
@@ -146,7 +146,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
146
146
  {
147
147
  type: 'card',
148
148
  title: 'Output tokens',
149
- html: '<p>Output tokens are generated one by one in sequence, making them more computationally expensive. Most providers charge <strong>35× more</strong> for output tokens. A 300-word response generates roughly 400 output tokens. Keeping responses concise is one of the most effective cost-saving strategies.</p>',
149
+ html: '<p>Output tokens are generated one by one in sequence, making them more computationally expensive. Most providers charge <strong>3-5× more</strong> for output tokens. A 300-word response generates roughly 400 output tokens. Keeping responses concise is one of the most effective cost-saving strategies.</p>',
150
150
  },
151
151
  {
152
152
  type: 'title',
@@ -155,7 +155,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
155
155
  },
156
156
  {
157
157
  type: 'tip',
158
- html: 'Start with a capable mid-tier model like <code>GPT-4o mini</code> or <code>Gemini 1.5 Flash</code> and only upgrade if quality falls short. The cost difference between a small and large model can be 10100×.',
158
+ html: 'Start with a capable mid-tier model like <code>GPT-4o mini</code> or <code>Gemini 1.5 Flash</code> and only upgrade if quality falls short. The cost difference between a small and large model can be 10-100×.',
159
159
  },
160
160
  {
161
161
  type: 'paragraph',
@@ -11,7 +11,7 @@ const faqData = [
11
11
  {
12
12
  question: "Comment le coût d'une API LLM est-il calculé ?",
13
13
  answer:
14
- "Les APIs LLM facturent séparément les tokens d'entrée (le prompt) et les tokens de sortie (la réponse). Le coût total par requête est : (tokens entrée × prix entrée + tokens sortie × prix sortie) / 1 000 000. Multipliez par le nombre de requêtes pour obtenir le coût mensuel total.",
14
+ "Les APIs LLM facturent séparément les tokens d'entrée (le prompt) et les tokens de sortie (la réponse). Le coût total par requête est: (tokens entrée × prix entrée + tokens sortie × prix sortie) / 1 000 000. Multipliez par le nombre de requêtes pour obtenir le coût mensuel total.",
15
15
  },
16
16
  {
17
17
  question: 'Que sont les tokens et comment se rapportent-ils aux mots ?',
@@ -127,7 +127,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
127
127
  },
128
128
  {
129
129
  type: 'paragraph',
130
- html: "Les APIs de modèles de langage facturent en fonction de l'utilisation des tokens, et non du temps ou des requêtes. Chaque appel a deux coûts : le <strong>coût d'entrée</strong> (traitement de votre prompt) et le <strong>coût de sortie</strong> (génération de la réponse). Comprendre cette distinction est essentiel pour estimer avec précision votre facture mensuelle.",
130
+ html: "Les APIs de modèles de langage facturent en fonction de l'utilisation des tokens, et non du temps ou des requêtes. Chaque appel a deux coûts: le <strong>coût d'entrée</strong> (traitement de votre prompt) et le <strong>coût de sortie</strong> (génération de la réponse). Comprendre cette distinction est essentiel pour estimer avec précision votre facture mensuelle.",
131
131
  },
132
132
  {
133
133
  type: 'title',
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
141
141
  {
142
142
  type: 'card',
143
143
  title: "Tokens d'entrée",
144
- html: "<p>Les tokens d'entrée représentent tout ce qui est envoyé <strong>au</strong> modèle : votre prompt système, l'historique de la conversation et le message de l'utilisateur. Ils sont moins chers car le modèle les traite en parallèle. Un prompt système typique de 200 mots génère environ 267 tokens d'entrée.</p>",
144
+ html: "<p>Les tokens d'entrée représentent tout ce qui est envoyé <strong>au</strong> modèle: votre prompt système, l'historique de la conversation et le message de l'utilisateur. Ils sont moins chers car le modèle les traite en parallèle. Un prompt système typique de 200 mots génère environ 267 tokens d'entrée.</p>",
145
145
  },
146
146
  {
147
147
  type: 'card',
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: 'Mengapa token output lebih mahal daripada token input?',
23
23
  answer:
24
- 'Menghasilkan teks (output) mengharuskan model menghitung setiap token secara berurutan, yang secara komputasi lebih intensif daripada membaca input. Sebagian besar penyedia mengenakan biaya 35 kali lebih mahal untuk token output dibandingkan token input.',
24
+ 'Menghasilkan teks (output) mengharuskan model menghitung setiap token secara berurutan, yang secara komputasi lebih intensif daripada membaca input. Sebagian besar penyedia mengenakan biaya 3-5 kali lebih mahal untuk token output dibandingkan token input.',
25
25
  },
26
26
  {
27
27
  question: 'Bagaimana cara mengurangi biaya API LLM saya?',
@@ -146,7 +146,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
146
146
  {
147
147
  type: 'card',
148
148
  title: 'Token output',
149
- html: '<p>Token output dihasilkan satu per satu secara berurutan, sehingga lebih intensif secara komputasi. Sebagian besar penyedia mengenakan biaya <strong>35× lebih mahal</strong> untuk token output. Respons 300 kata menghasilkan sekitar 400 token output. Menjaga respons tetap ringkas adalah salah satu strategi penghematan biaya yang paling efektif.</p>',
149
+ html: '<p>Token output dihasilkan satu per satu secara berurutan, sehingga lebih intensif secara komputasi. Sebagian besar penyedia mengenakan biaya <strong>3-5× lebih mahal</strong> untuk token output. Respons 300 kata menghasilkan sekitar 400 token output. Menjaga respons tetap ringkas adalah salah satu strategi penghematan biaya yang paling efektif.</p>',
150
150
  },
151
151
  {
152
152
  type: 'title',
@@ -155,7 +155,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
155
155
  },
156
156
  {
157
157
  type: 'tip',
158
- html: 'Mulailah dengan model kelas menengah yang mumpuni seperti <code>GPT-4o mini</code> atau <code>Gemini 1.5 Flash</code> dan naik ke model yang lebih besar hanya jika kualitasnya belum memadai. Perbedaan biaya antara model kecil dan besar bisa mencapai 10100×.',
158
+ html: 'Mulailah dengan model kelas menengah yang mumpuni seperti <code>GPT-4o mini</code> atau <code>Gemini 1.5 Flash</code> dan naik ke model yang lebih besar hanya jika kualitasnya belum memadai. Perbedaan biaya antara model kecil dan besar bisa mencapai 10-100×.',
159
159
  },
160
160
  {
161
161
  type: 'paragraph',
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: 'Por que os tokens de saída são mais caros que os de entrada?',
23
23
  answer:
24
- 'Gerar texto (saída) requer que o modelo compute cada token sequencialmente, o que é computacionalmente mais intensivo do que ler a entrada. A maioria dos provedores cobra 35x mais para tokens de saída do que de entrada.',
24
+ 'Gerar texto (saída) requer que o modelo compute cada token sequencialmente, o que é computacionalmente mais intensivo do que ler a entrada. A maioria dos provedores cobra 3-5x mais para tokens de saída do que de entrada.',
25
25
  },
26
26
  {
27
27
  question: 'Como posso reduzir meus custos de API LLM?',
@@ -146,7 +146,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
146
146
  {
147
147
  type: 'card',
148
148
  title: 'Tokens de saída',
149
- html: '<p>Os tokens de saída são gerados um por um em sequência, tornando-os computacionalmente mais caros. A maioria dos provedores cobra <strong>35× mais</strong> para tokens de saída. Uma resposta de 300 palavras gera aproximadamente 400 tokens de saída. Manter as respostas concisas é uma das estratégias mais eficazes de economia de custos.</p>',
149
+ html: '<p>Os tokens de saída são gerados um por um em sequência, tornando-os computacionalmente mais caros. A maioria dos provedores cobra <strong>3-5× mais</strong> para tokens de saída. Uma resposta de 300 palavras gera aproximadamente 400 tokens de saída. Manter as respostas concisas é uma das estratégias mais eficazes de economia de custos.</p>',
150
150
  },
151
151
  {
152
152
  type: 'title',
@@ -155,7 +155,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
155
155
  },
156
156
  {
157
157
  type: 'tip',
158
- html: 'Comece com um modelo de nível médio capaz como <code>GPT-4o mini</code> ou <code>Gemini 1.5 Flash</code> e atualize apenas se a qualidade for insuficiente. A diferença de custo entre um modelo pequeno e grande pode ser 10100×.',
158
+ html: 'Comece com um modelo de nível médio capaz como <code>GPT-4o mini</code> ou <code>Gemini 1.5 Flash</code> e atualize apenas se a qualidade for insuficiente. A diferença de custo entre um modelo pequeno e grande pode ser 10-100×.',
159
159
  },
160
160
  {
161
161
  type: 'paragraph',
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: 'Почему выходные токены дороже входных?',
23
23
  answer:
24
- 'Генерирование текста (выход) требует, чтобы модель последовательно вычисляла каждый токен, что вычислительно более интенсивно, чем чтение входа. Большинство провайдеров взимают в 35 раз больше за выходные токены, чем за входные.',
24
+ 'Генерирование текста (выход) требует, чтобы модель последовательно вычисляла каждый токен, что вычислительно более интенсивно, чем чтение входа. Большинство провайдеров взимают в 3-5 раз больше за выходные токены, чем за входные.',
25
25
  },
26
26
  {
27
27
  question: 'Как я могу снизить свои расходы на API LLM?',
@@ -146,7 +146,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
146
146
  {
147
147
  type: 'card',
148
148
  title: 'Выходные токены',
149
- html: '<p>Выходные токены генерируются один за другим последовательно, делая их вычислительно более дорогостоящими. Большинство провайдеров взимают <strong>35× больше</strong> за выходные токены. Ответ из 300 слов генерирует примерно 400 выходных токенов. Сохранение ответов краткими - одна из наиболее эффективных стратегий экономии затрат.</p>',
149
+ html: '<p>Выходные токены генерируются один за другим последовательно, делая их вычислительно более дорогостоящими. Большинство провайдеров взимают <strong>3-5× больше</strong> за выходные токены. Ответ из 300 слов генерирует примерно 400 выходных токенов. Сохранение ответов краткими - одна из наиболее эффективных стратегий экономии затрат.</p>',
150
150
  },
151
151
  {
152
152
  type: 'title',
@@ -155,7 +155,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
155
155
  },
156
156
  {
157
157
  type: 'tip',
158
- html: 'Начните с способной модели среднего уровня, такой как <code>GPT-4o mini</code> или <code>Gemini 1.5 Flash</code>, и обновляйте, только если качество недостаточно. Разница в стоимости между маленькой и большой моделью может быть 10100×.',
158
+ html: 'Начните с способной модели среднего уровня, такой как <code>GPT-4o mini</code> или <code>Gemini 1.5 Flash</code>, и обновляйте, только если качество недостаточно. Разница в стоимости между маленькой и большой моделью может быть 10-100×.',
159
159
  },
160
160
  {
161
161
  type: 'paragraph',
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: 'Varför är utdatatoken dyrare än indatatoken?',
23
23
  answer:
24
- 'Att generera text (utdata) kräver att modellen beräknar varje token sekventiellt, vilket är mer beräkningsintensivt än att läsa indata. De flesta leverantörer tar ut 35 gånger mer för utdatatoken än indatatoken.',
24
+ 'Att generera text (utdata) kräver att modellen beräknar varje token sekventiellt, vilket är mer beräkningsintensivt än att läsa indata. De flesta leverantörer tar ut 3-5 gånger mer för utdatatoken än indatatoken.',
25
25
  },
26
26
  {
27
27
  question: 'Hur kan jag minska mina LLM API-kostnader?',
@@ -146,7 +146,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
146
146
  {
147
147
  type: 'card',
148
148
  title: 'Utdatatoken',
149
- html: '<p>Utdatatoken genereras sekventiellt, en i taget, vilket gör dem beräkningsmässigt dyrare. De flesta leverantörer tar ut <strong>35× mer</strong> för utdatatoken. Ett svar på 300 ord genererar ungefär 400 utdatatoken. Att hålla svaren korta är en av de mest effektiva kostnadsbesparingsstrategi.</p>',
149
+ html: '<p>Utdatatoken genereras sekventiellt, en i taget, vilket gör dem beräkningsmässigt dyrare. De flesta leverantörer tar ut <strong>3-5× mer</strong> för utdatatoken. Ett svar på 300 ord genererar ungefär 400 utdatatoken. Att hålla svaren korta är en av de mest effektiva kostnadsbesparingsstrategi.</p>',
150
150
  },
151
151
  {
152
152
  type: 'title',
@@ -155,7 +155,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
155
155
  },
156
156
  {
157
157
  type: 'tip',
158
- html: 'Börja med en kapabel mellanniesemodell som <code>GPT-4o mini</code> eller <code>Gemini 1.5 Flash</code> och uppgradera bara om kvaliteten är otillräcklig. Skillnaden i kostnad mellan en liten och stor modell kan vara 10100×.',
158
+ html: 'Börja med en kapabel mellanniesemodell som <code>GPT-4o mini</code> eller <code>Gemini 1.5 Flash</code> och uppgradera bara om kvaliteten är otillräcklig. Skillnaden i kostnad mellan en liten och stor modell kan vara 10-100×.',
159
159
  },
160
160
  {
161
161
  type: 'paragraph',
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: 'Çıkış token\'ları neden giriş token\'larından daha pahalıdır?',
23
23
  answer:
24
- 'Metin oluşturma (çıkış), modelin her token\'u sırayla hesaplamasını gerektirir ve bu, girişi okumaktan hesaplamalar açısından daha yoğundur. Çoğu sağlayıcı çıkış token\'ları için giriş token\'larından 35 kat daha fazla ücret alır.',
24
+ 'Metin oluşturma (çıkış), modelin her token\'u sırayla hesaplamasını gerektirir ve bu, girişi okumaktan hesaplamalar açısından daha yoğundur. Çoğu sağlayıcı çıkış token\'ları için giriş token\'larından 3-5 kat daha fazla ücret alır.',
25
25
  },
26
26
  {
27
27
  question: 'LLM API maliyetlerimi nasıl azaltabilirim?',
@@ -146,7 +146,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
146
146
  {
147
147
  type: 'card',
148
148
  title: 'Çıkış token\'ları',
149
- html: '<p>Çıkış token\'ları sırayla, teker teker oluşturulur ve bu onları hesaplamalar açısından daha pahalı hale getirir. Çoğu sağlayıcı çıkış token\'ları için <strong>35 kat daha fazla</strong> ücret alır. 300 sözcüklük bir yanıt yaklaşık 400 çıkış token\'ı üretir. Yanıtları kısa tutmak en etkili maliyet tasarrufu stratejilerinden biridir.</p>',
149
+ html: '<p>Çıkış token\'ları sırayla, teker teker oluşturulur ve bu onları hesaplamalar açısından daha pahalı hale getirir. Çoğu sağlayıcı çıkış token\'ları için <strong>3-5 kat daha fazla</strong> ücret alır. 300 sözcüklük bir yanıt yaklaşık 400 çıkış token\'ı üretir. Yanıtları kısa tutmak en etkili maliyet tasarrufu stratejilerinden biridir.</p>',
150
150
  },
151
151
  {
152
152
  type: 'title',
@@ -155,7 +155,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
155
155
  },
156
156
  {
157
157
  type: 'tip',
158
- html: '<code>GPT-4o mini</code> veya <code>Gemini 1.5 Flash</code> gibi yetenekli bir orta katman modeliyle başlayın ve yalnızca kalite yetersizse yükseltin. Küçük ve büyük bir model arasındaki maliyet farkı 10100× olabilir.',
158
+ html: '<code>GPT-4o mini</code> veya <code>Gemini 1.5 Flash</code> gibi yetenekli bir orta katman modeliyle başlayın ve yalnızca kalite yetersizse yükseltin. Küçük ve büyük bir model arasındaki maliyet farkı 10-100× olabilir.',
159
159
  },
160
160
  {
161
161
  type: 'paragraph',
@@ -21,7 +21,7 @@ const faqData = [
21
21
  {
22
22
  question: '为什么输出代币比输入代币更昂贵?',
23
23
  answer:
24
- '生成文本(输出)需要模型依次计算每个代币,这在计算上比读取输入更密集。大多数提供商对输出代币的收费是输入代币的 35 倍。',
24
+ '生成文本(输出)需要模型依次计算每个代币,这在计算上比读取输入更密集。大多数提供商对输出代币的收费是输入代币的 3-5 倍。',
25
25
  },
26
26
  {
27
27
  question: '如何降低我的 LLM API 成本?',
@@ -146,7 +146,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
146
146
  {
147
147
  type: 'card',
148
148
  title: '输出代币',
149
- html: '<p>输出代币按顺序逐个生成,使其在计算上更昂贵。大多数提供商对输出代币的收费<strong>多出 35 倍</strong>。一个 300 字的响应会生成大约 400 个输出代币。保持响应简洁是最有效的成本节省策略之一。</p>',
149
+ html: '<p>输出代币按顺序逐个生成,使其在计算上更昂贵。大多数提供商对输出代币的收费<strong>多出 3-5 倍</strong>。一个 300 字的响应会生成大约 400 个输出代币。保持响应简洁是最有效的成本节省策略之一。</p>',
150
150
  },
151
151
  {
152
152
  type: 'title',
@@ -155,7 +155,7 @@ export const content: ToolLocaleContent<LlmCostCalculatorUI> = {
155
155
  },
156
156
  {
157
157
  type: 'tip',
158
- html: '从有能力的中等层级模型开始,例如 <code>GPT-4o mini</code> 或 <code>Gemini 1.5 Flash</code>,仅在质量不足时升级。小型和大型模型之间的成本差异可能是 10100×。',
158
+ html: '从有能力的中等层级模型开始,例如 <code>GPT-4o mini</code> 或 <code>Gemini 1.5 Flash</code>,仅在质量不足时升级。小型和大型模型之间的成本差异可能是 10-100×。',
159
159
  },
160
160
  {
161
161
  type: 'paragraph',
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await llmCostCalculator.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 }} />}
@@ -91,7 +91,7 @@ const ui: MobileMockupGeneratorUI = {
91
91
  presetImageRight: 'Imagen Der.',
92
92
  confirmClear: '¿Estás seguro de eliminar todos los mockups?',
93
93
  processingExport: 'Procesando...',
94
- exportDone: 'Listo!',
94
+ exportDone: '¡Listo!',
95
95
  };
96
96
 
97
97
  export const content: ToolLocaleContent<MobileMockupGeneratorUI> = {
@@ -9,6 +9,7 @@ interface Props {
9
9
 
10
10
  const { locale = 'es' } = Astro.props;
11
11
  const content = await mobileMockupGenerator.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 }} />}
@@ -160,7 +160,7 @@ export const content: ToolLocaleContent<MusicalTypographyUI> = {
160
160
  {
161
161
  type: 'card',
162
162
  title: 'Warum "Musikalisch"',
163
- html: '<p>Die Pythagoreer entdeckten, dass das Teilen einer Saite in einfache Proportionen (1:2, 2:3, 3:4) Konsonanz erzeugt. Diese Intervalle Oktave, reine Quinte und reine Quarte sind genau die typografischen Ratios. Du komponierst visuelle Musik.</p>',
163
+ html: '<p>Die Pythagoreer entdeckten, dass das Teilen einer Saite in einfache Proportionen (1:2, 2:3, 3:4) Konsonanz erzeugt. Diese Intervalle - Oktave, reine Quinte und reine Quarte - sind genau die typografischen Ratios. Du komponierst visuelle Musik.</p>',
164
164
  },
165
165
  {
166
166
  type: 'title',