@jjlmoya/utils-converters 1.7.0 → 1.8.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 (345) 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/title_quality.test.ts +55 -0
  10. package/src/tool/avifAJpg/i18n/de.ts +178 -0
  11. package/src/tool/avifAJpg/i18n/en.ts +2 -12
  12. package/src/tool/avifAJpg/i18n/es.ts +2 -12
  13. package/src/tool/avifAJpg/i18n/fr.ts +2 -12
  14. package/src/tool/avifAJpg/i18n/id.ts +178 -0
  15. package/src/tool/avifAJpg/i18n/it.ts +178 -0
  16. package/src/tool/avifAJpg/i18n/ja.ts +178 -0
  17. package/src/tool/avifAJpg/i18n/ko.ts +178 -0
  18. package/src/tool/avifAJpg/i18n/nl.ts +178 -0
  19. package/src/tool/avifAJpg/i18n/pl.ts +178 -0
  20. package/src/tool/avifAJpg/i18n/pt.ts +178 -0
  21. package/src/tool/avifAJpg/i18n/ru.ts +178 -0
  22. package/src/tool/avifAJpg/i18n/sv.ts +178 -0
  23. package/src/tool/avifAJpg/i18n/tr.ts +178 -0
  24. package/src/tool/avifAJpg/i18n/zh.ts +178 -0
  25. package/src/tool/avifAJpg/index.ts +13 -1
  26. package/src/tool/avifAPng/i18n/de.ts +178 -0
  27. package/src/tool/avifAPng/i18n/en.ts +2 -12
  28. package/src/tool/avifAPng/i18n/es.ts +2 -12
  29. package/src/tool/avifAPng/i18n/fr.ts +2 -12
  30. package/src/tool/avifAPng/i18n/id.ts +178 -0
  31. package/src/tool/avifAPng/i18n/it.ts +178 -0
  32. package/src/tool/avifAPng/i18n/ja.ts +178 -0
  33. package/src/tool/avifAPng/i18n/ko.ts +178 -0
  34. package/src/tool/avifAPng/i18n/nl.ts +178 -0
  35. package/src/tool/avifAPng/i18n/pl.ts +178 -0
  36. package/src/tool/avifAPng/i18n/pt.ts +178 -0
  37. package/src/tool/avifAPng/i18n/ru.ts +178 -0
  38. package/src/tool/avifAPng/i18n/sv.ts +178 -0
  39. package/src/tool/avifAPng/i18n/tr.ts +178 -0
  40. package/src/tool/avifAPng/i18n/zh.ts +178 -0
  41. package/src/tool/avifAPng/index.ts +13 -1
  42. package/src/tool/avifAWebp/i18n/de.ts +178 -0
  43. package/src/tool/avifAWebp/i18n/en.ts +2 -12
  44. package/src/tool/avifAWebp/i18n/es.ts +2 -12
  45. package/src/tool/avifAWebp/i18n/fr.ts +2 -12
  46. package/src/tool/avifAWebp/i18n/id.ts +178 -0
  47. package/src/tool/avifAWebp/i18n/it.ts +178 -0
  48. package/src/tool/avifAWebp/i18n/ja.ts +178 -0
  49. package/src/tool/avifAWebp/i18n/ko.ts +178 -0
  50. package/src/tool/avifAWebp/i18n/nl.ts +178 -0
  51. package/src/tool/avifAWebp/i18n/pl.ts +178 -0
  52. package/src/tool/avifAWebp/i18n/pt.ts +178 -0
  53. package/src/tool/avifAWebp/i18n/ru.ts +178 -0
  54. package/src/tool/avifAWebp/i18n/sv.ts +178 -0
  55. package/src/tool/avifAWebp/i18n/tr.ts +178 -0
  56. package/src/tool/avifAWebp/i18n/zh.ts +178 -0
  57. package/src/tool/avifAWebp/index.ts +13 -1
  58. package/src/tool/bmpAJpg/i18n/de.ts +178 -0
  59. package/src/tool/bmpAJpg/i18n/en.ts +2 -12
  60. package/src/tool/bmpAJpg/i18n/es.ts +2 -12
  61. package/src/tool/bmpAJpg/i18n/fr.ts +2 -12
  62. package/src/tool/bmpAJpg/i18n/id.ts +178 -0
  63. package/src/tool/bmpAJpg/i18n/it.ts +178 -0
  64. package/src/tool/bmpAJpg/i18n/ja.ts +178 -0
  65. package/src/tool/bmpAJpg/i18n/ko.ts +178 -0
  66. package/src/tool/bmpAJpg/i18n/nl.ts +178 -0
  67. package/src/tool/bmpAJpg/i18n/pl.ts +178 -0
  68. package/src/tool/bmpAJpg/i18n/pt.ts +178 -0
  69. package/src/tool/bmpAJpg/i18n/ru.ts +178 -0
  70. package/src/tool/bmpAJpg/i18n/sv.ts +178 -0
  71. package/src/tool/bmpAJpg/i18n/tr.ts +178 -0
  72. package/src/tool/bmpAJpg/i18n/zh.ts +178 -0
  73. package/src/tool/bmpAJpg/index.ts +13 -1
  74. package/src/tool/bmpAPng/i18n/de.ts +177 -0
  75. package/src/tool/bmpAPng/i18n/en.ts +2 -12
  76. package/src/tool/bmpAPng/i18n/es.ts +2 -12
  77. package/src/tool/bmpAPng/i18n/fr.ts +2 -12
  78. package/src/tool/bmpAPng/i18n/id.ts +177 -0
  79. package/src/tool/bmpAPng/i18n/it.ts +177 -0
  80. package/src/tool/bmpAPng/i18n/ja.ts +177 -0
  81. package/src/tool/bmpAPng/i18n/ko.ts +177 -0
  82. package/src/tool/bmpAPng/i18n/nl.ts +177 -0
  83. package/src/tool/bmpAPng/i18n/pl.ts +177 -0
  84. package/src/tool/bmpAPng/i18n/pt.ts +177 -0
  85. package/src/tool/bmpAPng/i18n/ru.ts +177 -0
  86. package/src/tool/bmpAPng/i18n/sv.ts +177 -0
  87. package/src/tool/bmpAPng/i18n/tr.ts +177 -0
  88. package/src/tool/bmpAPng/i18n/zh.ts +177 -0
  89. package/src/tool/bmpAPng/index.ts +13 -1
  90. package/src/tool/bmpAWebp/i18n/de.ts +178 -0
  91. package/src/tool/bmpAWebp/i18n/en.ts +2 -12
  92. package/src/tool/bmpAWebp/i18n/es.ts +2 -12
  93. package/src/tool/bmpAWebp/i18n/fr.ts +2 -12
  94. package/src/tool/bmpAWebp/i18n/id.ts +178 -0
  95. package/src/tool/bmpAWebp/i18n/it.ts +178 -0
  96. package/src/tool/bmpAWebp/i18n/ja.ts +178 -0
  97. package/src/tool/bmpAWebp/i18n/ko.ts +178 -0
  98. package/src/tool/bmpAWebp/i18n/nl.ts +178 -0
  99. package/src/tool/bmpAWebp/i18n/pl.ts +178 -0
  100. package/src/tool/bmpAWebp/i18n/pt.ts +178 -0
  101. package/src/tool/bmpAWebp/i18n/ru.ts +178 -0
  102. package/src/tool/bmpAWebp/i18n/sv.ts +178 -0
  103. package/src/tool/bmpAWebp/i18n/tr.ts +178 -0
  104. package/src/tool/bmpAWebp/i18n/zh.ts +178 -0
  105. package/src/tool/bmpAWebp/index.ts +13 -1
  106. package/src/tool/gifAJpg/i18n/de.ts +178 -0
  107. package/src/tool/gifAJpg/i18n/en.ts +2 -12
  108. package/src/tool/gifAJpg/i18n/es.ts +2 -12
  109. package/src/tool/gifAJpg/i18n/fr.ts +2 -12
  110. package/src/tool/gifAJpg/i18n/id.ts +178 -0
  111. package/src/tool/gifAJpg/i18n/it.ts +178 -0
  112. package/src/tool/gifAJpg/i18n/ja.ts +178 -0
  113. package/src/tool/gifAJpg/i18n/ko.ts +178 -0
  114. package/src/tool/gifAJpg/i18n/nl.ts +178 -0
  115. package/src/tool/gifAJpg/i18n/pl.ts +178 -0
  116. package/src/tool/gifAJpg/i18n/pt.ts +178 -0
  117. package/src/tool/gifAJpg/i18n/ru.ts +178 -0
  118. package/src/tool/gifAJpg/i18n/sv.ts +178 -0
  119. package/src/tool/gifAJpg/i18n/tr.ts +178 -0
  120. package/src/tool/gifAJpg/i18n/zh.ts +178 -0
  121. package/src/tool/gifAJpg/index.ts +13 -1
  122. package/src/tool/gifAPng/i18n/de.ts +178 -0
  123. package/src/tool/gifAPng/i18n/en.ts +2 -12
  124. package/src/tool/gifAPng/i18n/es.ts +2 -12
  125. package/src/tool/gifAPng/i18n/fr.ts +2 -12
  126. package/src/tool/gifAPng/i18n/id.ts +178 -0
  127. package/src/tool/gifAPng/i18n/it.ts +178 -0
  128. package/src/tool/gifAPng/i18n/ja.ts +178 -0
  129. package/src/tool/gifAPng/i18n/ko.ts +178 -0
  130. package/src/tool/gifAPng/i18n/nl.ts +178 -0
  131. package/src/tool/gifAPng/i18n/pl.ts +178 -0
  132. package/src/tool/gifAPng/i18n/pt.ts +178 -0
  133. package/src/tool/gifAPng/i18n/ru.ts +178 -0
  134. package/src/tool/gifAPng/i18n/sv.ts +178 -0
  135. package/src/tool/gifAPng/i18n/tr.ts +178 -0
  136. package/src/tool/gifAPng/i18n/zh.ts +178 -0
  137. package/src/tool/gifAPng/index.ts +12 -0
  138. package/src/tool/gifAWebp/i18n/de.ts +178 -0
  139. package/src/tool/gifAWebp/i18n/en.ts +2 -12
  140. package/src/tool/gifAWebp/i18n/es.ts +2 -12
  141. package/src/tool/gifAWebp/i18n/fr.ts +2 -12
  142. package/src/tool/gifAWebp/i18n/id.ts +178 -0
  143. package/src/tool/gifAWebp/i18n/it.ts +178 -0
  144. package/src/tool/gifAWebp/i18n/ja.ts +178 -0
  145. package/src/tool/gifAWebp/i18n/ko.ts +178 -0
  146. package/src/tool/gifAWebp/i18n/nl.ts +178 -0
  147. package/src/tool/gifAWebp/i18n/pl.ts +178 -0
  148. package/src/tool/gifAWebp/i18n/pt.ts +178 -0
  149. package/src/tool/gifAWebp/i18n/ru.ts +178 -0
  150. package/src/tool/gifAWebp/i18n/sv.ts +178 -0
  151. package/src/tool/gifAWebp/i18n/tr.ts +178 -0
  152. package/src/tool/gifAWebp/i18n/zh.ts +178 -0
  153. package/src/tool/gifAWebp/index.ts +12 -0
  154. package/src/tool/imagenBase64/i18n/de.ts +168 -0
  155. package/src/tool/imagenBase64/i18n/en.ts +2 -12
  156. package/src/tool/imagenBase64/i18n/es.ts +2 -12
  157. package/src/tool/imagenBase64/i18n/fr.ts +2 -12
  158. package/src/tool/imagenBase64/i18n/id.ts +168 -0
  159. package/src/tool/imagenBase64/i18n/it.ts +168 -0
  160. package/src/tool/imagenBase64/i18n/ja.ts +168 -0
  161. package/src/tool/imagenBase64/i18n/ko.ts +168 -0
  162. package/src/tool/imagenBase64/i18n/nl.ts +168 -0
  163. package/src/tool/imagenBase64/i18n/pl.ts +168 -0
  164. package/src/tool/imagenBase64/i18n/pt.ts +173 -0
  165. package/src/tool/imagenBase64/i18n/ru.ts +168 -0
  166. package/src/tool/imagenBase64/i18n/sv.ts +168 -0
  167. package/src/tool/imagenBase64/i18n/tr.ts +168 -0
  168. package/src/tool/imagenBase64/i18n/zh.ts +168 -0
  169. package/src/tool/imagenBase64/index.ts +12 -0
  170. package/src/tool/jpgAIco/i18n/de.ts +183 -0
  171. package/src/tool/jpgAIco/i18n/en.ts +8 -13
  172. package/src/tool/jpgAIco/i18n/es.ts +13 -18
  173. package/src/tool/jpgAIco/i18n/fr.ts +9 -14
  174. package/src/tool/jpgAIco/i18n/id.ts +183 -0
  175. package/src/tool/jpgAIco/i18n/it.ts +183 -0
  176. package/src/tool/jpgAIco/i18n/ja.ts +183 -0
  177. package/src/tool/jpgAIco/i18n/ko.ts +183 -0
  178. package/src/tool/jpgAIco/i18n/nl.ts +183 -0
  179. package/src/tool/jpgAIco/i18n/pl.ts +183 -0
  180. package/src/tool/jpgAIco/i18n/pt.ts +183 -0
  181. package/src/tool/jpgAIco/i18n/ru.ts +183 -0
  182. package/src/tool/jpgAIco/i18n/sv.ts +183 -0
  183. package/src/tool/jpgAIco/i18n/tr.ts +183 -0
  184. package/src/tool/jpgAIco/i18n/zh.ts +183 -0
  185. package/src/tool/jpgAIco/index.ts +12 -0
  186. package/src/tool/jpgAPng/i18n/de.ts +178 -0
  187. package/src/tool/jpgAPng/i18n/en.ts +2 -12
  188. package/src/tool/jpgAPng/i18n/es.ts +2 -12
  189. package/src/tool/jpgAPng/i18n/fr.ts +2 -12
  190. package/src/tool/jpgAPng/i18n/id.ts +178 -0
  191. package/src/tool/jpgAPng/i18n/it.ts +178 -0
  192. package/src/tool/jpgAPng/i18n/ja.ts +178 -0
  193. package/src/tool/jpgAPng/i18n/ko.ts +178 -0
  194. package/src/tool/jpgAPng/i18n/nl.ts +178 -0
  195. package/src/tool/jpgAPng/i18n/pl.ts +178 -0
  196. package/src/tool/jpgAPng/i18n/pt.ts +178 -0
  197. package/src/tool/jpgAPng/i18n/ru.ts +178 -0
  198. package/src/tool/jpgAPng/i18n/sv.ts +178 -0
  199. package/src/tool/jpgAPng/i18n/tr.ts +178 -0
  200. package/src/tool/jpgAPng/i18n/zh.ts +178 -0
  201. package/src/tool/jpgAPng/index.ts +13 -1
  202. package/src/tool/jpgAWebp/i18n/de.ts +178 -0
  203. package/src/tool/jpgAWebp/i18n/en.ts +2 -12
  204. package/src/tool/jpgAWebp/i18n/es.ts +2 -12
  205. package/src/tool/jpgAWebp/i18n/fr.ts +2 -12
  206. package/src/tool/jpgAWebp/i18n/id.ts +178 -0
  207. package/src/tool/jpgAWebp/i18n/it.ts +178 -0
  208. package/src/tool/jpgAWebp/i18n/ja.ts +178 -0
  209. package/src/tool/jpgAWebp/i18n/ko.ts +178 -0
  210. package/src/tool/jpgAWebp/i18n/nl.ts +178 -0
  211. package/src/tool/jpgAWebp/i18n/pl.ts +178 -0
  212. package/src/tool/jpgAWebp/i18n/pt.ts +178 -0
  213. package/src/tool/jpgAWebp/i18n/ru.ts +178 -0
  214. package/src/tool/jpgAWebp/i18n/sv.ts +178 -0
  215. package/src/tool/jpgAWebp/i18n/tr.ts +178 -0
  216. package/src/tool/jpgAWebp/i18n/zh.ts +178 -0
  217. package/src/tool/jpgAWebp/index.ts +12 -0
  218. package/src/tool/pngAIco/i18n/de.ts +183 -0
  219. package/src/tool/pngAIco/i18n/en.ts +8 -13
  220. package/src/tool/pngAIco/i18n/es.ts +19 -24
  221. package/src/tool/pngAIco/i18n/fr.ts +20 -25
  222. package/src/tool/pngAIco/i18n/id.ts +183 -0
  223. package/src/tool/pngAIco/i18n/it.ts +183 -0
  224. package/src/tool/pngAIco/i18n/ja.ts +183 -0
  225. package/src/tool/pngAIco/i18n/ko.ts +183 -0
  226. package/src/tool/pngAIco/i18n/nl.ts +183 -0
  227. package/src/tool/pngAIco/i18n/pl.ts +183 -0
  228. package/src/tool/pngAIco/i18n/pt.ts +183 -0
  229. package/src/tool/pngAIco/i18n/ru.ts +183 -0
  230. package/src/tool/pngAIco/i18n/sv.ts +183 -0
  231. package/src/tool/pngAIco/i18n/tr.ts +183 -0
  232. package/src/tool/pngAIco/i18n/zh.ts +183 -0
  233. package/src/tool/pngAIco/index.ts +12 -0
  234. package/src/tool/pngAJpg/i18n/de.ts +191 -0
  235. package/src/tool/pngAJpg/i18n/en.ts +2 -12
  236. package/src/tool/pngAJpg/i18n/es.ts +2 -12
  237. package/src/tool/pngAJpg/i18n/fr.ts +2 -12
  238. package/src/tool/pngAJpg/i18n/id.ts +191 -0
  239. package/src/tool/pngAJpg/i18n/it.ts +191 -0
  240. package/src/tool/pngAJpg/i18n/ja.ts +191 -0
  241. package/src/tool/pngAJpg/i18n/ko.ts +191 -0
  242. package/src/tool/pngAJpg/i18n/nl.ts +191 -0
  243. package/src/tool/pngAJpg/i18n/pl.ts +191 -0
  244. package/src/tool/pngAJpg/i18n/pt.ts +191 -0
  245. package/src/tool/pngAJpg/i18n/ru.ts +191 -0
  246. package/src/tool/pngAJpg/i18n/sv.ts +191 -0
  247. package/src/tool/pngAJpg/i18n/tr.ts +191 -0
  248. package/src/tool/pngAJpg/i18n/zh.ts +191 -0
  249. package/src/tool/pngAJpg/index.ts +13 -1
  250. package/src/tool/pngAWebp/i18n/de.ts +182 -0
  251. package/src/tool/pngAWebp/i18n/en.ts +2 -12
  252. package/src/tool/pngAWebp/i18n/es.ts +2 -12
  253. package/src/tool/pngAWebp/i18n/fr.ts +2 -12
  254. package/src/tool/pngAWebp/i18n/id.ts +182 -0
  255. package/src/tool/pngAWebp/i18n/it.ts +182 -0
  256. package/src/tool/pngAWebp/i18n/ja.ts +182 -0
  257. package/src/tool/pngAWebp/i18n/ko.ts +182 -0
  258. package/src/tool/pngAWebp/i18n/nl.ts +182 -0
  259. package/src/tool/pngAWebp/i18n/pl.ts +182 -0
  260. package/src/tool/pngAWebp/i18n/pt.ts +182 -0
  261. package/src/tool/pngAWebp/i18n/ru.ts +182 -0
  262. package/src/tool/pngAWebp/i18n/sv.ts +182 -0
  263. package/src/tool/pngAWebp/i18n/tr.ts +182 -0
  264. package/src/tool/pngAWebp/i18n/zh.ts +182 -0
  265. package/src/tool/pngAWebp/index.ts +12 -0
  266. package/src/tool/svgAJpg/i18n/de.ts +178 -0
  267. package/src/tool/svgAJpg/i18n/en.ts +8 -13
  268. package/src/tool/svgAJpg/i18n/es.ts +8 -13
  269. package/src/tool/svgAJpg/i18n/fr.ts +2 -12
  270. package/src/tool/svgAJpg/i18n/id.ts +178 -0
  271. package/src/tool/svgAJpg/i18n/it.ts +178 -0
  272. package/src/tool/svgAJpg/i18n/ja.ts +178 -0
  273. package/src/tool/svgAJpg/i18n/ko.ts +178 -0
  274. package/src/tool/svgAJpg/i18n/nl.ts +178 -0
  275. package/src/tool/svgAJpg/i18n/pl.ts +178 -0
  276. package/src/tool/svgAJpg/i18n/pt.ts +178 -0
  277. package/src/tool/svgAJpg/i18n/ru.ts +178 -0
  278. package/src/tool/svgAJpg/i18n/sv.ts +178 -0
  279. package/src/tool/svgAJpg/i18n/tr.ts +178 -0
  280. package/src/tool/svgAJpg/i18n/zh.ts +178 -0
  281. package/src/tool/svgAJpg/index.ts +12 -0
  282. package/src/tool/svgAPng/i18n/de.ts +178 -0
  283. package/src/tool/svgAPng/i18n/en.ts +8 -13
  284. package/src/tool/svgAPng/i18n/es.ts +31 -36
  285. package/src/tool/svgAPng/i18n/fr.ts +2 -12
  286. package/src/tool/svgAPng/i18n/id.ts +178 -0
  287. package/src/tool/svgAPng/i18n/it.ts +178 -0
  288. package/src/tool/svgAPng/i18n/ja.ts +178 -0
  289. package/src/tool/svgAPng/i18n/ko.ts +178 -0
  290. package/src/tool/svgAPng/i18n/nl.ts +178 -0
  291. package/src/tool/svgAPng/i18n/pl.ts +178 -0
  292. package/src/tool/svgAPng/i18n/pt.ts +178 -0
  293. package/src/tool/svgAPng/i18n/ru.ts +178 -0
  294. package/src/tool/svgAPng/i18n/sv.ts +178 -0
  295. package/src/tool/svgAPng/i18n/tr.ts +178 -0
  296. package/src/tool/svgAPng/i18n/zh.ts +178 -0
  297. package/src/tool/svgAPng/index.ts +12 -0
  298. package/src/tool/webpAIco/i18n/de.ts +183 -0
  299. package/src/tool/webpAIco/i18n/en.ts +8 -13
  300. package/src/tool/webpAIco/i18n/es.ts +9 -14
  301. package/src/tool/webpAIco/i18n/fr.ts +11 -16
  302. package/src/tool/webpAIco/i18n/id.ts +183 -0
  303. package/src/tool/webpAIco/i18n/it.ts +183 -0
  304. package/src/tool/webpAIco/i18n/ja.ts +183 -0
  305. package/src/tool/webpAIco/i18n/ko.ts +183 -0
  306. package/src/tool/webpAIco/i18n/nl.ts +183 -0
  307. package/src/tool/webpAIco/i18n/pl.ts +183 -0
  308. package/src/tool/webpAIco/i18n/pt.ts +183 -0
  309. package/src/tool/webpAIco/i18n/ru.ts +183 -0
  310. package/src/tool/webpAIco/i18n/sv.ts +183 -0
  311. package/src/tool/webpAIco/i18n/tr.ts +183 -0
  312. package/src/tool/webpAIco/i18n/zh.ts +183 -0
  313. package/src/tool/webpAIco/index.ts +12 -0
  314. package/src/tool/webpAJpg/i18n/de.ts +187 -0
  315. package/src/tool/webpAJpg/i18n/en.ts +9 -13
  316. package/src/tool/webpAJpg/i18n/es.ts +37 -42
  317. package/src/tool/webpAJpg/i18n/fr.ts +35 -40
  318. package/src/tool/webpAJpg/i18n/id.ts +182 -0
  319. package/src/tool/webpAJpg/i18n/it.ts +182 -0
  320. package/src/tool/webpAJpg/i18n/ja.ts +182 -0
  321. package/src/tool/webpAJpg/i18n/ko.ts +182 -0
  322. package/src/tool/webpAJpg/i18n/nl.ts +182 -0
  323. package/src/tool/webpAJpg/i18n/pl.ts +182 -0
  324. package/src/tool/webpAJpg/i18n/pt.ts +182 -0
  325. package/src/tool/webpAJpg/i18n/ru.ts +182 -0
  326. package/src/tool/webpAJpg/i18n/sv.ts +182 -0
  327. package/src/tool/webpAJpg/i18n/tr.ts +182 -0
  328. package/src/tool/webpAJpg/i18n/zh.ts +182 -0
  329. package/src/tool/webpAJpg/index.ts +12 -0
  330. package/src/tool/webpAPng/i18n/de.ts +182 -0
  331. package/src/tool/webpAPng/i18n/en.ts +8 -13
  332. package/src/tool/webpAPng/i18n/es.ts +35 -40
  333. package/src/tool/webpAPng/i18n/fr.ts +2 -12
  334. package/src/tool/webpAPng/i18n/id.ts +182 -0
  335. package/src/tool/webpAPng/i18n/it.ts +182 -0
  336. package/src/tool/webpAPng/i18n/ja.ts +182 -0
  337. package/src/tool/webpAPng/i18n/ko.ts +182 -0
  338. package/src/tool/webpAPng/i18n/nl.ts +182 -0
  339. package/src/tool/webpAPng/i18n/pl.ts +182 -0
  340. package/src/tool/webpAPng/i18n/pt.ts +182 -0
  341. package/src/tool/webpAPng/i18n/ru.ts +182 -0
  342. package/src/tool/webpAPng/i18n/sv.ts +182 -0
  343. package/src/tool/webpAPng/i18n/tr.ts +182 -0
  344. package/src/tool/webpAPng/i18n/zh.ts +182 -0
  345. 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-jpg-donusturucu';
