@jjlmoya/utils-converters 1.7.0 → 1.9.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 (346) hide show
  1. package/package.json +60 -59
  2. package/src/shared/logic/schemas.ts +57 -0
  3. package/src/tests/faq_count.test.ts +13 -4
  4. package/src/tests/i18n_coverage.test.ts +36 -0
  5. package/src/tests/locale_completeness.test.ts +42 -0
  6. package/src/tests/no_h1_in_components.test.ts +48 -0
  7. package/src/tests/schemas_fulfillment.test.ts +23 -0
  8. package/src/tests/seo_length.test.ts +1 -1
  9. package/src/tests/slug_uniqueness.test.ts +81 -0
  10. package/src/tests/title_quality.test.ts +55 -0
  11. package/src/tool/avifAJpg/i18n/de.ts +178 -0
  12. package/src/tool/avifAJpg/i18n/en.ts +2 -12
  13. package/src/tool/avifAJpg/i18n/es.ts +2 -12
  14. package/src/tool/avifAJpg/i18n/fr.ts +2 -12
  15. package/src/tool/avifAJpg/i18n/id.ts +178 -0
  16. package/src/tool/avifAJpg/i18n/it.ts +178 -0
  17. package/src/tool/avifAJpg/i18n/ja.ts +178 -0
  18. package/src/tool/avifAJpg/i18n/ko.ts +178 -0
  19. package/src/tool/avifAJpg/i18n/nl.ts +178 -0
  20. package/src/tool/avifAJpg/i18n/pl.ts +178 -0
  21. package/src/tool/avifAJpg/i18n/pt.ts +178 -0
  22. package/src/tool/avifAJpg/i18n/ru.ts +178 -0
  23. package/src/tool/avifAJpg/i18n/sv.ts +178 -0
  24. package/src/tool/avifAJpg/i18n/tr.ts +178 -0
  25. package/src/tool/avifAJpg/i18n/zh.ts +178 -0
  26. package/src/tool/avifAJpg/index.ts +13 -1
  27. package/src/tool/avifAPng/i18n/de.ts +178 -0
  28. package/src/tool/avifAPng/i18n/en.ts +2 -12
  29. package/src/tool/avifAPng/i18n/es.ts +2 -12
  30. package/src/tool/avifAPng/i18n/fr.ts +2 -12
  31. package/src/tool/avifAPng/i18n/id.ts +178 -0
  32. package/src/tool/avifAPng/i18n/it.ts +178 -0
  33. package/src/tool/avifAPng/i18n/ja.ts +178 -0
  34. package/src/tool/avifAPng/i18n/ko.ts +178 -0
  35. package/src/tool/avifAPng/i18n/nl.ts +178 -0
  36. package/src/tool/avifAPng/i18n/pl.ts +178 -0
  37. package/src/tool/avifAPng/i18n/pt.ts +178 -0
  38. package/src/tool/avifAPng/i18n/ru.ts +178 -0
  39. package/src/tool/avifAPng/i18n/sv.ts +178 -0
  40. package/src/tool/avifAPng/i18n/tr.ts +178 -0
  41. package/src/tool/avifAPng/i18n/zh.ts +178 -0
  42. package/src/tool/avifAPng/index.ts +13 -1
  43. package/src/tool/avifAWebp/i18n/de.ts +178 -0
  44. package/src/tool/avifAWebp/i18n/en.ts +2 -12
  45. package/src/tool/avifAWebp/i18n/es.ts +2 -12
  46. package/src/tool/avifAWebp/i18n/fr.ts +2 -12
  47. package/src/tool/avifAWebp/i18n/id.ts +178 -0
  48. package/src/tool/avifAWebp/i18n/it.ts +178 -0
  49. package/src/tool/avifAWebp/i18n/ja.ts +178 -0
  50. package/src/tool/avifAWebp/i18n/ko.ts +178 -0
  51. package/src/tool/avifAWebp/i18n/nl.ts +178 -0
  52. package/src/tool/avifAWebp/i18n/pl.ts +178 -0
  53. package/src/tool/avifAWebp/i18n/pt.ts +178 -0
  54. package/src/tool/avifAWebp/i18n/ru.ts +178 -0
  55. package/src/tool/avifAWebp/i18n/sv.ts +178 -0
  56. package/src/tool/avifAWebp/i18n/tr.ts +178 -0
  57. package/src/tool/avifAWebp/i18n/zh.ts +178 -0
  58. package/src/tool/avifAWebp/index.ts +13 -1
  59. package/src/tool/bmpAJpg/i18n/de.ts +178 -0
  60. package/src/tool/bmpAJpg/i18n/en.ts +2 -12
  61. package/src/tool/bmpAJpg/i18n/es.ts +2 -12
  62. package/src/tool/bmpAJpg/i18n/fr.ts +2 -12
  63. package/src/tool/bmpAJpg/i18n/id.ts +178 -0
  64. package/src/tool/bmpAJpg/i18n/it.ts +178 -0
  65. package/src/tool/bmpAJpg/i18n/ja.ts +178 -0
  66. package/src/tool/bmpAJpg/i18n/ko.ts +178 -0
  67. package/src/tool/bmpAJpg/i18n/nl.ts +178 -0
  68. package/src/tool/bmpAJpg/i18n/pl.ts +178 -0
  69. package/src/tool/bmpAJpg/i18n/pt.ts +178 -0
  70. package/src/tool/bmpAJpg/i18n/ru.ts +178 -0
  71. package/src/tool/bmpAJpg/i18n/sv.ts +178 -0
  72. package/src/tool/bmpAJpg/i18n/tr.ts +178 -0
  73. package/src/tool/bmpAJpg/i18n/zh.ts +178 -0
  74. package/src/tool/bmpAJpg/index.ts +13 -1
  75. package/src/tool/bmpAPng/i18n/de.ts +177 -0
  76. package/src/tool/bmpAPng/i18n/en.ts +2 -12
  77. package/src/tool/bmpAPng/i18n/es.ts +2 -12
  78. package/src/tool/bmpAPng/i18n/fr.ts +2 -12
  79. package/src/tool/bmpAPng/i18n/id.ts +177 -0
  80. package/src/tool/bmpAPng/i18n/it.ts +177 -0
  81. package/src/tool/bmpAPng/i18n/ja.ts +177 -0
  82. package/src/tool/bmpAPng/i18n/ko.ts +177 -0
  83. package/src/tool/bmpAPng/i18n/nl.ts +177 -0
  84. package/src/tool/bmpAPng/i18n/pl.ts +177 -0
  85. package/src/tool/bmpAPng/i18n/pt.ts +177 -0
  86. package/src/tool/bmpAPng/i18n/ru.ts +177 -0
  87. package/src/tool/bmpAPng/i18n/sv.ts +177 -0
  88. package/src/tool/bmpAPng/i18n/tr.ts +177 -0
  89. package/src/tool/bmpAPng/i18n/zh.ts +177 -0
  90. package/src/tool/bmpAPng/index.ts +13 -1
  91. package/src/tool/bmpAWebp/i18n/de.ts +178 -0
  92. package/src/tool/bmpAWebp/i18n/en.ts +2 -12
  93. package/src/tool/bmpAWebp/i18n/es.ts +2 -12
  94. package/src/tool/bmpAWebp/i18n/fr.ts +2 -12
  95. package/src/tool/bmpAWebp/i18n/id.ts +178 -0
  96. package/src/tool/bmpAWebp/i18n/it.ts +178 -0
  97. package/src/tool/bmpAWebp/i18n/ja.ts +178 -0
  98. package/src/tool/bmpAWebp/i18n/ko.ts +178 -0
  99. package/src/tool/bmpAWebp/i18n/nl.ts +178 -0
  100. package/src/tool/bmpAWebp/i18n/pl.ts +178 -0
  101. package/src/tool/bmpAWebp/i18n/pt.ts +178 -0
  102. package/src/tool/bmpAWebp/i18n/ru.ts +178 -0
  103. package/src/tool/bmpAWebp/i18n/sv.ts +178 -0
  104. package/src/tool/bmpAWebp/i18n/tr.ts +178 -0
  105. package/src/tool/bmpAWebp/i18n/zh.ts +178 -0
  106. package/src/tool/bmpAWebp/index.ts +13 -1
  107. package/src/tool/gifAJpg/i18n/de.ts +178 -0
  108. package/src/tool/gifAJpg/i18n/en.ts +2 -12
  109. package/src/tool/gifAJpg/i18n/es.ts +2 -12
  110. package/src/tool/gifAJpg/i18n/fr.ts +2 -12
  111. package/src/tool/gifAJpg/i18n/id.ts +178 -0
  112. package/src/tool/gifAJpg/i18n/it.ts +178 -0
  113. package/src/tool/gifAJpg/i18n/ja.ts +178 -0
  114. package/src/tool/gifAJpg/i18n/ko.ts +178 -0
  115. package/src/tool/gifAJpg/i18n/nl.ts +178 -0
  116. package/src/tool/gifAJpg/i18n/pl.ts +178 -0
  117. package/src/tool/gifAJpg/i18n/pt.ts +178 -0
  118. package/src/tool/gifAJpg/i18n/ru.ts +178 -0
  119. package/src/tool/gifAJpg/i18n/sv.ts +178 -0
  120. package/src/tool/gifAJpg/i18n/tr.ts +178 -0
  121. package/src/tool/gifAJpg/i18n/zh.ts +178 -0
  122. package/src/tool/gifAJpg/index.ts +13 -1
  123. package/src/tool/gifAPng/i18n/de.ts +178 -0
  124. package/src/tool/gifAPng/i18n/en.ts +2 -12
  125. package/src/tool/gifAPng/i18n/es.ts +2 -12
  126. package/src/tool/gifAPng/i18n/fr.ts +2 -12
  127. package/src/tool/gifAPng/i18n/id.ts +178 -0
  128. package/src/tool/gifAPng/i18n/it.ts +178 -0
  129. package/src/tool/gifAPng/i18n/ja.ts +178 -0
  130. package/src/tool/gifAPng/i18n/ko.ts +178 -0
  131. package/src/tool/gifAPng/i18n/nl.ts +178 -0
  132. package/src/tool/gifAPng/i18n/pl.ts +178 -0
  133. package/src/tool/gifAPng/i18n/pt.ts +178 -0
  134. package/src/tool/gifAPng/i18n/ru.ts +178 -0
  135. package/src/tool/gifAPng/i18n/sv.ts +178 -0
  136. package/src/tool/gifAPng/i18n/tr.ts +178 -0
  137. package/src/tool/gifAPng/i18n/zh.ts +178 -0
  138. package/src/tool/gifAPng/index.ts +12 -0
  139. package/src/tool/gifAWebp/i18n/de.ts +178 -0
  140. package/src/tool/gifAWebp/i18n/en.ts +2 -12
  141. package/src/tool/gifAWebp/i18n/es.ts +2 -12
  142. package/src/tool/gifAWebp/i18n/fr.ts +2 -12
  143. package/src/tool/gifAWebp/i18n/id.ts +178 -0
  144. package/src/tool/gifAWebp/i18n/it.ts +178 -0
  145. package/src/tool/gifAWebp/i18n/ja.ts +178 -0
  146. package/src/tool/gifAWebp/i18n/ko.ts +178 -0
  147. package/src/tool/gifAWebp/i18n/nl.ts +178 -0
  148. package/src/tool/gifAWebp/i18n/pl.ts +178 -0
  149. package/src/tool/gifAWebp/i18n/pt.ts +178 -0
  150. package/src/tool/gifAWebp/i18n/ru.ts +178 -0
  151. package/src/tool/gifAWebp/i18n/sv.ts +178 -0
  152. package/src/tool/gifAWebp/i18n/tr.ts +178 -0
  153. package/src/tool/gifAWebp/i18n/zh.ts +178 -0
  154. package/src/tool/gifAWebp/index.ts +12 -0
  155. package/src/tool/imagenBase64/i18n/de.ts +168 -0
  156. package/src/tool/imagenBase64/i18n/en.ts +2 -12
  157. package/src/tool/imagenBase64/i18n/es.ts +2 -12
  158. package/src/tool/imagenBase64/i18n/fr.ts +2 -12
  159. package/src/tool/imagenBase64/i18n/id.ts +168 -0
  160. package/src/tool/imagenBase64/i18n/it.ts +168 -0
  161. package/src/tool/imagenBase64/i18n/ja.ts +168 -0
  162. package/src/tool/imagenBase64/i18n/ko.ts +168 -0
  163. package/src/tool/imagenBase64/i18n/nl.ts +168 -0
  164. package/src/tool/imagenBase64/i18n/pl.ts +168 -0
  165. package/src/tool/imagenBase64/i18n/pt.ts +173 -0
  166. package/src/tool/imagenBase64/i18n/ru.ts +168 -0
  167. package/src/tool/imagenBase64/i18n/sv.ts +168 -0
  168. package/src/tool/imagenBase64/i18n/tr.ts +168 -0
  169. package/src/tool/imagenBase64/i18n/zh.ts +168 -0
  170. package/src/tool/imagenBase64/index.ts +12 -0
  171. package/src/tool/jpgAIco/i18n/de.ts +183 -0
  172. package/src/tool/jpgAIco/i18n/en.ts +8 -13
  173. package/src/tool/jpgAIco/i18n/es.ts +13 -18
  174. package/src/tool/jpgAIco/i18n/fr.ts +9 -14
  175. package/src/tool/jpgAIco/i18n/id.ts +183 -0
  176. package/src/tool/jpgAIco/i18n/it.ts +183 -0
  177. package/src/tool/jpgAIco/i18n/ja.ts +183 -0
  178. package/src/tool/jpgAIco/i18n/ko.ts +183 -0
  179. package/src/tool/jpgAIco/i18n/nl.ts +183 -0
  180. package/src/tool/jpgAIco/i18n/pl.ts +183 -0
  181. package/src/tool/jpgAIco/i18n/pt.ts +183 -0
  182. package/src/tool/jpgAIco/i18n/ru.ts +183 -0
  183. package/src/tool/jpgAIco/i18n/sv.ts +183 -0
  184. package/src/tool/jpgAIco/i18n/tr.ts +183 -0
  185. package/src/tool/jpgAIco/i18n/zh.ts +183 -0
  186. package/src/tool/jpgAIco/index.ts +12 -0
  187. package/src/tool/jpgAPng/i18n/de.ts +178 -0
  188. package/src/tool/jpgAPng/i18n/en.ts +2 -12
  189. package/src/tool/jpgAPng/i18n/es.ts +2 -12
  190. package/src/tool/jpgAPng/i18n/fr.ts +2 -12
  191. package/src/tool/jpgAPng/i18n/id.ts +178 -0
  192. package/src/tool/jpgAPng/i18n/it.ts +178 -0
  193. package/src/tool/jpgAPng/i18n/ja.ts +178 -0
  194. package/src/tool/jpgAPng/i18n/ko.ts +178 -0
  195. package/src/tool/jpgAPng/i18n/nl.ts +178 -0
  196. package/src/tool/jpgAPng/i18n/pl.ts +178 -0
  197. package/src/tool/jpgAPng/i18n/pt.ts +178 -0
  198. package/src/tool/jpgAPng/i18n/ru.ts +178 -0
  199. package/src/tool/jpgAPng/i18n/sv.ts +178 -0
  200. package/src/tool/jpgAPng/i18n/tr.ts +178 -0
  201. package/src/tool/jpgAPng/i18n/zh.ts +178 -0
  202. package/src/tool/jpgAPng/index.ts +13 -1
  203. package/src/tool/jpgAWebp/i18n/de.ts +178 -0
  204. package/src/tool/jpgAWebp/i18n/en.ts +2 -12
  205. package/src/tool/jpgAWebp/i18n/es.ts +2 -12
  206. package/src/tool/jpgAWebp/i18n/fr.ts +2 -12
  207. package/src/tool/jpgAWebp/i18n/id.ts +178 -0
  208. package/src/tool/jpgAWebp/i18n/it.ts +178 -0
  209. package/src/tool/jpgAWebp/i18n/ja.ts +178 -0
  210. package/src/tool/jpgAWebp/i18n/ko.ts +178 -0
  211. package/src/tool/jpgAWebp/i18n/nl.ts +178 -0
  212. package/src/tool/jpgAWebp/i18n/pl.ts +178 -0
  213. package/src/tool/jpgAWebp/i18n/pt.ts +178 -0
  214. package/src/tool/jpgAWebp/i18n/ru.ts +178 -0
  215. package/src/tool/jpgAWebp/i18n/sv.ts +178 -0
  216. package/src/tool/jpgAWebp/i18n/tr.ts +178 -0
  217. package/src/tool/jpgAWebp/i18n/zh.ts +178 -0
  218. package/src/tool/jpgAWebp/index.ts +12 -0
  219. package/src/tool/pngAIco/i18n/de.ts +183 -0
  220. package/src/tool/pngAIco/i18n/en.ts +8 -13
  221. package/src/tool/pngAIco/i18n/es.ts +19 -24
  222. package/src/tool/pngAIco/i18n/fr.ts +20 -25
  223. package/src/tool/pngAIco/i18n/id.ts +183 -0
  224. package/src/tool/pngAIco/i18n/it.ts +183 -0
  225. package/src/tool/pngAIco/i18n/ja.ts +183 -0
  226. package/src/tool/pngAIco/i18n/ko.ts +183 -0
  227. package/src/tool/pngAIco/i18n/nl.ts +183 -0
  228. package/src/tool/pngAIco/i18n/pl.ts +183 -0
  229. package/src/tool/pngAIco/i18n/pt.ts +183 -0
  230. package/src/tool/pngAIco/i18n/ru.ts +183 -0
  231. package/src/tool/pngAIco/i18n/sv.ts +183 -0
  232. package/src/tool/pngAIco/i18n/tr.ts +183 -0
  233. package/src/tool/pngAIco/i18n/zh.ts +183 -0
  234. package/src/tool/pngAIco/index.ts +12 -0
  235. package/src/tool/pngAJpg/i18n/de.ts +191 -0
  236. package/src/tool/pngAJpg/i18n/en.ts +2 -12
  237. package/src/tool/pngAJpg/i18n/es.ts +2 -12
  238. package/src/tool/pngAJpg/i18n/fr.ts +2 -12
  239. package/src/tool/pngAJpg/i18n/id.ts +191 -0
  240. package/src/tool/pngAJpg/i18n/it.ts +191 -0
  241. package/src/tool/pngAJpg/i18n/ja.ts +191 -0
  242. package/src/tool/pngAJpg/i18n/ko.ts +191 -0
  243. package/src/tool/pngAJpg/i18n/nl.ts +191 -0
  244. package/src/tool/pngAJpg/i18n/pl.ts +191 -0
  245. package/src/tool/pngAJpg/i18n/pt.ts +191 -0
  246. package/src/tool/pngAJpg/i18n/ru.ts +191 -0
  247. package/src/tool/pngAJpg/i18n/sv.ts +191 -0
  248. package/src/tool/pngAJpg/i18n/tr.ts +191 -0
  249. package/src/tool/pngAJpg/i18n/zh.ts +191 -0
  250. package/src/tool/pngAJpg/index.ts +13 -1
  251. package/src/tool/pngAWebp/i18n/de.ts +182 -0
  252. package/src/tool/pngAWebp/i18n/en.ts +2 -12
  253. package/src/tool/pngAWebp/i18n/es.ts +2 -12
  254. package/src/tool/pngAWebp/i18n/fr.ts +2 -12
  255. package/src/tool/pngAWebp/i18n/id.ts +182 -0
  256. package/src/tool/pngAWebp/i18n/it.ts +182 -0
  257. package/src/tool/pngAWebp/i18n/ja.ts +182 -0
  258. package/src/tool/pngAWebp/i18n/ko.ts +182 -0
  259. package/src/tool/pngAWebp/i18n/nl.ts +182 -0
  260. package/src/tool/pngAWebp/i18n/pl.ts +182 -0
  261. package/src/tool/pngAWebp/i18n/pt.ts +182 -0
  262. package/src/tool/pngAWebp/i18n/ru.ts +182 -0
  263. package/src/tool/pngAWebp/i18n/sv.ts +182 -0
  264. package/src/tool/pngAWebp/i18n/tr.ts +182 -0
  265. package/src/tool/pngAWebp/i18n/zh.ts +182 -0
  266. package/src/tool/pngAWebp/index.ts +12 -0
  267. package/src/tool/svgAJpg/i18n/de.ts +178 -0
  268. package/src/tool/svgAJpg/i18n/en.ts +8 -13
  269. package/src/tool/svgAJpg/i18n/es.ts +8 -13
  270. package/src/tool/svgAJpg/i18n/fr.ts +2 -12
  271. package/src/tool/svgAJpg/i18n/id.ts +178 -0
  272. package/src/tool/svgAJpg/i18n/it.ts +178 -0
  273. package/src/tool/svgAJpg/i18n/ja.ts +178 -0
  274. package/src/tool/svgAJpg/i18n/ko.ts +178 -0
  275. package/src/tool/svgAJpg/i18n/nl.ts +178 -0
  276. package/src/tool/svgAJpg/i18n/pl.ts +178 -0
  277. package/src/tool/svgAJpg/i18n/pt.ts +178 -0
  278. package/src/tool/svgAJpg/i18n/ru.ts +178 -0
  279. package/src/tool/svgAJpg/i18n/sv.ts +178 -0
  280. package/src/tool/svgAJpg/i18n/tr.ts +178 -0
  281. package/src/tool/svgAJpg/i18n/zh.ts +178 -0
  282. package/src/tool/svgAJpg/index.ts +12 -0
  283. package/src/tool/svgAPng/i18n/de.ts +178 -0
  284. package/src/tool/svgAPng/i18n/en.ts +8 -13
  285. package/src/tool/svgAPng/i18n/es.ts +31 -36
  286. package/src/tool/svgAPng/i18n/fr.ts +2 -12
  287. package/src/tool/svgAPng/i18n/id.ts +178 -0
  288. package/src/tool/svgAPng/i18n/it.ts +178 -0
  289. package/src/tool/svgAPng/i18n/ja.ts +178 -0
  290. package/src/tool/svgAPng/i18n/ko.ts +178 -0
  291. package/src/tool/svgAPng/i18n/nl.ts +178 -0
  292. package/src/tool/svgAPng/i18n/pl.ts +178 -0
  293. package/src/tool/svgAPng/i18n/pt.ts +178 -0
  294. package/src/tool/svgAPng/i18n/ru.ts +178 -0
  295. package/src/tool/svgAPng/i18n/sv.ts +178 -0
  296. package/src/tool/svgAPng/i18n/tr.ts +178 -0
  297. package/src/tool/svgAPng/i18n/zh.ts +178 -0
  298. package/src/tool/svgAPng/index.ts +12 -0
  299. package/src/tool/webpAIco/i18n/de.ts +183 -0
  300. package/src/tool/webpAIco/i18n/en.ts +8 -13
  301. package/src/tool/webpAIco/i18n/es.ts +9 -14
  302. package/src/tool/webpAIco/i18n/fr.ts +11 -16
  303. package/src/tool/webpAIco/i18n/id.ts +183 -0
  304. package/src/tool/webpAIco/i18n/it.ts +183 -0
  305. package/src/tool/webpAIco/i18n/ja.ts +183 -0
  306. package/src/tool/webpAIco/i18n/ko.ts +183 -0
  307. package/src/tool/webpAIco/i18n/nl.ts +183 -0
  308. package/src/tool/webpAIco/i18n/pl.ts +183 -0
  309. package/src/tool/webpAIco/i18n/pt.ts +183 -0
  310. package/src/tool/webpAIco/i18n/ru.ts +183 -0
  311. package/src/tool/webpAIco/i18n/sv.ts +183 -0
  312. package/src/tool/webpAIco/i18n/tr.ts +183 -0
  313. package/src/tool/webpAIco/i18n/zh.ts +183 -0
  314. package/src/tool/webpAIco/index.ts +12 -0
  315. package/src/tool/webpAJpg/i18n/de.ts +187 -0
  316. package/src/tool/webpAJpg/i18n/en.ts +9 -13
  317. package/src/tool/webpAJpg/i18n/es.ts +37 -42
  318. package/src/tool/webpAJpg/i18n/fr.ts +35 -40
  319. package/src/tool/webpAJpg/i18n/id.ts +182 -0
  320. package/src/tool/webpAJpg/i18n/it.ts +182 -0
  321. package/src/tool/webpAJpg/i18n/ja.ts +182 -0
  322. package/src/tool/webpAJpg/i18n/ko.ts +182 -0
  323. package/src/tool/webpAJpg/i18n/nl.ts +182 -0
  324. package/src/tool/webpAJpg/i18n/pl.ts +182 -0
  325. package/src/tool/webpAJpg/i18n/pt.ts +182 -0
  326. package/src/tool/webpAJpg/i18n/ru.ts +182 -0
  327. package/src/tool/webpAJpg/i18n/sv.ts +182 -0
  328. package/src/tool/webpAJpg/i18n/tr.ts +182 -0
  329. package/src/tool/webpAJpg/i18n/zh.ts +182 -0
  330. package/src/tool/webpAJpg/index.ts +12 -0
  331. package/src/tool/webpAPng/i18n/de.ts +182 -0
  332. package/src/tool/webpAPng/i18n/en.ts +8 -13
  333. package/src/tool/webpAPng/i18n/es.ts +35 -40
  334. package/src/tool/webpAPng/i18n/fr.ts +2 -12
  335. package/src/tool/webpAPng/i18n/id.ts +182 -0
  336. package/src/tool/webpAPng/i18n/it.ts +182 -0
  337. package/src/tool/webpAPng/i18n/ja.ts +182 -0
  338. package/src/tool/webpAPng/i18n/ko.ts +182 -0
  339. package/src/tool/webpAPng/i18n/nl.ts +182 -0
  340. package/src/tool/webpAPng/i18n/pl.ts +182 -0
  341. package/src/tool/webpAPng/i18n/pt.ts +182 -0
  342. package/src/tool/webpAPng/i18n/ru.ts +182 -0
  343. package/src/tool/webpAPng/i18n/sv.ts +182 -0
  344. package/src/tool/webpAPng/i18n/tr.ts +182 -0
  345. package/src/tool/webpAPng/i18n/zh.ts +182 -0
  346. package/src/tool/webpAPng/index.ts +12 -0
