@jjlmoya/utils-developer 1.4.0 → 1.6.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 (339) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +34 -0
  3. package/src/category/i18n/id.ts +34 -0
  4. package/src/category/i18n/it.ts +34 -0
  5. package/src/category/i18n/ja.ts +34 -0
  6. package/src/category/i18n/ko.ts +34 -0
  7. package/src/category/i18n/nl.ts +34 -0
  8. package/src/category/i18n/pl.ts +34 -0
  9. package/src/category/i18n/pt.ts +34 -0
  10. package/src/category/i18n/ru.ts +34 -0
  11. package/src/category/i18n/sv.ts +34 -0
  12. package/src/category/i18n/tr.ts +34 -0
  13. package/src/category/i18n/zh.ts +34 -0
  14. package/src/category/index.ts +13 -1
  15. package/src/tests/faq_count.test.ts +1 -1
  16. package/src/tests/i18n_coverage.test.ts +36 -0
  17. package/src/tests/locale_completeness.test.ts +2 -2
  18. package/src/tests/slug_language_code_format.test.ts +25 -0
  19. package/src/tests/slug_uniqueness.test.ts +87 -0
  20. package/src/tool/aspectRatio/i18n/de.ts +177 -0
  21. package/src/tool/aspectRatio/i18n/id.ts +177 -0
  22. package/src/tool/aspectRatio/i18n/it.ts +177 -0
  23. package/src/tool/aspectRatio/i18n/ja.ts +178 -0
  24. package/src/tool/aspectRatio/i18n/ko.ts +178 -0
  25. package/src/tool/aspectRatio/i18n/nl.ts +178 -0
  26. package/src/tool/aspectRatio/i18n/pl.ts +177 -0
  27. package/src/tool/aspectRatio/i18n/pt.ts +177 -0
  28. package/src/tool/aspectRatio/i18n/ru.ts +177 -0
  29. package/src/tool/aspectRatio/i18n/sv.ts +177 -0
  30. package/src/tool/aspectRatio/i18n/tr.ts +177 -0
  31. package/src/tool/aspectRatio/i18n/zh.ts +178 -0
  32. package/src/tool/aspectRatio/index.ts +15 -7
  33. package/src/tool/calculadoraTiempoDatos/i18n/de.ts +150 -0
  34. package/src/tool/calculadoraTiempoDatos/i18n/id.ts +150 -0
  35. package/src/tool/calculadoraTiempoDatos/i18n/it.ts +150 -0
  36. package/src/tool/calculadoraTiempoDatos/i18n/ja.ts +151 -0
  37. package/src/tool/calculadoraTiempoDatos/i18n/ko.ts +151 -0
  38. package/src/tool/calculadoraTiempoDatos/i18n/nl.ts +150 -0
  39. package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +150 -0
  40. package/src/tool/calculadoraTiempoDatos/i18n/pt.ts +150 -0
  41. package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +151 -0
  42. package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +150 -0
  43. package/src/tool/calculadoraTiempoDatos/i18n/tr.ts +150 -0
  44. package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +151 -0
  45. package/src/tool/calculadoraTiempoDatos/index.ts +15 -7
  46. package/src/tool/colorConverter/i18n/de.ts +126 -0
  47. package/src/tool/colorConverter/i18n/id.ts +126 -0
  48. package/src/tool/colorConverter/i18n/it.ts +126 -0
  49. package/src/tool/colorConverter/i18n/ja.ts +127 -0
  50. package/src/tool/colorConverter/i18n/ko.ts +127 -0
  51. package/src/tool/colorConverter/i18n/nl.ts +126 -0
  52. package/src/tool/colorConverter/i18n/pl.ts +126 -0
  53. package/src/tool/colorConverter/i18n/pt.ts +126 -0
  54. package/src/tool/colorConverter/i18n/ru.ts +126 -0
  55. package/src/tool/colorConverter/i18n/sv.ts +126 -0
  56. package/src/tool/colorConverter/i18n/tr.ts +126 -0
  57. package/src/tool/colorConverter/i18n/zh.ts +127 -0
  58. package/src/tool/colorConverter/index.ts +15 -7
  59. package/src/tool/conversorExcelCsvHtml/i18n/de.ts +129 -0
  60. package/src/tool/conversorExcelCsvHtml/i18n/id.ts +129 -0
  61. package/src/tool/conversorExcelCsvHtml/i18n/it.ts +129 -0
  62. package/src/tool/conversorExcelCsvHtml/i18n/ja.ts +130 -0
  63. package/src/tool/conversorExcelCsvHtml/i18n/ko.ts +130 -0
  64. package/src/tool/conversorExcelCsvHtml/i18n/nl.ts +129 -0
  65. package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +129 -0
  66. package/src/tool/conversorExcelCsvHtml/i18n/pt.ts +129 -0
  67. package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +129 -0
  68. package/src/tool/conversorExcelCsvHtml/i18n/sv.ts +129 -0
  69. package/src/tool/conversorExcelCsvHtml/i18n/tr.ts +129 -0
  70. package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +130 -0
  71. package/src/tool/conversorExcelCsvHtml/index.ts +15 -7
  72. package/src/tool/cronGenerator/i18n/de.ts +192 -0
  73. package/src/tool/cronGenerator/i18n/es.ts +1 -0
  74. package/src/tool/cronGenerator/i18n/fr.ts +2 -1
  75. package/src/tool/cronGenerator/i18n/id.ts +192 -0
  76. package/src/tool/cronGenerator/i18n/it.ts +192 -0
  77. package/src/tool/cronGenerator/i18n/ja.ts +192 -0
  78. package/src/tool/cronGenerator/i18n/ko.ts +192 -0
  79. package/src/tool/cronGenerator/i18n/nl.ts +192 -0
  80. package/src/tool/cronGenerator/i18n/pl.ts +192 -0
  81. package/src/tool/cronGenerator/i18n/pt.ts +192 -0
  82. package/src/tool/cronGenerator/i18n/ru.ts +192 -0
  83. package/src/tool/cronGenerator/i18n/sv.ts +192 -0
  84. package/src/tool/cronGenerator/i18n/tr.ts +192 -0
  85. package/src/tool/cronGenerator/i18n/zh.ts +192 -0
  86. package/src/tool/cronGenerator/index.ts +15 -7
  87. package/src/tool/cssSpecificityCalculator/i18n/de.ts +168 -0
  88. package/src/tool/cssSpecificityCalculator/i18n/id.ts +168 -0
  89. package/src/tool/cssSpecificityCalculator/i18n/it.ts +168 -0
  90. package/src/tool/cssSpecificityCalculator/i18n/ja.ts +169 -0
  91. package/src/tool/cssSpecificityCalculator/i18n/ko.ts +169 -0
  92. package/src/tool/cssSpecificityCalculator/i18n/nl.ts +168 -0
  93. package/src/tool/cssSpecificityCalculator/i18n/pl.ts +168 -0
  94. package/src/tool/cssSpecificityCalculator/i18n/pt.ts +168 -0
  95. package/src/tool/cssSpecificityCalculator/i18n/ru.ts +168 -0
  96. package/src/tool/cssSpecificityCalculator/i18n/sv.ts +168 -0
  97. package/src/tool/cssSpecificityCalculator/i18n/tr.ts +168 -0
  98. package/src/tool/cssSpecificityCalculator/i18n/zh.ts +169 -0
  99. package/src/tool/cssSpecificityCalculator/index.ts +15 -7
  100. package/src/tool/cssToInlineConverter/i18n/de.ts +160 -0
  101. package/src/tool/cssToInlineConverter/i18n/id.ts +160 -0
  102. package/src/tool/cssToInlineConverter/i18n/it.ts +160 -0
  103. package/src/tool/cssToInlineConverter/i18n/ja.ts +161 -0
  104. package/src/tool/cssToInlineConverter/i18n/ko.ts +161 -0
  105. package/src/tool/cssToInlineConverter/i18n/nl.ts +160 -0
  106. package/src/tool/cssToInlineConverter/i18n/pl.ts +160 -0
  107. package/src/tool/cssToInlineConverter/i18n/pt.ts +160 -0
  108. package/src/tool/cssToInlineConverter/i18n/ru.ts +160 -0
  109. package/src/tool/cssToInlineConverter/i18n/sv.ts +160 -0
  110. package/src/tool/cssToInlineConverter/i18n/tr.ts +160 -0
  111. package/src/tool/cssToInlineConverter/i18n/zh.ts +161 -0
  112. package/src/tool/cssToInlineConverter/index.ts +15 -7
  113. package/src/tool/duplicateCssRemover/i18n/de.ts +167 -0
  114. package/src/tool/duplicateCssRemover/i18n/id.ts +167 -0
  115. package/src/tool/duplicateCssRemover/i18n/it.ts +167 -0
  116. package/src/tool/duplicateCssRemover/i18n/ja.ts +168 -0
  117. package/src/tool/duplicateCssRemover/i18n/ko.ts +168 -0
  118. package/src/tool/duplicateCssRemover/i18n/nl.ts +167 -0
  119. package/src/tool/duplicateCssRemover/i18n/pl.ts +167 -0
  120. package/src/tool/duplicateCssRemover/i18n/pt.ts +167 -0
  121. package/src/tool/duplicateCssRemover/i18n/ru.ts +167 -0
  122. package/src/tool/duplicateCssRemover/i18n/sv.ts +167 -0
  123. package/src/tool/duplicateCssRemover/i18n/tr.ts +167 -0
  124. package/src/tool/duplicateCssRemover/i18n/zh.ts +168 -0
  125. package/src/tool/duplicateCssRemover/index.ts +15 -7
  126. package/src/tool/generadorSecurityTxt/i18n/de.ts +174 -0
  127. package/src/tool/generadorSecurityTxt/i18n/id.ts +174 -0
  128. package/src/tool/generadorSecurityTxt/i18n/it.ts +174 -0
  129. package/src/tool/generadorSecurityTxt/i18n/ja.ts +174 -0
  130. package/src/tool/generadorSecurityTxt/i18n/ko.ts +174 -0
  131. package/src/tool/generadorSecurityTxt/i18n/nl.ts +174 -0
  132. package/src/tool/generadorSecurityTxt/i18n/pl.ts +174 -0
  133. package/src/tool/generadorSecurityTxt/i18n/pt.ts +174 -0
  134. package/src/tool/generadorSecurityTxt/i18n/ru.ts +174 -0
  135. package/src/tool/generadorSecurityTxt/i18n/sv.ts +174 -0
  136. package/src/tool/generadorSecurityTxt/i18n/tr.ts +174 -0
  137. package/src/tool/generadorSecurityTxt/i18n/zh.ts +174 -0
  138. package/src/tool/generadorSecurityTxt/index.ts +15 -7
  139. package/src/tool/hashGenerator/i18n/de.ts +119 -0
  140. package/src/tool/hashGenerator/i18n/id.ts +119 -0
  141. package/src/tool/hashGenerator/i18n/it.ts +118 -0
  142. package/src/tool/hashGenerator/i18n/ja.ts +119 -0
  143. package/src/tool/hashGenerator/i18n/ko.ts +119 -0
  144. package/src/tool/hashGenerator/i18n/nl.ts +119 -0
  145. package/src/tool/hashGenerator/i18n/pl.ts +118 -0
  146. package/src/tool/hashGenerator/i18n/pt.ts +118 -0
  147. package/src/tool/hashGenerator/i18n/ru.ts +119 -0
  148. package/src/tool/hashGenerator/i18n/sv.ts +119 -0
  149. package/src/tool/hashGenerator/i18n/tr.ts +118 -0
  150. package/src/tool/hashGenerator/i18n/zh.ts +119 -0
  151. package/src/tool/hashGenerator/index.ts +15 -7
  152. package/src/tool/inspectorCertificadosSsl/i18n/de.ts +214 -0
  153. package/src/tool/inspectorCertificadosSsl/i18n/id.ts +215 -0
  154. package/src/tool/inspectorCertificadosSsl/i18n/it.ts +214 -0
  155. package/src/tool/inspectorCertificadosSsl/i18n/ja.ts +215 -0
  156. package/src/tool/inspectorCertificadosSsl/i18n/ko.ts +215 -0
  157. package/src/tool/inspectorCertificadosSsl/i18n/nl.ts +215 -0
  158. package/src/tool/inspectorCertificadosSsl/i18n/pl.ts +215 -0
  159. package/src/tool/inspectorCertificadosSsl/i18n/pt.ts +214 -0
  160. package/src/tool/inspectorCertificadosSsl/i18n/ru.ts +215 -0
  161. package/src/tool/inspectorCertificadosSsl/i18n/sv.ts +215 -0
  162. package/src/tool/inspectorCertificadosSsl/i18n/tr.ts +215 -0
  163. package/src/tool/inspectorCertificadosSsl/i18n/zh.ts +215 -0
  164. package/src/tool/inspectorCertificadosSsl/index.ts +24 -0
  165. package/src/tool/jsonFormatter/i18n/de.ts +157 -0
  166. package/src/tool/jsonFormatter/i18n/es.ts +1 -0
  167. package/src/tool/jsonFormatter/i18n/fr.ts +2 -1
  168. package/src/tool/jsonFormatter/i18n/id.ts +157 -0
  169. package/src/tool/jsonFormatter/i18n/it.ts +156 -0
  170. package/src/tool/jsonFormatter/i18n/ja.ts +157 -0
  171. package/src/tool/jsonFormatter/i18n/ko.ts +157 -0
  172. package/src/tool/jsonFormatter/i18n/nl.ts +157 -0
  173. package/src/tool/jsonFormatter/i18n/pl.ts +156 -0
  174. package/src/tool/jsonFormatter/i18n/pt.ts +156 -0
  175. package/src/tool/jsonFormatter/i18n/ru.ts +157 -0
  176. package/src/tool/jsonFormatter/i18n/sv.ts +157 -0
  177. package/src/tool/jsonFormatter/i18n/tr.ts +157 -0
  178. package/src/tool/jsonFormatter/i18n/zh.ts +157 -0
  179. package/src/tool/jsonFormatter/index.ts +15 -7
  180. package/src/tool/keycode/i18n/de.ts +161 -0
  181. package/src/tool/keycode/i18n/es.ts +1 -0
  182. package/src/tool/keycode/i18n/fr.ts +2 -1
  183. package/src/tool/keycode/i18n/id.ts +161 -0
  184. package/src/tool/keycode/i18n/it.ts +161 -0
  185. package/src/tool/keycode/i18n/ja.ts +161 -0
  186. package/src/tool/keycode/i18n/ko.ts +161 -0
  187. package/src/tool/keycode/i18n/nl.ts +161 -0
  188. package/src/tool/keycode/i18n/pl.ts +161 -0
  189. package/src/tool/keycode/i18n/pt.ts +160 -0
  190. package/src/tool/keycode/i18n/ru.ts +160 -0
  191. package/src/tool/keycode/i18n/sv.ts +160 -0
  192. package/src/tool/keycode/i18n/tr.ts +160 -0
  193. package/src/tool/keycode/i18n/zh.ts +161 -0
  194. package/src/tool/keycode/index.ts +15 -7
  195. package/src/tool/llmCostCalculator/i18n/de.ts +166 -0
  196. package/src/tool/llmCostCalculator/i18n/fr.ts +2 -1
  197. package/src/tool/llmCostCalculator/i18n/id.ts +166 -0
  198. package/src/tool/llmCostCalculator/i18n/it.ts +166 -0
  199. package/src/tool/llmCostCalculator/i18n/ja.ts +166 -0
  200. package/src/tool/llmCostCalculator/i18n/ko.ts +166 -0
  201. package/src/tool/llmCostCalculator/i18n/nl.ts +166 -0
  202. package/src/tool/llmCostCalculator/i18n/pl.ts +165 -0
  203. package/src/tool/llmCostCalculator/i18n/pt.ts +165 -0
  204. package/src/tool/llmCostCalculator/i18n/ru.ts +165 -0
  205. package/src/tool/llmCostCalculator/i18n/sv.ts +165 -0
  206. package/src/tool/llmCostCalculator/i18n/tr.ts +165 -0
  207. package/src/tool/llmCostCalculator/i18n/zh.ts +166 -0
  208. package/src/tool/llmCostCalculator/index.ts +24 -0
  209. package/src/tool/mobileMockupGenerator/i18n/de.ts +121 -0
  210. package/src/tool/mobileMockupGenerator/i18n/id.ts +121 -0
  211. package/src/tool/mobileMockupGenerator/i18n/it.ts +121 -0
  212. package/src/tool/mobileMockupGenerator/i18n/ja.ts +122 -0
  213. package/src/tool/mobileMockupGenerator/i18n/ko.ts +122 -0
  214. package/src/tool/mobileMockupGenerator/i18n/nl.ts +121 -0
  215. package/src/tool/mobileMockupGenerator/i18n/pl.ts +31 -0
  216. package/src/tool/mobileMockupGenerator/i18n/pt.ts +121 -0
  217. package/src/tool/mobileMockupGenerator/i18n/ru.ts +121 -0
  218. package/src/tool/mobileMockupGenerator/i18n/sv.ts +121 -0
  219. package/src/tool/mobileMockupGenerator/i18n/tr.ts +121 -0
  220. package/src/tool/mobileMockupGenerator/i18n/zh.ts +122 -0
  221. package/src/tool/mobileMockupGenerator/index.ts +24 -0
  222. package/src/tool/musicalTypography/i18n/de.ts +179 -0
  223. package/src/tool/musicalTypography/i18n/id.ts +179 -0
  224. package/src/tool/musicalTypography/i18n/it.ts +179 -0
  225. package/src/tool/musicalTypography/i18n/ja.ts +180 -0
  226. package/src/tool/musicalTypography/i18n/ko.ts +180 -0
  227. package/src/tool/musicalTypography/i18n/nl.ts +179 -0
  228. package/src/tool/musicalTypography/i18n/pl.ts +179 -0
  229. package/src/tool/musicalTypography/i18n/pt.ts +101 -0
  230. package/src/tool/musicalTypography/i18n/ru.ts +47 -0
  231. package/src/tool/musicalTypography/i18n/sv.ts +29 -0
  232. package/src/tool/musicalTypography/i18n/tr.ts +29 -0
  233. package/src/tool/musicalTypography/i18n/zh.ts +30 -0
  234. package/src/tool/musicalTypography/index.ts +15 -7
  235. package/src/tool/placeholderGenerator/i18n/de.ts +176 -0
  236. package/src/tool/placeholderGenerator/i18n/id.ts +176 -0
  237. package/src/tool/placeholderGenerator/i18n/it.ts +176 -0
  238. package/src/tool/placeholderGenerator/i18n/ja.ts +177 -0
  239. package/src/tool/placeholderGenerator/i18n/ko.ts +177 -0
  240. package/src/tool/placeholderGenerator/i18n/nl.ts +176 -0
  241. package/src/tool/placeholderGenerator/i18n/pl.ts +176 -0
  242. package/src/tool/placeholderGenerator/i18n/pt.ts +176 -0
  243. package/src/tool/placeholderGenerator/i18n/ru.ts +176 -0
  244. package/src/tool/placeholderGenerator/i18n/sv.ts +176 -0
  245. package/src/tool/placeholderGenerator/i18n/tr.ts +176 -0
  246. package/src/tool/placeholderGenerator/i18n/zh.ts +177 -0
  247. package/src/tool/placeholderGenerator/index.ts +24 -0
  248. package/src/tool/promptLibrary/i18n/de.ts +131 -0
  249. package/src/tool/promptLibrary/i18n/id.ts +131 -0
  250. package/src/tool/promptLibrary/i18n/it.ts +131 -0
  251. package/src/tool/promptLibrary/i18n/ja.ts +132 -0
  252. package/src/tool/promptLibrary/i18n/ko.ts +132 -0
  253. package/src/tool/promptLibrary/i18n/nl.ts +131 -0
  254. package/src/tool/promptLibrary/i18n/pl.ts +28 -0
  255. package/src/tool/promptLibrary/i18n/pt.ts +101 -0
  256. package/src/tool/promptLibrary/i18n/ru.ts +101 -0
  257. package/src/tool/promptLibrary/i18n/sv.ts +93 -0
  258. package/src/tool/promptLibrary/i18n/tr.ts +93 -0
  259. package/src/tool/promptLibrary/i18n/zh.ts +94 -0
  260. package/src/tool/promptLibrary/index.ts +24 -0
  261. package/src/tool/readabilityCalculator/i18n/de.ts +133 -0
  262. package/src/tool/readabilityCalculator/i18n/id.ts +133 -0
  263. package/src/tool/readabilityCalculator/i18n/it.ts +133 -0
  264. package/src/tool/readabilityCalculator/i18n/ja.ts +134 -0
  265. package/src/tool/readabilityCalculator/i18n/ko.ts +134 -0
  266. package/src/tool/readabilityCalculator/i18n/nl.ts +133 -0
  267. package/src/tool/readabilityCalculator/i18n/pl.ts +29 -0
  268. package/src/tool/readabilityCalculator/i18n/pt.ts +91 -0
  269. package/src/tool/readabilityCalculator/i18n/ru.ts +91 -0
  270. package/src/tool/readabilityCalculator/i18n/sv.ts +43 -0
  271. package/src/tool/readabilityCalculator/i18n/tr.ts +43 -0
  272. package/src/tool/readabilityCalculator/i18n/zh.ts +44 -0
  273. package/src/tool/readabilityCalculator/index.ts +24 -0
  274. package/src/tool/svgSanitizer/i18n/de.ts +125 -0
  275. package/src/tool/svgSanitizer/i18n/id.ts +125 -0
  276. package/src/tool/svgSanitizer/i18n/it.ts +125 -0
  277. package/src/tool/svgSanitizer/i18n/ja.ts +126 -0
  278. package/src/tool/svgSanitizer/i18n/ko.ts +126 -0
  279. package/src/tool/svgSanitizer/i18n/nl.ts +125 -0
  280. package/src/tool/svgSanitizer/i18n/pl.ts +125 -0
  281. package/src/tool/svgSanitizer/i18n/pt.ts +30 -0
  282. package/src/tool/svgSanitizer/i18n/ru.ts +126 -0
  283. package/src/tool/svgSanitizer/i18n/sv.ts +126 -0
  284. package/src/tool/svgSanitizer/i18n/tr.ts +126 -0
  285. package/src/tool/svgSanitizer/i18n/zh.ts +126 -0
  286. package/src/tool/svgSanitizer/index.ts +24 -0
  287. package/src/tool/svgToCss/i18n/de.ts +174 -0
  288. package/src/tool/svgToCss/i18n/id.ts +174 -0
  289. package/src/tool/svgToCss/i18n/it.ts +174 -0
  290. package/src/tool/svgToCss/i18n/ja.ts +175 -0
  291. package/src/tool/svgToCss/i18n/ko.ts +175 -0
  292. package/src/tool/svgToCss/i18n/nl.ts +174 -0
  293. package/src/tool/svgToCss/i18n/pl.ts +174 -0
  294. package/src/tool/svgToCss/i18n/pt.ts +174 -0
  295. package/src/tool/svgToCss/i18n/ru.ts +174 -0
  296. package/src/tool/svgToCss/i18n/sv.ts +174 -0
  297. package/src/tool/svgToCss/i18n/tr.ts +174 -0
  298. package/src/tool/svgToCss/i18n/zh.ts +175 -0
  299. package/src/tool/svgToCss/index.ts +15 -7
  300. package/src/tool/urlCleaner/i18n/de.ts +116 -0
  301. package/src/tool/urlCleaner/i18n/id.ts +116 -0
  302. package/src/tool/urlCleaner/i18n/it.ts +116 -0
  303. package/src/tool/urlCleaner/i18n/ja.ts +117 -0
  304. package/src/tool/urlCleaner/i18n/ko.ts +117 -0
  305. package/src/tool/urlCleaner/i18n/nl.ts +116 -0
  306. package/src/tool/urlCleaner/i18n/pl.ts +29 -0
  307. package/src/tool/urlCleaner/i18n/pt.ts +43 -0
  308. package/src/tool/urlCleaner/i18n/ru.ts +43 -0
  309. package/src/tool/urlCleaner/i18n/sv.ts +43 -0
  310. package/src/tool/urlCleaner/i18n/tr.ts +43 -0
  311. package/src/tool/urlCleaner/i18n/zh.ts +44 -0
  312. package/src/tool/urlCleaner/index.ts +24 -0
  313. package/src/tool/urlEncoderDecoder/i18n/de.ts +163 -0
  314. package/src/tool/urlEncoderDecoder/i18n/id.ts +163 -0
  315. package/src/tool/urlEncoderDecoder/i18n/it.ts +163 -0
  316. package/src/tool/urlEncoderDecoder/i18n/ja.ts +163 -0
  317. package/src/tool/urlEncoderDecoder/i18n/ko.ts +163 -0
  318. package/src/tool/urlEncoderDecoder/i18n/nl.ts +163 -0
  319. package/src/tool/urlEncoderDecoder/i18n/pl.ts +162 -0
  320. package/src/tool/urlEncoderDecoder/i18n/pt.ts +162 -0
  321. package/src/tool/urlEncoderDecoder/i18n/ru.ts +163 -0
  322. package/src/tool/urlEncoderDecoder/i18n/sv.ts +163 -0
  323. package/src/tool/urlEncoderDecoder/i18n/tr.ts +162 -0
  324. package/src/tool/urlEncoderDecoder/i18n/zh.ts +163 -0
  325. package/src/tool/urlEncoderDecoder/index.ts +15 -7
  326. package/src/tool/utmGenerator/i18n/de.ts +118 -0
  327. package/src/tool/utmGenerator/i18n/id.ts +118 -0
  328. package/src/tool/utmGenerator/i18n/it.ts +118 -0
  329. package/src/tool/utmGenerator/i18n/ja.ts +118 -0
  330. package/src/tool/utmGenerator/i18n/ko.ts +118 -0
  331. package/src/tool/utmGenerator/i18n/nl.ts +118 -0
  332. package/src/tool/utmGenerator/i18n/pl.ts +117 -0
  333. package/src/tool/utmGenerator/i18n/pt.ts +118 -0
  334. package/src/tool/utmGenerator/i18n/ru.ts +118 -0
  335. package/src/tool/utmGenerator/i18n/sv.ts +118 -0
  336. package/src/tool/utmGenerator/i18n/tr.ts +117 -0
  337. package/src/tool/utmGenerator/i18n/zh.ts +118 -0
  338. package/src/tool/utmGenerator/index.ts +15 -7
  339. package/src/types.ts +1 -2
