fix: misc

This commit is contained in:
Ibrahima G. Coulibaly 2025-07-13 11:25:05 +01:00
commit 21c4f44d4e
121 changed files with 987 additions and 837 deletions

316
.idea/workspace.xml generated
View file

@ -4,12 +4,128 @@
<option name="autoReloadType" value="SELECTIVE" /> <option name="autoReloadType" value="SELECTIVE" />
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="docs: edit pdf meta"> <list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="docs: readme">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/ToolContent.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/ToolContent.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/package-lock.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/options/ToolOptions.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/options/ToolOptions.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/index.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/i18n/index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/i18n/index.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/change-speed/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/change-speed/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/change-speed/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/change-speed/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/extract-audio/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/extract-audio/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/extract-audio/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/extract-audio/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/change-csv-separator/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/change-csv-separator/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/csv-to-json/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/csv-to-json/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/find-incomplete-csv-records/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/find-incomplete-csv-records/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/find-incomplete-csv-records/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/find-incomplete-csv-records/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/insert-csv-columns/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/insert-csv-columns/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/generic/resize/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/generic/resize/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/i18n/hi.json" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/i18n/hi.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/json/escape-json/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/json/escape-json/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/json/json-to-xml/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/json/json-to-xml/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/json/minify/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/json/minify/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/json/minify/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/json/minify/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/json/prettify/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/json/prettify/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/json/prettify/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/json/prettify/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/json/stringify/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/json/stringify/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/json/tsv-to-json/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/json/tsv-to-json/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/json/validateJson/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/json/validateJson/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/json/validateJson/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/json/validateJson/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/duplicate/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/duplicate/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/duplicate/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/duplicate/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/find-most-popular/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/find-most-popular/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/find-unique/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/find-unique/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/find-unique/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/find-unique/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/group/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/group/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/group/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/group/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/reverse/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/reverse/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/reverse/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/reverse/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/rotate/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/rotate/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/shuffle/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/shuffle/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/shuffle/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/shuffle/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/sort/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/sort/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/sort/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/sort/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/truncate/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/truncate/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/unwrap/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/unwrap/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/wrap/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/wrap/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/wrap/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/wrap/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/arithmetic-sequence/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/arithmetic-sequence/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/arithmetic-sequence/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/arithmetic-sequence/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/generate/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/generate/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/generate/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/generate/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/sum/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/sum/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/sum/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/sum/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/compress-pdf/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/compress-pdf/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/compress-pdf/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/compress-pdf/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/merge-pdf/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/merge-pdf/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/merge-pdf/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/merge-pdf/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/pdf-to-epub/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/pdf-to-epub/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/protect-pdf/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/protect-pdf/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/rotate-pdf/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/rotate-pdf/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/split-pdf/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/split-pdf/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/split-pdf/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/split-pdf/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/base64/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/base64/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/base64/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/base64/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/censor/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/censor/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/create-palindrome/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/create-palindrome/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/extract-substring/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/extract-substring/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/join/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/join/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/join/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/join/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/palindrome/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/palindrome/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/quote/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/quote/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/quote/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/quote/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/randomize-case/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/randomize-case/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/remove-duplicate-lines/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/remove-duplicate-lines/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/repeat/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/repeat/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/repeat/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/repeat/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/reverse/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/reverse/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/reverse/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/reverse/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/rot13/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/rot13/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/rotate/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/rotate/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/split/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/split/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/split/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/split/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/statistic/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/statistic/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/statistic/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/statistic/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/text-replacer/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/text-replacer/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/to-morse/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/to-morse/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/to-morse/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/to-morse/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/truncate/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/truncate/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/truncate/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/truncate/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/uppercase/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/uppercase/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/uppercase/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/uppercase/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/check-leap-years/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/check-leap-years/index.tsx" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/pages/tools/time/check-leap-years/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/check-leap-years/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/check-leap-years/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/check-leap-years/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/convert-days-to-hours/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/convert-days-to-hours/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/convert-days-to-hours/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/convert-days-to-hours/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/convert-hours-to-days/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/convert-hours-to-days/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/convert-seconds-to-time/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/convert-seconds-to-time/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/convert-seconds-to-time/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/convert-seconds-to-time/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/convert-time-to-seconds/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/convert-time-to-seconds/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/convert-time-to-seconds/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/convert-time-to-seconds/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/crontab-guru/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/crontab-guru/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/time-between-dates/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/time-between-dates/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/time-between-dates/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/time-between-dates/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/truncate-clock-time/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/truncate-clock-time/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/time/truncate-clock-time/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/time/truncate-clock-time/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/change-speed/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/change-speed/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/change-speed/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/change-speed/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/compress/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/compress/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/compress/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/compress/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/crop-video/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/crop-video/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/crop-video/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/crop-video/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/flip/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/flip/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/flip/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/flip/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/gif/change-speed/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/gif/change-speed/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/loop/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/loop/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/loop/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/loop/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/rotate/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/rotate/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/rotate/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/rotate/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/trim/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/trim/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/trim/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/trim/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/video-to-gif/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/video-to-gif/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/xml/xml-beautifier/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/xml/xml-beautifier/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/xml/xml-beautifier/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/xml/xml-beautifier/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/xml/xml-validator/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/xml/xml-validator/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/xml/xml-validator/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/xml/xml-validator/meta.ts" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -42,171 +158,171 @@
&quot;state&quot;: &quot;OPEN&quot; &quot;state&quot;: &quot;OPEN&quot;
} }
}</component> }</component>
<component name="GitHubPullRequestState"><![CDATA[{ <component name="GitHubPullRequestState">{
"prStates": [ &quot;prStates&quot;: [
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts51PkS9", &quot;id&quot;: &quot;PR_kwDOMJIfts51PkS9&quot;,
"number": 22 &quot;number&quot;: 22
}, },
"lastSeen": 1741207144695 &quot;lastSeen&quot;: 1741207144695
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6NiNYl", &quot;id&quot;: &quot;PR_kwDOMJIfts6NiNYl&quot;,
"number": 32 &quot;number&quot;: 32
}, },
"lastSeen": 1741209723869 &quot;lastSeen&quot;: 1741209723869
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6Nheyd", &quot;id&quot;: &quot;PR_kwDOMJIfts6Nheyd&quot;,
"number": 31 &quot;number&quot;: 31
}, },
"lastSeen": 1741213371410 &quot;lastSeen&quot;: 1741213371410
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6NmRBs", &quot;id&quot;: &quot;PR_kwDOMJIfts6NmRBs&quot;,
"number": 33 &quot;number&quot;: 33
}, },
"lastSeen": 1741282429036 &quot;lastSeen&quot;: 1741282429036
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts5zyFTs", &quot;id&quot;: &quot;PR_kwDOMJIfts5zyFTs&quot;,
"number": 15 &quot;number&quot;: 15
}, },
"lastSeen": 1741535540953 &quot;lastSeen&quot;: 1741535540953
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6QQB3c", &quot;id&quot;: &quot;PR_kwDOMJIfts6QQB3c&quot;,
"number": 59 &quot;number&quot;: 59
}, },
"lastSeen": 1743018960900 &quot;lastSeen&quot;: 1743018960900
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6QMPEg", &quot;id&quot;: &quot;PR_kwDOMJIfts6QMPEg&quot;,
"number": 58 &quot;number&quot;: 58
}, },
"lastSeen": 1743019452983 &quot;lastSeen&quot;: 1743019452983
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6QZvRI", &quot;id&quot;: &quot;PR_kwDOMJIfts6QZvRI&quot;,
"number": 61 &quot;number&quot;: 61
}, },
"lastSeen": 1743103196866 &quot;lastSeen&quot;: 1743103196866
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6QqPrQ", &quot;id&quot;: &quot;PR_kwDOMJIfts6QqPrQ&quot;,
"number": 73 &quot;number&quot;: 73
}, },
"lastSeen": 1743265865001 &quot;lastSeen&quot;: 1743265865001
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6Qp5nI", &quot;id&quot;: &quot;PR_kwDOMJIfts6Qp5nI&quot;,
"number": 72 &quot;number&quot;: 72
}, },
"lastSeen": 1743338472110 &quot;lastSeen&quot;: 1743338472110
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6QsjlS", &quot;id&quot;: &quot;PR_kwDOMJIfts6QsjlS&quot;,
"number": 76 &quot;number&quot;: 76
}, },
"lastSeen": 1743352150953 &quot;lastSeen&quot;: 1743352150953
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6Q0JBe", &quot;id&quot;: &quot;PR_kwDOMJIfts6Q0JBe&quot;,
"number": 82 &quot;number&quot;: 82
}, },
"lastSeen": 1743470267269 &quot;lastSeen&quot;: 1743470267269
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6UE9-x", &quot;id&quot;: &quot;PR_kwDOMJIfts6UE9-x&quot;,
"number": 102 &quot;number&quot;: 102
}, },
"lastSeen": 1747171977348 &quot;lastSeen&quot;: 1747171977348
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6XPua_", &quot;id&quot;: &quot;PR_kwDOMJIfts6XPua_&quot;,
"number": 117 &quot;number&quot;: 117
}, },
"lastSeen": 1747929835864 &quot;lastSeen&quot;: 1747929835864
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6XY-mZ", &quot;id&quot;: &quot;PR_kwDOMJIfts6XY-mZ&quot;,
"number": 119 &quot;number&quot;: 119
}, },
"lastSeen": 1748028108508 &quot;lastSeen&quot;: 1748028108508
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6Xdz4n", &quot;id&quot;: &quot;PR_kwDOMJIfts6Xdz4n&quot;,
"number": 120 &quot;number&quot;: 120
}, },
"lastSeen": 1748282672214 &quot;lastSeen&quot;: 1748282672214
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6X_zxl", &quot;id&quot;: &quot;PR_kwDOMJIfts6X_zxl&quot;,
"number": 131 &quot;number&quot;: 131
}, },
"lastSeen": 1748881279494 &quot;lastSeen&quot;: 1748881279494
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6bhieT", &quot;id&quot;: &quot;PR_kwDOMJIfts6bhieT&quot;,
"number": 152 &quot;number&quot;: 152
}, },
"lastSeen": 1751848489082 &quot;lastSeen&quot;: 1751848489082
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6dOyRk", &quot;id&quot;: &quot;PR_kwDOMJIfts6dOyRk&quot;,
"number": 154 &quot;number&quot;: 154
}, },
"lastSeen": 1751849436454 &quot;lastSeen&quot;: 1751849436454
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6cHjNi", &quot;id&quot;: &quot;PR_kwDOMJIfts6cHjNi&quot;,
"number": 153 &quot;number&quot;: 153
}, },
"lastSeen": 1751849501498 &quot;lastSeen&quot;: 1751849501498
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6Zs1FN", &quot;id&quot;: &quot;PR_kwDOMJIfts6Zs1FN&quot;,
"number": 145 &quot;number&quot;: 145
}, },
"lastSeen": 1751849770308 &quot;lastSeen&quot;: 1751849770308
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6bgKi9", &quot;id&quot;: &quot;PR_kwDOMJIfts6bgKi9&quot;,
"number": 150 &quot;number&quot;: 150
}, },
"lastSeen": 1751850367300 &quot;lastSeen&quot;: 1751850367300
}, },
{ {
"id": { &quot;id&quot;: {
"id": "PR_kwDOMJIfts6eUKC-", &quot;id&quot;: &quot;PR_kwDOMJIfts6eUKC-&quot;,
"number": 176 &quot;number&quot;: 176
}, },
"lastSeen": 1752158748013 &quot;lastSeen&quot;: 1752158748013
} }
] ]
}]]></component> }</component>
<component name="GithubPullRequestsUISettings">{ <component name="GithubPullRequestsUISettings">{
&quot;selectedUrlAndAccountId&quot;: { &quot;selectedUrlAndAccountId&quot;: {
&quot;url&quot;: &quot;https://github.com/iib0011/omni-tools.git&quot;, &quot;url&quot;: &quot;https://github.com/iib0011/omni-tools.git&quot;,
@ -262,7 +378,7 @@
"Vitest.replaceText function (regexp mode).should return the original text when passed an invalid regexp.executor": "Run", "Vitest.replaceText function (regexp mode).should return the original text when passed an invalid regexp.executor": "Run",
"Vitest.replaceText function.executor": "Run", "Vitest.replaceText function.executor": "Run",
"Vitest.timeBetweenDates.executor": "Run", "Vitest.timeBetweenDates.executor": "Run",
"git-widget-placeholder": "main", "git-widget-placeholder": "#190 on fork/AshAnand34/en-hi-translation",
"ignore.virus.scanning.warn.message": "true", "ignore.virus.scanning.warn.message": "true",
"kotlin-language-version-configured": "true", "kotlin-language-version-configured": "true",
"last_opened_file_path": "C:/Users/Ibrahima/IdeaProjects/omni-tools/public", "last_opened_file_path": "C:/Users/Ibrahima/IdeaProjects/omni-tools/public",

67
package-lock.json generated
View file

@ -34,10 +34,12 @@
"fast-xml-parser": "^5.2.5", "fast-xml-parser": "^5.2.5",
"formik": "^2.4.6", "formik": "^2.4.6",
"i18next": "^25.3.2", "i18next": "^25.3.2",
"i18next-locize-backend": "^7.0.4",
"jimp": "^0.22.12", "jimp": "^0.22.12",
"js-quantities": "^1.8.0", "js-quantities": "^1.8.0",
"jszip": "^3.10.1", "jszip": "^3.10.1",
"lint-staged": "^15.4.3", "lint-staged": "^15.4.3",
"locize": "^4.0.14",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mime": "^4.0.6", "mime": "^4.0.6",
"morsee": "^1.0.9", "morsee": "^1.0.9",
@ -1420,20 +1422,22 @@
} }
}, },
"node_modules/@floating-ui/core": { "node_modules/@floating-ui/core": {
"version": "1.6.2", "version": "1.7.2",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz",
"integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==",
"license": "MIT",
"dependencies": { "dependencies": {
"@floating-ui/utils": "^0.2.0" "@floating-ui/utils": "^0.2.10"
} }
}, },
"node_modules/@floating-ui/dom": { "node_modules/@floating-ui/dom": {
"version": "1.6.5", "version": "1.7.2",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz",
"integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==",
"license": "MIT",
"dependencies": { "dependencies": {
"@floating-ui/core": "^1.0.0", "@floating-ui/core": "^1.7.2",
"@floating-ui/utils": "^0.2.0" "@floating-ui/utils": "^0.2.10"
} }
}, },
"node_modules/@floating-ui/react-dom": { "node_modules/@floating-ui/react-dom": {
@ -1449,9 +1453,10 @@
} }
}, },
"node_modules/@floating-ui/utils": { "node_modules/@floating-ui/utils": {
"version": "0.2.2", "version": "0.2.10",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
"integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
"license": "MIT"
}, },
"node_modules/@hapi/hoek": { "node_modules/@hapi/hoek": {
"version": "9.3.0", "version": "9.3.0",
@ -4953,6 +4958,15 @@
"cronstrue": "bin/cli.js" "cronstrue": "bin/cli.js"
} }
}, },
"node_modules/cross-fetch": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz",
"integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==",
"license": "MIT",
"dependencies": {
"node-fetch": "^2.7.0"
}
},
"node_modules/cross-spawn": { "node_modules/cross-spawn": {
"version": "7.0.3", "version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@ -6764,6 +6778,24 @@
} }
} }
}, },
"node_modules/i18next-locize-backend": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/i18next-locize-backend/-/i18next-locize-backend-7.0.4.tgz",
"integrity": "sha512-saRyIQAX0k+YA6XzirU6cyudWDj1W7bGDz/Szq+8OIs3JJnNuMZCADuNgCwmo+dQm9P69bbALymV+9t9ffywBA==",
"license": "MIT",
"dependencies": {
"cross-fetch": "4.1.0"
}
},
"node_modules/i18next-subliminal": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/i18next-subliminal/-/i18next-subliminal-1.0.1.tgz",
"integrity": "sha512-h3m1oQ8lTaTNNgqmvBXAzFSGoJ0uobUcFW6TJMaWV4QDQ0+YGIih3ZcCX1XouGzK8yyFX13lP+2zAT/k7u4oiQ==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.27.0"
}
},
"node_modules/iconv-lite": { "node_modules/iconv-lite": {
"version": "0.6.3", "version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@ -7933,6 +7965,17 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/locize": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/locize/-/locize-4.0.14.tgz",
"integrity": "sha512-4AnM9Hoxm7tgE+LhkdX1cDp+PLnraSruNc/3O/AAFfbmqmqaGdf9TyLwgHd0C9ug6GPRS0RIzXH6wdg5tHMWWw==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.6",
"@floating-ui/dom": "^1.6.13",
"i18next-subliminal": "^1.0.1"
}
},
"node_modules/lodash": { "node_modules/lodash": {
"version": "4.17.21", "version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",

View file

@ -51,10 +51,12 @@
"fast-xml-parser": "^5.2.5", "fast-xml-parser": "^5.2.5",
"formik": "^2.4.6", "formik": "^2.4.6",
"i18next": "^25.3.2", "i18next": "^25.3.2",
"i18next-locize-backend": "^7.0.4",
"jimp": "^0.22.12", "jimp": "^0.22.12",
"js-quantities": "^1.8.0", "js-quantities": "^1.8.0",
"jszip": "^3.10.1", "jszip": "^3.10.1",
"lint-staged": "^15.4.3", "lint-staged": "^15.4.3",
"locize": "^4.0.14",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mime": "^4.0.6", "mime": "^4.0.6",
"morsee": "^1.0.9", "morsee": "^1.0.9",

View file

@ -24,50 +24,59 @@ import enTime from '../pages/tools/time/i18n/en.json';
import hiTime from '../pages/tools/time/i18n/hi.json'; import hiTime from '../pages/tools/time/i18n/hi.json';
import enXml from '../pages/tools/xml/i18n/en.json'; import enXml from '../pages/tools/xml/i18n/en.json';
import hiXml from '../pages/tools/xml/i18n/hi.json'; import hiXml from '../pages/tools/xml/i18n/hi.json';
import Backend from 'i18next-locize-backend';
const locizeOptions = {
projectId: 'e7156a3e-66fb-4035-a0f0-cebf1c63a3ba', // Replace with your Locize project ID
apiKey: import.meta.env.LOCIZE_API_KEY, // Replace with your Locize API key
referenceLng: 'en',
version: 'latest'
};
// Merge translations for demonstration; in a real app, use namespaces // Merge translations for demonstration; in a real app, use namespaces
const resources = { const resources = {
en: { en: {
translation: { translation: enGlobal,
...enGlobal, list: enList,
list: enList, string: enString,
string: enString, csv: enCsv,
csv: enCsv, json: enJson,
json: enJson, pdf: enPdf,
pdf: enPdf, image: enImage,
image: enImage, audio: enAudio,
audio: enAudio, video: enVideo,
video: enVideo, number: enNumber,
number: enNumber, time: enTime,
time: enTime, xml: enXml
xml: enXml
}
}, },
hi: { hi: {
translation: { translation: hiGlobal,
...hiGlobal, list: hiList,
list: hiList, string: hiString,
string: hiString, csv: hiCsv,
csv: hiCsv, json: hiJson,
json: hiJson, pdf: hiPdf,
pdf: hiPdf, image: hiImage,
image: hiImage, audio: hiAudio,
audio: hiAudio, video: hiVideo,
video: hiVideo, number: hiNumber,
number: hiNumber, time: hiTime,
time: hiTime, xml: hiXml
xml: hiXml
}
} }
}; };
i18n.use(initReactI18next).init({ i18n
resources, .use(Backend)
lng: 'en', .use(initReactI18next)
fallbackLng: 'en', .init({
interpolation: { resources,
escapeValue: false lng: 'en',
} fallbackLng: 'en',
}); interpolation: {
escapeValue: false
},
backend: locizeOptions,
saveMissing: true, // Send missing keys to Locize
updateMissing: true // Update keys in Locize
});
export default i18n; export default i18n;

View file

@ -51,20 +51,20 @@ export default function ChangeSpeed({
updateField updateField
}) => [ }) => [
{ {
title: t('audio.changeSpeed.newAudioSpeed'), title: t('audio:changeSpeed.newAudioSpeed'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
value={values.newSpeed.toString()} value={values.newSpeed.toString()}
onOwnChange={(val) => updateField('newSpeed', Number(val))} onOwnChange={(val) => updateField('newSpeed', Number(val))}
description={t('audio.changeSpeed.speedDescription')} description={t('audio:changeSpeed.speedDescription')}
type="number" type="number"
/> />
</Box> </Box>
) )
}, },
{ {
title: t('audio.changeSpeed.outputFormat'), title: t('audio:changeSpeed.outputFormat'),
component: ( component: (
<Box mt={2}> <Box mt={2}>
<RadioGroup <RadioGroup
@ -98,19 +98,19 @@ export default function ChangeSpeed({
<ToolAudioInput <ToolAudioInput
value={input} value={input}
onChange={setInput} onChange={setInput}
title={t('audio.changeSpeed.inputTitle')} title={t('audio:changeSpeed.inputTitle')}
/> />
} }
resultComponent={ resultComponent={
loading ? ( loading ? (
<ToolFileResult <ToolFileResult
title={t('audio.changeSpeed.settingSpeed')} title={t('audio:changeSpeed.settingSpeed')}
value={null} value={null}
loading={true} loading={true}
/> />
) : ( ) : (
<ToolFileResult <ToolFileResult
title={t('audio.changeSpeed.resultTitle')} title={t('audio:changeSpeed.resultTitle')}
value={result} value={result}
extension={result ? result.name.split('.').pop() : undefined} extension={result ? result.name.split('.').pop() : undefined}
/> />
@ -121,7 +121,7 @@ export default function ChangeSpeed({
setInput={setInput} setInput={setInput}
compute={compute} compute={compute}
toolInfo={{ toolInfo={{
title: t('audio.changeSpeed.toolInfo.title', { title }), title: t('audio:changeSpeed.toolInfo.title', { title }),
description: longDescription description: longDescription
}} }}
/> />

View file

@ -22,8 +22,8 @@ export const tool = defineTool('audio', {
'This tool allows you to change the playback speed of audio files. You can speed up or slow down audio while maintaining the original pitch. Useful for podcasts, music, or any audio content where you want to adjust the playback speed.', 'This tool allows you to change the playback speed of audio files. You can speed up or slow down audio while maintaining the original pitch. Useful for podcasts, music, or any audio content where you want to adjust the playback speed.',
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'audio.changeSpeed.name', name: 'audio:changeSpeed.title',
description: 'audio.changeSpeed.description', description: 'audio:changeSpeed.description',
shortDescription: 'audio.changeSpeed.shortDescription' shortDescription: 'audio:changeSpeed.shortDescription'
} }
}); });

View file

@ -29,7 +29,7 @@ export default function ExtractAudio({
}) => { }) => {
return [ return [
{ {
title: t('audio.extractAudio.outputFormat'), title: t('audio:extractAudio.outputFormat'),
component: ( component: (
<Box> <Box>
<SelectWithDesc <SelectWithDesc
@ -42,7 +42,7 @@ export default function ExtractAudio({
{ label: 'MP3', value: 'mp3' }, { label: 'MP3', value: 'mp3' },
{ label: 'WAV', value: 'wav' } { label: 'WAV', value: 'wav' }
]} ]}
description={t('audio.extractAudio.outputFormatDescription')} description={t('audio:extractAudio.outputFormatDescription')}
/> />
</Box> </Box>
) )
@ -71,19 +71,19 @@ export default function ExtractAudio({
<ToolVideoInput <ToolVideoInput
value={file} value={file}
onChange={setFile} onChange={setFile}
title={t('audio.extractAudio.inputTitle')} title={t('audio:extractAudio.inputTitle')}
/> />
} }
resultComponent={ resultComponent={
loading ? ( loading ? (
<ToolFileResult <ToolFileResult
title={t('audio.extractAudio.extractingAudio')} title={t('audio:extractAudio.extractingAudio')}
value={null} value={null}
loading={true} loading={true}
/> />
) : ( ) : (
<ToolFileResult <ToolFileResult
title={t('audio.extractAudio.resultTitle')} title={t('audio:extractAudio.resultTitle')}
value={audioFile} value={audioFile}
/> />
) )
@ -92,7 +92,7 @@ export default function ExtractAudio({
getGroups={getGroups} getGroups={getGroups}
compute={compute} compute={compute}
toolInfo={{ toolInfo={{
title: t('audio.extractAudio.toolInfo.title', { title }), title: t('audio:extractAudio.toolInfo.title', { title }),
description: longDescription description: longDescription
}} }}
setInput={setFile} setInput={setFile}

View file

@ -24,8 +24,8 @@ export const tool = defineTool('audio', {
'This tool allows you to extract the audio track from a video file (such as MP4, MOV, AVI, etc.) and save it as a standalone audio file in your preferred format (AAC, MP3, or WAV). Useful for podcasts, music, or any scenario where you need just the audio from a video.', 'This tool allows you to extract the audio track from a video file (such as MP4, MOV, AVI, etc.) and save it as a standalone audio file in your preferred format (AAC, MP3, or WAV). Useful for podcasts, music, or any scenario where you need just the audio from a video.',
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'audio.extractAudio.name', name: 'audio:extractAudio.title',
description: 'audio.extractAudio.description', description: 'audio:extractAudio.description',
shortDescription: 'audio.extractAudio.shortDescription' shortDescription: 'audio:extractAudio.shortDescription'
} }
}); });

View file

@ -11,8 +11,8 @@ export const tool = defineTool('csv', {
keywords: ['csv', 'separator', 'delimiter', 'change'], keywords: ['csv', 'separator', 'delimiter', 'change'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'csv.changeCsvSeparator.name', name: 'csv:changeCsvSeparator.title',
description: 'csv.changeCsvSeparator.description', description: 'csv:changeCsvSeparator.description',
shortDescription: 'csv.changeCsvSeparator.shortDescription' shortDescription: 'csv:changeCsvSeparator.shortDescription'
} }
}); });

View file

@ -149,35 +149,35 @@ export default function CsvToJson({ title }: ToolComponentProps) {
exampleCards={exampleCards} exampleCards={exampleCards}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('csv.csvToJson.inputTitle')} title={t('csv:csvToJson.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('csv.csvToJson.resultTitle')} title={t('csv:csvToJson.resultTitle')}
value={result} value={result}
extension={'json'} extension={'json'}
/> />
} }
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('csv.csvToJson.inputCsvFormat'), title: t('csv:csvToJson.inputCsvFormat'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('csv.csvToJson.columnSeparator')} description={t('csv:csvToJson.columnSeparator')}
value={values.delimiter} value={values.delimiter}
onOwnChange={(val) => updateField('delimiter', val)} onOwnChange={(val) => updateField('delimiter', val)}
/> />
<TextFieldWithDesc <TextFieldWithDesc
description={t('csv.csvToJson.fieldQuote')} description={t('csv:csvToJson.fieldQuote')}
onOwnChange={(val) => updateField('quote', val)} onOwnChange={(val) => updateField('quote', val)}
value={values.quote} value={values.quote}
/> />
<TextFieldWithDesc <TextFieldWithDesc
description={t('csv.csvToJson.commentSymbol')} description={t('csv:csvToJson.commentSymbol')}
value={values.comment} value={values.comment}
onOwnChange={(val) => updateField('comment', val)} onOwnChange={(val) => updateField('comment', val)}
/> />
@ -185,26 +185,26 @@ export default function CsvToJson({ title }: ToolComponentProps) {
) )
}, },
{ {
title: t('csv.csvToJson.conversionOptions'), title: t('csv:csvToJson.conversionOptions'),
component: ( component: (
<Box> <Box>
<CheckboxWithDesc <CheckboxWithDesc
checked={values.useHeaders} checked={values.useHeaders}
onChange={(value) => updateField('useHeaders', value)} onChange={(value) => updateField('useHeaders', value)}
title={t('csv.csvToJson.useHeaders')} title={t('csv:csvToJson.useHeaders')}
description={t('csv.csvToJson.useHeadersDescription')} description={t('csv:csvToJson.useHeadersDescription')}
/> />
<CheckboxWithDesc <CheckboxWithDesc
checked={values.skipEmptyLines} checked={values.skipEmptyLines}
onChange={(value) => updateField('skipEmptyLines', value)} onChange={(value) => updateField('skipEmptyLines', value)}
title={t('csv.csvToJson.skipEmptyLines')} title={t('csv:csvToJson.skipEmptyLines')}
description={t('csv.csvToJson.skipEmptyLinesDescription')} description={t('csv:csvToJson.skipEmptyLinesDescription')}
/> />
<CheckboxWithDesc <CheckboxWithDesc
checked={values.dynamicTypes} checked={values.dynamicTypes}
onChange={(value) => updateField('dynamicTypes', value)} onChange={(value) => updateField('dynamicTypes', value)}
title={t('csv.csvToJson.dynamicTypes')} title={t('csv:csvToJson.dynamicTypes')}
description={t('csv.csvToJson.dynamicTypesDescription')} description={t('csv:csvToJson.dynamicTypesDescription')}
/> />
</Box> </Box>
) )

View file

@ -117,59 +117,59 @@ export default function FindIncompleteCsvRecords({
updateField updateField
}) => [ }) => [
{ {
title: t('csv.findIncompleteCsvRecords.csvInputOptions'), title: t('csv:findIncompleteCsvRecords.csvInputOptions'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
value={values.csvSeparator} value={values.csvSeparator}
onOwnChange={(val) => updateField('csvSeparator', val)} onOwnChange={(val) => updateField('csvSeparator', val)}
description={t( description={t(
'csv.findIncompleteCsvRecords.csvSeparatorDescription' 'csv:findIncompleteCsvRecords.csvSeparatorDescription'
)} )}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.quoteCharacter} value={values.quoteCharacter}
onOwnChange={(val) => updateField('quoteCharacter', val)} onOwnChange={(val) => updateField('quoteCharacter', val)}
description={t( description={t(
'csv.findIncompleteCsvRecords.quoteCharacterDescription' 'csv:findIncompleteCsvRecords.quoteCharacterDescription'
)} )}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.commentCharacter} value={values.commentCharacter}
onOwnChange={(val) => updateField('commentCharacter', val)} onOwnChange={(val) => updateField('commentCharacter', val)}
description={t( description={t(
'csv.findIncompleteCsvRecords.commentCharacterDescription' 'csv:findIncompleteCsvRecords.commentCharacterDescription'
)} )}
/> />
</Box> </Box>
) )
}, },
{ {
title: t('csv.findIncompleteCsvRecords.checkingOptions'), title: t('csv:findIncompleteCsvRecords.checkingOptions'),
component: ( component: (
<Box> <Box>
<CheckboxWithDesc <CheckboxWithDesc
checked={values.emptyLines} checked={values.emptyLines}
onChange={(value) => updateField('emptyLines', value)} onChange={(value) => updateField('emptyLines', value)}
title={t('csv.findIncompleteCsvRecords.deleteLinesWithNoData')} title={t('csv:findIncompleteCsvRecords.deleteLinesWithNoData')}
description={t( description={t(
'csv.findIncompleteCsvRecords.deleteLinesWithNoDataDescription' 'csv:findIncompleteCsvRecords.deleteLinesWithNoDataDescription'
)} )}
/> />
<CheckboxWithDesc <CheckboxWithDesc
checked={values.emptyValues} checked={values.emptyValues}
onChange={(value) => updateField('emptyValues', value)} onChange={(value) => updateField('emptyValues', value)}
title={t('csv.findIncompleteCsvRecords.findEmptyValues')} title={t('csv:findIncompleteCsvRecords.findEmptyValues')}
description={t( description={t(
'csv.findIncompleteCsvRecords.findEmptyValuesDescription' 'csv:findIncompleteCsvRecords.findEmptyValuesDescription'
)} )}
/> />
<CheckboxWithDesc <CheckboxWithDesc
checked={values.messageLimit} checked={values.messageLimit}
onChange={(value) => updateField('messageLimit', value)} onChange={(value) => updateField('messageLimit', value)}
title={t('csv.findIncompleteCsvRecords.limitNumberOfMessages')} title={t('csv:findIncompleteCsvRecords.limitNumberOfMessages')}
/> />
{values.messageLimit && ( {values.messageLimit && (
@ -179,7 +179,7 @@ export default function FindIncompleteCsvRecords({
type="number" type="number"
inputProps={{ min: 1 }} inputProps={{ min: 1 }}
description={t( description={t(
'csv.findIncompleteCsvRecords.messageLimitDescription' 'csv:findIncompleteCsvRecords.messageLimitDescription'
)} )}
/> />
)} )}
@ -193,14 +193,14 @@ export default function FindIncompleteCsvRecords({
input={input} input={input}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('csv.findIncompleteCsvRecords.inputTitle')} title={t('csv:findIncompleteCsvRecords.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('csv.findIncompleteCsvRecords.resultTitle')} title={t('csv:findIncompleteCsvRecords.resultTitle')}
value={result} value={result}
/> />
} }
@ -210,7 +210,7 @@ export default function FindIncompleteCsvRecords({
setInput={setInput} setInput={setInput}
compute={compute} compute={compute}
toolInfo={{ toolInfo={{
title: t('csv.findIncompleteCsvRecords.toolInfo.title', { title }), title: t('csv:findIncompleteCsvRecords.toolInfo.title', { title }),
description: longDescription description: longDescription
}} }}
/> />

View file

@ -14,8 +14,8 @@ export const tool = defineTool('csv', {
'This tool allows you to find incomplete or missing records in CSV data. It can detect missing columns, empty values, and other data quality issues in your CSV files. You can customize the CSV parsing options and set limits on error reporting.', 'This tool allows you to find incomplete or missing records in CSV data. It can detect missing columns, empty values, and other data quality issues in your CSV files. You can customize the CSV parsing options and set limits on error reporting.',
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'csv.findIncompleteCsvRecords.name', name: 'csv:findIncompleteCsvRecords.title',
description: 'csv.findIncompleteCsvRecords.description', description: 'csv:findIncompleteCsvRecords.description',
shortDescription: 'csv.findIncompleteCsvRecords.shortDescription' shortDescription: 'csv:findIncompleteCsvRecords.shortDescription'
} }
}); });

View file

@ -145,7 +145,7 @@ export default function InsertCsvColumns({
updateField updateField
}) => [ }) => [
{ {
title: t('csv.insertCsvColumns.csvToInsert'), title: t('csv:insertCsvColumns.csvToInsert'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
@ -153,40 +153,40 @@ export default function InsertCsvColumns({
rows={3} rows={3}
value={values.csvToInsert} value={values.csvToInsert}
onOwnChange={(val) => updateField('csvToInsert', val)} onOwnChange={(val) => updateField('csvToInsert', val)}
title={t('csv.insertCsvColumns.csvSeparator')} title={t('csv:insertCsvColumns.csvSeparator')}
description={t('csv.insertCsvColumns.csvToInsertDescription')} description={t('csv:insertCsvColumns.csvToInsertDescription')}
/> />
</Box> </Box>
) )
}, },
{ {
title: t('csv.insertCsvColumns.csvOptions'), title: t('csv:insertCsvColumns.csvOptions'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
value={values.separator} value={values.separator}
onOwnChange={(val) => updateField('separator', val)} onOwnChange={(val) => updateField('separator', val)}
description={t('csv.insertCsvColumns.separatorDescription')} description={t('csv:insertCsvColumns.separatorDescription')}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.quoteChar} value={values.quoteChar}
onOwnChange={(val) => updateField('quoteChar', val)} onOwnChange={(val) => updateField('quoteChar', val)}
description={t('csv.insertCsvColumns.quoteCharDescription')} description={t('csv:insertCsvColumns.quoteCharDescription')}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.commentCharacter} value={values.commentCharacter}
onOwnChange={(val) => updateField('commentCharacter', val)} onOwnChange={(val) => updateField('commentCharacter', val)}
description={t('csv.insertCsvColumns.commentCharacterDescription')} description={t('csv:insertCsvColumns.commentCharacterDescription')}
/> />
<SelectWithDesc <SelectWithDesc
selected={values.customFill} selected={values.customFill}
options={[ options={[
{ {
label: t('csv.insertCsvColumns.fillWithEmptyValues'), label: t('csv:insertCsvColumns.fillWithEmptyValues'),
value: false value: false
}, },
{ {
label: t('csv.insertCsvColumns.fillWithCustomValues'), label: t('csv:insertCsvColumns.fillWithCustomValues'),
value: true value: true
} }
]} ]}
@ -196,40 +196,40 @@ export default function InsertCsvColumns({
updateField('customFillValue', ''); // Reset custom fill value updateField('customFillValue', ''); // Reset custom fill value
} }
}} }}
description={t('csv.insertCsvColumns.customFillDescription')} description={t('csv:insertCsvColumns.customFillDescription')}
/> />
{values.customFill && ( {values.customFill && (
<TextFieldWithDesc <TextFieldWithDesc
value={values.customFillValue} value={values.customFillValue}
onOwnChange={(val) => updateField('customFillValue', val)} onOwnChange={(val) => updateField('customFillValue', val)}
description={t('csv.insertCsvColumns.customFillValueDescription')} description={t('csv:insertCsvColumns.customFillValueDescription')}
/> />
)} )}
</Box> </Box>
) )
}, },
{ {
title: t('csv.insertCsvColumns.positionOptions'), title: t('csv:insertCsvColumns.positionOptions'),
component: ( component: (
<Box> <Box>
<SelectWithDesc <SelectWithDesc
selected={values.insertingPosition} selected={values.insertingPosition}
options={[ options={[
{ {
label: t('csv.insertCsvColumns.prependColumns'), label: t('csv:insertCsvColumns.prependColumns'),
value: 'prepend' value: 'prepend'
}, },
{ {
label: t('csv.insertCsvColumns.appendColumns'), label: t('csv:insertCsvColumns.appendColumns'),
value: 'append' value: 'append'
}, },
{ {
label: t('csv.insertCsvColumns.customPosition'), label: t('csv:insertCsvColumns.customPosition'),
value: 'custom' value: 'custom'
} }
]} ]}
onChange={(value) => updateField('insertingPosition', value)} onChange={(value) => updateField('insertingPosition', value)}
description={t('csv.insertCsvColumns.insertingPositionDescription')} description={t('csv:insertCsvColumns.insertingPositionDescription')}
/> />
{values.insertingPosition === 'custom' && ( {values.insertingPosition === 'custom' && (
@ -237,17 +237,17 @@ export default function InsertCsvColumns({
selected={values.customPostionOptions} selected={values.customPostionOptions}
options={[ options={[
{ {
label: t('csv.insertCsvColumns.headerName'), label: t('csv:insertCsvColumns.headerName'),
value: 'headerName' value: 'headerName'
}, },
{ {
label: t('csv.insertCsvColumns.position'), label: t('csv:insertCsvColumns.position'),
value: 'rowNumber' value: 'rowNumber'
} }
]} ]}
onChange={(value) => updateField('customPostionOptions', value)} onChange={(value) => updateField('customPostionOptions', value)}
description={t( description={t(
'csv.insertCsvColumns.customPositionOptionsDescription' 'csv:insertCsvColumns.customPositionOptionsDescription'
)} )}
/> />
)} )}
@ -258,7 +258,7 @@ export default function InsertCsvColumns({
selected={values.headerName} selected={values.headerName}
options={headerOptions} options={headerOptions}
onChange={(value) => updateField('headerName', value)} onChange={(value) => updateField('headerName', value)}
description={t('csv.insertCsvColumns.headerNameDescription')} description={t('csv:insertCsvColumns.headerNameDescription')}
/> />
)} )}
@ -269,7 +269,7 @@ export default function InsertCsvColumns({
onOwnChange={(val) => onOwnChange={(val) =>
updateField('rowNumber', parseInt(val) || 0) updateField('rowNumber', parseInt(val) || 0)
} }
description={t('csv.insertCsvColumns.rowNumberDescription')} description={t('csv:insertCsvColumns.rowNumberDescription')}
type="number" type="number"
/> />
)} )}
@ -283,14 +283,14 @@ export default function InsertCsvColumns({
title={title} title={title}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('csv.insertCsvColumns.inputTitle')} title={t('csv:insertCsvColumns.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('csv.insertCsvColumns.resultTitle')} title={t('csv:insertCsvColumns.resultTitle')}
value={result} value={result}
extension={'csv'} extension={'csv'}
/> />
@ -301,8 +301,8 @@ export default function InsertCsvColumns({
input={input} input={input}
setInput={setInput} setInput={setInput}
toolInfo={{ toolInfo={{
title: t('csv.insertCsvColumns.toolInfo.title'), title: t('csv:insertCsvColumns.toolInfo.title'),
description: t('csv.insertCsvColumns.toolInfo.description') description: t('csv:insertCsvColumns.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
/> />

View file

@ -60,20 +60,20 @@ export default function ResizeImage({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('image.resize.resizeMethod'), title: t('image:resize.resizeMethod'),
component: ( component: (
<Box> <Box>
<SimpleRadio <SimpleRadio
onClick={() => updateField('resizeMethod', 'pixels')} onClick={() => updateField('resizeMethod', 'pixels')}
checked={values.resizeMethod === 'pixels'} checked={values.resizeMethod === 'pixels'}
description={t('image.resize.resizeByPixelsDescription')} description={t('image:resize.resizeByPixelsDescription')}
title={t('image.resize.resizeByPixels')} title={t('image:resize.resizeByPixels')}
/> />
<SimpleRadio <SimpleRadio
onClick={() => updateField('resizeMethod', 'percentage')} onClick={() => updateField('resizeMethod', 'percentage')}
checked={values.resizeMethod === 'percentage'} checked={values.resizeMethod === 'percentage'}
description={t('image.resize.resizeByPercentageDescription')} description={t('image:resize.resizeByPercentageDescription')}
title={t('image.resize.resizeByPercentage')} title={t('image:resize.resizeByPercentage')}
/> />
</Box> </Box>
) )
@ -81,7 +81,7 @@ export default function ResizeImage({ title }: ToolComponentProps) {
...(values.resizeMethod === 'pixels' ...(values.resizeMethod === 'pixels'
? [ ? [
{ {
title: t('image.resize.dimensionType'), title: t('image:resize.dimensionType'),
component: ( component: (
<Box> <Box>
<CheckboxWithDesc <CheckboxWithDesc
@ -89,29 +89,29 @@ export default function ResizeImage({ title }: ToolComponentProps) {
onChange={(value) => onChange={(value) =>
updateField('maintainAspectRatio', value) updateField('maintainAspectRatio', value)
} }
description={t('image.resize.maintainAspectRatioDescription')} description={t('image:resize.maintainAspectRatioDescription')}
title={t('image.resize.maintainAspectRatio')} title={t('image:resize.maintainAspectRatio')}
/> />
{values.maintainAspectRatio && ( {values.maintainAspectRatio && (
<Box> <Box>
<SimpleRadio <SimpleRadio
onClick={() => updateField('dimensionType', 'width')} onClick={() => updateField('dimensionType', 'width')}
checked={values.dimensionType === 'width'} checked={values.dimensionType === 'width'}
description={t('image.resize.setWidthDescription')} description={t('image:resize.setWidthDescription')}
title={t('image.resize.setWidth')} title={t('image:resize.setWidth')}
/> />
<SimpleRadio <SimpleRadio
onClick={() => updateField('dimensionType', 'height')} onClick={() => updateField('dimensionType', 'height')}
checked={values.dimensionType === 'height'} checked={values.dimensionType === 'height'}
description={t('image.resize.setHeightDescription')} description={t('image:resize.setHeightDescription')}
title={t('image.resize.setHeight')} title={t('image:resize.setHeight')}
/> />
</Box> </Box>
)} )}
<TextFieldWithDesc <TextFieldWithDesc
value={values.width} value={values.width}
onOwnChange={(val) => updateField('width', val)} onOwnChange={(val) => updateField('width', val)}
description={t('image.resize.widthDescription')} description={t('image:resize.widthDescription')}
disabled={ disabled={
values.maintainAspectRatio && values.maintainAspectRatio &&
values.dimensionType === 'height' values.dimensionType === 'height'
@ -125,7 +125,7 @@ export default function ResizeImage({ title }: ToolComponentProps) {
<TextFieldWithDesc <TextFieldWithDesc
value={values.height} value={values.height}
onOwnChange={(val) => updateField('height', val)} onOwnChange={(val) => updateField('height', val)}
description={t('image.resize.heightDescription')} description={t('image:resize.heightDescription')}
disabled={ disabled={
values.maintainAspectRatio && values.maintainAspectRatio &&
values.dimensionType === 'width' values.dimensionType === 'width'
@ -142,13 +142,13 @@ export default function ResizeImage({ title }: ToolComponentProps) {
] ]
: [ : [
{ {
title: t('image.resize.percentage'), title: t('image:resize.percentage'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
value={values.percentage} value={values.percentage}
onOwnChange={(val) => updateField('percentage', val)} onOwnChange={(val) => updateField('percentage', val)}
description={t('image.resize.percentageDescription')} description={t('image:resize.percentageDescription')}
inputProps={{ inputProps={{
'data-testid': 'percentage-input', 'data-testid': 'percentage-input',
type: 'number', type: 'number',
@ -175,19 +175,19 @@ export default function ResizeImage({ title }: ToolComponentProps) {
value={input} value={input}
onChange={setInput} onChange={setInput}
accept={['image/jpeg', 'image/png', 'image/svg+xml', 'image/gif']} accept={['image/jpeg', 'image/png', 'image/svg+xml', 'image/gif']}
title={t('image.resize.inputTitle')} title={t('image:resize.inputTitle')}
/> />
} }
resultComponent={ resultComponent={
<ToolFileResult <ToolFileResult
title={t('image.resize.resultTitle')} title={t('image:resize.resultTitle')}
value={result} value={result}
extension={input?.name.split('.').pop() || 'png'} extension={input?.name.split('.').pop() || 'png'}
/> />
} }
toolInfo={{ toolInfo={{
title: t('image.resize.toolInfo.title'), title: t('image:resize.toolInfo.title'),
description: t('image.resize.toolInfo.description') description: t('image:resize.toolInfo.description')
}} }}
/> />
); );

View file

@ -148,25 +148,5 @@
"typeSaturation": "संतृप्ति", "typeSaturation": "संतृप्ति",
"filterIntensity": "फ़िल्टर तीव्रता", "filterIntensity": "फ़िल्टर तीव्रता",
"intensityPlaceholder": "मान (0-100)" "intensityPlaceholder": "मान (0-100)"
},
"resize": {
"title": "छवि आकार बदलें",
"description": "छवि का आकार बदलें।",
"inputTitle": "इनपुट छवि",
"resultTitle": "आकार बदली गई छवि",
"resizeOptions": "आकार बदलने के विकल्प",
"resizeMethod": "आकार बदलने की विधि",
"methodPercentage": "प्रतिशत",
"methodPixels": "पिक्सेल",
"methodAspectRatio": "आकार अनुपात",
"width": "चौड़ाई",
"widthPlaceholder": "मान",
"height": "ऊंचाई",
"heightPlaceholder": "मान",
"maintainAspectRatio": "आकार अनुपात बनाए रखें",
"interpolationMethod": "इंटरपोलेशन विधि",
"methodNearest": "निकटतम",
"methodBilinear": "द्विरेखीय",
"methodBicubic": "द्विघन"
} }
} }

View file

@ -11,8 +11,8 @@ export const tool = defineTool('json', {
keywords: ['json', 'escape', 'characters', 'format'], keywords: ['json', 'escape', 'characters', 'format'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'json.escapeJson.name', name: 'json:escapeJson.title',
description: 'json.escapeJson.description', description: 'json:escapeJson.description',
shortDescription: 'json.escapeJson.shortDescription' shortDescription: 'json:escapeJson.shortDescription'
} }
}); });

View file

@ -11,8 +11,8 @@ export const tool = defineTool('json', {
keywords: ['json', 'xml', 'convert', 'transform'], keywords: ['json', 'xml', 'convert', 'transform'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'json.jsonToXml.name', name: 'json:jsonToXml.title',
description: 'json.jsonToXml.description', description: 'json:jsonToXml.description',
shortDescription: 'json.jsonToXml.shortDescription' shortDescription: 'json:jsonToXml.shortDescription'
} }
}); });

View file

@ -61,14 +61,14 @@ export default function MinifyJson({ title }: ToolComponentProps) {
title={title} title={title}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('json.minify.inputTitle')} title={t('json:minify.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('json.minify.resultTitle')} title={t('json:minify.resultTitle')}
value={result} value={result}
extension={'json'} extension={'json'}
/> />
@ -76,8 +76,8 @@ export default function MinifyJson({ title }: ToolComponentProps) {
initialValues={initialValues} initialValues={initialValues}
getGroups={null} getGroups={null}
toolInfo={{ toolInfo={{
title: t('json.minify.toolInfo.title'), title: t('json:minify.toolInfo.title'),
description: t('json.minify.toolInfo.description') description: t('json:minify.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
input={input} input={input}

View file

@ -11,8 +11,8 @@ export const tool = defineTool('json', {
keywords: ['json', 'minify', 'compress', 'whitespace'], keywords: ['json', 'minify', 'compress', 'whitespace'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'json.minify.name', name: 'json:minify.title',
description: 'json.minify.description', description: 'json:minify.description',
shortDescription: 'json.minify.shortDescription' shortDescription: 'json:minify.shortDescription'
} }
}); });

View file

@ -131,14 +131,14 @@ export default function PrettifyJson({ title }: ToolComponentProps) {
input={input} input={input}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('json.prettify.inputTitle')} title={t('json:prettify.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('json.prettify.resultTitle')} title={t('json:prettify.resultTitle')}
value={result} value={result}
extension={'json'} extension={'json'}
/> />
@ -146,14 +146,14 @@ export default function PrettifyJson({ title }: ToolComponentProps) {
initialValues={initialValues} initialValues={initialValues}
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('json.prettify.indentation'), title: t('json:prettify.indentation'),
component: ( component: (
<Box> <Box>
<RadioWithTextField <RadioWithTextField
checked={values.indentationType === 'space'} checked={values.indentationType === 'space'}
title={t('json.prettify.useSpaces')} title={t('json:prettify.useSpaces')}
fieldName={'indentationType'} fieldName={'indentationType'}
description={t('json.prettify.useSpacesDescription')} description={t('json:prettify.useSpacesDescription')}
value={values.spacesCount.toString()} value={values.spacesCount.toString()}
onRadioClick={() => updateField('indentationType', 'space')} onRadioClick={() => updateField('indentationType', 'space')}
onTextChange={(val) => onTextChange={(val) =>
@ -163,8 +163,8 @@ export default function PrettifyJson({ title }: ToolComponentProps) {
<SimpleRadio <SimpleRadio
onClick={() => updateField('indentationType', 'tab')} onClick={() => updateField('indentationType', 'tab')}
checked={values.indentationType === 'tab'} checked={values.indentationType === 'tab'}
description={t('json.prettify.useTabsDescription')} description={t('json:prettify.useTabsDescription')}
title={t('json.prettify.useTabs')} title={t('json:prettify.useTabs')}
/> />
</Box> </Box>
) )
@ -174,8 +174,8 @@ export default function PrettifyJson({ title }: ToolComponentProps) {
setInput={setInput} setInput={setInput}
exampleCards={exampleCards} exampleCards={exampleCards}
toolInfo={{ toolInfo={{
title: t('json.prettify.toolInfo.title'), title: t('json:prettify.toolInfo.title'),
description: t('json.prettify.toolInfo.description') description: t('json:prettify.toolInfo.description')
}} }}
/> />
); );

View file

@ -11,8 +11,8 @@ export const tool = defineTool('json', {
keywords: ['json', 'prettify', 'format', 'beautify'], keywords: ['json', 'prettify', 'format', 'beautify'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'json.prettify.name', name: 'json:prettify.title',
description: 'json.prettify.description', description: 'json:prettify.description',
shortDescription: 'json.prettify.shortDescription' shortDescription: 'json:prettify.shortDescription'
} }
}); });

View file

@ -11,8 +11,8 @@ export const tool = defineTool('json', {
keywords: ['json', 'stringify', 'serialize', 'convert'], keywords: ['json', 'stringify', 'serialize', 'convert'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'json.stringify.name', name: 'json:stringify.title',
description: 'json.stringify.description', description: 'json:stringify.description',
shortDescription: 'json.stringify.shortDescription' shortDescription: 'json:stringify.shortDescription'
} }
}); });

View file

@ -11,8 +11,8 @@ export const tool = defineTool('json', {
keywords: ['tsv', 'json', 'convert', 'tabular'], keywords: ['tsv', 'json', 'convert', 'tabular'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'json.tsvToJson.name', name: 'json:tsvToJson.title',
description: 'json.tsvToJson.description', description: 'json:tsvToJson.description',
shortDescription: 'json.tsvToJson.shortDescription' shortDescription: 'json:tsvToJson.shortDescription'
} }
}); });

View file

@ -55,9 +55,9 @@ export default function ValidateJson({ title }: ToolComponentProps) {
const { valid, error } = validateJson(input); const { valid, error } = validateJson(input);
if (valid) { if (valid) {
setResult(t('json.validateJson.validJson')); setResult(t('json:validateJson.validJson'));
} else { } else {
setResult(t('json.validateJson.invalidJson', { error })); setResult(t('json:validateJson.invalidJson', { error }));
} }
}; };
@ -66,22 +66,22 @@ export default function ValidateJson({ title }: ToolComponentProps) {
title={title} title={title}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('json.validateJson.inputTitle')} title={t('json:validateJson.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('json.validateJson.resultTitle')} title={t('json:validateJson.resultTitle')}
value={result} value={result}
/> />
} }
initialValues={{}} initialValues={{}}
getGroups={null} getGroups={null}
toolInfo={{ toolInfo={{
title: t('json.validateJson.toolInfo.title'), title: t('json:validateJson.toolInfo.title'),
description: t('json.validateJson.toolInfo.description') description: t('json:validateJson.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
input={input} input={input}

View file

@ -11,8 +11,8 @@ export const tool = defineTool('json', {
keywords: ['json', 'validate', 'check', 'syntax', 'errors'], keywords: ['json', 'validate', 'check', 'syntax', 'errors'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'json.validateJson.name', name: 'json:validateJson.title',
description: 'json.validateJson.description', description: 'json:validateJson.description',
shortDescription: 'json.validateJson.shortDescription' shortDescription: 'json:validateJson.shortDescription'
} }
}); });

View file

@ -136,53 +136,53 @@ export default function Duplicate({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('list.duplicate.splitOptions'), title: t('list:duplicate.splitOptions'),
component: ( component: (
<Box> <Box>
<SimpleRadio <SimpleRadio
onClick={() => updateField('splitOperatorType', 'symbol')} onClick={() => updateField('splitOperatorType', 'symbol')}
checked={values.splitOperatorType === 'symbol'} checked={values.splitOperatorType === 'symbol'}
title={t('list.duplicate.splitBySymbol')} title={t('list:duplicate.splitBySymbol')}
/> />
<SimpleRadio <SimpleRadio
onClick={() => updateField('splitOperatorType', 'regex')} onClick={() => updateField('splitOperatorType', 'regex')}
checked={values.splitOperatorType === 'regex'} checked={values.splitOperatorType === 'regex'}
title={t('list.duplicate.splitByRegex')} title={t('list:duplicate.splitByRegex')}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.splitSeparator} value={values.splitSeparator}
onOwnChange={(val) => updateField('splitSeparator', val)} onOwnChange={(val) => updateField('splitSeparator', val)}
description={t('list.duplicate.splitSeparatorDescription')} description={t('list:duplicate.splitSeparatorDescription')}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.joinSeparator} value={values.joinSeparator}
onOwnChange={(val) => updateField('joinSeparator', val)} onOwnChange={(val) => updateField('joinSeparator', val)}
description={t('list.duplicate.joinSeparatorDescription')} description={t('list:duplicate.joinSeparatorDescription')}
/> />
</Box> </Box>
) )
}, },
{ {
title: t('list.duplicate.duplicationOptions'), title: t('list:duplicate.duplicationOptions'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
value={values.copy} value={values.copy}
onOwnChange={(val) => updateField('copy', val)} onOwnChange={(val) => updateField('copy', val)}
description={t('list.duplicate.copyDescription')} description={t('list:duplicate.copyDescription')}
type="number" type="number"
/> />
<CheckboxWithDesc <CheckboxWithDesc
title={t('list.duplicate.concatenate')} title={t('list:duplicate.concatenate')}
checked={values.concatenate} checked={values.concatenate}
onChange={(checked) => updateField('concatenate', checked)} onChange={(checked) => updateField('concatenate', checked)}
description={t('list.duplicate.concatenateDescription')} description={t('list:duplicate.concatenateDescription')}
/> />
<CheckboxWithDesc <CheckboxWithDesc
title={t('list.duplicate.reverse')} title={t('list:duplicate.reverse')}
checked={values.reverse} checked={values.reverse}
onChange={(checked) => updateField('reverse', checked)} onChange={(checked) => updateField('reverse', checked)}
description={t('list.duplicate.reverseDescription')} description={t('list:duplicate.reverseDescription')}
/> />
</Box> </Box>
) )
@ -194,14 +194,14 @@ export default function Duplicate({ title }: ToolComponentProps) {
title={title} title={title}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('list.duplicate.inputTitle')} title={t('list:duplicate.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('list.duplicate.resultTitle')} title={t('list:duplicate.resultTitle')}
value={result} value={result}
/> />
} }
@ -209,8 +209,8 @@ export default function Duplicate({ title }: ToolComponentProps) {
getGroups={getGroups} getGroups={getGroups}
validationSchema={validationSchema} validationSchema={validationSchema}
toolInfo={{ toolInfo={{
title: t('list.duplicate.toolInfo.title'), title: t('list:duplicate.toolInfo.title'),
description: t('list.duplicate.toolInfo.description') description: t('list:duplicate.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
input={input} input={input}

View file

@ -12,8 +12,8 @@ export const tool = defineTool('list', {
keywords: ['duplicate'], keywords: ['duplicate'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'list.duplicate.name', name: 'list:duplicate.title',
description: 'list.duplicate.description', description: 'list:duplicate.description',
shortDescription: 'list.duplicate.shortDescription' shortDescription: 'list:duplicate.shortDescription'
} }
}); });

View file

@ -12,8 +12,8 @@ export const tool = defineTool('list', {
keywords: ['find', 'most', 'popular'], keywords: ['find', 'most', 'popular'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'list.findMostPopular.name', name: 'list:findMostPopular.title',
description: 'list.findMostPopular.description', description: 'list:findMostPopular.description',
shortDescription: 'list.findMostPopular.shortDescription' shortDescription: 'list:findMostPopular.shortDescription'
} }
}); });

View file

@ -66,27 +66,27 @@ export default function FindUnique() {
return ( return (
<ToolContent <ToolContent
title={t('list.findUnique.title')} title={t('list:findUnique.title')}
initialValues={initialValues} initialValues={initialValues}
compute={compute} compute={compute}
input={input} input={input}
setInput={setInput} setInput={setInput}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('list.findUnique.inputTitle')} title={t('list:findUnique.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('list.findUnique.resultTitle')} title={t('list:findUnique.resultTitle')}
value={result} value={result}
/> />
} }
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('list.findUnique.inputListDelimiter'), title: t('list:findUnique.inputListDelimiter'),
component: ( component: (
<Box> <Box>
{splitOperators.map(({ title, description, type }) => ( {splitOperators.map(({ title, description, type }) => (
@ -99,7 +99,7 @@ export default function FindUnique() {
/> />
))} ))}
<TextFieldWithDesc <TextFieldWithDesc
description={t('list.findUnique.delimiterDescription')} description={t('list:findUnique.delimiterDescription')}
value={values.splitSeparator} value={values.splitSeparator}
onOwnChange={(val) => updateField('splitSeparator', val)} onOwnChange={(val) => updateField('splitSeparator', val)}
/> />
@ -107,7 +107,7 @@ export default function FindUnique() {
) )
}, },
{ {
title: t('list.findUnique.outputListDelimiter'), title: t('list:findUnique.outputListDelimiter'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
@ -115,14 +115,14 @@ export default function FindUnique() {
onOwnChange={(value) => updateField('joinSeparator', value)} onOwnChange={(value) => updateField('joinSeparator', value)}
/> />
<CheckboxWithDesc <CheckboxWithDesc
title={t('list.findUnique.trimItems')} title={t('list:findUnique.trimItems')}
description={t('list.findUnique.trimItemsDescription')} description={t('list:findUnique.trimItemsDescription')}
checked={values.trimItems} checked={values.trimItems}
onChange={(value) => updateField('trimItems', value)} onChange={(value) => updateField('trimItems', value)}
/> />
<CheckboxWithDesc <CheckboxWithDesc
title={t('list.findUnique.skipEmptyItems')} title={t('list:findUnique.skipEmptyItems')}
description={t('list.findUnique.skipEmptyItemsDescription')} description={t('list:findUnique.skipEmptyItemsDescription')}
checked={values.deleteEmptyItems} checked={values.deleteEmptyItems}
onChange={(value) => updateField('deleteEmptyItems', value)} onChange={(value) => updateField('deleteEmptyItems', value)}
/> />
@ -130,20 +130,20 @@ export default function FindUnique() {
) )
}, },
{ {
title: t('list.findUnique.uniqueItemOptions'), title: t('list:findUnique.uniqueItemOptions'),
component: ( component: (
<Box> <Box>
<CheckboxWithDesc <CheckboxWithDesc
title={t('list.findUnique.findAbsolutelyUniqueItems')} title={t('list:findUnique.findAbsolutelyUniqueItems')}
description={t( description={t(
'list.findUnique.findAbsolutelyUniqueItemsDescription' 'list:findUnique.findAbsolutelyUniqueItemsDescription'
)} )}
checked={values.absolutelyUnique} checked={values.absolutelyUnique}
onChange={(value) => updateField('absolutelyUnique', value)} onChange={(value) => updateField('absolutelyUnique', value)}
/> />
<CheckboxWithDesc <CheckboxWithDesc
title={t('list.findUnique.caseSensitiveItems')} title={t('list:findUnique.caseSensitiveItems')}
description={t('list.findUnique.caseSensitiveItemsDescription')} description={t('list:findUnique.caseSensitiveItemsDescription')}
checked={values.caseSensitive} checked={values.caseSensitive}
onChange={(value) => updateField('caseSensitive', value)} onChange={(value) => updateField('caseSensitive', value)}
/> />

View file

@ -11,8 +11,8 @@ export const tool = defineTool('list', {
keywords: ['find', 'unique'], keywords: ['find', 'unique'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'list.findUnique.name', name: 'list:findUnique.title',
description: 'list.findUnique.description', description: 'list:findUnique.description',
shortDescription: 'list.findUnique.shortDescription' shortDescription: 'list:findUnique.shortDescription'
} }
}); });

View file

@ -81,18 +81,18 @@ export default function FindUnique({ title }: ToolComponentProps) {
input={input} input={input}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('list.group.inputTitle')} title={t('list:group.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('list.group.resultTitle')} value={result} /> <ToolTextResult title={t('list:group.resultTitle')} value={result} />
} }
initialValues={initialValues} initialValues={initialValues}
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('list.group.inputItemSeparator'), title: t('list:group.inputItemSeparator'),
component: ( component: (
<Box> <Box>
{splitOperators.map(({ title, description, type }) => ( {splitOperators.map(({ title, description, type }) => (
@ -107,7 +107,7 @@ export default function FindUnique({ title }: ToolComponentProps) {
/> />
))} ))}
<TextFieldWithDesc <TextFieldWithDesc
description={t('list.group.splitSeparatorDescription')} description={t('list:group.splitSeparatorDescription')}
value={values.splitSeparator} value={values.splitSeparator}
onOwnChange={(val) => updateField('splitSeparator', val)} onOwnChange={(val) => updateField('splitSeparator', val)}
/> />
@ -115,12 +115,12 @@ export default function FindUnique({ title }: ToolComponentProps) {
) )
}, },
{ {
title: t('list.group.groupSizeAndSeparators'), title: t('list:group.groupSizeAndSeparators'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
value={values.groupNumber} value={values.groupNumber}
description={t('list.group.groupNumberDescription')} description={t('list:group.groupNumberDescription')}
type={'number'} type={'number'}
onOwnChange={(value) => onOwnChange={(value) =>
updateField('groupNumber', formatNumber(value, 1)) updateField('groupNumber', formatNumber(value, 1))
@ -128,46 +128,46 @@ export default function FindUnique({ title }: ToolComponentProps) {
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.itemSeparator} value={values.itemSeparator}
description={t('list.group.itemSeparatorDescription')} description={t('list:group.itemSeparatorDescription')}
onOwnChange={(value) => updateField('itemSeparator', value)} onOwnChange={(value) => updateField('itemSeparator', value)}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.groupSeparator} value={values.groupSeparator}
description={t('list.group.groupSeparatorDescription')} description={t('list:group.groupSeparatorDescription')}
onOwnChange={(value) => updateField('groupSeparator', value)} onOwnChange={(value) => updateField('groupSeparator', value)}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.leftWrap} value={values.leftWrap}
description={t('list.group.leftWrapDescription')} description={t('list:group.leftWrapDescription')}
onOwnChange={(value) => updateField('leftWrap', value)} onOwnChange={(value) => updateField('leftWrap', value)}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.rightWrap} value={values.rightWrap}
description={t('list.group.rightWrapDescription')} description={t('list:group.rightWrapDescription')}
onOwnChange={(value) => updateField('rightWrap', value)} onOwnChange={(value) => updateField('rightWrap', value)}
/> />
</Box> </Box>
) )
}, },
{ {
title: t('list.group.emptyItemsAndPadding'), title: t('list:group.emptyItemsAndPadding'),
component: ( component: (
<Box> <Box>
<CheckboxWithDesc <CheckboxWithDesc
title={t('list.group.deleteEmptyItems')} title={t('list:group.deleteEmptyItems')}
description={t('list.group.deleteEmptyItemsDescription')} description={t('list:group.deleteEmptyItemsDescription')}
checked={values.deleteEmptyItems} checked={values.deleteEmptyItems}
onChange={(value) => updateField('deleteEmptyItems', value)} onChange={(value) => updateField('deleteEmptyItems', value)}
/> />
<CheckboxWithDesc <CheckboxWithDesc
title={t('list.group.padNonFullGroups')} title={t('list:group.padNonFullGroups')}
description={t('list.group.padNonFullGroupsDescription')} description={t('list:group.padNonFullGroupsDescription')}
checked={values.padNonFullGroup} checked={values.padNonFullGroup}
onChange={(value) => updateField('padNonFullGroup', value)} onChange={(value) => updateField('padNonFullGroup', value)}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.paddingChar} value={values.paddingChar}
description={t('list.group.paddingCharDescription')} description={t('list:group.paddingCharDescription')}
onOwnChange={(value) => updateField('paddingChar', value)} onOwnChange={(value) => updateField('paddingChar', value)}
/> />
</Box> </Box>

View file

@ -11,8 +11,8 @@ export const tool = defineTool('list', {
keywords: ['group'], keywords: ['group'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'list.group.name', name: 'list:group.title',
description: 'list.group.description', description: 'list:group.description',
shortDescription: 'list.group.shortDescription' shortDescription: 'list:group.shortDescription'
} }
}); });

View file

@ -121,7 +121,7 @@ export default function Reverse({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('list.reverse.splitterMode'), title: t('list:reverse.splitterMode'),
component: ( component: (
<Box> <Box>
{splitOperators.map(({ title, description, type }) => ( {splitOperators.map(({ title, description, type }) => (
@ -137,11 +137,11 @@ export default function Reverse({ title }: ToolComponentProps) {
) )
}, },
{ {
title: t('list.reverse.itemSeparator'), title: t('list:reverse.itemSeparator'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('list.reverse.itemSeparatorDescription')} description={t('list:reverse.itemSeparatorDescription')}
value={values.splitSeparator} value={values.splitSeparator}
onOwnChange={(val) => updateField('splitSeparator', val)} onOwnChange={(val) => updateField('splitSeparator', val)}
/> />
@ -149,11 +149,11 @@ export default function Reverse({ title }: ToolComponentProps) {
) )
}, },
{ {
title: t('list.reverse.outputListOptions'), title: t('list:reverse.outputListOptions'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('list.reverse.outputSeparatorDescription')} description={t('list:reverse.outputSeparatorDescription')}
value={values.joinSeparator} value={values.joinSeparator}
onOwnChange={(val) => updateField('joinSeparator', val)} onOwnChange={(val) => updateField('joinSeparator', val)}
/> />
@ -179,17 +179,17 @@ export default function Reverse({ title }: ToolComponentProps) {
setInput={setInput} setInput={setInput}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('list.reverse.inputTitle')} title={t('list:reverse.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('list.reverse.resultTitle')} value={result} /> <ToolTextResult title={t('list:reverse.resultTitle')} value={result} />
} }
toolInfo={{ toolInfo={{
title: t('list.reverse.toolInfo.title'), title: t('list:reverse.toolInfo.title'),
description: t('list.reverse.toolInfo.description') description: t('list:reverse.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
/> />

View file

@ -12,8 +12,8 @@ export const tool = defineTool('list', {
keywords: ['reverse'], keywords: ['reverse'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'list.reverse.name', name: 'list:reverse.title',
description: 'list.reverse.description', description: 'list:reverse.description',
shortDescription: 'list.reverse.shortDescription' shortDescription: 'list:reverse.shortDescription'
} }
}); });

View file

@ -12,8 +12,8 @@ export const tool = defineTool('list', {
keywords: ['rotate'], keywords: ['rotate'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'list.rotate.name', name: 'list:rotate.title',
description: 'list.rotate.description', description: 'list:rotate.description',
shortDescription: 'list.rotate.shortDescription' shortDescription: 'list:rotate.shortDescription'
} }
}); });

View file

@ -53,24 +53,24 @@ export default function Shuffle() {
return ( return (
<ToolContent <ToolContent
title={t('list.shuffle.title')} title={t('list:shuffle.title')}
initialValues={initialValues} initialValues={initialValues}
compute={compute} compute={compute}
input={input} input={input}
setInput={setInput} setInput={setInput}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('list.shuffle.inputTitle')} title={t('list:shuffle.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('list.shuffle.resultTitle')} value={result} /> <ToolTextResult title={t('list:shuffle.resultTitle')} value={result} />
} }
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('list.shuffle.inputListSeparator'), title: t('list:shuffle.inputListSeparator'),
component: ( component: (
<Box> <Box>
{splitOperators.map(({ title, description, type }) => ( {splitOperators.map(({ title, description, type }) => (
@ -83,7 +83,7 @@ export default function Shuffle() {
/> />
))} ))}
<TextFieldWithDesc <TextFieldWithDesc
description={t('list.shuffle.delimiterDescription')} description={t('list:shuffle.delimiterDescription')}
value={values.splitSeparator} value={values.splitSeparator}
onOwnChange={(val) => updateField('splitSeparator', val)} onOwnChange={(val) => updateField('splitSeparator', val)}
/> />
@ -91,11 +91,11 @@ export default function Shuffle() {
) )
}, },
{ {
title: t('list.shuffle.shuffledListLength'), title: t('list:shuffle.shuffledListLength'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('list.shuffle.outputLengthDescription')} description={t('list:shuffle.outputLengthDescription')}
value={values.length} value={values.length}
onOwnChange={(val) => updateField('length', val)} onOwnChange={(val) => updateField('length', val)}
/> />
@ -103,13 +103,13 @@ export default function Shuffle() {
) )
}, },
{ {
title: t('list.shuffle.shuffledListSeparator'), title: t('list:shuffle.shuffledListSeparator'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
value={values.joinSeparator} value={values.joinSeparator}
onOwnChange={(value) => updateField('joinSeparator', value)} onOwnChange={(value) => updateField('joinSeparator', value)}
description={t('list.shuffle.joinSeparatorDescription')} description={t('list:shuffle.joinSeparatorDescription')}
/> />
</Box> </Box>
) )

View file

@ -12,8 +12,8 @@ export const tool = defineTool('list', {
keywords: ['shuffle'], keywords: ['shuffle'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'list.shuffle.name', name: 'list:shuffle.title',
description: 'list.shuffle.description', description: 'list:shuffle.description',
shortDescription: 'list.shuffle.shortDescription' shortDescription: 'list:shuffle.shortDescription'
} }
}); });

View file

@ -72,18 +72,18 @@ export default function SplitText({ title }: ToolComponentProps) {
input={input} input={input}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('list.sort.inputTitle')} title={t('list:sort.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('list.sort.resultTitle')} value={result} /> <ToolTextResult title={t('list:sort.resultTitle')} value={result} />
} }
initialValues={initialValues} initialValues={initialValues}
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('list.sort.inputItemSeparator'), title: t('list:sort.inputItemSeparator'),
component: ( component: (
<Box> <Box>
{splitOperators.map(({ title, description, type }) => ( {splitOperators.map(({ title, description, type }) => (
@ -98,7 +98,7 @@ export default function SplitText({ title }: ToolComponentProps) {
/> />
))} ))}
<TextFieldWithDesc <TextFieldWithDesc
description={t('list.sort.splitSeparatorDescription')} description={t('list:sort.splitSeparatorDescription')}
value={values.splitSeparator} value={values.splitSeparator}
onOwnChange={(val) => updateField('splitSeparator', val)} onOwnChange={(val) => updateField('splitSeparator', val)}
/> />
@ -106,45 +106,45 @@ export default function SplitText({ title }: ToolComponentProps) {
) )
}, },
{ {
title: t('list.sort.sortMethod'), title: t('list:sort.sortMethod'),
component: ( component: (
<Box> <Box>
<SelectWithDesc <SelectWithDesc
selected={values.sortingMethod} selected={values.sortingMethod}
options={[ options={[
{ {
label: t('list.sort.sortOptions.alphabetic'), label: t('list:sort.sortOptions.alphabetic'),
value: 'alphabetic' value: 'alphabetic'
}, },
{ {
label: t('list.sort.sortOptions.numeric'), label: t('list:sort.sortOptions.numeric'),
value: 'numeric' value: 'numeric'
}, },
{ label: t('list.sort.sortOptions.length'), value: 'length' } { label: t('list:sort.sortOptions.length'), value: 'length' }
]} ]}
onChange={(value) => updateField('sortingMethod', value)} onChange={(value) => updateField('sortingMethod', value)}
description={t('list.sort.sortMethodDescription')} description={t('list:sort.sortMethodDescription')}
/> />
<SelectWithDesc <SelectWithDesc
selected={values.increasing} selected={values.increasing}
options={[ options={[
{ {
label: t('list.sort.orderOptions.increasing'), label: t('list:sort.orderOptions.increasing'),
value: true value: true
}, },
{ {
label: t('list.sort.orderOptions.decreasing'), label: t('list:sort.orderOptions.decreasing'),
value: false value: false
} }
]} ]}
onChange={(value) => { onChange={(value) => {
updateField('increasing', value); updateField('increasing', value);
}} }}
description={t('list.sort.orderDescription')} description={t('list:sort.orderDescription')}
/> />
<CheckboxWithDesc <CheckboxWithDesc
title={t('list.sort.caseSensitive')} title={t('list:sort.caseSensitive')}
description={t('list.sort.caseSensitiveDescription')} description={t('list:sort.caseSensitiveDescription')}
checked={values.caseSensitive} checked={values.caseSensitive}
onChange={(val) => updateField('caseSensitive', val)} onChange={(val) => updateField('caseSensitive', val)}
/> />
@ -152,17 +152,17 @@ export default function SplitText({ title }: ToolComponentProps) {
) )
}, },
{ {
title: t('list.sort.sortedItemProperties'), title: t('list:sort.sortedItemProperties'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('list.sort.joinSeparatorDescription')} description={t('list:sort.joinSeparatorDescription')}
value={values.joinSeparator} value={values.joinSeparator}
onOwnChange={(val) => updateField('joinSeparator', val)} onOwnChange={(val) => updateField('joinSeparator', val)}
/> />
<CheckboxWithDesc <CheckboxWithDesc
title={t('list.sort.removeDuplicates')} title={t('list:sort.removeDuplicates')}
description={t('list.sort.removeDuplicatesDescription')} description={t('list:sort.removeDuplicatesDescription')}
checked={values.removeDuplicated} checked={values.removeDuplicated}
onChange={(val) => updateField('removeDuplicated', val)} onChange={(val) => updateField('removeDuplicated', val)}
/> />

View file

@ -12,8 +12,8 @@ export const tool = defineTool('list', {
keywords: ['sort'], keywords: ['sort'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'list.sort.name', name: 'list:sort.title',
description: 'list.sort.description', description: 'list:sort.description',
shortDescription: 'list.sort.shortDescription' shortDescription: 'list:sort.shortDescription'
} }
}); });

View file

@ -11,8 +11,8 @@ export const tool = defineTool('list', {
keywords: ['truncate'], keywords: ['truncate'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'list.truncate.name', name: 'list:truncate.title',
description: 'list.truncate.description', description: 'list:truncate.description',
shortDescription: 'list.truncate.shortDescription' shortDescription: 'list:truncate.shortDescription'
} }
}); });

View file

@ -12,8 +12,8 @@ export const tool = defineTool('list', {
keywords: ['unwrap'], keywords: ['unwrap'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'list.unwrap.name', name: 'list:unwrap.title',
description: 'list.unwrap.description', description: 'list:unwrap.description',
shortDescription: 'list.unwrap.shortDescription' shortDescription: 'list:unwrap.shortDescription'
} }
}); });

View file

@ -119,50 +119,50 @@ export default function Wrap({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('list.wrap.splitOptions'), title: t('list:wrap.splitOptions'),
component: ( component: (
<Box> <Box>
<SimpleRadio <SimpleRadio
onClick={() => updateField('splitOperatorType', 'symbol')} onClick={() => updateField('splitOperatorType', 'symbol')}
checked={values.splitOperatorType === 'symbol'} checked={values.splitOperatorType === 'symbol'}
title={t('list.wrap.splitBySymbol')} title={t('list:wrap.splitBySymbol')}
/> />
<SimpleRadio <SimpleRadio
onClick={() => updateField('splitOperatorType', 'regex')} onClick={() => updateField('splitOperatorType', 'regex')}
checked={values.splitOperatorType === 'regex'} checked={values.splitOperatorType === 'regex'}
title={t('list.wrap.splitByRegex')} title={t('list:wrap.splitByRegex')}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.splitSeparator} value={values.splitSeparator}
onOwnChange={(val) => updateField('splitSeparator', val)} onOwnChange={(val) => updateField('splitSeparator', val)}
description={t('list.wrap.splitSeparatorDescription')} description={t('list:wrap.splitSeparatorDescription')}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.joinSeparator} value={values.joinSeparator}
onOwnChange={(val) => updateField('joinSeparator', val)} onOwnChange={(val) => updateField('joinSeparator', val)}
description={t('list.wrap.joinSeparatorDescription')} description={t('list:wrap.joinSeparatorDescription')}
/> />
<CheckboxWithDesc <CheckboxWithDesc
checked={values.deleteEmptyItems} checked={values.deleteEmptyItems}
onChange={(checked) => updateField('deleteEmptyItems', checked)} onChange={(checked) => updateField('deleteEmptyItems', checked)}
title={t('list.wrap.removeEmptyItems')} title={t('list:wrap.removeEmptyItems')}
/> />
</Box> </Box>
) )
}, },
{ {
title: t('list.wrap.wrapOptions'), title: t('list:wrap.wrapOptions'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
value={values.left} value={values.left}
onOwnChange={(val) => updateField('left', val)} onOwnChange={(val) => updateField('left', val)}
description={t('list.wrap.leftTextDescription')} description={t('list:wrap.leftTextDescription')}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.right} value={values.right}
onOwnChange={(val) => updateField('right', val)} onOwnChange={(val) => updateField('right', val)}
description={t('list.wrap.rightTextDescription')} description={t('list:wrap.rightTextDescription')}
/> />
</Box> </Box>
) )
@ -174,20 +174,20 @@ export default function Wrap({ title }: ToolComponentProps) {
title={title} title={title}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('list.wrap.inputTitle')} title={t('list:wrap.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('list.wrap.resultTitle')} value={result} /> <ToolTextResult title={t('list:wrap.resultTitle')} value={result} />
} }
initialValues={initialValues} initialValues={initialValues}
getGroups={getGroups} getGroups={getGroups}
validationSchema={validationSchema} validationSchema={validationSchema}
toolInfo={{ toolInfo={{
title: t('list.wrap.toolInfo.title'), title: t('list:wrap.toolInfo.title'),
description: t('list.wrap.toolInfo.description') description: t('list:wrap.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
input={input} input={input}

View file

@ -12,8 +12,8 @@ export const tool = defineTool('list', {
keywords: ['wrap'], keywords: ['wrap'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'list.wrap.name', name: 'list:wrap.title',
description: 'list.wrap.description', description: 'list:wrap.description',
shortDescription: 'list.wrap.shortDescription' shortDescription: 'list:wrap.shortDescription'
} }
}); });

View file

@ -80,7 +80,7 @@ export default function ArithmeticSequence({ title }: ToolComponentProps) {
inputComponent={null} inputComponent={null}
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('number.arithmeticSequence.resultTitle')} title={t('number:arithmeticSequence.resultTitle')}
value={result} value={result}
/> />
} }
@ -88,17 +88,17 @@ export default function ArithmeticSequence({ title }: ToolComponentProps) {
validationSchema={validationSchema} validationSchema={validationSchema}
exampleCards={exampleCards} exampleCards={exampleCards}
toolInfo={{ toolInfo={{
title: t('number.arithmeticSequence.toolInfo.title'), title: t('number:arithmeticSequence.toolInfo.title'),
description: t('number.arithmeticSequence.toolInfo.description') description: t('number:arithmeticSequence.toolInfo.description')
}} }}
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('number.arithmeticSequence.sequenceParameters'), title: t('number:arithmeticSequence.sequenceParameters'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t( description={t(
'number.arithmeticSequence.firstTermDescription' 'number:arithmeticSequence.firstTermDescription'
)} )}
value={values.firstTerm} value={values.firstTerm}
onOwnChange={(val) => updateField('firstTerm', val)} onOwnChange={(val) => updateField('firstTerm', val)}
@ -106,7 +106,7 @@ export default function ArithmeticSequence({ title }: ToolComponentProps) {
/> />
<TextFieldWithDesc <TextFieldWithDesc
description={t( description={t(
'number.arithmeticSequence.commonDifferenceDescription' 'number:arithmeticSequence.commonDifferenceDescription'
)} )}
value={values.commonDifference} value={values.commonDifference}
onOwnChange={(val) => updateField('commonDifference', val)} onOwnChange={(val) => updateField('commonDifference', val)}
@ -114,7 +114,7 @@ export default function ArithmeticSequence({ title }: ToolComponentProps) {
/> />
<TextFieldWithDesc <TextFieldWithDesc
description={t( description={t(
'number.arithmeticSequence.numberOfTermsDescription' 'number:arithmeticSequence.numberOfTermsDescription'
)} )}
value={values.numberOfTerms} value={values.numberOfTerms}
onOwnChange={(val) => updateField('numberOfTerms', val)} onOwnChange={(val) => updateField('numberOfTerms', val)}
@ -124,10 +124,10 @@ export default function ArithmeticSequence({ title }: ToolComponentProps) {
) )
}, },
{ {
title: t('number.arithmeticSequence.outputFormat'), title: t('number:arithmeticSequence.outputFormat'),
component: ( component: (
<TextFieldWithDesc <TextFieldWithDesc
description={t('number.arithmeticSequence.separatorDescription')} description={t('number:arithmeticSequence.separatorDescription')}
value={values.separator} value={values.separator}
onOwnChange={(val) => updateField('separator', val)} onOwnChange={(val) => updateField('separator', val)}
/> />

View file

@ -11,8 +11,8 @@ export const tool = defineTool('number', {
keywords: ['arithmetic', 'sequence', 'math', 'progression'], keywords: ['arithmetic', 'sequence', 'math', 'progression'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'number.arithmeticSequence.name', name: 'number:arithmeticSequence.title',
description: 'number.arithmeticSequence.description', description: 'number:arithmeticSequence.description',
shortDescription: 'number.arithmeticSequence.shortDescription' shortDescription: 'number:arithmeticSequence.shortDescription'
} }
}); });

View file

@ -36,23 +36,23 @@ export default function GenerateNumbers({ title }: ToolComponentProps) {
initialValues={initialValues} initialValues={initialValues}
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('number.generate.arithmeticSequenceOption'), title: t('number:generate.arithmeticSequenceOption'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('number.generate.startSequenceDescription')} description={t('number:generate.startSequenceDescription')}
value={values.firstValue} value={values.firstValue}
onOwnChange={(val) => updateField('firstValue', val)} onOwnChange={(val) => updateField('firstValue', val)}
type={'number'} type={'number'}
/> />
<TextFieldWithDesc <TextFieldWithDesc
description={t('number.generate.stepDescription')} description={t('number:generate.stepDescription')}
value={values.step} value={values.step}
onOwnChange={(val) => updateField('step', val)} onOwnChange={(val) => updateField('step', val)}
type={'number'} type={'number'}
/> />
<TextFieldWithDesc <TextFieldWithDesc
description={t('number.generate.numberOfElementsDescription')} description={t('number:generate.numberOfElementsDescription')}
value={values.numberOfNumbers} value={values.numberOfNumbers}
onOwnChange={(val) => updateField('numberOfNumbers', val)} onOwnChange={(val) => updateField('numberOfNumbers', val)}
type={'number'} type={'number'}
@ -61,10 +61,10 @@ export default function GenerateNumbers({ title }: ToolComponentProps) {
) )
}, },
{ {
title: t('number.generate.separator'), title: t('number:generate.separator'),
component: ( component: (
<TextFieldWithDesc <TextFieldWithDesc
description={t('number.generate.separatorDescription')} description={t('number:generate.separatorDescription')}
value={values.separator} value={values.separator}
onOwnChange={(val) => updateField('separator', val)} onOwnChange={(val) => updateField('separator', val)}
/> />
@ -74,7 +74,7 @@ export default function GenerateNumbers({ title }: ToolComponentProps) {
compute={compute} compute={compute}
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('number.generate.resultTitle')} title={t('number:generate.resultTitle')}
value={result} value={result}
/> />
} }

View file

@ -12,8 +12,8 @@ export const tool = defineTool('number', {
keywords: ['generate', 'random', 'numbers'], keywords: ['generate', 'random', 'numbers'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'number.generate.name', name: 'number:generate.title',
description: 'number.generate.description', description: 'number:generate.description',
shortDescription: 'number.generate.shortDescription' shortDescription: 'number:generate.shortDescription'
} }
}); });

View file

@ -128,7 +128,7 @@ export default function SumNumbers({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('number.sum.numberExtraction'), title: t('number:sum.numberExtraction'),
component: extractionTypes.map( component: extractionTypes.map(
({ title, description, type, withTextField, textValueAccessor }) => ({ title, description, type, withTextField, textValueAccessor }) =>
withTextField ? ( withTextField ? (
@ -158,11 +158,11 @@ export default function SumNumbers({ title }: ToolComponentProps) {
) )
}, },
{ {
title: t('number.sum.runningSum'), title: t('number:sum.runningSum'),
component: ( component: (
<CheckboxWithDesc <CheckboxWithDesc
title={t('number.sum.printRunningSum')} title={t('number:sum.printRunningSum')}
description={t('number.sum.printRunningSumDescription')} description={t('number:sum.printRunningSumDescription')}
checked={values.printRunningSum} checked={values.printRunningSum}
onChange={(value) => updateField('printRunningSum', value)} onChange={(value) => updateField('printRunningSum', value)}
/> />
@ -175,13 +175,13 @@ export default function SumNumbers({ title }: ToolComponentProps) {
input={input} input={input}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('number.sum.inputTitle')} title={t('number:sum.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('number.sum.resultTitle')} value={result} /> <ToolTextResult title={t('number:sum.resultTitle')} value={result} />
} }
initialValues={initialValues} initialValues={initialValues}
getGroups={getGroups} getGroups={getGroups}
@ -191,8 +191,8 @@ export default function SumNumbers({ title }: ToolComponentProps) {
}} }}
setInput={setInput} setInput={setInput}
toolInfo={{ toolInfo={{
title: t('number.sum.toolInfo.title'), title: t('number:sum.toolInfo.title'),
description: t('number.sum.toolInfo.description') description: t('number:sum.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
/> />

View file

@ -12,8 +12,8 @@ export const tool = defineTool('number', {
keywords: ['sum', 'add', 'calculate', 'total'], keywords: ['sum', 'add', 'calculate', 'total'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'number.sum.name', name: 'number:sum.title',
description: 'number.sum.description', description: 'number:sum.description',
shortDescription: 'number.sum.shortDescription' shortDescription: 'number:sum.shortDescription'
} }
}); });

View file

@ -80,7 +80,7 @@ export default function CompressPdf({
} catch (error) { } catch (error) {
console.error('Error getting PDF info:', error); console.error('Error getting PDF info:', error);
setFileInfo(null); setFileInfo(null);
showSnackBar(t('pdf.compressPdf.errorReadingPdf'), 'error'); showSnackBar(t('pdf:compressPdf.errorReadingPdf'), 'error');
} }
}; };
@ -112,7 +112,7 @@ export default function CompressPdf({
} catch (error) { } catch (error) {
console.error('Error compressing PDF:', error); console.error('Error compressing PDF:', error);
showSnackBar( showSnackBar(
t('pdf.compressPdf.errorCompressingPdf', { t('pdf:compressPdf.errorCompressingPdf', {
error: error instanceof Error ? error.message : String(error) error: error instanceof Error ? error.message : String(error)
}), }),
'error' 'error'
@ -130,18 +130,18 @@ export default function CompressPdf({
}[] = [ }[] = [
{ {
value: 'low', value: 'low',
label: t('pdf.compressPdf.lowCompression'), label: t('pdf:compressPdf.lowCompression'),
description: t('pdf.compressPdf.lowCompressionDescription') description: t('pdf:compressPdf.lowCompressionDescription')
}, },
{ {
value: 'medium', value: 'medium',
label: t('pdf.compressPdf.mediumCompression'), label: t('pdf:compressPdf.mediumCompression'),
description: t('pdf.compressPdf.mediumCompressionDescription') description: t('pdf:compressPdf.mediumCompressionDescription')
}, },
{ {
value: 'high', value: 'high',
label: t('pdf.compressPdf.highCompression'), label: t('pdf:compressPdf.highCompression'),
description: t('pdf.compressPdf.highCompressionDescription') description: t('pdf:compressPdf.highCompressionDescription')
} }
]; ];
@ -157,26 +157,26 @@ export default function CompressPdf({
value={input} value={input}
onChange={setInput} onChange={setInput}
accept={['application/pdf']} accept={['application/pdf']}
title={t('pdf.compressPdf.inputTitle')} title={t('pdf:compressPdf.inputTitle')}
/> />
} }
resultComponent={ resultComponent={
<ToolFileResult <ToolFileResult
title={t('pdf.compressPdf.resultTitle')} title={t('pdf:compressPdf.resultTitle')}
value={result} value={result}
extension={'pdf'} extension={'pdf'}
loading={isProcessing} loading={isProcessing}
loadingText={t('pdf.compressPdf.compressingPdf')} loadingText={t('pdf:compressPdf.compressingPdf')}
/> />
} }
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('pdf.compressPdf.compressionSettings'), title: t('pdf:compressPdf.compressionSettings'),
component: ( component: (
<Box> <Box>
<Box> <Box>
<Typography variant="subtitle2" sx={{ mb: 1 }}> <Typography variant="subtitle2" sx={{ mb: 1 }}>
{t('pdf.compressPdf.compressionLevel')} {t('pdf:compressPdf.compressionLevel')}
</Typography> </Typography>
{compressionOptions.map((option) => ( {compressionOptions.map((option) => (
@ -201,16 +201,16 @@ export default function CompressPdf({
}} }}
> >
<Typography variant="body2"> <Typography variant="body2">
{t('pdf.compressPdf.fileSize')}:{' '} {t('pdf:compressPdf.fileSize')}:{' '}
<strong>{fileInfo.size}</strong> <strong>{fileInfo.size}</strong>
</Typography> </Typography>
<Typography variant="body2"> <Typography variant="body2">
{t('pdf.compressPdf.pages')}:{' '} {t('pdf:compressPdf.pages')}:{' '}
<strong>{fileInfo.pages}</strong> <strong>{fileInfo.pages}</strong>
</Typography> </Typography>
{resultSize && ( {resultSize && (
<Typography variant="body2"> <Typography variant="body2">
{t('pdf.compressPdf.compressedFileSize')}:{' '} {t('pdf:compressPdf.compressedFileSize')}:{' '}
<strong>{resultSize}</strong> <strong>{resultSize}</strong>
</Typography> </Typography>
)} )}

View file

@ -26,8 +26,8 @@ export const tool = defineTool('pdf', {
'Compress PDF files securely in your browser using Ghostscript. Your files never leave your device, ensuring complete privacy while reducing file sizes for email sharing, uploading to websites, or saving storage space. Powered by WebAssembly technology.', 'Compress PDF files securely in your browser using Ghostscript. Your files never leave your device, ensuring complete privacy while reducing file sizes for email sharing, uploading to websites, or saving storage space. Powered by WebAssembly technology.',
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'pdf.compressPdf.name', name: 'pdf:compressPdf.title',
description: 'pdf.compressPdf.description', description: 'pdf:compressPdf.description',
shortDescription: 'pdf.compressPdf.shortDescription' shortDescription: 'pdf:compressPdf.shortDescription'
} }
}); });

View file

@ -44,23 +44,23 @@ export default function MergePdf({ title }: ToolComponentProps) {
setInput(pdfInputs); setInput(pdfInputs);
}} }}
accept={['application/pdf']} accept={['application/pdf']}
title={t('pdf.merge.inputTitle')} title={t('pdf:merge.inputTitle')}
type="pdf" type="pdf"
/> />
} }
getGroups={null} getGroups={null}
resultComponent={ resultComponent={
<ToolFileResult <ToolFileResult
title={t('pdf.merge.resultTitle')} title={t('pdf:merge.resultTitle')}
value={result} value={result}
extension={'pdf'} extension={'pdf'}
loading={isProcessing} loading={isProcessing}
loadingText={t('pdf.merge.loadingText')} loadingText={t('pdf:merge.loadingText')}
/> />
} }
toolInfo={{ toolInfo={{
title: t('pdf.merge.toolInfo.title'), title: t('pdf:merge.toolInfo.title'),
description: t('pdf.merge.toolInfo.description') description: t('pdf:merge.toolInfo.description')
}} }}
/> />
); );

View file

@ -10,8 +10,8 @@ export const meta = defineTool('pdf', {
keywords: ['pdf', 'merge', 'extract', 'pages', 'combine', 'document'], keywords: ['pdf', 'merge', 'extract', 'pages', 'combine', 'document'],
path: 'merge-pdf', path: 'merge-pdf',
i18n: { i18n: {
name: 'pdf.mergePdf.name', name: 'pdf:mergePdf.title',
description: 'pdf.mergePdf.description', description: 'pdf:mergePdf.description',
shortDescription: 'pdf.mergePdf.shortDescription' shortDescription: 'pdf:mergePdf.shortDescription'
} }
}); });

View file

@ -11,8 +11,8 @@ export const meta = defineTool('pdf', {
keywords: ['pdf', 'epub', 'convert', 'ebook'], keywords: ['pdf', 'epub', 'convert', 'ebook'],
path: 'pdf-to-epub', path: 'pdf-to-epub',
i18n: { i18n: {
name: 'pdf.pdfToEpub.name', name: 'pdf:pdfToEpub.title',
description: 'pdf.pdfToEpub.description', description: 'pdf:pdfToEpub.description',
shortDescription: 'pdf.pdfToEpub.shortDescription' shortDescription: 'pdf:pdfToEpub.shortDescription'
} }
}); });

View file

@ -25,8 +25,8 @@ export const tool = defineTool('pdf', {
'Add password protection to your PDF files securely in your browser. Your files never leave your device, ensuring complete privacy while securing your documents with password encryption. Perfect for protecting sensitive information, confidential documents, or personal data.', 'Add password protection to your PDF files securely in your browser. Your files never leave your device, ensuring complete privacy while securing your documents with password encryption. Perfect for protecting sensitive information, confidential documents, or personal data.',
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'pdf.protectPdf.name', name: 'pdf:protectPdf.title',
description: 'pdf.protectPdf.description', description: 'pdf:protectPdf.description',
shortDescription: 'pdf.protectPdf.shortDescription' shortDescription: 'pdf:protectPdf.shortDescription'
} }
}); });

View file

@ -92,7 +92,7 @@ export default function RotatePdf({
if (applyToAllPages) { if (applyToAllPages) {
setPageRangePreview( setPageRangePreview(
totalPages > 0 totalPages > 0
? t('pdf.rotatePdf.allPagesWillBeRotated', { count: totalPages }) ? t('pdf:rotatePdf.allPagesWillBeRotated', { count: totalPages })
: '' : ''
); );
return; return;
@ -105,7 +105,7 @@ export default function RotatePdf({
try { try {
const count = parsePageRanges(pageRanges, totalPages).length; const count = parsePageRanges(pageRanges, totalPages).length;
setPageRangePreview(t('pdf.rotatePdf.pagesWillBeRotated', { count })); setPageRangePreview(t('pdf:rotatePdf.pagesWillBeRotated', { count }));
} catch (error) { } catch (error) {
setPageRangePreview(''); setPageRangePreview('');
} }
@ -125,9 +125,9 @@ export default function RotatePdf({
} }
}; };
const angleOptions: { value: RotationAngle; label: string }[] = [ const angleOptions: { value: RotationAngle; label: string }[] = [
{ value: 90, label: t('pdf.rotatePdf.angleOptions.clockwise90') }, { value: 90, label: t('pdf:rotatePdf.angleOptions.clockwise90') },
{ value: 180, label: t('pdf.rotatePdf.angleOptions.upsideDown180') }, { value: 180, label: t('pdf:rotatePdf.angleOptions.upsideDown180') },
{ value: 270, label: t('pdf.rotatePdf.angleOptions.counterClockwise270') } { value: 270, label: t('pdf:rotatePdf.angleOptions.counterClockwise270') }
]; ];
return ( return (
<ToolContent <ToolContent
@ -142,25 +142,25 @@ export default function RotatePdf({
value={input} value={input}
onChange={setInput} onChange={setInput}
accept={['application/pdf']} accept={['application/pdf']}
title={t('pdf.rotatePdf.inputTitle')} title={t('pdf:rotatePdf.inputTitle')}
/> />
} }
resultComponent={ resultComponent={
<ToolFileResult <ToolFileResult
title={t('pdf.rotatePdf.resultTitle')} title={t('pdf:rotatePdf.resultTitle')}
value={result} value={result}
extension={'pdf'} extension={'pdf'}
loading={isProcessing} loading={isProcessing}
loadingText={t('pdf.rotatePdf.rotatingPages')} loadingText={t('pdf:rotatePdf.rotatingPages')}
/> />
} }
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('pdf.rotatePdf.rotationSettings'), title: t('pdf:rotatePdf.rotationSettings'),
component: ( component: (
<Box> <Box>
<Typography variant="subtitle2" sx={{ mb: 1 }}> <Typography variant="subtitle2" sx={{ mb: 1 }}>
{t('pdf.rotatePdf.rotationAngle')} {t('pdf:rotatePdf.rotationAngle')}
</Typography> </Typography>
{angleOptions.map((angleOption) => ( {angleOptions.map((angleOption) => (
<SimpleRadio <SimpleRadio
@ -183,7 +183,7 @@ export default function RotatePdf({
}} }}
/> />
} }
label={t('pdf.rotatePdf.applyToAllPages')} label={t('pdf:rotatePdf.applyToAllPages')}
/> />
</Box> </Box>
@ -191,7 +191,7 @@ export default function RotatePdf({
<Box sx={{ mt: 2 }}> <Box sx={{ mt: 2 }}>
{totalPages > 0 && ( {totalPages > 0 && (
<Typography variant="body2" sx={{ mb: 1 }}> <Typography variant="body2" sx={{ mb: 1 }}>
{t('pdf.rotatePdf.pdfPageCount', { count: totalPages })} {t('pdf:rotatePdf.pdfPageCount', { count: totalPages })}
</Typography> </Typography>
)} )}
<TextFieldWithDesc <TextFieldWithDesc
@ -199,8 +199,8 @@ export default function RotatePdf({
onOwnChange={(val) => { onOwnChange={(val) => {
updateField('pageRanges', val); updateField('pageRanges', val);
}} }}
description={t('pdf.rotatePdf.pageRangesDescription')} description={t('pdf:rotatePdf.pageRangesDescription')}
placeholder={t('pdf.rotatePdf.pageRangesPlaceholder')} placeholder={t('pdf:rotatePdf.pageRangesPlaceholder')}
/> />
{pageRangePreview && ( {pageRangePreview && (
<Typography <Typography
@ -218,8 +218,8 @@ export default function RotatePdf({
]} ]}
onValuesChange={onValuesChange} onValuesChange={onValuesChange}
toolInfo={{ toolInfo={{
title: t('pdf.rotatePdf.toolInfo.title'), title: t('pdf:rotatePdf.toolInfo.title'),
description: t('pdf.rotatePdf.toolInfo.description') description: t('pdf:rotatePdf.toolInfo.description')
}} }}
/> />
); );

View file

@ -85,7 +85,7 @@ export default function SplitPdf({ title }: ToolComponentProps) {
} }
try { try {
const count = parsePageRanges(pageRanges, totalPages).length; const count = parsePageRanges(pageRanges, totalPages).length;
setPageRangePreview(t('pdf.splitPdf.pageExtractionPreview', { count })); setPageRangePreview(t('pdf:splitPdf.pageExtractionPreview', { count }));
} catch (error) { } catch (error) {
setPageRangePreview(''); setPageRangePreview('');
} }
@ -118,26 +118,26 @@ export default function SplitPdf({ title }: ToolComponentProps) {
value={input} value={input}
onChange={setInput} onChange={setInput}
accept={['application/pdf']} accept={['application/pdf']}
title={t('pdf.splitPdf.inputTitle')} title={t('pdf:splitPdf.inputTitle')}
/> />
} }
resultComponent={ resultComponent={
<ToolFileResult <ToolFileResult
title={t('pdf.splitPdf.resultTitle')} title={t('pdf:splitPdf.resultTitle')}
value={result} value={result}
extension={'pdf'} extension={'pdf'}
loading={isProcessing} loading={isProcessing}
loadingText={t('pdf.splitPdf.extractingPages')} loadingText={t('pdf:splitPdf.extractingPages')}
/> />
} }
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('pdf.splitPdf.pageSelection'), title: t('pdf:splitPdf.pageSelection'),
component: ( component: (
<Box> <Box>
{totalPages > 0 && ( {totalPages > 0 && (
<Typography variant="body2" sx={{ mb: 1 }}> <Typography variant="body2" sx={{ mb: 1 }}>
{t('pdf.splitPdf.pdfPageCount', { count: totalPages })} {t('pdf:splitPdf.pdfPageCount', { count: totalPages })}
</Typography> </Typography>
)} )}
<TextFieldWithDesc <TextFieldWithDesc
@ -145,8 +145,8 @@ export default function SplitPdf({ title }: ToolComponentProps) {
onOwnChange={(val) => { onOwnChange={(val) => {
updateField('pageRanges', val); updateField('pageRanges', val);
}} }}
description={t('pdf.splitPdf.pageRangesDescription')} description={t('pdf:splitPdf.pageRangesDescription')}
placeholder={t('pdf.splitPdf.pageRangesPlaceholder')} placeholder={t('pdf:splitPdf.pageRangesPlaceholder')}
/> />
{pageRangePreview && ( {pageRangePreview && (
<Typography <Typography
@ -162,8 +162,8 @@ export default function SplitPdf({ title }: ToolComponentProps) {
]} ]}
onValuesChange={onValuesChange} onValuesChange={onValuesChange}
toolInfo={{ toolInfo={{
title: t('pdf.splitPdf.toolInfo.title'), title: t('pdf:splitPdf.toolInfo.title'),
description: t('pdf.splitPdf.toolInfo.description') description: t('pdf:splitPdf.toolInfo.description')
}} }}
/> />
); );

View file

@ -11,8 +11,8 @@ export const meta = defineTool('pdf', {
keywords: ['pdf', 'split', 'extract', 'pages', 'range', 'document'], keywords: ['pdf', 'split', 'extract', 'pages', 'range', 'document'],
path: 'split-pdf', path: 'split-pdf',
i18n: { i18n: {
name: 'pdf.splitPdf.name', name: 'pdf:splitPdf.title',
description: 'pdf.splitPdf.description', description: 'pdf:splitPdf.description',
shortDescription: 'pdf.splitPdf.shortDescription' shortDescription: 'pdf:splitPdf.shortDescription'
} }
}); });

View file

@ -47,18 +47,18 @@ export default function Base64({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('string.base64.optionsTitle'), title: t('string:base64.optionsTitle'),
component: ( component: (
<Box> <Box>
<SimpleRadio <SimpleRadio
onClick={() => updateField('mode', 'encode')} onClick={() => updateField('mode', 'encode')}
checked={values.mode === 'encode'} checked={values.mode === 'encode'}
title={t('string.base64.encode')} title={t('string:base64.encode')}
/> />
<SimpleRadio <SimpleRadio
onClick={() => updateField('mode', 'decode')} onClick={() => updateField('mode', 'decode')}
checked={values.mode === 'decode'} checked={values.mode === 'decode'}
title={t('string.base64.decode')} title={t('string:base64.decode')}
/> />
</Box> </Box>
) )
@ -70,19 +70,19 @@ export default function Base64({ title }: ToolComponentProps) {
title={title} title={title}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('string.base64.inputTitle')} title={t('string:base64.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('string.base64.resultTitle')} value={result} /> <ToolTextResult title={t('string:base64.resultTitle')} value={result} />
} }
initialValues={initialValues} initialValues={initialValues}
getGroups={getGroups} getGroups={getGroups}
toolInfo={{ toolInfo={{
title: t('string.base64.toolInfo.title'), title: t('string:base64.toolInfo.title'),
description: t('string.base64.toolInfo.description') description: t('string:base64.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
input={input} input={input}

View file

@ -11,8 +11,8 @@ export const tool = defineTool('string', {
keywords: ['base64'], keywords: ['base64'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.base64.name', name: 'string:base64.title',
description: 'string.base64.description', description: 'string:base64.description',
shortDescription: 'string.base64.shortDescription' shortDescription: 'string:base64.shortDescription'
} }
}); });

View file

@ -14,9 +14,9 @@ export const tool = defineTool('string', {
keywords: ['text', 'censor', 'words', 'characters'], keywords: ['text', 'censor', 'words', 'characters'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.censor.name', name: 'string:censor.title',
description: 'string.censor.description', description: 'string:censor.description',
shortDescription: 'string.censor.shortDescription', shortDescription: 'string:censor.shortDescription',
longDescription: 'string.censor.longDescription' longDescription: 'string:censor.longDescription'
} }
}); });

View file

@ -14,8 +14,8 @@ export const tool = defineTool('string', {
keywords: ['create', 'palindrome'], keywords: ['create', 'palindrome'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.createPalindrome.name', name: 'string:createPalindrome.title',
description: 'string.createPalindrome.description', description: 'string:createPalindrome.description',
shortDescription: 'string.createPalindrome.shortDescription' shortDescription: 'string:createPalindrome.shortDescription'
} }
}); });

View file

@ -12,8 +12,8 @@ export const tool = defineTool('string', {
keywords: ['extract', 'substring'], keywords: ['extract', 'substring'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.extractSubstring.name', name: 'string:extractSubstring.title',
description: 'string.extractSubstring.description', description: 'string:extractSubstring.description',
shortDescription: 'string.extractSubstring.shortDescription' shortDescription: 'string:extractSubstring.shortDescription'
} }
}); });

View file

@ -121,18 +121,18 @@ export default function JoinText({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('string.join.textMergedOptions'), title: t('string:join.textMergedOptions'),
component: ( component: (
<TextFieldWithDesc <TextFieldWithDesc
placeholder={t('string.join.joinCharacterPlaceholder')} placeholder={t('string:join.joinCharacterPlaceholder')}
value={values['joinCharacter']} value={values['joinCharacter']}
onOwnChange={(value) => updateField(mergeOptions.accessor, value)} onOwnChange={(value) => updateField(mergeOptions.accessor, value)}
description={t('string.join.joinCharacterDescription')} description={t('string:join.joinCharacterDescription')}
/> />
) )
}, },
{ {
title: t('string.join.blankLinesAndTrailingSpaces'), title: t('string:join.blankLinesAndTrailingSpaces'),
component: blankTrailingOptions.map((option) => ( component: blankTrailingOptions.map((option) => (
<CheckboxWithDesc <CheckboxWithDesc
key={option.accessor} key={option.accessor}
@ -153,18 +153,18 @@ export default function JoinText({ title }: ToolComponentProps) {
setInput={setInput} setInput={setInput}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('string.join.inputTitle')} title={t('string:join.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('string.join.resultTitle')} value={result} /> <ToolTextResult title={t('string:join.resultTitle')} value={result} />
} }
getGroups={getGroups} getGroups={getGroups}
toolInfo={{ toolInfo={{
title: t('string.join.toolInfo.title'), title: t('string:join.toolInfo.title'),
description: t('string.join.toolInfo.description') description: t('string:join.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
/> />

View file

@ -11,8 +11,8 @@ export const tool = defineTool('string', {
keywords: ['join'], keywords: ['join'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.join.name', name: 'string:join.title',
description: 'string.join.description', description: 'string:join.description',
shortDescription: 'string.join.shortDescription' shortDescription: 'string:join.shortDescription'
} }
}); });

View file

@ -12,8 +12,8 @@ export const tool = defineTool('string', {
keywords: ['palindrome'], keywords: ['palindrome'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.palindrome.name', name: 'string:palindrome.title',
description: 'string.palindrome.description', description: 'string:palindrome.description',
shortDescription: 'string.palindrome.shortDescription' shortDescription: 'string:palindrome.shortDescription'
} }
}); });

View file

@ -95,33 +95,33 @@ export default function Quote({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('string.quote.quoteOptions'), title: t('string:quote.quoteOptions'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
value={values.leftQuote} value={values.leftQuote}
onOwnChange={(val) => updateField('leftQuote', val)} onOwnChange={(val) => updateField('leftQuote', val)}
description={t('string.quote.leftQuoteDescription')} description={t('string:quote.leftQuoteDescription')}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.rightQuote} value={values.rightQuote}
onOwnChange={(val) => updateField('rightQuote', val)} onOwnChange={(val) => updateField('rightQuote', val)}
description={t('string.quote.rightQuoteDescription')} description={t('string:quote.rightQuoteDescription')}
/> />
<CheckboxWithDesc <CheckboxWithDesc
checked={values.doubleQuotation} checked={values.doubleQuotation}
onChange={(checked) => updateField('doubleQuotation', checked)} onChange={(checked) => updateField('doubleQuotation', checked)}
title={t('string.quote.allowDoubleQuotation')} title={t('string:quote.allowDoubleQuotation')}
/> />
<CheckboxWithDesc <CheckboxWithDesc
checked={values.emptyQuoting} checked={values.emptyQuoting}
onChange={(checked) => updateField('emptyQuoting', checked)} onChange={(checked) => updateField('emptyQuoting', checked)}
title={t('string.quote.quoteEmptyLines')} title={t('string:quote.quoteEmptyLines')}
/> />
<CheckboxWithDesc <CheckboxWithDesc
checked={values.multiLine} checked={values.multiLine}
onChange={(checked) => updateField('multiLine', checked)} onChange={(checked) => updateField('multiLine', checked)}
title={t('string.quote.processAsMultiLine')} title={t('string:quote.processAsMultiLine')}
/> />
</Box> </Box>
) )
@ -133,19 +133,19 @@ export default function Quote({ title }: ToolComponentProps) {
title={title} title={title}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('string.quote.inputTitle')} title={t('string:quote.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('string.quote.resultTitle')} value={result} /> <ToolTextResult title={t('string:quote.resultTitle')} value={result} />
} }
initialValues={initialValues} initialValues={initialValues}
getGroups={getGroups} getGroups={getGroups}
toolInfo={{ toolInfo={{
title: t('string.quote.toolInfo.title'), title: t('string:quote.toolInfo.title'),
description: t('string.quote.toolInfo.description') description: t('string:quote.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
input={input} input={input}

View file

@ -12,8 +12,8 @@ export const tool = defineTool('string', {
keywords: ['quote'], keywords: ['quote'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.quote.name', name: 'string:quote.title',
description: 'string.quote.description', description: 'string:quote.description',
shortDescription: 'string.quote.shortDescription' shortDescription: 'string:quote.shortDescription'
} }
}); });

View file

@ -12,8 +12,8 @@ export const tool = defineTool('string', {
keywords: ['randomize', 'case'], keywords: ['randomize', 'case'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.randomizeCase.name', name: 'string:randomizeCase.title',
description: 'string.randomizeCase.description', description: 'string:randomizeCase.description',
shortDescription: 'string.randomizeCase.shortDescription' shortDescription: 'string:randomizeCase.shortDescription'
} }
}); });

View file

@ -11,8 +11,8 @@ export const tool = defineTool('string', {
keywords: ['remove', 'duplicate', 'lines'], keywords: ['remove', 'duplicate', 'lines'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.removeDuplicateLines.name', name: 'string:removeDuplicateLines.title',
description: 'string.removeDuplicateLines.description', description: 'string:removeDuplicateLines.description',
shortDescription: 'string.removeDuplicateLines.shortDescription' shortDescription: 'string:removeDuplicateLines.shortDescription'
} }
}); });

View file

@ -62,12 +62,12 @@ export default function Replacer({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('string.repeat.textRepetitions'), title: t('string:repeat.textRepetitions'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('string.repeat.repeatAmountDescription')} description={t('string:repeat.repeatAmountDescription')}
placeholder={t('string.repeat.numberPlaceholder')} placeholder={t('string:repeat.numberPlaceholder')}
value={values.repeatAmount} value={values.repeatAmount}
onOwnChange={(val) => updateField('repeatAmount', val)} onOwnChange={(val) => updateField('repeatAmount', val)}
type={'number'} type={'number'}
@ -76,12 +76,12 @@ export default function Replacer({ title }: ToolComponentProps) {
) )
}, },
{ {
title: t('string.repeat.repetitionsDelimiter'), title: t('string:repeat.repetitionsDelimiter'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('string.repeat.delimiterDescription')} description={t('string:repeat.delimiterDescription')}
placeholder={t('string.repeat.delimiterPlaceholder')} placeholder={t('string:repeat.delimiterPlaceholder')}
value={values.delimiter} value={values.delimiter}
onOwnChange={(val) => updateField('delimiter', val)} onOwnChange={(val) => updateField('delimiter', val)}
type={'text'} type={'text'}
@ -101,17 +101,17 @@ export default function Replacer({ title }: ToolComponentProps) {
setInput={setInput} setInput={setInput}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('string.repeat.inputTitle')} title={t('string:repeat.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('string.repeat.resultTitle')} value={result} /> <ToolTextResult title={t('string:repeat.resultTitle')} value={result} />
} }
toolInfo={{ toolInfo={{
title: t('string.repeat.toolInfo.title'), title: t('string:repeat.toolInfo.title'),
description: t('string.repeat.toolInfo.description') description: t('string:repeat.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
/> />

View file

@ -11,8 +11,8 @@ export const tool = defineTool('string', {
keywords: ['text', 'repeat'], keywords: ['text', 'repeat'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.repeat.name', name: 'string:repeat.title',
description: 'string.repeat.description', description: 'string:repeat.description',
shortDescription: 'string.repeat.shortDescription' shortDescription: 'string:repeat.shortDescription'
} }
}); });

View file

@ -76,27 +76,27 @@ export default function Reverse({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('string.reverse.reversalOptions'), title: t('string:reverse.reversalOptions'),
component: [ component: [
<CheckboxWithDesc <CheckboxWithDesc
key="multiLine" key="multiLine"
checked={values.multiLine} checked={values.multiLine}
title={t('string.reverse.processMultiLine')} title={t('string:reverse.processMultiLine')}
description={t('string.reverse.processMultiLineDescription')} description={t('string:reverse.processMultiLineDescription')}
onChange={(val) => updateField('multiLine', val)} onChange={(val) => updateField('multiLine', val)}
/>, />,
<CheckboxWithDesc <CheckboxWithDesc
key="emptyItems" key="emptyItems"
checked={values.emptyItems} checked={values.emptyItems}
title={t('string.reverse.skipEmptyLines')} title={t('string:reverse.skipEmptyLines')}
description={t('string.reverse.skipEmptyLinesDescription')} description={t('string:reverse.skipEmptyLinesDescription')}
onChange={(val) => updateField('emptyItems', val)} onChange={(val) => updateField('emptyItems', val)}
/>, />,
<CheckboxWithDesc <CheckboxWithDesc
key="trim" key="trim"
checked={values.trim} checked={values.trim}
title={t('string.reverse.trimWhitespace')} title={t('string:reverse.trimWhitespace')}
description={t('string.reverse.trimWhitespaceDescription')} description={t('string:reverse.trimWhitespaceDescription')}
onChange={(val) => updateField('trim', val)} onChange={(val) => updateField('trim', val)}
/> />
] ]
@ -113,14 +113,14 @@ export default function Reverse({ title }: ToolComponentProps) {
setInput={setInput} setInput={setInput}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('string.reverse.inputTitle')} title={t('string:reverse.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('string.reverse.resultTitle')} title={t('string:reverse.resultTitle')}
value={result} value={result}
/> />
} }

View file

@ -11,8 +11,8 @@ export const tool = defineTool('string', {
keywords: ['reverse'], keywords: ['reverse'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.reverse.name', name: 'string:reverse.title',
description: 'string.reverse.description', description: 'string:reverse.description',
shortDescription: 'string.reverse.shortDescription' shortDescription: 'string:reverse.shortDescription'
} }
}); });

View file

@ -44,19 +44,19 @@ export default function Rot13({ title }: ToolComponentProps) {
title={title} title={title}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('string.rot13.inputTitle')} title={t('string:rot13.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('string.rot13.resultTitle')} value={result} /> <ToolTextResult title={t('string:rot13.resultTitle')} value={result} />
} }
initialValues={initialValues} initialValues={initialValues}
getGroups={null} getGroups={null}
toolInfo={{ toolInfo={{
title: t('string.rot13.toolInfo.title'), title: t('string:rot13.toolInfo.title'),
description: t('string.rot13.toolInfo.description') description: t('string:rot13.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
input={input} input={input}

View file

@ -81,29 +81,29 @@ export default function Rotate({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('string.rotate.rotationOptions'), title: t('string:rotate.rotationOptions'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
value={values.step} value={values.step}
onOwnChange={(val) => updateField('step', val)} onOwnChange={(val) => updateField('step', val)}
description={t('string.rotate.stepDescription')} description={t('string:rotate.stepDescription')}
type="number" type="number"
/> />
<SimpleRadio <SimpleRadio
onClick={() => updateField('direction', 'right')} onClick={() => updateField('direction', 'right')}
checked={values.direction === 'right'} checked={values.direction === 'right'}
title={t('string.rotate.rotateRight')} title={t('string:rotate.rotateRight')}
/> />
<SimpleRadio <SimpleRadio
onClick={() => updateField('direction', 'left')} onClick={() => updateField('direction', 'left')}
checked={values.direction === 'left'} checked={values.direction === 'left'}
title={t('string.rotate.rotateLeft')} title={t('string:rotate.rotateLeft')}
/> />
<CheckboxWithDesc <CheckboxWithDesc
checked={values.multiLine} checked={values.multiLine}
onChange={(checked) => updateField('multiLine', checked)} onChange={(checked) => updateField('multiLine', checked)}
title={t('string.rotate.processAsMultiLine')} title={t('string:rotate.processAsMultiLine')}
/> />
</Box> </Box>
) )
@ -115,19 +115,19 @@ export default function Rotate({ title }: ToolComponentProps) {
title={title} title={title}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('string.rotate.inputTitle')} title={t('string:rotate.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult title={t('string.rotate.resultTitle')} value={result} /> <ToolTextResult title={t('string:rotate.resultTitle')} value={result} />
} }
initialValues={initialValues} initialValues={initialValues}
getGroups={getGroups} getGroups={getGroups}
toolInfo={{ toolInfo={{
title: t('string.rotate.toolInfo.title'), title: t('string:rotate.toolInfo.title'),
description: t('string.rotate.toolInfo.description') description: t('string:rotate.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
input={input} input={input}

View file

@ -173,12 +173,12 @@ export default function SplitText({ title }: ToolComponentProps) {
input={input} input={input}
inputComponent={<ToolTextInput value={input} onChange={setInput} />} inputComponent={<ToolTextInput value={input} onChange={setInput} />}
resultComponent={ resultComponent={
<ToolTextResult title={t('string.split.resultTitle')} value={result} /> <ToolTextResult title={t('string:split.resultTitle')} value={result} />
} }
initialValues={initialValues} initialValues={initialValues}
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('string.split.splitSeparatorOptions'), title: t('string:split.splitSeparatorOptions'),
component: splitOperators.map(({ title, description, type }) => ( component: splitOperators.map(({ title, description, type }) => (
<RadioWithTextField <RadioWithTextField
key={type} key={type}
@ -193,7 +193,7 @@ export default function SplitText({ title }: ToolComponentProps) {
)) ))
}, },
{ {
title: t('string.split.outputSeparatorOptions'), title: t('string:split.outputSeparatorOptions'),
component: outputOptions.map((option) => ( component: outputOptions.map((option) => (
<TextFieldWithDesc <TextFieldWithDesc
key={option.accessor} key={option.accessor}

View file

@ -11,8 +11,8 @@ export const tool = defineTool('string', {
keywords: ['split'], keywords: ['split'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.split.name', name: 'string:split.title',
description: 'string.split.description', description: 'string:split.description',
shortDescription: 'string.split.shortDescription' shortDescription: 'string:split.shortDescription'
} }
}); });

View file

@ -230,47 +230,47 @@ export default function Truncate({
updateField updateField
}) => [ }) => [
{ {
title: t('string.statistic.delimitersOptions'), title: t('string:statistic.delimitersOptions'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
value={values.sentenceDelimiters} value={values.sentenceDelimiters}
onOwnChange={(val) => updateField('sentenceDelimiters', val)} onOwnChange={(val) => updateField('sentenceDelimiters', val)}
placeholder={t('string.statistic.sentenceDelimitersPlaceholder')} placeholder={t('string:statistic.sentenceDelimitersPlaceholder')}
description={t('string.statistic.sentenceDelimitersDescription')} description={t('string:statistic.sentenceDelimitersDescription')}
/> />
<TextFieldWithDesc <TextFieldWithDesc
value={values.wordDelimiters} value={values.wordDelimiters}
onOwnChange={(val) => updateField('wordDelimiters', val)} onOwnChange={(val) => updateField('wordDelimiters', val)}
placeholder={t('string.statistic.wordDelimitersPlaceholder')} placeholder={t('string:statistic.wordDelimitersPlaceholder')}
description={t('string.statistic.wordDelimitersDescription')} description={t('string:statistic.wordDelimitersDescription')}
/> />
</Box> </Box>
) )
}, },
{ {
title: t('string.statistic.statisticsOptions'), title: t('string:statistic.statisticsOptions'),
component: ( component: (
<Box> <Box>
<CheckboxWithDesc <CheckboxWithDesc
checked={values.wordCount} checked={values.wordCount}
onChange={(value) => updateField('wordCount', value)} onChange={(value) => updateField('wordCount', value)}
title={t('string.statistic.wordFrequencyAnalysis')} title={t('string:statistic.wordFrequencyAnalysis')}
description={t('string.statistic.wordFrequencyAnalysisDescription')} description={t('string:statistic.wordFrequencyAnalysisDescription')}
/> />
<CheckboxWithDesc <CheckboxWithDesc
checked={values.characterCount} checked={values.characterCount}
onChange={(value) => updateField('characterCount', value)} onChange={(value) => updateField('characterCount', value)}
title={t('string.statistic.characterFrequencyAnalysis')} title={t('string:statistic.characterFrequencyAnalysis')}
description={t( description={t(
'string.statistic.characterFrequencyAnalysisDescription' 'string:statistic.characterFrequencyAnalysisDescription'
)} )}
/> />
<CheckboxWithDesc <CheckboxWithDesc
checked={values.emptyLines} checked={values.emptyLines}
onChange={(value) => updateField('emptyLines', value)} onChange={(value) => updateField('emptyLines', value)}
title={t('string.statistic.includeEmptyLines')} title={t('string:statistic.includeEmptyLines')}
description={t('string.statistic.includeEmptyLinesDescription')} description={t('string:statistic.includeEmptyLinesDescription')}
/> />
</Box> </Box>
) )
@ -287,19 +287,19 @@ export default function Truncate({
setInput={setInput} setInput={setInput}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('string.statistic.inputTitle')} title={t('string:statistic.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('string.statistic.resultTitle')} title={t('string:statistic.resultTitle')}
value={result} value={result}
/> />
} }
toolInfo={{ toolInfo={{
title: t('string.statistic.toolInfo.title', { title }), title: t('string:statistic.toolInfo.title', { title }),
description: longDescription description: longDescription
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}

View file

@ -13,9 +13,9 @@ export const tool = defineTool('string', {
keywords: ['text', 'statistics', 'count', 'lines', 'words', 'characters'], keywords: ['text', 'statistics', 'count', 'lines', 'words', 'characters'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.statistic.name', name: 'string:statistic.title',
description: 'string.statistic.description', description: 'string:statistic.description',
shortDescription: 'string.statistic.shortDescription', shortDescription: 'string:statistic.shortDescription',
longDescription: 'string.statistic.longDescription' longDescription: 'string:statistic.longDescription'
} }
}); });

View file

@ -74,16 +74,16 @@ export default function Replacer({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('string.textReplacer.searchText'), title: t('string:textReplacer.searchText'),
component: ( component: (
<Box> <Box>
<SimpleRadio <SimpleRadio
onClick={() => updateField('mode', 'text')} onClick={() => updateField('mode', 'text')}
checked={values.mode === 'text'} checked={values.mode === 'text'}
title={t('string.textReplacer.findPatternInText')} title={t('string:textReplacer.findPatternInText')}
/> />
<TextFieldWithDesc <TextFieldWithDesc
description={t('string.textReplacer.searchPatternDescription')} description={t('string:textReplacer.searchPatternDescription')}
value={values.searchValue} value={values.searchValue}
onOwnChange={(val) => updateField('searchValue', val)} onOwnChange={(val) => updateField('searchValue', val)}
type={'text'} type={'text'}
@ -91,10 +91,10 @@ export default function Replacer({ title }: ToolComponentProps) {
<SimpleRadio <SimpleRadio
onClick={() => updateField('mode', 'regexp')} onClick={() => updateField('mode', 'regexp')}
checked={values.mode === 'regexp'} checked={values.mode === 'regexp'}
title={t('string.textReplacer.findPatternUsingRegexp')} title={t('string:textReplacer.findPatternUsingRegexp')}
/> />
<TextFieldWithDesc <TextFieldWithDesc
description={t('string.textReplacer.regexpDescription')} description={t('string:textReplacer.regexpDescription')}
value={values.searchRegexp} value={values.searchRegexp}
onOwnChange={(val) => updateField('searchRegexp', val)} onOwnChange={(val) => updateField('searchRegexp', val)}
type={'text'} type={'text'}
@ -103,12 +103,12 @@ export default function Replacer({ title }: ToolComponentProps) {
) )
}, },
{ {
title: t('string.textReplacer.replaceText'), title: t('string:textReplacer.replaceText'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('string.textReplacer.replacePatternDescription')} description={t('string:textReplacer.replacePatternDescription')}
placeholder={t('string.textReplacer.newTextPlaceholder')} placeholder={t('string:textReplacer.newTextPlaceholder')}
value={values.replaceValue} value={values.replaceValue}
onOwnChange={(val) => updateField('replaceValue', val)} onOwnChange={(val) => updateField('replaceValue', val)}
type={'text'} type={'text'}
@ -128,20 +128,20 @@ export default function Replacer({ title }: ToolComponentProps) {
setInput={setInput} setInput={setInput}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('string.textReplacer.inputTitle')} title={t('string:textReplacer.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('string.textReplacer.resultTitle')} title={t('string:textReplacer.resultTitle')}
value={result} value={result}
/> />
} }
toolInfo={{ toolInfo={{
title: t('string.textReplacer.toolInfo.title'), title: t('string:textReplacer.toolInfo.title'),
description: t('string.textReplacer.toolInfo.description') description: t('string:textReplacer.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
/> />

View file

@ -22,7 +22,7 @@ export default function ToMorse() {
return ( return (
<ToolContent <ToolContent
title={t('string.toMorse.title')} title={t('string:toMorse.title')}
initialValues={initialValues} initialValues={initialValues}
compute={computeOptions} compute={computeOptions}
input={input} input={input}
@ -30,26 +30,26 @@ export default function ToMorse() {
inputComponent={<ToolTextInput value={input} onChange={setInput} />} inputComponent={<ToolTextInput value={input} onChange={setInput} />}
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('string.toMorse.resultTitle')} title={t('string:toMorse.resultTitle')}
value={result} value={result}
/> />
} }
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('string.toMorse.shortSignal'), title: t('string:toMorse.shortSignal'),
component: ( component: (
<TextFieldWithDesc <TextFieldWithDesc
description={t('string.toMorse.dotSymbolDescription')} description={t('string:toMorse.dotSymbolDescription')}
value={values.dotSymbol} value={values.dotSymbol}
onOwnChange={(val) => updateField('dotSymbol', val)} onOwnChange={(val) => updateField('dotSymbol', val)}
/> />
) )
}, },
{ {
title: t('string.toMorse.longSignal'), title: t('string:toMorse.longSignal'),
component: ( component: (
<TextFieldWithDesc <TextFieldWithDesc
description={t('string.toMorse.dashSymbolDescription')} description={t('string:toMorse.dashSymbolDescription')}
value={values.dashSymbol} value={values.dashSymbol}
onOwnChange={(val) => updateField('dashSymbol', val)} onOwnChange={(val) => updateField('dashSymbol', val)}
/> />

View file

@ -12,8 +12,8 @@ export const tool = defineTool('string', {
keywords: ['to', 'morse'], keywords: ['to', 'morse'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.toMorse.name', name: 'string:toMorse.title',
description: 'string.toMorse.description', description: 'string:toMorse.description',
shortDescription: 'string.toMorse.shortDescription' shortDescription: 'string:toMorse.shortDescription'
} }
}); });

View file

@ -81,31 +81,31 @@ export default function Truncate({ title }: ToolComponentProps) {
updateField updateField
}) => [ }) => [
{ {
title: t('string.truncate.truncationSide'), title: t('string:truncate.truncationSide'),
component: ( component: (
<Box> <Box>
<SimpleRadio <SimpleRadio
onClick={() => updateField('truncationSide', 'right')} onClick={() => updateField('truncationSide', 'right')}
checked={values.truncationSide === 'right'} checked={values.truncationSide === 'right'}
title={t('string.truncate.rightSideTruncation')} title={t('string:truncate.rightSideTruncation')}
description={t('string.truncate.rightSideDescription')} description={t('string:truncate.rightSideDescription')}
/> />
<SimpleRadio <SimpleRadio
onClick={() => updateField('truncationSide', 'left')} onClick={() => updateField('truncationSide', 'left')}
checked={values.truncationSide === 'left'} checked={values.truncationSide === 'left'}
title={t('string.truncate.leftSideTruncation')} title={t('string:truncate.leftSideTruncation')}
description={t('string.truncate.leftSideDescription')} description={t('string:truncate.leftSideDescription')}
/> />
</Box> </Box>
) )
}, },
{ {
title: t('string.truncate.lengthAndLines'), title: t('string:truncate.lengthAndLines'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('string.truncate.maxLengthDescription')} description={t('string:truncate.maxLengthDescription')}
placeholder={t('string.truncate.numberPlaceholder')} placeholder={t('string:truncate.numberPlaceholder')}
value={values.maxLength} value={values.maxLength}
onOwnChange={(val) => updateField('maxLength', val)} onOwnChange={(val) => updateField('maxLength', val)}
type={'number'} type={'number'}
@ -113,25 +113,25 @@ export default function Truncate({ title }: ToolComponentProps) {
<CheckboxWithDesc <CheckboxWithDesc
onChange={(val) => updateField('lineByLine', val)} onChange={(val) => updateField('lineByLine', val)}
checked={values.lineByLine} checked={values.lineByLine}
title={t('string.truncate.lineByLineTruncating')} title={t('string:truncate.lineByLineTruncating')}
description={t('string.truncate.lineByLineDescription')} description={t('string:truncate.lineByLineDescription')}
/> />
</Box> </Box>
) )
}, },
{ {
title: t('string.truncate.suffixAndAffix'), title: t('string:truncate.suffixAndAffix'),
component: ( component: (
<Box> <Box>
<CheckboxWithDesc <CheckboxWithDesc
onChange={(val) => updateField('addIndicator', val)} onChange={(val) => updateField('addIndicator', val)}
checked={values.addIndicator} checked={values.addIndicator}
title={t('string.truncate.addTruncationIndicator')} title={t('string:truncate.addTruncationIndicator')}
description={''} description={''}
/> />
<TextFieldWithDesc <TextFieldWithDesc
description={t('string.truncate.indicatorDescription')} description={t('string:truncate.indicatorDescription')}
placeholder={t('string.truncate.charactersPlaceholder')} placeholder={t('string:truncate.charactersPlaceholder')}
value={values.indicator} value={values.indicator}
onOwnChange={(val) => updateField('indicator', val)} onOwnChange={(val) => updateField('indicator', val)}
type={'text'} type={'text'}
@ -151,20 +151,20 @@ export default function Truncate({ title }: ToolComponentProps) {
setInput={setInput} setInput={setInput}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('string.truncate.inputTitle')} title={t('string:truncate.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('string.truncate.resultTitle')} title={t('string:truncate.resultTitle')}
value={result} value={result}
/> />
} }
toolInfo={{ toolInfo={{
title: t('string.truncate.toolInfo.title'), title: t('string:truncate.toolInfo.title'),
description: t('string.truncate.toolInfo.description') description: t('string:truncate.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
/> />

View file

@ -11,8 +11,8 @@ export const tool = defineTool('string', {
keywords: ['truncate'], keywords: ['truncate'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.truncate.name', name: 'string:truncate.title',
description: 'string.truncate.description', description: 'string:truncate.description',
shortDescription: 'string.truncate.shortDescription' shortDescription: 'string:truncate.shortDescription'
} }
}); });

View file

@ -57,14 +57,14 @@ export default function Uppercase({ title }: ToolComponentProps) {
setInput={setInput} setInput={setInput}
inputComponent={ inputComponent={
<ToolTextInput <ToolTextInput
title={t('string.uppercase.inputTitle')} title={t('string:uppercase.inputTitle')}
value={input} value={input}
onChange={setInput} onChange={setInput}
/> />
} }
resultComponent={ resultComponent={
<ToolTextResult <ToolTextResult
title={t('string.uppercase.resultTitle')} title={t('string:uppercase.resultTitle')}
value={result} value={result}
/> />
} }

View file

@ -11,8 +11,8 @@ export const tool = defineTool('string', {
keywords: ['uppercase'], keywords: ['uppercase'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'string.uppercase.name', name: 'string:uppercase.title',
description: 'string.uppercase.description', description: 'string:uppercase.description',
shortDescription: 'string.uppercase.shortDescription' shortDescription: 'string:uppercase.shortDescription'
} }
}); });

View file

@ -78,7 +78,7 @@ export default function ConvertDaysToHours({
setInput={setInput} setInput={setInput}
compute={compute} compute={compute}
toolInfo={{ toolInfo={{
title: t('time.checkLeapYears.toolInfo.title', { title }), title: t('time:checkLeapYears.toolInfo.title', { title }),
description: longDescription description: longDescription
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}

View file

@ -11,8 +11,8 @@ export const tool = defineTool('time', {
keywords: ['leap', 'year', 'calendar', 'date'], keywords: ['leap', 'year', 'calendar', 'date'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'time.checkLeapYears.name', name: 'time:checkLeapYears.title',
description: 'time.checkLeapYears.description', description: 'time:checkLeapYears.description',
shortDescription: 'time.checkLeapYears.shortDescription' shortDescription: 'time:checkLeapYears.shortDescription'
} }
}); });

View file

@ -19,7 +19,7 @@ const exampleCards: CardExampleType<InitialValuesType>[] = [
title: 'Full Days to Hours', title: 'Full Days to Hours',
description: description:
'This example calculates how many hours there are in 1 day, in one week (7 days), in one month (30 days), and in even longer time periods. To see all the results at once, we enter each individual day value on a new line. We also use the "days" suffix in the input and add the "hours" suffix to the output.', 'This example calculates how many hours there are in 1 day, in one week (7 days), in one month (30 days), and in even longer time periods. To see all the results at once, we enter each individual day value on a new line. We also use the "days" suffix in the input and add the "hours" suffix to the output.',
sampleText: `1 day sampleText: `1 day
7 days 7 days
30 days 30 days
90 days 90 days
@ -76,14 +76,14 @@ export default function ConvertDaysToHours({
updateField updateField
}) => [ }) => [
{ {
title: t('time.convertDaysToHours.hoursName'), title: t('time:convertDaysToHours.hoursName'),
component: ( component: (
<Box> <Box>
<CheckboxWithDesc <CheckboxWithDesc
onChange={(val) => updateField('hoursFlag', val)} onChange={(val) => updateField('hoursFlag', val)}
checked={values.hoursFlag} checked={values.hoursFlag}
title={t('time.convertDaysToHours.addHoursName')} title={t('time:convertDaysToHours.addHoursName')}
description={t('time.convertDaysToHours.addHoursNameDescription')} description={t('time:convertDaysToHours.addHoursNameDescription')}
/> />
</Box> </Box>
) )
@ -101,8 +101,8 @@ export default function ConvertDaysToHours({
setInput={setInput} setInput={setInput}
compute={compute} compute={compute}
toolInfo={{ toolInfo={{
title: t('time.convertDaysToHours.toolInfo.title'), title: t('time:convertDaysToHours.toolInfo.title'),
description: t('time.convertDaysToHours.toolInfo.description') description: t('time:convertDaysToHours.toolInfo.description')
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}
/> />

View file

@ -11,8 +11,8 @@ export const tool = defineTool('time', {
keywords: ['days', 'hours', 'convert', 'time'], keywords: ['days', 'hours', 'convert', 'time'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'time.convertDaysToHours.name', name: 'time:convertDaysToHours.title',
description: 'time.convertDaysToHours.description', description: 'time:convertDaysToHours.description',
shortDescription: 'time.convertDaysToHours.shortDescription' shortDescription: 'time:convertDaysToHours.shortDescription'
} }
}); });

View file

@ -11,8 +11,8 @@ export const tool = defineTool('time', {
keywords: ['hours', 'days', 'convert', 'time'], keywords: ['hours', 'days', 'convert', 'time'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'time.convertHoursToDays.name', name: 'time:convertHoursToDays.title',
description: 'time.convertHoursToDays.description', description: 'time:convertHoursToDays.description',
shortDescription: 'time.convertHoursToDays.shortDescription' shortDescription: 'time:convertHoursToDays.shortDescription'
} }
}); });

View file

@ -82,14 +82,14 @@ export default function SecondsToTime({
updateField updateField
}) => [ }) => [
{ {
title: t('time.convertSecondsToTime.timePadding'), title: t('time:convertSecondsToTime.timePadding'),
component: ( component: (
<Box> <Box>
<CheckboxWithDesc <CheckboxWithDesc
onChange={(val) => updateField('paddingFlag', val)} onChange={(val) => updateField('paddingFlag', val)}
checked={values.paddingFlag} checked={values.paddingFlag}
title={t('time.convertSecondsToTime.addPadding')} title={t('time:convertSecondsToTime.addPadding')}
description={t('time.convertSecondsToTime.addPaddingDescription')} description={t('time:convertSecondsToTime.addPaddingDescription')}
/> />
</Box> </Box>
) )
@ -107,7 +107,7 @@ export default function SecondsToTime({
setInput={setInput} setInput={setInput}
compute={compute} compute={compute}
toolInfo={{ toolInfo={{
title: t('time.convertSecondsToTime.toolInfo.title', { title }), title: t('time:convertSecondsToTime.toolInfo.title', { title }),
description: longDescription description: longDescription
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}

View file

@ -11,8 +11,8 @@ export const tool = defineTool('time', {
keywords: ['seconds', 'time', 'convert', 'format'], keywords: ['seconds', 'time', 'convert', 'format'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'time.convertSecondsToTime.name', name: 'time:convertSecondsToTime.title',
description: 'time.convertSecondsToTime.description', description: 'time:convertSecondsToTime.description',
shortDescription: 'time.convertSecondsToTime.shortDescription' shortDescription: 'time:convertSecondsToTime.shortDescription'
} }
}); });

View file

@ -95,7 +95,7 @@ export default function TimeToSeconds({
setInput={setInput} setInput={setInput}
compute={compute} compute={compute}
toolInfo={{ toolInfo={{
title: t('time.convertTimeToSeconds.toolInfo.title', { title }), title: t('time:convertTimeToSeconds.toolInfo.title', { title }),
description: longDescription description: longDescription
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}

View file

@ -11,8 +11,8 @@ export const tool = defineTool('time', {
keywords: ['time', 'seconds', 'convert', 'format'], keywords: ['time', 'seconds', 'convert', 'format'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'time.convertTimeToSeconds.name', name: 'time:convertTimeToSeconds.title',
description: 'time.convertTimeToSeconds.description', description: 'time:convertTimeToSeconds.description',
shortDescription: 'time.convertTimeToSeconds.shortDescription' shortDescription: 'time:convertTimeToSeconds.shortDescription'
} }
}); });

View file

@ -11,8 +11,8 @@ export const tool = defineTool('time', {
keywords: ['cron', 'schedule', 'automation', 'expression'], keywords: ['cron', 'schedule', 'automation', 'expression'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'time.crontabGuru.name', name: 'time:crontabGuru.title',
description: 'time.crontabGuru.description', description: 'time:crontabGuru.description',
shortDescription: 'time.crontabGuru.shortDescription' shortDescription: 'time:crontabGuru.shortDescription'
} }
}); });

View file

@ -126,7 +126,7 @@ export default function TimeBetweenDates() {
return ( return (
<ToolContent <ToolContent
title={t('time.timeBetweenDates.title')} title={t('time:timeBetweenDates.title')}
inputComponent={null} inputComponent={null}
resultComponent={ resultComponent={
result ? ( result ? (
@ -155,28 +155,28 @@ export default function TimeBetweenDates() {
validationSchema={validationSchema} validationSchema={validationSchema}
exampleCards={exampleCards} exampleCards={exampleCards}
toolInfo={{ toolInfo={{
title: t('time.timeBetweenDates.toolInfo.title'), title: t('time:timeBetweenDates.toolInfo.title'),
description: t('time.timeBetweenDates.toolInfo.description') description: t('time:timeBetweenDates.toolInfo.description')
}} }}
getGroups={({ values, updateField }) => [ getGroups={({ values, updateField }) => [
{ {
title: t('time.timeBetweenDates.startDateTime'), title: t('time:timeBetweenDates.startDateTime'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('time.timeBetweenDates.startDate')} description={t('time:timeBetweenDates.startDate')}
value={values.startDate} value={values.startDate}
onOwnChange={(val) => updateField('startDate', val)} onOwnChange={(val) => updateField('startDate', val)}
type="date" type="date"
/> />
<TextFieldWithDesc <TextFieldWithDesc
description={t('time.timeBetweenDates.startTime')} description={t('time:timeBetweenDates.startTime')}
value={values.startTime} value={values.startTime}
onOwnChange={(val) => updateField('startTime', val)} onOwnChange={(val) => updateField('startTime', val)}
type="time" type="time"
/> />
<SelectWithDesc <SelectWithDesc
description={t('time.timeBetweenDates.startTimezone')} description={t('time:timeBetweenDates.startTimezone')}
selected={values.startTimezone} selected={values.startTimezone}
onChange={(val: string) => updateField('startTimezone', val)} onChange={(val: string) => updateField('startTimezone', val)}
options={timezoneOptions} options={timezoneOptions}
@ -185,23 +185,23 @@ export default function TimeBetweenDates() {
) )
}, },
{ {
title: t('time.timeBetweenDates.endDateTime'), title: t('time:timeBetweenDates.endDateTime'),
component: ( component: (
<Box> <Box>
<TextFieldWithDesc <TextFieldWithDesc
description={t('time.timeBetweenDates.endDate')} description={t('time:timeBetweenDates.endDate')}
value={values.endDate} value={values.endDate}
onOwnChange={(val) => updateField('endDate', val)} onOwnChange={(val) => updateField('endDate', val)}
type="date" type="date"
/> />
<TextFieldWithDesc <TextFieldWithDesc
description={t('time.timeBetweenDates.endTime')} description={t('time:timeBetweenDates.endTime')}
value={values.endTime} value={values.endTime}
onOwnChange={(val) => updateField('endTime', val)} onOwnChange={(val) => updateField('endTime', val)}
type="time" type="time"
/> />
<SelectWithDesc <SelectWithDesc
description={t('time.timeBetweenDates.endTimezone')} description={t('time:timeBetweenDates.endTimezone')}
selected={values.endTimezone} selected={values.endTimezone}
onChange={(val: string) => updateField('endTimezone', val)} onChange={(val: string) => updateField('endTimezone', val)}
options={timezoneOptions} options={timezoneOptions}

View file

@ -11,8 +11,8 @@ export const tool = defineTool('time', {
keywords: ['dates', 'time', 'difference', 'duration', 'calculate'], keywords: ['dates', 'time', 'difference', 'duration', 'calculate'],
component: lazy(() => import('./index')), component: lazy(() => import('./index')),
i18n: { i18n: {
name: 'time.timeBetweenDates.name', name: 'time:timeBetweenDates.title',
description: 'time.timeBetweenDates.description', description: 'time:timeBetweenDates.description',
shortDescription: 'time.timeBetweenDates.shortDescription' shortDescription: 'time:timeBetweenDates.shortDescription'
} }
}); });

View file

@ -88,50 +88,50 @@ export default function TruncateClockTime({
updateField updateField
}) => [ }) => [
{ {
title: t('time.truncateClockTime.truncationSide'), title: t('time:truncateClockTime.truncationSide'),
component: ( component: (
<Box> <Box>
<SimpleRadio <SimpleRadio
onClick={() => updateField('onlySecond', true)} onClick={() => updateField('onlySecond', true)}
checked={values.onlySecond} checked={values.onlySecond}
title={t('time.truncateClockTime.truncateOnlySeconds')} title={t('time:truncateClockTime.truncateOnlySeconds')}
description={t( description={t(
'time.truncateClockTime.truncateOnlySecondsDescription' 'time:truncateClockTime.truncateOnlySecondsDescription'
)} )}
/> />
<SimpleRadio <SimpleRadio
onClick={() => updateField('onlySecond', false)} onClick={() => updateField('onlySecond', false)}
checked={!values.onlySecond} checked={!values.onlySecond}
title={t('time.truncateClockTime.truncateMinutesAndSeconds')} title={t('time:truncateClockTime.truncateMinutesAndSeconds')}
description={t( description={t(
'time.truncateClockTime.truncateMinutesAndSecondsDescription' 'time:truncateClockTime.truncateMinutesAndSecondsDescription'
)} )}
/> />
</Box> </Box>
) )
}, },
{ {
title: t('time.truncateClockTime.printDroppedComponents'), title: t('time:truncateClockTime.printDroppedComponents'),
component: ( component: (
<Box> <Box>
<CheckboxWithDesc <CheckboxWithDesc
onChange={(val) => updateField('zeroPrint', val)} onChange={(val) => updateField('zeroPrint', val)}
checked={values.zeroPrint} checked={values.zeroPrint}
title={t('time.truncateClockTime.zeroPrintTruncatedParts')} title={t('time:truncateClockTime.zeroPrintTruncatedParts')}
description={t('time.truncateClockTime.zeroPrintDescription')} description={t('time:truncateClockTime.zeroPrintDescription')}
/> />
</Box> </Box>
) )
}, },
{ {
title: t('time.truncateClockTime.timePadding'), title: t('time:truncateClockTime.timePadding'),
component: ( component: (
<Box> <Box>
<CheckboxWithDesc <CheckboxWithDesc
onChange={(val) => updateField('zeroPadding', val)} onChange={(val) => updateField('zeroPadding', val)}
checked={values.zeroPadding} checked={values.zeroPadding}
title={t('time.truncateClockTime.useZeroPadding')} title={t('time:truncateClockTime.useZeroPadding')}
description={t('time.truncateClockTime.zeroPaddingDescription')} description={t('time:truncateClockTime.zeroPaddingDescription')}
/> />
</Box> </Box>
) )
@ -149,7 +149,7 @@ export default function TruncateClockTime({
setInput={setInput} setInput={setInput}
compute={compute} compute={compute}
toolInfo={{ toolInfo={{
title: t('time.truncateClockTime.toolInfo.title', { title }), title: t('time:truncateClockTime.toolInfo.title', { title }),
description: longDescription description: longDescription
}} }}
exampleCards={exampleCards} exampleCards={exampleCards}

Some files were not shown because too many files have changed in this diff Show more