mirror of
https://github.com/iib0011/omni-tools.git
synced 2025-09-20 06:29:32 +02:00
fix: translation related behaviors
This commit is contained in:
1
.env.example
Normal file
1
.env.example
Normal file
@@ -0,0 +1 @@
|
||||
LOCIZE_API_KEY=
|
281
.idea/workspace.xml
generated
281
.idea/workspace.xml
generated
@@ -4,19 +4,26 @@
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="chore: i18n in meta">
|
||||
<change afterPath="$PROJECT_DIR$/scripts/add-i18n-to-meta.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/scripts/update-i18n-from-meta.js" afterDir="false" />
|
||||
<list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="chore: saveMissing">
|
||||
<change afterPath="$PROJECT_DIR$/.env.example" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/i18n/en.json" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/i18n/en.json" 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/components/Hero.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/Hero.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/components/ToolLayout.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/ToolLayout.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/i18n/index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/i18n/index.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools-by-category/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools-by-category/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/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/extract-audio/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/merge-audio/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/merge-audio/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/trim/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/trim/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-rows-to-columns/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/csv-rows-to-columns/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/csv-to-json/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/csv-to-json/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/csv-to-tsv/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/csv-to-tsv/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/csv-to-xml/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/csv-to-xml/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/csv-to-yaml/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/csv-to-yaml/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/i18n/en.json" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/i18n/en.json" 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/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/insert-csv-columns/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/swap-csv-columns/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/swap-csv-columns/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/csv/transpose-csv/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/csv/transpose-csv/meta.ts" afterDir="false" />
|
||||
@@ -32,18 +39,84 @@
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/generic/remove-background/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/generic/remove-background/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/generic/resize/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/generic/resize/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/generic/rotate/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/generic/rotate/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/i18n/en.json" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/i18n/en.json" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/png/compress-png/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/png/compress-png/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/png/convert-jgp-to-png/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/png/convert-jgp-to-png/meta.ts" 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/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/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/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/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/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/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/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/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/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/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/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/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/generate/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/data/ohmsLaw.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/data/ohmsLaw.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/data/slackline.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/data/slackline.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/data/sphereArea.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/data/sphereArea.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/data/sphereVolume.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/data/sphereVolume.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/data/voltageDropInWire.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/data/voltageDropInWire.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/generic-calc/index.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/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/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/editor/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/editor/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/i18n/en.json" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/i18n/en.json" 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/pdf-to-png/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/pdf-to-png/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/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/rotate-pdf/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/i18n/en.json" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/i18n/en.json" 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/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/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/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/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/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/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/rot13/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/rotate/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/rotate/meta.ts" 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/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/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/text-replacer/meta.ts" 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/xml/xml-validator/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/tools/defineTool.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/tools/defineTool.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/tools/index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/tools/index.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/utils/string.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/utils/string.ts" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
@@ -309,7 +382,7 @@
|
||||
"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/src",
|
||||
"last_opened_file_path": "C:/Users/Ibrahima/IdeaProjects/omni-tools",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
@@ -317,6 +390,9 @@
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"npm.build.executor": "Run",
|
||||
"npm.dev.executor": "Run",
|
||||
"npm.i18n:pull.executor": "Run",
|
||||
"npm.i18n:push.executor": "Run",
|
||||
"npm.i18n:sync.executor": "Run",
|
||||
"npm.lint.executor": "Run",
|
||||
"npm.prebuild.executor": "Run",
|
||||
"npm.script:create:tool.executor": "Run",
|
||||
@@ -343,11 +419,11 @@
|
||||
</component>
|
||||
<component name="RecentsManager">
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools" />
|
||||
<recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src" />
|
||||
<recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\public" />
|
||||
<recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src\assets" />
|
||||
<recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\public\assets\fonts\quicksand" />
|
||||
<recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\public\assets\fonts" />
|
||||
</key>
|
||||
<key name="MoveFile.RECENT_KEYS">
|
||||
<recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\@types" />
|
||||
@@ -357,28 +433,11 @@
|
||||
<recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src\pages\categories" />
|
||||
</key>
|
||||
</component>
|
||||
<component name="RunManager" selected="Node.js.add-i18n-to-meta.js">
|
||||
<configuration name="replaceText function (regexp mode).should return the original text when passed an invalid regexp" type="JavaScriptTestRunnerVitest" temporary="true" nameIsGenerated="true">
|
||||
<node-interpreter value="project" />
|
||||
<vitest-package value="$PROJECT_DIR$/node_modules/vitest" />
|
||||
<working-dir value="$PROJECT_DIR$" />
|
||||
<vitest-options value="--run" />
|
||||
<envs />
|
||||
<scope-kind value="TEST" />
|
||||
<test-file value="$PROJECT_DIR$/src/pages/tools/string/text-replacer/replaceText.service.test.ts" />
|
||||
<test-names>
|
||||
<test-name value="replaceText function (regexp mode)" />
|
||||
<test-name value="should return the original text when passed an invalid regexp" />
|
||||
</test-names>
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="add-i18n-to-meta.js" type="NodeJSConfigurationType" temporary="true" nameIsGenerated="true" path-to-js-file="$PROJECT_DIR$/scripts/add-i18n-to-meta.js" working-dir="$PROJECT_DIR$/scripts">
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="locize-upload.js" type="NodeJSConfigurationType" temporary="true" nameIsGenerated="true" path-to-js-file="$PROJECT_DIR$/scripts/locize-upload.js" working-dir="$PROJECT_DIR$/scripts">
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="update-i18n-from-meta.js" type="NodeJSConfigurationType" temporary="true" nameIsGenerated="true" path-to-js-file="$PROJECT_DIR$/scripts/update-i18n-from-meta.js" working-dir="$PROJECT_DIR$/scripts">
|
||||
<component name="RunManager" selected="npm.dev">
|
||||
<configuration name="locize-upload.js" type="NodeJSConfigurationType" temporary="true" nameIsGenerated="true" path-to-js-file="locize-upload.js" working-dir="$PROJECT_DIR$/scripts">
|
||||
<envs>
|
||||
<env name="LOCIZE_API_KEY" value="a2ac4dc2-d10e-4d35-bcf7-92db87381711" />
|
||||
</envs>
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration default="true" type="docker-deploy" factoryName="dockerfile" temporary="true">
|
||||
@@ -396,23 +455,56 @@
|
||||
<node-interpreter value="project" />
|
||||
<envs>
|
||||
<env name="LOCIZE_API_KEY" value="a2ac4dc2-d10e-4d35-bcf7-92db87381711" />
|
||||
<env name="VITE_CONTRIBUTOR_MODE" value="true" />
|
||||
</envs>
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="i18n:pull" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
<command value="run" />
|
||||
<scripts>
|
||||
<script value="i18n:pull" />
|
||||
</scripts>
|
||||
<node-interpreter value="project" />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="i18n:push" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
<command value="run" />
|
||||
<scripts>
|
||||
<script value="i18n:push" />
|
||||
</scripts>
|
||||
<node-interpreter value="project" />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="i18n:sync" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
<command value="run" />
|
||||
<scripts>
|
||||
<script value="i18n:sync" />
|
||||
</scripts>
|
||||
<node-interpreter value="project" />
|
||||
<envs>
|
||||
<env name="LOCIZE_API_KEY" value="a2ac4dc2-d10le-4d35-bcf7-92db87381711" />
|
||||
</envs>
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<list>
|
||||
<item itemvalue="Node.js.add-i18n-to-meta.js" />
|
||||
<item itemvalue="Node.js.locize-upload.js" />
|
||||
<item itemvalue="Node.js.update-i18n-from-meta.js" />
|
||||
<item itemvalue="npm.i18n:pull" />
|
||||
<item itemvalue="npm.i18n:push" />
|
||||
<item itemvalue="npm.i18n:sync" />
|
||||
<item itemvalue="npm.dev" />
|
||||
<item itemvalue="Vitest.replaceText function (regexp mode).should return the original text when passed an invalid regexp" />
|
||||
</list>
|
||||
<recent_temporary>
|
||||
<list>
|
||||
<item itemvalue="Node.js.add-i18n-to-meta.js" />
|
||||
<item itemvalue="npm.dev" />
|
||||
<item itemvalue="npm.i18n:sync" />
|
||||
<item itemvalue="npm.i18n:pull" />
|
||||
<item itemvalue="npm.i18n:push" />
|
||||
<item itemvalue="Node.js.locize-upload.js" />
|
||||
<item itemvalue="Node.js.update-i18n-from-meta.js" />
|
||||
<item itemvalue="Vitest.replaceText function (regexp mode).should return the original text when passed an invalid regexp" />
|
||||
</list>
|
||||
</recent_temporary>
|
||||
</component>
|
||||
@@ -524,55 +616,8 @@
|
||||
<workItem from="1752127185450" duration="1168000" />
|
||||
<workItem from="1752157409587" duration="2415000" />
|
||||
<workItem from="1752403829295" duration="13253000" />
|
||||
<workItem from="1752493585622" duration="3929000" />
|
||||
</task>
|
||||
<task id="LOCAL-00175" summary="chore: compress video icon">
|
||||
<option name="closed" value="true" />
|
||||
<created>1743355166425</created>
|
||||
<option name="number" value="00175" />
|
||||
<option name="presentableId" value="LOCAL-00175" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1743355166426</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00176" summary="fix: gif speed">
|
||||
<option name="closed" value="true" />
|
||||
<created>1743385388051</created>
|
||||
<option name="number" value="00176" />
|
||||
<option name="presentableId" value="LOCAL-00176" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1743385388051</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00177" summary="fix: tsc">
|
||||
<option name="closed" value="true" />
|
||||
<created>1743385467178</created>
|
||||
<option name="number" value="00177" />
|
||||
<option name="presentableId" value="LOCAL-00177" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1743385467178</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00178" summary="fix: background color">
|
||||
<option name="closed" value="true" />
|
||||
<created>1743385898871</created>
|
||||
<option name="number" value="00178" />
|
||||
<option name="presentableId" value="LOCAL-00178" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1743385898871</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00179" summary="docs: github trendings">
|
||||
<option name="closed" value="true" />
|
||||
<created>1743459110471</created>
|
||||
<option name="number" value="00179" />
|
||||
<option name="presentableId" value="LOCAL-00179" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1743459110471</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00180" summary="docs: optimize">
|
||||
<option name="closed" value="true" />
|
||||
<created>1743459205311</created>
|
||||
<option name="number" value="00180" />
|
||||
<option name="presentableId" value="LOCAL-00180" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1743459205311</updated>
|
||||
<workItem from="1752493585622" duration="11629000" />
|
||||
<workItem from="1752507105323" duration="4936000" />
|
||||
</task>
|
||||
<task id="LOCAL-00181" summary="fix: stars button width for 1k+ 😊">
|
||||
<option name="closed" value="true" />
|
||||
@@ -918,7 +963,55 @@
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1752493634215</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="224" />
|
||||
<task id="LOCAL-00224" summary="chore: add i18n to meta script">
|
||||
<option name="closed" value="true" />
|
||||
<created>1752497705915</created>
|
||||
<option name="number" value="00224" />
|
||||
<option name="presentableId" value="LOCAL-00224" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1752497705915</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00225" summary="fix: tsc">
|
||||
<option name="closed" value="true" />
|
||||
<created>1752501110885</created>
|
||||
<option name="number" value="00225" />
|
||||
<option name="presentableId" value="LOCAL-00225" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1752501110885</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00226" summary="chore: bundle translations at build time">
|
||||
<option name="closed" value="true" />
|
||||
<created>1752503206380</created>
|
||||
<option name="number" value="00226" />
|
||||
<option name="presentableId" value="LOCAL-00226" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1752503206380</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00227" summary="fix: tsc">
|
||||
<option name="closed" value="true" />
|
||||
<created>1752503720380</created>
|
||||
<option name="number" value="00227" />
|
||||
<option name="presentableId" value="LOCAL-00227" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1752503720380</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00228" summary="chore: remove unnecessary">
|
||||
<option name="closed" value="true" />
|
||||
<created>1752503770543</created>
|
||||
<option name="number" value="00228" />
|
||||
<option name="presentableId" value="LOCAL-00228" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1752503770543</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00229" summary="chore: saveMissing">
|
||||
<option name="closed" value="true" />
|
||||
<created>1752505593881</created>
|
||||
<option name="number" value="00229" />
|
||||
<option name="presentableId" value="LOCAL-00229" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1752505593881</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="230" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
@@ -965,10 +1058,6 @@
|
||||
<option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
|
||||
<option name="CHECK_NEW_TODO" value="false" />
|
||||
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
|
||||
<MESSAGE value="chore: revert create-tool.mjs" />
|
||||
<MESSAGE value="chore: remove unnecessary prop" />
|
||||
<MESSAGE value="fix: compute flow" />
|
||||
<MESSAGE value="feat: qr code generation init" />
|
||||
<MESSAGE value="chore: rename from Omni Tools to OmniTools" />
|
||||
<MESSAGE value="fix: tools by category page title" />
|
||||
<MESSAGE value="chore: use scrollY" />
|
||||
@@ -987,10 +1076,14 @@
|
||||
<MESSAGE value="docs: edit pdf meta" />
|
||||
<MESSAGE value="fix: misc" />
|
||||
<MESSAGE value="fix: i18n tsc" />
|
||||
<MESSAGE value="fix: tsc" />
|
||||
<MESSAGE value="chore: locize upload" />
|
||||
<MESSAGE value="chore: i18n in meta" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="chore: i18n in meta" />
|
||||
<MESSAGE value="chore: add i18n to meta script" />
|
||||
<MESSAGE value="chore: bundle translations at build time" />
|
||||
<MESSAGE value="fix: tsc" />
|
||||
<MESSAGE value="chore: remove unnecessary" />
|
||||
<MESSAGE value="chore: saveMissing" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="chore: saveMissing" />
|
||||
</component>
|
||||
<component name="VgoProject">
|
||||
<integration-enabled>false</integration-enabled>
|
||||
|
7
package-lock.json
generated
7
package-lock.json
generated
@@ -5104,9 +5104,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
"version": "7.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
||||
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"path-key": "^3.1.0",
|
||||
"shebang-command": "^2.0.0",
|
||||
|
@@ -24,7 +24,8 @@
|
||||
"lint": "eslint src --max-warnings=0 --fix",
|
||||
"typecheck": "tsc --project tsconfig.json --noEmit",
|
||||
"prepare": "husky install",
|
||||
"i18n:pull": "locize download --project-id e7156a3e-66fb-4035-a0f0-cebf1c63a3ba --api-key $LOCIZE_API_KEY --path ./public/locales"
|
||||
"i18n:pull": "locize download --project-id e7156a3e-66fb-4035-a0f0-cebf1c63a3ba --api-key $LOCIZE_API_KEY --path ./public/locales",
|
||||
"i18n:sync": "locize sync --project-id e7156a3e-66fb-4035-a0f0-cebf1c63a3ba --path ./public/locales --update-values true"
|
||||
},
|
||||
"dependencies": {
|
||||
"@emotion/react": "^11.11.4",
|
||||
|
@@ -19,6 +19,7 @@ import _ from 'lodash';
|
||||
import { Icon } from '@iconify/react';
|
||||
import { getToolCategoryTitle } from '@utils/string';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { validNamespaces } from '../i18n';
|
||||
|
||||
const GroupHeader = styled('div')(({ theme }) => ({
|
||||
position: 'sticky',
|
||||
@@ -36,7 +37,7 @@ const GroupItems = styled('ul')({
|
||||
});
|
||||
|
||||
export default function Hero() {
|
||||
const { t } = useTranslation();
|
||||
const { t } = useTranslation(validNamespaces);
|
||||
const [inputValue, setInputValue] = useState<string>('');
|
||||
const theme = useTheme();
|
||||
const [filteredTools, setFilteredTools] = useState<DefinedTool[]>(tools);
|
||||
@@ -45,49 +46,49 @@ export default function Hero() {
|
||||
const exampleTools: { label: string; url: string; translationKey: string }[] =
|
||||
[
|
||||
{
|
||||
label: t('hero.examples.createTransparentImage'),
|
||||
label: t('translation:hero.examples.createTransparentImage'),
|
||||
url: '/image-generic/create-transparent',
|
||||
translationKey: 'hero.examples.createTransparentImage'
|
||||
translationKey: 'translation:hero.examples.createTransparentImage'
|
||||
},
|
||||
{
|
||||
label: t('hero.examples.prettifyJson'),
|
||||
label: t('translation:hero.examples.prettifyJson'),
|
||||
url: '/json/prettify',
|
||||
translationKey: 'hero.examples.prettifyJson'
|
||||
translationKey: 'translation:hero.examples.prettifyJson'
|
||||
},
|
||||
{
|
||||
label: t('hero.examples.changeGifSpeed'),
|
||||
label: t('translation:hero.examples.changeGifSpeed'),
|
||||
url: '/gif/change-speed',
|
||||
translationKey: 'hero.examples.changeGifSpeed'
|
||||
translationKey: 'translation:hero.examples.changeGifSpeed'
|
||||
},
|
||||
{
|
||||
label: t('hero.examples.sortList'),
|
||||
label: t('translation:hero.examples.sortList'),
|
||||
url: '/list/sort',
|
||||
translationKey: 'hero.examples.sortList'
|
||||
translationKey: 'translation:hero.examples.sortList'
|
||||
},
|
||||
{
|
||||
label: t('hero.examples.compressPng'),
|
||||
label: t('translation:hero.examples.compressPng'),
|
||||
url: '/png/compress-png',
|
||||
translationKey: 'hero.examples.compressPng'
|
||||
translationKey: 'translation:hero.examples.compressPng'
|
||||
},
|
||||
{
|
||||
label: t('hero.examples.splitText'),
|
||||
label: t('translation:hero.examples.splitText'),
|
||||
url: '/string/split',
|
||||
translationKey: 'hero.examples.splitText'
|
||||
translationKey: 'translation:hero.examples.splitText'
|
||||
},
|
||||
{
|
||||
label: t('hero.examples.splitPdf'),
|
||||
label: t('translation:hero.examples.splitPdf'),
|
||||
url: '/pdf/split-pdf',
|
||||
translationKey: 'hero.examples.splitPdf'
|
||||
translationKey: 'translation:hero.examples.splitPdf'
|
||||
},
|
||||
{
|
||||
label: t('hero.examples.trimVideo'),
|
||||
label: t('translation:hero.examples.trimVideo'),
|
||||
url: '/video/trim',
|
||||
translationKey: 'hero.examples.trimVideo'
|
||||
translationKey: 'translation:hero.examples.trimVideo'
|
||||
},
|
||||
{
|
||||
label: t('hero.examples.calculateNumberSum'),
|
||||
label: t('translation:hero.examples.calculateNumberSum'),
|
||||
url: '/number/sum',
|
||||
translationKey: 'hero.examples.calculateNumberSum'
|
||||
translationKey: 'translation:hero.examples.calculateNumberSum'
|
||||
}
|
||||
];
|
||||
|
||||
@@ -96,20 +97,20 @@ export default function Hero() {
|
||||
newInputValue: string
|
||||
) => {
|
||||
setInputValue(newInputValue);
|
||||
setFilteredTools(filterTools(tools, newInputValue));
|
||||
setFilteredTools(filterTools(tools, newInputValue, t));
|
||||
};
|
||||
|
||||
return (
|
||||
<Box width={{ xs: '90%', md: '80%', lg: '60%' }}>
|
||||
<Stack mb={1} direction={'row'} spacing={1} justifyContent={'center'}>
|
||||
<Typography sx={{ textAlign: 'center' }} fontSize={{ xs: 25, md: 30 }}>
|
||||
{t('hero.title')}{' '}
|
||||
{t('translation:hero.title')}{' '}
|
||||
<Typography
|
||||
fontSize={{ xs: 25, md: 30 }}
|
||||
display={'inline'}
|
||||
color={'primary'}
|
||||
>
|
||||
{t('hero.brand')}
|
||||
{t('translation:hero.brand')}
|
||||
</Typography>
|
||||
</Typography>
|
||||
</Stack>
|
||||
@@ -118,7 +119,7 @@ export default function Hero() {
|
||||
fontSize={{ xs: 15, md: 20 }}
|
||||
mb={2}
|
||||
>
|
||||
{t('hero.description')}
|
||||
{t('translation:hero.description')}
|
||||
</Typography>
|
||||
|
||||
<Autocomplete
|
||||
@@ -135,12 +136,12 @@ export default function Hero() {
|
||||
);
|
||||
}}
|
||||
inputValue={inputValue}
|
||||
getOptionLabel={(option) => option.name}
|
||||
getOptionLabel={(option) => t(option.name)}
|
||||
renderInput={(params) => (
|
||||
<TextField
|
||||
{...params}
|
||||
fullWidth
|
||||
placeholder={t('hero.searchPlaceholder')}
|
||||
placeholder={t('translation:hero.searchPlaceholder')}
|
||||
InputProps={{
|
||||
...params.InputProps,
|
||||
endAdornment: <SearchIcon />,
|
||||
@@ -161,8 +162,10 @@ export default function Hero() {
|
||||
<Stack direction={'row'} spacing={2} alignItems={'center'}>
|
||||
<Icon fontSize={20} icon={option.icon} />
|
||||
<Box>
|
||||
<Typography fontWeight={'bold'}>{option.name}</Typography>
|
||||
<Typography fontSize={12}>{option.shortDescription}</Typography>
|
||||
<Typography fontWeight={'bold'}>{t(option.name)}</Typography>
|
||||
<Typography fontSize={12}>
|
||||
{t(option.shortDescription)}
|
||||
</Typography>
|
||||
</Box>
|
||||
</Stack>
|
||||
</Box>
|
||||
|
@@ -16,14 +16,10 @@ import { FullI18nKey } from '../i18n';
|
||||
|
||||
export default function ToolLayout({
|
||||
children,
|
||||
title,
|
||||
description,
|
||||
icon,
|
||||
type,
|
||||
i18n
|
||||
}: {
|
||||
title: string;
|
||||
description: string;
|
||||
icon?: IconifyIcon | string;
|
||||
type: ToolCategory;
|
||||
children: ReactNode;
|
||||
@@ -40,14 +36,14 @@ export default function ToolLayout({
|
||||
|
||||
// Use i18n keys if available, otherwise fall back to provided strings
|
||||
//@ts-ignore
|
||||
const toolTitle: string = i18n ? t(i18n.name) : title;
|
||||
const toolTitle: string = t(i18n.name);
|
||||
//@ts-ignore
|
||||
const toolDescription: string = i18n ? t(i18n.description) : description;
|
||||
const toolDescription: string = t(i18n.description);
|
||||
|
||||
const otherCategoryTools =
|
||||
getToolsByCategory()
|
||||
.find((category) => category.type === type)
|
||||
?.tools.filter((tool) => tool.name !== title)
|
||||
?.tools.filter((tool) => t(tool.name) !== toolTitle)
|
||||
.map((tool) => ({
|
||||
title: tool.name,
|
||||
description: tool.shortDescription,
|
||||
|
@@ -22,19 +22,21 @@ const locizeOptions = {
|
||||
version: 'latest'
|
||||
};
|
||||
|
||||
export type I18nNamespaces =
|
||||
| 'translation'
|
||||
| 'list'
|
||||
| 'string'
|
||||
| 'csv'
|
||||
| 'json'
|
||||
| 'pdf'
|
||||
| 'image'
|
||||
| 'audio'
|
||||
| 'video'
|
||||
| 'number'
|
||||
| 'time'
|
||||
| 'xml';
|
||||
export const validNamespaces: string[] = [
|
||||
'string',
|
||||
'number',
|
||||
'video',
|
||||
'list',
|
||||
'json',
|
||||
'time',
|
||||
'csv',
|
||||
'pdf',
|
||||
'audio',
|
||||
'xml',
|
||||
'translation',
|
||||
'image'
|
||||
];
|
||||
export type I18nNamespaces = (typeof validNamespaces)[number];
|
||||
export type FullI18nKey = {
|
||||
[K in I18nNamespaces]: `${K}:${ParseKeys<K>}`;
|
||||
}[I18nNamespaces];
|
||||
@@ -42,7 +44,7 @@ export type FullI18nKey = {
|
||||
i18n.use(initReactI18next).init({
|
||||
lng: 'en',
|
||||
fallbackLng: 'en',
|
||||
debug: useLocize,
|
||||
debug: false,
|
||||
backend: useLocize
|
||||
? locizeOptions
|
||||
: {
|
||||
|
@@ -37,15 +37,18 @@ export default function ToolsByCategory() {
|
||||
const { categoryName } = useParams();
|
||||
const [searchTerm, setSearchTerm] = React.useState<string>('');
|
||||
const rawTitle = getToolCategoryTitle(categoryName as string);
|
||||
const categoryTools = filterTools(
|
||||
getToolsByCategory().find(({ type }) => type === categoryName)?.tools ?? [],
|
||||
searchTerm
|
||||
);
|
||||
const { t } = useTranslation(
|
||||
categoryTools.length
|
||||
? getI18nNamespaceFromToolCategory(categoryTools[0].type)
|
||||
: 'translation'
|
||||
);
|
||||
// First get tools by category without filtering
|
||||
const toolsByCategory =
|
||||
getToolsByCategory().find(({ type }) => type === categoryName)?.tools ?? [];
|
||||
|
||||
const namespace =
|
||||
toolsByCategory.length > 0
|
||||
? getI18nNamespaceFromToolCategory(toolsByCategory[0].type)
|
||||
: 'translation';
|
||||
const { t } = useTranslation(namespace);
|
||||
|
||||
const categoryTools = filterTools(toolsByCategory, searchTerm, t);
|
||||
|
||||
useEffect(() => {
|
||||
if (mainContentRef.current) {
|
||||
mainContentRef.current.scrollIntoView({ behavior: 'smooth' });
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('audio', {
|
||||
name: 'Change audio speed',
|
||||
path: 'change-speed',
|
||||
icon: 'material-symbols:speed',
|
||||
description:
|
||||
'Change the playback speed of audio files. Speed up or slow down audio while maintaining pitch.',
|
||||
shortDescription: 'Change the speed of audio files',
|
||||
|
||||
keywords: [
|
||||
'audio',
|
||||
'speed',
|
||||
@@ -18,8 +15,7 @@ export const tool = defineTool('audio', {
|
||||
'pitch',
|
||||
'media'
|
||||
],
|
||||
longDescription:
|
||||
'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.title',
|
||||
|
@@ -2,13 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('audio', {
|
||||
name: 'Extract audio',
|
||||
path: 'extract-audio',
|
||||
icon: 'mdi:music-note',
|
||||
description:
|
||||
'Extract the audio track from a video file and save it as a separate audio file in your chosen format (AAC, MP3, WAV).',
|
||||
shortDescription:
|
||||
'Extract audio from video files (MP4, MOV, etc.) to AAC, MP3, or WAV.',
|
||||
|
||||
keywords: [
|
||||
'extract',
|
||||
'audio',
|
||||
@@ -20,8 +16,7 @@ export const tool = defineTool('audio', {
|
||||
'media',
|
||||
'convert'
|
||||
],
|
||||
longDescription:
|
||||
'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.title',
|
||||
|
@@ -8,12 +8,10 @@ export const tool = defineTool('audio', {
|
||||
shortDescription: 'audio:mergeAudio.shortDescription',
|
||||
longDescription: 'audio:mergeAudio.longDescription'
|
||||
},
|
||||
name: 'Merge Audio',
|
||||
|
||||
path: 'merge-audio',
|
||||
icon: 'fluent:merge-20-regular',
|
||||
description:
|
||||
'Combine multiple audio files into a single audio file by concatenating them in sequence.',
|
||||
shortDescription: 'Merge multiple audio files into one (MP3, AAC, WAV).',
|
||||
|
||||
keywords: [
|
||||
'merge',
|
||||
'audio',
|
||||
@@ -26,7 +24,6 @@ export const tool = defineTool('audio', {
|
||||
'audio editing',
|
||||
'multiple files'
|
||||
],
|
||||
longDescription:
|
||||
'This tool allows you to merge multiple audio files into a single file by concatenating them in the order you upload them. Perfect for combining podcast segments, music tracks, or any audio files that need to be joined together. Supports various audio formats including MP3, AAC, and WAV.',
|
||||
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -8,13 +8,10 @@ export const tool = defineTool('audio', {
|
||||
shortDescription: 'audio:trim.shortDescription',
|
||||
longDescription: 'audio:trim.longDescription'
|
||||
},
|
||||
name: 'Trim Audio',
|
||||
|
||||
path: 'trim',
|
||||
icon: 'mdi:scissors-cutting',
|
||||
description:
|
||||
'Cut and trim audio files to extract specific segments by specifying start and end times.',
|
||||
shortDescription:
|
||||
'Trim audio files to extract specific time segments (MP3, AAC, WAV).',
|
||||
|
||||
keywords: [
|
||||
'trim',
|
||||
'audio',
|
||||
@@ -27,7 +24,6 @@ export const tool = defineTool('audio', {
|
||||
'audio editing',
|
||||
'time'
|
||||
],
|
||||
longDescription:
|
||||
'This tool allows you to trim audio files by specifying start and end times. You can extract specific segments from longer audio files, remove unwanted parts, or create shorter clips. Supports various audio formats including MP3, AAC, and WAV. Perfect for podcast editing, music production, or any audio editing needs.',
|
||||
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('csv', {
|
||||
name: 'Change CSV Separator',
|
||||
path: 'change-csv-separator',
|
||||
icon: 'material-symbols:code',
|
||||
description:
|
||||
'Change the delimiter/separator in CSV files. Convert between different CSV formats like comma, semicolon, tab, or custom separators.',
|
||||
shortDescription: 'Change CSV file delimiter',
|
||||
|
||||
keywords: ['csv', 'separator', 'delimiter', 'change'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -8,14 +8,8 @@ export const tool = defineTool('csv', {
|
||||
shortDescription: 'csv:csvRowsToColumns.shortDescription',
|
||||
longDescription: 'csv:csvRowsToColumns.longDescription'
|
||||
},
|
||||
name: 'Convert CSV Rows to Columns',
|
||||
path: 'csv-rows-to-columns',
|
||||
icon: 'fluent:text-arrow-down-right-column-24-filled',
|
||||
description:
|
||||
'This tool converts rows of a CSV (Comma Separated Values) file into columns. It extracts the horizontal lines from the input CSV one by one, rotates them 90 degrees, and outputs them as vertical columns one after another, separated by commas.',
|
||||
longDescription:
|
||||
'This tool converts rows of a CSV (Comma Separated Values) file into columns. For example, if the input CSV data has 6 rows, then the output will have 6 columns and the elements of the rows will be arranged from the top to bottom. In a well-formed CSV, the number of values in each row is the same. However, in cases when rows are missing fields, the program can fix them and you can choose from the available options: fill missing data with empty elements or replace missing data with custom elements, such as "missing", "?", or "x". During the conversion process, the tool also cleans the CSV file from unnecessary information, such as empty lines (these are lines without visible information) and comments. To help the tool correctly identify comments, in the options, you can specify the symbol at the beginning of a line that starts a comment. This symbol is typically a hash "#" or double slash "//". Csv-abulous!.',
|
||||
shortDescription: 'Convert CSV rows to columns.',
|
||||
keywords: ['csv', 'rows', 'columns', 'transpose'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -7,12 +7,10 @@ export const tool = defineTool('csv', {
|
||||
description: 'csv:csvToJson.description',
|
||||
shortDescription: 'csv:csvToJson.shortDescription'
|
||||
},
|
||||
name: 'Convert CSV to JSON',
|
||||
|
||||
path: 'csv-to-json',
|
||||
icon: 'lets-icons:json-light',
|
||||
description:
|
||||
'Convert CSV files to JSON format with customizable options for delimiters, quotes, and output formatting. Support for headers, comments, and dynamic type conversion.',
|
||||
shortDescription: 'Convert CSV data to JSON format.',
|
||||
|
||||
keywords: ['csv', 'json', 'convert', 'transform', 'parse'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -8,14 +8,9 @@ export const tool = defineTool('csv', {
|
||||
shortDescription: 'csv:csvToTsv.shortDescription',
|
||||
longDescription: 'csv:csvToTsv.longDescription'
|
||||
},
|
||||
name: 'Convert CSV to TSV',
|
||||
|
||||
path: 'csv-to-tsv',
|
||||
icon: 'codicon:keyboard-tab',
|
||||
description:
|
||||
'Upload your CSV file in the form below and it will automatically get converted to a TSV file. In the tool options, you can customize the input CSV format – specify the field delimiter, quotation character, and comment symbol, as well as skip empty CSV lines, and choose whether to preserve CSV column headers.',
|
||||
shortDescription: 'Convert CSV data to TSV format.',
|
||||
longDescription:
|
||||
'This tool transforms Comma Separated Values (CSV) data to Tab Separated Values (TSV) data. Both CSV and TSV are popular file formats for storing tabular data but they use different delimiters to separate values – CSV uses commas (","), while TSV uses tabs ("\t"). If we compare CSV files to TSV files, then CSV files are much harder to parse than TSV files because the values themselves may contain commas, so it is not always obvious where one field starts and ends without complicated parsing rules. TSV, on the other hand, uses just a tab symbol, which does not usually appear in data, so separating fields in TSV is as simple as splitting the input by the tab character. To convert CSV to TSV, simply input the CSV data in the input of this tool. In rare cases when a CSV file has a delimiter other than a comma, you can specify the current delimiter in the options of the tool. You can also specify the current quote character and the comment start character. Additionally, empty CSV lines can be skipped by activating the "Ignore Lines with No Data" option. If this option is off, then empty lines in the CSV are converted to empty TSV lines. The "Preserve Headers" option allows you to choose whether to process column headers of a CSV file. If the option is selected, then the resulting TSV file will include the first row of the input CSV file, which contains the column names. Alternatively, if the headers option is not selected, the first row will be skipped during the data conversion process. For the reverse conversion from TSV to CSV, you can use our Convert TSV to CSV tool. Csv-abulous!',
|
||||
keywords: ['csv', 'tsv', 'convert', 'transform', 'parse'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -7,11 +7,10 @@ export const tool = defineTool('csv', {
|
||||
description: 'csv:csvToXml.description',
|
||||
shortDescription: 'csv:csvToXml.shortDescription'
|
||||
},
|
||||
name: 'Convert CSV to XML',
|
||||
|
||||
path: 'csv-to-xml',
|
||||
icon: 'mdi-light:xml',
|
||||
description: 'Convert CSV files to XML format with customizable options.',
|
||||
shortDescription: 'Convert CSV data to XML format.',
|
||||
|
||||
keywords: ['csv', 'xml', 'convert', 'transform', 'parse'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -8,14 +8,10 @@ export const tool = defineTool('csv', {
|
||||
shortDescription: 'csv:csvToYaml.shortDescription',
|
||||
longDescription: 'csv:csvToYaml.longDescription'
|
||||
},
|
||||
name: 'Convert CSV to YAML',
|
||||
|
||||
path: 'csv-to-yaml',
|
||||
icon: 'nonicons:yaml-16',
|
||||
description:
|
||||
'Just upload your CSV file in the form below and it will automatically get converted to a YAML file. In the tool options, you can specify the field delimiter character, field quote character, and comment character to adapt the tool to custom CSV formats. Additionally, you can select the output YAML format: one that preserves CSV headers or one that excludes CSV headers.',
|
||||
shortDescription: 'Quickly convert a CSV file to a YAML file.',
|
||||
keywords: ['csv', 'to', 'yaml'],
|
||||
longDescription:
|
||||
'This tool transforms CSV (Comma Separated Values) data into the YAML (Yet Another Markup Language) data. CSV is a simple, tabular format that is used to represent matrix-like data types consisting of rows and columns. YAML, on the other hand, is a more advanced format (actually a superset of JSON), which creates more human-readable data for serialization, and it supports lists, dictionaries, and nested objects. This program supports various input CSV formats – the input data can be comma-separated (default), semicolon-separated, pipe-separated, or use another completely different delimiter. You can specify the exact delimiter your data uses in the options. Similarly, in the options, you can specify the quote character that is used to wrap CSV fields (by default a double-quote symbol). You can also skip lines that start with comments by specifying the comment symbols in the options. This allows you to keep your data clean by skipping unnecessary lines. There are two ways to convert CSV to YAML. The first method converts each CSV row into a YAML list. The second method extracts headers from the first CSV row and creates YAML objects with keys based on these headers. You can also customize the output YAML format by specifying the number of spaces for indenting YAML structures. If you need to perform the reverse conversion, that is, transform YAML into CSV, you can use our Convert YAML to CSV tool. Csv-abulous!',
|
||||
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -2,16 +2,11 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('csv', {
|
||||
name: 'Find incomplete CSV records',
|
||||
path: 'find-incomplete-csv-records',
|
||||
icon: 'tdesign:search-error',
|
||||
description:
|
||||
'Just upload your CSV file in the form below and this tool will automatically check if none of the rows or columns are missing values. In the tool options, you can adjust the input file format (specify the delimiter, quote character, and comment character). Additionally, you can enable checking for empty values, skip empty lines, and set a limit on the number of error messages in the output.',
|
||||
shortDescription:
|
||||
'Quickly find rows and columns in CSV that are missing values.',
|
||||
|
||||
keywords: ['find', 'incomplete', 'csv', 'records'],
|
||||
longDescription:
|
||||
'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.title',
|
||||
|
@@ -7,14 +7,11 @@ export const tool = defineTool('csv', {
|
||||
description: 'csv:insertCsvColumns.description',
|
||||
shortDescription: 'csv:insertCsvColumns.shortDescription'
|
||||
},
|
||||
name: 'Insert CSV columns',
|
||||
|
||||
path: 'insert-csv-columns',
|
||||
icon: 'hugeicons:column-insert',
|
||||
description:
|
||||
'Just upload your CSV file in the form below, paste the new column in the options, and it will automatically get inserted in your CSV. In the tool options, you can also specify more than one column to insert, set the insertion position, and optionally skip the empty and comment lines.',
|
||||
shortDescription:
|
||||
'Quickly insert one or more new columns anywhere in a CSV file.',
|
||||
|
||||
keywords: ['insert', 'csv', 'columns', 'append', 'prepend'],
|
||||
longDescription: '',
|
||||
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -8,14 +8,9 @@ export const tool = defineTool('csv', {
|
||||
shortDescription: 'csv:swapCsvColumns.shortDescription',
|
||||
longDescription: 'csv:swapCsvColumns.longDescription'
|
||||
},
|
||||
name: 'Swap CSV Columns',
|
||||
|
||||
path: 'swap-csv-columns',
|
||||
icon: 'eva:swap-outline',
|
||||
description:
|
||||
'Just upload your CSV file in the form below, specify the columns to swap, and the tool will automatically change the positions of the specified columns in the output file. In the tool options, you can specify the column positions or names that you want to swap, as well as fix incomplete data and optionally remove empty records and records that have been commented out.',
|
||||
shortDescription: 'Reorder CSV columns.',
|
||||
longDescription:
|
||||
'This tool reorganizes CSV data by swapping the positions of its columns. Swapping columns can enhance the readability of a CSV file by placing frequently used data together or in the front for easier data comparison and editing. For example, you can swap the first column with the last or swap the second column with the third. To swap columns based on their positions, select the "Set Column Position" mode and enter the numbers of the "from" and "to" columns to be swapped in the first and second blocks of options. For example, if you have a CSV file with four columns "1, 2, 3, 4" and swap columns with positions "2" and "4", the output CSV will have columns in the order: "1, 4, 3, 2".As an alternative to positions, you can swap columns by specifying their headers (column names on the first row of data). If you enable this mode in the options, then you can enter the column names like "location" and "city", and the program will swap these two columns. If any of the specified columns have incomplete data (some fields are missing), you can choose to skip such data or fill the missing fields with empty values or custom values (specified in the options). Additionally, you can specify the symbol used for comments in the CSV data, such as "#" or "//". If you do not need the commented lines in the output, you can remove them by using the "Delete Comments" checkbox. You can also activate the checkbox "Delete Empty Lines" to get rid of empty lines that contain no visible information. Csv-abulous!',
|
||||
keywords: ['csv', 'swap', 'columns'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -8,14 +8,11 @@ export const tool = defineTool('csv', {
|
||||
shortDescription: 'csv:transposeCsv.shortDescription',
|
||||
longDescription: 'csv:transposeCsv.longDescription'
|
||||
},
|
||||
name: 'Transpose CSV',
|
||||
|
||||
path: 'transpose-csv',
|
||||
icon: 'carbon:transpose',
|
||||
description:
|
||||
'Just upload your CSV file in the form below, and this tool will automatically transpose your CSV. In the tool options, you can specify the character that starts the comment lines in the CSV to remove them. Additionally, if the CSV is incomplete (missing values), you can replace missing values with the empty character or a custom character.',
|
||||
shortDescription: 'Quickly transpose a CSV file.',
|
||||
|
||||
keywords: ['transpose', 'csv'],
|
||||
longDescription:
|
||||
'This tool transposes Comma Separated Values (CSV). It treats the CSV as a matrix of data and flips all elements across the main diagonal. The output contains the same CSV data as the input, but now all the rows have become columns, and all the columns have become rows. After transposition, the CSV file will have opposite dimensions. For example, if the input file has 4 columns and 3 rows, the output file will have 3 columns and 4 rows. During conversion, the program also cleans the data from unnecessary lines and corrects incomplete data. Specifically, the tool automatically deletes all empty records and comments that begin with a specific character, which you can set in the option. Additionally, in cases where the CSV data is corrupted or lost, the utility completes the file with empty fields or custom fields that can be specified in the options. Csv-abulous!',
|
||||
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -7,12 +7,10 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:changeColors.description',
|
||||
shortDescription: 'image:changeColors.shortDescription'
|
||||
},
|
||||
name: 'Change colors in image',
|
||||
|
||||
path: 'change-colors',
|
||||
icon: 'cil:color-fill',
|
||||
description:
|
||||
"World's simplest online Image color changer. Just import your image (JPG, PNG, SVG) in the editor on the left, select which colors to change, and you'll instantly get a new image with the new colors on the right. Free, quick, and very powerful. Import an image – replace its colors.",
|
||||
shortDescription: 'Quickly swap colors in a image',
|
||||
|
||||
keywords: ['change', 'colors', 'in', 'png', 'image', 'jpg'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -7,12 +7,10 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:changeOpacity.description',
|
||||
shortDescription: 'image:changeOpacity.shortDescription'
|
||||
},
|
||||
name: 'Change image Opacity',
|
||||
|
||||
path: 'change-opacity',
|
||||
icon: 'material-symbols:opacity',
|
||||
description:
|
||||
'Easily adjust the transparency of your images. Simply upload your image, use the slider to set the desired opacity level between 0 (fully transparent) and 1 (fully opaque), and download the modified image.',
|
||||
shortDescription: 'Adjust transparency of images',
|
||||
|
||||
keywords: ['opacity', 'transparency', 'png', 'alpha', 'jpg', 'jpeg', 'image'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -7,13 +7,10 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:compress.description',
|
||||
shortDescription: 'image:compress.shortDescription'
|
||||
},
|
||||
name: 'Compress Image',
|
||||
|
||||
path: 'compress',
|
||||
component: lazy(() => import('./index')),
|
||||
icon: 'material-symbols-light:compress-rounded',
|
||||
description:
|
||||
'Compress images to reduce file size while maintaining reasonable quality.',
|
||||
shortDescription:
|
||||
'Compress images to reduce file size while maintaining reasonable quality.',
|
||||
|
||||
keywords: ['image', 'compress', 'reduce', 'quality']
|
||||
});
|
||||
|
@@ -7,12 +7,10 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:convertToJpg.description',
|
||||
shortDescription: 'image:convertToJpg.shortDescription'
|
||||
},
|
||||
name: 'Convert Images to JPG',
|
||||
|
||||
path: 'convert-to-jpg',
|
||||
icon: 'ph:file-jpg-thin',
|
||||
description:
|
||||
'Convert various image formats (PNG, GIF, TIF, PSD, SVG, WEBP, HEIC, RAW) to JPG with customizable quality and background color settings.',
|
||||
shortDescription: 'Convert images to JPG with quality control',
|
||||
|
||||
keywords: [
|
||||
'convert',
|
||||
'jpg',
|
||||
|
@@ -7,12 +7,10 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:createTransparent.description',
|
||||
shortDescription: 'image:createTransparent.shortDescription'
|
||||
},
|
||||
name: 'Create transparent PNG',
|
||||
|
||||
path: 'create-transparent',
|
||||
icon: 'mdi:circle-transparent',
|
||||
shortDescription: 'Quickly make an image transparent',
|
||||
description:
|
||||
"World's simplest online Portable Network Graphics transparency maker. Just import your image in the editor on the left and you will instantly get a transparent PNG on the right. Free, quick, and very powerful. Import an image – get a transparent PNG.",
|
||||
|
||||
keywords: ['create', 'transparent'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -7,11 +7,10 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:crop.description',
|
||||
shortDescription: 'image:crop.shortDescription'
|
||||
},
|
||||
name: 'Crop',
|
||||
|
||||
path: 'crop',
|
||||
icon: 'mdi:crop', // Iconify icon as a string
|
||||
description: 'A tool to crop images with precision and ease.',
|
||||
shortDescription: 'Crop images quickly.',
|
||||
|
||||
keywords: ['crop', 'image', 'edit', 'resize', 'trim'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -7,12 +7,10 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:editor.description',
|
||||
shortDescription: 'image:editor.shortDescription'
|
||||
},
|
||||
name: 'Image Editor',
|
||||
|
||||
path: 'editor',
|
||||
icon: 'mdi:image-edit',
|
||||
description:
|
||||
'Advanced image editor with tools for cropping, rotating, annotating, adjusting colors, and adding watermarks. Edit your images with professional-grade tools directly in your browser.',
|
||||
shortDescription: 'Edit images with advanced tools and features',
|
||||
|
||||
keywords: [
|
||||
'image',
|
||||
'editor',
|
||||
|
@@ -7,12 +7,10 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:imageToText.description',
|
||||
shortDescription: 'image:imageToText.shortDescription'
|
||||
},
|
||||
name: 'Image to Text (OCR)',
|
||||
|
||||
path: 'image-to-text',
|
||||
icon: 'mdi:text-recognition', // Iconify icon as a string
|
||||
description:
|
||||
'Extract text from images (JPG, PNG) using optical character recognition (OCR).',
|
||||
shortDescription: 'Extract text from images using OCR.',
|
||||
|
||||
keywords: [
|
||||
'ocr',
|
||||
'optical character recognition',
|
||||
|
@@ -7,12 +7,9 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:qrCode.description',
|
||||
shortDescription: 'image:qrCode.shortDescription'
|
||||
},
|
||||
name: 'QR Code Generator',
|
||||
|
||||
path: 'qr-code',
|
||||
icon: 'mdi:qrcode', // Iconify icon as a string
|
||||
description:
|
||||
'Generate QR codes for different data types: URL, Text, Email, Phone, SMS, WiFi, vCard, and more.',
|
||||
shortDescription: 'Create customized QR codes for various data formats.',
|
||||
keywords: [
|
||||
'qr code',
|
||||
'qrcode',
|
||||
|
@@ -7,12 +7,10 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:removeBackground.description',
|
||||
shortDescription: 'image:removeBackground.shortDescription'
|
||||
},
|
||||
name: 'Remove Background from Image',
|
||||
|
||||
path: 'remove-background',
|
||||
icon: 'mdi:image-remove',
|
||||
description:
|
||||
"World's simplest online tool to remove backgrounds from images. Just upload your image and our AI-powered tool will automatically remove the background, giving you a transparent PNG. Perfect for product photos, profile pictures, and design assets.",
|
||||
shortDescription: 'Automatically remove backgrounds from images',
|
||||
|
||||
keywords: [
|
||||
'remove',
|
||||
'background',
|
||||
|
@@ -7,12 +7,10 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:resize.description',
|
||||
shortDescription: 'image:resize.shortDescription'
|
||||
},
|
||||
name: 'Resize Image',
|
||||
|
||||
path: 'resize',
|
||||
icon: 'mdi:resize', // Iconify icon as a string
|
||||
description:
|
||||
'Resize JPG, PNG, SVG or GIF images by pixels or percentage while maintaining aspect ratio or not.',
|
||||
shortDescription: 'Resize images easily.',
|
||||
|
||||
keywords: [
|
||||
'resize',
|
||||
'image',
|
||||
|
@@ -7,11 +7,10 @@ export const tool = defineTool('image-generic', {
|
||||
description: 'image:rotate.description',
|
||||
shortDescription: 'image:rotate.shortDescription'
|
||||
},
|
||||
name: 'Rotate Image',
|
||||
|
||||
path: 'rotate',
|
||||
icon: 'mdi:rotate-clockwise',
|
||||
description: 'Rotate an image by a specified angle.',
|
||||
shortDescription: 'Rotate an image easily.',
|
||||
|
||||
keywords: ['rotate', 'image', 'angle', 'jpg', 'png'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -8,12 +8,10 @@ export const tool = defineTool('png', {
|
||||
description: 'image:compressPng.description',
|
||||
shortDescription: 'image:compressPng.shortDescription'
|
||||
},
|
||||
name: 'Compress png',
|
||||
|
||||
path: 'compress-png',
|
||||
icon: 'material-symbols-light:compress',
|
||||
description:
|
||||
'This is a program that compresses PNG pictures. As soon as you paste your PNG picture in the input area, the program will compress it and show the result in the output area. In the options, you can adjust the compression level, as well as find the old and new picture file sizes.',
|
||||
shortDescription: 'Quickly compress a PNG',
|
||||
|
||||
keywords: ['compress', 'png'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -7,12 +7,10 @@ export const tool = defineTool('png', {
|
||||
description: 'image:convertJgpToPng.description',
|
||||
shortDescription: 'image:convertJgpToPng.shortDescription'
|
||||
},
|
||||
name: 'Convert JPG to PNG',
|
||||
|
||||
path: 'convert-jgp-to-png',
|
||||
icon: 'ph:file-jpg-thin',
|
||||
description:
|
||||
'Quickly convert your JPG images to PNG. Just import your PNG image in the editor on the left',
|
||||
shortDescription: 'Quickly convert your JPG images to PNG',
|
||||
|
||||
keywords: ['convert', 'jgp', 'png'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('json', {
|
||||
name: 'Escape JSON',
|
||||
path: 'escape-json',
|
||||
icon: 'material-symbols:code',
|
||||
description:
|
||||
'Escape special characters in JSON strings. Convert JSON data to properly escaped format for safe transmission or storage.',
|
||||
shortDescription: 'Escape special characters in JSON',
|
||||
|
||||
keywords: ['json', 'escape', 'characters', 'format'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('json', {
|
||||
name: 'JSON to XML',
|
||||
path: 'json-to-xml',
|
||||
icon: 'material-symbols:code',
|
||||
description:
|
||||
'Convert JSON data to XML format. Transform structured JSON objects into well-formed XML documents.',
|
||||
shortDescription: 'Convert JSON to XML format',
|
||||
|
||||
keywords: ['json', 'xml', 'convert', 'transform'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('json', {
|
||||
name: 'Minify JSON',
|
||||
path: 'minify',
|
||||
icon: 'material-symbols:code',
|
||||
description:
|
||||
'Minify JSON data by removing unnecessary whitespace and formatting. Reduce file size while maintaining data integrity.',
|
||||
shortDescription: 'Minify JSON by removing whitespace',
|
||||
|
||||
keywords: ['json', 'minify', 'compress', 'whitespace'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('json', {
|
||||
name: 'Prettify JSON',
|
||||
path: 'prettify',
|
||||
icon: 'material-symbols:code',
|
||||
description:
|
||||
'Format and beautify JSON data with proper indentation and spacing. Make JSON files more readable and organized.',
|
||||
shortDescription: 'Format and beautify JSON code',
|
||||
|
||||
keywords: ['json', 'prettify', 'format', 'beautify'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('json', {
|
||||
name: 'Stringify JSON',
|
||||
path: 'stringify',
|
||||
icon: 'material-symbols:code',
|
||||
description:
|
||||
'Convert JavaScript objects to JSON string format. Serialize data structures into JSON strings for storage or transmission.',
|
||||
shortDescription: 'Convert objects to JSON string',
|
||||
|
||||
keywords: ['json', 'stringify', 'serialize', 'convert'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('json', {
|
||||
name: 'TSV to JSON',
|
||||
path: 'tsv-to-json',
|
||||
icon: 'material-symbols:code',
|
||||
description:
|
||||
'Convert TSV (Tab-Separated Values) data to JSON format. Transform tabular data into structured JSON objects.',
|
||||
shortDescription: 'Convert TSV to JSON format',
|
||||
|
||||
keywords: ['tsv', 'json', 'convert', 'tabular'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('json', {
|
||||
name: 'Validate JSON',
|
||||
path: 'validate-json',
|
||||
icon: 'material-symbols:check-circle',
|
||||
description:
|
||||
'Validate JSON code for syntax errors and proper structure. Check if JSON documents follow correct formatting rules.',
|
||||
shortDescription: 'Validate JSON code for errors',
|
||||
|
||||
keywords: ['json', 'validate', 'check', 'syntax', 'errors'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('list', {
|
||||
name: 'Duplicate',
|
||||
path: 'duplicate',
|
||||
icon: 'material-symbols-light:content-copy',
|
||||
description:
|
||||
"World's simplest browser-based utility for duplicating list items. Input your list and specify duplication criteria to create copies of items. Perfect for data expansion, testing, or creating repeated patterns.",
|
||||
shortDescription: 'Duplicate list items with specified criteria',
|
||||
|
||||
keywords: ['duplicate'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('list', {
|
||||
name: 'Find most popular',
|
||||
path: 'find-most-popular',
|
||||
icon: 'material-symbols-light:trending-up',
|
||||
description:
|
||||
"World's simplest browser-based utility for finding the most popular items in a list. Input your list and instantly get the items that appear most frequently. Perfect for data analysis, trend identification, or finding common elements.",
|
||||
shortDescription: 'Find most frequently occurring items',
|
||||
|
||||
keywords: ['find', 'most', 'popular'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('list', {
|
||||
name: 'Find unique',
|
||||
path: 'find-unique',
|
||||
icon: 'material-symbols-light:search',
|
||||
description:
|
||||
"World's simplest browser-based utility for finding unique items in a list. Input your list and instantly get all unique values with duplicates removed. Perfect for data cleaning, deduplication, or finding distinct elements.",
|
||||
shortDescription: 'Find unique items in a list',
|
||||
|
||||
keywords: ['find', 'unique'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('list', {
|
||||
name: 'Group',
|
||||
path: 'group',
|
||||
icon: 'pajamas:group',
|
||||
description:
|
||||
"World's simplest browser-based utility for grouping list items. Input your list and specify grouping criteria to organize items into logical groups. Perfect for categorizing data, organizing information, or creating structured lists. Supports custom separators and various grouping options.",
|
||||
shortDescription: 'Group list items by common properties',
|
||||
|
||||
keywords: ['group'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('list', {
|
||||
name: 'Reverse',
|
||||
path: 'reverse',
|
||||
icon: 'proicons:reverse',
|
||||
description:
|
||||
'This is a super simple browser-based application prints all list items in reverse. The input items can be separated by any symbol and you can also change the separator of the reversed list items.',
|
||||
shortDescription: 'Quickly reverse a list',
|
||||
|
||||
keywords: ['reverse'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('list', {
|
||||
name: 'Rotate',
|
||||
path: 'rotate',
|
||||
icon: 'material-symbols-light:rotate-right',
|
||||
description:
|
||||
"World's simplest browser-based utility for rotating list items. Input your list and specify rotation amount to shift items by a specified number of positions. Perfect for data manipulation, circular shifts, or reordering lists.",
|
||||
shortDescription: 'Rotate list items by specified positions',
|
||||
|
||||
keywords: ['rotate'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('list', {
|
||||
name: 'Shuffle',
|
||||
path: 'shuffle',
|
||||
icon: 'material-symbols-light:shuffle',
|
||||
description:
|
||||
"World's simplest browser-based utility for shuffling list items. Input your list and instantly get a randomized version with items in random order. Perfect for creating variety, testing randomness, or mixing up ordered data.",
|
||||
shortDescription: 'Randomize the order of list items',
|
||||
|
||||
keywords: ['shuffle'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('list', {
|
||||
name: 'Sort',
|
||||
path: 'sort',
|
||||
icon: 'material-symbols-light:sort',
|
||||
description:
|
||||
"World's simplest browser-based utility for sorting list items. Input your list and specify sorting criteria to organize items in ascending or descending order. Perfect for data organization, text processing, or creating ordered lists.",
|
||||
shortDescription: 'Sort list items in specified order',
|
||||
|
||||
keywords: ['sort'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('list', {
|
||||
name: 'Truncate',
|
||||
path: 'truncate',
|
||||
icon: 'material-symbols-light:content-cut',
|
||||
description:
|
||||
"World's simplest browser-based utility for truncating lists. Input your list and specify the maximum number of items to keep. Perfect for data processing, list management, or limiting content length.",
|
||||
shortDescription: 'Truncate list to specified number of items',
|
||||
|
||||
keywords: ['truncate'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('list', {
|
||||
name: 'Unwrap',
|
||||
path: 'unwrap',
|
||||
icon: 'material-symbols-light:unfold-more',
|
||||
description:
|
||||
"World's simplest browser-based utility for unwrapping list items. Input your wrapped list and specify unwrapping criteria to flatten organized items. Perfect for data processing, text manipulation, or extracting content from structured lists.",
|
||||
shortDescription: 'Unwrap list items from structured format',
|
||||
|
||||
keywords: ['unwrap'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('list', {
|
||||
name: 'Wrap',
|
||||
path: 'wrap',
|
||||
icon: 'material-symbols-light:wrap-text',
|
||||
description:
|
||||
"World's simplest browser-based utility for wrapping list items. Input your list and specify wrapping criteria to organize items into logical groups. Perfect for categorizing data, organizing information, or creating structured lists.",
|
||||
shortDescription: 'Wrap list items with specified criteria',
|
||||
|
||||
keywords: ['wrap'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('number', {
|
||||
name: 'Arithmetic Sequence',
|
||||
path: 'arithmetic-sequence',
|
||||
icon: 'material-symbols:functions',
|
||||
description:
|
||||
'Generate arithmetic sequences with specified start value, common difference, and number of terms. Create mathematical progressions for calculations or analysis.',
|
||||
shortDescription: 'Generate arithmetic sequences',
|
||||
|
||||
keywords: ['arithmetic', 'sequence', 'math', 'progression'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('number', {
|
||||
name: 'Generate',
|
||||
path: 'generate',
|
||||
icon: 'material-symbols:add-circle',
|
||||
description:
|
||||
'Generate random numbers within specified ranges. Create sequences of numbers for testing, simulations, or random data generation.',
|
||||
shortDescription: 'Generate random numbers in specified ranges',
|
||||
|
||||
keywords: ['generate', 'random', 'numbers'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -13,13 +13,7 @@ const ohmsLawCalc: GenericCalcType = {
|
||||
'power',
|
||||
'V=IR'
|
||||
],
|
||||
shortDescription:
|
||||
"Calculate voltage, current, or resistance in electrical circuits using Ohm's Law",
|
||||
name: "Ohm's Law",
|
||||
path: 'ohms-law',
|
||||
description: 'Calculates voltage, current and resistance',
|
||||
longDescription:
|
||||
"This calculator applies Ohm's Law (V = I × R) to determine any of the three electrical parameters when the other two are known. Ohm's Law is a fundamental principle in electrical engineering that describes the relationship between voltage (V), current (I), and resistance (R). This tool is essential for electronics hobbyists, electrical engineers, and students working with circuits to quickly solve for unknown values in their electrical designs.",
|
||||
formula: 'V = I * R',
|
||||
i18n: {
|
||||
name: 'number:ohmsLaw.title',
|
||||
|
@@ -11,12 +11,7 @@ const slackline: GenericCalcType = {
|
||||
'tension',
|
||||
'clothesline'
|
||||
],
|
||||
shortDescription:
|
||||
'Calculate the approximate tension of a slackline or clothesline. Do not rely on this for safety.',
|
||||
name: 'Slackline Tension',
|
||||
path: 'slackline-tension',
|
||||
description: 'Calculates tension in a slackline',
|
||||
longDescription: 'This calculator assumes a load in the center of the rope',
|
||||
formula: 'T = (W * sqrt((S**2) + ((L/2)**2)) )/ (2S)',
|
||||
presets: [],
|
||||
i18n: {
|
||||
|
@@ -13,13 +13,7 @@ const areaSphere: GenericCalcType = {
|
||||
'3D',
|
||||
'shape'
|
||||
],
|
||||
shortDescription:
|
||||
'Calculate the surface area of a sphere based on its radius',
|
||||
name: 'Area of a Sphere',
|
||||
path: 'area-sphere',
|
||||
description: 'Area of a Sphere',
|
||||
longDescription:
|
||||
'This calculator determines the surface area of a sphere using the formula A = 4πr². You can either input the radius to find the surface area or enter the surface area to calculate the required radius. This tool is useful for students studying geometry, engineers working with spherical objects, and anyone needing to perform calculations involving spherical surfaces.',
|
||||
formula: 'A = 4 * pi * r**2',
|
||||
presets: [],
|
||||
i18n: {
|
||||
|
@@ -14,8 +14,6 @@ const volumeSphere: GenericCalcType = {
|
||||
'shape',
|
||||
'capacity'
|
||||
],
|
||||
shortDescription: 'Calculate the volume of a sphere using radius or diameter',
|
||||
name: 'Volume of a Sphere',
|
||||
i18n: {
|
||||
name: 'number:sphereVolume.title',
|
||||
description: 'number:sphereVolume.description',
|
||||
@@ -23,9 +21,6 @@ const volumeSphere: GenericCalcType = {
|
||||
longDescription: 'number:sphereVolume.longDescription'
|
||||
},
|
||||
path: 'volume-sphere',
|
||||
description: 'Volume of a Sphere',
|
||||
longDescription:
|
||||
'This calculator computes the volume of a sphere using the formula V = (4/3)πr³. You can input either the radius or diameter to find the volume, or enter the volume to determine the required radius. The tool is valuable for students, engineers, and professionals working with spherical objects in fields such as physics, engineering, and manufacturing.',
|
||||
formula: 'v = (4/3) * pi * r**3',
|
||||
presets: [],
|
||||
variables: [
|
||||
|
@@ -16,9 +16,6 @@ const voltageDropInWire: GenericCalcType = {
|
||||
'AWG',
|
||||
'gauge'
|
||||
],
|
||||
shortDescription:
|
||||
'Calculate voltage drop and power loss in electrical cables based on length, material, and current',
|
||||
name: 'Round trip voltage drop in cable',
|
||||
path: 'cable-voltage-drop',
|
||||
formula: 'x = (((p * L) / (A/10**6) ) *2) * I',
|
||||
i18n: {
|
||||
@@ -27,10 +24,6 @@ const voltageDropInWire: GenericCalcType = {
|
||||
shortDescription: 'number:voltageDropInWire.shortDescription',
|
||||
longDescription: 'number:voltageDropInWire.longDescription'
|
||||
},
|
||||
description:
|
||||
'Calculates round trip voltage and power loss in a 2 conductor cable',
|
||||
longDescription:
|
||||
'This calculator helps determine the voltage drop and power loss in a two-conductor electrical cable. It takes into account the cable length, wire gauge (cross-sectional area), material resistivity, and current flow. The tool calculates the round-trip voltage drop, total resistance of the cable, and the power dissipated as heat. This is particularly useful for electrical engineers, electricians, and hobbyists when designing electrical systems to ensure voltage levels remain within acceptable limits at the load.',
|
||||
presets: [
|
||||
{
|
||||
title: 'Material',
|
||||
|
@@ -26,6 +26,7 @@ import { CustomSnackBarContext } from 'contexts/CustomSnackBarContext';
|
||||
import Typography from '@mui/material/Typography';
|
||||
import Grid from '@mui/material/Grid';
|
||||
import useMediaQuery from '@mui/material/useMediaQuery';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
function numericSolveEquationFor(
|
||||
equation: string,
|
||||
@@ -61,6 +62,7 @@ export default async function makeTool(
|
||||
|
||||
return function GenericCalc({ title }: ToolComponentProps) {
|
||||
const { showSnackBar } = useContext(CustomSnackBarContext);
|
||||
const { t } = useTranslation();
|
||||
const theme = useTheme();
|
||||
const lessThanSmall = useMediaQuery(theme.breakpoints.down('sm'));
|
||||
|
||||
@@ -236,8 +238,8 @@ export default async function makeTool(
|
||||
inputComponent={null}
|
||||
initialValues={initialValues}
|
||||
toolInfo={{
|
||||
title: calcData.name,
|
||||
description: calcData.longDescription
|
||||
title: t(calcData.i18n.name),
|
||||
description: t(calcData.i18n.longDescription)
|
||||
}}
|
||||
verticalGroups
|
||||
// @ts-ignore
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('number', {
|
||||
name: 'Sum',
|
||||
path: 'sum',
|
||||
icon: 'material-symbols:add',
|
||||
description:
|
||||
'Calculate the sum of a list of numbers. Enter numbers separated by commas or newlines to get their total sum.',
|
||||
shortDescription: 'Calculate sum of numbers',
|
||||
|
||||
keywords: ['sum', 'add', 'calculate', 'total'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('pdf', {
|
||||
name: 'Compress PDF',
|
||||
path: 'compress-pdf',
|
||||
icon: 'material-symbols:compress',
|
||||
description:
|
||||
'Reduce PDF file size while maintaining quality using Ghostscript',
|
||||
shortDescription: 'Compress PDF files securely in your browser',
|
||||
|
||||
keywords: [
|
||||
'pdf',
|
||||
'compress',
|
||||
@@ -22,8 +19,7 @@ export const tool = defineTool('pdf', {
|
||||
'browser',
|
||||
'webassembly'
|
||||
],
|
||||
longDescription:
|
||||
'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.title',
|
||||
|
@@ -7,13 +7,10 @@ export const tool = defineTool('pdf', {
|
||||
description: 'pdf:editor.description',
|
||||
shortDescription: 'pdf:editor.shortDescription'
|
||||
},
|
||||
name: 'PDF Editor',
|
||||
|
||||
path: 'editor',
|
||||
icon: 'mdi:file-document-edit',
|
||||
description:
|
||||
'Advanced PDF editor with annotation, form-fill, highlight, and export capabilities. Edit your PDFs directly in the browser with professional-grade tools including text insertion, drawing, highlighting, signing and form filling.',
|
||||
shortDescription:
|
||||
'Edit PDFs with advanced annotation, signing and editing tools',
|
||||
|
||||
keywords: [
|
||||
'pdf',
|
||||
'editor',
|
||||
|
@@ -2,9 +2,6 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const meta = defineTool('pdf', {
|
||||
name: 'Merge PDF',
|
||||
shortDescription: 'Merge multiple PDF files into a single document',
|
||||
description: 'Combine multiple PDF files into a single document.',
|
||||
icon: 'material-symbols-light:merge',
|
||||
component: lazy(() => import('./index')),
|
||||
keywords: ['pdf', 'merge', 'extract', 'pages', 'combine', 'document'],
|
||||
|
@@ -2,10 +2,6 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const meta = defineTool('pdf', {
|
||||
name: 'PDF to EPUB',
|
||||
shortDescription: 'Convert PDF files to EPUB format',
|
||||
description:
|
||||
'Transform PDF documents into EPUB files for better e-reader compatibility.',
|
||||
icon: 'material-symbols:import-contacts',
|
||||
component: lazy(() => import('./index')),
|
||||
keywords: ['pdf', 'epub', 'convert', 'ebook'],
|
||||
|
@@ -8,13 +8,11 @@ export const tool = defineTool('pdf', {
|
||||
shortDescription: 'pdf:pdfToPng.shortDescription',
|
||||
longDescription: 'pdf:pdfToPng.longDescription'
|
||||
},
|
||||
name: 'PDF to PNG',
|
||||
|
||||
path: 'pdf-to-png',
|
||||
icon: 'mdi:image-multiple', // Iconify icon ID
|
||||
description: 'Transform PDF documents into PNG panels.',
|
||||
shortDescription: 'Convert PDF into PNG images',
|
||||
|
||||
keywords: ['pdf', 'png', 'convert', 'image', 'extract', 'pages'],
|
||||
longDescription:
|
||||
'Upload a PDF and convert each page into a high-quality PNG image directly in your browser. This tool is ideal for extracting visual content or sharing individual pages. No data is uploaded — everything runs locally.',
|
||||
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('pdf', {
|
||||
name: 'Protect PDF',
|
||||
path: 'protect-pdf',
|
||||
icon: 'material-symbols:lock',
|
||||
description:
|
||||
'Add password protection to your PDF files securely in your browser',
|
||||
shortDescription: 'Password protect PDF files securely',
|
||||
|
||||
keywords: [
|
||||
'pdf',
|
||||
'protect',
|
||||
@@ -21,8 +18,7 @@ export const tool = defineTool('pdf', {
|
||||
'browser',
|
||||
'encryption'
|
||||
],
|
||||
longDescription:
|
||||
'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.title',
|
||||
|
@@ -8,13 +8,11 @@ export const tool = defineTool('pdf', {
|
||||
shortDescription: 'pdf:rotatePdf.shortDescription',
|
||||
longDescription: 'pdf:rotatePdf.longDescription'
|
||||
},
|
||||
name: 'Rotate PDF',
|
||||
|
||||
path: 'rotate-pdf',
|
||||
icon: 'carbon:rotate',
|
||||
description: 'Rotate PDF pages by 90, 180, or 270 degrees',
|
||||
shortDescription: 'Rotate pages in a PDF document',
|
||||
|
||||
keywords: ['pdf', 'rotate', 'rotation', 'document', 'pages', 'orientation'],
|
||||
longDescription:
|
||||
'Change the orientation of PDF pages by rotating them 90, 180, or 270 degrees. Useful for fixing incorrectly scanned documents or preparing PDFs for printing.',
|
||||
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -2,10 +2,6 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const meta = defineTool('pdf', {
|
||||
name: 'Split PDF',
|
||||
shortDescription: 'Extract specific pages from a PDF file',
|
||||
description:
|
||||
'Extract specific pages from a PDF file using page numbers or ranges (e.g., 1,5-8)',
|
||||
icon: 'material-symbols-light:call-split-rounded',
|
||||
component: lazy(() => import('./index')),
|
||||
keywords: ['pdf', 'split', 'extract', 'pages', 'range', 'document'],
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Base64',
|
||||
path: 'base64',
|
||||
icon: 'tabler:number-64-small',
|
||||
description:
|
||||
'A simple tool to encode or decode data using Base64, which is commonly used in web applications.',
|
||||
shortDescription: 'Encode or decode data using Base64.',
|
||||
|
||||
keywords: ['base64'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,15 +2,10 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Text Censor',
|
||||
path: 'censor',
|
||||
shortDescription:
|
||||
'Quickly mask bad words or replace them with alternative words.',
|
||||
|
||||
icon: 'hugeicons:text-footnote',
|
||||
description:
|
||||
"utility for censoring words in text. Load your text in the input form on the left, specify all the bad words in the options, and you'll instantly get censored text in the output area.",
|
||||
longDescription:
|
||||
'With this online tool, you can censor certain words in any text. You can specify a list of unwanted words (such as swear words or secret words) and the program will replace them with alternative words and create a safe-to-read text. The words can be specified in a multi-line text field in the options by entering one word per line.',
|
||||
|
||||
keywords: ['text', 'censor', 'words', 'characters'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,14 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Create palindrome',
|
||||
path: 'create-palindrome',
|
||||
icon: 'material-symbols-light:repeat',
|
||||
description:
|
||||
"World's simplest browser-based utility for creating palindromes from any text. Input text and instantly transform it into a palindrome that reads the same forward and backward. Perfect for word games, creating symmetrical text patterns, or exploring linguistic curiosities.",
|
||||
shortDescription: 'Create text that reads the same forward and backward',
|
||||
longDescription:
|
||||
'This tool creates a palindrome from the given string. It does it by generating a copy of the string, reversing it, and appending it at the end of the original string. This method creates a palindrome with the last character duplicated twice. There is also another way to do it, which deletes the first letter of the reversed copy. In this case, when the string and the copy are joined together, you also get a palindrome but without the repeating last character. You can compare the two types of palindromes by switching between them in the options. You can also enable the multi-line mode that will create palindromes of every string on every line. Stringabulous!',
|
||||
|
||||
keywords: ['create', 'palindrome'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Extract substring',
|
||||
path: 'extract-substring',
|
||||
icon: 'material-symbols-light:content-cut',
|
||||
description:
|
||||
"World's simplest browser-based utility for extracting substrings from text. Input your text and specify start and end positions to extract the desired portion. Perfect for data processing, text analysis, or extracting specific content from larger text blocks.",
|
||||
shortDescription: 'Extract a portion of text between specified positions',
|
||||
|
||||
keywords: ['extract', 'substring'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Join',
|
||||
path: 'join',
|
||||
icon: 'material-symbols-light:join',
|
||||
description:
|
||||
"World's simplest browser-based utility for joining text elements. Input your text elements and specify a separator to combine them into a single string. Perfect for data processing, text manipulation, or creating formatted output from lists.",
|
||||
shortDescription: 'Join text elements with a specified separator',
|
||||
|
||||
keywords: ['join'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Palindrome',
|
||||
path: 'palindrome',
|
||||
icon: 'material-symbols-light:search',
|
||||
description:
|
||||
"World's simplest browser-based utility for checking if text is a palindrome. Instantly verify if your text reads the same forward and backward. Perfect for word puzzles, linguistic analysis, or validating symmetrical text patterns. Supports various delimiters and multi-word palindrome detection.",
|
||||
shortDescription: 'Check if text reads the same forward and backward',
|
||||
|
||||
keywords: ['palindrome'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Quote',
|
||||
path: 'quote',
|
||||
icon: 'material-symbols-light:format-quote',
|
||||
description:
|
||||
"World's simplest browser-based utility for adding quotes to text. Input your text and instantly add various quote styles around it. Perfect for formatting text, creating citations, or adding emphasis to specific content.",
|
||||
shortDescription: 'Add quotes around text with various styles',
|
||||
|
||||
keywords: ['quote'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -3,12 +3,9 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Randomize case',
|
||||
path: 'randomize-case',
|
||||
icon: 'material-symbols-light:shuffle',
|
||||
description:
|
||||
"World's simplest browser-based utility for randomizing text case. Input your text and instantly transform it with random upper and lower case letters. Perfect for creating unique text effects, testing case sensitivity, or generating varied text patterns.",
|
||||
shortDescription: 'Randomize the case of letters in text',
|
||||
|
||||
keywords: ['randomize', 'case'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Remove duplicate lines',
|
||||
path: 'remove-duplicate-lines',
|
||||
icon: 'pepicons-print:duplicate-off',
|
||||
description:
|
||||
"Load your text in the input form on the left and you'll instantly get text with no duplicate lines in the output area. Powerful, free, and fast. Load text lines – get unique text lines",
|
||||
shortDescription: 'Quickly delete all repeated lines from text',
|
||||
|
||||
keywords: ['remove', 'duplicate', 'lines'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,10 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Repeat text',
|
||||
path: 'repeat',
|
||||
shortDescription: 'Repeat text multiple times',
|
||||
|
||||
icon: 'material-symbols-light:replay',
|
||||
description:
|
||||
'This tool allows you to repeat a given text multiple times with an optional separator.',
|
||||
|
||||
keywords: ['text', 'repeat'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Reverse',
|
||||
path: 'reverse',
|
||||
icon: 'material-symbols-light:swap-horiz',
|
||||
description:
|
||||
"World's simplest browser-based utility for reversing text. Input any text and get it instantly reversed, character by character. Perfect for creating mirror text, analyzing palindromes, or playing with text patterns. Preserves spaces and special characters while reversing.",
|
||||
shortDescription: 'Reverse any text character by character',
|
||||
|
||||
keywords: ['reverse'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -8,12 +8,10 @@ export const tool = defineTool('string', {
|
||||
description: 'string:rot13.description',
|
||||
shortDescription: 'string:rot13.shortDescription'
|
||||
},
|
||||
name: 'Rot13',
|
||||
|
||||
path: 'rot13',
|
||||
icon: 'hugeicons:encrypt',
|
||||
description:
|
||||
'A simple tool to encode or decode text using the ROT13 cipher, which replaces each letter with the letter 13 positions after it in the alphabet.',
|
||||
shortDescription: 'Encode or decode text using ROT13 cipher.',
|
||||
|
||||
keywords: ['rot13'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -8,12 +8,10 @@ export const tool = defineTool('string', {
|
||||
description: 'string:rotate.description',
|
||||
shortDescription: 'string:rotate.shortDescription'
|
||||
},
|
||||
name: 'Rotate',
|
||||
|
||||
path: 'rotate',
|
||||
icon: 'carbon:rotate',
|
||||
description:
|
||||
'A tool to rotate characters in a string by a specified number of positions. Shift characters left or right while maintaining their relative order.',
|
||||
shortDescription: 'Shift characters in text by position.',
|
||||
|
||||
keywords: ['rotate'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Split',
|
||||
path: 'split',
|
||||
icon: 'material-symbols-light:call-split',
|
||||
description:
|
||||
"World's simplest browser-based utility for splitting text. Input your text and specify a separator to split it into multiple parts. Perfect for data processing, text manipulation, or extracting specific content from larger text blocks.",
|
||||
shortDescription: 'Split text into multiple parts using a separator',
|
||||
|
||||
keywords: ['split'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,14 +2,10 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Text Statistics',
|
||||
path: 'statistics',
|
||||
shortDescription: 'Get statistics about your text',
|
||||
|
||||
icon: 'fluent:document-landscape-data-24-filled',
|
||||
description:
|
||||
'Load your text in the input form on the left and you will automatically get statistics about your text on the right.',
|
||||
longDescription:
|
||||
'This tool provides various statistics about the text you input, including the number of lines, words, and characters. You can also choose to include empty lines in the count. it can count words and characters based on custom delimiters, allowing for flexible text analysis. Additionally, it can provide frequency statistics for words and characters, helping you understand the distribution of terms in your text.',
|
||||
|
||||
keywords: ['text', 'statistics', 'count', 'lines', 'words', 'characters'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -7,12 +7,11 @@ export const tool = defineTool('string', {
|
||||
description: 'string:textReplacer.description',
|
||||
shortDescription: 'string:textReplacer.shortDescription'
|
||||
},
|
||||
name: 'Text Replacer',
|
||||
|
||||
path: 'replacer',
|
||||
shortDescription: 'Quickly replace text in your content',
|
||||
|
||||
icon: 'material-symbols-light:find-replace',
|
||||
description:
|
||||
'Easily replace specific text in your content with this simple, browser-based tool. Just input your text, set the text you want to replace and the replacement value, and instantly get the updated version.',
|
||||
|
||||
keywords: ['text', 'replace'],
|
||||
component: lazy(() => import('./index'))
|
||||
});
|
||||
|
@@ -3,12 +3,8 @@ import { lazy } from 'react';
|
||||
// import image from '@assets/text.png';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'String To morse',
|
||||
path: 'to-morse',
|
||||
icon: 'arcticons:morse',
|
||||
description:
|
||||
"World's simplest browser-based utility for converting text to Morse code. Load your text in the input form on the left and you'll instantly get Morse code in the output area. Powerful, free, and fast. Load text – get Morse code.",
|
||||
shortDescription: 'Quickly encode text to morse',
|
||||
keywords: ['to', 'morse'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Truncate',
|
||||
path: 'truncate',
|
||||
icon: 'material-symbols-light:content-cut',
|
||||
description:
|
||||
"World's simplest browser-based utility for truncating text. Input your text and specify the maximum length to cut it down. Perfect for data processing, text formatting, or limiting content length.",
|
||||
shortDescription: 'Truncate text to a specified length',
|
||||
|
||||
keywords: ['truncate'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('string', {
|
||||
name: 'Uppercase',
|
||||
path: 'uppercase',
|
||||
icon: 'material-symbols-light:format-textdirection-l-to-r',
|
||||
description:
|
||||
"World's simplest browser-based utility for converting text to uppercase. Input your text and instantly get all characters in uppercase. Perfect for formatting, shouting, or emphasizing text.",
|
||||
shortDescription: 'Convert text to uppercase',
|
||||
|
||||
keywords: ['uppercase'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('time', {
|
||||
name: 'Check Leap Years',
|
||||
path: 'check-leap-years',
|
||||
icon: 'material-symbols:calendar-month',
|
||||
description:
|
||||
'Check if a year is a leap year. Enter a year to determine if it has 366 days instead of 365.',
|
||||
shortDescription: 'Check if a year is a leap year',
|
||||
|
||||
keywords: ['leap', 'year', 'calendar', 'date'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('time', {
|
||||
name: 'Convert Days to Hours',
|
||||
path: 'convert-days-to-hours',
|
||||
icon: 'material-symbols:schedule',
|
||||
description:
|
||||
'Convert days to hours. Enter the number of days to get the equivalent number of hours.',
|
||||
shortDescription: 'Convert days to hours',
|
||||
|
||||
keywords: ['days', 'hours', 'convert', 'time'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('time', {
|
||||
name: 'Convert Hours to Days',
|
||||
path: 'convert-hours-to-days',
|
||||
icon: 'material-symbols:schedule',
|
||||
description:
|
||||
'Convert hours to days. Enter the number of hours to get the equivalent number of days.',
|
||||
shortDescription: 'Convert hours to days',
|
||||
|
||||
keywords: ['hours', 'days', 'convert', 'time'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('time', {
|
||||
name: 'Convert Seconds to Time',
|
||||
path: 'convert-seconds-to-time',
|
||||
icon: 'material-symbols:schedule',
|
||||
description:
|
||||
'Convert seconds to a readable time format (hours:minutes:seconds). Enter the number of seconds to get the formatted time.',
|
||||
shortDescription: 'Convert seconds to time format',
|
||||
|
||||
keywords: ['seconds', 'time', 'convert', 'format'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('time', {
|
||||
name: 'Convert Time to Seconds',
|
||||
path: 'convert-time-to-seconds',
|
||||
icon: 'material-symbols:schedule',
|
||||
description:
|
||||
'Convert time format (hours:minutes:seconds) to total seconds. Enter time in HH:MM:SS format to get the total seconds.',
|
||||
shortDescription: 'Convert time format to seconds',
|
||||
|
||||
keywords: ['time', 'seconds', 'convert', 'format'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('time', {
|
||||
name: 'Crontab Guru',
|
||||
path: 'crontab-guru',
|
||||
icon: 'material-symbols:schedule',
|
||||
description:
|
||||
'Generate and understand cron expressions. Create cron schedules for automated tasks and system jobs.',
|
||||
shortDescription: 'Generate and understand cron expressions',
|
||||
|
||||
keywords: ['cron', 'schedule', 'automation', 'expression'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('time', {
|
||||
name: 'Time Between Dates',
|
||||
path: 'time-between-dates',
|
||||
icon: 'material-symbols:schedule',
|
||||
description:
|
||||
'Calculate the time difference between two dates. Get the exact duration in days, hours, minutes, and seconds.',
|
||||
shortDescription: 'Calculate time between two dates',
|
||||
|
||||
keywords: ['dates', 'time', 'difference', 'duration', 'calculate'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('time', {
|
||||
name: 'Truncate Clock Time',
|
||||
path: 'truncate-clock-time',
|
||||
icon: 'material-symbols:schedule',
|
||||
description:
|
||||
'Truncate clock time to remove seconds or minutes. Round time to the nearest hour, minute, or custom interval.',
|
||||
shortDescription: 'Truncate clock time to specified precision',
|
||||
|
||||
keywords: ['time', 'truncate', 'clock', 'round', 'precision'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('video', {
|
||||
name: 'Change Video Speed',
|
||||
path: 'change-speed',
|
||||
icon: 'material-symbols:speed',
|
||||
description:
|
||||
'Change the playback speed of video files. Speed up or slow down videos while maintaining audio synchronization. Supports various speed multipliers and common video formats.',
|
||||
shortDescription: 'Change video playback speed',
|
||||
|
||||
keywords: ['video', 'speed', 'playback', 'fast', 'slow'],
|
||||
component: lazy(() => import('./index')),
|
||||
i18n: {
|
||||
|
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('video', {
|
||||
name: 'Compress Video',
|
||||
path: 'compress',
|
||||
icon: 'icon-park-outline:compression',
|
||||
description:
|
||||
'Compress videos by scaling them to different resolutions like 240p, 480p, 720p, etc. This tool helps reduce file size while maintaining acceptable quality. Supports common video formats like MP4, WebM, and OGG.',
|
||||
shortDescription: 'Compress videos by scaling to different resolutions',
|
||||
|
||||
keywords: [
|
||||
'compress',
|
||||
'video',
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user