@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.
- package/package.json +60 -59
- package/src/shared/logic/schemas.ts +57 -0
- package/src/tests/faq_count.test.ts +13 -4
- package/src/tests/i18n_coverage.test.ts +36 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +1 -1
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tool/avifAJpg/i18n/de.ts +178 -0
- package/src/tool/avifAJpg/i18n/en.ts +2 -12
- package/src/tool/avifAJpg/i18n/es.ts +2 -12
- package/src/tool/avifAJpg/i18n/fr.ts +2 -12
- package/src/tool/avifAJpg/i18n/id.ts +178 -0
- package/src/tool/avifAJpg/i18n/it.ts +178 -0
- package/src/tool/avifAJpg/i18n/ja.ts +178 -0
- package/src/tool/avifAJpg/i18n/ko.ts +178 -0
- package/src/tool/avifAJpg/i18n/nl.ts +178 -0
- package/src/tool/avifAJpg/i18n/pl.ts +178 -0
- package/src/tool/avifAJpg/i18n/pt.ts +178 -0
- package/src/tool/avifAJpg/i18n/ru.ts +178 -0
- package/src/tool/avifAJpg/i18n/sv.ts +178 -0
- package/src/tool/avifAJpg/i18n/tr.ts +178 -0
- package/src/tool/avifAJpg/i18n/zh.ts +178 -0
- package/src/tool/avifAJpg/index.ts +13 -1
- package/src/tool/avifAPng/i18n/de.ts +178 -0
- package/src/tool/avifAPng/i18n/en.ts +2 -12
- package/src/tool/avifAPng/i18n/es.ts +2 -12
- package/src/tool/avifAPng/i18n/fr.ts +2 -12
- package/src/tool/avifAPng/i18n/id.ts +178 -0
- package/src/tool/avifAPng/i18n/it.ts +178 -0
- package/src/tool/avifAPng/i18n/ja.ts +178 -0
- package/src/tool/avifAPng/i18n/ko.ts +178 -0
- package/src/tool/avifAPng/i18n/nl.ts +178 -0
- package/src/tool/avifAPng/i18n/pl.ts +178 -0
- package/src/tool/avifAPng/i18n/pt.ts +178 -0
- package/src/tool/avifAPng/i18n/ru.ts +178 -0
- package/src/tool/avifAPng/i18n/sv.ts +178 -0
- package/src/tool/avifAPng/i18n/tr.ts +178 -0
- package/src/tool/avifAPng/i18n/zh.ts +178 -0
- package/src/tool/avifAPng/index.ts +13 -1
- package/src/tool/avifAWebp/i18n/de.ts +178 -0
- package/src/tool/avifAWebp/i18n/en.ts +2 -12
- package/src/tool/avifAWebp/i18n/es.ts +2 -12
- package/src/tool/avifAWebp/i18n/fr.ts +2 -12
- package/src/tool/avifAWebp/i18n/id.ts +178 -0
- package/src/tool/avifAWebp/i18n/it.ts +178 -0
- package/src/tool/avifAWebp/i18n/ja.ts +178 -0
- package/src/tool/avifAWebp/i18n/ko.ts +178 -0
- package/src/tool/avifAWebp/i18n/nl.ts +178 -0
- package/src/tool/avifAWebp/i18n/pl.ts +178 -0
- package/src/tool/avifAWebp/i18n/pt.ts +178 -0
- package/src/tool/avifAWebp/i18n/ru.ts +178 -0
- package/src/tool/avifAWebp/i18n/sv.ts +178 -0
- package/src/tool/avifAWebp/i18n/tr.ts +178 -0
- package/src/tool/avifAWebp/i18n/zh.ts +178 -0
- package/src/tool/avifAWebp/index.ts +13 -1
- package/src/tool/bmpAJpg/i18n/de.ts +178 -0
- package/src/tool/bmpAJpg/i18n/en.ts +2 -12
- package/src/tool/bmpAJpg/i18n/es.ts +2 -12
- package/src/tool/bmpAJpg/i18n/fr.ts +2 -12
- package/src/tool/bmpAJpg/i18n/id.ts +178 -0
- package/src/tool/bmpAJpg/i18n/it.ts +178 -0
- package/src/tool/bmpAJpg/i18n/ja.ts +178 -0
- package/src/tool/bmpAJpg/i18n/ko.ts +178 -0
- package/src/tool/bmpAJpg/i18n/nl.ts +178 -0
- package/src/tool/bmpAJpg/i18n/pl.ts +178 -0
- package/src/tool/bmpAJpg/i18n/pt.ts +178 -0
- package/src/tool/bmpAJpg/i18n/ru.ts +178 -0
- package/src/tool/bmpAJpg/i18n/sv.ts +178 -0
- package/src/tool/bmpAJpg/i18n/tr.ts +178 -0
- package/src/tool/bmpAJpg/i18n/zh.ts +178 -0
- package/src/tool/bmpAJpg/index.ts +13 -1
- package/src/tool/bmpAPng/i18n/de.ts +177 -0
- package/src/tool/bmpAPng/i18n/en.ts +2 -12
- package/src/tool/bmpAPng/i18n/es.ts +2 -12
- package/src/tool/bmpAPng/i18n/fr.ts +2 -12
- package/src/tool/bmpAPng/i18n/id.ts +177 -0
- package/src/tool/bmpAPng/i18n/it.ts +177 -0
- package/src/tool/bmpAPng/i18n/ja.ts +177 -0
- package/src/tool/bmpAPng/i18n/ko.ts +177 -0
- package/src/tool/bmpAPng/i18n/nl.ts +177 -0
- package/src/tool/bmpAPng/i18n/pl.ts +177 -0
- package/src/tool/bmpAPng/i18n/pt.ts +177 -0
- package/src/tool/bmpAPng/i18n/ru.ts +177 -0
- package/src/tool/bmpAPng/i18n/sv.ts +177 -0
- package/src/tool/bmpAPng/i18n/tr.ts +177 -0
- package/src/tool/bmpAPng/i18n/zh.ts +177 -0
- package/src/tool/bmpAPng/index.ts +13 -1
- package/src/tool/bmpAWebp/i18n/de.ts +178 -0
- package/src/tool/bmpAWebp/i18n/en.ts +2 -12
- package/src/tool/bmpAWebp/i18n/es.ts +2 -12
- package/src/tool/bmpAWebp/i18n/fr.ts +2 -12
- package/src/tool/bmpAWebp/i18n/id.ts +178 -0
- package/src/tool/bmpAWebp/i18n/it.ts +178 -0
- package/src/tool/bmpAWebp/i18n/ja.ts +178 -0
- package/src/tool/bmpAWebp/i18n/ko.ts +178 -0
- package/src/tool/bmpAWebp/i18n/nl.ts +178 -0
- package/src/tool/bmpAWebp/i18n/pl.ts +178 -0
- package/src/tool/bmpAWebp/i18n/pt.ts +178 -0
- package/src/tool/bmpAWebp/i18n/ru.ts +178 -0
- package/src/tool/bmpAWebp/i18n/sv.ts +178 -0
- package/src/tool/bmpAWebp/i18n/tr.ts +178 -0
- package/src/tool/bmpAWebp/i18n/zh.ts +178 -0
- package/src/tool/bmpAWebp/index.ts +13 -1
- package/src/tool/gifAJpg/i18n/de.ts +178 -0
- package/src/tool/gifAJpg/i18n/en.ts +2 -12
- package/src/tool/gifAJpg/i18n/es.ts +2 -12
- package/src/tool/gifAJpg/i18n/fr.ts +2 -12
- package/src/tool/gifAJpg/i18n/id.ts +178 -0
- package/src/tool/gifAJpg/i18n/it.ts +178 -0
- package/src/tool/gifAJpg/i18n/ja.ts +178 -0
- package/src/tool/gifAJpg/i18n/ko.ts +178 -0
- package/src/tool/gifAJpg/i18n/nl.ts +178 -0
- package/src/tool/gifAJpg/i18n/pl.ts +178 -0
- package/src/tool/gifAJpg/i18n/pt.ts +178 -0
- package/src/tool/gifAJpg/i18n/ru.ts +178 -0
- package/src/tool/gifAJpg/i18n/sv.ts +178 -0
- package/src/tool/gifAJpg/i18n/tr.ts +178 -0
- package/src/tool/gifAJpg/i18n/zh.ts +178 -0
- package/src/tool/gifAJpg/index.ts +13 -1
- package/src/tool/gifAPng/i18n/de.ts +178 -0
- package/src/tool/gifAPng/i18n/en.ts +2 -12
- package/src/tool/gifAPng/i18n/es.ts +2 -12
- package/src/tool/gifAPng/i18n/fr.ts +2 -12
- package/src/tool/gifAPng/i18n/id.ts +178 -0
- package/src/tool/gifAPng/i18n/it.ts +178 -0
- package/src/tool/gifAPng/i18n/ja.ts +178 -0
- package/src/tool/gifAPng/i18n/ko.ts +178 -0
- package/src/tool/gifAPng/i18n/nl.ts +178 -0
- package/src/tool/gifAPng/i18n/pl.ts +178 -0
- package/src/tool/gifAPng/i18n/pt.ts +178 -0
- package/src/tool/gifAPng/i18n/ru.ts +178 -0
- package/src/tool/gifAPng/i18n/sv.ts +178 -0
- package/src/tool/gifAPng/i18n/tr.ts +178 -0
- package/src/tool/gifAPng/i18n/zh.ts +178 -0
- package/src/tool/gifAPng/index.ts +12 -0
- package/src/tool/gifAWebp/i18n/de.ts +178 -0
- package/src/tool/gifAWebp/i18n/en.ts +2 -12
- package/src/tool/gifAWebp/i18n/es.ts +2 -12
- package/src/tool/gifAWebp/i18n/fr.ts +2 -12
- package/src/tool/gifAWebp/i18n/id.ts +178 -0
- package/src/tool/gifAWebp/i18n/it.ts +178 -0
- package/src/tool/gifAWebp/i18n/ja.ts +178 -0
- package/src/tool/gifAWebp/i18n/ko.ts +178 -0
- package/src/tool/gifAWebp/i18n/nl.ts +178 -0
- package/src/tool/gifAWebp/i18n/pl.ts +178 -0
- package/src/tool/gifAWebp/i18n/pt.ts +178 -0
- package/src/tool/gifAWebp/i18n/ru.ts +178 -0
- package/src/tool/gifAWebp/i18n/sv.ts +178 -0
- package/src/tool/gifAWebp/i18n/tr.ts +178 -0
- package/src/tool/gifAWebp/i18n/zh.ts +178 -0
- package/src/tool/gifAWebp/index.ts +12 -0
- package/src/tool/imagenBase64/i18n/de.ts +168 -0
- package/src/tool/imagenBase64/i18n/en.ts +2 -12
- package/src/tool/imagenBase64/i18n/es.ts +2 -12
- package/src/tool/imagenBase64/i18n/fr.ts +2 -12
- package/src/tool/imagenBase64/i18n/id.ts +168 -0
- package/src/tool/imagenBase64/i18n/it.ts +168 -0
- package/src/tool/imagenBase64/i18n/ja.ts +168 -0
- package/src/tool/imagenBase64/i18n/ko.ts +168 -0
- package/src/tool/imagenBase64/i18n/nl.ts +168 -0
- package/src/tool/imagenBase64/i18n/pl.ts +168 -0
- package/src/tool/imagenBase64/i18n/pt.ts +173 -0
- package/src/tool/imagenBase64/i18n/ru.ts +168 -0
- package/src/tool/imagenBase64/i18n/sv.ts +168 -0
- package/src/tool/imagenBase64/i18n/tr.ts +168 -0
- package/src/tool/imagenBase64/i18n/zh.ts +168 -0
- package/src/tool/imagenBase64/index.ts +12 -0
- package/src/tool/jpgAIco/i18n/de.ts +183 -0
- package/src/tool/jpgAIco/i18n/en.ts +8 -13
- package/src/tool/jpgAIco/i18n/es.ts +13 -18
- package/src/tool/jpgAIco/i18n/fr.ts +9 -14
- package/src/tool/jpgAIco/i18n/id.ts +183 -0
- package/src/tool/jpgAIco/i18n/it.ts +183 -0
- package/src/tool/jpgAIco/i18n/ja.ts +183 -0
- package/src/tool/jpgAIco/i18n/ko.ts +183 -0
- package/src/tool/jpgAIco/i18n/nl.ts +183 -0
- package/src/tool/jpgAIco/i18n/pl.ts +183 -0
- package/src/tool/jpgAIco/i18n/pt.ts +183 -0
- package/src/tool/jpgAIco/i18n/ru.ts +183 -0
- package/src/tool/jpgAIco/i18n/sv.ts +183 -0
- package/src/tool/jpgAIco/i18n/tr.ts +183 -0
- package/src/tool/jpgAIco/i18n/zh.ts +183 -0
- package/src/tool/jpgAIco/index.ts +12 -0
- package/src/tool/jpgAPng/i18n/de.ts +178 -0
- package/src/tool/jpgAPng/i18n/en.ts +2 -12
- package/src/tool/jpgAPng/i18n/es.ts +2 -12
- package/src/tool/jpgAPng/i18n/fr.ts +2 -12
- package/src/tool/jpgAPng/i18n/id.ts +178 -0
- package/src/tool/jpgAPng/i18n/it.ts +178 -0
- package/src/tool/jpgAPng/i18n/ja.ts +178 -0
- package/src/tool/jpgAPng/i18n/ko.ts +178 -0
- package/src/tool/jpgAPng/i18n/nl.ts +178 -0
- package/src/tool/jpgAPng/i18n/pl.ts +178 -0
- package/src/tool/jpgAPng/i18n/pt.ts +178 -0
- package/src/tool/jpgAPng/i18n/ru.ts +178 -0
- package/src/tool/jpgAPng/i18n/sv.ts +178 -0
- package/src/tool/jpgAPng/i18n/tr.ts +178 -0
- package/src/tool/jpgAPng/i18n/zh.ts +178 -0
- package/src/tool/jpgAPng/index.ts +13 -1
- package/src/tool/jpgAWebp/i18n/de.ts +178 -0
- package/src/tool/jpgAWebp/i18n/en.ts +2 -12
- package/src/tool/jpgAWebp/i18n/es.ts +2 -12
- package/src/tool/jpgAWebp/i18n/fr.ts +2 -12
- package/src/tool/jpgAWebp/i18n/id.ts +178 -0
- package/src/tool/jpgAWebp/i18n/it.ts +178 -0
- package/src/tool/jpgAWebp/i18n/ja.ts +178 -0
- package/src/tool/jpgAWebp/i18n/ko.ts +178 -0
- package/src/tool/jpgAWebp/i18n/nl.ts +178 -0
- package/src/tool/jpgAWebp/i18n/pl.ts +178 -0
- package/src/tool/jpgAWebp/i18n/pt.ts +178 -0
- package/src/tool/jpgAWebp/i18n/ru.ts +178 -0
- package/src/tool/jpgAWebp/i18n/sv.ts +178 -0
- package/src/tool/jpgAWebp/i18n/tr.ts +178 -0
- package/src/tool/jpgAWebp/i18n/zh.ts +178 -0
- package/src/tool/jpgAWebp/index.ts +12 -0
- package/src/tool/pngAIco/i18n/de.ts +183 -0
- package/src/tool/pngAIco/i18n/en.ts +8 -13
- package/src/tool/pngAIco/i18n/es.ts +19 -24
- package/src/tool/pngAIco/i18n/fr.ts +20 -25
- package/src/tool/pngAIco/i18n/id.ts +183 -0
- package/src/tool/pngAIco/i18n/it.ts +183 -0
- package/src/tool/pngAIco/i18n/ja.ts +183 -0
- package/src/tool/pngAIco/i18n/ko.ts +183 -0
- package/src/tool/pngAIco/i18n/nl.ts +183 -0
- package/src/tool/pngAIco/i18n/pl.ts +183 -0
- package/src/tool/pngAIco/i18n/pt.ts +183 -0
- package/src/tool/pngAIco/i18n/ru.ts +183 -0
- package/src/tool/pngAIco/i18n/sv.ts +183 -0
- package/src/tool/pngAIco/i18n/tr.ts +183 -0
- package/src/tool/pngAIco/i18n/zh.ts +183 -0
- package/src/tool/pngAIco/index.ts +12 -0
- package/src/tool/pngAJpg/i18n/de.ts +191 -0
- package/src/tool/pngAJpg/i18n/en.ts +2 -12
- package/src/tool/pngAJpg/i18n/es.ts +2 -12
- package/src/tool/pngAJpg/i18n/fr.ts +2 -12
- package/src/tool/pngAJpg/i18n/id.ts +191 -0
- package/src/tool/pngAJpg/i18n/it.ts +191 -0
- package/src/tool/pngAJpg/i18n/ja.ts +191 -0
- package/src/tool/pngAJpg/i18n/ko.ts +191 -0
- package/src/tool/pngAJpg/i18n/nl.ts +191 -0
- package/src/tool/pngAJpg/i18n/pl.ts +191 -0
- package/src/tool/pngAJpg/i18n/pt.ts +191 -0
- package/src/tool/pngAJpg/i18n/ru.ts +191 -0
- package/src/tool/pngAJpg/i18n/sv.ts +191 -0
- package/src/tool/pngAJpg/i18n/tr.ts +191 -0
- package/src/tool/pngAJpg/i18n/zh.ts +191 -0
- package/src/tool/pngAJpg/index.ts +13 -1
- package/src/tool/pngAWebp/i18n/de.ts +182 -0
- package/src/tool/pngAWebp/i18n/en.ts +2 -12
- package/src/tool/pngAWebp/i18n/es.ts +2 -12
- package/src/tool/pngAWebp/i18n/fr.ts +2 -12
- package/src/tool/pngAWebp/i18n/id.ts +182 -0
- package/src/tool/pngAWebp/i18n/it.ts +182 -0
- package/src/tool/pngAWebp/i18n/ja.ts +182 -0
- package/src/tool/pngAWebp/i18n/ko.ts +182 -0
- package/src/tool/pngAWebp/i18n/nl.ts +182 -0
- package/src/tool/pngAWebp/i18n/pl.ts +182 -0
- package/src/tool/pngAWebp/i18n/pt.ts +182 -0
- package/src/tool/pngAWebp/i18n/ru.ts +182 -0
- package/src/tool/pngAWebp/i18n/sv.ts +182 -0
- package/src/tool/pngAWebp/i18n/tr.ts +182 -0
- package/src/tool/pngAWebp/i18n/zh.ts +182 -0
- package/src/tool/pngAWebp/index.ts +12 -0
- package/src/tool/svgAJpg/i18n/de.ts +178 -0
- package/src/tool/svgAJpg/i18n/en.ts +8 -13
- package/src/tool/svgAJpg/i18n/es.ts +8 -13
- package/src/tool/svgAJpg/i18n/fr.ts +2 -12
- package/src/tool/svgAJpg/i18n/id.ts +178 -0
- package/src/tool/svgAJpg/i18n/it.ts +178 -0
- package/src/tool/svgAJpg/i18n/ja.ts +178 -0
- package/src/tool/svgAJpg/i18n/ko.ts +178 -0
- package/src/tool/svgAJpg/i18n/nl.ts +178 -0
- package/src/tool/svgAJpg/i18n/pl.ts +178 -0
- package/src/tool/svgAJpg/i18n/pt.ts +178 -0
- package/src/tool/svgAJpg/i18n/ru.ts +178 -0
- package/src/tool/svgAJpg/i18n/sv.ts +178 -0
- package/src/tool/svgAJpg/i18n/tr.ts +178 -0
- package/src/tool/svgAJpg/i18n/zh.ts +178 -0
- package/src/tool/svgAJpg/index.ts +12 -0
- package/src/tool/svgAPng/i18n/de.ts +178 -0
- package/src/tool/svgAPng/i18n/en.ts +8 -13
- package/src/tool/svgAPng/i18n/es.ts +31 -36
- package/src/tool/svgAPng/i18n/fr.ts +2 -12
- package/src/tool/svgAPng/i18n/id.ts +178 -0
- package/src/tool/svgAPng/i18n/it.ts +178 -0
- package/src/tool/svgAPng/i18n/ja.ts +178 -0
- package/src/tool/svgAPng/i18n/ko.ts +178 -0
- package/src/tool/svgAPng/i18n/nl.ts +178 -0
- package/src/tool/svgAPng/i18n/pl.ts +178 -0
- package/src/tool/svgAPng/i18n/pt.ts +178 -0
- package/src/tool/svgAPng/i18n/ru.ts +178 -0
- package/src/tool/svgAPng/i18n/sv.ts +178 -0
- package/src/tool/svgAPng/i18n/tr.ts +178 -0
- package/src/tool/svgAPng/i18n/zh.ts +178 -0
- package/src/tool/svgAPng/index.ts +12 -0
- package/src/tool/webpAIco/i18n/de.ts +183 -0
- package/src/tool/webpAIco/i18n/en.ts +8 -13
- package/src/tool/webpAIco/i18n/es.ts +9 -14
- package/src/tool/webpAIco/i18n/fr.ts +11 -16
- package/src/tool/webpAIco/i18n/id.ts +183 -0
- package/src/tool/webpAIco/i18n/it.ts +183 -0
- package/src/tool/webpAIco/i18n/ja.ts +183 -0
- package/src/tool/webpAIco/i18n/ko.ts +183 -0
- package/src/tool/webpAIco/i18n/nl.ts +183 -0
- package/src/tool/webpAIco/i18n/pl.ts +183 -0
- package/src/tool/webpAIco/i18n/pt.ts +183 -0
- package/src/tool/webpAIco/i18n/ru.ts +183 -0
- package/src/tool/webpAIco/i18n/sv.ts +183 -0
- package/src/tool/webpAIco/i18n/tr.ts +183 -0
- package/src/tool/webpAIco/i18n/zh.ts +183 -0
- package/src/tool/webpAIco/index.ts +12 -0
- package/src/tool/webpAJpg/i18n/de.ts +187 -0
- package/src/tool/webpAJpg/i18n/en.ts +9 -13
- package/src/tool/webpAJpg/i18n/es.ts +37 -42
- package/src/tool/webpAJpg/i18n/fr.ts +35 -40
- package/src/tool/webpAJpg/i18n/id.ts +182 -0
- package/src/tool/webpAJpg/i18n/it.ts +182 -0
- package/src/tool/webpAJpg/i18n/ja.ts +182 -0
- package/src/tool/webpAJpg/i18n/ko.ts +182 -0
- package/src/tool/webpAJpg/i18n/nl.ts +182 -0
- package/src/tool/webpAJpg/i18n/pl.ts +182 -0
- package/src/tool/webpAJpg/i18n/pt.ts +182 -0
- package/src/tool/webpAJpg/i18n/ru.ts +182 -0
- package/src/tool/webpAJpg/i18n/sv.ts +182 -0
- package/src/tool/webpAJpg/i18n/tr.ts +182 -0
- package/src/tool/webpAJpg/i18n/zh.ts +182 -0
- package/src/tool/webpAJpg/index.ts +12 -0
- package/src/tool/webpAPng/i18n/de.ts +182 -0
- package/src/tool/webpAPng/i18n/en.ts +8 -13
- package/src/tool/webpAPng/i18n/es.ts +35 -40
- package/src/tool/webpAPng/i18n/fr.ts +2 -12
- package/src/tool/webpAPng/i18n/id.ts +182 -0
- package/src/tool/webpAPng/i18n/it.ts +182 -0
- package/src/tool/webpAPng/i18n/ja.ts +182 -0
- package/src/tool/webpAPng/i18n/ko.ts +182 -0
- package/src/tool/webpAPng/i18n/nl.ts +182 -0
- package/src/tool/webpAPng/i18n/pl.ts +182 -0
- package/src/tool/webpAPng/i18n/pt.ts +182 -0
- package/src/tool/webpAPng/i18n/ru.ts +182 -0
- package/src/tool/webpAPng/i18n/sv.ts +182 -0
- package/src/tool/webpAPng/i18n/tr.ts +182 -0
- package/src/tool/webpAPng/i18n/zh.ts +182 -0
- 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 = 'konvertera-gif-till-jpg';
|
|
6
|
+
const title = 'Konvertera GIF till JPG Online';
|
|
7
|
+
const description =
|
|
8
|
+
'Extrahera den första rutan från dina GIF-filer och konvertera den till JPG. Utan server. Lokal bearbetning i din webbläsare. Gratis och obegränsat.';
|
|
9
|
+
|
|
10
|
+
const ui: ImageConverterUI = {
|
|
11
|
+
dragText: 'Dra GIF-filer hit...',
|
|
12
|
+
convertText: 'För att konvertera dem till JPG direkt',
|
|
13
|
+
selectFiles: 'Välj filer',
|
|
14
|
+
processedFiles: 'Bearbetade filer',
|
|
15
|
+
downloadAll: 'Ladda ner alla (.zip)',
|
|
16
|
+
pending: 'Väntande',
|
|
17
|
+
bibliographyTitle: 'Bibliografiska Referenser',
|
|
18
|
+
faqTitle: 'Vanliga Frågor',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const faq: GifAJpgLocaleContent['faq'] = [
|
|
22
|
+
{
|
|
23
|
+
question: 'Vad händer med animationerna när jag går över till JPG?',
|
|
24
|
+
answer:
|
|
25
|
+
'JPG-formatet är strikt statiskt och stöder inte flera rutor. Vår konverterare extraherar endast den första bilden eller rutan som visas i GIF-sekvensen.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
question: 'Kommer jag att förlora några specialeffekter eller transparent bakgrund?',
|
|
29
|
+
answer:
|
|
30
|
+
'Ja, det är det naturliga beteendet för JPG-standarden. Om du laddar upp en GIF med transparent bakgrund lägger vi automatiskt till ett solitt vitt bakgrundslager för att undvika korrupta färger.',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
question: 'Kan jag extrahera JPG-foton från en GIF utan att webbplatsen sparar mitt innehåll?',
|
|
34
|
+
answer:
|
|
35
|
+
'Absolut ja. Verktyget är en webbapp baserad på HTML5 Canvas. All avkodning utförs av processorn i din egen fysiska enhet.',
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
const howTo: GifAJpgLocaleContent['howTo'] = [
|
|
40
|
+
{
|
|
41
|
+
name: 'Dra rörliga tunga filer',
|
|
42
|
+
text: 'Placera eller dra den där GIF-filen från din mapp och släpp den i vår bearbetningsruta.',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'Ren beräkning av den första rutan',
|
|
46
|
+
text: 'På bråkdelen av en sekund extraheras animationen och en solid vit JPG skapas utan att kontakta servrar.',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'Få dem paketerade i ett ZIP-arkiv',
|
|
50
|
+
text: 'Ladda ner via knapparna eller använd ZIP om du bearbetade ett stort antal filer.',
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
const bibliography: GifAJpgLocaleContent['bibliography'] = [
|
|
55
|
+
{
|
|
56
|
+
name: 'Joint Photographic Experts Group teknisk specifikation',
|
|
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 till JPG-konverterare: Extrahera rutor som högkvalitativa bilder',
|
|
69
|
+
level: 2,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
type: 'paragraph',
|
|
73
|
+
html: 'GIF-filer har i årtionden dominerat världen av korta animationer på internet. Men deras animerade natur gör dem helt oanvändbara som miniatyrbilder, förhandsvisningar för sociala nätverk eller bilder i dokument. När du behöver extrahera en specifik ruta från en GIF och konvertera den till en statisk bild av hög kvalitet, är konvertering till JPG den mest praktiska och kompatibla lösningen.',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
type: 'title',
|
|
77
|
+
text: 'GIF eller JPG? Format med motsatta syften',
|
|
78
|
+
level: 3,
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
type: 'paragraph',
|
|
82
|
+
html: 'GIF (Graphics Interchange Format) designades 1987 med en sträng begränsning som kvarstår idag: det kan bara representera 256 färger per ruta. Denna tekniska restriktion spelade ingen roll för enkla animationer med reducerade paletter, men det gör det till ett visuellt fattigt format för riktig fotografering. JPG däremot kan rendera miljontals färger med avancerade perceptuella komprimeringsalgoritmer.',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
type: 'paragraph',
|
|
86
|
+
html: 'Att extrahera en ruta från en GIF och spara den som JPG har flera tillämpningar: generera miniatyrbilder för videospelare, skapa förhandsvisningar för innehållshanteringsplattformar, få statiska bilder för presentationer eller helt enkelt arkivera ett visuellt ögonblick från en komplex animation. Den resulterande JPG-filen blir mycket lättare än den ursprungliga GIF-filen och universellt kompatibel.',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
type: 'title',
|
|
90
|
+
text: 'Arkitekturjämförelse: Lokal vs Moln',
|
|
91
|
+
level: 3,
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
type: 'comparative',
|
|
95
|
+
items: [
|
|
96
|
+
{
|
|
97
|
+
title: 'Molnkonverterare',
|
|
98
|
+
description: 'Verktyg som laddar upp dina filer till en fjärrserver för bearbetning.',
|
|
99
|
+
icon: 'mdi:cloud-upload',
|
|
100
|
+
pointIcon: 'mdi:close-circle-outline',
|
|
101
|
+
points: [
|
|
102
|
+
'Dina GIF-filer skickas över internet till tredjepartsservrar',
|
|
103
|
+
'Nätverksfördröjning vid upp- och nedladdning',
|
|
104
|
+
'Storleksbegränsningar och filgränser per session',
|
|
105
|
+
'Risk för datalagring på andras servrar',
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
title: 'Vår lokala arkitektur',
|
|
110
|
+
description: 'Direkt bearbetning på din hårdvara via Vanilla JS-teknik.',
|
|
111
|
+
icon: 'mdi:laptop-mac',
|
|
112
|
+
highlight: true,
|
|
113
|
+
points: [
|
|
114
|
+
'GIF-filen lämnar aldrig din enhet',
|
|
115
|
+
'Omedelbar hastighet utan nätverksväntan',
|
|
116
|
+
'Inga storleksbegränsningar eller filgränser',
|
|
117
|
+
'Total integritet: 0 byte skickas externt',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
type: 'title',
|
|
124
|
+
text: 'Hur den tekniska extraktionen av rutan fungerar',
|
|
125
|
+
level: 3,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
type: 'paragraph',
|
|
129
|
+
html: 'Den lokala konverteringen stöder sig på kraften i HTML5 Canvas API. När du laddar en GIF avkodar webbläsaren den i minnet som ett inbyggt Image-element. Genom att rendera den på en osynlig canvas fångar webbläsarens grafikmotor automatiskt den första rutan i animationssekvensen.',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
type: 'paragraph',
|
|
133
|
+
html: 'Eftersom JPG-formatet inte stöder transparens använder vår algoritm en solid vit bakgrund före export. Canvas-metoden <code>toDataURL(\'image/jpeg\')</code> genererar JPG-byteströmmen direkt i din dators RAM-minne, utan någon nätverksanslutning. Den resulterande filen laddas omedelbart ner till din enhet.',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'tip',
|
|
137
|
+
title: 'GIF filens begränsade färgpalett',
|
|
138
|
+
html: 'GIF kan bara innehålla 256 färger per ruta. Den extraherade JPG-filen ärver den reducerade paletten från originalet: om GIF-filen hade toningar eller foton kan den se något postertiserad ut. För bästa resultat, använd GIF-filer med enkla färger eller illustrationer.',
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'title',
|
|
142
|
+
text: 'Användningsfall och kompatibilitet för den resulterande JPG-filen',
|
|
143
|
+
level: 3,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'list',
|
|
147
|
+
icon: 'mdi:check-circle',
|
|
148
|
+
items: [
|
|
149
|
+
'Miniatyrbilder och förhandsvisningar för videoplattformar och CMS.',
|
|
150
|
+
'Omslagsbilder för inlägg på sociala nätverk.',
|
|
151
|
+
'Infogning i Word-, PowerPoint- eller PDF-dokument.',
|
|
152
|
+
'Presentationsfiler och marknadsföringsmaterial.',
|
|
153
|
+
'Universell kompatibilitet med bildvisare i Windows, macOS och mobiler.',
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: 'title',
|
|
158
|
+
text: 'Slutsats: den där rutan är värd mer än animationen',
|
|
159
|
+
level: 3,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
type: 'paragraph',
|
|
163
|
+
html: 'En animerad GIF på 2 MB kan producera en JPG av den första rutan på endast cirka 50-200 KB, beroende på upplösning. Vårt verktyg utför denna konvertering omedelbart, privat och utan begränsningar, direkt i din webbläsare. Inga servrar, inga konton, ingen väntan.',
|
|
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: 'sv', 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 = '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 = 'gif-to-jpg-converter';
|
|
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
|
-
|
|
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
|
|