@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 = 'usuwanie-duplikatow-css';
6
+ const title = 'Usuwanie zduplikowanego CSS online. Porządkuj i optymalizuj arkusze stylów';
7
+ const description =
8
+ 'Bezpłatne narzędzie do czyszczenia i usuwania zduplikowanego kodu CSS. Scala nadmiarowe selektory, zachowuje kaskadę i natychmiast zmniejsza rozmiar pliku bezpośrednio w przeglądarce.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Co się dzieje, gdy selektory CSS są zduplikowane?',
13
+ answer:
14
+ 'Gdy ten sam selektor pojawia się kilka razy, przeglądarka stosuje wszystkie reguły, ale ostatnia deklaracja każdej właściwości nadpisuje poprzednie. Efektem są niepotrzebnie ciężkie pliki, bez żadnych korzyści dla efektu wizualnego.',
15
+ },
16
+ {
17
+ question: 'Czy podczas usuwania duplikatów utracę jakieś właściwości?',
18
+ answer:
19
+ 'Nie. Algorytm ściśle przestrzega kaskady CSS: w przypadku konfliktów pod tym samym selektorem zawsze zachowuje ostatnio zadeklarowaną właściwość. Unikalne właściwości z każdego bloku są łączone pod jednym scalonym selektorem.',
20
+ },
21
+ {
22
+ question: 'Czy działa z minifikowanym CSS lub CSS z komentarzami?',
23
+ answer:
24
+ 'Narzędzie automatycznie usuwa komentarze CSS przed przetworzeniem i poprawnie obsługuje kod w jednej linii. W przypadku CSS z zaawansowanym zagnieżdżaniem lub złożonymi at-rules zaleca się wcześniejsze rozdzielenie bloków.',
25
+ },
26
+ {
27
+ question: 'Czy mój CSS jest wysyłany na serwer?',
28
+ answer:
29
+ 'Nie. Całe przetwarzanie odbywa się bezpośrednio w przeglądarce za pomocą lokalnego JavaScript. Żadna część twojego CSS nie jest przesyłana do żadnego zewnętrznego serwera, co gwarantuje pełną prywatność kodu.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Wklej swój CSS',
36
+ text: 'Skopiuj zawartość pliku CSS z powtarzającymi się selektorami i wklej ją do lewego pola "Dirty / Duplicate CSS".',
37
+ },
38
+ {
39
+ name: 'Uruchom czyszczenie',
40
+ text: 'Kliknij przycisk "Wyczyść i scal CSS". Narzędzie przeskanuje wszystkie selektory, połączy właściwości i usunie nadmiarowe bloki.',
41
+ },
42
+ {
43
+ name: 'Sprawdź wyniki i skopiuj',
44
+ text: 'Sprawdź uzyskane oszczędności w bajtach i skopiuj zoptymalizowany CSS przyciskiem "Kopiuj kod", aby użyć go bezpośrednio w projekcie.',
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: 'pl',
80
+ };
81
+
82
+ const ui: DuplicateCssRemoverUI = {
83
+ labelInput: 'Brudny / Zduplikowany CSS',
84
+ labelOutput: 'Czysty CSS',
85
+ placeholderInput: '.btn { padding: 10px; color: red; }\n.btn { margin: 5px; color: blue; }',
86
+ placeholderOutput: 'Zoptymalizowany i scalony CSS pojawi się tutaj...',
87
+ btnClean: 'Wyczyść i scal CSS',
88
+ btnCopy: 'Kopiuj kod',
89
+ btnCopied: 'Skopiowano!',
90
+ statBytesOriginal: 'Oryginalne bajty',
91
+ statBytesClean: 'Czyste bajty',
92
+ statSaving: 'Oszczędność',
93
+ };
94
+
95
+ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
96
+ slug,
97
+ title,
98
+ description,
99
+ ui,
100
+ faqTitle: 'Często zadawane pytania',
101
+ faq: faqData,
102
+ bibliographyTitle: 'Źródła i dokumentacja',
103
+ bibliography: [
104
+ {
105
+ name: 'Web Vitals: wpływ CSS na Render-Blocking i FCP',
106
+ url: 'https://web.dev/articles/render-blocking-resources',
107
+ },
108
+ {
109
+ name: 'Specyfikacja W3C: kaskada i dziedziczenie CSS',
110
+ url: 'https://www.w3.org/TR/css-cascade-4/',
111
+ },
112
+ {
113
+ name: 'Clean CSS: biblioteka i metody minifikacji 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: 'Dlaczego kod CSS się duplikuje?',
123
+ level: 2,
124
+ },
125
+ {
126
+ type: 'paragraph',
127
+ html: 'Przy utrzymaniu długoterminowych projektów webowych lub pracy z kodem dziedziczonym (<em>legacy code</em>) bardzo często zdarza się, że kilku programistów pisze nakładające się reguły CSS. Z obawy przed zepsuciem istniejącego projektu deweloper woli dodać nową, nadmiarową regułę na końcu dokumentu zamiast edytować lub refaktoryzować oryginał.',
128
+ },
129
+ {
130
+ type: 'paragraph',
131
+ html: 'Efektem jest nieefektywny plik z dziesiątkami wielokrotnie zadeklarowanych selektorów, który zabija czytelność i znacząco zwiększa wagę pobieranej strony.',
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: 'Ukryty wpływ na wydajność stron (Web Vitals)',
136
+ level: 3,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: 'Pliki stylów blokują naturalne renderowanie przeglądarki (zasób <strong>Render-Blocking</strong>). Dopóki przeglądarka nie pobierze i nie zbuduje kompletnego CSSOM, ekran pozostaje pusty.',
141
+ },
142
+ {
143
+ type: 'tip',
144
+ html: 'Usuwanie nadmiarowych stylów to nie tylko kwestia porządku w kodzie — to mierzalna i natychmiastowa poprawa kluczowych metryk, takich jak <strong>First Contentful Paint (FCP)</strong>.',
145
+ },
146
+ {
147
+ type: 'title',
148
+ text: 'Jak scalamy zduplikowane reguły',
149
+ level: 3,
150
+ },
151
+ {
152
+ type: 'paragraph',
153
+ html: 'To narzędzie działa jak inteligentny asembler. Zamiast tylko kompresować białe znaki (jak robi to tradycyjny minifier), rekurencyjnie przeszukuje tekst w poszukiwaniu identycznych wzorców selektorów.',
154
+ },
155
+ {
156
+ type: 'list',
157
+ items: [
158
+ 'Wyobraź sobie, że masz regułę <code>.box { color: red; }</code>, a sto linii niżej <code>.box { padding: 10px; color: blue; }</code>. Narzędzie scali oba bloki pod tym samym selektorem <code>.box</code>, łącząc padding.',
159
+ '<strong>Zachowanie kaskady CSS:</strong> W przypadku bezpośrednich konfliktów algorytm ściśle zachowuje ostatnio zadeklarowaną właściwość. Dzięki temu twój oryginalny układ nie rozpadnie się po wyczyszczeniu dokumentu.',
160
+ ],
161
+ },
162
+ {
163
+ type: 'paragraph',
164
+ html: 'Koniec z wysyłaniem kilobajtów martwego tekstu na telefony twoich użytkowników. Scal swój kod w milisekundy, całkowicie offline, bezpośrednio z przeglądarki.',
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 = 'removedor-de-css-duplicado';
6
+ const title = 'Remover CSS Duplicado Online. Unifique e Limpe as Suas Folhas de Estilo';
7
+ const description =
8
+ 'Ferramenta gratuita para limpar e purgar código CSS duplicado. Unifica seletores redundantes, respeita a cascade e reduz instantaneamente o tamanho dos ficheiros diretamente no browser.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'O que acontece quando os seletores CSS são duplicados?',
13
+ answer:
14
+ 'Quando o mesmo seletor aparece várias vezes, o browser aplica todas as regras, mas a última declaração de cada propriedade substitui as anteriores. O resultado são ficheiros mais pesados do que o necessário, sem qualquer benefício real para o resultado visual.',
15
+ },
16
+ {
17
+ question: 'Perco alguma propriedade ao remover os duplicados?',
18
+ answer:
19
+ 'Não. O algoritmo respeita rigorosamente a cascade do CSS: em caso de conflitos sob o mesmo seletor, preserva sempre a última propriedade declarada. As propriedades exclusivas de cada bloco são combinadas num único seletor unificado.',
20
+ },
21
+ {
22
+ question: 'Funciona com CSS minificado ou com comentários?',
23
+ answer:
24
+ 'A ferramenta remove automaticamente os comentários CSS antes de processar e funciona corretamente com código numa só linha. Para CSS com nesting avançado ou at-rules complexas, recomenda-se separar os blocos primeiro.',
25
+ },
26
+ {
27
+ question: 'O meu CSS é enviado para algum servidor?',
28
+ answer:
29
+ 'Não. Todo o processamento ocorre diretamente no seu browser através de JavaScript local. Nenhuma parte do seu CSS é transmitida para qualquer servidor externo, garantindo total privacidade do seu código.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Cole o seu CSS',
36
+ text: 'Copie o conteúdo do seu ficheiro CSS com seletores repetidos e cole-o no campo da esquerda "Dirty / Duplicate CSS".',
37
+ },
38
+ {
39
+ name: 'Execute a limpeza',
40
+ text: 'Clique no botão "Limpar e Unificar CSS". A ferramenta irá analisar todos os seletores, fundir propriedades e remover blocos redundantes.',
41
+ },
42
+ {
43
+ name: 'Reveja os resultados e copie',
44
+ text: 'Verifique a poupança em bytes obtida e copie o CSS otimizado com o botão "Copiar Código" para o usar diretamente no seu projeto.',
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: 'pt',
80
+ };
81
+
82
+ const ui: DuplicateCssRemoverUI = {
83
+ labelInput: 'CSS Sujo / Duplicado',
84
+ labelOutput: 'CSS Limpo',
85
+ placeholderInput: '.btn { padding: 10px; color: red; }\n.btn { margin: 5px; color: blue; }',
86
+ placeholderOutput: 'O CSS otimizado e unificado aparecerá aqui...',
87
+ btnClean: 'Limpar e Unificar CSS',
88
+ btnCopy: 'Copiar Código',
89
+ btnCopied: 'Copiado!',
90
+ statBytesOriginal: 'Bytes Originais',
91
+ statBytesClean: 'Bytes Limpos',
92
+ statSaving: 'Poupança',
93
+ };
94
+
95
+ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
96
+ slug,
97
+ title,
98
+ description,
99
+ ui,
100
+ faqTitle: 'Perguntas Frequentes',
101
+ faq: faqData,
102
+ bibliographyTitle: 'Referências e Documentação',
103
+ bibliography: [
104
+ {
105
+ name: 'Web Vitals: impacto do CSS no Render-Blocking e no FCP',
106
+ url: 'https://web.dev/articles/render-blocking-resources',
107
+ },
108
+ {
109
+ name: 'Especificação W3C: Cascade e Herança CSS',
110
+ url: 'https://www.w3.org/TR/css-cascade-4/',
111
+ },
112
+ {
113
+ name: 'Clean CSS: biblioteca e metodologias para minificação de 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: 'Por que o código CSS acaba por se duplicar?',
123
+ level: 2,
124
+ },
125
+ {
126
+ type: 'paragraph',
127
+ html: 'Ao manter projetos web a longo prazo ou ao trabalhar com código legado (<em>legacy code</em>), é extremamente comum que vários programadores escrevam regras CSS sobrepostas. Muitas vezes, com medo de estragar um design existente, prefere-se adicionar uma nova regra redundante no final do documento a editar ou refatorar a original.',
128
+ },
129
+ {
130
+ type: 'paragraph',
131
+ html: 'O resultado é um ficheiro ineficiente com dezenas de seletores declarados repetidamente, que compromete a legibilidade e aumenta consideravelmente o peso de transferência da página web.',
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: 'O impacto oculto no desempenho web (Web Vitals)',
136
+ level: 3,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: 'Os ficheiros de folhas de estilo bloqueiam a renderização natural do browser (um recurso <strong>Render-Blocking</strong>). Até o browser transferir e construir o CSSOM completo, o ecrã permanece em branco.',
141
+ },
142
+ {
143
+ type: 'tip',
144
+ html: 'Purgar estilos redundantes não é apenas uma questão de organização do código — é uma melhoria mensurável e imediata em métricas vitais como o <strong>First Contentful Paint (FCP)</strong>.',
145
+ },
146
+ {
147
+ type: 'title',
148
+ text: 'Como unificamos as regras duplicadas',
149
+ level: 3,
150
+ },
151
+ {
152
+ type: 'paragraph',
153
+ html: 'Esta ferramenta funciona como um montador inteligente. Em vez de se limitar a comprimir espaços em branco (como faria um minifier tradicional), percorre o texto recursivamente à procura de padrões de seletores idênticos.',
154
+ },
155
+ {
156
+ type: 'list',
157
+ items: [
158
+ 'Imagine ter a regra <code>.box { color: red; }</code> e cem linhas abaixo um <code>.box { padding: 10px; color: blue; }</code>. A ferramenta unifica ambos os blocos sob o mesmo seletor <code>.box</code>, combinando o padding.',
159
+ '<strong>Preservação da Cascade CSS:</strong> Em caso de conflitos diretos, o algoritmo preserva rigorosamente a última propriedade declarada. Assim, o seu layout original não é quebrado ao purgar o documento.',
160
+ ],
161
+ },
162
+ {
163
+ type: 'paragraph',
164
+ html: 'Deixe de enviar kilobytes de texto morto para os telemóveis dos seus utilizadores. Unifique o seu código em milissegundos, completamente offline, diretamente no 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 = 'udalenie-dublikatov-css';
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 перед обработкой и корректно работает с однострочным кодом. Для CSS с продвинутой вложенностью или сложными at-rules рекомендуется сначала разделить блоки.',
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: 'ru',
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>, а сотню строк спустя — <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
+ };
@@ -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 = 'ta-bort-dubblett-css';
6
+ const title = 'Ta bort duplicerad CSS online. Sammanfoga och rensa dina stilmallar';
7
+ const description =
8
+ 'Gratis verktyg för att rensa och ta bort duplicerad CSS-kod. Sammanfogar redundanta selektorer, respekterar cascade och minskar filstorleken direkt i webbläsaren.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Vad händer när CSS-selektorer är duplicerade?',
13
+ answer:
14
+ 'När samma selektor förekommer flera gånger tillämpar webbläsaren alla regler, men den sista deklarationen av varje egenskap skriver över de tidigare. Det ger onödigt tunga filer utan någon verklig fördel för det visuella resultatet.',
15
+ },
16
+ {
17
+ question: 'Försvinner några egenskaper när dubbletter tas bort?',
18
+ answer:
19
+ 'Nej. Algoritmen följer CSS-cascaden strikt: vid konflikter under samma selektor bevaras alltid den senast deklarerade egenskapen. Unika egenskaper från varje block slås samman under en enda enhetlig selektor.',
20
+ },
21
+ {
22
+ question: 'Fungerar det med minifierad CSS eller CSS med kommentarer?',
23
+ answer:
24
+ 'Verktyget tar automatiskt bort CSS-kommentarer innan bearbetning och fungerar korrekt med kod på en enda rad. För CSS med avancerad nesting eller komplexa at-rules rekommenderas att du separerar blocken först.',
25
+ },
26
+ {
27
+ question: 'Skickas min CSS till någon server?',
28
+ answer:
29
+ 'Nej. All bearbetning sker direkt i din webbläsare via lokal JavaScript. Ingen del av din CSS skickas till någon extern server, vilket garanterar full sekretess för din kod.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Klistra in din CSS',
36
+ text: 'Kopiera innehållet i din CSS-fil med upprepade selektorer och klistra in det i det vänstra fältet "Dirty / Duplicate CSS".',
37
+ },
38
+ {
39
+ name: 'Starta rensningen',
40
+ text: 'Klicka på "Rensa och sammanfoga CSS". Verktyget söker igenom alla selektorer, slår samman egenskaper och tar bort redundanta block.',
41
+ },
42
+ {
43
+ name: 'Granska resultatet och kopiera',
44
+ text: 'Kontrollera hur många bytes som sparats och kopiera den optimerade CSS:en med knappen "Kopiera kod" för att använda den direkt i ditt 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: 'sv',
80
+ };
81
+
82
+ const ui: DuplicateCssRemoverUI = {
83
+ labelInput: 'Smutsig / Duplicerad CSS',
84
+ labelOutput: 'Ren CSS',
85
+ placeholderInput: '.btn { padding: 10px; color: red; }\n.btn { margin: 5px; color: blue; }',
86
+ placeholderOutput: 'Optimerad och sammanfogad CSS visas här...',
87
+ btnClean: 'Rensa och sammanfoga CSS',
88
+ btnCopy: 'Kopiera kod',
89
+ btnCopied: 'Kopierad!',
90
+ statBytesOriginal: 'Ursprungliga bytes',
91
+ statBytesClean: 'Rena bytes',
92
+ statSaving: 'Besparing',
93
+ };
94
+
95
+ export const content: ToolLocaleContent<DuplicateCssRemoverUI> = {
96
+ slug,
97
+ title,
98
+ description,
99
+ ui,
100
+ faqTitle: 'Vanliga frågor',
101
+ faq: faqData,
102
+ bibliographyTitle: 'Källor och dokumentation',
103
+ bibliography: [
104
+ {
105
+ name: 'Web Vitals: CSS påverkan på Render-Blocking och FCP',
106
+ url: 'https://web.dev/articles/render-blocking-resources',
107
+ },
108
+ {
109
+ name: 'W3C-specifikation: CSS Cascade och arv',
110
+ url: 'https://www.w3.org/TR/css-cascade-4/',
111
+ },
112
+ {
113
+ name: 'Clean CSS: bibliotek och metoder för CSS-minifiering',
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: 'Varför dupliceras CSS-kod?',
123
+ level: 2,
124
+ },
125
+ {
126
+ type: 'paragraph',
127
+ html: 'Vid underhåll av långsiktiga webbprojekt eller arbete med äldre kod är det mycket vanligt att flera utvecklare skriver överlappande CSS-regler. Av rädsla för att förstöra en befintlig design lägger man hellre till en ny redundant regel i slutet av dokumentet än att redigera eller refaktorera originalet.',
128
+ },
129
+ {
130
+ type: 'paragraph',
131
+ html: 'Resultatet är en ineffektiv fil med dussintals upprepade selektorer som förstör läsbarheten och avsevärt ökar nedladdningsstorleken för din webbsida.',
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: 'Den dolda påverkan på webbprestanda (Web Vitals)',
136
+ level: 3,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: 'Stilmallsfiler blockerar webbläsarens naturliga rendering (en <strong>Render-Blocking</strong>-resurs). Tills webbläsaren har laddat ner och byggt upp hela CSSOM förblir skärmen tom.',
141
+ },
142
+ {
143
+ type: 'tip',
144
+ html: 'Att rensa bort redundanta stilar handlar inte bara om kodordning — det är en mätbar och omedelbar förbättring av viktiga mätvärden som <strong>First Contentful Paint (FCP)</strong>.',
145
+ },
146
+ {
147
+ type: 'title',
148
+ text: 'Hur vi sammanfogar duplicerade regler',
149
+ level: 3,
150
+ },
151
+ {
152
+ type: 'paragraph',
153
+ html: 'Det här verktyget fungerar som en intelligent assembler. Istället för att enbart komprimera blanksteg (som en traditionell minifierare) skannar det rekursivt igenom texten efter identiska selektormönster.',
154
+ },
155
+ {
156
+ type: 'list',
157
+ items: [
158
+ 'Tänk dig att du har regeln <code>.box { color: red; }</code> och hundra rader senare en <code>.box { padding: 10px; color: blue; }</code>. Verktyget sammanfogar båda blocken under samma selektor <code>.box</code> och kombinerar padding-värdet.',
159
+ '<strong>Bevarande av CSS-cascade:</strong> Vid direkta konflikter bevarar algoritmen strikt den senast deklarerade egenskapen. Det säkerställer att din ursprungliga layout inte går sönder när dokumentet rensas.',
160
+ ],
161
+ },
162
+ {
163
+ type: 'paragraph',
164
+ html: 'Sluta skicka kilobytes av död text till dina användares mobiltelefoner. Sammanfoga din kod på millisekunder, helt offline, direkt från webbläsaren.',
165
+ },
166
+ ],
167
+ };