@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 = 'gif-zu-jpg-konvertieren';
6
+ const title = 'GIF in JPG online konvertieren';
7
+ const description =
8
+ 'Extrahieren Sie das erste Bild aus Ihren GIFs und konvertieren Sie es in JPG. Ohne Server. Lokale Verarbeitung im Browser. Kostenlos und unbegrenzt.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'GIF-Dateien hierhere ziehen...',
12
+ convertText: 'Um sie sofort in JPG zu konvertieren',
13
+ selectFiles: 'Dateien auswählen',
14
+ processedFiles: 'Verarbeitete Dateien',
15
+ downloadAll: 'Alles herunterladen (.zip)',
16
+ pending: 'Ausstehend',
17
+ bibliographyTitle: 'Literaturhinweise',
18
+ faqTitle: 'Häufig gestellte Fragen',
19
+ };
20
+
21
+ const faq: GifAJpgLocaleContent['faq'] = [
22
+ {
23
+ question: 'Was passiert mit den Animationen, wenn ich zu JPG wechsle?',
24
+ answer:
25
+ 'Das JPG-Format ist streng statisch und unterstützt keine mehreren Einzelbilder. Unser Konverter extrahiert nur das erste Bild oder den ersten Frame aus der GIF-Sequenz.',
26
+ },
27
+ {
28
+ question: 'Verliere ich Spezialeffekte oder einen transparenten Hintergrund?',
29
+ answer:
30
+ 'Ja, das ist das natürliche Verhalten des JPG-Standards. Wenn Sie ein GIF mit transparentem Hintergrund hochladen, fügen wir automatisch eine solide weiße Hintergrundschicht ein, um Farbfehler zu vermeiden.',
31
+ },
32
+ {
33
+ question: 'Kann ich JPG-Fotos aus einem GIF extrahieren, ohne dass die Website meine Inhalte speichert?',
34
+ answer:
35
+ 'Absolut ja. Das Tool ist eine Web-App, die auf dem HTML5-Canvas basiert. Die gesamte Dekodierung wird vom Prozessor Ihres eigenen physischen Geräts ausgeführt.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAJpgLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Bewegliche schwere Dateien ziehen',
42
+ text: 'Platzieren oder ziehen Sie dieses GIF aus Ihrem Ordner in unsere Verarbeitungsbox.',
43
+ },
44
+ {
45
+ name: 'Saubere Berechnung des ersten Frames',
46
+ text: 'In Bruchteilen von Sekunden wird die Animation extrahiert und das solide weiße JPG erstellt, ohne Server zu kontaktieren.',
47
+ },
48
+ {
49
+ name: 'Erhalten Sie sie als ZIP-Paket',
50
+ text: 'Laden Sie sie über die Buttons oder als ZIP-Datei herunter, wenn Sie eine große Anzahl von Dateien verarbeitet haben.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAJpgLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'Technische Spezifikation 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: BigIntajpgLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'GIF-zu-JPG-Konverter: Extrahieren Sie Frames als hochwertige Bilder',
69
+ level: 2,
70
+ },
71
+ {
72
+ type: 'paragraph',
73
+ html: 'GIF-Dateien dominieren seit Jahrzehnten die Welt der kurzen Animationen im Internet. Ihre animierte Natur macht sie jedoch völlig nutzlos als Thumbnail, Vorschau für soziale Netzwerke oder Bild für Dokumente. Wenn Sie einen bestimmten Frame aus einem GIF extrahieren und in ein hochwertiges statisches Bild konvertieren müssen, ist die Konvertierung in JPG die praktischste und kompatibelste Lösung.',
74
+ },
75
+ {
76
+ type: 'title',
77
+ text: 'GIF oder JPG? Formate mit gegensätzlichen Zwecken',
78
+ level: 3,
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html: 'Das GIF (Graphics Interchange Format) wurde 1987 mit einer strengen Einschränkung entwickelt, die bis heute besteht: Es kann nur 256 Farben pro Frame darstellen. Diese technische Einschränkung war für einfache Animationen mit reduzierten Paletten egal, macht es aber zu einem visuell armen Format für reale Fotoaufnahmen. Das JPG hingegen kann Millionen von Farben mit fortschrittlichen perzeptuellen Kompressionsalgorithmen rendern.',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: 'Das Extrahieren eines Frames aus einem GIF und das Speichern als JPG hat vielfältige Anwendungen: Erstellen von Thumbnails für Videoplayer, Erstellen von Vorschauen für Content-Management-Plattformen, Erhalten statischer Bilder für Präsentationen oder einfach das Archivieren eines visuellen Moments einer komplexen Animation. Das resultierende JPG wird viel leichter sein als das ursprüngliche GIF und universell kompatibel.',
87
+ },
88
+ {
89
+ type: 'title',
90
+ text: 'Architekturvergleich: Lokal vs. Cloud',
91
+ level: 3,
92
+ },
93
+ {
94
+ type: 'comparative',
95
+ items: [
96
+ {
97
+ title: 'Cloud Konverter',
98
+ description: 'Tools, die Ihre Dateien auf einen Remote-Server hochladen, um sie zu verarbeiten.',
99
+ icon: 'mdi:cloud-upload',
100
+ pointIcon: 'mdi:close-circle-outline',
101
+ points: [
102
+ 'Ihre GIFs reisen über das Internet zu Servern von Drittanbietern',
103
+ 'Netzwerklatenz beim Hoch- und Herunterladen',
104
+ 'Größen- und Dateilimits pro Sitzung',
105
+ 'Risiko der Datenaufbewahrung auf fremden Servern',
106
+ ],
107
+ },
108
+ {
109
+ title: 'Unsere lokale Architektur',
110
+ description: 'Direkte Verarbeitung auf Ihrer Hardware mittels Vanilla JS-Technologie.',
111
+ icon: 'mdi:laptop-mac',
112
+ highlight: true,
113
+ points: [
114
+ 'Das GIF verlässt nie Ihr Gerät',
115
+ 'Sofortige Geschwindigkeit ohne Netzwerkwartezeit',
116
+ 'Keine Größen- oder Dateilimits',
117
+ 'Absoluter Datenschutz: 0 Bytes werden nach außen gesendet',
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Wie die technische Frame-Extraktion funktioniert',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: 'Die lokale Konvertierung stützt sich auf die Leistung des HTML5-Canvas-API. Wenn Sie ein GIF laden, dekodiert der Browser es im Speicher als natives Image-Element. Beim Rendern auf einem unsichtbaren Canvas erfasst die Grafik-Engine des Browsers automatisch den ersten Frame der Animationssequenz.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Da das JPG-Format keine Transparenzen unterstützt, wendet unser Algorithmus vor dem Export einen soliden weißen Hintergrund an. Die <code>toDataURL(\'image/jpeg\')</code> Methode des Canvas generiert den JPG-Bytestrom direkt im RAM Ihres Computers, ohne jegliche Netzwerkverbindung. Die resultierende Datei wird sofort auf Ihr Gerät heruntergeladen.',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: 'Eingeschränkte Farbpalette des GIFs',
138
+ html: 'Das GIF kann nur 256 Farben pro Frame enthalten. Das extrahierte JPG erbt diese reduzierte Palette vom Original: Wenn das GIF Verläufe oder Fotos hatte, kann es zu einer gewissen Posterisierung kommen. Verwenden Sie für das beste Ergebnis GIFs mit einfachen Farben oder Illustrationen.',
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Anwendungsfälle und Kompatibilität des resultierenden JPGs',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ icon: 'mdi:check-circle',
148
+ items: [
149
+ 'Thumbnails und Vorschauen für Videoplattformen und CMS.',
150
+ 'Titelbilder für Social-Media-Beiträge.',
151
+ 'Einfügen in Word-, PowerPoint- oder PDF-Dokumente.',
152
+ 'Präsentationsdateien und Marketingmaterialien.',
153
+ 'Universelle Kompatibilität mit Viewern unter Windows, macOS und Mobilgeräten.',
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Fazit: Der Frame, der mehr wert ist als die Animation',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: 'Ein animiertes GIF von 2 MB kann ein JPG des ersten Frames von nur etwa 50-200 KB erzeugen, abhängig von der Auflösung. Unser Tool führt diese Konvertierung sofort, privat und ohne Limits direkt in Ihrem Browser durch. Ohne Server, ohne Konten, ohne Wartezeiten.',
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: 'de', faq, howTo }),
178
+ };
@@ -1,5 +1,5 @@
1
- import type { WithContext, SoftwareApplication } from 'schema-dts';
2
1
  import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
2
+ import { generateSchemas } from '../../../shared/logic/schemas';
3
3
  import type { GifAJpgLocaleContent } from '../index';
4
4
 
5
5
  const slug = 'gif-to-jpg-converter';
@@ -164,16 +164,6 @@ const seo: GifAJpgLocaleContent['seo'] = [
164
164
  },
165
165
  ];
166
166
 
167
- const appSchema: WithContext<SoftwareApplication> = {
168
- '@context': 'https://schema.org',
169
- '@type': 'SoftwareApplication',
170
- name: title,
171
- description,
172
- applicationCategory: 'UtilitiesApplication',
173
- operatingSystem: 'Web',
174
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
175
- inLanguage: 'en',
176
- };
177
167
 
178
168
  export const content: GifAJpgLocaleContent = {
179
169
  slug,
@@ -184,5 +174,5 @@ export const content: GifAJpgLocaleContent = {
184
174
  faq,
185
175
  bibliography,
186
176
  howTo,
187
- schemas: [appSchema as any],
177
+ schemas: generateSchemas({ title, description, inLanguage: 'en', faq, howTo }),
188
178
  };
@@ -1,5 +1,5 @@
1
- import type { WithContext, SoftwareApplication } from 'schema-dts';
2
1
  import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
2
+ import { generateSchemas } from '../../../shared/logic/schemas';
3
3
  import type { GifAJpgLocaleContent } from '../index';
4
4
 
5
5
  const slug = 'convertidor-gif-a-jpg';
@@ -164,16 +164,6 @@ const seo: GifAJpgLocaleContent['seo'] = [
164
164
  },
165
165
  ];
166
166
 
167
- const appSchema: WithContext<SoftwareApplication> = {
168
- '@context': 'https://schema.org',
169
- '@type': 'SoftwareApplication',
170
- name: title,
171
- description,
172
- applicationCategory: 'UtilitiesApplication',
173
- operatingSystem: 'Web',
174
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
175
- inLanguage: 'es',
176
- };
177
167
 
178
168
  export const content: GifAJpgLocaleContent = {
179
169
  slug,
@@ -184,5 +174,5 @@ export const content: GifAJpgLocaleContent = {
184
174
  faq,
185
175
  bibliography,
186
176
  howTo,
187
- schemas: [appSchema as any],
177
+ schemas: generateSchemas({ title, description, inLanguage: 'es', faq, howTo }),
188
178
  };
@@ -1,5 +1,5 @@
1
- import type { WithContext, SoftwareApplication } from 'schema-dts';
2
1
  import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
2
+ import { generateSchemas } from '../../../shared/logic/schemas';
3
3
  import type { GifAJpgLocaleContent } from '../index';
4
4
 
5
5
  const slug = 'convertisseur-gif-en-jpg';
@@ -164,16 +164,6 @@ const seo: GifAJpgLocaleContent['seo'] = [
164
164
  },
165
165
  ];
166
166
 
167
- const appSchema: WithContext<SoftwareApplication> = {
168
- '@context': 'https://schema.org',
169
- '@type': 'SoftwareApplication',
170
- name: title,
171
- description,
172
- applicationCategory: 'UtilitiesApplication',
173
- operatingSystem: 'Web',
174
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
175
- inLanguage: 'fr',
176
- };
177
167
 
178
168
  export const content: GifAJpgLocaleContent = {
179
169
  slug,
@@ -184,5 +174,5 @@ export const content: GifAJpgLocaleContent = {
184
174
  faq,
185
175
  bibliography,
186
176
  howTo,
187
- schemas: [appSchema as any],
177
+ schemas: generateSchemas({ title, description, inLanguage: 'fr', faq, howTo }),
188
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-ke-jpg';
6
+ const title = 'Ubah GIF ke JPG Online';
7
+ const description =
8
+ 'Ekstrak bingkai pertama dari GIF Anda dan ubah ke JPG. Tanpa server. Pemrosesan lokal di browser Anda. Gratis dan tidak terbatas.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'Seret file GIF...',
12
+ convertText: 'Untuk mengubahnya ke JPG secara instan',
13
+ selectFiles: 'Pilih file',
14
+ processedFiles: 'File yang diproses',
15
+ downloadAll: 'Unduh Semua (.zip)',
16
+ pending: 'Tertunda',
17
+ bibliographyTitle: 'Referensi Bibliografi',
18
+ faqTitle: 'Pertanyaan Umum',
19
+ };
20
+
21
+ const faq: GifAJpgLocaleContent['faq'] = [
22
+ {
23
+ question: 'Apa yang terjadi pada animasi saat saya mengubahnya ke JPG?',
24
+ answer:
25
+ 'Format JPG bersifat statis dan tidak mendukung banyak bingkai (frame). Konverter kami hanya mengekstrak gambar pertama atau bingkai pertama yang muncul dalam urutan GIF.',
26
+ },
27
+ {
28
+ question: 'Apakah saya akan kehilangan efek khusus atau latar belakang transparan?',
29
+ answer:
30
+ 'Ya, itu adalah perilaku alami dari standar JPG. Jika Anda mengunggah GIF dengan latar belakang transparan, kami secara otomatis menyisipkan lapisan putih pekat di bawahnya untuk menghindari warna yang rusak.',
31
+ },
32
+ {
33
+ question: 'Bisakah saya mengekstrak foto JPG dari GIF tanpa situs web menyimpan konten saya?',
34
+ answer:
35
+ 'Tentu saja ya. Alat ini adalah Web App yang berbasis pada Canvas HTML5. Seluruh dekode dilakukan oleh prosesor perangkat fisik Anda sendiri.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAJpgLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Seret File Berat yang Bisa Bergerak',
42
+ text: 'Letakkan atau seret GIF tersebut dari folder Anda sampai Anda menjatuhkannya ke kotak pemrosesan kami.',
43
+ },
44
+ {
45
+ name: 'Perhitungan Bersih Bingkai Pertama',
46
+ text: 'Dalam hitungan detik, animasi akan diekstrak dan JPG latar belakang putih pekat dibuat tanpa menghubungi server.',
47
+ },
48
+ {
49
+ name: 'Dapatkan dalam Bentuk Paket ZIP',
50
+ text: 'Unduh melalui tombol atau menggunakan ZIP jika Anda memproses banyak file.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAJpgLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'Spesifikasi Teknis 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: 'Konverter GIF ke JPG: Ekstrak Bingkai sebagai Gambar Berkualitas Tinggi',
69
+ level: 2,
70
+ },
71
+ {
72
+ type: 'paragraph',
73
+ html: 'File GIF telah mendominasi dunia animasi pendek di internet selama beberapa dekade. Namun, sifat animasinya membuatnya sangat tidak berguna sebagai thumbnail, pratinjau untuk jejaring sosial, atau gambar untuk dokumen. Saat Anda perlu mengekstrak bingkai tertentu dari GIF dan mengubahnya menjadi gambar statis berkualitas tinggi, konversi ke JPG adalah solusi yang paling praktis dan kompatibel.',
74
+ },
75
+ {
76
+ type: 'title',
77
+ text: 'GIF atau JPG? Format dengan tujuan yang berlawanan',
78
+ level: 3,
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html: 'GIF (Graphics Interchange Format) dirancang pada tahun 1987 dengan batasan ketat yang masih berlaku hingga sekarang: GIF hanya dapat mewakili 256 warna per bingkai. Batasan teknis ini tidak menjadi masalah untuk animasi sederhana dengan palet warna yang sedikit, namun hal ini menjadikannya format yang secara visual buruk untuk pengambilan foto asli. Sebaliknya, JPG dapat merender jutaan warna dengan algoritma kompresi perseptual tingkat lanjut.',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: 'Mengekstrak bingkai dari GIF dan menyimpannya sebagai JPG memiliki banyak kegunaan: membuat thumbnail untuk pemutar video, membuat pratinjau untuk platform manajemen konten, mendapatkan gambar statis untuk presentasi, atau sekadar mengarsipkan momen visual dari animasi yang kompleks. File JPG yang dihasilkan akan jauh lebih ringan daripada GIF asli dan kompatibel secara universal.',
87
+ },
88
+ {
89
+ type: 'title',
90
+ text: 'Perbandingan Arsitektur: Lokal vs Cloud',
91
+ level: 3,
92
+ },
93
+ {
94
+ type: 'comparative',
95
+ items: [
96
+ {
97
+ title: 'Konverter Cloud',
98
+ description: 'Alat yang mengunggah file Anda ke server jarak jauh untuk diproses.',
99
+ icon: 'mdi:cloud-upload',
100
+ pointIcon: 'mdi:close-circle-outline',
101
+ points: [
102
+ 'GIF Anda dikirim melalui internet ke server pihak ketiga',
103
+ 'Latensi jaringan saat mengunggah dan mengunduh',
104
+ 'Batasan ukuran dan file per sesi',
105
+ 'Risiko penyimpanan data di server orang lain',
106
+ ],
107
+ },
108
+ {
109
+ title: 'Arsitektur Lokal Kami',
110
+ description: 'Pemrosesan langsung di perangkat keras Anda melalui teknologi Vanilla JS.',
111
+ icon: 'mdi:laptop-mac',
112
+ highlight: true,
113
+ points: [
114
+ 'GIF tidak pernah meninggalkan perangkat Anda',
115
+ 'Kecepatan instan tanpa waktu tunggu jaringan',
116
+ 'Tanpa batasan ukuran atau jumlah file',
117
+ 'Privasi total: 0 byte dikirim ke luar',
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Bagaimana cara kerja ekstraksi teknis bingkai tersebut',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: 'Konversi lokal didasarkan pada kekuatan Canvas API HTML5. Saat Anda memuat GIF, browser akan mendeskripsinya di memori sebagai elemen Image asli. Saat merendernya pada kanvas yang tidak terlihat, mesin grafis browser secara otomatis menangkap bingkai pertama dari urutan animasi.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Karena format JPG tidak mendukung transparansi, algoritma kami menerapkan latar belakang putih pekat sebelum mengekspor. Metode <code>toDataURL(\'image/jpeg\')</code> pada kanvas menghasilkan byte stream JPG langsung di memori RAM komputer Anda, tanpa koneksi jaringan apa pun. File yang dihasilkan akan segera diunduh ke perangkat Anda.',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: 'Palet warna GIF yang terbatas',
138
+ html: 'GIF hanya dapat mengandung 256 warna per bingkai. JPG yang diekstraksi akan mewarisi palet yang dikurangi itu dari aslinya: jika GIF tersebut memiliki gradasi atau foto, JPG tersebut mungkin terlihat mengalami posterisasi. Untuk hasil terbaik, gunakan GIF dengan warna sederhana atau ilustrasi.',
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Kasus penggunaan dan kompatibilitas JPG yang dihasilkan',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ icon: 'mdi:check-circle',
148
+ items: [
149
+ 'Thumbnail dan pratinjau untuk platform video dan CMS.',
150
+ 'Gambar sampul untuk postingan di jejaring sosial.',
151
+ 'Penyisipan ke dalam dokumen Word, PowerPoint, atau PDF.',
152
+ 'File presentasi dan materi pemasaran.',
153
+ 'Kompatibilitas universal dengan penampil di Windows, macOS, dan seluler.',
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Kesimpulan: Bingkai yang jauh lebih berharga daripada animasinya',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: 'Sebuah GIF animasi berukuran 2 MB dapat menghasilkan JPG bingkai pertama yang berukuran hanya sekitar 50-200 KB, tergantung pada resolusinya. Alat kami melakukan konversi ini secara instan, pribadi, dan tanpa batas langsung di dalam browser Anda. Tanpa server, tanpa akun, tanpa waktu tunggu.',
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: 'id', 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 = 'convertitore-gif-a-jpg';
6
+ const title = 'Convertire GIF in JPG Online';
7
+ const description =
8
+ 'Estrai il primo fotogramma dalle tue GIF e convertilo in JPG. Senza server. Elaborazione locale nel tuo browser. Gratuito e illimitato.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'Trascina i file GIF...',
12
+ convertText: 'Per convertirli in JPG istantaneamente',
13
+ selectFiles: 'Seleziona i file',
14
+ processedFiles: 'File elaborati',
15
+ downloadAll: 'Scarica tutto (.zip)',
16
+ pending: 'In attesa',
17
+ bibliographyTitle: 'Riferimenti Bibliografici',
18
+ faqTitle: 'Domande Frequenti',
19
+ };
20
+
21
+ const faq: GifAJpgLocaleContent['faq'] = [
22
+ {
23
+ question: 'Cosa succede alle animazioni quando passo a JPG?',
24
+ answer:
25
+ 'Il formato JPG è rigorosamente statico e non supporta più fotogrammi. Il nostro convertitore estrae unicamente la prima immagine o fotogramma che appare nella sequenza della GIF.',
26
+ },
27
+ {
28
+ question: 'Perderò qualche effetto speciale o sfondo trasparente?',
29
+ answer:
30
+ 'Sì, è il comportamento naturale dello standard JPG. Se carichi una GIF con sfondo trasparente, inseriamo automaticamente uno strato solido bianco sottostante per evitare colori corrotti.',
31
+ },
32
+ {
33
+ question: 'Posso estrarre foto JPG da una GIF senza che il sito salvi il mio contenuto?',
34
+ answer:
35
+ 'Assolutamente sì. Lo strumento è una Web App basata sul Canvas dell\'HTML5. Tutta la decodifica viene eseguita dal processore del tuo dispositivo fisico.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAJpgLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Trascina i file GIF',
42
+ text: 'Posiziona o trascina quella GIF dalla tua cartella fino a rilasciarla nel nostro box di elaborazione.',
43
+ },
44
+ {
45
+ name: 'Calcolo pulito del primo fotogramma',
46
+ text: 'In frazioni di secondo viene estratta l\'animazione creando la JPG a sfondo bianco solido senza contattare i server.',
47
+ },
48
+ {
49
+ name: 'Ottienili pacchettizzati in formato ZIP',
50
+ text: 'Scaricali tramite i pulsanti o usando lo ZIP se hai elaborato un gran numero di file.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAJpgLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'Specifica Tecnica 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: 'Convertitore da GIF a JPG: Estrai fotogrammi come immagini di alta qualità',
69
+ level: 2,
70
+ },
71
+ {
72
+ type: 'paragraph',
73
+ html: 'I file GIF dominano da decenni il mondo delle brevi animazioni su internet. Tuttavia, la loro natura animata le rende completamente inutili come miniatura, anteprima per i social network o immagine per documenti. Quando hai bisogno di estrarre un fotogramma specifico da una GIF e convertirlo in un\'immagine statica di alta qualità, la conversione in JPG è la soluzione più pratica e compatibile.',
74
+ },
75
+ {
76
+ type: 'title',
77
+ text: 'GIF o JPG? Formati con scopi opposti',
78
+ level: 3,
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html: 'Il GIF (Graphics Interchange Format) è stato progettato nel 1987 con una severa limitazione che persiste ancora oggi: può rappresentare solo 256 colori per fotogramma. Questa restrizione tecnica non importava per semplici animazioni con tavolozze ridotte, ma lo rende un formato visivamente povero per scatti fotografici reali. Il JPG, invece, può renderizzare milioni di colori con algoritmi di compressione percettiva avanzati.',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: 'Estrarre un fotogramma da una GIF e salvarlo come JPG ha molteplici applicazioni: generare miniature per lettori video, creare anteprime per piattaforme di gestione dei contenuti, ottenere immagini statiche per presentazioni o semplicemente archiviare un momento visivo di un\'animazione complessa. Il JPG risultante sarà molto più leggero del GIF originale e universalmente compatibile.',
87
+ },
88
+ {
89
+ type: 'title',
90
+ text: 'Confronto tra Architetture: Locale vs Cloud',
91
+ level: 3,
92
+ },
93
+ {
94
+ type: 'comparative',
95
+ items: [
96
+ {
97
+ title: 'Convertitori Cloud',
98
+ description: 'Strumenti che caricano i tuoi file su un server remoto per elaborarli.',
99
+ icon: 'mdi:cloud-upload',
100
+ pointIcon: 'mdi:close-circle-outline',
101
+ points: [
102
+ 'Le tue GIF viaggiano su internet verso server di terze parti',
103
+ 'Latenza di rete in upload e download',
104
+ 'Limiti di dimensione e di file per sessione',
105
+ 'Rischio di conservazione dei dati su server altrui',
106
+ ],
107
+ },
108
+ {
109
+ title: 'La Nostra Architettura Locale',
110
+ description: 'Elaborazione diretta sul tuo hardware tramite tecnologia Vanilla JS.',
111
+ icon: 'mdi:laptop-mac',
112
+ highlight: true,
113
+ points: [
114
+ 'La GIF non abbandona mai il tuo dispositivo',
115
+ 'Velocità istantanea senza attese di rete',
116
+ 'Senza limiti di dimensione né di file',
117
+ 'Privatatezza totale: 0 byte inviati all\'esterno',
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Come funziona l\'estrazione tecnica del fotogramma',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: 'La conversione locale si appoggia sulla potenza del Canvas API di HTML5. Quando carichi una GIF, il browser la decodifica in memoria come un elemento Image nativo. Rendendola su un canvas invisibile, il motore grafico del browser cattura automaticamente il primo fotogramma della sequenza di animazione.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Dato che il formato JPG non supporta trasparenze, il nostro algoritmo applica uno sfondo bianco solido prima di esportare. Il metodo <code>toDataURL(\'image/jpeg\')</code> del canvas genera il flusso di byte JPG direttamente nella memoria RAM del tuo computer, senza alcuna connessione di rete. Il file risultante viene scaricato immediatamente sul tuo dispositivo.',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: 'Tavolozza di colori limitata della GIF',
138
+ html: 'La GIF può contenere solo 256 colori per fotogramma. La JPG estratta erediterà quella tavolozza ridotta dall\'originale: se la GIF aveva sfumature o fotografie, potrebbe apparire con una certa posterizzazione. Per ottenere il miglior risultato, usa GIF con colori semplici o illustrazioni.',
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Casi d\'uso e compatibilità della JPG risultante',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ icon: 'mdi:check-circle',
148
+ items: [
149
+ 'Miniature e anteprime per piattaforme video e CMS.',
150
+ 'Immagini di copertina per post sui social network.',
151
+ 'Inserimento in documenti Word, PowerPoint o PDF.',
152
+ 'File di presentazione e materiali di marketing.',
153
+ 'Compatibilità universale con visualizzatori su Windows, macOS e mobili.',
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Conclusione: il fotogramma che vale più dell\'animazione',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: 'Una GIF animata da 2 MB può produrre una JPG del primo fotogramma di appena 50-200 KB, a seconda della risoluzione. Il nostro strumento esegue questa conversione in modo istantaneo, privato e senza limiti direttamente nel tuo browser. Senza server, senza account, senza attese.',
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: 'it', faq, howTo }),
178
+ };