@jjlmoya/utils-developer 1.3.0 → 1.5.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 +2 -1
- package/src/category/i18n/de.ts +34 -0
- package/src/category/i18n/id.ts +34 -0
- package/src/category/i18n/it.ts +34 -0
- package/src/category/i18n/ja.ts +34 -0
- package/src/category/i18n/ko.ts +34 -0
- package/src/category/i18n/nl.ts +34 -0
- package/src/category/i18n/pl.ts +34 -0
- package/src/category/i18n/pt.ts +34 -0
- package/src/category/i18n/ru.ts +34 -0
- package/src/category/i18n/sv.ts +34 -0
- package/src/category/i18n/tr.ts +34 -0
- package/src/category/i18n/zh.ts +34 -0
- package/src/category/index.ts +13 -1
- package/src/index.ts +12 -0
- package/src/tests/faq_count.test.ts +1 -1
- package/src/tests/i18n_coverage.test.ts +36 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tool/aspectRatio/i18n/de.ts +177 -0
- package/src/tool/aspectRatio/i18n/id.ts +177 -0
- package/src/tool/aspectRatio/i18n/it.ts +177 -0
- package/src/tool/aspectRatio/i18n/ja.ts +178 -0
- package/src/tool/aspectRatio/i18n/ko.ts +178 -0
- package/src/tool/aspectRatio/i18n/nl.ts +178 -0
- package/src/tool/aspectRatio/i18n/pl.ts +177 -0
- package/src/tool/aspectRatio/i18n/pt.ts +177 -0
- package/src/tool/aspectRatio/i18n/ru.ts +177 -0
- package/src/tool/aspectRatio/i18n/sv.ts +177 -0
- package/src/tool/aspectRatio/i18n/tr.ts +177 -0
- package/src/tool/aspectRatio/i18n/zh.ts +178 -0
- package/src/tool/aspectRatio/index.ts +15 -7
- package/src/tool/calculadoraTiempoDatos/i18n/de.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/id.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/it.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/ja.ts +151 -0
- package/src/tool/calculadoraTiempoDatos/i18n/ko.ts +151 -0
- package/src/tool/calculadoraTiempoDatos/i18n/nl.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/pt.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +151 -0
- package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/tr.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +151 -0
- package/src/tool/calculadoraTiempoDatos/index.ts +15 -7
- package/src/tool/colorConverter/i18n/de.ts +126 -0
- package/src/tool/colorConverter/i18n/id.ts +126 -0
- package/src/tool/colorConverter/i18n/it.ts +126 -0
- package/src/tool/colorConverter/i18n/ja.ts +127 -0
- package/src/tool/colorConverter/i18n/ko.ts +127 -0
- package/src/tool/colorConverter/i18n/nl.ts +126 -0
- package/src/tool/colorConverter/i18n/pl.ts +126 -0
- package/src/tool/colorConverter/i18n/pt.ts +126 -0
- package/src/tool/colorConverter/i18n/ru.ts +126 -0
- package/src/tool/colorConverter/i18n/sv.ts +126 -0
- package/src/tool/colorConverter/i18n/tr.ts +126 -0
- package/src/tool/colorConverter/i18n/zh.ts +127 -0
- package/src/tool/colorConverter/index.ts +15 -7
- package/src/tool/conversorExcelCsvHtml/i18n/de.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/id.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/it.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/ja.ts +130 -0
- package/src/tool/conversorExcelCsvHtml/i18n/ko.ts +130 -0
- package/src/tool/conversorExcelCsvHtml/i18n/nl.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/pt.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/sv.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/tr.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +130 -0
- package/src/tool/conversorExcelCsvHtml/index.ts +15 -7
- package/src/tool/cronGenerator/i18n/de.ts +192 -0
- package/src/tool/cronGenerator/i18n/es.ts +2 -1
- package/src/tool/cronGenerator/i18n/fr.ts +2 -1
- package/src/tool/cronGenerator/i18n/id.ts +192 -0
- package/src/tool/cronGenerator/i18n/it.ts +192 -0
- package/src/tool/cronGenerator/i18n/ja.ts +192 -0
- package/src/tool/cronGenerator/i18n/ko.ts +192 -0
- package/src/tool/cronGenerator/i18n/nl.ts +192 -0
- package/src/tool/cronGenerator/i18n/pl.ts +192 -0
- package/src/tool/cronGenerator/i18n/pt.ts +192 -0
- package/src/tool/cronGenerator/i18n/ru.ts +192 -0
- package/src/tool/cronGenerator/i18n/sv.ts +192 -0
- package/src/tool/cronGenerator/i18n/tr.ts +192 -0
- package/src/tool/cronGenerator/i18n/zh.ts +192 -0
- package/src/tool/cronGenerator/index.ts +15 -7
- package/src/tool/cssSpecificityCalculator/i18n/de.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/id.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/it.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/ja.ts +169 -0
- package/src/tool/cssSpecificityCalculator/i18n/ko.ts +169 -0
- package/src/tool/cssSpecificityCalculator/i18n/nl.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/pl.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/pt.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/ru.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/sv.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/tr.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/zh.ts +169 -0
- package/src/tool/cssSpecificityCalculator/index.ts +15 -7
- package/src/tool/cssToInlineConverter/i18n/de.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/id.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/it.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/ja.ts +161 -0
- package/src/tool/cssToInlineConverter/i18n/ko.ts +161 -0
- package/src/tool/cssToInlineConverter/i18n/nl.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/pl.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/pt.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/ru.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/sv.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/tr.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/zh.ts +161 -0
- package/src/tool/cssToInlineConverter/index.ts +15 -7
- package/src/tool/duplicateCssRemover/i18n/de.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/id.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/it.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/ja.ts +168 -0
- package/src/tool/duplicateCssRemover/i18n/ko.ts +168 -0
- package/src/tool/duplicateCssRemover/i18n/nl.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/pl.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/pt.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/ru.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/sv.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/tr.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/zh.ts +168 -0
- package/src/tool/duplicateCssRemover/index.ts +15 -7
- package/src/tool/generadorSecurityTxt/i18n/de.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/id.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/it.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/ja.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/ko.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/nl.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/pl.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/pt.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/ru.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/sv.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/tr.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/zh.ts +174 -0
- package/src/tool/generadorSecurityTxt/index.ts +15 -7
- package/src/tool/hashGenerator/i18n/de.ts +119 -0
- package/src/tool/hashGenerator/i18n/id.ts +119 -0
- package/src/tool/hashGenerator/i18n/it.ts +118 -0
- package/src/tool/hashGenerator/i18n/ja.ts +119 -0
- package/src/tool/hashGenerator/i18n/ko.ts +119 -0
- package/src/tool/hashGenerator/i18n/nl.ts +119 -0
- package/src/tool/hashGenerator/i18n/pl.ts +118 -0
- package/src/tool/hashGenerator/i18n/pt.ts +118 -0
- package/src/tool/hashGenerator/i18n/ru.ts +119 -0
- package/src/tool/hashGenerator/i18n/sv.ts +119 -0
- package/src/tool/hashGenerator/i18n/tr.ts +118 -0
- package/src/tool/hashGenerator/i18n/zh.ts +119 -0
- package/src/tool/hashGenerator/index.ts +15 -7
- package/src/tool/inspectorCertificadosSsl/i18n/de.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/id.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/it.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/ja.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/ko.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/nl.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/pl.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/pt.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/ru.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/sv.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/tr.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/zh.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/index.ts +24 -0
- package/src/tool/jsonFormatter/i18n/de.ts +157 -0
- package/src/tool/jsonFormatter/i18n/es.ts +2 -1
- package/src/tool/jsonFormatter/i18n/fr.ts +2 -1
- package/src/tool/jsonFormatter/i18n/id.ts +157 -0
- package/src/tool/jsonFormatter/i18n/it.ts +156 -0
- package/src/tool/jsonFormatter/i18n/ja.ts +157 -0
- package/src/tool/jsonFormatter/i18n/ko.ts +157 -0
- package/src/tool/jsonFormatter/i18n/nl.ts +157 -0
- package/src/tool/jsonFormatter/i18n/pl.ts +156 -0
- package/src/tool/jsonFormatter/i18n/pt.ts +156 -0
- package/src/tool/jsonFormatter/i18n/ru.ts +157 -0
- package/src/tool/jsonFormatter/i18n/sv.ts +157 -0
- package/src/tool/jsonFormatter/i18n/tr.ts +157 -0
- package/src/tool/jsonFormatter/i18n/zh.ts +157 -0
- package/src/tool/jsonFormatter/index.ts +15 -7
- package/src/tool/keycode/i18n/de.ts +161 -0
- package/src/tool/keycode/i18n/es.ts +2 -1
- package/src/tool/keycode/i18n/fr.ts +2 -1
- package/src/tool/keycode/i18n/id.ts +161 -0
- package/src/tool/keycode/i18n/it.ts +161 -0
- package/src/tool/keycode/i18n/ja.ts +161 -0
- package/src/tool/keycode/i18n/ko.ts +161 -0
- package/src/tool/keycode/i18n/nl.ts +161 -0
- package/src/tool/keycode/i18n/pl.ts +161 -0
- package/src/tool/keycode/i18n/pt.ts +160 -0
- package/src/tool/keycode/i18n/ru.ts +160 -0
- package/src/tool/keycode/i18n/sv.ts +160 -0
- package/src/tool/keycode/i18n/tr.ts +160 -0
- package/src/tool/keycode/i18n/zh.ts +161 -0
- package/src/tool/keycode/index.ts +15 -7
- package/src/tool/llmCostCalculator/i18n/de.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/fr.ts +2 -1
- package/src/tool/llmCostCalculator/i18n/id.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/it.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/ja.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/ko.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/nl.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/pl.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/pt.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/ru.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/sv.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/tr.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/zh.ts +166 -0
- package/src/tool/llmCostCalculator/index.ts +24 -0
- package/src/tool/mobileMockupGenerator/i18n/de.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/id.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/it.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/ja.ts +122 -0
- package/src/tool/mobileMockupGenerator/i18n/ko.ts +122 -0
- package/src/tool/mobileMockupGenerator/i18n/nl.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/pl.ts +31 -0
- package/src/tool/mobileMockupGenerator/i18n/pt.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/ru.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/sv.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/tr.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/zh.ts +122 -0
- package/src/tool/mobileMockupGenerator/index.ts +24 -0
- package/src/tool/musicalTypography/i18n/de.ts +179 -0
- package/src/tool/musicalTypography/i18n/id.ts +179 -0
- package/src/tool/musicalTypography/i18n/it.ts +179 -0
- package/src/tool/musicalTypography/i18n/ja.ts +180 -0
- package/src/tool/musicalTypography/i18n/ko.ts +180 -0
- package/src/tool/musicalTypography/i18n/nl.ts +179 -0
- package/src/tool/musicalTypography/i18n/pl.ts +179 -0
- package/src/tool/musicalTypography/i18n/pt.ts +101 -0
- package/src/tool/musicalTypography/i18n/ru.ts +47 -0
- package/src/tool/musicalTypography/i18n/sv.ts +29 -0
- package/src/tool/musicalTypography/i18n/tr.ts +29 -0
- package/src/tool/musicalTypography/i18n/zh.ts +30 -0
- package/src/tool/musicalTypography/index.ts +15 -7
- package/src/tool/placeholderGenerator/i18n/de.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/id.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/it.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/ja.ts +177 -0
- package/src/tool/placeholderGenerator/i18n/ko.ts +177 -0
- package/src/tool/placeholderGenerator/i18n/nl.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/pl.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/pt.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/ru.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/sv.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/tr.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/zh.ts +177 -0
- package/src/tool/placeholderGenerator/index.ts +24 -0
- package/src/tool/promptLibrary/i18n/de.ts +131 -0
- package/src/tool/promptLibrary/i18n/id.ts +131 -0
- package/src/tool/promptLibrary/i18n/it.ts +131 -0
- package/src/tool/promptLibrary/i18n/ja.ts +132 -0
- package/src/tool/promptLibrary/i18n/ko.ts +132 -0
- package/src/tool/promptLibrary/i18n/nl.ts +131 -0
- package/src/tool/promptLibrary/i18n/pl.ts +28 -0
- package/src/tool/promptLibrary/i18n/pt.ts +101 -0
- package/src/tool/promptLibrary/i18n/ru.ts +101 -0
- package/src/tool/promptLibrary/i18n/sv.ts +93 -0
- package/src/tool/promptLibrary/i18n/tr.ts +93 -0
- package/src/tool/promptLibrary/i18n/zh.ts +94 -0
- package/src/tool/promptLibrary/index.ts +24 -0
- package/src/tool/readabilityCalculator/i18n/de.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/id.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/it.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/ja.ts +134 -0
- package/src/tool/readabilityCalculator/i18n/ko.ts +134 -0
- package/src/tool/readabilityCalculator/i18n/nl.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/pl.ts +29 -0
- package/src/tool/readabilityCalculator/i18n/pt.ts +91 -0
- package/src/tool/readabilityCalculator/i18n/ru.ts +91 -0
- package/src/tool/readabilityCalculator/i18n/sv.ts +43 -0
- package/src/tool/readabilityCalculator/i18n/tr.ts +43 -0
- package/src/tool/readabilityCalculator/i18n/zh.ts +44 -0
- package/src/tool/readabilityCalculator/index.ts +24 -0
- package/src/tool/svgSanitizer/i18n/de.ts +125 -0
- package/src/tool/svgSanitizer/i18n/id.ts +125 -0
- package/src/tool/svgSanitizer/i18n/it.ts +125 -0
- package/src/tool/svgSanitizer/i18n/ja.ts +126 -0
- package/src/tool/svgSanitizer/i18n/ko.ts +126 -0
- package/src/tool/svgSanitizer/i18n/nl.ts +125 -0
- package/src/tool/svgSanitizer/i18n/pl.ts +125 -0
- package/src/tool/svgSanitizer/i18n/pt.ts +30 -0
- package/src/tool/svgSanitizer/i18n/ru.ts +126 -0
- package/src/tool/svgSanitizer/i18n/sv.ts +126 -0
- package/src/tool/svgSanitizer/i18n/tr.ts +126 -0
- package/src/tool/svgSanitizer/i18n/zh.ts +126 -0
- package/src/tool/svgSanitizer/index.ts +24 -0
- package/src/tool/svgToCss/i18n/de.ts +174 -0
- package/src/tool/svgToCss/i18n/id.ts +174 -0
- package/src/tool/svgToCss/i18n/it.ts +174 -0
- package/src/tool/svgToCss/i18n/ja.ts +175 -0
- package/src/tool/svgToCss/i18n/ko.ts +175 -0
- package/src/tool/svgToCss/i18n/nl.ts +174 -0
- package/src/tool/svgToCss/i18n/pl.ts +174 -0
- package/src/tool/svgToCss/i18n/pt.ts +174 -0
- package/src/tool/svgToCss/i18n/ru.ts +174 -0
- package/src/tool/svgToCss/i18n/sv.ts +174 -0
- package/src/tool/svgToCss/i18n/tr.ts +174 -0
- package/src/tool/svgToCss/i18n/zh.ts +175 -0
- package/src/tool/svgToCss/index.ts +15 -7
- package/src/tool/urlCleaner/i18n/de.ts +116 -0
- package/src/tool/urlCleaner/i18n/id.ts +116 -0
- package/src/tool/urlCleaner/i18n/it.ts +116 -0
- package/src/tool/urlCleaner/i18n/ja.ts +117 -0
- package/src/tool/urlCleaner/i18n/ko.ts +117 -0
- package/src/tool/urlCleaner/i18n/nl.ts +116 -0
- package/src/tool/urlCleaner/i18n/pl.ts +29 -0
- package/src/tool/urlCleaner/i18n/pt.ts +43 -0
- package/src/tool/urlCleaner/i18n/ru.ts +43 -0
- package/src/tool/urlCleaner/i18n/sv.ts +43 -0
- package/src/tool/urlCleaner/i18n/tr.ts +43 -0
- package/src/tool/urlCleaner/i18n/zh.ts +44 -0
- package/src/tool/urlCleaner/index.ts +24 -0
- package/src/tool/urlEncoderDecoder/i18n/de.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/id.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/it.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/ja.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/ko.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/nl.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/pl.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/pt.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/ru.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/sv.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/tr.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/zh.ts +163 -0
- package/src/tool/urlEncoderDecoder/index.ts +15 -7
- package/src/tool/utmGenerator/i18n/de.ts +118 -0
- package/src/tool/utmGenerator/i18n/id.ts +118 -0
- package/src/tool/utmGenerator/i18n/it.ts +118 -0
- package/src/tool/utmGenerator/i18n/ja.ts +118 -0
- package/src/tool/utmGenerator/i18n/ko.ts +118 -0
- package/src/tool/utmGenerator/i18n/nl.ts +118 -0
- package/src/tool/utmGenerator/i18n/pl.ts +117 -0
- package/src/tool/utmGenerator/i18n/pt.ts +118 -0
- package/src/tool/utmGenerator/i18n/ru.ts +118 -0
- package/src/tool/utmGenerator/i18n/sv.ts +118 -0
- package/src/tool/utmGenerator/i18n/tr.ts +117 -0
- package/src/tool/utmGenerator/i18n/zh.ts +118 -0
- package/src/tool/utmGenerator/index.ts +15 -7
- package/src/types.ts +1 -2
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { CssToInlineConverterUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'css-to-inline-converter';
|
|
6
|
+
const title = 'CSS 转为内联 HTML。电子邮件内联处理器';
|
|
7
|
+
const description =
|
|
8
|
+
'将样式表和 CSS 类自动转换为 HTML 中的内联样式。非常适合电子报、交易邮件和安全的网页布局。';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: '为什么电子邮件需要内联 CSS 而不是外部样式表?',
|
|
13
|
+
answer:
|
|
14
|
+
'电子邮件客户端(如 Outlook、Gmail 或 Apple Mail)出于安全原因会过滤或忽略 <link> 和 <style> 标签。确保样式在电子邮件中正确应用的唯一方法是直接将其嵌入每个 HTML 元素的 style 属性中。',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '如果元素已经有自己的 style 属性会怎样?',
|
|
18
|
+
answer:
|
|
19
|
+
'该工具尊重现有的内联样式并附加新属性,模拟 CSS 级联行为:后声明的属性在冲突时覆盖前面的属性。',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: '它是否适用于 :hover 或媒体查询等复杂选择器?',
|
|
23
|
+
answer:
|
|
24
|
+
'该工具处理 DOMParser 可以解析的类、id、属性和结构伪类选择器。依赖状态的选择器(如 :hover)和媒体查询无法内联化(它们依赖于运行时环境)并被忽略。',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: '我的 HTML 和 CSS 是否会发送到任何服务器?',
|
|
28
|
+
answer:
|
|
29
|
+
'不会。所有处理都 100% 在您的浏览器中使用原生 DOMParser API 进行。您的代码不会离开您的设备,确保包含敏感内容的模板具有完全隐私。',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: '粘贴原始 HTML',
|
|
36
|
+
text: '在"原始 HTML"字段中写入或粘贴您想要处理的 HTML。可以是片段或完整文档。',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: '添加 CSS 规则',
|
|
40
|
+
text: '将要注入的类和 id 粘贴到"CSS 规则"字段中。工具应用它们时会遵循选择器特异性。',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: '转换并复制',
|
|
44
|
+
text: '点击"将 CSS 注入 HTML"。具有所有内联样式的结果将显示在下方,随时可以复制并粘贴到您的电子邮件管理器或 CMS 中。',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'FAQPage',
|
|
51
|
+
mainEntity: faqData.map((item) => ({
|
|
52
|
+
'@type': 'Question',
|
|
53
|
+
name: item.question,
|
|
54
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
59
|
+
'@context': 'https://schema.org',
|
|
60
|
+
'@type': 'HowTo',
|
|
61
|
+
name: title,
|
|
62
|
+
description,
|
|
63
|
+
step: howToData.map((step, i) => ({
|
|
64
|
+
'@type': 'HowToStep',
|
|
65
|
+
position: i + 1,
|
|
66
|
+
name: step.name,
|
|
67
|
+
text: step.text,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
72
|
+
'@context': 'https://schema.org',
|
|
73
|
+
'@type': 'SoftwareApplication',
|
|
74
|
+
name: title,
|
|
75
|
+
description,
|
|
76
|
+
applicationCategory: 'UtilityApplication',
|
|
77
|
+
operatingSystem: 'All',
|
|
78
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
79
|
+
inLanguage: 'zh',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const ui: CssToInlineConverterUI = {
|
|
83
|
+
labelHtml: '原始 HTML',
|
|
84
|
+
labelCss: 'CSS 规则',
|
|
85
|
+
labelOutput: '内联 HTML 结果',
|
|
86
|
+
placeholderHtml: '<div class="my-class">Hello World</div>',
|
|
87
|
+
placeholderCss: '.my-class { color: red; padding: 10px; }',
|
|
88
|
+
placeholderOutput: '您的嵌入样式的 HTML 将显示在此处...',
|
|
89
|
+
btnConvert: '将 CSS 注入 HTML',
|
|
90
|
+
btnCopy: '复制代码',
|
|
91
|
+
btnCopied: '已复制!',
|
|
92
|
+
msgError: '处理错误。请检查您的 HTML 和 CSS 是否有效。',
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export const content: ToolLocaleContent<CssToInlineConverterUI> = {
|
|
96
|
+
slug,
|
|
97
|
+
title,
|
|
98
|
+
description,
|
|
99
|
+
ui,
|
|
100
|
+
faqTitle: '常见问题',
|
|
101
|
+
faq: faqData,
|
|
102
|
+
bibliographyTitle: '参考资料和文档',
|
|
103
|
+
bibliography: [
|
|
104
|
+
{
|
|
105
|
+
name: 'Can I email:电子邮件的 HTML 和 CSS 支持矩阵',
|
|
106
|
+
url: 'https://www.caniemail.com/',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'MDN Web Docs:全局 style 属性',
|
|
110
|
+
url: 'https://developer.mozilla.org/en/docs/Web/HTML/Global_attributes/style',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'DOMParser API:浏览器中的安全解析',
|
|
114
|
+
url: 'https://developer.mozilla.org/en/docs/Web/API/DOMParser',
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
howTo: howToData,
|
|
118
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
119
|
+
seo: [
|
|
120
|
+
{
|
|
121
|
+
type: 'title',
|
|
122
|
+
text: 'CSS 内联处理器是什么以及为什么需要它?',
|
|
123
|
+
level: 2,
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'paragraph',
|
|
127
|
+
html: '在开发现代网络应用程序时,我们习惯于分离关注点:HTML 构建结构,外部 CSS 文件提供所有视觉样式。但是,并非所有环境都信任外部样式表或全局 <code><style></code> 标签。',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'paragraph',
|
|
131
|
+
html: '外部 CSS 最流行和最严格的失败用例是<strong>电子邮件模板开发</strong>。在这些环境中,确保字体、颜色或边距正确呈现的唯一可靠方法是直接嵌入标签中:<code><span style="color: red;"></code>。',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'title',
|
|
135
|
+
text: '电子邮件客户端中的 CSS 问题',
|
|
136
|
+
level: 3,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'paragraph',
|
|
140
|
+
html: '微软 Outlook、Apple Mail 或 Gmail 等电子邮件客户端以其限制性的 CSS 渲染引擎而闻名。大多数过滤或丢弃 <code><link></code> 或 <code><style></code> 标签,害怕可能破坏阅读界面的代码注入。',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'tip',
|
|
144
|
+
html: '对于时事通讯或交易电子邮件(收据、账户确认),使用表格和<em>内联 CSS</em> 是电子邮件营销行业的黄金标准。',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'title',
|
|
148
|
+
text: '此工具如何在您的浏览器中工作',
|
|
149
|
+
level: 3,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'list',
|
|
153
|
+
items: [
|
|
154
|
+
'<strong>安全解析:</strong>使用 <code>DOMParser API</code> 将输入 HTML 临时转换为浏览器内的安全虚拟 DOM。',
|
|
155
|
+
'<strong>级联模拟:</strong>分析您的 CSS 规则,对选择器应用特异性权重,并通过注入代码来改变选定 HTML 元素的 <code>style</code> 属性。',
|
|
156
|
+
'<strong>100% 离线:</strong>您的代码不会离开您的设备。对包含敏感内容的模板提供完全隐私。',
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
};
|
|
161
|
+
|
|
@@ -7,10 +7,6 @@ import type { CssToInlineConverterUI } from './ui';
|
|
|
7
7
|
|
|
8
8
|
export type CssToInlineConverterLocaleContent = ToolLocaleContent<CssToInlineConverterUI>;
|
|
9
9
|
|
|
10
|
-
import { content as es } from './i18n/es';
|
|
11
|
-
import { content as en } from './i18n/en';
|
|
12
|
-
import { content as fr } from './i18n/fr';
|
|
13
|
-
|
|
14
10
|
export const cssToInlineConverter: DeveloperToolEntry<CssToInlineConverterUI> = {
|
|
15
11
|
id: 'css-to-inline-converter',
|
|
16
12
|
icons: {
|
|
@@ -18,9 +14,21 @@ export const cssToInlineConverter: DeveloperToolEntry<CssToInlineConverterUI> =
|
|
|
18
14
|
fg: 'mdi:language-css3',
|
|
19
15
|
},
|
|
20
16
|
i18n: {
|
|
21
|
-
|
|
22
|
-
en: async () => en,
|
|
23
|
-
|
|
17
|
+
de: async () => (await import('./i18n/de')).content,
|
|
18
|
+
en: async () => (await import('./i18n/en')).content,
|
|
19
|
+
es: async () => (await import('./i18n/es')).content,
|
|
20
|
+
fr: async () => (await import('./i18n/fr')).content,
|
|
21
|
+
id: async () => (await import('./i18n/id')).content,
|
|
22
|
+
it: async () => (await import('./i18n/it')).content,
|
|
23
|
+
ja: async () => (await import('./i18n/ja')).content,
|
|
24
|
+
ko: async () => (await import('./i18n/ko')).content,
|
|
25
|
+
nl: async () => (await import('./i18n/nl')).content,
|
|
26
|
+
pl: async () => (await import('./i18n/pl')).content,
|
|
27
|
+
pt: async () => (await import('./i18n/pt')).content,
|
|
28
|
+
ru: async () => (await import('./i18n/ru')).content,
|
|
29
|
+
sv: async () => (await import('./i18n/sv')).content,
|
|
30
|
+
tr: async () => (await import('./i18n/tr')).content,
|
|
31
|
+
zh: async () => (await import('./i18n/zh')).content,
|
|
24
32
|
},
|
|
25
33
|
};
|
|
26
34
|
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { DuplicateCssRemoverUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'doppeltes-css-entfernen';
|
|
6
|
+
const title = 'Doppelten CSS Code online entfernen. Stylesheets vereinheitlichen und bereinigen';
|
|
7
|
+
const description =
|
|
8
|
+
'Kostenloses Tool zum Bereinigen und Entfernen doppelter CSS-Regeln. Fasst redundante Selektoren zusammen, respektiert die Kaskade und reduziert sofort die Dateigröße – direkt im Browser.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Was passiert, wenn CSS-Selektoren doppelt vorkommen?',
|
|
13
|
+
answer:
|
|
14
|
+
'Wenn derselbe Selektor mehrfach vorkommt, wendet der Browser alle Regeln an, wobei die letzte Deklaration jeder Eigenschaft die früheren überschreibt. Das erzeugt unnötig große Dateien, ohne das visuelle Ergebnis zu verbessern.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Gehen beim Entfernen von Duplikaten Eigenschaften verloren?',
|
|
18
|
+
answer:
|
|
19
|
+
'Nein. Der Algorithmus respektiert strikt die CSS-Kaskade: Bei Konflikten unter demselben Selektor wird immer die zuletzt deklarierte Eigenschaft beibehalten. Einzigartige Eigenschaften aus jedem Block werden unter einem einzigen, vereinheitlichten Selektor zusammengeführt.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Funktioniert das Tool mit minifiziertem CSS oder CSS mit Kommentaren?',
|
|
23
|
+
answer:
|
|
24
|
+
'Das Tool entfernt CSS-Kommentare automatisch vor der Verarbeitung und arbeitet korrekt mit einzeiligem Code. Bei CSS mit erweitertem Nesting oder komplexen At-Rules wird empfohlen, die Blöcke vorher zu trennen.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Wird mein CSS an einen Server übertragen?',
|
|
28
|
+
answer:
|
|
29
|
+
'Nein. Die gesamte Verarbeitung findet direkt in Ihrem Browser per lokalem JavaScript statt. Kein Teil Ihres CSS wird an externe Server übertragen – Ihr Code bleibt vollständig privat.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Ihren CSS Code einfügen',
|
|
36
|
+
text: 'Kopieren Sie den Inhalt Ihrer CSS-Datei mit wiederholten Selektoren und fügen Sie ihn in das linke Feld „Dirty / Duplicate CSS" ein.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Bereinigung starten',
|
|
40
|
+
text: 'Klicken Sie auf „CSS bereinigen und vereinheitlichen". Das Tool durchsucht alle Selektoren, führt Eigenschaften zusammen und entfernt redundante Blöcke.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Ergebnis prüfen und kopieren',
|
|
44
|
+
text: 'Sehen Sie sich die Byte-Einsparungen an und kopieren Sie das optimierte CSS über den Button „Code kopieren" direkt in Ihr Projekt.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'FAQPage',
|
|
51
|
+
mainEntity: faqData.map((item) => ({
|
|
52
|
+
'@type': 'Question',
|
|
53
|
+
name: item.question,
|
|
54
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
59
|
+
'@context': 'https://schema.org',
|
|
60
|
+
'@type': 'HowTo',
|
|
61
|
+
name: title,
|
|
62
|
+
description,
|
|
63
|
+
step: howToData.map((step, i) => ({
|
|
64
|
+
'@type': 'HowToStep',
|
|
65
|
+
position: i + 1,
|
|
66
|
+
name: step.name,
|
|
67
|
+
text: step.text,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
72
|
+
'@context': 'https://schema.org',
|
|
73
|
+
'@type': 'SoftwareApplication',
|
|
74
|
+
name: title,
|
|
75
|
+
description,
|
|
76
|
+
applicationCategory: 'UtilityApplication',
|
|
77
|
+
operatingSystem: 'All',
|
|
78
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
79
|
+
inLanguage: 'de',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const ui: DuplicateCssRemoverUI = {
|
|
83
|
+
labelInput: 'Dirty / Duplicate CSS',
|
|
84
|
+
labelOutput: 'Bereinigtes CSS',
|
|
85
|
+
placeholderInput: '.btn { padding: 10px; color: red; }\n.btn { margin: 5px; color: blue; }',
|
|
86
|
+
placeholderOutput: 'Hier erscheint das optimierte und vereinheitlichte CSS...',
|
|
87
|
+
btnClean: 'CSS bereinigen und vereinheitlichen',
|
|
88
|
+
btnCopy: 'Code kopieren',
|
|
89
|
+
btnCopied: 'Kopiert!',
|
|
90
|
+
statBytesOriginal: 'Originalgröße',
|
|
91
|
+
statBytesClean: 'Bereinigte Größe',
|
|
92
|
+
statSaving: 'Ersparnis',
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
|
|
96
|
+
slug,
|
|
97
|
+
title,
|
|
98
|
+
description,
|
|
99
|
+
ui,
|
|
100
|
+
faqTitle: 'Häufig gestellte Fragen',
|
|
101
|
+
faq: faqData,
|
|
102
|
+
bibliographyTitle: 'Referenzen und Dokumentation',
|
|
103
|
+
bibliography: [
|
|
104
|
+
{
|
|
105
|
+
name: 'Web Vitals: Einfluss von CSS auf Render-Blocking und FCP',
|
|
106
|
+
url: 'https://web.dev/articles/render-blocking-resources',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'W3C-Spezifikation: CSS-Kaskade und Vererbung',
|
|
110
|
+
url: 'https://www.w3.org/TR/css-cascade-4/',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'Clean CSS: Bibliothek und Methoden zur CSS-Minifizierung',
|
|
114
|
+
url: 'https://github.com/clean-css/clean-css',
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
howTo: howToData,
|
|
118
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
119
|
+
seo: [
|
|
120
|
+
{
|
|
121
|
+
type: 'title',
|
|
122
|
+
text: 'Warum entsteht doppelter CSS Code?',
|
|
123
|
+
level: 2,
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'paragraph',
|
|
127
|
+
html: 'Bei der langfristigen Pflege von Webprojekten oder der Arbeit mit Legacy-Code kommt es sehr häufig vor, dass mehrere Entwickler überlappende CSS-Regeln schreiben. Aus Angst, ein bestehendes Design zu beschädigen, fügt man lieber eine neue redundante Regel am Ende des Dokuments hinzu, statt die ursprüngliche zu bearbeiten oder umzustrukturieren.',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'paragraph',
|
|
131
|
+
html: 'Das Ergebnis ist eine ineffiziente Datei mit Dutzenden von mehrfach deklarierten Selektoren, die die Lesbarkeit erschweren und das Download-Gewicht der Webseite erheblich erhöhen.',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'title',
|
|
135
|
+
text: 'Der versteckte Einfluss auf die Web-Performance (Web Vitals)',
|
|
136
|
+
level: 3,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'paragraph',
|
|
140
|
+
html: 'Stylesheet-Dateien blockieren das natürliche Rendering des Browsers (als <strong>Render-Blocking</strong>-Ressource). Solange der Browser das vollständige CSSOM nicht heruntergeladen und aufgebaut hat, bleibt der Bildschirm leer.',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'tip',
|
|
144
|
+
html: 'Redundante Stile zu bereinigen ist keine reine Ordnungsfrage – es ist eine messbare und unmittelbare Verbesserung wichtiger Metriken wie dem <strong>First Contentful Paint (FCP)</strong>.',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'title',
|
|
148
|
+
text: 'Wie wir doppelte Regeln zusammenführen',
|
|
149
|
+
level: 3,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'paragraph',
|
|
153
|
+
html: 'Dieses Tool arbeitet wie ein intelligenter Assembler. Statt nur Leerzeichen zu komprimieren (wie ein herkömmlicher Minifier), durchsucht es den Text rekursiv nach identischen Selektoren.',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
type: 'list',
|
|
157
|
+
items: [
|
|
158
|
+
'Stellen Sie sich vor, Sie haben die Regel <code>.box { color: red; }</code> und hundert Zeilen weiter unten ein <code>.box { padding: 10px; color: blue; }</code>. Das Tool führt beide Blöcke unter demselben Selektor <code>.box</code> zusammen und kombiniert das Padding.',
|
|
159
|
+
'<strong>Erhalt der CSS-Kaskade:</strong> Bei direkten Konflikten bewahrt der Algorithmus strikt die zuletzt deklarierte Eigenschaft. So bleibt Ihr ursprüngliches Layout beim Bereinigen erhalten.',
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: 'paragraph',
|
|
164
|
+
html: 'Schluss damit, Kilobytes toter Textdaten an die Mobilgeräte Ihrer Nutzer zu schicken. Vereinheitlichen Sie Ihren Code in Millisekunden – vollständig offline, direkt im Browser.',
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
};
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { DuplicateCssRemoverUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'penghapus-css-duplikat';
|
|
6
|
+
const title = 'Hapus CSS Duplikat Online. Satukan dan Bersihkan Stylesheet Anda';
|
|
7
|
+
const description =
|
|
8
|
+
'Alat gratis untuk membersihkan dan membuang kode CSS duplikat. Menyatukan selektor yang redundan, menghormati aturan cascade, dan langsung memperkecil ukuran file di browser.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Apa yang terjadi saat selektor CSS terduplikasi?',
|
|
13
|
+
answer:
|
|
14
|
+
'Ketika selektor yang sama muncul berkali-kali, browser menerapkan semua aturan tetapi deklarasi terakhir dari setiap properti akan menimpa yang sebelumnya. Ini menghasilkan file yang lebih berat dari seharusnya tanpa memberikan manfaat nyata pada tampilan.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Apakah ada properti yang hilang saat duplikat dihapus?',
|
|
18
|
+
answer:
|
|
19
|
+
'Tidak. Algoritma ini sepenuhnya menghormati cascade CSS: untuk properti yang bentrok di bawah selektor yang sama, selalu menyimpan yang terakhir dideklarasikan. Properti unik dari setiap blok digabungkan di bawah satu selektor yang disatukan.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Apakah bisa digunakan dengan CSS yang sudah diminifikasi atau mengandung komentar?',
|
|
23
|
+
answer:
|
|
24
|
+
'Ya. Alat ini secara otomatis menghapus komentar CSS sebelum memproses dan bekerja dengan baik pada kode satu baris. Untuk CSS dengan nesting lanjutan atau at-rules yang kompleks, disarankan untuk memisahkan blok-blok terlebih dahulu.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Apakah CSS saya dikirim ke server?',
|
|
28
|
+
answer:
|
|
29
|
+
'Tidak. Semua pemrosesan terjadi langsung di browser Anda melalui JavaScript lokal. Tidak ada bagian dari CSS Anda yang dikirimkan ke server eksternal mana pun, sehingga privasi kode Anda sepenuhnya terjaga.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Tempel CSS Anda',
|
|
36
|
+
text: 'Salin isi file CSS Anda yang mengandung selektor berulang, lalu tempelkan ke kolom kiri berlabel "Dirty / Duplicate CSS".',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Jalankan pembersihan',
|
|
40
|
+
text: 'Klik tombol "Bersihkan dan Satukan CSS". Alat akan memindai semua selektor, menggabungkan properti, dan menghapus blok yang redundan.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Tinjau hasil dan salin',
|
|
44
|
+
text: 'Periksa penghematan byte yang dicapai, lalu salin CSS yang sudah dioptimalkan dengan tombol "Salin Kode" untuk langsung digunakan di proyek Anda.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'FAQPage',
|
|
51
|
+
mainEntity: faqData.map((item) => ({
|
|
52
|
+
'@type': 'Question',
|
|
53
|
+
name: item.question,
|
|
54
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
59
|
+
'@context': 'https://schema.org',
|
|
60
|
+
'@type': 'HowTo',
|
|
61
|
+
name: title,
|
|
62
|
+
description,
|
|
63
|
+
step: howToData.map((step, i) => ({
|
|
64
|
+
'@type': 'HowToStep',
|
|
65
|
+
position: i + 1,
|
|
66
|
+
name: step.name,
|
|
67
|
+
text: step.text,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
72
|
+
'@context': 'https://schema.org',
|
|
73
|
+
'@type': 'SoftwareApplication',
|
|
74
|
+
name: title,
|
|
75
|
+
description,
|
|
76
|
+
applicationCategory: 'UtilityApplication',
|
|
77
|
+
operatingSystem: 'All',
|
|
78
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
79
|
+
inLanguage: 'id',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const ui: DuplicateCssRemoverUI = {
|
|
83
|
+
labelInput: 'CSS Kotor / Duplikat',
|
|
84
|
+
labelOutput: 'CSS Bersih',
|
|
85
|
+
placeholderInput: '.btn { padding: 10px; color: red; }\n.btn { margin: 5px; color: blue; }',
|
|
86
|
+
placeholderOutput: 'CSS yang dioptimalkan dan disatukan akan muncul di sini...',
|
|
87
|
+
btnClean: 'Bersihkan dan Satukan CSS',
|
|
88
|
+
btnCopy: 'Salin Kode',
|
|
89
|
+
btnCopied: 'Disalin!',
|
|
90
|
+
statBytesOriginal: 'Byte Asli',
|
|
91
|
+
statBytesClean: 'Byte Bersih',
|
|
92
|
+
statSaving: 'Penghematan',
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
|
|
96
|
+
slug,
|
|
97
|
+
title,
|
|
98
|
+
description,
|
|
99
|
+
ui,
|
|
100
|
+
faqTitle: 'Pertanyaan yang Sering Diajukan',
|
|
101
|
+
faq: faqData,
|
|
102
|
+
bibliographyTitle: 'Referensi dan Dokumentasi',
|
|
103
|
+
bibliography: [
|
|
104
|
+
{
|
|
105
|
+
name: 'Web Vitals: Dampak CSS pada Render-Blocking dan FCP',
|
|
106
|
+
url: 'https://web.dev/articles/render-blocking-resources',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'Spesifikasi W3C: Cascade dan Pewarisan CSS',
|
|
110
|
+
url: 'https://www.w3.org/TR/css-cascade-4/',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'Clean CSS: Library dan Metodologi untuk Minifikasi CSS',
|
|
114
|
+
url: 'https://github.com/clean-css/clean-css',
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
howTo: howToData,
|
|
118
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
119
|
+
seo: [
|
|
120
|
+
{
|
|
121
|
+
type: 'title',
|
|
122
|
+
text: 'Mengapa Kode CSS Bisa Terduplikasi?',
|
|
123
|
+
level: 2,
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'paragraph',
|
|
127
|
+
html: 'Saat mengelola proyek web jangka panjang atau bekerja dengan kode warisan (<em>legacy code</em>), sangat umum terjadi beberapa pengembang menulis aturan CSS yang saling tumpang tindih. Karena khawatir merusak desain yang sudah ada, seorang developer lebih memilih menambahkan aturan baru di bagian akhir dokumen daripada mengedit atau merefaktor kode aslinya.',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'paragraph',
|
|
131
|
+
html: 'Hasilnya adalah file yang tidak efisien dengan puluhan selektor yang dideklarasikan berulang kali, membuat kode sulit dibaca dan memperbesar ukuran unduhan halaman web Anda secara signifikan.',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'title',
|
|
135
|
+
text: 'Dampak Tersembunyi pada Performa Web (Web Vitals)',
|
|
136
|
+
level: 3,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'paragraph',
|
|
140
|
+
html: 'File stylesheet menghalangi proses rendering browser secara alami (sebagai sumber daya <strong>Render-Blocking</strong>). Selama browser belum selesai mengunduh dan membangun CSSOM secara lengkap, layar akan tetap kosong.',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'tip',
|
|
144
|
+
html: 'Membuang gaya yang redundan bukan sekadar soal kerapian kode — ini adalah peningkatan nyata dan terukur pada metrik penting seperti <strong>First Contentful Paint (FCP)</strong>.',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'title',
|
|
148
|
+
text: 'Cara Kami Menyatukan Aturan yang Duplikat',
|
|
149
|
+
level: 3,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'paragraph',
|
|
153
|
+
html: 'Alat ini bekerja seperti perakit cerdas. Alih-alih sekadar mengompres spasi putih seperti minifier biasa, alat ini memindai teks secara rekursif untuk menemukan pola selektor yang identik.',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
type: 'list',
|
|
157
|
+
items: [
|
|
158
|
+
'Bayangkan Anda memiliki aturan <code>.box { color: red; }</code> dan seratus baris kemudian ada <code>.box { padding: 10px; color: blue; }</code>. Alat ini akan menyatukan kedua blok di bawah selektor <code>.box</code> yang sama, menggabungkan padding-nya.',
|
|
159
|
+
'<strong>Pelestarian Cascade CSS:</strong> Untuk konflik langsung, algoritma secara ketat mempertahankan properti yang terakhir dideklarasikan. Ini memastikan tata letak asli Anda tidak rusak saat dokumen dibersihkan.',
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: 'paragraph',
|
|
164
|
+
html: 'Hentikan pengiriman kilobyte teks mati ke ponsel pengguna Anda. Satukan kode Anda dalam hitungan milidetik, sepenuhnya offline langsung dari browser.',
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
};
|