diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..13e044a
--- /dev/null
+++ b/.env.example
@@ -0,0 +1 @@
+LOCIZE_API_KEY=
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 68657e1..9752f3f 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,19 +4,26 @@
-
-
-
+
+
-
+
+
+
+
+
+
+
+
+
-
+
@@ -32,18 +39,84 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -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 @@
+
-
@@ -357,28 +433,11 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
@@ -396,23 +455,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
-
-
+
+
+
-
-
@@ -524,55 +616,8 @@
-
-
-
-
- 1743355166425
-
-
-
- 1743355166426
-
-
-
- 1743385388051
-
-
-
- 1743385388051
-
-
-
- 1743385467178
-
-
-
- 1743385467178
-
-
-
- 1743385898871
-
-
-
- 1743385898871
-
-
-
- 1743459110471
-
-
-
- 1743459110471
-
-
-
- 1743459205311
-
-
-
- 1743459205311
+
+
@@ -918,7 +963,55 @@
1752493634215
-
+
+
+ 1752497705915
+
+
+
+ 1752497705915
+
+
+
+ 1752501110885
+
+
+
+ 1752501110885
+
+
+
+ 1752503206380
+
+
+
+ 1752503206380
+
+
+
+ 1752503720380
+
+
+
+ 1752503720380
+
+
+
+ 1752503770543
+
+
+
+ 1752503770543
+
+
+
+ 1752505593881
+
+
+
+ 1752505593881
+
+
@@ -965,10 +1058,6 @@
-
-
-
-
@@ -987,10 +1076,14 @@
-
-
+
+
+
+
+
+
false
diff --git a/package-lock.json b/package-lock.json
index f89ce29..cc72c78 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -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",
diff --git a/package.json b/package.json
index af2ba56..28984c7 100644
--- a/package.json
+++ b/package.json
@@ -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",
diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx
index 029b0d5..03cab77 100644
--- a/src/components/Hero.tsx
+++ b/src/components/Hero.tsx
@@ -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('');
const theme = useTheme();
const [filteredTools, setFilteredTools] = useState(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 (
- {t('hero.title')}{' '}
+ {t('translation:hero.title')}{' '}
- {t('hero.brand')}
+ {t('translation:hero.brand')}
@@ -118,7 +119,7 @@ export default function Hero() {
fontSize={{ xs: 15, md: 20 }}
mb={2}
>
- {t('hero.description')}
+ {t('translation:hero.description')}
option.name}
+ getOptionLabel={(option) => t(option.name)}
renderInput={(params) => (
,
@@ -161,8 +162,10 @@ export default function Hero() {
- {option.name}
- {option.shortDescription}
+ {t(option.name)}
+
+ {t(option.shortDescription)}
+
diff --git a/src/components/ToolLayout.tsx b/src/components/ToolLayout.tsx
index 9457dce..f5a1e97 100644
--- a/src/components/ToolLayout.tsx
+++ b/src/components/ToolLayout.tsx
@@ -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,
diff --git a/src/i18n/index.ts b/src/i18n/index.ts
index 536051e..eae0cde 100644
--- a/src/i18n/index.ts
+++ b/src/i18n/index.ts
@@ -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}`;
}[I18nNamespaces];
@@ -42,7 +44,7 @@ export type FullI18nKey = {
i18n.use(initReactI18next).init({
lng: 'en',
fallbackLng: 'en',
- debug: useLocize,
+ debug: false,
backend: useLocize
? locizeOptions
: {
diff --git a/src/pages/tools-by-category/index.tsx b/src/pages/tools-by-category/index.tsx
index 63b4f36..44324fb 100644
--- a/src/pages/tools-by-category/index.tsx
+++ b/src/pages/tools-by-category/index.tsx
@@ -37,15 +37,18 @@ export default function ToolsByCategory() {
const { categoryName } = useParams();
const [searchTerm, setSearchTerm] = React.useState('');
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' });
diff --git a/src/pages/tools/audio/change-speed/meta.ts b/src/pages/tools/audio/change-speed/meta.ts
index b0341b1..addfefe 100644
--- a/src/pages/tools/audio/change-speed/meta.ts
+++ b/src/pages/tools/audio/change-speed/meta.ts
@@ -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',
diff --git a/src/pages/tools/audio/extract-audio/meta.ts b/src/pages/tools/audio/extract-audio/meta.ts
index 792c7fc..e01b58f 100644
--- a/src/pages/tools/audio/extract-audio/meta.ts
+++ b/src/pages/tools/audio/extract-audio/meta.ts
@@ -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',
diff --git a/src/pages/tools/audio/merge-audio/meta.ts b/src/pages/tools/audio/merge-audio/meta.ts
index 287db27..e413504 100644
--- a/src/pages/tools/audio/merge-audio/meta.ts
+++ b/src/pages/tools/audio/merge-audio/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/audio/trim/meta.ts b/src/pages/tools/audio/trim/meta.ts
index 4d3bebb..5509d79 100644
--- a/src/pages/tools/audio/trim/meta.ts
+++ b/src/pages/tools/audio/trim/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/csv/change-csv-separator/meta.ts b/src/pages/tools/csv/change-csv-separator/meta.ts
index 6ea60bf..5c7fb08 100644
--- a/src/pages/tools/csv/change-csv-separator/meta.ts
+++ b/src/pages/tools/csv/change-csv-separator/meta.ts
@@ -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: {
diff --git a/src/pages/tools/csv/csv-rows-to-columns/meta.ts b/src/pages/tools/csv/csv-rows-to-columns/meta.ts
index 426fc21..7a1869e 100644
--- a/src/pages/tools/csv/csv-rows-to-columns/meta.ts
+++ b/src/pages/tools/csv/csv-rows-to-columns/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/csv/csv-to-json/meta.ts b/src/pages/tools/csv/csv-to-json/meta.ts
index 5d936f5..64840d1 100644
--- a/src/pages/tools/csv/csv-to-json/meta.ts
+++ b/src/pages/tools/csv/csv-to-json/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/csv/csv-to-tsv/meta.ts b/src/pages/tools/csv/csv-to-tsv/meta.ts
index bdd3432..6105e00 100644
--- a/src/pages/tools/csv/csv-to-tsv/meta.ts
+++ b/src/pages/tools/csv/csv-to-tsv/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/csv/csv-to-xml/meta.ts b/src/pages/tools/csv/csv-to-xml/meta.ts
index 5e720cc..bbaae24 100644
--- a/src/pages/tools/csv/csv-to-xml/meta.ts
+++ b/src/pages/tools/csv/csv-to-xml/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/csv/csv-to-yaml/meta.ts b/src/pages/tools/csv/csv-to-yaml/meta.ts
index 56859b9..7623c7a 100644
--- a/src/pages/tools/csv/csv-to-yaml/meta.ts
+++ b/src/pages/tools/csv/csv-to-yaml/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/csv/find-incomplete-csv-records/meta.ts b/src/pages/tools/csv/find-incomplete-csv-records/meta.ts
index fb9a250..f8436e8 100644
--- a/src/pages/tools/csv/find-incomplete-csv-records/meta.ts
+++ b/src/pages/tools/csv/find-incomplete-csv-records/meta.ts
@@ -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',
diff --git a/src/pages/tools/csv/insert-csv-columns/meta.ts b/src/pages/tools/csv/insert-csv-columns/meta.ts
index 2c8dd76..66c4cf6 100644
--- a/src/pages/tools/csv/insert-csv-columns/meta.ts
+++ b/src/pages/tools/csv/insert-csv-columns/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/csv/swap-csv-columns/meta.ts b/src/pages/tools/csv/swap-csv-columns/meta.ts
index 0792282..8e4739c 100644
--- a/src/pages/tools/csv/swap-csv-columns/meta.ts
+++ b/src/pages/tools/csv/swap-csv-columns/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/csv/transpose-csv/meta.ts b/src/pages/tools/csv/transpose-csv/meta.ts
index dc19d96..ddda470 100644
--- a/src/pages/tools/csv/transpose-csv/meta.ts
+++ b/src/pages/tools/csv/transpose-csv/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/image/generic/change-colors/meta.ts b/src/pages/tools/image/generic/change-colors/meta.ts
index 32656b3..6594fcc 100644
--- a/src/pages/tools/image/generic/change-colors/meta.ts
+++ b/src/pages/tools/image/generic/change-colors/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/image/generic/change-opacity/meta.ts b/src/pages/tools/image/generic/change-opacity/meta.ts
index 154ab0b..a30cd99 100644
--- a/src/pages/tools/image/generic/change-opacity/meta.ts
+++ b/src/pages/tools/image/generic/change-opacity/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/image/generic/compress/meta.ts b/src/pages/tools/image/generic/compress/meta.ts
index 6be2258..7cd8c6c 100644
--- a/src/pages/tools/image/generic/compress/meta.ts
+++ b/src/pages/tools/image/generic/compress/meta.ts
@@ -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']
});
diff --git a/src/pages/tools/image/generic/convert-to-jpg/meta.ts b/src/pages/tools/image/generic/convert-to-jpg/meta.ts
index bf77a69..05c76c4 100644
--- a/src/pages/tools/image/generic/convert-to-jpg/meta.ts
+++ b/src/pages/tools/image/generic/convert-to-jpg/meta.ts
@@ -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',
diff --git a/src/pages/tools/image/generic/create-transparent/meta.ts b/src/pages/tools/image/generic/create-transparent/meta.ts
index c222333..50fe18a 100644
--- a/src/pages/tools/image/generic/create-transparent/meta.ts
+++ b/src/pages/tools/image/generic/create-transparent/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/image/generic/crop/meta.ts b/src/pages/tools/image/generic/crop/meta.ts
index 1d5e93a..8f93b1d 100644
--- a/src/pages/tools/image/generic/crop/meta.ts
+++ b/src/pages/tools/image/generic/crop/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/image/generic/editor/meta.ts b/src/pages/tools/image/generic/editor/meta.ts
index 39220cd..b9e25d9 100644
--- a/src/pages/tools/image/generic/editor/meta.ts
+++ b/src/pages/tools/image/generic/editor/meta.ts
@@ -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',
diff --git a/src/pages/tools/image/generic/image-to-text/meta.ts b/src/pages/tools/image/generic/image-to-text/meta.ts
index 630dffd..501023a 100644
--- a/src/pages/tools/image/generic/image-to-text/meta.ts
+++ b/src/pages/tools/image/generic/image-to-text/meta.ts
@@ -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',
diff --git a/src/pages/tools/image/generic/qr-code/meta.ts b/src/pages/tools/image/generic/qr-code/meta.ts
index cabb654..ee3ab35 100644
--- a/src/pages/tools/image/generic/qr-code/meta.ts
+++ b/src/pages/tools/image/generic/qr-code/meta.ts
@@ -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',
diff --git a/src/pages/tools/image/generic/remove-background/meta.ts b/src/pages/tools/image/generic/remove-background/meta.ts
index 5c0aaf9..8bf12d0 100644
--- a/src/pages/tools/image/generic/remove-background/meta.ts
+++ b/src/pages/tools/image/generic/remove-background/meta.ts
@@ -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',
diff --git a/src/pages/tools/image/generic/resize/meta.ts b/src/pages/tools/image/generic/resize/meta.ts
index bbee85d..fbc4d1f 100644
--- a/src/pages/tools/image/generic/resize/meta.ts
+++ b/src/pages/tools/image/generic/resize/meta.ts
@@ -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',
diff --git a/src/pages/tools/image/generic/rotate/meta.ts b/src/pages/tools/image/generic/rotate/meta.ts
index 86602b8..80e7d67 100644
--- a/src/pages/tools/image/generic/rotate/meta.ts
+++ b/src/pages/tools/image/generic/rotate/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/image/png/compress-png/meta.ts b/src/pages/tools/image/png/compress-png/meta.ts
index 9a682c3..224d20e 100644
--- a/src/pages/tools/image/png/compress-png/meta.ts
+++ b/src/pages/tools/image/png/compress-png/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/image/png/convert-jgp-to-png/meta.ts b/src/pages/tools/image/png/convert-jgp-to-png/meta.ts
index 99adbbc..8fe2fc4 100644
--- a/src/pages/tools/image/png/convert-jgp-to-png/meta.ts
+++ b/src/pages/tools/image/png/convert-jgp-to-png/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/json/escape-json/meta.ts b/src/pages/tools/json/escape-json/meta.ts
index 91a0f62..2b57258 100644
--- a/src/pages/tools/json/escape-json/meta.ts
+++ b/src/pages/tools/json/escape-json/meta.ts
@@ -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: {
diff --git a/src/pages/tools/json/json-to-xml/meta.ts b/src/pages/tools/json/json-to-xml/meta.ts
index 677a37d..e737dc1 100644
--- a/src/pages/tools/json/json-to-xml/meta.ts
+++ b/src/pages/tools/json/json-to-xml/meta.ts
@@ -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: {
diff --git a/src/pages/tools/json/minify/meta.ts b/src/pages/tools/json/minify/meta.ts
index e19beec..e856cb3 100644
--- a/src/pages/tools/json/minify/meta.ts
+++ b/src/pages/tools/json/minify/meta.ts
@@ -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: {
diff --git a/src/pages/tools/json/prettify/meta.ts b/src/pages/tools/json/prettify/meta.ts
index ad9ca8f..58a7102 100644
--- a/src/pages/tools/json/prettify/meta.ts
+++ b/src/pages/tools/json/prettify/meta.ts
@@ -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: {
diff --git a/src/pages/tools/json/stringify/meta.ts b/src/pages/tools/json/stringify/meta.ts
index 86689f6..1a6e02c 100644
--- a/src/pages/tools/json/stringify/meta.ts
+++ b/src/pages/tools/json/stringify/meta.ts
@@ -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: {
diff --git a/src/pages/tools/json/tsv-to-json/meta.ts b/src/pages/tools/json/tsv-to-json/meta.ts
index 8c824aa..0f644a3 100644
--- a/src/pages/tools/json/tsv-to-json/meta.ts
+++ b/src/pages/tools/json/tsv-to-json/meta.ts
@@ -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: {
diff --git a/src/pages/tools/json/validateJson/meta.ts b/src/pages/tools/json/validateJson/meta.ts
index cefda4b..c18b58b 100644
--- a/src/pages/tools/json/validateJson/meta.ts
+++ b/src/pages/tools/json/validateJson/meta.ts
@@ -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: {
diff --git a/src/pages/tools/list/duplicate/meta.ts b/src/pages/tools/list/duplicate/meta.ts
index d4871e9..e9d2dbd 100644
--- a/src/pages/tools/list/duplicate/meta.ts
+++ b/src/pages/tools/list/duplicate/meta.ts
@@ -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: {
diff --git a/src/pages/tools/list/find-most-popular/meta.ts b/src/pages/tools/list/find-most-popular/meta.ts
index 760225c..20a8258 100644
--- a/src/pages/tools/list/find-most-popular/meta.ts
+++ b/src/pages/tools/list/find-most-popular/meta.ts
@@ -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: {
diff --git a/src/pages/tools/list/find-unique/meta.ts b/src/pages/tools/list/find-unique/meta.ts
index 6ac3cdc..d9828a3 100644
--- a/src/pages/tools/list/find-unique/meta.ts
+++ b/src/pages/tools/list/find-unique/meta.ts
@@ -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: {
diff --git a/src/pages/tools/list/group/meta.ts b/src/pages/tools/list/group/meta.ts
index 4827432..394b61c 100644
--- a/src/pages/tools/list/group/meta.ts
+++ b/src/pages/tools/list/group/meta.ts
@@ -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: {
diff --git a/src/pages/tools/list/reverse/meta.ts b/src/pages/tools/list/reverse/meta.ts
index 50364e2..ff500fa 100644
--- a/src/pages/tools/list/reverse/meta.ts
+++ b/src/pages/tools/list/reverse/meta.ts
@@ -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: {
diff --git a/src/pages/tools/list/rotate/meta.ts b/src/pages/tools/list/rotate/meta.ts
index e57a39a..70a0691 100644
--- a/src/pages/tools/list/rotate/meta.ts
+++ b/src/pages/tools/list/rotate/meta.ts
@@ -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: {
diff --git a/src/pages/tools/list/shuffle/meta.ts b/src/pages/tools/list/shuffle/meta.ts
index 5c01f1a..bb01cd7 100644
--- a/src/pages/tools/list/shuffle/meta.ts
+++ b/src/pages/tools/list/shuffle/meta.ts
@@ -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: {
diff --git a/src/pages/tools/list/sort/meta.ts b/src/pages/tools/list/sort/meta.ts
index 065b009..6b7fac3 100644
--- a/src/pages/tools/list/sort/meta.ts
+++ b/src/pages/tools/list/sort/meta.ts
@@ -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: {
diff --git a/src/pages/tools/list/truncate/meta.ts b/src/pages/tools/list/truncate/meta.ts
index d35547c..8e42e91 100644
--- a/src/pages/tools/list/truncate/meta.ts
+++ b/src/pages/tools/list/truncate/meta.ts
@@ -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: {
diff --git a/src/pages/tools/list/unwrap/meta.ts b/src/pages/tools/list/unwrap/meta.ts
index 88b9755..9f52494 100644
--- a/src/pages/tools/list/unwrap/meta.ts
+++ b/src/pages/tools/list/unwrap/meta.ts
@@ -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: {
diff --git a/src/pages/tools/list/wrap/meta.ts b/src/pages/tools/list/wrap/meta.ts
index a7ed1b7..de7783a 100644
--- a/src/pages/tools/list/wrap/meta.ts
+++ b/src/pages/tools/list/wrap/meta.ts
@@ -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: {
diff --git a/src/pages/tools/number/arithmetic-sequence/meta.ts b/src/pages/tools/number/arithmetic-sequence/meta.ts
index f5a4c1f..20a14b6 100644
--- a/src/pages/tools/number/arithmetic-sequence/meta.ts
+++ b/src/pages/tools/number/arithmetic-sequence/meta.ts
@@ -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: {
diff --git a/src/pages/tools/number/generate/meta.ts b/src/pages/tools/number/generate/meta.ts
index 5a79cfc..3ef2739 100644
--- a/src/pages/tools/number/generate/meta.ts
+++ b/src/pages/tools/number/generate/meta.ts
@@ -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: {
diff --git a/src/pages/tools/number/generic-calc/data/ohmsLaw.ts b/src/pages/tools/number/generic-calc/data/ohmsLaw.ts
index 40d6a4e..87ed54b 100644
--- a/src/pages/tools/number/generic-calc/data/ohmsLaw.ts
+++ b/src/pages/tools/number/generic-calc/data/ohmsLaw.ts
@@ -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',
diff --git a/src/pages/tools/number/generic-calc/data/slackline.ts b/src/pages/tools/number/generic-calc/data/slackline.ts
index 830b83b..0d1c7b2 100644
--- a/src/pages/tools/number/generic-calc/data/slackline.ts
+++ b/src/pages/tools/number/generic-calc/data/slackline.ts
@@ -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: {
diff --git a/src/pages/tools/number/generic-calc/data/sphereArea.ts b/src/pages/tools/number/generic-calc/data/sphereArea.ts
index 2a83d30..029a4a6 100644
--- a/src/pages/tools/number/generic-calc/data/sphereArea.ts
+++ b/src/pages/tools/number/generic-calc/data/sphereArea.ts
@@ -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: {
diff --git a/src/pages/tools/number/generic-calc/data/sphereVolume.ts b/src/pages/tools/number/generic-calc/data/sphereVolume.ts
index 1b59eac..07c629f 100644
--- a/src/pages/tools/number/generic-calc/data/sphereVolume.ts
+++ b/src/pages/tools/number/generic-calc/data/sphereVolume.ts
@@ -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: [
diff --git a/src/pages/tools/number/generic-calc/data/voltageDropInWire.ts b/src/pages/tools/number/generic-calc/data/voltageDropInWire.ts
index 512bb01..3bae1a3 100644
--- a/src/pages/tools/number/generic-calc/data/voltageDropInWire.ts
+++ b/src/pages/tools/number/generic-calc/data/voltageDropInWire.ts
@@ -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',
diff --git a/src/pages/tools/number/generic-calc/index.tsx b/src/pages/tools/number/generic-calc/index.tsx
index 99ba5a2..c311c18 100644
--- a/src/pages/tools/number/generic-calc/index.tsx
+++ b/src/pages/tools/number/generic-calc/index.tsx
@@ -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
diff --git a/src/pages/tools/number/sum/meta.ts b/src/pages/tools/number/sum/meta.ts
index 187d958..4b7b9b9 100644
--- a/src/pages/tools/number/sum/meta.ts
+++ b/src/pages/tools/number/sum/meta.ts
@@ -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: {
diff --git a/src/pages/tools/pdf/compress-pdf/meta.ts b/src/pages/tools/pdf/compress-pdf/meta.ts
index efa440c..bbe0990 100644
--- a/src/pages/tools/pdf/compress-pdf/meta.ts
+++ b/src/pages/tools/pdf/compress-pdf/meta.ts
@@ -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',
diff --git a/src/pages/tools/pdf/editor/meta.ts b/src/pages/tools/pdf/editor/meta.ts
index 5314385..9d9901f 100644
--- a/src/pages/tools/pdf/editor/meta.ts
+++ b/src/pages/tools/pdf/editor/meta.ts
@@ -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',
diff --git a/src/pages/tools/pdf/merge-pdf/meta.ts b/src/pages/tools/pdf/merge-pdf/meta.ts
index ca5ec98..b393bf2 100644
--- a/src/pages/tools/pdf/merge-pdf/meta.ts
+++ b/src/pages/tools/pdf/merge-pdf/meta.ts
@@ -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'],
diff --git a/src/pages/tools/pdf/pdf-to-epub/meta.ts b/src/pages/tools/pdf/pdf-to-epub/meta.ts
index fa9f341..411814f 100644
--- a/src/pages/tools/pdf/pdf-to-epub/meta.ts
+++ b/src/pages/tools/pdf/pdf-to-epub/meta.ts
@@ -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'],
diff --git a/src/pages/tools/pdf/pdf-to-png/meta.ts b/src/pages/tools/pdf/pdf-to-png/meta.ts
index 7f420c8..dc3efb5 100644
--- a/src/pages/tools/pdf/pdf-to-png/meta.ts
+++ b/src/pages/tools/pdf/pdf-to-png/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/pdf/protect-pdf/meta.ts b/src/pages/tools/pdf/protect-pdf/meta.ts
index d5c13d9..e3b8a14 100644
--- a/src/pages/tools/pdf/protect-pdf/meta.ts
+++ b/src/pages/tools/pdf/protect-pdf/meta.ts
@@ -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',
diff --git a/src/pages/tools/pdf/rotate-pdf/meta.ts b/src/pages/tools/pdf/rotate-pdf/meta.ts
index 7dbc67d..f0ab83f 100644
--- a/src/pages/tools/pdf/rotate-pdf/meta.ts
+++ b/src/pages/tools/pdf/rotate-pdf/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/pdf/split-pdf/meta.ts b/src/pages/tools/pdf/split-pdf/meta.ts
index f63a35d..04d8ac2 100644
--- a/src/pages/tools/pdf/split-pdf/meta.ts
+++ b/src/pages/tools/pdf/split-pdf/meta.ts
@@ -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'],
diff --git a/src/pages/tools/string/base64/meta.ts b/src/pages/tools/string/base64/meta.ts
index 994f343..a334e77 100644
--- a/src/pages/tools/string/base64/meta.ts
+++ b/src/pages/tools/string/base64/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/censor/meta.ts b/src/pages/tools/string/censor/meta.ts
index e9a72b8..bda557b 100644
--- a/src/pages/tools/string/censor/meta.ts
+++ b/src/pages/tools/string/censor/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/create-palindrome/meta.ts b/src/pages/tools/string/create-palindrome/meta.ts
index f1207a7..cadd578 100644
--- a/src/pages/tools/string/create-palindrome/meta.ts
+++ b/src/pages/tools/string/create-palindrome/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/extract-substring/meta.ts b/src/pages/tools/string/extract-substring/meta.ts
index 4692063..7a7a361 100644
--- a/src/pages/tools/string/extract-substring/meta.ts
+++ b/src/pages/tools/string/extract-substring/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/join/meta.ts b/src/pages/tools/string/join/meta.ts
index 83904c8..5fcc936 100644
--- a/src/pages/tools/string/join/meta.ts
+++ b/src/pages/tools/string/join/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/palindrome/meta.ts b/src/pages/tools/string/palindrome/meta.ts
index d9a6304..5c56ba0 100644
--- a/src/pages/tools/string/palindrome/meta.ts
+++ b/src/pages/tools/string/palindrome/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/quote/meta.ts b/src/pages/tools/string/quote/meta.ts
index 09846da..7bb86e9 100644
--- a/src/pages/tools/string/quote/meta.ts
+++ b/src/pages/tools/string/quote/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/randomize-case/meta.ts b/src/pages/tools/string/randomize-case/meta.ts
index 559827c..4eb3af1 100644
--- a/src/pages/tools/string/randomize-case/meta.ts
+++ b/src/pages/tools/string/randomize-case/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/remove-duplicate-lines/meta.ts b/src/pages/tools/string/remove-duplicate-lines/meta.ts
index 577fa2f..debe033 100644
--- a/src/pages/tools/string/remove-duplicate-lines/meta.ts
+++ b/src/pages/tools/string/remove-duplicate-lines/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/repeat/meta.ts b/src/pages/tools/string/repeat/meta.ts
index 680b666..02c2910 100644
--- a/src/pages/tools/string/repeat/meta.ts
+++ b/src/pages/tools/string/repeat/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/reverse/meta.ts b/src/pages/tools/string/reverse/meta.ts
index 18b476f..1f30e9b 100644
--- a/src/pages/tools/string/reverse/meta.ts
+++ b/src/pages/tools/string/reverse/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/rot13/meta.ts b/src/pages/tools/string/rot13/meta.ts
index 329bd3c..8e6be8c 100644
--- a/src/pages/tools/string/rot13/meta.ts
+++ b/src/pages/tools/string/rot13/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/string/rotate/meta.ts b/src/pages/tools/string/rotate/meta.ts
index c0c4da5..66c4117 100644
--- a/src/pages/tools/string/rotate/meta.ts
+++ b/src/pages/tools/string/rotate/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/string/split/meta.ts b/src/pages/tools/string/split/meta.ts
index 30a2067..8b7b6a9 100644
--- a/src/pages/tools/string/split/meta.ts
+++ b/src/pages/tools/string/split/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/statistic/meta.ts b/src/pages/tools/string/statistic/meta.ts
index 3a6aa91..f56b7d4 100644
--- a/src/pages/tools/string/statistic/meta.ts
+++ b/src/pages/tools/string/statistic/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/text-replacer/meta.ts b/src/pages/tools/string/text-replacer/meta.ts
index 58a0f7a..d02502b 100644
--- a/src/pages/tools/string/text-replacer/meta.ts
+++ b/src/pages/tools/string/text-replacer/meta.ts
@@ -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'))
});
diff --git a/src/pages/tools/string/to-morse/meta.ts b/src/pages/tools/string/to-morse/meta.ts
index 917358f..5244c3a 100644
--- a/src/pages/tools/string/to-morse/meta.ts
+++ b/src/pages/tools/string/to-morse/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/truncate/meta.ts b/src/pages/tools/string/truncate/meta.ts
index b01707f..a62eebc 100644
--- a/src/pages/tools/string/truncate/meta.ts
+++ b/src/pages/tools/string/truncate/meta.ts
@@ -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: {
diff --git a/src/pages/tools/string/uppercase/meta.ts b/src/pages/tools/string/uppercase/meta.ts
index 15e06e9..9c2e25c 100644
--- a/src/pages/tools/string/uppercase/meta.ts
+++ b/src/pages/tools/string/uppercase/meta.ts
@@ -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: {
diff --git a/src/pages/tools/time/check-leap-years/meta.ts b/src/pages/tools/time/check-leap-years/meta.ts
index 1c4b7ee..661f4a6 100644
--- a/src/pages/tools/time/check-leap-years/meta.ts
+++ b/src/pages/tools/time/check-leap-years/meta.ts
@@ -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: {
diff --git a/src/pages/tools/time/convert-days-to-hours/meta.ts b/src/pages/tools/time/convert-days-to-hours/meta.ts
index 4932b8f..a94823b 100644
--- a/src/pages/tools/time/convert-days-to-hours/meta.ts
+++ b/src/pages/tools/time/convert-days-to-hours/meta.ts
@@ -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: {
diff --git a/src/pages/tools/time/convert-hours-to-days/meta.ts b/src/pages/tools/time/convert-hours-to-days/meta.ts
index 310d835..fd49c3f 100644
--- a/src/pages/tools/time/convert-hours-to-days/meta.ts
+++ b/src/pages/tools/time/convert-hours-to-days/meta.ts
@@ -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: {
diff --git a/src/pages/tools/time/convert-seconds-to-time/meta.ts b/src/pages/tools/time/convert-seconds-to-time/meta.ts
index 94fd26a..574623d 100644
--- a/src/pages/tools/time/convert-seconds-to-time/meta.ts
+++ b/src/pages/tools/time/convert-seconds-to-time/meta.ts
@@ -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: {
diff --git a/src/pages/tools/time/convert-time-to-seconds/meta.ts b/src/pages/tools/time/convert-time-to-seconds/meta.ts
index ca0bfea..988e6c0 100644
--- a/src/pages/tools/time/convert-time-to-seconds/meta.ts
+++ b/src/pages/tools/time/convert-time-to-seconds/meta.ts
@@ -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: {
diff --git a/src/pages/tools/time/crontab-guru/meta.ts b/src/pages/tools/time/crontab-guru/meta.ts
index 374b264..2c5d2e0 100644
--- a/src/pages/tools/time/crontab-guru/meta.ts
+++ b/src/pages/tools/time/crontab-guru/meta.ts
@@ -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: {
diff --git a/src/pages/tools/time/time-between-dates/meta.ts b/src/pages/tools/time/time-between-dates/meta.ts
index fbaf80d..028617b 100644
--- a/src/pages/tools/time/time-between-dates/meta.ts
+++ b/src/pages/tools/time/time-between-dates/meta.ts
@@ -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: {
diff --git a/src/pages/tools/time/truncate-clock-time/meta.ts b/src/pages/tools/time/truncate-clock-time/meta.ts
index 8a847e1..9a9498a 100644
--- a/src/pages/tools/time/truncate-clock-time/meta.ts
+++ b/src/pages/tools/time/truncate-clock-time/meta.ts
@@ -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: {
diff --git a/src/pages/tools/video/change-speed/meta.ts b/src/pages/tools/video/change-speed/meta.ts
index f6df94b..c881cb6 100644
--- a/src/pages/tools/video/change-speed/meta.ts
+++ b/src/pages/tools/video/change-speed/meta.ts
@@ -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: {
diff --git a/src/pages/tools/video/compress/meta.ts b/src/pages/tools/video/compress/meta.ts
index e96b7bc..fb9a09d 100644
--- a/src/pages/tools/video/compress/meta.ts
+++ b/src/pages/tools/video/compress/meta.ts
@@ -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',
diff --git a/src/pages/tools/video/crop-video/meta.ts b/src/pages/tools/video/crop-video/meta.ts
index 92b422d..22a23e3 100644
--- a/src/pages/tools/video/crop-video/meta.ts
+++ b/src/pages/tools/video/crop-video/meta.ts
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('video', {
- name: 'Crop Video',
path: 'crop-video',
icon: 'material-symbols:crop',
- description:
- 'Crop video files to remove unwanted areas or focus on specific content. Specify crop dimensions and position to create custom video compositions.',
- shortDescription: 'Crop video to remove unwanted areas',
+
keywords: ['video', 'crop', 'trim', 'edit', 'resize'],
component: lazy(() => import('./index')),
i18n: {
diff --git a/src/pages/tools/video/flip/meta.ts b/src/pages/tools/video/flip/meta.ts
index 8607810..24d4e96 100644
--- a/src/pages/tools/video/flip/meta.ts
+++ b/src/pages/tools/video/flip/meta.ts
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('video', {
- name: 'Flip Video',
path: 'flip',
icon: 'material-symbols:flip',
- description:
- 'Flip video files horizontally or vertically. Mirror videos for special effects or correct orientation issues.',
- shortDescription: 'Flip video horizontally or vertically',
+
keywords: ['video', 'flip', 'mirror', 'horizontal', 'vertical'],
component: lazy(() => import('./index')),
i18n: {
diff --git a/src/pages/tools/video/gif/change-speed/meta.ts b/src/pages/tools/video/gif/change-speed/meta.ts
index 5433e0a..6a304f1 100644
--- a/src/pages/tools/video/gif/change-speed/meta.ts
+++ b/src/pages/tools/video/gif/change-speed/meta.ts
@@ -3,12 +3,9 @@ import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('gif', {
- name: 'Change GIF Speed',
path: 'change-speed',
icon: 'material-symbols:speed',
- description:
- 'Change the playback speed of GIF animations. Speed up or slow down GIFs while maintaining smooth animation.',
- shortDescription: 'Change GIF animation speed',
+
keywords: ['gif', 'speed', 'animation', 'fast', 'slow'],
component: lazy(() => import('./index')),
i18n: {
diff --git a/src/pages/tools/video/loop/meta.ts b/src/pages/tools/video/loop/meta.ts
index 1abf644..1176b2f 100644
--- a/src/pages/tools/video/loop/meta.ts
+++ b/src/pages/tools/video/loop/meta.ts
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('video', {
- name: 'Loop Video',
path: 'loop',
icon: 'material-symbols:loop',
- description:
- 'Create looping video files that repeat continuously. Perfect for background videos, presentations, or creating seamless loops.',
- shortDescription: 'Create looping video files',
+
keywords: ['video', 'loop', 'repeat', 'continuous'],
component: lazy(() => import('./index')),
i18n: {
diff --git a/src/pages/tools/video/rotate/meta.ts b/src/pages/tools/video/rotate/meta.ts
index 0df8d33..d49d001 100644
--- a/src/pages/tools/video/rotate/meta.ts
+++ b/src/pages/tools/video/rotate/meta.ts
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('video', {
- name: 'Rotate Video',
path: 'rotate',
icon: 'material-symbols:rotate-right',
- description:
- 'Rotate video files by 90, 180, or 270 degrees. Correct video orientation or create special effects with precise rotation control.',
- shortDescription: 'Rotate video by specified degrees',
+
keywords: ['video', 'rotate', 'orientation', 'degrees'],
component: lazy(() => import('./index')),
i18n: {
diff --git a/src/pages/tools/video/trim/meta.ts b/src/pages/tools/video/trim/meta.ts
index dee99bf..98d7e97 100644
--- a/src/pages/tools/video/trim/meta.ts
+++ b/src/pages/tools/video/trim/meta.ts
@@ -2,12 +2,8 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('video', {
- name: 'Trim Video',
path: 'trim',
icon: 'material-symbols:content-cut',
- description:
- 'Trim video files by specifying start and end times. Remove unwanted sections from the beginning or end of videos.',
- shortDescription: 'Trim video by removing unwanted sections',
keywords: ['video', 'trim', 'cut', 'edit', 'time'],
component: lazy(() => import('./index')),
i18n: {
diff --git a/src/pages/tools/video/video-to-gif/meta.ts b/src/pages/tools/video/video-to-gif/meta.ts
index 467d920..9cec755 100644
--- a/src/pages/tools/video/video-to-gif/meta.ts
+++ b/src/pages/tools/video/video-to-gif/meta.ts
@@ -2,12 +2,8 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('video', {
- name: 'Video to GIF',
path: 'video-to-gif',
icon: 'material-symbols:gif',
- description:
- 'Convert video files to animated GIF format. Extract specific time ranges and create shareable animated images.',
- shortDescription: 'Convert video to animated GIF',
keywords: ['video', 'gif', 'convert', 'animated', 'image'],
component: lazy(() => import('./index')),
i18n: {
diff --git a/src/pages/tools/xml/xml-beautifier/meta.ts b/src/pages/tools/xml/xml-beautifier/meta.ts
index 3c000b8..99c6916 100644
--- a/src/pages/tools/xml/xml-beautifier/meta.ts
+++ b/src/pages/tools/xml/xml-beautifier/meta.ts
@@ -2,12 +2,9 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('xml', {
- name: 'XML Beautifier',
path: 'xml-beautifier',
icon: 'material-symbols:code',
- description:
- 'Format and beautify XML code with proper indentation and spacing. Make XML files more readable and organized.',
- shortDescription: 'Format and beautify XML code',
+
keywords: ['xml', 'beautify', 'format', 'code', 'indent'],
component: lazy(() => import('./index')),
i18n: {
diff --git a/src/pages/tools/xml/xml-validator/meta.ts b/src/pages/tools/xml/xml-validator/meta.ts
index 004a563..f7c98ef 100644
--- a/src/pages/tools/xml/xml-validator/meta.ts
+++ b/src/pages/tools/xml/xml-validator/meta.ts
@@ -2,12 +2,8 @@ import { defineTool } from '@tools/defineTool';
import { lazy } from 'react';
export const tool = defineTool('xml', {
- name: 'XML Validator',
path: 'xml-validator',
icon: 'material-symbols:check-circle',
- description:
- 'Validate XML code for syntax errors and well-formed structure. Check if XML documents follow proper formatting rules.',
- shortDescription: 'Validate XML code for errors',
keywords: ['xml', 'validate', 'check', 'syntax', 'errors'],
component: lazy(() => import('./index')),
i18n: {
diff --git a/src/tools/defineTool.tsx b/src/tools/defineTool.tsx
index c0cb9a9..b1e36a0 100644
--- a/src/tools/defineTool.tsx
+++ b/src/tools/defineTool.tsx
@@ -9,10 +9,6 @@ export interface ToolMeta {
component: LazyExoticComponent>;
keywords: string[];
icon: IconifyIcon | string;
- name: string;
- description: string;
- shortDescription: string;
- longDescription?: string;
i18n: {
name: FullI18nKey;
description: FullI18nKey;
@@ -56,36 +52,20 @@ export const defineTool = (
basePath: ToolCategory,
options: ToolMeta
): DefinedTool => {
- const {
- icon,
- path,
- name,
- description,
- keywords,
- component,
- shortDescription,
- longDescription,
- i18n
- } = options;
+ const { icon, path, keywords, component, i18n } = options;
const Component = component;
return {
type: basePath,
path: `${basePath}/${path}`,
- name: i18n?.name || name,
+ name: i18n.name,
icon,
- description: i18n?.description || description,
- shortDescription: i18n?.shortDescription || shortDescription,
+ description: i18n.description,
+ shortDescription: i18n.shortDescription,
keywords,
component: () => {
return (
-
-
+
+
);
}
diff --git a/src/tools/index.ts b/src/tools/index.ts
index b0e9bc6..fec2783 100644
--- a/src/tools/index.ts
+++ b/src/tools/index.ts
@@ -13,6 +13,8 @@ import { timeTools } from '../pages/tools/time';
import { IconifyIcon } from '@iconify/react';
import { pdfTools } from '../pages/tools/pdf';
import { xmlTools } from '../pages/tools/xml';
+import { TFunction } from 'i18next';
+import { I18nNamespaces } from '../i18n';
const toolCategoriesOrder: ToolCategory[] = [
'image-generic',
@@ -143,17 +145,17 @@ const categoriesConfig: {
// );
export const filterTools = (
tools: DefinedTool[],
- query: string
+ query: string,
+ t: TFunction
): DefinedTool[] => {
if (!query) return tools;
const lowerCaseQuery = query.toLowerCase();
-
return tools.filter(
(tool) =>
- tool.name.toLowerCase().includes(lowerCaseQuery) ||
- tool.description.toLowerCase().includes(lowerCaseQuery) ||
- tool.shortDescription.toLowerCase().includes(lowerCaseQuery) ||
+ t(tool.name).toLowerCase().includes(lowerCaseQuery) ||
+ t(tool.description).toLowerCase().includes(lowerCaseQuery) ||
+ t(tool.shortDescription).toLowerCase().includes(lowerCaseQuery) ||
tool.keywords.some((keyword) =>
keyword.toLowerCase().includes(lowerCaseQuery)
)
diff --git a/src/utils/string.ts b/src/utils/string.ts
index a801508..f145cdd 100644
--- a/src/utils/string.ts
+++ b/src/utils/string.ts
@@ -1,7 +1,7 @@
import { UpdateField } from '@components/options/ToolOptions';
import { getToolsByCategory } from '@tools/index';
import { ToolCategory } from '@tools/defineTool';
-import { I18nNamespaces } from '../i18n';
+import { I18nNamespaces, validNamespaces } from '../i18n';
// Here starting the shared values for string manipulation.
@@ -115,20 +115,6 @@ export const getToolCategoryTitle = (categoryName: string): string =>
// Type guard to check if a value is a valid I18nNamespaces
const isValidI18nNamespace = (value: string): value is I18nNamespaces => {
- const validNamespaces: I18nNamespaces[] = [
- 'string',
- 'number',
- 'video',
- 'list',
- 'json',
- 'time',
- 'csv',
- 'pdf',
- 'audio',
- 'xml',
- 'translation',
- 'image'
- ];
return validNamespaces.includes(value as I18nNamespaces);
};