@@ -0,0 +1,178 @@
1
+ import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
2
+ import { generateSchemas } from '../../../shared/logic/schemas';
3
+ import type { GifAJpgLocaleContent } from '../index';
4
+
5
+ const slug = 'konwerter-gif-na-jpg';
6
+ const title = 'Konwersja GIF na JPG Online';
7
+ const description =
8
+ 'Wyodrębnij pierwszą klatkę ze swoich plików GIF i przekonwertuj ją na JPG. Bez serwera. Przetwarzanie lokalne w przeglądarce. Darmowe i nieograniczone.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'Przeciągnij pliki GIF...',
12
+ convertText: 'Aby błyskawicznie konwertować je na JPG',
13
+ selectFiles: 'Wybierz pliki',
14
+ processedFiles: 'Przetworzone pliki',
15
+ downloadAll: 'Pobierz wszystko (.zip)',
16
+ pending: 'Oczekiwanie',
17
+ bibliographyTitle: 'Bibliografia',
18
+ faqTitle: 'Często zadawane pytania',
19
+ };
20
+
21
+ const faq: GifAJpgLocaleContent['faq'] = [
22
+ {
23
+ question: 'Co dzieje się z animacjami po przejściu na format JPG?',
24
+ answer:
25
+ 'Format JPG jest ściśle statyczny i nie obsługuje wielu klatek. Nasz konwerter wyodrębnia wyłącznie pierwszy obraz lub klatkę, która pojawia się w sekwencji pliku GIF.',
26
+ },
27
+ {
28
+ question: 'Czy stracę jakieś efekty specjalne lub przezroczyste tło?',
29
+ answer:
30
+ 'Tak, jest to naturalne zachowanie standardu JPG. Jeśli prześlesz plik GIF z przezroczystym tłem, automatycznie wstawimy pod spód jednolitą białą warstwę, aby uniknąć błędów w kolorach.',
31
+ },
32
+ {
33
+ question: 'Czy mogę wyodrębnić zdjęcia JPG z pliku GIF bez zapisywania treści przez witrynę?',
34
+ answer:
35
+ 'Absolutnie tak. Narzędzie jest aplikacją internetową opartą na interfejsie Canvas języka HTML5. Całe dekodowanie wykonuje procesor Twojego własnego urządzenia fizycznego.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAJpgLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Przeciągnij ruchome ciężkie pliki',
42
+ text: 'Umieść lub przeciągnij dany plik GIF ze swojego folderu do naszego pola przetwarzania.',
43
+ },
44
+ {
45
+ name: 'Czyste obliczanie pierwszej klatki',
46
+ text: 'W ułamku sekundy animacja zostaje wyodrębniona, tworząc plik JPG z jednolitym białym tłem bez kontaktu z serwerami.',
47
+ },
48
+ {
49
+ name: 'Pobierz je w postaci paczki ZIP',
50
+ text: 'Pobierz pliki za pomocą przycisków lub używając archiwum ZIP, jeśli przetwarzasz dużą liczbę plików.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAJpgLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'Specyfikacja techniczna Joint Photographic Experts Group',
57
+ url: 'https://en.wikipedia.org/wiki/JPEG',
58
+ },
59
+ {
60
+ name: 'CompuServe GIF Information',
61
+ url: 'https://www.w3.org/Graphics/GIF/spec-gif89a.txt',
62
+ },
63
+ ];
64
+
65
+ const seo: GifAJpgLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'Konwerter GIF na JPG: Wyodrębniaj klatki jako obrazy wysokiej jakości',
69
+ level: 2,
70
+ },
71
+ {
72
+ type: 'paragraph',
73
+ html: 'Pliki GIF od dziesięcioleci dominują w świecie krótkich animacji internetowych. Jednak ich animowana natura czyni je całkowicie bezużytecznymi jako miniatury, podglądy w mediach społecznościowych czy obrazy w dokumentach. Gdy potrzebujesz wyodrębnić konkretną klatkę z pliku GIF i przekształcić ją w wysokiej jakości obraz statyczny, konwersja na JPG jest najbardziej praktycznym i kompatybilnym rozwiązaniem.',
74
+ },
75
+ {
76
+ type: 'title',
77
+ text: 'GIF czy JPG? Formaty o przeciwstawnych przeznaczeniach',
78
+ level: 3,
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html: 'Format GIF (Graphics Interchange Format) został zaprojektowany w 1987 roku z poważnym ograniczeniem, które utrzymuje się do dziś: może reprezentować tylko 256 kolorów na klatkę. To techniczne ograniczenie nie miało znaczenia w przypadku prostych animacji z ograniczoną paletą, ale sprawia, że jest to format ubogi wizualnie dla rzeczywistych ujęć fotograficznych. JPG natomiast może renderować miliony kolorów dzięki zaawansowanym algorytmom kompresji percepcyjnej.',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: 'Wyodrębnienie klatki z pliku GIF i zapisanie jej jako JPG ma wiele zastosowań: generowanie miniatur dla odtwarzaczy wideo, tworzenie podglądów dla platform zarządzania treścią, uzyskiwanie obrazów statycznych do prezentacji lub po prostu archiwizowanie wizualnego momentu złożonej animacji. Wynikowy plik JPG będzie znacznie lżejszy niż oryginalny plik GIF i uniwersalnie kompatybilny.',
87
+ },
88
+ {
89
+ type: 'title',
90
+ text: 'Porównanie architektury: Lokalna kontra Chmurowa',
91
+ level: 3,
92
+ },
93
+ {
94
+ type: 'comparative',
95
+ items: [
96
+ {
97
+ title: 'Konwertery w chmurze',
98
+ description: 'Narzędzia przesyłające Twoje pliki na zdalny serwer w celu ich przetworzenia.',
99
+ icon: 'mdi:cloud-upload',
100
+ pointIcon: 'mdi:close-circle-outline',
101
+ points: [
102
+ 'Twoje pliki GIF wędrują przez internet do serwerów osób trzecich',
103
+ 'Opóźnienia sieciowe przy przesyłaniu i pobieraniu',
104
+ 'Limity rozmiaru i liczby plików na sesję',
105
+ 'Ryzyko przechowywania danych na cudzych serwerach',
106
+ ],
107
+ },
108
+ {
109
+ title: 'Nasza lokalna architektura',
110
+ description: 'Przetwarzanie bezpośrednio na Twoim sprzęcie za pomocą technologii Vanilla JS.',
111
+ icon: 'mdi:laptop-mac',
112
+ highlight: true,
113
+ points: [
114
+ 'Plik GIF nigdy nie opuszcza Twojego urządzenia',
115
+ 'Błyskawiczna prędkość bez oczekiwania na połączenie z siecią',
116
+ 'Brak limitów rozmiaru i liczby plików',
117
+ 'Całkowita prywatność: 0 bajtów wysyłanych na zewnątrz',
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Jak technicznie działa wyodrębnianie klatki',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: 'Lokalna konwersja opiera się na mocy interfejsu Canvas API języka HTML5. Po załadowaniu pliku GIF przeglądarka dekoduje go w pamięci jako natywny element Image. Renderując go na niewidocznym płótnie (canvas), silnik graficzny przeglądarki automatycznie przechwytuje pierwszą klatkę sekwencji animacji.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Ponieważ format JPG nie obsługuje przezroczystości, nasz algorytm stosuje jednolite białe tło przed eksportem. Metoda <code>toDataURL(\'image/jpeg\')</code> płótna generuje strumień bajtów JPG bezpośrednio w pamięci RAM Twojego komputera, bez żadnego połączenia sieciowego. Wynikowy plik jest natychmiast pobierany na Twoje urządzenie.',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: 'Ograniczona paleta kolorów pliku GIF',
138
+ html: 'Plik GIF może zawierać tylko 256 kolorów na klatkę. Wyodrębniony plik JPG odziedziczy tę ograniczoną paletę z oryginału: jeśli GIF posiadał przejścia tonalne lub był fotografią, może być widoczna pewna posteryzacja. Aby uzyskać najlepszy wynik, używaj plików GIF o prostych kolorach lub ilustracji.',
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Przypadki użycia i kompatybilność wynikowego pliku JPG',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ icon: 'mdi:check-circle',
148
+ items: [
149
+ 'Miniatury i podglądy dla platform wideo i systemów CMS.',
150
+ 'Obrazy nagłówkowe do postów w mediach społecznościowych.',
151
+ 'Wstawianie do dokumentów Word, PowerPoint lub PDF.',
152
+ 'Pliki prezentacji i materiały marketingowe.',
153
+ 'Uniwersalna kompatybilność z przeglądarkami na Windows, macOS i urządzeniach mobilnych.',
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Podsumowanie: klatka warta więcej niż cała animacja',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: 'Animowany plik GIF o rozmiarze 2 MB może wyprodukować plik JPG pierwszej klatki o rozmiarze zaledwie 50-200 KB, zależnie od rozdzielczości. Nasze narzędzie wykonuje tę konwersję w sposób błyskawiczny, prywatny i bez limitów, bezpośrednio w Twojej przeglądarce. Bez serwerów, bez kont, bez czekania.',
164
+ },
165
+ ];
166
+
167
+
168
+ export const content: GifAJpgLocaleContent = {
169
+ slug,
170
+ title,
171
+ description,
172
+ ui,
173
+ seo,
174
+ faq,
175
+ bibliography,
176
+ howTo,
177
+ schemas: generateSchemas({ title, description, inLanguage: 'pl', faq, howTo }),
178
+ };
@@ -0,0 +1,178 @@
1
+ import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
2
+ import { generateSchemas } from '../../../shared/logic/schemas';
3
+ import type { GifAJpgLocaleContent } from '../index';
4
+
5
+ const slug = 'conversor-gif-para-jpg';
6
+ const title = 'Converter GIF para JPG Online';
7
+ const description =
8
+ 'Extraia o primeiro fotograma dos seus GIFs e converta-o para JPG. Sem servidor. Processamento local no seu navegador. Grátis e ilimitado.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'Arraste os ficheiros GIF...',
12
+ convertText: 'Para convertê-los para JPG instantaneamente',
13
+ selectFiles: 'Selecionar ficheiros',
14
+ processedFiles: 'Ficheiros processados',
15
+ downloadAll: 'Descarregar Tudo (.zip)',
16
+ pending: 'Pendente',
17
+ bibliographyTitle: 'Referências Bibliográficas',
18
+ faqTitle: 'Perguntas Frequentes',
19
+ };
20
+
21
+ const faq: GifAJpgLocaleContent['faq'] = [
22
+ {
23
+ question: 'O que acontece com as animações quando passo para JPG?',
24
+ answer:
25
+ 'O formato JPG é estritamente estático e não suporta múltiplos fotogramas. O nosso conversor extrai unicamente a primeira imagem ou fotograma que aparece na sequência do GIF.',
26
+ },
27
+ {
28
+ question: 'Perderei algum efeito especial ou fundo transparente?',
29
+ answer:
30
+ 'Sim, é o comportamento natural do padrão JPG. Se carregar um GIF com fundo livre, inserimos automaticamente uma camada sólida branca subjacente para evitar cores corrompidas.',
31
+ },
32
+ {
33
+ question: 'Posso extrair fotos JPG de um GIF sem que o site guarde o meu conteúdo?',
34
+ answer:
35
+ 'Absolutamente sim. A ferramenta é uma Web App baseada no Canvas do HTML5. Toda a descodificação é executada pelo processador do seu próprio dispositivo físico.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAJpgLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Arraste Ficheiros Pesados Móveis',
42
+ text: 'Posicione ou arraste a partir da sua pasta esse GIF até largá-lo na nossa caixa de processamento.',
43
+ },
44
+ {
45
+ name: 'Cálculo Limpo do Primeiro Fotograma',
46
+ text: 'Em frações de tempo extrai-se a animação criando o JPG branco sólido sem contactar servidores.',
47
+ },
48
+ {
49
+ name: 'Capture-os Empacotados em Massa ZIP',
50
+ text: 'Descarregue com os botões ou usando o Zip se processou um grande número de ficheiros.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAJpgLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'Especificação Técnica Joint Photographic Experts Group',
57
+ url: 'https://en.wikipedia.org/wiki/JPEG',
58
+ },
59
+ {
60
+ name: 'CompuServe GIF Information',
61
+ url: 'https://www.w3.org/Graphics/GIF/spec-gif89a.txt',
62
+ },
63
+ ];
64
+
65
+ const seo: GifAJpgLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'Conversor de GIF para JPG: Extraia Fotogramas como Imagens de Alta Qualidade',
69
+ level: 2,
70
+ },
71
+ {
72
+ type: 'paragraph',
73
+ html: 'Os ficheiros GIF dominam há décadas o mundo das animações curtas na internet. No entanto, a sua natureza animada torna-os completamente inúteis como miniatura, pré-visualização para redes sociais ou imagem para documentos. Quando precisa de extrair um fotograma concreto de um GIF e convertê-lo numa imagem estática de alta qualidade, a conversão para JPG é a solução mais prática e compatível.',
74
+ },
75
+ {
76
+ type: 'title',
77
+ text: 'GIF ou JPG? Formatos com propósitos opostos',
78
+ level: 3,
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html: 'O GIF (Graphics Interchange Format) foi projetado em 1987 com uma limitação severa que persiste hoje: só pode representar 256 cores por fotograma. Esta restrição técnica não importava para animações simples com paletas reduzidas, mas torna-o num formato visualmente pobre para capturas de fotografia real. O JPG, por outro lado, pode renderizar milhões de cores com algoritmos de compressão percetual avançados.',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: 'Extrair um fotograma de um GIF e guardá-lo como JPG tem múltiplas aplicações: gerar thumbnails para reprodutores de vídeo, criar pré-visualizações para plataformas de gestão de conteúdos, obter imagens estáticas para apresentações ou simplesmente arquivar um momento visual de uma animação complex. O JPG resultante será muito mais leve que o GIF original e universalmente compatível.',
87
+ },
88
+ {
89
+ type: 'title',
90
+ text: 'Comparativa de Arquitetura: Local vs Nuvem',
91
+ level: 3,
92
+ },
93
+ {
94
+ type: 'comparative',
95
+ items: [
96
+ {
97
+ title: 'Conversores Cloud',
98
+ description: 'Ferramentas que carregam os seus ficheiros para um servidor remoto para os processar.',
99
+ icon: 'mdi:cloud-upload',
100
+ pointIcon: 'mdi:close-circle-outline',
101
+ points: [
102
+ 'Os seus GIFs viajam pela internet para servidores de terceiros',
103
+ 'Latência de rede em subida e descida',
104
+ 'Limites de tamanho e de ficheiros por sessão',
105
+ 'Risco de retenção de dados em servidores alheios',
106
+ ],
107
+ },
108
+ {
109
+ title: 'Nossa Arquitetura Local',
110
+ description: 'Processamento direto no seu hardware através de tecnologia Vanilla JS.',
111
+ icon: 'mdi:laptop-mac',
112
+ highlight: true,
113
+ points: [
114
+ 'O GIF nunca abandona o seu dispositivo',
115
+ 'Velocidade instantânea sem espera de rede',
116
+ 'Sem limites de tamanho nem de ficheiros',
117
+ 'Privacidade total: 0 bytes enviados para o exterior',
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Como funciona a extração técnica do fotograma',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: 'A conversão local apoia-se na potência do Canvas API do HTML5. Quando carrega um GIF, o navegador descodifica-o em memória como um elemento Image nativo. Ao renderizá-lo sobre um canvas invisível, o motor gráfico do navegador captura automaticamente o primeiro fotograma da sequência de animação.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Dado que o formato JPG não suporta transparências, o nosso algoritmo aplica um fundo branco sólido antes de exportar. O método <code>toDataURL(\'image/jpeg\')</code> do canvas gera o fluxo de bytes JPG diretamente na RAM do seu computador, sem nenhuma ligação de rede. O ficheiro resultante é descarregado imediatamente para o seu dispositivo.',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: 'Paleta de cores limitada do GIF',
138
+ html: 'O GIF só pode conter 256 cores por fotograma. O JPG extraído herdará essa paleta reduzida do original: se o GIF tinha degradados ou fotografias, pode ver-se com certa posterização. Para obter o melhor resultado, use GIFs com cores simples ou ilustrações.',
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Casos de uso e compatibilidade do JPG resultante',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ icon: 'mdi:check-circle',
148
+ items: [
149
+ 'Thumbnails e pré-visualizações para plataformas de vídeo e CMS.',
150
+ 'Imagens de capa para publicações em redes sociais.',
151
+ 'Inserção em documentos Word, PowerPoint ou PDF.',
152
+ 'Ficheiros de apresentação e materiais de marketing.',
153
+ 'Compatibilidade universal com visores em Windows, macOS e telemóveis.',
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Conclusão: o fotograma que vale mais do que a animação',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: 'Um GIF animado de 2 MB pode produzir um JPG do primeiro fotograma de apenas 50-200 KB, dependendo da resolução. A nossa ferramenta realiza esta conversão de forma instantânea, privada e sem limites diretamente no seu navegador. Sem servidores, sem contas, sem esperas.',
164
+ },
165
+ ];
166
+
167
+
168
+ export const content: GifAJpgLocaleContent = {
169
+ slug,
170
+ title,
171
+ description,
172
+ ui,
173
+ seo,
174
+ faq,
175
+ bibliography,
176
+ howTo,
177
+ schemas: generateSchemas({ title, description, inLanguage: 'pt', faq, howTo }),
178
+ };
@@ -0,0 +1,178 @@
1
+ import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
2
+ import { generateSchemas } from '../../../shared/logic/schemas';
3
+ import type { GifAJpgLocaleContent } from '../index';
4
+
5
+ const slug = 'konverter-gif-v-jpg';
6
+ const title = 'Конвертировать GIF в JPG Онлайн';
7
+ const description =
8
+ 'Извлеките первый кадр из ваших GIF-файлов и конвертируйте его в JPG. Без сервера. Локальная обработка в вашем браузере. Бесплатно и без ограничений.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'Перетащите файлы GIF...',
12
+ convertText: 'Чтобы мгновенно конвертировать их в JPG',
13
+ selectFiles: 'Выбрать файлы',
14
+ processedFiles: 'Обработанные файлы',
15
+ downloadAll: 'Скачать всё (.zip)',
16
+ pending: 'В ожидании',
17
+ bibliographyTitle: 'Библиографические ссылки',
18
+ faqTitle: 'Часто задаваемые вопросы',
19
+ };
20
+
21
+ const faq: GifAJpgLocaleContent['faq'] = [
22
+ {
23
+ question: 'Что происходит с анимацией при переходе в JPG?',
24
+ answer:
25
+ 'Format JPG является строго статичным и не поддерживает несколько кадров. Наш конвертер извлекает только первое изображение или кадр, который появляется в последовательности GIF.',
26
+ },
27
+ {
28
+ question: 'Потеряю ли я спецэффекты или прозрачный фон?',
29
+ answer:
30
+ 'Да, это естественное поведение стандарта JPG. Если вы загружаете GIF с прозрачным фоном, мы автоматически добавляем под него сплошной белый слой, чтобы избежать искажения цветов.',
31
+ },
32
+ {
33
+ question: 'Могу ли я извлечь JPG-фото из GIF так, чтобы сайт не сохранял мой контент?',
34
+ answer:
35
+ 'Безусловно, да. Инструмент представляет собой веб-приложение на базе HTML5 Canvas. Вся дешифровка выполняется процессором вашего собственного физического устройства.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAJpgLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Перетащите движущиеся тяжелые файлы',
42
+ text: 'Разместите или перетащите этот GIF из вашей папки в наше поле обработки.',
43
+ },
44
+ {
45
+ name: 'Чистое вычисление первого кадра',
46
+ text: 'За доли секунды анимация извлекается с созданием сплошного белого JPG без обращения к серверам.',
47
+ },
48
+ {
49
+ name: 'Получите их в виде ZIP-архива',
50
+ text: 'Скачайте файлы по отдельности или в виде ZIP-архива, если вы обработали большое количество файлов.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAJpgLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'Техническая спецификация Joint Photographic Experts Group',
57
+ url: 'https://en.wikipedia.org/wiki/JPEG',
58
+ },
59
+ {
60
+ name: 'CompuServe GIF Information',
61
+ url: 'https://www.w3.org/Graphics/GIF/spec-gif89a.txt',
62
+ },
63
+ ];
64
+
65
+ const seo: GifAJpgLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'Конвертер GIF в JPG: Извлекайте кадры как изображения высокого качества',
69
+ level: 2,
70
+ },
71
+ {
72
+ type: 'paragraph',
73
+ html: 'Файлы GIF десятилетиями доминировали в мире коротких анимаций в интернете. Однако их анимированная природа делает их совершенно бесполезными в качестве миниатюр, превью для социальных сетей или изображений для документов. Когда вам нужно извлечь конкретный кадр из GIF и превратить его в высококачественное статичное изображение, конвертация в JPG — самое практичное и совместимое решение.',
74
+ },
75
+ {
76
+ type: 'title',
77
+ text: 'GIF или JPG? Форматы с противоположными целями',
78
+ level: 3,
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html: 'GIF (Graphics Interchange Format) был разработан в 1987 году с суровым ограничением, которое сохраняется и сегодня: он может отображать только 256 цветов на кадр. Это техническое ограничение не имело значения для простых анимаций с ограниченной палитрой, но делает его визуально бедным форматом для реальных фотографий. JPG, напротив, может отображать миллионы цветов с помощью продвинутых алгоритмов перцептивного сжатия.',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: 'Извлечение кадра из GIF и сохранение его в формате JPG имеет множество применений: создание миниатюр для видеоплееров, предварительный просмотр для платформ управления контентом, получение статичных изображений для презентаций или просто архивирование визуального момента сложной анимации. Полученный JPG будет намного легче оригинального GIF и универсально совместим.',
87
+ },
88
+ {
89
+ type: 'title',
90
+ text: 'Сравнение архитектур: Локальная против Облачной',
91
+ level: 3,
92
+ },
93
+ {
94
+ type: 'comparative',
95
+ items: [
96
+ {
97
+ title: 'Облачные конвертеры',
98
+ description: 'Инструменты, которые загружают ваши файлы на удаленный сервер для обработки.',
99
+ icon: 'mdi:cloud-upload',
100
+ pointIcon: 'mdi:close-circle-outline',
101
+ points: [
102
+ 'Ваши GIF-файлы передаются через интернет на сторонние серверы',
103
+ 'Сетевая задержка при выгрузке и загрузке',
104
+ 'Ограничения на размер и количество файлов за сессию',
105
+ 'Риск хранения данных на чужих серверах',
106
+ ],
107
+ },
108
+ {
109
+ title: 'Наша локальная архитектура',
110
+ description: 'Прямая обработка на вашем оборудовании с использованием технологии Vanilla JS.',
111
+ icon: 'mdi:laptop-mac',
112
+ highlight: true,
113
+ points: [
114
+ 'GIF никогда не покидает ваше устройство',
115
+ 'Мгновенная скорость без ожидания сети',
116
+ 'Без ограничений по размеру или количеству файлов',
117
+ 'Полная конфиденциальность: 0 байт отправлено наружу',
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Как работает техническое извлечение кадра',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: 'Локальная конвертация опирается на возможности Canvas API стандарта HTML5. При загрузке GIF браузер декодирует его в памяти как нативный элемент Image. При рендеринге на невидимом холсте (canvas) графический движок браузера автоматически захватывает первый кадр анимационной последовательности.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Поскольку формат JPG не поддерживает прозрачность, наш алгоритм применяет сплошной белый фон перед экспортом. Метод <code>toDataURL(\'image/jpeg\')</code> холста генерирует поток байтов JPG прямо в оперативной памяти компьютера без какого-либо сетевого соединения. Результирующий файл немедленно загружается на ваше устройство.',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: 'Ограниченная цветовая палитра GIF',
138
+ html: 'GIF может содержать только 256 цветов на кадр. Извлеченный JPG унаследует эту сокращенную палитру оригинала: если в GIF были градиенты или фотографии, на нем может быть видна некоторая постеризация. Для достижения наилучшего результата используйте GIF с простыми цветами или иллюстрациями.',
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Примеры использования и совместимость итогового JPG',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ icon: 'mdi:check-circle',
148
+ items: [
149
+ 'Миниатюры и превью для видеоплатформ и CMS.',
150
+ 'Обложки для постов в социальных сетях.',
151
+ 'Вставка в документы Word, PowerPoint или PDF.',
152
+ 'Файлы презентаций и маркетинговые материалы.',
153
+ 'Универсальная совместимость с просмотрщиками в Windows, macOS и на мобильных устройствах.',
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Заключение: один кадр важнее всей анимации',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: 'Анимированный GIF размером 2 МБ может создать JPG первого кадра весом всего 50-200 КБ, в зависимости от разрешения. Наш инструмент выполняет эту конвертацию мгновенно, приватно и без ограничений прямо в вашем браузере. Без серверов, без аккаунтов, без ожидания.',
164
+ },
165
+ ];
166
+
167
+
168
+ export const content: GifAJpgLocaleContent = {
169
+ slug,
170
+ title,
171
+ description,
172
+ ui,
173
+ seo,
174
+ faq,
175
+ bibliography,
176
+ howTo,
177
+ schemas: generateSchemas({ title, description, inLanguage: 'ru', faq, howTo }),
178
+ };