@@ -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 = 'rimozione-css-duplicato';
6
+ const title = 'Rimuovi CSS Duplicati Online. Unifica e Ottimizza i Tuoi Fogli di Stile';
7
+ const description =
8
+ 'Strumento gratuito per ripulire e purificare il codice CSS duplicato. Unifica i selettori ridondanti, rispetta la cascade e riduce immediatamente le dimensioni del file direttamente nel browser.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Cosa succede quando i selettori CSS sono duplicati?',
13
+ answer:
14
+ 'Quando lo stesso selettore compare più volte, il browser applica tutte le regole, ma l\'ultima dichiarazione di ogni proprietà sovrascrive quelle precedenti. Il risultato sono file più pesanti del necessario, senza alcun beneficio reale per il risultato visivo.',
15
+ },
16
+ {
17
+ question: 'Si perdono proprietà durante la rimozione dei duplicati?',
18
+ answer:
19
+ 'No. L\'algoritmo rispetta scrupolosamente la cascade CSS: in caso di conflitti sullo stesso selettore, mantiene sempre l\'ultima proprietà dichiarata. Le proprietà univoche di ogni blocco vengono unite sotto un unico selettore unificato.',
20
+ },
21
+ {
22
+ question: 'Funziona con CSS minificato o con commenti?',
23
+ answer:
24
+ 'Lo strumento rimuove automaticamente i commenti CSS prima di elaborare il codice e funziona correttamente anche con codice su una singola riga. Per CSS con nesting avanzato o at-rules complesse, si consiglia di separare prima i blocchi.',
25
+ },
26
+ {
27
+ question: 'Il mio CSS viene inviato a qualche server?',
28
+ answer:
29
+ 'No. Tutta l\'elaborazione avviene direttamente nel browser tramite JavaScript locale. Nessuna parte del tuo CSS viene trasmessa a server esterni, garantendo la massima privacy del tuo codice.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Incolla il tuo CSS',
36
+ text: 'Copia il contenuto del tuo file CSS con selettori ripetuti e incollalo nel campo di sinistra "Dirty / Duplicate CSS".',
37
+ },
38
+ {
39
+ name: 'Avvia la pulizia',
40
+ text: 'Clicca su "Pulisci e Unifica CSS". Lo strumento analizzerà tutti i selettori, unirà le proprietà e rimuoverà i blocchi ridondanti.',
41
+ },
42
+ {
43
+ name: 'Controlla i risultati e copia',
44
+ text: 'Verifica il risparmio in byte ottenuto e copia il CSS ottimizzato con il pulsante "Copia Codice" per usarlo direttamente nel tuo progetto.',
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: 'it',
80
+ };
81
+
82
+ const ui: DuplicateCssRemoverUI = {
83
+ labelInput: 'CSS Sporco / Duplicato',
84
+ labelOutput: 'CSS Pulito',
85
+ placeholderInput: '.btn { padding: 10px; color: red; }\n.btn { margin: 5px; color: blue; }',
86
+ placeholderOutput: 'Il CSS ottimizzato e unificato apparirà qui...',
87
+ btnClean: 'Pulisci e Unifica CSS',
88
+ btnCopy: 'Copia Codice',
89
+ btnCopied: 'Copiato!',
90
+ statBytesOriginal: 'Byte Originali',
91
+ statBytesClean: 'Byte Puliti',
92
+ statSaving: 'Risparmio',
93
+ };
94
+
95
+ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
96
+ slug,
97
+ title,
98
+ description,
99
+ ui,
100
+ faqTitle: 'Domande Frequenti',
101
+ faq: faqData,
102
+ bibliographyTitle: 'Riferimenti e Documentazione',
103
+ bibliography: [
104
+ {
105
+ name: 'Web Vitals: impatto del CSS su Render-Blocking e FCP',
106
+ url: 'https://web.dev/articles/render-blocking-resources',
107
+ },
108
+ {
109
+ name: 'Specifica W3C: Cascade e Ereditarietà CSS',
110
+ url: 'https://www.w3.org/TR/css-cascade-4/',
111
+ },
112
+ {
113
+ name: 'Clean CSS: libreria e metodologie per la minificazione 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: 'Perché il codice CSS si duplica?',
123
+ level: 2,
124
+ },
125
+ {
126
+ type: 'paragraph',
127
+ html: 'Nella manutenzione di progetti web a lungo termine o nel lavoro con codice ereditato (<em>legacy code</em>), è molto comune che più sviluppatori scrivano regole CSS sovrapposte. Spesso, per paura di rompere un design esistente, si preferisce aggiungere una nuova regola ridondante in fondo al documento piuttosto che modificare o rifattorizzare quella originale.',
128
+ },
129
+ {
130
+ type: 'paragraph',
131
+ html: 'Il risultato è un file inefficiente con decine di selettori dichiarati più volte, che penalizzano la leggibilità del codice e aumentano notevolmente il peso scaricato dalla pagina web.',
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: 'L\'impatto nascosto sulle prestazioni web (Web Vitals)',
136
+ level: 3,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: 'I file di stile bloccano il rendering naturale del browser (sono risorse <strong>Render-Blocking</strong>). Finché il browser non scarica e costruisce il CSSOM completo, lo schermo rimane bianco.',
141
+ },
142
+ {
143
+ type: 'tip',
144
+ html: 'Eliminare gli stili ridondanti non è solo una questione di pulizia: è un miglioramento misurabile e immediato di metriche fondamentali come il <strong>First Contentful Paint (FCP)</strong>.',
145
+ },
146
+ {
147
+ type: 'title',
148
+ text: 'Come unifichiamo le regole duplicate',
149
+ level: 3,
150
+ },
151
+ {
152
+ type: 'paragraph',
153
+ html: 'Questo strumento agisce come un assemblatore intelligente. Invece di limitarsi a comprimere gli spazi bianchi come farebbe un minifier tradizionale, scansiona ricorsivamente il testo alla ricerca di selettori identici.',
154
+ },
155
+ {
156
+ type: 'list',
157
+ items: [
158
+ 'Immagina di avere la regola <code>.box { color: red; }</code> e cento righe dopo un <code>.box { padding: 10px; color: blue; }</code>. Lo strumento unirà entrambi i blocchi sotto lo stesso selettore <code>.box</code>, combinando il padding.',
159
+ '<strong>Conservazione della Cascade CSS:</strong> In caso di conflitti diretti, l\'algoritmo mantiene scrupolosamente l\'ultima proprietà dichiarata. Questo garantisce che il tuo layout originale non si rompa durante la pulizia.',
160
+ ],
161
+ },
162
+ {
163
+ type: 'paragraph',
164
+ html: 'Smetti di inviare kilobyte di testo inutile ai dispositivi mobili dei tuoi utenti. Unifica il tuo codice in millisecondi, completamente offline, direttamente dal browser.',
165
+ },
166
+ ],
167
+ };
@@ -0,0 +1,168 @@
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 = 'duplicate-css-remover';
6
+ const title = 'CSSの重複を削除するオンラインツール。スタイルシートを整理して最適化';
7
+ const description =
8
+ '重複したCSSコードを無料でクリーンアップできるツール。冗長なセレクターを統合し、カスケードを維持しながら、ブラウザ上でファイルサイズを即座に削減します。';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'CSSセレクターが重複しているとどうなりますか?',
13
+ answer:
14
+ '同じセレクターが複数回登場すると、ブラウザはすべてのルールを適用しますが、各プロパティの最後の宣言が前の宣言を上書きします。これにより、見た目に何の差もないまま、ファイルが必要以上に大きくなってしまいます。',
15
+ },
16
+ {
17
+ question: '重複を削除するとプロパティが失われますか?',
18
+ answer:
19
+ 'いいえ。このアルゴリズムはCSSカスケードを厳密に尊重します。同じセレクター内でプロパティが競合する場合は、常に最後に宣言されたものが保持されます。各ブロック固有のプロパティは、ひとつに統合されたセレクターの下にまとめられます。',
20
+ },
21
+ {
22
+ question: 'ミニファイ済みのCSSやコメント付きのCSSでも使えますか?',
23
+ answer:
24
+ 'はい。ツールは処理前にCSSコメントを自動的に削除し、1行にまとまったコードでも正しく動作します。高度なネストや複雑なアットルールが含まれるCSSには、あらかじめブロックを分割してから使用することをお勧めします。',
25
+ },
26
+ {
27
+ question: 'CSSのデータはサーバーに送信されますか?',
28
+ answer:
29
+ 'いいえ。すべての処理はブラウザ内のローカルJavaScriptで完結します。CSSの一部も外部サーバーに送信されることはなく、コードのプライバシーは完全に守られます。',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'CSSを貼り付ける',
36
+ text: '重複セレクターを含むCSSファイルの内容をコピーして、左側の「Dirty / Duplicate CSS」フィールドに貼り付けます。',
37
+ },
38
+ {
39
+ name: 'クリーンアップを実行する',
40
+ text: '「CSSをクリーンアップして統合」ボタンをクリックします。ツールがすべてのセレクターを解析し、プロパティをマージして冗長なブロックを削除します。',
41
+ },
42
+ {
43
+ name: '結果を確認してコピーする',
44
+ text: '削減されたバイト数を確認し、「コードをコピー」ボタンで最適化済みのCSSをコピーして、プロジェクトに直接活用しましょう。',
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: 'ja',
80
+ };
81
+
82
+ const ui: DuplicateCssRemoverUI = {
83
+ labelInput: '重複CSS(クリーニング前)',
84
+ labelOutput: 'クリーン済みCSS',
85
+ placeholderInput: '.btn { padding: 10px; color: red; }\n.btn { margin: 5px; color: blue; }',
86
+ placeholderOutput: '最適化・統合されたCSSがここに表示されます...',
87
+ btnClean: 'CSSをクリーンアップして統合',
88
+ btnCopy: 'コードをコピー',
89
+ btnCopied: 'コピーしました!',
90
+ statBytesOriginal: '元のサイズ(バイト)',
91
+ statBytesClean: 'クリーン後のサイズ',
92
+ statSaving: '削減量',
93
+ };
94
+
95
+ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
96
+ slug,
97
+ title,
98
+ description,
99
+ ui,
100
+ faqTitle: 'よくある質問',
101
+ faq: faqData,
102
+ bibliographyTitle: '参考資料とドキュメント',
103
+ bibliography: [
104
+ {
105
+ name: 'Web Vitals:CSSがRender-BlockingとFCPに与える影響',
106
+ url: 'https://web.dev/articles/render-blocking-resources',
107
+ },
108
+ {
109
+ name: 'W3C仕様:CSSカスケードと継承',
110
+ url: 'https://www.w3.org/TR/css-cascade-4/',
111
+ },
112
+ {
113
+ name: 'Clean CSS: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: 'CSSコードが重複してしまう原因',
123
+ level: 2,
124
+ },
125
+ {
126
+ type: 'paragraph',
127
+ html: '長期プロジェクトのメンテナンスやレガシーコードの作業では、複数の開発者が重複したCSSルールを書いてしまうことがよくあります。既存のデザインを壊すのが怖いため、元のコードを修正・リファクタリングするよりも、ドキュメントの末尾に新しいルールを追加する方を選びがちです。',
128
+ },
129
+ {
130
+ type: 'paragraph',
131
+ html: 'その結果、何十もの重複セレクターを抱えた非効率なファイルが生まれ、可読性を損なうだけでなく、Webページのダウンロードサイズも大幅に増加させてしまいます。',
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: 'Webパフォーマンス(Web Vitals)への隠れた影響',
136
+ level: 3,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: 'スタイルシートファイルはブラウザのレンダリングをブロックします(<strong>Render-Blocking</strong>リソース)。完全なCSSOMをダウンロードして構築し終えるまで、画面は真っ白なままです。',
141
+ },
142
+ {
143
+ type: 'tip',
144
+ html: '冗長なスタイルを削除することは、コードの整理整頓だけの話ではありません。<strong>First Contentful Paint(FCP)</strong>などの重要なパフォーマンス指標を、即座に、数値として改善できます。',
145
+ },
146
+ {
147
+ type: 'title',
148
+ text: '重複ルールを統合する仕組み',
149
+ level: 3,
150
+ },
151
+ {
152
+ type: 'paragraph',
153
+ html: 'このツールはインテリジェントなアセンブラーとして機能します。従来のミニファイアのように空白を圧縮するだけでなく、テキストを再帰的にスキャンして同一のセレクターパターンを検出します。',
154
+ },
155
+ {
156
+ type: 'list',
157
+ items: [
158
+ '<code>.box { color: red; }</code>というルールがあり、100行後に<code>.box { padding: 10px; color: blue; }</code>がある場合を想像してください。このツールは両方のブロックを同じ<code>.box</code>セレクターの下に統合し、paddingをマージします。',
159
+ '<strong>CSSカスケードの保全:</strong>直接的な競合がある場合、アルゴリズムは最後に宣言されたプロパティを厳密に保持します。これにより、ドキュメントをクリーンアップしても元のレイアウトが崩れません。',
160
+ ],
161
+ },
162
+ {
163
+ type: 'paragraph',
164
+ html: 'ユーザーのスマートフォンに無駄なキロバイトを送り続けるのはもう終わりにしましょう。ブラウザ上で、完全オフラインで、ミリ秒単位でコードを統合できます。',
165
+ },
166
+ ],
167
+ };
168
+
@@ -0,0 +1,168 @@
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 = 'duplicate-css-remover';
6
+ const title = 'CSS 중복 제거 온라인 도구. 스타일시트를 정리하고 최적화하세요';
7
+ const description =
8
+ '중복된 CSS 코드를 깔끔하게 정리하는 무료 도구입니다. 불필요한 셀렉터를 통합하고, 캐스케이드를 유지하면서 브라우저에서 즉시 파일 크기를 줄여드립니다.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'CSS 셀렉터가 중복되면 어떻게 되나요?',
13
+ answer:
14
+ '같은 셀렉터가 여러 번 등장하면 브라우저는 모든 규칙을 적용하지만, 각 속성의 마지막 선언이 이전 선언을 덮어씁니다. 그 결과 시각적인 차이도 없이 파일만 쓸데없이 무거워집니다.',
15
+ },
16
+ {
17
+ question: '중복을 제거하면 속성이 사라지지 않나요?',
18
+ answer:
19
+ '아닙니다. 알고리즘은 CSS 캐스케이드를 엄격히 따릅니다. 같은 셀렉터 아래 속성이 충돌하면 항상 마지막에 선언된 것을 유지합니다. 각 블록의 고유한 속성은 하나의 통합 셀렉터 아래로 합쳐집니다.',
20
+ },
21
+ {
22
+ question: '압축된 CSS나 주석이 있는 CSS에서도 작동하나요?',
23
+ answer:
24
+ '네. 도구는 처리 전에 CSS 주석을 자동으로 제거하며 한 줄짜리 코드에서도 정상 작동합니다. 고급 중첩이나 복잡한 at-rule이 포함된 CSS는 미리 블록을 분리한 뒤 사용하는 것을 권장합니다.',
25
+ },
26
+ {
27
+ question: '내 CSS가 서버로 전송되나요?',
28
+ answer:
29
+ '아닙니다. 모든 처리는 로컬 JavaScript를 통해 브라우저 안에서 직접 이루어집니다. CSS의 어떤 부분도 외부 서버로 전송되지 않으며, 코드의 완전한 프라이버시가 보장됩니다.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'CSS 붙여넣기',
36
+ text: '반복된 셀렉터가 포함된 CSS 파일 내용을 복사해 왼쪽 "중복 CSS" 필드에 붙여넣으세요.',
37
+ },
38
+ {
39
+ name: '정리 실행',
40
+ text: '"CSS 정리 및 통합" 버튼을 클릭하세요. 도구가 모든 셀렉터를 스캔하고 속성을 병합하며 불필요한 블록을 제거합니다.',
41
+ },
42
+ {
43
+ name: '결과 확인 후 복사',
44
+ text: '절약된 바이트를 확인한 뒤 "코드 복사" 버튼으로 최적화된 CSS를 복사해 프로젝트에 바로 사용하세요.',
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: 'ko',
80
+ };
81
+
82
+ const ui: DuplicateCssRemoverUI = {
83
+ labelInput: '중복 CSS (정리 전)',
84
+ labelOutput: '정리된 CSS',
85
+ placeholderInput: '.btn { padding: 10px; color: red; }\n.btn { margin: 5px; color: blue; }',
86
+ placeholderOutput: '최적화·통합된 CSS가 여기에 나타납니다...',
87
+ btnClean: 'CSS 정리 및 통합',
88
+ btnCopy: '코드 복사',
89
+ btnCopied: '복사됨!',
90
+ statBytesOriginal: '원본 바이트',
91
+ statBytesClean: '정리 후 바이트',
92
+ statSaving: '절약량',
93
+ };
94
+
95
+ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
96
+ slug,
97
+ title,
98
+ description,
99
+ ui,
100
+ faqTitle: '자주 묻는 질문',
101
+ faq: faqData,
102
+ bibliographyTitle: '참고 자료 및 문서',
103
+ bibliography: [
104
+ {
105
+ name: 'Web Vitals: CSS가 Render-Blocking과 FCP에 미치는 영향',
106
+ url: 'https://web.dev/articles/render-blocking-resources',
107
+ },
108
+ {
109
+ name: 'W3C 명세: CSS 캐스케이드와 상속',
110
+ url: 'https://www.w3.org/TR/css-cascade-4/',
111
+ },
112
+ {
113
+ name: 'Clean CSS: 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: 'CSS 코드는 왜 중복될까요?',
123
+ level: 2,
124
+ },
125
+ {
126
+ type: 'paragraph',
127
+ html: '장기 웹 프로젝트를 유지하거나 레거시 코드를 다룰 때, 여러 개발자가 겹치는 CSS 규칙을 작성하는 일은 매우 흔합니다. 기존 디자인을 건드릴까 봐 두려운 나머지, 원래 코드를 수정하거나 리팩터링하는 대신 문서 끝에 새 규칙을 덧붙이는 방식을 선택하곤 하죠.',
128
+ },
129
+ {
130
+ type: 'paragraph',
131
+ html: '그 결과는 수십 개의 셀렉터가 반복 선언된 비효율적인 파일이며, 가독성을 해치고 웹 페이지의 다운로드 무게를 크게 늘립니다.',
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: '웹 성능(Web Vitals)에 미치는 숨겨진 영향',
136
+ level: 3,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: '스타일시트 파일은 브라우저의 자연스러운 렌더링을 막습니다(<strong>Render-Blocking</strong> 리소스). 브라우저가 완전한 CSSOM을 다운로드하고 구성하기 전까지는 화면이 텅 빈 상태로 남아 있습니다.',
141
+ },
142
+ {
143
+ type: 'tip',
144
+ html: '불필요한 스타일을 제거하는 것은 단순히 코드를 깔끔하게 만드는 일이 아닙니다. <strong>First Contentful Paint(FCP)</strong> 같은 핵심 지표를 즉각적이고 수치적으로 개선할 수 있습니다.',
145
+ },
146
+ {
147
+ type: 'title',
148
+ text: '중복 규칙을 통합하는 방법',
149
+ level: 3,
150
+ },
151
+ {
152
+ type: 'paragraph',
153
+ html: '이 도구는 지능형 어셈블러처럼 작동합니다. 전통적인 압축 도구처럼 공백만 줄이는 게 아니라, 텍스트를 재귀적으로 스캔하여 동일한 셀렉터 패턴을 찾아냅니다.',
154
+ },
155
+ {
156
+ type: 'list',
157
+ items: [
158
+ '<code>.box { color: red; }</code> 규칙이 있고 100줄 아래에 <code>.box { padding: 10px; color: blue; }</code>가 있다고 상상해보세요. 이 도구는 두 블록을 같은 <code>.box</code> 셀렉터 아래로 통합하고 padding을 합칩니다.',
159
+ '<strong>CSS 캐스케이드 보존:</strong> 직접적인 충돌이 있을 경우, 알고리즘은 마지막에 선언된 속성을 엄격히 보존합니다. 덕분에 정리 작업 후에도 원래 레이아웃이 무너지지 않습니다.',
160
+ ],
161
+ },
162
+ {
163
+ type: 'paragraph',
164
+ html: '사용자의 스마트폰에 쓸모없는 수 킬로바이트를 계속 전송하는 일은 이제 그만하세요. 브라우저에서 완전 오프라인으로, 밀리초 단위로 코드를 통합하세요.',
165
+ },
166
+ ],
167
+ };
168
+
@@ -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 = 'dubbele-css-verwijderen';
6
+ const title = 'Dubbele CSS online verwijderen. Stylesheets samenvoegen en opschonen';
7
+ const description =
8
+ 'Gratis tool om dubbele CSS-code op te schonen en te verwijderen. Voegt redundante selectors samen, respecteert de cascade en verkleint je bestandsgrootte direct in de browser.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Wat gebeurt er als CSS-selectors worden gedupliceerd?',
13
+ answer:
14
+ 'Wanneer dezelfde selector meerdere keren voorkomt, past de browser alle regels toe, maar de laatste declaratie van elke eigenschap overschrijft de eerdere. Het resultaat zijn onnodig zware bestanden zonder enig visueel voordeel.',
15
+ },
16
+ {
17
+ question: 'Gaan er eigenschappen verloren bij het verwijderen van duplicaten?',
18
+ answer:
19
+ 'Nee. Het algoritme respecteert de CSS-cascade strikt: bij conflicterende eigenschappen onder dezelfde selector wordt altijd de laatste gedeclareerde bewaard. Unieke eigenschappen uit elk blok worden samengevoegd onder één geünificeerde selector.',
20
+ },
21
+ {
22
+ question: 'Werkt het met geminificeerde CSS of CSS met commentaar?',
23
+ answer:
24
+ 'De tool verwijdert CSS-commentaar automatisch vóór de verwerking en werkt correct met code op één regel. Voor CSS met geavanceerde nesting of complexe at-rules wordt aanbevolen de blokken eerst te scheiden.',
25
+ },
26
+ {
27
+ question: 'Wordt mijn CSS naar een server gestuurd?',
28
+ answer:
29
+ 'Nee. Alle verwerking vindt direct in je browser plaats via lokaal JavaScript. Geen enkel deel van je CSS wordt naar een externe server gestuurd, wat de volledige privacy van je code garandeert.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Plak je CSS',
36
+ text: 'Kopieer de inhoud van je CSS-bestand met herhaalde selectors en plak het in het linkerveld "Dirty / Duplicate CSS".',
37
+ },
38
+ {
39
+ name: 'Start de opschoning',
40
+ text: 'Klik op "CSS opschonen en samenvoegen". De tool doorzoekt alle selectors, voegt eigenschappen samen en verwijdert redundante blokken.',
41
+ },
42
+ {
43
+ name: 'Bekijk de resultaten en kopieer',
44
+ text: 'Controleer de behaalde bytebesparing en kopieer de geoptimaliseerde CSS met de knop "Code kopiëren" voor direct gebruik in je project.',
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: 'nl',
80
+ };
81
+
82
+ const ui: DuplicateCssRemoverUI = {
83
+ labelInput: 'Vuile / Dubbele CSS',
84
+ labelOutput: 'Opgeschoonde CSS',
85
+ placeholderInput: '.btn { padding: 10px; color: red; }\n.btn { margin: 5px; color: blue; }',
86
+ placeholderOutput: 'Geoptimaliseerde en samengevoegde CSS verschijnt hier...',
87
+ btnClean: 'CSS opschonen en samenvoegen',
88
+ btnCopy: 'Code kopiëren',
89
+ btnCopied: 'Gekopieerd!',
90
+ statBytesOriginal: 'Originele bytes',
91
+ statBytesClean: 'Opgeschoonde bytes',
92
+ statSaving: 'Besparing',
93
+ };
94
+
95
+ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
96
+ slug,
97
+ title,
98
+ description,
99
+ ui,
100
+ faqTitle: 'Veelgestelde vragen',
101
+ faq: faqData,
102
+ bibliographyTitle: 'Referenties en documentatie',
103
+ bibliography: [
104
+ {
105
+ name: 'Web Vitals: de invloed van CSS op Render-Blocking en FCP',
106
+ url: 'https://web.dev/articles/render-blocking-resources',
107
+ },
108
+ {
109
+ name: 'W3C-specificatie: CSS Cascade en Overerving',
110
+ url: 'https://www.w3.org/TR/css-cascade-4/',
111
+ },
112
+ {
113
+ name: 'Clean CSS: bibliotheek en methoden voor CSS-minificatie',
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: 'Waarom raakt CSS-code gedupliceerd?',
123
+ level: 2,
124
+ },
125
+ {
126
+ type: 'paragraph',
127
+ html: 'Bij het onderhouden van langlopende webprojecten of het werken met legacy-code komt het heel vaak voor dat meerdere ontwikkelaars overlappende CSS-regels schrijven. Uit angst om een bestaand ontwerp te breken, voegt een ontwikkelaar liever een nieuwe redundante regel toe aan het einde van het document dan de originele te bewerken of te refactoren.',
128
+ },
129
+ {
130
+ type: 'paragraph',
131
+ html: 'Het resultaat is een inefficiënt bestand met tientallen herhaaldelijk gedeclareerde selectors, wat de leesbaarheid verslechtert en het downloadgewicht van je webpagina aanzienlijk vergroot.',
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: 'De verborgen impact op webprestaties (Web Vitals)',
136
+ level: 3,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: 'Stylesheetbestanden blokkeren de natuurlijke weergave van de browser (een <strong>Render-Blocking</strong>-bron). Zolang de browser het volledige CSSOM niet heeft gedownload en opgebouwd, blijft het scherm leeg.',
141
+ },
142
+ {
143
+ type: 'tip',
144
+ html: 'Overbodige stijlen verwijderen gaat niet alleen om codenetjes — het is een meetbare en directe verbetering van vitale metrics zoals de <strong>First Contentful Paint (FCP)</strong>.',
145
+ },
146
+ {
147
+ type: 'title',
148
+ text: 'Hoe we dubbele regels samenvoegen',
149
+ level: 3,
150
+ },
151
+ {
152
+ type: 'paragraph',
153
+ html: 'Deze tool werkt als een intelligente assembler. In plaats van alleen witruimte te comprimeren (zoals een traditionele minifier), doorzoekt hij de tekst recursief op zoek naar identieke selectorpatronen.',
154
+ },
155
+ {
156
+ type: 'list',
157
+ items: [
158
+ 'Stel je voor dat je de regel <code>.box { color: red; }</code> hebt en honderd regels later een <code>.box { padding: 10px; color: blue; }</code>. De tool voegt beide blokken samen onder dezelfde selector <code>.box</code>, inclusief de padding.',
159
+ '<strong>Behoud van de CSS-cascade:</strong> Bij directe conflicten bewaart het algoritme strikt de als laatste gedeclareerde eigenschap. Zo blijft je oorspronkelijke opmaak intact na het opschonen.',
160
+ ],
161
+ },
162
+ {
163
+ type: 'paragraph',
164
+ html: 'Stop met het sturen van kilobytes dode tekst naar de telefoons van je gebruikers. Voeg je code samen in milliseconden, volledig offline vanuit je browser.',
165
+ },
166
+ ],
167
+ };