@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,183 @@
1
+ import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
2
+ import { generateSchemas } from '../../../shared/logic/schemas';
3
+ import type { JpgAIcoLocaleContent } from '../index';
4
+
5
+ const slug = 'jpg-to-ico-converter';
6
+ const title = 'JPG 转 ICO 转换器';
7
+ const description =
8
+ '使用真实的 Microsoft 二进制标头将 JPG 照片转换为 ICO。自动正方形裁剪。无需上传文件。免费且私密。';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: '拖拽 JPG 文件...',
12
+ convertText: '立即将它们转换为 ICO',
13
+ selectFiles: '选择文件',
14
+ processedFiles: '已处理文件',
15
+ downloadAll: '下载全部 (.zip)',
16
+ pending: '等待中',
17
+ bibliographyTitle: '参考文献',
18
+ faqTitle: '常见问题',
19
+ };
20
+
21
+ const faq: JpgAIcoLocaleContent['faq'] = [
22
+ {
23
+ question: '生成的 ICO 文件是否原生兼容自定义 Windows 文件夹?',
24
+ answer:
25
+ '是的, 我们通过在图像矩阵的底层插入标准化的二进制标头, 创建 100% 真实的 Microsoft 图标格式文件。',
26
+ },
27
+ {
28
+ question: '如果我的原始 JPG 是全景横向照片, 比例会怎样?',
29
+ answer:
30
+ '严格的全球 ICO 标准绝对要求完美的正方形图像。我们的 HTML5 JS 引擎将使您的照片居中并裁剪多余部分, 确保平衡的结果。',
31
+ },
32
+ {
33
+ question: '将公司或个人 JPG 徽标上传到转换器是否危险?',
34
+ answer:
35
+ 'JavaScript 中的 Canvas 引擎运行在您自己的浏览器中。将数百张照片转换为 ICO 不会向任何外部云端发送单字节数据。',
36
+ },
37
+ ];
38
+
39
+ const howTo: JpgAIcoLocaleContent['howTo'] = [
40
+ {
41
+ name: '收集原始 JPG 照片',
42
+ text: '查找并收集常规照片, 并将其拖放到我们的正方形区域中。',
43
+ },
44
+ {
45
+ name: '见证二进制纯化',
46
+ text: '重新编码将原生且快速地异步插入元数据和标头, 在内存中生成严格纯净的图标 Morse code.',
47
+ },
48
+ {
49
+ name: '编译多个 ZIP 设计',
50
+ text: '只需几秒钟即可将所有内容打包成压缩包批量下载, 完成工作。',
51
+ },
52
+ ];
53
+
54
+ const bibliography: JpgAIcoLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'ICO 图像结构和系统使用',
57
+ url: 'https://en.wikipedia.org/wiki/ICO_(file_format)',
58
+ },
59
+ {
60
+ name: 'JPEG.org 标准',
61
+ url: 'https://jpeg.org/',
62
+ },
63
+ ];
64
+
65
+ const seo: JpgAIcoLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'JPG 转 ICO 转换器: 从您的照片创建 Favicon 和 Windows 图标',
69
+ level: 2,
70
+ },
71
+ {
72
+ type: 'paragraph',
73
+ html: '<strong>ICO</strong> 格式是 Microsoft 针对 Windows 应用程序图标和网站 favicon 的标准。与简单地将 JPG 重命名为 .ico 不同, 真正的 ICO 文件需要特定的二进制结构, 其中包含 22 字节的标头和嵌入的图像目录。 <strong>JPG</strong> 是创建这些图标最常见的起点——公司徽标、个人资料图片或任何您想变成应用程序或网站视觉标志的图像。',
74
+ },
75
+ {
76
+ type: 'title',
77
+ text: 'JPG 还是 ICO?何时使用每种格式',
78
+ level: 3,
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html: '<strong>JPG</strong> 是源格式, 而不是图标的目标格式。它非常适合照片和横幅, 但与需要图标的系统不兼容: Windows 资源管理器、浏览器的书签栏、桌面快捷方式或 PWA 应用程序清单。寻找图标的操作系统或浏览器期望的是 ICO 格式——如果找不到, 它将显示通用图标或破裂的正方形。',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: '<strong>ICO</strong> 格式设计用于在单个文件中包含多种分辨率: 书签栏使用 <strong>16×16</strong>, 快捷方式使用 <strong>32×32</strong>, 资源管理器使用 <strong>48×48</strong>, 高密度显示器使用 <strong>256×256</strong>。浏览器和操作系统会根据显示环境自动选择合适的分辨率——用户无需进行任何管理。',
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
+ '上传和下载时的网络延迟',
103
+ '您的公司徽标存储在第三方服务器上',
104
+ '文件大小限制和每日转换上限',
105
+ '干扰性广告和第三方追踪器',
106
+ ],
107
+ },
108
+ {
109
+ title: '我们的本地架构',
110
+ description: '使用 Vanilla JS 技术直接在您的硬件上进行处理 Morse code.',
111
+ icon: 'mdi:laptop-mac',
112
+ highlight: true,
113
+ points: [
114
+ '即时速度——零网络延迟',
115
+ '完全私密——数据发送量为 0 字节',
116
+ '没有 MB 限制或文件数量限制',
117
+ '界面简洁, 无广告或追踪',
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: '技术原理',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: 'JPG 被解码并绘制到内存中的 <strong>HTML5 Canvas</strong> 上。由于 ICO 格式要求正方形图像, 引擎会自动检测 JPG 是否为长方形, 并通过使最相关的部分居中来进行裁剪。然后, 它使用正确的魔数 (<code>00 00 01 00</code>)、图像目录和编码后的像素数据构建标准的 Microsoft ICO 标头。结果是一个真正的二进制 .ico 文件——而不是重命名的 PNG。',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: '由于 JPG 缺少 Alpha 通道, 生成的 ICO 也不会有透明度——它将具有从原始照片继承的实心背景。如果您需要具有透明背景的 favicon (例如, 为了适应深色或浅色书签栏), 建议的工作流程是: 在编辑器中删除背景, 保存为 PNG, 然后使用 PNG 转 ICO 转换器。',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: '提示: 单个 ICO 中的多种分辨率',
138
+ html: 'ICO 文件夹可以在单个文件中打包 <strong>多种分辨率</strong> —— 浏览器或操作系统会自动为每个环境选择最合适的一个。为了获得最佳效果, 请使用至少 <strong>256×256 像素</strong> 的正方形 JPG 作为源文件: 这为转换器提供了足够的信息, 可以在不像素化的情况下生成清晰的 16×16、32×32 und 48×48 尺寸。',
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: '应用场景 und 兼容性',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ icon: 'mdi:check-circle',
148
+ items: [
149
+ '网站 favicon: 兼容包括 Internet Explorer 在内的所有浏览器。',
150
+ 'Windows 10/11 中的文件夹和桌面图标自定义。',
151
+ '桌面应用程序或安装程序的快捷方式图标。',
152
+ 'Electron 项目或 PWA 应用程序的应用图标。',
153
+ '文件管理系统和企业资源管理器的图标。',
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: '结论',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: '对于任何需要可识别视觉身份的 Web 或桌面项目来说, 将 JPG 转换为 ICO 都是技术上必不可少的一步。此工具可在几秒钟内生成具有正确二进制结构的真实 ICO, 且无需将您的徽标上传到任何外部服务器。其结果适用于所有浏览器、Windows 资源管理器以及任何采用 Microsoft ICO 标准的系统。',
164
+ },
165
+ ];
166
+
167
+ export const content: JpgAIcoLocaleContent = {
168
+ slug,
169
+ title,
170
+ description,
171
+ ui,
172
+ seo,
173
+ faq,
174
+ bibliography,
175
+ howTo,
176
+ schemas: generateSchemas({
177
+ title,
178
+ description,
179
+ inLanguage: 'zh',
180
+ faq,
181
+ howTo,
182
+ }),
183
+ };
@@ -16,6 +16,18 @@ export const jpgAIco: ConvertersToolEntry<ImageConverterUI> = {
16
16
  es: () => import('./i18n/es').then((m) => m.content),
17
17
  en: () => import('./i18n/en').then((m) => m.content),
18
18
  fr: () => import('./i18n/fr').then((m) => m.content),
19
+ de: () => import('./i18n/de').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 { JpgAPngLocaleContent } from '../index';
4
+
5
+ const slug = 'jpg-zu-png-konvertieren';
6
+ const title = 'JPG in PNG Online und Kostenlos Konvertieren';
7
+ const description =
8
+ 'Konvertieren Sie JPG-Bilder in Ihrem Browser in PNG, ohne Dateien hochzuladen. Verlustfreie Konvertierung, kostenlos und absolut privat.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'JPG-Dateien hierher 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: JpgAPngLocaleContent['faq'] = [
22
+ {
23
+ question: 'Wann sollte ich JPG in PNG konvertieren?',
24
+ answer:
25
+ 'Immer dann, wenn Sie Text oder Logos innerhalb eines Fotos bearbeiten möchten. Wenn Sie ein JPG mehrmals speichern, wird es "schmutzig". PNG friert die Kompression ein.',
26
+ },
27
+ {
28
+ question: 'Wird die PNG-Datei sofort einen transparenten Hintergrund haben?',
29
+ answer:
30
+ 'Nein. Das ursprüngliche JPG war flach und ohne diese Art von strukturellem Kanal. Die resultierende PNG erstellt diesen Container; anschließend müssen Sie das Element mit Photoshop oder einem anderen Editor freistellen.',
31
+ },
32
+ {
33
+ question: 'Gibt es auf dieser Website Traffic-Limits?',
34
+ answer:
35
+ 'Dank Edge-Technologien ohne Cloud-Abhängigkeiten gibt es keine Limits für das Gewicht Ihrer Konvertierung, da sie vollständig Ihr IT-Terminal oder Mobiltelefon nutzt.',
36
+ },
37
+ ];
38
+
39
+ const howTo: JpgAPngLocaleContent['howTo'] = [
40
+ {
41
+ name: 'JPG in das Panel ziehen',
42
+ text: 'Laden Sie statische Bilder im JPG-Format über Touch-Maus oder den Computer-Selektor hoch.',
43
+ },
44
+ {
45
+ name: 'Verlustfreie Ausführung',
46
+ text: 'Die Vanilla-Software schiebt die Bits des Bildes in eine verlustfreie Hülle, die nativ für die PNG-Familie ist.',
47
+ },
48
+ {
49
+ name: 'Sitzung beenden',
50
+ text: 'Klicken Sie auf das Panel, und Ihr Browser legt die heruntergeladenen Web-Assets in Ihren Benutzerordnern ab.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: JpgAPngLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'The W3C PNG Graphics',
57
+ url: 'https://www.w3.org/Graphics/PNG/',
58
+ },
59
+ {
60
+ name: 'Understanding Digital Image Compression',
61
+ url: 'https://en.wikipedia.org/wiki/Image_compression',
62
+ },
63
+ ];
64
+
65
+ const seo: JpgAPngLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'JPG-zu-PNG-Konverter: Verlustfreie Bearbeitung und Transparenz',
69
+ level: 2,
70
+ },
71
+ {
72
+ type: 'paragraph',
73
+ html: '<strong>JPG</strong> ist für Kamerafotos unschlagbar, hat aber eine Schwachstelle: Bei jedem Speichern der Datei wird die verlustbehaftete Kompression erneut angewendet, wodurch Kanten und Verläufe schrittweise verschlechtert werden. <strong>PNG</strong> verwendet verlustfreie Kompression – einmal gespeichert, sind die Pixel unveränderlich. Die Konvertierung von JPG in PNG ist der entscheidende Vorgang, wenn Sie ein Bild für eine intensive Bearbeitung vorbereiten, einen transparenten Hintergrund hinzufügen oder es in einen Designfluss integrieren müssen, der mehrfaches Speichern erfordert.',
74
+ },
75
+ {
76
+ type: 'title',
77
+ text: 'JPG oder PNG? Wann man welches Format verwendet',
78
+ level: 3,
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html: '<strong>JPG</strong> ist der König der Fotografie: geringes Gewicht, mit allem kompatibel. Aber seine Kompressionsartefakte summieren sich bei jeder Bearbeitung und jedem erneuten Speichern. Wenn Sie ein Bild wiederholt zuschneiden, retuschieren oder Text hinzufügen müssen, bedeutet der Start mit JPG, dass in jedem Zyklus eine Verschlechterung eingeführt wird. Außerdem fehlt dem JPG der Alphakanal: Es kann keine transparenten Hintergründe haben, was es für Logos, Icons und UI-Elemente disqualifiziert.',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: '<strong>PNG</strong> ist die richtige Wahl für Firmenlogos, Screenshots mit scharfem Text, Interface-Elemente, Produktbilder mit weißem Hintergrund, die Sie später ausschneiden müssen, oder jede grafische Ressource, die mehr als einmal bearbeitet wird. Die verlustfreie Kompression garantiert, dass die Textkanten perfekt definiert bleiben und dass Volltonfarben rein bleiben, ohne JPEG-Rauschen.',
87
+ },
88
+ {
89
+ type: 'title',
90
+ text: 'Vergleich: Lokale Konvertierung 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.',
99
+ icon: 'mdi:cloud-upload',
100
+ pointIcon: 'mdi:close-circle-outline',
101
+ points: [
102
+ 'Netzwerklatenz beim Upload und Download',
103
+ 'Ihre Bilder bleiben auf fremden Servern',
104
+ 'Limits für Größe und tägliche Konvertierungen',
105
+ 'Aufdringliche Werbung und Drittanbieter-Tracker',
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
+ 'Sofortige Geschwindigkeit – null Netzwerklatenz',
115
+ 'Vollständige Privatsphäre – 0 Bytes nach außen gesendet',
116
+ 'Keine MB-Limits oder Beschränkungen der Dateianzahl',
117
+ 'Saubere Schnittstelle, ohne Anzeigen oder Tracking',
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Wie es technisch funktioniert',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: 'Der Prozess ist rein lokal: Der Browser erstellt einen <strong>Blob</strong> mit dem ausgewählten JPG und zeichnet ihn auf einen <strong>HTML5 Canvas</strong> im Speicher. Sobald er gerendert ist, wird <code>toDataURL(\'image/png\')</code> aufgerufen – der im Browser integrierte PNG-Codec rekodiert jedes Pixel, ohne eine neue verlustbehaftete Kompression anzuwenden. Das Ergebnis ist ein PNG, das den aktuellen Zustand des JPG originalgetreu bewahrt: nicht besser und nicht schlechter, einfach eingefroren.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'Das resultierende PNG verwendet verlustfreie DEFLATE-Kompression, dieselbe, die von professionellen Tools wie Photoshop oder GIMP verwendet wird. Seine Größe wird größer sein als die des ursprünglichen JPG – normalerweise zwischen dem 2- und 5-fachen –, da es alle Pixel speichert, ohne Informationen zu verwerfen. Das ist der Preis für Treue und unendliche Editierbarkeit.',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: 'Wichtig: Das PNG stellt keine JPEG Qualität wieder her',
138
+ html: 'Das Konvertieren eines JPG in PNG <strong>stellt die verlorene Qualität nicht wieder her</strong>, die während der ursprünglichen JPEG-Kompression verloren gegangen ist. Wenn Ihr JPG bereits Blockartefakte oder Farbrauschen hatte, wird das PNG diese intakt bewahren – es verhindert lediglich, dass weitere hinzugefügt werden. Betrachten Sie die Konvertierung als ein "Einfrieren" des aktuellen Zustands des Bildes, damit zukünftige Bearbeitungen es nicht weiter verschlechtern.',
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Anwendungsfälle und Kompatibilität',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ icon: 'mdi:check-circle',
148
+ items: [
149
+ 'Logos und Branding-Elemente, die nach dem Zuschneiden einen transparenten Hintergrund benötigen.',
150
+ 'Screenshots mit Text, die mehrmals bearbeitet und neu gespeichert werden.',
151
+ 'Produktbilder für E-Commerce, die einen sauberen, zuschneidbaren weißen Hintergrund erfordern.',
152
+ 'Grafische Ressourcen für PowerPoint- oder Google Slides-Präsentationen.',
153
+ 'UI-Assets für Web- und Mobilanwendungen, bei denen die Kantenschärfe kritisch ist.',
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Fazit',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: 'Die Konvertierung von JPG in PNG ist der erste Schritt in jedem ernsthaften Design-Workflow. Sie transformiert nicht die ursprüngliche Qualität, aber sie schützt jedes Pixel vor zukünftigen Bearbeitungen. Mit diesem Tool erfolgt der Prozess sofort und vollständig privat, ohne dass Ihre Firmen- oder persönlichen Bilder jemals Ihr Gerät verlassen.',
164
+ },
165
+ ];
166
+
167
+
168
+ export const content: JpgAPngLocaleContent = {
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 { JpgAPngLocaleContent } from '../index';
4
4
 
5
5
  const slug = 'jpg-to-png-converter';
@@ -164,16 +164,6 @@ const seo: JpgAPngLocaleContent['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: JpgAPngLocaleContent = {
179
169
  slug,
@@ -184,5 +174,5 @@ export const content: JpgAPngLocaleContent = {
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 { JpgAPngLocaleContent } from '../index';
4
4
 
5
5
  const slug = 'convertidor-jpg-a-png';
@@ -164,16 +164,6 @@ const seo: JpgAPngLocaleContent['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: JpgAPngLocaleContent = {
179
169
  slug,
@@ -184,5 +174,5 @@ export const content: JpgAPngLocaleContent = {
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 { JpgAPngLocaleContent } from '../index';
4
4
 
5
5
  const slug = 'convertisseur-jpg-en-png';
@@ -164,16 +164,6 @@ const seo: JpgAPngLocaleContent['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: JpgAPngLocaleContent = {
179
169
  slug,
@@ -184,5 +174,5 @@ export const content: JpgAPngLocaleContent = {
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 { JpgAPngLocaleContent } from '../index';
4
+
5
+ const slug = 'konverter-jpg-ke-png';
6
+ const title = 'Ubah JPG ke PNG Online dan Gratis';
7
+ const description =
8
+ 'Ubah gambar JPG ke PNG di browser Anda tanpa mengunggah file. Konversi lossless, gratis, dan sepenuhnya pribadi.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'Seret file JPG...',
12
+ convertText: 'Untuk mengubahnya ke PNG 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: JpgAPngLocaleContent['faq'] = [
22
+ {
23
+ question: 'Kapan saya harus menggunakan JPG ke PNG?',
24
+ answer:
25
+ 'Setiap kali Anda akan mengedit teks atau logo di dalam foto. Jika Anda menyimpan JPG beberapa kali, kualitasnya akan menurun. PNG membekukan kompresi.',
26
+ },
27
+ {
28
+ question: 'Apakah file PNG akan langsung memiliki latar belakang transparan?',
29
+ answer:
30
+ 'Tidak. JPG asli bersifat datar dan tidak memiliki jenis saluran struktural tersebut. PNG yang dihasilkan akan menyiapkan kontainer tersebut, lalu Anda harus mengisolasi bagian tersebut menggunakan Photoshop atau editor lainnya.',
31
+ },
32
+ {
33
+ question: 'Apakah situs web ini memiliki batasan trafik?',
34
+ answer:
35
+ 'Berkat teknologi Edge tanpa dependensi cloud, ukuran konversi Anda tidak memiliki batasan karena sepenuhnya menggunakan komputer atau ponsel Anda.',
36
+ },
37
+ ];
38
+
39
+ const howTo: JpgAPngLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Seret JPG ke panel',
42
+ text: 'Unggah gambar statis dalam format JPG menggunakan mouse atau pemilih file komputer.',
43
+ },
44
+ {
45
+ name: 'Eksekusi Lossless',
46
+ text: 'Perangkat lunak Vanilla mendorong bit bingkai ke dalam wadah tanpa kehilangan kualitas asli dari keluarga PNG.',
47
+ },
48
+ {
49
+ name: 'Selesaikan Sesi',
50
+ text: 'Klik panel dan browser Anda akan menyimpan aset web yang diunduh ke Folder Pengguna Anda.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: JpgAPngLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'The W3C PNG Graphics',
57
+ url: 'https://www.w3.org/Graphics/PNG/',
58
+ },
59
+ {
60
+ name: 'Understanding Digital Image Compression',
61
+ url: 'https://en.wikipedia.org/wiki/Image_compression',
62
+ },
63
+ ];
64
+
65
+ const seo: JpgAPngLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'Konverter JPG ke PNG: Pengeditan Tanpa Hilang dan Transparansi',
69
+ level: 2,
70
+ },
71
+ {
72
+ type: 'paragraph',
73
+ html: '<strong>JPG</strong> tidak tertandingi untuk foto kamera, tetapi memiliki kelemahan: setiap kali Anda menyimpan file, kompresi dengan hilangnya kualitas (lossy) diterapkan kembali, yang secara bertahap merusak tepi dan gradien. <strong>PNG</strong> menggunakan kompresi tanpa kehilangan (lossless) — sekali disimpan, piksel tidak berubah. Mengubah JPG ke PNG adalah operasi kunci saat Anda perlu menyiapkan gambar untuk pengeditan intensif, menambahkan latar belakang transparan, atau mengintegrasikannya ke dalam alur desain yang memerlukan penyimpanan berulang kali.',
74
+ },
75
+ {
76
+ type: 'title',
77
+ text: 'JPG atau PNG? Kapan menggunakan masing-masing format',
78
+ level: 3,
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html: '<strong>JPG</strong> adalah raja fotografi: ukuran kecil, kompatibel dengan segalanya. Namun artefak kompresinya menumpuk di setiap pengeditan dan penyimpanan ulang. Jika Anda perlu memotong, memoles, atau menambahkan teks ke gambar berulang kali, memulai dari JPG berarti memperkenalkan degradasi di setiap siklus. Selain itu, JPG tidak memiliki saluran alfa: tidak dapat memiliki latar belakang transparan, yang membuatnya tidak cocok untuk logo, ikon, dan elemen UI.',
83
+ },
84
+ {
85
+ type: 'paragraph',
86
+ html: '<strong>PNG</strong> adalah pilihan yang tepat untuk logo perusahaan, tangkapan layar dengan teks tajam, elemen antarmuka, gambar produk dengan latar belakang putih yang nantinya perlu Anda potong, atau aset grafis apa pun yang akan diedit lebih dari sekali. Kompresi tanpa kehilangan menjamin bahwa tepi teks tetap terdefinisi dengan sempurna dan warna solid tetap murni, tanpa noise JPEG.',
87
+ },
88
+ {
89
+ type: 'title',
90
+ text: 'Perbandingan: Konversi 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.',
99
+ icon: 'mdi:cloud-upload',
100
+ pointIcon: 'mdi:close-circle-outline',
101
+ points: [
102
+ 'Latensi jaringan saat unggah dan unduh',
103
+ 'Gambar Anda tetap berada di server pihak lain',
104
+ 'Batasan ukuran dan konversi harian',
105
+ 'Iklan yang mengganggu dan pelacak pihak ketiga',
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
+ 'Kecepatan instan — nol latensi jaringan',
115
+ 'Privasi total — 0 byte dikirim ke luar',
116
+ 'Tanpa batasan MB atau jumlah file',
117
+ 'Antarmuka bersih, tanpa iklan atau pelacakan',
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Cara kerja teknisnya',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: 'Prosesnya murni lokal: browser membuat <strong>Blob</strong> dengan JPG yang dipilih dan menggambarnya di atas <strong>Canvas HTML5</strong> di memori. Setelah dirender, <code>toDataURL(\'image/png\')</code> dipanggil — codec PNG yang terintegrasi dalam browser mengode ulang setiap piksel tanpa menerapkan kompresi baru yang merusak kualitas. Hasilnya adalah PNG yang secara setia menjaga kondisi JPG saat ini: tidak lebih baik atau lebih buruk, hanya dibekukan.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: 'PNG yang dihasilkan akan menggunakan kompresi DEFLATE tanpa kehilangan, sama seperti yang digunakan oleh alat profesional seperti Photoshop atau GIMP. Ukurannya akan lebih besar dari JPG asli — biasanya antara 2 hingga 5 kali — karena menyimpan semua piksel tanpa membuang informasi. Ini adalah harga yang harus dibayar untuk kesetiaan dan kemampuan pengeditan yang tak terbatas.',
134
+ },
135
+ {
136
+ type: 'tip',
137
+ title: 'Penting: PNG tidak memulihkan kualitas JPEG',
138
+ html: 'Mengubah JPG ke PNG <strong>tidak memulihkan kualitas yang hilang</strong> selama kompresi JPEG asli. Jika JPG Anda sudah memiliki artefak blok atau noise warna, PNG akan menyimpannya secara utuh — ia hanya mencegah penambahan artefak lainnya. Anggaplah konversi sebagai cara untuk "membekukan" kondisi gambar saat ini agar pengeditan di masa mendatang tidak semakin merusak kualitasnya.',
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Kasus penggunaan dan kompatibilitas',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'list',
147
+ icon: 'mdi:check-circle',
148
+ items: [
149
+ 'Logo dan elemen merek yang membutuhkan latar belakang transparan setelah dipotong.',
150
+ 'Tangkapan layar dengan teks yang akan diedit dan disimpan ulang beberapa kali.',
151
+ 'Gambar produk untuk e-commerce yang memerlukan latar belakang putih bersih dan dapat dipotong.',
152
+ 'Aset grafis untuk presentasi PowerPoint atau Google Slides.',
153
+ 'Aset UI untuk aplikasi web dan seluler di mana ketajaman tepi sangat penting.',
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Kesimpulan',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'paragraph',
163
+ html: 'Konversi JPG ke PNG adalah langkah pertama dalam alur kerja desain serius apa pun. Ini tidak mengubah kualitas asli, tetapi melindungi setiap piksel dari pengeditan di masa mendatang. Dengan alat ini, proses terjadi secara instan dan sepenuhnya pribadi, tanpa gambar perusahaan atau pribadi Anda pernah meninggalkan perangkat Anda.',
164
+ },
165
+ ];
166
+
167
+
168
+ export const content: JpgAPngLocaleContent = {
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
+ };