6
+ const title = 'GIF\'i JPG\'ye Çevrimiçi Dönüştür';
7
+ const description =
8
+ 'GIF dosyalarınızdan ilk kareyi çıkarın ve bunu JPG\'ye dönüştürün. Sunucu yok. Tarayıcınızda yerel işleme. Ücretsiz ve sınırsız.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'GIF dosyalarını buraya sürükleyin...',
12
+ convertText: 'Anında JPG\'ye dönüştürmek için',
13
+ selectFiles: 'Dosyaları seçin',
14
+ processedFiles: 'İşlenen dosyalar',
15
+ downloadAll: 'Tümünü İndir (.zip)',
16
+ pending: 'Bekliyor',
17
+ bibliographyTitle: 'Bibliyografik Referanslar',
18
+ faqTitle: 'Sıkça Sorulan Sorular',
19
+ };
20
+
21
+ const faq: GifAJpgLocaleContent['faq'] = [
22
+ {
23
+ question: 'JPG\'ye geçtiğimde animasyonlara ne olur?',
24
+ answer:
25
+ 'JPG formatı kesinlikle statiktir ve çoklu kareleri desteklemez. Dönüştürücümüz, GIF dizisinde görünen yalnızca ilk resmi veya kareyi çıkarır.',
26
+ },
27
+ {
28
+ question: 'Özel efektleri veya şeffaf arka planı kaybeder miyim?',
29
+ answer:
30
+ 'Evet, bu JPG standardının doğal davranışıdır. Şeffaf arka plana sahip bir GIF yüklerseniz, renk bozulmalarını önlemek için altına otomatik olarak düz beyaz bir katman ekleriz.',
31
+ },
32
+ {
33
+ question: 'Web sitesi içeriğimi kaydetmeden bir GIF\'ten JPG fotoğraflar çıkarabilir miyim?',
34
+ answer:
35
+ 'Kesinlikle evet. Araç, HTML5 Canvas tabanlı bir Web Uygulamasıdır. Tüm kod çözme işlemi kendi fiziksel cihazınızın işlemcisi tarafından gerçekleştirilir.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAJpgLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Hareketli Büyük Dosyaları Sürükleyin',
42
+ text: 'Klasörünüzdeki o GIF\'i işleme kutumuza bırakana kadar konumlandırın veya sürükleyin.',
43
+ },
44
+ {
45
+ name: 'İlk Karenin Temiz Hesaplaması',
46
+ text: 'Saniyeler içinde, sunucularla bağlantı kurmadan düz beyaz JPG oluşturularak animasyon çıkarılır.',
47
+ },
48
+ {
49
+ name: 'ZIP Paketi Olarak Alın',
50
+ text: 'Düğmeleri kullanarak veya çok sayıda dosya işlediyseniz ZIP kullanarak indirin.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAJpgLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'Joint Photographic Experts Group Teknik Özellikleri',
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\'ten JPG\'ye Dönüştürücü: Kareleri Yüksek Kaliteli Görüntüler Olarak Çıkarın',
69
+ level: 2,
70
+ },
71
+ {
72
+ type: 'paragraph',
73
+ html: 'GIF dosyaları onlarca yıldır internetteki kısa animasyonlar dünyasına hükmediyor. Ancak animasyonlu yapıları, onları küçük resim, sosyal ağlar için önizleme veya belgeler için görüntü olarak tamamen kullanışlı olmaktan çıkarıyor. Bir GIF\'ten belirli bir kareyi çıkarmanız ve bunu yüksek kaliteli statik bir görüntüye dönüştürmeniz gerektiğinde, JPG dönüşümü en pratik ve uyumlu çözümdür.',
74
+ },
75
+ {
76
+ type: 'title',
77
+ text: 'GIF mi yoksa JPG mi? Zıt amaçlara sahip formatlar',
78
+ level: 3,
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html: 'GIF (Graphics Interchange Format), 1987 yılında bugün de devam eden ciddi bir kısıtlamayla tasarlandı: kare başına yalnızca 256 renk temsil edebilir. Bu teknik kısıtlama, azaltılmış paletli basit animasyonlar için önemli değildi, ancak onu gerçek fotoğraf çekimleri için görsel olarak zayıf bir format haline getiriyor. Öte yandan JPG, gelişmiş algısal sıkıştırma algoritmalarıyla milyonlarca rengi işleyebilir.',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: 'Bir GIF\'ten bir kare çıkarmanın ve bunu JPG olarak kaydetmenin çok sayıda uygulaması vardır: video oynatıcılar için küçük resimler oluşturmak, içerik yönetim platformları için önizlemeler oluşturmak, sunumlar için statik görüntüler elde etmek veya karmaşık bir animasyonun görsel bir anını arşivlemek. Sonuçta ortaya çıkan JPG, orijinal GIF\'ten çok daha hafif olacak ve evrensel olarak uyumlu olacaktır.',
87
+ },
88
+ {
89
+ type: 'title',
90
+ text: 'Mimari Karşılaştırması: Yerel vs Bulut',
91
+ level: 3,
92
+ },
93
+ {
94
+ type: 'comparative',
95
+ items: [
96
+ {
97
+ title: 'Bulut Dönüştürücüler',
98
+ description: 'Dosyalarınızı işlemek için uzak bir sunucuya yükleyen araçlar.',
99
+ icon: 'mdi:cloud-upload',
100
+ pointIcon: 'mdi:close-circle-outline',
101
+ points: [
102
+ 'GIF\'leriniz internet üzerinden üçüncü taraf sunuculara gider',
103
+ 'Yükleme ve indirmede ağ gecikmesi',
104
+ 'Oturum başına boyut ve dosya sınırları',
105
+ 'Verilerin başkalarının sunucularında tutulma riski',
106
+ ],
107
+ },
108
+ {
109
+ title: 'Yerel Mimarimiz',
110
+ description: 'Vanilla JS teknolojisi ile doğrudan donanımınızda işleme.',
111
+ icon: 'mdi:laptop-mac',
112
+ highlight: true,
113
+ points: [
114
+ 'GIF cihazınızı asla terk etmez',
115
+ 'Ağ bekleyişi olmadan anında hız',
116
+ 'Boyut veya dosya sınırı yok',
117
+ 'Tam gizlilik: dışarıya 0 bayt gönderilir',
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Karenin teknik olarak çıkarılması nasıl çalışır?',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: 'Yerel dönüşüm, HTML5\'in Canvas API\'sinin gücüne dayanır. Bir GIF yüklediğinizde, tarayıcı onu yerel bir Image öğesi olarak bellekte çözer. Görünmez bir tuval üzerinde işlerken, tarayıcının grafik motoru animasyon dizisinin ilk karesini otomatik olarak yakalar.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'JPG formatı şeffaflığı desteklemediğinden, algoritmamız dışa aktarmadan önce düz beyaz bir arka plan uygular. Tuvalin <code>toDataURL(\'image/jpeg\')</code> yöntemi, herhangi bir ağ bağlantısı olmadan doğrudan bilgisayarınızın RAM\'inde JPG bayt akışını oluşturur. Sonuç dosyası anında cihazınıza indirilir.',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: 'GIF\'in sınırlı renk paleti',
138
+ html: 'GIF, her karede yalnızca 256 renk içerebilir. Çıkarılan JPG, bu azaltılmış paleti orijinalinden devralacaktır: GIF\'te gradyanlar veya fotoğraflar varsa, bir miktar posterizasyon görülebilir. En iyi sonucu elde etmek için basit renkli veya illüstrasyonlu GIF\'ler kullanın.',
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Elde edilen JPG\'nin kullanım durumları ve uyumluluğu',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ icon: 'mdi:check-circle',
148
+ items: [
149
+ 'Video platformları ve CMS\'ler için küçük resimler ve önizlemeler.',
150
+ 'Sosyal ağlardaki paylaşımlar için kapak resimleri.',
151
+ 'Word, PowerPoint veya PDF belgelerine yerleştirme.',
152
+ 'Sunum dosyaları ve pazarlama materyalleri.',
153
+ 'Windows, macOS ve mobil cihazlardaki görüntüleyicilerle evrensel uyumluluk.',
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Sonuç: animasyondan daha değerli olan kare',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: '2 MB\'lık animasyonlu bir GIF, çözünürlüğe bağlı olarak yalnızca 50-200 KB boyutunda bir ilk kare JPG\'si üretebilir. Aracımız bu dönüşümü anında, özel ve sınırsız bir şekilde doğrudan tarayıcınızda gerçekleştirir. Sunucu yok, hesap yok, beklemek yok.',
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: 'tr', 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 = 'convert-gif-to-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
+ 'JPG 格式严格来说是静态的,不支持多帧。我们的转换器仅提取 GIF 序列中出现的第一张图像或第一帧。',
26
+ },
27
+ {
28
+ question: '我会丢失任何特殊效果或透明背景吗?',
29
+ answer:
30
+ '是的,这是 JPG 标准的自然特性。如果您上传带有透明背景的 GIF,我们会自动在下方插入一个纯白色固态层,以避免颜色损坏。',
31
+ },
32
+ {
33
+ question: '我可以在网站不保存我的内容的情况下从 GIF 中提取 JPG 图片吗?',
34
+ answer:
35
+ '当然可以。该工具是基于 HTML5 Canvas 的 Web App。所有解码工作均由您自己的物理设备的处理器执行。',
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(图形交换格式)设计于 1987 年,存在一个沿用至今的严重限制:每帧只能表现 256 种颜色。这种技术限制对于调色板有限的简单动画并不重要,但对于真实的照片拍摄来说,它变成了一种视觉上贫乏的格式。相比之下,JPG 可以通过先进的感知压缩算法呈现数千万种颜色。',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: '从 GIF 中提取一帧并将其保存为 JPG 有多种应用:为视频播放器生成缩略图,为内容管理平台创建预览,获取演示文稿的静态图像,或者仅仅是归档复杂动画中的某个视觉时刻。生成的 JPG 将比原始 GIF 轻得多,且具有普适的兼容性。',
87
+ },
88
+ {
89
+ type: 'title',
90
+ text: '架构对比:本地 vs 云端',
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: '本地转换依托于 HTML5 Canvas API 的性能。当您加载 GIF 时,浏览器将其作为原生 Image 元素在内存中解码。通过在不可见画布(canvas)上渲染,浏览器的图形引擎会自动捕捉动画序列的第一帧。',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: '由于 JPG 格式不支持透明度,我们的算法在导出前会应用纯白色固态背景。画布的 <code>toDataURL(\'image/jpeg\')</code> 方法直接在您电脑的 RAM 中生成 JPG 字节流,无需任何网络连接。生成的文件会立即下载到您的设备。',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: 'GIF 有限的调色板',
138
+ html: 'GIF 每帧只能包含 256 种颜色。提取出的 JPG 将继承原图极其有限的调色板:如果 GIF 中有渐变或照片,可能会出现色彩断层(Posterization)。为了获得最佳效果,请使用颜色简单的 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: '一个 2 MB 的动画 GIF 可能会根据分辨率生成一个仅约 50-200 KB 的第一帧 JPG。我们的工具直接在您的浏览器中即时、私密且无限制地完成此项转换。无需服务器,无需账号,无需等待。',
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: 'zh', faq, howTo }),
178
+ };
@@ -13,9 +13,21 @@ export const gifAJpg: ConvertersToolEntry<ImageConverterUI> = {
13
13
  fg: 'mdi:file-export',
14
14
  },
15
15
  i18n: {
16
- es: () => import('./i18n/es').then((m) => m.content),
16
+ de: () => import('./i18n/de').then((m) => m.content),
17
17
  en: () => import('./i18n/en').then((m) => m.content),
18
+ es: () => import('./i18n/es').then((m) => m.content),
18
19
  fr: () => import('./i18n/fr').then((m) => m.content),
20
+ id: () => import('./i18n/id').then((m) => m.content),
21
+ it: () => import('./i18n/it').then((m) => m.content),
22
+ ja: () => import('./i18n/ja').then((m) => m.content),
23
+ ko: () => import('./i18n/ko').then((m) => m.content),
24
+ nl: () => import('./i18n/nl').then((m) => m.content),
25
+ pl: () => import('./i18n/pl').then((m) => m.content),
26
+ pt: () => import('./i18n/pt').then((m) => m.content),
27
+ ru: () => import('./i18n/ru').then((m) => m.content),
28
+ sv: () => import('./i18n/sv').then((m) => m.content),
29
+ tr: () => import('./i18n/tr').then((m) => m.content),
30
+ zh: () => import('./i18n/zh').then((m) => m.content),
19
31
  },
20
32
  };
21
33
 
@@ -0,0 +1,178 @@
1
+ import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
2
+ import { generateSchemas } from '../../../shared/logic/schemas';
3
+ import type { GifAPngLocaleContent } from '../index';
4
+
5
+ const slug = 'gif-zu-png-konvertieren';
6
+ const title = 'GIF in PNG online konvertieren';
7
+ const description =
8
+ 'Extrahieren Sie das erste Bild aus Ihren GIFs und konvertieren Sie es in PNG unter Beibehaltung der Transparenz. Ohne Server. Lokale Verarbeitung. Kostenlos.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'GIF-Dateien hierhere ziehen...',
12
+ convertText: 'Um sie sofort in PNG 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: GifAPngLocaleContent['faq'] = [
22
+ {
23
+ question: 'Warum sollte man ein animiertes Format wie GIF in ein statisches Format wie PNG konvertieren?',
24
+ answer:
25
+ 'Viele soziale Netzwerke oder Avatare unterstützen keine Bilder, die sich ändern. Das Extrahieren des ersten Rahmens eines komplexen GIFs in ein hochwertiges PNG löst Barrieren und reduziert unnötiges Dateigewicht.',
26
+ },
27
+ {
28
+ question: 'Bleiben die Transparenzen des alten GIFs im resultierenden PNG erhalten?',
29
+ answer:
30
+ 'Ja, im Gegensatz zu JPG behält das PNG-Format den Alphakanal bei. Wenn das GIF einen transparenten Hintergrund hatte, behält das PNG diesen mit scharfen Kanten bei.',
31
+ },
32
+ {
33
+ question: 'Speichern Sie meine Bilder nach der Verarbeitung eine Zeit lang auf den Servern?',
34
+ answer:
35
+ 'Kein Server behält Ihr GIF; die gesamte Extraktion erfolgt lokal dank der Web-Canvas-API. Der Prozessor Ihres PCs dekodiert Ihre Datei sicher, ohne Kontakt zum Netzwerk.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAPngLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Animation bereitstellen',
42
+ text: 'Ziehen Sie die schweren GIF-Dateien in das Einfügefeld.',
43
+ },
44
+ {
45
+ name: 'Perfektes extrahiertes Foto',
46
+ text: 'Das System stoppt den Ursprung der Bewegung exakt und erstellt in Millisekunden eine makellose Kopie.',
47
+ },
48
+ {
49
+ name: 'Statische Bilder speichern',
50
+ text: 'Speichern Sie das gesamte Volumen an statischen GIF-Avataren, die in PNG konvertiert wurden, massenhaft als ZIP.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAPngLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'World Wide Web Consortium: PNG format',
57
+ url: 'https://www.w3.org/TR/png/',
58
+ },
59
+ {
60
+ name: 'CompuServe GIF Information',
61
+ url: 'https://www.w3.org/Graphics/GIF/spec-gif89a.txt',
62
+ },
63
+ ];
64
+
65
+ const seo: GifAPngLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'GIF-zu-PNG-Konverter: Überwinden Sie die Farb- und Transparenzgrenzen von GIF',
69
+ level: 2,
70
+ },
71
+ {
72
+ type: 'paragraph',
73
+ html: 'GIF wurde zu einer Zeit entwickelt, als Monitore kaum 256 Farben anzeigen konnten. Jahrzehnte später ist diese Einschränkung immer noch seine größte Schwäche. PNG wurde genau deshalb geboren, um GIF in allen Anwendungsfällen zu ersetzen, in denen Qualität und Transparenz wichtig sind: Logos, Icons, Interface-Grafiken und jedes Bild mit transparentem Hintergrund, das auf jedem Hintergrund perfekt aussehen soll.',
74
+ },
75
+ {
76
+ type: 'title',
77
+ text: 'GIF vs. PNG: Die Revolution der 16 Millionen Farben',
78
+ level: 3,
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html: 'Der kritischste Unterschied zwischen GIF und PNG ist nicht nur die Anzahl der Farben. GIF unterstützt binäre Transparenz: Jedes Pixel ist entweder opak oder vollständig transparent, ohne Abstufungen. PNG hingegen unterstützt den vollen Alphakanal mit 256 Stufen der Opazität pro Pixel. Dies bedeutet, dass die Kanten eines Logos in PNG perfekt geglättet werden können, während die von GIF eine charakteristische Zackenbildung auf farbigen Hintergründen zeigen.',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: 'Zusätzlich zur überlegenen Transparenz hebt PNG die 256-Farben-Grenze von GIF auf. Screenshots, Illustrationen mit Verläufen, Logos mit Schatten: Alle sehen in PNG deutlich besser aus. Und da es sich um eine verlustfreie Kompression handelt, behält jedes Pixel exakt den Originalwert bei, ohne die Artefakte, die eine Konvertierung in JPG einführen würde.',
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 Bilder auf einem Remote-Server verarbeiten.',
99
+ icon: 'mdi:cloud-upload',
100
+ pointIcon: 'mdi:close-circle-outline',
101
+ points: [
102
+ 'Ihre Logos und Icons reisen über das Internet',
103
+ 'Wartezeit durch Netzwerklatenz',
104
+ 'Dateigrößen- und Anzahl-Limits',
105
+ 'Ihre Bilder können in Caches von Drittanbietern verbleiben',
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 Konvertierung ohne Netzwerk',
116
+ 'Keine Datei- oder Dateigrößenlimits',
117
+ 'Absolute Privatsphäre: 0 gesendete Bytes',
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Wie die lokale GIF-zu-PNG-Konvertierung funktioniert',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: 'Die Konvertierung nutzt das Canvas-API des Browsers. Das GIF wird im Speicher als natives Image-Element dekodiert. Beim Rendern auf einem HTML5-Canvas erfasst die Grafik-Engine des Browsers den ersten Rahmen mit all seinen ursprünglichen Transparenzinformationen intakt.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Im Gegensatz zur Konvertierung in JPG ist bei PNG kein weißer Hintergrund erforderlich. Der Alphakanal des ursprünglichen GIFs wird direkt in das exportierte PNG übernommen. Die <code>toDataURL(\'image/png\')</code> Methode generiert den PNG-Bytestrom im RAM Ihres Computers ohne jegliche Netzwerkübertragung, und die Datei wird direkt heruntergeladen.',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: 'Binäre Transparenz von GIF vs. Alphakanal von PNG',
138
+ html: 'GIF unterstützt nur binäre Transparenz (opak oder transparent). Bei der Konvertierung in PNG bleiben die halbtransparenten Pixel des GIFs so erhalten, wie der Browser sie interpretiert. Wenn Ihr GIF gezackte Kanten hat, behält das PNG diese bei — aber Sie können sie mit Kantenglättung in jedem Editor bearbeiten, was mit dem ursprünglichen GIF unmöglich ist.',
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Anwendungsfälle und Kompatibilität des resultierenden PNGs',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ icon: 'mdi:check-circle',
148
+ items: [
149
+ 'Logos und Icons für die Verwendung auf beliebigem Hintergrund.',
150
+ 'Avatare für Discord, Telegram, Slack und Gaming-Plattformen.',
151
+ 'Interface-Grafiken für Web- und Mobil-Apps.',
152
+ 'Personalisierte Sticker und Emojis mit transparentem Hintergrund.',
153
+ 'Screenshots und UI-Elemente für technische Dokumentation.',
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Fazit: PNG ist das, was GIF immer sein wollte',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: 'Die Konvertierung von GIF in PNG ist nicht nur ein Formatwechsel: Es ist die Aktualisierung eines Bildes auf den modernen Standard, den GIF nie erreichen konnte. Mehr Farben, bessere Transparenz, weniger Gewicht. Unser Tool führt diese Konvertierung in Millisekunden direkt im Browser durch, ohne Daten nach außen zu senden.',
164
+ },
165
+ ];
166
+
167
+
168
+ export const content: GifAPngLocaleContent = {
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 { GifAPngLocaleContent } from '../index';
4
4
 
5
5
  const slug = 'gif-to-png-converter';
@@ -164,16 +164,6 @@ const seo: GifAPngLocaleContent['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: GifAPngLocaleContent = {
179
169
  slug,
@@ -184,5 +174,5 @@ export const content: GifAPngLocaleContent = {
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 { GifAPngLocaleContent } from '../index';
4
4
 
5
5
  const slug = 'convertidor-gif-a-png';
@@ -164,16 +164,6 @@ const seo: GifAPngLocaleContent['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: GifAPngLocaleContent = {
179
169
  slug,
@@ -184,5 +174,5 @@ export const content: GifAPngLocaleContent = {
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 { GifAPngLocaleContent } from '../index';
4
4
 
5
5
  const slug = 'convertisseur-gif-en-png';
@@ -164,16 +164,6 @@ const seo: GifAPngLocaleContent['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: GifAPngLocaleContent = {
179
169
  slug,
@@ -184,5 +174,5 @@ export const content: GifAPngLocaleContent = {
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
  };