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" />
</component>
<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$/src/components/ToolContent.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/ToolContent.tsx" 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$/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$/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/package-lock.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" 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/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>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -42,171 +158,171 @@
&quot;state&quot;: &quot;OPEN&quot;
}
}</component>
<component name="GitHubPullRequestState"><![CDATA[{
"prStates": [
<component name="GitHubPullRequestState">{
&quot;prStates&quot;: [
{
"id": {
"id": "PR_kwDOMJIfts51PkS9",
"number": 22
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts51PkS9&quot;,
&quot;number&quot;: 22
},
"lastSeen": 1741207144695
&quot;lastSeen&quot;: 1741207144695
},
{
"id": {
"id": "PR_kwDOMJIfts6NiNYl",
"number": 32
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6NiNYl&quot;,
&quot;number&quot;: 32
},
"lastSeen": 1741209723869
&quot;lastSeen&quot;: 1741209723869
},
{
"id": {
"id": "PR_kwDOMJIfts6Nheyd",
"number": 31
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6Nheyd&quot;,
&quot;number&quot;: 31
},
"lastSeen": 1741213371410
&quot;lastSeen&quot;: 1741213371410
},
{
"id": {
"id": "PR_kwDOMJIfts6NmRBs",
"number": 33
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6NmRBs&quot;,
&quot;number&quot;: 33
},
"lastSeen": 1741282429036
&quot;lastSeen&quot;: 1741282429036
},
{
"id": {
"id": "PR_kwDOMJIfts5zyFTs",
"number": 15
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts5zyFTs&quot;,
&quot;number&quot;: 15
},
"lastSeen": 1741535540953
&quot;lastSeen&quot;: 1741535540953
},
{
"id": {
"id": "PR_kwDOMJIfts6QQB3c",
"number": 59
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6QQB3c&quot;,
&quot;number&quot;: 59
},
"lastSeen": 1743018960900
&quot;lastSeen&quot;: 1743018960900
},
{
"id": {
"id": "PR_kwDOMJIfts6QMPEg",
"number": 58
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6QMPEg&quot;,
&quot;number&quot;: 58
},
"lastSeen": 1743019452983
&quot;lastSeen&quot;: 1743019452983
},
{
"id": {
"id": "PR_kwDOMJIfts6QZvRI",
"number": 61
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6QZvRI&quot;,
&quot;number&quot;: 61
},
"lastSeen": 1743103196866
&quot;lastSeen&quot;: 1743103196866
},
{
"id": {
"id": "PR_kwDOMJIfts6QqPrQ",
"number": 73
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6QqPrQ&quot;,
&quot;number&quot;: 73
},
"lastSeen": 1743265865001
&quot;lastSeen&quot;: 1743265865001
},
{
"id": {
"id": "PR_kwDOMJIfts6Qp5nI",
"number": 72
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6Qp5nI&quot;,
&quot;number&quot;: 72
},
"lastSeen": 1743338472110
&quot;lastSeen&quot;: 1743338472110
},
{
"id": {
"id": "PR_kwDOMJIfts6QsjlS",
"number": 76
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6QsjlS&quot;,
&quot;number&quot;: 76
},
"lastSeen": 1743352150953
&quot;lastSeen&quot;: 1743352150953
},
{
"id": {
"id": "PR_kwDOMJIfts6Q0JBe",
"number": 82
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6Q0JBe&quot;,
&quot;number&quot;: 82
},
"lastSeen": 1743470267269
&quot;lastSeen&quot;: 1743470267269
},
{
"id": {
"id": "PR_kwDOMJIfts6UE9-x",
"number": 102
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6UE9-x&quot;,
&quot;number&quot;: 102
},
"lastSeen": 1747171977348
&quot;lastSeen&quot;: 1747171977348
},
{
"id": {
"id": "PR_kwDOMJIfts6XPua_",
"number": 117
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6XPua_&quot;,
&quot;number&quot;: 117
},
"lastSeen": 1747929835864
&quot;lastSeen&quot;: 1747929835864
},
{
"id": {
"id": "PR_kwDOMJIfts6XY-mZ",
"number": 119
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6XY-mZ&quot;,
&quot;number&quot;: 119
},
"lastSeen": 1748028108508
&quot;lastSeen&quot;: 1748028108508
},
{
"id": {
"id": "PR_kwDOMJIfts6Xdz4n",
"number": 120
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6Xdz4n&quot;,
&quot;number&quot;: 120
},
"lastSeen": 1748282672214
&quot;lastSeen&quot;: 1748282672214
},
{
"id": {
"id": "PR_kwDOMJIfts6X_zxl",
"number": 131
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6X_zxl&quot;,
&quot;number&quot;: 131
},
"lastSeen": 1748881279494
&quot;lastSeen&quot;: 1748881279494
},
{
"id": {
"id": "PR_kwDOMJIfts6bhieT",
"number": 152
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6bhieT&quot;,
&quot;number&quot;: 152
},
"lastSeen": 1751848489082
&quot;lastSeen&quot;: 1751848489082
},
{
"id": {
"id": "PR_kwDOMJIfts6dOyRk",
"number": 154
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6dOyRk&quot;,
&quot;number&quot;: 154
},
"lastSeen": 1751849436454
&quot;lastSeen&quot;: 1751849436454
},
{
"id": {
"id": "PR_kwDOMJIfts6cHjNi",
"number": 153
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6cHjNi&quot;,
&quot;number&quot;: 153
},
"lastSeen": 1751849501498
&quot;lastSeen&quot;: 1751849501498
},
{
"id": {
"id": "PR_kwDOMJIfts6Zs1FN",
"number": 145
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6Zs1FN&quot;,
&quot;number&quot;: 145
},
"lastSeen": 1751849770308
&quot;lastSeen&quot;: 1751849770308
},
{
"id": {
"id": "PR_kwDOMJIfts6bgKi9",
"number": 150
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6bgKi9&quot;,
&quot;number&quot;: 150
},
"lastSeen": 1751850367300
&quot;lastSeen&quot;: 1751850367300
},
{
"id": {
"id": "PR_kwDOMJIfts6eUKC-",
"number": 176
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6eUKC-&quot;,
&quot;number&quot;: 176
},
"lastSeen": 1752158748013
&quot;lastSeen&quot;: 1752158748013
}
]
}]]></component>
}</component>
<component name="GithubPullRequestsUISettings">{
&quot;selectedUrlAndAccountId&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.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",
"kotlin-language-version-configured": "true",
"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",
"formik": "^2.4.6",
"i18next": "^25.3.2",
"i18next-locize-backend": "^7.0.4",
"jimp": "^0.22.12",
"js-quantities": "^1.8.0",
"jszip": "^3.10.1",
"lint-staged": "^15.4.3",
"locize": "^4.0.14",
"lodash": "^4.17.21",
"mime": "^4.0.6",
"morsee": "^1.0.9",
@ -1420,20 +1422,22 @@
}
},
"node_modules/@floating-ui/core": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz",
"integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==",
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz",
"integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==",
"license": "MIT",
"dependencies": {
"@floating-ui/utils": "^0.2.0"
"@floating-ui/utils": "^0.2.10"
}
},
"node_modules/@floating-ui/dom": {
"version": "1.6.5",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz",
"integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==",
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz",
"integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==",
"license": "MIT",
"dependencies": {
"@floating-ui/core": "^1.0.0",
"@floating-ui/utils": "^0.2.0"
"@floating-ui/core": "^1.7.2",
"@floating-ui/utils": "^0.2.10"
}
},
"node_modules/@floating-ui/react-dom": {
@ -1449,9 +1453,10 @@
}
},
"node_modules/@floating-ui/utils": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz",
"integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw=="
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
"integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
"license": "MIT"
},
"node_modules/@hapi/hoek": {
"version": "9.3.0",
@ -4953,6 +4958,15 @@
"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": {
"version": "7.0.3",
"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": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@ -7933,6 +7965,17 @@
"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": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",

View file

@ -51,10 +51,12 @@
"fast-xml-parser": "^5.2.5",
"formik": "^2.4.6",
"i18next": "^25.3.2",
"i18next-locize-backend": "^7.0.4",
"jimp": "^0.22.12",
"js-quantities": "^1.8.0",
"jszip": "^3.10.1",
"lint-staged": "^15.4.3",
"locize": "^4.0.14",
"lodash": "^4.17.21",
"mime": "^4.0.6",
"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 enXml from '../pages/tools/xml/i18n/en.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
const resources = {
en: {
translation: {
...enGlobal,
list: enList,
string: enString,
csv: enCsv,
json: enJson,
pdf: enPdf,
image: enImage,
audio: enAudio,
video: enVideo,
number: enNumber,
time: enTime,
xml: enXml
}
translation: enGlobal,
list: enList,
string: enString,
csv: enCsv,
json: enJson,
pdf: enPdf,
image: enImage,
audio: enAudio,
video: enVideo,
number: enNumber,
time: enTime,
xml: enXml
},
hi: {
translation: {
...hiGlobal,
list: hiList,
string: hiString,
csv: hiCsv,
json: hiJson,
pdf: hiPdf,
image: hiImage,
audio: hiAudio,
video: hiVideo,
number: hiNumber,
time: hiTime,
xml: hiXml
}
translation: hiGlobal,
list: hiList,
string: hiString,
csv: hiCsv,
json: hiJson,
pdf: hiPdf,
image: hiImage,
audio: hiAudio,
video: hiVideo,
number: hiNumber,
time: hiTime,
xml: hiXml
}
};
i18n.use(initReactI18next).init({
resources,
lng: 'en',
fallbackLng: 'en',
interpolation: {
escapeValue: false
}
});
i18n
.use(Backend)
.use(initReactI18next)
.init({
resources,
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;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -148,25 +148,5 @@
"typeSaturation": "संतृप्ति",
"filterIntensity": "फ़िल्टर तीव्रता",
"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'],
component: lazy(() => import('./index')),
i18n: {
name: 'json.escapeJson.name',
description: 'json.escapeJson.description',
shortDescription: 'json.escapeJson.shortDescription'
name: 'json:escapeJson.title',
description: 'json:escapeJson.description',
shortDescription: 'json:escapeJson.shortDescription'
}
});

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -11,8 +11,8 @@ export const meta = defineTool('pdf', {
keywords: ['pdf', 'epub', 'convert', 'ebook'],
path: 'pdf-to-epub',
i18n: {
name: 'pdf.pdfToEpub.name',
description: 'pdf.pdfToEpub.description',
shortDescription: 'pdf.pdfToEpub.shortDescription'
name: 'pdf:pdfToEpub.title',
description: 'pdf:pdfToEpub.description',
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.',
component: lazy(() => import('./index')),
i18n: {
name: 'pdf.protectPdf.name',
description: 'pdf.protectPdf.description',
shortDescription: 'pdf.protectPdf.shortDescription'
name: 'pdf:protectPdf.title',
description: 'pdf:protectPdf.description',
shortDescription: 'pdf:protectPdf.shortDescription'
}
});

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -76,14 +76,14 @@ export default function ConvertDaysToHours({
updateField
}) => [
{
title: t('time.convertDaysToHours.hoursName'),
title: t('time:convertDaysToHours.hoursName'),
component: (
<Box>
<CheckboxWithDesc
onChange={(val) => updateField('hoursFlag', val)}
checked={values.hoursFlag}
title={t('time.convertDaysToHours.addHoursName')}
description={t('time.convertDaysToHours.addHoursNameDescription')}
title={t('time:convertDaysToHours.addHoursName')}
description={t('time:convertDaysToHours.addHoursNameDescription')}
/>
</Box>
)
@ -101,8 +101,8 @@ export default function ConvertDaysToHours({
setInput={setInput}
compute={compute}
toolInfo={{
title: t('time.convertDaysToHours.toolInfo.title'),
description: t('time.convertDaysToHours.toolInfo.description')
title: t('time:convertDaysToHours.toolInfo.title'),
description: t('time:convertDaysToHours.toolInfo.description')
}}
exampleCards={exampleCards}
/>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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